{"version":3,"sources":["theme/variables.ts","routes/routes.ts","api/auth/index.ts","api/assessment-logs/index.ts","api/challenges/index.ts","api/files/index.ts","api/companies/index.ts","api/inviters/index.ts","api/labels/index.ts","api/practis-set/index.ts","api/scenarios/index.ts","api/logs/index.ts","api/pacings/index.ts","api/users/index.ts","api/submissions/index.ts","api/teams/index.ts","api/enrollments/index.ts","api/invitations/index.ts","api/alert/index.ts","ui/icons/Check.tsx","ui/icons/Error.tsx","ui/components/InfoSnackbar/InfoSnackbar.tsx","ui/components/ErrorMessages/ErrorMessages.tsx","ui/components/Button/constants.ts","ui/components/Button/style.ts","ui/components/Button/Button.tsx","ui/components/Button/SmallButton.tsx","constants/enums/permissions.ts","tools/http/Http.ts","constants/enums/TrainingMode.ts","constants/enums/index.ts","pages/UserProfile/store/reducers.ts","features/users/store/actions.ts","features/portableLabels/store/hors/withLabels/helpers/useEncapsulatedDispatch.ts","features/portableLabels/store/hors/withLabels/services.ts","features/portableLabels/store/hors/withLabels/api.ts","features/portableLabels/store/hors/withLabels/actions.ts","helpers/functions/search-tree.ts","features/labels/tools.ts","tools/router/index.ts","ui/components/ModalDialogs/store/actions.ts","features/permissions/CheckPermission.tsx","features/library/store/actions.ts","features/users/tools/UserPermissionHelpers.ts","features/users/tools/UserRoleHelpers.ts","features/users/tools/InvitationActionsHelper.ts","helpers/functions/date-convert.ts","ui/components/LoadingCopmonent/LoadingComponent.tsx","features/portableLabels/components/PortableLabelListItem.tsx","features/portableLabels/components/PortableLabelList.tsx","features/portableLabels/components/EmptyLabels.tsx","features/portableLabels/components/NoResultLabels.tsx","features/portableLabels/components/PortableLabels.tsx","features/portableLabels/components/PortableLabelsWithStore.tsx","features/labels/store/services.ts","features/portableLabels/store/states.ts","ui/components/Popup/PopupComponent.tsx","ui/components/Popup/Popup.tsx","helpers/hooks/useDismiss.ts","features/labels/store/states.ts","ui/icons/Checked.tsx","ui/icons/Dash.tsx","ui/components/Checkbox/index.tsx","ui/components/Fieldset/style.ts","ui/components/Fieldset/Fieldset.tsx","features/portableLabels/store/hors/withLabels/states.ts","features/labels/store/actions.ts","constants/interfaces/filters.ts","pages/CompanySettings/store/reducers.ts","services/Storage.ts","ui/components/table-wrapper/table-divider/style.ts","ui/components/table-wrapper/table-divider/view.tsx","features/users/store/services/drafts-services.ts","features/users/store/services/invitations-services.ts","helpers/functions/invitation-templates.ts","features/users/store/services/common-services.ts","features/users/store/services/performance-services.ts","services/Http.ts","features/users/store/services/profile-services.ts","features/users/store/states.ts","features/library/services/LibraryBulkActionsService/constants.ts","constants/interfaces/PractisSets.ts","helpers/functions/Events/types.ts","helpers/hooks/useHtmlPageTitle.ts","ui/components/Tooltip/index.ts","tools/bulkActions/BulkActionAvailability.ts","features/searchState/constants.ts","ui/components/table-wrapper/index.ts","ui/icons/HourGlass.tsx","ui/components/AvatarPlaceholder/styles.ts","ui/components/AvatarPlaceholder/AvatarPlaceholder.tsx","ui/components/DialogWrapper/styles.ts","ui/components/DialogWrapper/DialogWrapper.tsx","features/users/store/costants.ts","features/library/tools/tools.ts","features/library/tools/BulkActionAvailability.ts","features/library/tools/PractisSetActionsHelper.ts","features/library/tools/ScenarioActionsHelper.ts","features/library/tools/ChallengeActionsHelper.ts","features/permissions/store/state.ts","constants/interfaces/Enrollments.ts","pages/ActionPages/NewUser/store/actions.ts","constants/interfaces/Scenario.ts","ui/wrapper/AuthLogo/styles.ts","ui/wrapper/AuthLogo/view.tsx","ui/wrapper/AuthLogo/index.ts","ui/wrapper/LoginAuthWrapper/styles.ts","ui/wrapper/LoginAuthWrapper/view.tsx","ui/wrapper/LoginAuthWrapper/index.ts","helpers/hooks/useSearch.ts","helpers/functions/search-params-helpers.ts","features/library/store/services.ts","ui/icons/NoSearchResult.tsx","features/portablePractisSets/store/hors/withPractisSets/helpers/useEncapsulatedDispatch.ts","features/portablePractisSets/store/hors/withPractisSets/services.ts","features/portablePractisSets/store/hors/withPractisSets/actions.ts","helpers/functions/Events/index.ts","ui/components/input/index.ts","ui/components/OutsideActionBox/OutsideActionBox.tsx","helpers/functions/auth-helpers.ts","helpers/functions/constants.ts","helpers/functions/validation.ts","services/validation/index.ts","helpers/functions/list-to-tree.ts","features/library/store/states.ts","ui/icons/DownArrow.tsx","ui/icons/UpArrow.tsx","pages/ActionPages/NewUser/tools.ts","constants/interfaces/Challenge.ts","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/styles.ts","pages/CompanySettings/store/actions.ts","ui/icons/Pencil.tsx","features/portablePractisSets/components/PortablePractisSetsList.tsx","features/portablePractisSets/components/EmptyPractisSets.tsx","features/portablePractisSets/components/PortablePractisSets.tsx","features/portablePractisSets/components/PortablePractisSetsWithStore.tsx","services/ChunkRequestService/hooks/helpers.ts","services/ChunkRequestService/store/actions.ts","services/ChunkRequestService/hooks/index.tsx","ui/components/table-wrapper/table-tools/table-search-input/style.ts","ui/components/table-wrapper/table-tools/table-search-input/view.tsx","helpers/hooks/useWindowDimensions.ts","ui/components/FormikField/styles.ts","ui/components/FormikField/FormikField.tsx","features/teams/tools/ProgressActionsHelper.ts","features/teams/tools/tools.ts","ui/components/EmptyStates/components/EmptyState.tsx","ui/components/EmptyStates/components/NoSearchResults/view.tsx","ui/components/EmptyStates/components/NoSearchResults/index.ts","ui/icons/NoFiltersIcon.tsx","ui/components/EmptyStates/components/NoFilterResults/view.tsx","ui/components/EmptyStates/components/NoFilterResults/index.ts","ui/icons/EmptyCalendar.tsx","ui/components/EmptyStates/components/NoCalendarResults/view.tsx","ui/components/EmptyStates/components/NoCalendarResults/index.ts","ui/components/table-wrapper/table/table-cell/style.ts","ui/components/table-wrapper/table/table-cell/view.tsx","ui/components/table-wrapper/table/table-header/table-header-cell/style.ts","ui/components/table-wrapper/table/table-header/table-header-cell/multi.view.tsx","ui/components/table-wrapper/table/table-header/table-header-cell/view.tsx","ui/components/table-wrapper/table/table-header/table-header-cell/controller.tsx","ui/components/table-wrapper/table/TableTitleOverflowText/styles.ts","ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText.tsx","helpers/functions/array-helpers.ts","ui/components/table-wrapper/table/EmptyCellDash/styles.ts","ui/components/table-wrapper/table/EmptyCellDash/view.tsx","features/searchState/store/actions.ts","constants/interfaces/DueDates.ts","ui/components/ErrorMessages/constants.ts","ui/icons/ArrowRight.tsx","tools/redux/selectors.ts","tools/redux/index.ts","pages/UserProfile/store/actions.ts","helpers/functions/general.ts","ui/icons/Close.tsx","tools/config/index.ts","features/portableLabels/store/hors/withLabels/scopes.ts","features/portablePractisSets/tools.ts","ui/components/table-wrapper/table/table-row/style.ts","ui/components/table-wrapper/table/table-row/view.tsx","services/ChunkRequestService/hooks/constants.ts","helpers/functions/detect-browsers.ts","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser.tsx","features/portablePractisSets/store/hors/withPractisSets/states.ts","ui/components/ScrollPagination/ScrollPagination.tsx","constants/variables/general.ts","pages/Auth/store/services.ts","ui/icons/QuestionMark.tsx","ui/components/Tooltip/QuestionTooltip.tsx","ui/icons/Tag.tsx","ui/icons/TagDisabled.tsx","ui/components/table-wrapper/table/TableLabelTags/styles.ts","ui/components/table-wrapper/table/TableLabelTags/TableLabelTags.tsx","tools/localStorage/LocalStorage.ts","routes/helpers.ts","helpers/functions/url-helpers.ts","features/portablePractisSets/store/hors/withPractisSets/scopes.ts","helpers/functions/plural.ts","ui/components/table-wrapper/table-tools/table-tool-item/style.ts","ui/components/table-wrapper/table-tools/table-tool-item/view.tsx","ui/components/LoadingCopmonent/Loading.tsx","ui/icons/PractisAdminPlatformLogo.tsx","ui/icons/PractisLogo.tsx","ui/icons/Search.tsx","ui/components/table-wrapper/constants.ts","ui/components/table-wrapper/table/type.ts","ui/icons/EmptyBox.tsx","pages/UserProfile/store/services.tsx","helpers/functions/file-download.ts","ui/components/table-wrapper/styles.ts","ui/components/SelectDropdown/SelectLabel.tsx","ui/components/SelectDropdown/SelectMenuItem.tsx","ui/components/SelectDropdown/SelectMenu.tsx","ui/components/SelectDropdown/SelectInput.tsx","ui/components/SelectDropdown/SelectDropdown.tsx","ui/components/ModalDialogs/store/constants.ts","helpers/functions/tree-helpers.ts","helpers/functions/tree-to-list.ts","ui/components/table-wrapper/table-header-filter/style.ts","ui/components/table-wrapper/table-header-filter/view.tsx","ui/components/table-wrapper/table-header-filter/helper.ts","ui/components/table-wrapper/table-header-filter/controller.tsx","pages/Auth/AddMobileNumber/types.ts","ui/icons/Trash.tsx","assets/images/auth-background.png","assets/images/auth-background2x.png","assets/images/auth-background3x.png","helpers/hooks/useRedirectToPhoneVerification.ts","ui/icons/TriangleDown.tsx","ui/icons/TriangleRight.tsx","ui/icons/NoLabels.tsx","store/helpers/encapsulateAction.ts","ui/components/EmptyStates/components/EmptyStateContainer.tsx","ui/components/TextAreaPlaceholderBox/TextAreaPlaceholderBox.tsx","features/portablePractisSets/store/states.ts","ui/components/table-wrapper/table-refresh/styles.ts","ui/components/table-wrapper/table-refresh/table-refresh-button/view.tsx","ui/icons/TableRefresh.tsx","ui/components/table-wrapper/table-refresh/view.tsx","ui/components/DueDateCalendar/styles.ts","ui/components/DueDateCalendar/view.tsx","ui/components/table-wrapper/SelectAll/styles.ts","ui/components/table-wrapper/SelectAll/SelectAll.tsx","pages/Auth/store/actions.ts","helpers/functions/copy-to-clipboard.ts","features/users/store/helpers.ts","ui/components/table-wrapper/table/table-checkbox/style.ts","ui/components/table-wrapper/table/table-checkbox/view.tsx","ui/components/ErrorMessages/store/actions.ts","constants/interfaces/Company.ts","ui/components/DueDateCalendar/constants.ts","api/alert/constants.ts","ui/icons/TrashBin.tsx","constants/variables/component-settings.ts","helpers/classes/TreeDfsNameMapper.ts","ui/components/table-wrapper/table/TableLabelTags/AssignedLabelList.tsx","features/challenges/constants.ts","ui/components/Textarea/Textarea.tsx","features/assign-practisSets/styles.ts","features/assign-practisSets/single-users.view.tsx","features/assign-practisSets/multiple-users.view.tsx","features/assign-practisSets/services/EnrollmentBulkService/constants.ts","features/assign-practisSets/services/EnrollmentBulkService/helpers.ts","features/assign-practisSets/services/EnrollmentBulkService/index.ts","features/assign-practisSets/controller.tsx","ui/components/input/PhoneInput/locales.ts","ui/components/input/PhoneInput/CountryList.tsx","ui/components/input/PhoneInput/CountrySelector.tsx","ui/components/input/PhoneInput/styles.ts","ui/components/input/PhoneInput/PhoneInput.tsx","ui/components/table-wrapper/table/table-body-wrapper/table-body/style.ts","ui/components/table-wrapper/table/table-body-wrapper/table-body/view.tsx","helpers/functions/escape-reg-exp.ts","features/labels/config.ts","constants/interfaces/User.ts","services/ChunkRequestService/store/constants.ts","ui/components/Calendar/constants.ts","ui/components/Tooltip/Tooltip.tsx","features/portableLabels/store/hors/withLabels/context/context.ts","features/portablePractisSets/store/hors/withPractisSets/context/context.ts","ui/components/input/constants.ts","assets/images/eye.svg","assets/images/eye-open.svg","ui/components/input/style.ts","ui/components/input/view.tsx","ui/components/ErrorMessages/store/reducers.ts","ui/icons/PencilIcon.tsx","ui/components/ImageUploader/index.ts","ui/components/Popup/helpers/getPortalElement.ts","ui/layout/Sidebar/components/ProfileSection/components/MinimizedUserProfileArea.tsx","features/portableLabels/store/hors/withLabels/context/useWithLabelsContext.ts","ui/icons/Star.tsx","features/portablePractisSets/store/hors/withPractisSets/context/useWithPractisSetsContext.ts","features/teams/components/SubHeader/index.ts","ui/components/Calendar/styles.ts","ui/components/Calendar/Calendar.tsx","ui/components/Calendar/CalendarPopup.tsx","services/MediaService/index.ts","services/MediaService/constants.ts","helpers/hooks/usePopup.ts","helpers/hooks/useOutsideClick.ts","ui/components/table-wrapper/table/TableAssignOptionsMenu/enums/TableAssignOptionTypes.ts","ui/components/table-wrapper/table/style.ts","ui/components/table-wrapper/table/table-header/style.ts","ui/components/table-wrapper/table/table-header/view.tsx","ui/components/table-wrapper/table/table-body-wrapper/styles.ts","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/avatar-field/styles.ts","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/avatar-field/avatar-field.view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/avatar-field/minimized-avatar-field.view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/avatar-field/controller.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/badge-field/table-status-cell/styles.ts","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/badge-field/table-status-cell/view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/badge-field/view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/constants.ts","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/label-tags/view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/list-actions-field/view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/text-field/styles.ts","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/text-field/overflow-text-field.view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/text-field/text-field.view.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/text-field/controller.tsx","ui/components/table-wrapper/table/table-body-wrapper/dynamic-field/view.tsx","ui/components/table-wrapper/table/TableLabelTags/TableAssignedLabelTags.tsx","ui/components/table-wrapper/table/table-body-wrapper/view.tsx","ui/components/EmptyStates/components/EmptyStateTableWrapper.tsx","ui/components/table-wrapper/table/empty-state/view.tsx","ui/components/table-wrapper/table/simple.view.tsx","ui/components/table-wrapper/table/infinite-scroll.view.tsx","ui/components/table-wrapper/table/controller.tsx","ui/components/table-wrapper/PagingNavigation/styles.ts","ui/components/table-wrapper/PagingNavigation/Paging.tsx","ui/components/table-wrapper/table-tools/style.ts","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/AssignLabelOptions.tsx","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/TableAssignOptionsSelectDropdown.tsx","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/AssignPractisSetOptions.tsx","ui/components/Select/tools.ts","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeWarning.tsx","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/BulkActionConfirmation.tsx","ui/components/table-wrapper/table/TableAssignOptionsMenu/components/AssignPractisSetsAndDueDateOptions.tsx","ui/components/table-wrapper/table/TableAssignOptionsMenu/TableAssignOptionsMenu.tsx","ui/components/table-wrapper/table-tools/view.tsx","ui/components/table-wrapper/view.tsx","pages/Auth/tools.ts","pages/Auth/Registration/styles.ts","pages/Auth/Registration/constants.ts","pages/Auth/Registration/helper.ts","pages/Auth/Registration/view.tsx","pages/Auth/Registration/controller.tsx","ui/icons/Camera.tsx","ui/components/ImageUploader/styles.ts","ui/components/ImageUploader/view.tsx","ui/components/ImageUploader/helper.ts","ui/components/ImageUploader/controller.tsx","ui/components/ImageUploader/ImageEditor/constants.ts","pages/Auth/Register/styles.ts","pages/Auth/Register/helper.ts","pages/Auth/Register/constants.ts","pages/Auth/Register/view.tsx","pages/Auth/Register/controller.tsx","ui/icons/Person.tsx","ui/icons/PractisSet.tsx","ui/icons/TeamLeader.tsx","features/teams/components/SubHeader/styles.ts","features/teams/components/SubHeader/view.tsx","ui/components/ImageUploader/ImageEditor/styles.ts","ui/components/ImageUploader/ImageEditor/view.tsx","ui/components/ImageUploader/ImageEditor/controller.tsx","pages/Auth/Register/index.ts","pages/Auth/Registration/index.ts","ui/components/ImageUploader/ImageEditor/index.ts","assets/images/icons/back-arrow.svg","pages/Auth/ForgotPassword/components/EnterEmailAddress/styles.ts","pages/Auth/ForgotPassword/components/EnterEmailAddress/view.tsx","pages/Auth/ForgotPassword/components/EnterEmailAddress/controller.tsx","pages/Auth/ForgotPassword/components/EnterEmailAddress/index.ts","assets/images/check-email.svg","pages/Auth/ForgotPassword/components/FurtherInstructions/styles.ts","pages/Auth/ForgotPassword/components/FurtherInstructions/view.tsx","pages/Auth/ForgotPassword/components/FurtherInstructions/controller.tsx","pages/Auth/ForgotPassword/components/FurtherInstructions/index.ts","pages/Auth/ForgotPassword/controller.tsx","pages/Auth/ForgotPassword/index.ts","tools/url/UrlBuilder.ts","pages/Auth/styles/index.ts","ui/components/LinkText/link-text.tsx","pages/Auth/Login/styles.ts","pages/Auth/Login/Login.tsx","pages/Auth/LogOut/LogOut.tsx","pages/Auth/ApiPlatformDropdown/styles.ts","pages/Auth/ApiPlatformDropdown/view.tsx","pages/Auth/ApiPlatformDropdown/controller.tsx","pages/Auth/ApiPlatformDropdown/index.ts","pages/Auth/InternalLogin/styles.ts","pages/Auth/InternalLogin/InternalLogin.tsx","pages/Auth/ResetPassword/constants.ts","pages/Auth/ResetPassword/styles.ts","pages/Auth/ResetPassword/view.tsx","pages/Auth/ResetPassword/controller.tsx","pages/Auth/ResetPassword/index.ts","pages/Health/styles.ts","pages/Health/Health.tsx","routes/PrivateRouter.tsx","pages/UserProfile/components/styles.ts","ui/icons/AddUser.tsx","ui/components/UploadPhoto/UploadPhoto.tsx","pages/UserProfile/components/ProfileInfo.tsx","pages/UserProfile/components/Security.tsx","store/helpers/decapsulateAction.ts","features/portableLabels/store/hors/withLabels/reducer.ts","features/portableTeams/store/hors/withTeams/scopes.ts","features/portableTeams/store/hors/withTeams/reducer.ts","features/portablePractisSets/store/hors/withPractisSets/reducer.ts","features/users/store/reducers.ts","pages/UserProfile/components/Notifications/constants.ts","pages/UserProfile/components/NotificationWithToggle/styles.ts","ui/components/SwitchToggle/SwitchToggle.tsx","pages/UserProfile/components/NotificationWithToggle/view.tsx","pages/UserProfile/components/NotificationWithToggle/index.ts","pages/UserProfile/components/Notifications/styles.ts","pages/UserProfile/components/Notifications/view.tsx","pages/UserProfile/components/Notifications/controller.tsx","tools/constants/WebSiteId.ts","pages/UserProfile/components/Notifications/index.ts","ui/components/Logo/Logo.tsx","ui/icons/RightArrow.tsx","ui/icons/Label.tsx","ui/layout/Sidebar/styles.ts","ui/layout/Sidebar/SideBarItem.tsx","ui/icons/Dots.tsx","ui/components/ActionButton/styles.ts","ui/components/ActionButton/ActionButton.tsx","ui/components/ActionButton/ActionContext.ts","ui/components/ActionButton/ActionItem.tsx","ui/components/ActionButton/constants.ts","ui/components/ActionButton/ActionMenu.tsx","features/labels/components/EditLabelActions.tsx","helpers/hooks/useFocus.ts","features/labels/components/AddNewLabelInput.tsx","features/labels/components/LabelInputWarning.tsx","helpers/functions/key-down-helpers.ts","features/labels/components/styles.ts","features/labels/components/LabelListActions.tsx","features/labels/components/LabelListtem.tsx","features/labels/components/LabelsList.tsx","features/labels/components/AddLabels.tsx","features/labels/components/EmptyLabels.tsx","helpers/hooks/usePreviousData.ts","features/teams/store/states.ts","features/roles/store/actions.ts","features/labels/pages/CreateLabels.tsx","pages/CompanySettings/store/services.ts","ui/components/DropdownList/DropdownList.tsx","ui/components/DropdownList/DropdownListItem.tsx","ui/layout/Sidebar/components/ProfileSection/components/styles.ts","ui/layout/Sidebar/components/ProfileSection/components/UserProfileArea.tsx","features/roles/store/states.ts","features/roles/store/services.ts","ui/layout/Sidebar/components/ProfileSection/ProfileSection.tsx","helpers/functions/email-helpers.ts","ui/layout/Sidebar/constants.ts","ui/icons/Support.tsx","ui/layout/Sidebar/PractisSupport.tsx","features/companies/store/actions.ts","ui/layout/Sidebar/helpers.ts","ui/icons/SidebarScrimmageAI.tsx","ui/layout/Sidebar/SideBarExternalLinkItem.tsx","ui/layout/Sidebar/Sidebar.tsx","ui/wrapper/configs.ts","ui/icons/Plus.tsx","ui/icons/Folder.tsx","ui/icons/NewUser.tsx","ui/icons/Document.tsx","ui/icons/Mountains.tsx","ui/icons/Team.tsx","ui/layout/Header/components/ActionsDropdown/ActionsDropdown.tsx","ui/icons/BackArrow.tsx","ui/layout/Header/styles.ts","features/companies/store/services.ts","ui/icons/BoldDownArrow.tsx","ui/icons/BoldUpArrow.tsx","features/companies/components/CompaniesDropdownButton/styles.ts","features/companies/components/CompaniesDropdownButton/CompaniesDropdownItem.tsx","features/companies/components/CompaniesDropdownButton/types.ts","assets/images/practis-icon.svg","ui/icons/PractisIcon.tsx","features/companies/components/CompaniesDropdownButton/PractisDropdownItem.tsx","features/companies/components/CompaniesDropdownButton/CompaniesDropdown.tsx","features/companies/store/states.ts","ui/components/AvatarPlaceholder/index.tsx","features/companies/components/CompaniesDropdownButton/CompaniesDropdownButton.tsx","features/companies/components/CompanySection/CompanySection.tsx","pages/LandingPage/configs.ts","helpers/functions/broadcast-channel.ts","ui/layout/Header/types.ts","ui/layout/Header/Header.tsx","ui/wrapper/MainWrapper/styles.ts","ui/icons/SidebarLibrary.tsx","ui/icons/SidebarLibraryActive.tsx","ui/icons/SidebarTeams.tsx","ui/icons/SidebarTeamsActive.tsx","ui/icons/SidebarFeed.tsx","ui/icons/SidebarFeedActive.tsx","ui/icons/SidebarUsers.tsx","ui/icons/SidebarUsersActive.tsx","ui/icons/SidebarAssessment.tsx","ui/icons/SidebarAssessmentActive.tsx","ui/icons/SidebarReports.tsx","ui/icons/SidebarReportsActive.tsx","ui/icons/SidebarRoleplays.tsx","ui/icons/SidebarRoleplaysActive.tsx","ui/wrapper/MainWrapper/constants.ts","ui/wrapper/MainWrapper/MainWrapper.tsx","helpers/functions/object-helpers.ts","pages/UserProfile/UserProfile.tsx","assets/images/404.svg","ui/layout/Footer/Footer.tsx","ui/wrapper/LandingWrapper/LandingHeader/LandingHeader.tsx","ui/wrapper/LandingWrapper/LandingWrapper.tsx","pages/NotFoud/NotFound.tsx","assets/images/LandingCard1.png","assets/images/LandingCard2.png","assets/images/LandingCard3.png","helpers/hooks/usePageVisibility.tsx","features/teams/store/actions.ts","pages/LandingPage/Component/CardContent.tsx","pages/LandingPage/platforms/web/LandingCard.tsx","pages/LandingPage/platforms/web/LeftPanel.tsx","ui/components/Copyright/Copyright.tsx","pages/LandingPage/platforms/web/RightPanel.tsx","pages/LandingPage/platforms/web/index.tsx","pages/LandingPage/platforms/mobile/LandingCard.tsx","pages/LandingPage/platforms/mobile/LeftPanel.tsx","pages/LandingPage/platforms/mobile/RightPanel.tsx","pages/LandingPage/platforms/mobile/index.tsx","pages/LandingPage/platforms/tablet/LandingCard.tsx","pages/LandingPage/platforms/tablet/LeftPanel.tsx","pages/LandingPage/platforms/tablet/RightPanel.tsx","pages/LandingPage/platforms/tablet/index.tsx","pages/LandingPage/LandingPage.tsx","features/teams/store/services.ts","helpers/hooks/usePagePermissions.ts","constants/interfaces/TeamMember.ts","ui/components/Navigation/NavigationItem.tsx","ui/components/Navigation/Navigation.tsx","features/teams/pages/Training/components/TrainingTutorial.tsx","features/teams/components/TeamsPageNavigation/styles.ts","features/teams/components/TeamsPageNavigation/TeamsPageNavigation.tsx","features/teams/components/TeamsPageNavigation/TeamLearnersNavigation.tsx","ui/icons/NoTrainings.tsx","ui/icons/NoTrainingsFiltering.tsx","ui/icons/FiltersIcon.tsx","ui/components/Filters/styles.tsx","ui/components/Filters/FilterByHandler.tsx","features/teams/pages/TeamMembers/tools.ts","ui/icons/OverdueFlag.tsx","features/teams/pages/Training/components/Filters/TrainingFilters.tsx","features/teams/pages/Training/components/ListActions/ListActions.tsx","features/searchState/store/reducer.ts","features/teams/pages/Training/styles.ts","ui/components/table-wrapper/table/table-header/table-header-cell/hook.ts","ui/components/table-wrapper/helper.ts","helpers/functions/searchparams-normalize.ts","features/teams/pages/Training/PractisSetProgress.tsx","ui/icons/User.tsx","helpers/functions/convert-time.ts","features/teams/pages/Training/tools.ts","features/teams/pages/Training/components/Filters/TrainingDetailsFilters.tsx","ui/components/ProgressBar/ProgressBar/ProgressBar.tsx","ui/components/ProgressBar/StripedProgressBar/view.tsx","features/teams/pages/Training/components/ProgressDetails/GeneralProgressCol.tsx","ui/icons/PlusInCircleIcon.tsx","ui/icons/ViewPractisSetIcon.tsx","ui/icons/ExportReportIcon.tsx","services/GeneralBulkActionServices/constants.ts","services/GeneralBulkActionServices/helpers.ts","services/GeneralBulkActionServices/index.ts","features/teams/services/TeamBulkActionsService/constants.ts","features/teams/services/TeamBulkActionsService/index.ts","features/teams/services/TeamBulkActionsService/helpers.ts","features/teams/pages/Training/services/EnrollmentBulkActionsService/constants.ts","features/teams/pages/Training/services/EnrollmentBulkActionsService/index.ts","features/teams/pages/Training/services/EnrollmentBulkActionsService/helpers.ts","features/socketProgress(api1)/store/actions.ts","features/teams/pages/Training/ProgressDetails.tsx","features/teams/pages/Training/Progress.tsx","pages/ActionPages/NewUser/store/services.ts","ui/components/RadioButton/index.tsx","pages/ActionPages/NewUser/components/AssignRoles.tsx","features/portableLabels/templates/AssignLabels.tsx","pages/ActionPages/NewUser/components/SelectedUserLabels.tsx","features/portablePractisSets/templates/AssignPractisSets.tsx","pages/ActionPages/NewUser/components/SelectedUserPractisSets.tsx","features/portableTeams/store/hors/withTeams/context/context.ts","features/portableTeams/store/hors/withTeams/context/useWithTeamsContext.ts","features/portableTeams/store/hors/withTeams/helpers/useEncapsulatedDispatch.ts","features/portableTeams/store/hors/withTeams/services.ts","features/portableTeams/store/hors/withTeams/api.ts","features/portableTeams/store/hors/withTeams/actions.ts","features/portableTeams/store/hors/withTeams/states.ts","features/portableTeams/components/PortableTeamsList.tsx","features/portableTeams/components/EmptyTeams.tsx","features/portableTeams/components/PortableTeams.tsx","features/portableTeams/store/states.ts","features/portableTeams/components/PortableTeamsWithStore.tsx","features/portableTeams/components/PortableTeamsWithStore2.tsx","features/portableTeams/templates/AssignTeams.tsx","pages/ActionPages/NewUser/components/SelectedUserTeams.tsx","pages/ActionPages/NewUser/components/AddNewUser.tsx","features/portableRoles/tools.ts","features/portableRoles/portableRoles.tsx","pages/ActionPages/NewUser/components/Filters/components/FilterLabels/FilterLabels.tsx","pages/ActionPages/NewUser/components/Filters/components/FilterPractisSets/FilterPractisSets.tsx","features/portableTeams/tools.ts","pages/ActionPages/NewUser/components/Filters/components/FilterTeams/FilterTeams.tsx","pages/ActionPages/NewUser/components/Filters/AssignFilters.tsx","ui/icons/RemoveUser.tsx","features/portableRoles/portableRolesWithMultiSelect.tsx","pages/ActionPages/NewUser/components/Filters/ApplyFilters.tsx","ui/icons/FileDownload.tsx","ui/icons/Upload.tsx","helpers/functions/file-helpers.ts","helpers/functions/strings.ts","pages/ActionPages/NewUser/components/Header/NewUserHeader.tsx","tools/parseXlsx/index.tsx","pages/ActionPages/NewUser/components/UsersList/EditAssignRoles.tsx","pages/ActionPages/NewUser/components/UsersList/EditAssignPractisSets.tsx","pages/ActionPages/NewUser/components/UsersList/EditAssignTeams.tsx","pages/ActionPages/NewUser/components/UsersList/EditAssignLabels.tsx","ui/icons/ThinClose.tsx","ui/icons/ThinCheck.tsx","pages/ActionPages/NewUser/components/UsersList/EditUserItem.tsx","ui/components/table-wrapper/table/TableCheckbox/TableCheckboxHeaderCell.tsx","ui/components/table-wrapper/table/TableCheckbox/TableCheckbox.tsx","ui/components/table-wrapper/table/TableCheckbox/TableCheckboxCell.tsx","ui/icons/NewUserExclamation.tsx","ui/components/Table/Table.tsx","ui/components/Table/TableHead.tsx","ui/components/Table/TableToolsRight.tsx","ui/components/Table/TableTools.tsx","ui/components/Table/TableToolsWrapper.tsx","ui/components/Table/TableToolsLeft.tsx","ui/icons/EditPencil.tsx","ui/components/table-wrapper/table/TableNoResultBody/TableNoResultBody.tsx","ui/components/table-wrapper/table/TableNoResult/styles.ts","ui/components/table-wrapper/table/TableNoResult/TableNoResult.tsx","pages/ActionPages/NewUser/components/UsersList/UsersList.tsx","pages/ActionPages/NewUser/components/SaveAsDraftModal.tsx","pages/ActionPages/NewUser/store/states.ts","ui/icons/AddNewUser.tsx","ui/icons/NewUserPath.tsx","pages/ActionPages/NewUser/components/AddNewUserTip.tsx","helpers/hooks/useKeyPress.ts","ui/components/ModalPage/ModalPage.tsx","pages/ActionPages/NewUser/pages/NewUser/styles.ts","pages/CompanySettings/store/states.ts","ui/icons/Cross.tsx","ui/components/ModalWithCross/styles.ts","ui/components/ModalWithCross/view.tsx","pages/ActionPages/NewUser/pages/NewUser/components/UserLimitWarningModal/styles.ts","pages/ActionPages/NewUser/pages/NewUser/components/UserLimitWarningModal/view.tsx","pages/ActionPages/NewUser/pages/NewUser/components/UserLimitWarningModal/controller.tsx","pages/ActionPages/NewUser/pages/NewUser/components/NoFreeUsersModal/view.tsx","pages/ActionPages/NewUser/pages/NewUser/components/ExceededFreeUsersModal/view.tsx","ui/icons/Gear.tsx","ui/components/CompanyUserStatsText/styles.ts","ui/components/CompanyUserStatsText/view.tsx","ui/components/CompanyUserStatsText/controller.tsx","pages/ActionPages/NewScenario/store/actions.ts","pages/ActionPages/NewUser/pages/NewUser/NewUser.tsx","pages/ActionPages/NewUser/services/InviteUsersBulkActionService/index.ts","pages/ActionPages/NewUser/services/InviteUsersBulkActionService/constants.ts","pages/ActionPages/NewUser/pages/NewUser/index.ts","constants/interfaces/ScriptLine.ts","pages/ActionPages/NewScenario/store/reducers.ts","constants/enums/scenarios.ts","api/roleplay/index.ts","pages/ActionPages/NewScenario/store/services.ts","constants/enums/EditModeValues.ts","features/textToSpeech/store/actions.ts","ui/components/TextAreaBox/TextAreaBox.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioInfo/ScenarioInfo.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/components/ScriptAction/ScriptAction.tsx","services/ElevenLabs/constants.ts","services/ElevenLabs/index.ts","features/textToSpeech/store/services.ts","features/textToSpeech/store/states.ts","tools/ramda/index.ts","features/player/store/actions.ts","features/player/store/reducers.ts","features/player/store/services.ts","features/keywords/hooks/index.ts","ui/icons/Keyword.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/components/ScriptItemTextArea/Tooltip.tsx","ui/components/ContentEditableDiv/ContentEditable.tsx","ui/components/ContentEditableDiv/ContentEditableDiv.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/components/ScriptItemTextArea/ScriptItemTextArea.tsx","ui/components/Comment/Comment/Comment.tsx","ui/components/Comment/Comment/CommentBody.tsx","ui/components/Comment/Comment/CommentTools.tsx","ui/components/Comment/Comment/CommentTitle.tsx","ui/components/Comment/Comment/CommentDescription.tsx","ui/components/Comment/Comment/CommentAvatar.tsx","ui/icons/Save.tsx","ui/components/AudioRecorder/style.ts","ui/components/AudioRecorder/AudioRecorder.tsx","ui/icons/PlayCircle.tsx","ui/icons/PauseCircle.tsx","ui/icons/StopCircle.tsx","ui/components/AudioPlayer/style.ts","ui/components/AudioPlayer/AudioPlayer.tsx","ui/icons/Generate.tsx","ui/icons/Record.tsx","ui/icons/Play.tsx","features/textToSpeech/constants.ts","features/textToSpeech/helpers.ts","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/components/ScriptItem/ScriptItem.tsx","ui/icons/Drag.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/components/ScriptLineContent/ScriptLineContent.tsx","ui/icons/Stop.tsx","ui/icons/Phone.tsx","features/textToSpeech/BulkActionService/index.ts","features/textToSpeech/BulkActionService/helpers.ts","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/ScenarioScriptHeader/ScriptHeaderActions.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/ScenarioScriptHeader/ScenarioScriptHeader.tsx","ui/icons/Customer.tsx","pages/ActionPages/NewScenario/components/CustomBody/ScenarioScript/ScenarioScripts.tsx","pages/ActionPages/NewScenario/components/CustomBody/index.tsx","pages/ActionPages/StatusModalConfirmation/StatusModalConfirmation.tsx","helpers/functions/page-title-helpers.ts","pages/ActionPages/NewScenario/components/CustomHeader/CustomHeader.tsx","pages/ActionPages/NewScenario/services.tsx","ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction/styles.ts","ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction/LabelsActionItem.tsx","ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction/NoLabels.tsx","ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction/LabelsAction.tsx","ui/icons/DownloadPDF.tsx","pages/ActionPages/NewScenario/components/ActionPanel/ActionPanel.tsx","features/library/services/LibraryBulkActionsService/helpers.tsx","features/library/services/LibraryBulkActionsService/index.ts","pages/ActionPages/NewScenario/NewScenario.tsx","pages/ActionPages/PractisSets/store/actions.ts","pages/ActionPages/PractisSets/tools.ts","pages/ActionPages/NewScenario/tools.ts","pages/ActionPages/PractisSets/store/reducers.ts","features/pacings/tools.ts","pages/ActionPages/PractisSets/store/services.ts","ui/icons/ArchiveIcon.tsx","pages/ActionPages/PractisSets/components/CustomHeader/CustomHeader.tsx","pages/ActionPages/PractisSets/services.ts","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/pages/helpers.ts","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/pages/GenerateTableCells.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/components/Navigation/NavigationItem.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/components/Navigation/Navigation.tsx","pages/ActionPages/PractisSets/components/PractisContentNavigation/PractisContentNavigation.tsx","ui/icons/Stack.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/components/Filters/LabelFilters.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/components/Filters/TableFilters.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/pages/Scenarios.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/pages/Challenges.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/ListContent/index.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/components/MinimumAccuracy.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/components/BuilderDuration.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/components/PreviewItem/PreviewItem.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/components/BuilderListItem.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/components/RepsRequired.tsx","ui/icons/Documents.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/PractisSetBuilder/index.tsx","pages/ActionPages/PractisSets/components/CustomBody/Content/Content.tsx","pages/ActionPages/PractisSets/components/CustomBody/index.tsx","ui/components/Select/SelectLabel.tsx","ui/components/Select/SelectMenu.tsx","ui/components/Select/SelectMenuItem.tsx","ui/components/Select/SelectInput.tsx","ui/components/Select/Select.tsx","features/pacings/store/actions.ts","features/pacings/store/reducers.ts","features/pacings/store/services.ts","pages/ActionPages/PractisSets/components/ActionPanel/ActionPanel.tsx","pages/ActionPages/PractisSets/styles.ts","pages/ActionPages/PractisSets/PractisSets.tsx","features/library/components/LibraryNavigation.tsx","features/library/components/Filters/LibraryFilters.tsx","features/library/components/ListActions/ScenariosListActions.tsx","features/common/Session.ts","features/teams/pages/ListOfTeams/tools.ts","features/library/pages/Scenarios/styles.ts","ui/components/table-wrapper/table/TableDropdown/TableDropdown.tsx","features/library/pages/Scenarios/Scenarios.tsx","ui/icons/Box.tsx","features/library/components/ListActions/PractisSetsListActions.tsx","features/library/pages/PractisSets/styles.ts","features/library/pages/PractisSets/PractisSets.tsx","features/library/components/ListActions/ChallengesListActions.tsx","features/library/pages/Challenges/styles.ts","features/library/pages/Challenges/Challenges.tsx","features/library/pages/Library.tsx","pages/Terms/Terms.tsx","pages/Privacy/Privacy.tsx","pages/Support/Support.tsx","features/users/components/UsersPageNavigation.tsx","features/portableInviters/components/EmptyInviters.tsx","features/portableInviters/components/PortableInvitersList.tsx","features/portableInviters/components/PortableInviters.tsx","features/portableInviters/tools.ts","features/inviters/store/actions.ts","features/inviters/store/services.ts","features/inviters/tools.ts","features/inviters/store/reducers.ts","features/portableInviters/components/PortableInvitersWithStore.tsx","features/users/components/Filters/InvitationsFilter.tsx","features/inviters/store/states.ts","features/users/components/ListActions/InvitationsListActions.tsx","ui/icons/Pending.tsx","features/users/pages/Invitations/styles.ts","features/users/services/UserBulkActionsService/index.ts","features/users/services/UserBulkActionsService/helpers.tsx","features/users/services/UserBulkActionsService/constants.ts","features/users/pages/Invitations/Invitations.tsx","features/challenges/store/actions.ts","features/users/components/Filters/UsersFilter.tsx","features/users/components/ListActions/UsersListActions.tsx","features/users/components/SelectedUserTeams.tsx","features/users/pages/Users/styles.ts","features/users/tools/hooks.ts","features/users/pages/Users/Users.tsx","helpers/functions/array-diff.ts","features/challenges/store/services.ts","features/challenges/components/Header/index.tsx","features/challenges/services.ts","features/challenges/store/states.ts","features/challenges/tools.ts","features/challenges/components/ChallengeBody/ChallengeInfo.tsx","features/challenges/components/ScriptLineContent/RepScriptLine/RepScriptLine.tsx","features/challenges/components/ScriptLineContent/RepScriptLine/index.tsx","features/challenges/components/ScriptLineContent/CustomerScriptLine/CustomerScriptLine.tsx","features/challenges/components/ScriptLineContent/TraineeRespondLine/TraineeRespondLine.tsx","features/challenges/components/ScriptLineContent/CustomerScriptLine/index.tsx","features/challenges/components/ScriptLineContent/index.tsx","features/challenges/components/ScriptAction/ScriptAction.tsx","features/challenges/components/ChallengeScriptHeader/styles.ts","ui/icons/Attempts.tsx","features/challenges/components/ChallengeSettings/components/ChallengeAttemptsLimit/styles.ts","features/challenges/components/ChallengeSettings/components/ChallengeAttemptsLimit/view.tsx","features/challenges/components/ChallengeSettings/components/ChallengeAttemptsLimit/controller.tsx","features/challenges/components/ChallengeSettings/styles.ts","features/challenges/components/ChallengeSettings/view.tsx","ui/icons/SmartGear.tsx","features/challenges/components/ChallengeScriptHeader/view.tsx","features/challenges/components/ChallengeScriptHeader/controller.tsx","features/challenges/components/ChallengeBody/ChallengeScripts.tsx","features/challenges/components/ChallengeBody/index.tsx","features/challenges/components/ActionPanel/ActionPanel.tsx","features/challenges/pages/EditChallenge.tsx","features/newRelic/generate.tsx","tools/newRelic/NewRelic.ts","features/newRelic/index.tsx","features/submissions/store/states.ts","features/submissions/store/actions.ts","constants/interfaces/Reviews.ts","features/submissions/tools/SubmissionActionsHelper.ts","features/submissions/tools/AccuracyScoreActionsHelper.tsx","features/submissions/tools/tools.ts","features/submissions/store/constants.ts","features/submissions/services/SubmissionsBulkActionsService/types.ts","helpers/functions/pluralize.ts","features/submissions/store/services.ts","features/submissions/components/SubmissionFilters/styles.ts","features/submissions/components/SubmissionFilters/SubmissionFilters.tsx","ui/icons/Files.tsx","features/submissions/components/SubmissionsNavigation.tsx","ui/icons/CheckMark.tsx","features/submissions/pages/styles.ts","features/submissions/services/SubmissionsBulkActionsService/index.ts","features/submissions/services/SubmissionsBulkActionsService/helpers.ts","features/submissions/services/SubmissionsBulkActionsService/constants.ts","features/submissions/pages/ChallengeSubmissions.tsx","features/portableScenarios/store/hors/withTeams/scopes.ts","features/portableScenarios/store/hors/withTeams/context/context.ts","features/portableScenarios/store/hors/withTeams/context/useWithTeamsContext.ts","features/portableScenarios/store/hors/withTeams/helpers/useEncapsulatedDispatch.ts","features/portableScenarios/store/hors/withTeams/services.ts","features/portableScenarios/store/hors/withTeams/actions.ts","features/portableScenarios/store/hors/withTeams/states.ts","features/portableScenarios/components/PortableScenariosList.tsx","features/portableScenarios/components/EmptyScenarios.tsx","features/portableScenarios/components/PortableScenarios.tsx","features/portableScenarios/store/states.ts","features/portableScenarios/components/PortableScenariosWithStore.tsx","features/submissions/components/Filters/AccuracyTestFilters.tsx","ui/icons/Accuracy.tsx","features/submissions/pages/AccuracyTests.tsx","features/submissions/pages/Submissions.tsx","ui/icons/PlayIcon.tsx","ui/icons/PauseIcon.tsx","ui/components/VideoPlayer/components/VideoRangeSlider.tsx","ui/icons/DownloadIcon.tsx","ui/icons/FullScreenIcon.tsx","ui/components/VideoPlayer/components/VolumeRangeSlider.tsx","ui/icons/CopyLink.tsx","ui/components/VideoPlayer/VideoPlayer/VideoPlayerControls.tsx","assets/images/no-video.svg","ui/components/VideoPlayer/VideoPlayer/VideoPlayer.tsx","features/submissions/components/DetailsHeader.tsx","features/submissions/components/DetailsSubmissionInfo.tsx","ui/components/SelectBox/SelectBox/SelectBoxItem.tsx","ui/components/SelectBox/SelectBox/SelectBoxLabel.tsx","ui/components/SelectBox/SelectBox/SelectBox.tsx","ui/components/ButtonArrow/style.ts","ui/components/ButtonArrow/ButtonArrow.tsx","features/submissions/components/DetailsSubmissionReview.tsx","features/submissions/components/RequestRedo.tsx","features/submissions/components/RequestReminder.tsx","ui/components/CopyLinkNotification/styles.ts","ui/components/CopyLinkNotification/view.tsx","ui/components/CopyLinkNotification/index.ts","ui/icons/BrokenVideo.tsx","ui/components/UnavailableContent/styles.ts","ui/components/UnavailableContent/view.tsx","ui/components/UnavailableContent/index.ts","features/submissions/components/UnavailableChallenge/view.tsx","features/submissions/components/UnavailableChallenge/index.ts","features/submissions/components/ScreenLoading/styles.ts","features/submissions/components/ScreenLoading/view.tsx","features/submissions/components/ScreenLoading/constants.ts","features/logs/models/LogEvent.ts","features/submissions/components/ScreenLoading/index.ts","features/submissions/pages/SubmissionDetails.tsx","pages/Auth/TraineeLogin/styles.ts","pages/Auth/TraineeLogin/TraineeLogin.tsx","features/users/components/Filters/UserProfileFilters/UserProfileFilters.tsx","features/users/pages/Performance/styles.ts","features/users/components/PerformanceSection.tsx","features/users/components/Filters/UserProfileFilters/components/FilterLabels/FilterLabels.tsx","features/users/components/Filters/UserProfileFilters/components/FilterPractisSets/FilterPractisSets.tsx","features/users/components/Filters/UserProfileFilters/components/FilterTeams/FilterTeams.tsx","features/users/components/Filters/UserProfileFilters/styles.ts","features/users/components/Filters/UserProfileFilters/AssignFilters.tsx","features/users/pages/Performance/Performance.tsx","routes/PublicRouter.tsx","features/logs/tools.ts","features/logs/components/Details.tsx","features/logs/store/actions.ts","features/logs/store/services.ts","features/logs/store/states.ts","ui/components/Filters/FiltersApplyButton.tsx","ui/components/Filters/FiltersButton.tsx","ui/components/Filters/FiltersCheckbox.tsx","ui/components/Filters/FiltersDivider.tsx","ui/components/Filters/FiltersCheckboxList.tsx","ui/components/Filters/FiltersClearButton.tsx","ui/components/Filters/FiltersFieldSet.tsx","ui/components/Filters/FiltersNoItems.tsx","ui/components/Filters/FiltersPopupActions.tsx","ui/components/Filters/FiltersPopupBody.tsx","ui/components/Filters/FiltersPopupButton.tsx","ui/components/Filters/FiltersPopupFieldSets.tsx","ui/components/Filters/FiltersSearchInput.tsx","ui/components/Filters/FiltersSelectedItems.tsx","ui/components/Filters/FiltersSelectedItemsText.tsx","ui/components/Filters/FiltersSelectedText.tsx","ui/components/Filters/FiltersToggleAllButton.tsx","features/logs/components/LogFiltersEvents.tsx","features/users/components/Filters/UserRoleFilters.tsx","features/logs/components/LogFilters.tsx","ui/icons/NoLogs.tsx","features/logs/pages/styles.ts","features/logs/pages/Logs.tsx","pages/Auth/MobileNumberLogin/styles.ts","pages/Auth/MobileNumberLogin/MobileNumberLogin.tsx","pages/Auth/MobileNumberLogin/constants.ts","ui/components/VerificationCodeInput/VerificationCodeInput.tsx","pages/Auth/AddMobileNumber/components/CheckVerificationCode/styles.ts","pages/Auth/AddMobileNumber/components/CheckVerificationCode/view.tsx","pages/Auth/AddMobileNumber/components/CheckVerificationCode/controller.tsx","pages/Auth/AddMobileNumber/components/CheckVerificationCode/index.ts","pages/Auth/AddMobileNumber/components/CheckVerificationCode/constants.ts","pages/Auth/VerifyMobileNumber/controller.tsx","pages/Auth/VerifyMobileNumber/index.ts","features/telepromter/store/state.ts","ui/icons/Completed.tsx","features/telepromter/store/actions.ts","features/telepromter/pages/Completed/Completed.tsx","features/telepromter/pages/Playback/RepLine.tsx","features/telepromter/pages/Playback/CustomerLine.tsx","features/telepromter/pages/Playback/Playback.tsx","features/telepromter/pages/Training/RepLine.tsx","features/telepromter/pages/Training/CustomerLine.tsx","features/telepromter/pages/Training/ScriptLineDuration.tsx","ui/icons/Next.tsx","features/telepromter/Components/Button.tsx","features/telepromter/Components/Countdown.tsx","features/telepromter/store/services.ts","features/assessment-logs/store/actions.ts","features/telepromter/pages/Training/Training.tsx","features/telepromter/pages/Exit/Exit.tsx","features/telepromter/pages/index.tsx","features/users/components/Filters/DraftsFilter/CreatedByFilters/CreatedByFiltersList.tsx","features/users/components/Filters/DraftsFilter/tools.ts","features/users/components/Filters/DraftsFilter/CreatedByFilters/CreatedByFilters.tsx","features/users/components/Filters/DraftsFilter/EditedByFilters/EditedByFiltersList.tsx","features/users/components/Filters/DraftsFilter/EditedByFilters/EditedByFilters.tsx","features/users/components/Filters/DraftsFilter/DraftsFilter.tsx","ui/icons/NoDrafts.tsx","features/socketProgress(api1)/store/reducer.ts","features/users/pages/Drafts/styles.ts","features/users/pages/Drafts/Drafts.tsx","features/assessment-logs/store/states.ts","constants/interfaces/AiItem.ts","features/assessment-logs/store/services.ts","features/assessment-logs/components/AiAssessmentFilters.tsx","ui/icons/ExclamationCircle.tsx","features/assessment-logs/pages/styles.ts","ui/icons/AssessmentLogsBig.tsx","ui/icons/Flag.tsx","ui/icons/FlagActive.tsx","ui/icons/FlagInactive.tsx","features/assessment-logs/components/FlagToggle/styles.ts","features/assessment-logs/components/FlagToggle/view.tsx","features/assessment-logs/components/FlagToggle/index.ts","features/assessment-logs/pages/AiAssessment.tsx","features/assessment-logs/pages/hooks.ts","features/portableTeamLeaders/components/PortableTeamLeadersList.tsx","ui/icons/LeaderCrown.tsx","features/portableTeamLeaders/components/EmptyTeamLeaders.tsx","features/portableTeamLeaders/components/PortableTeamLeaders.tsx","features/portableTeamLeaders/tools.ts","features/teams/pages/ListOfTeams/components/Filters/MyTeamsFilters.tsx","ui/icons/NoTeams.tsx","features/teams/pages/ListOfTeams/components/ListActions/ListActions.tsx","features/teams/pages/ListOfTeams/styles.ts","features/teams/pages/ListOfTeams/ListOfTeams.tsx","ui/icons/OverdueLearnersNoResult.tsx","features/teams/pages/OverdueLearners/components/filters/styles.ts","features/teams/pages/OverdueLearners/components/filters/OverdueLearnersFilter.tsx","features/teams/pages/OverdueLearners/constants.ts","features/teams/pages/OverdueLearners/tools.ts","features/teams/pages/OverdueLearners/components/listActions/OverdueListActions.tsx","features/teams/pages/OverdueLearners/view.tsx","features/teams/pages/OverdueLearners/store/actions.ts","features/teams/pages/OverdueLearners/store/states.ts","features/teams/pages/OverdueLearners/store/services.ts","features/teams/pages/OverdueLearners/controller.tsx","ui/icons/CheckCircle.tsx","ui/icons/Warning.tsx","ui/icons/Saving.tsx","features/teams/pages/ManageTeam/components/UpdateStatus/styles.ts","features/teams/pages/ManageTeam/components/UpdateStatus/view.tsx","features/teams/pages/ManageTeam/components/UpdateStatus/index.ts","features/teams/pages/ManageTeam/components/Header/Header.tsx","ui/icons/ConfirmCheckMark.tsx","ui/icons/CancelCross.tsx","features/teams/pages/ManageTeam/components/InputWithButtons/styles.ts","features/teams/pages/ManageTeam/components/InputWithButtons/view.tsx","features/teams/pages/ManageTeam/components/InputWithButtons/controller.tsx","features/teams/pages/ManageTeam/components/InputWithButtons/index.ts","features/teams/pages/ManageTeam/components/Actions/Actions.tsx","ui/icons/AddArrow.tsx","features/teams/pages/ManageTeam/components/Filters/AllUsersFilters.tsx","features/teams/pages/ManageTeam/tabs/AllUsers/AllUsers.tsx","ui/icons/Crown.tsx","features/teams/pages/ManageTeam/tools.ts","features/teams/pages/ManageTeam/tabs/TeamMembers/TeamMembers.tsx","features/teams/pages/ManageTeam/tabs/DefaultTeamMembers/styles.ts","features/teams/pages/ManageTeam/tabs/DefaultTeamMembers/DefaultTeamMembers.tsx","features/teams/pages/ManageTeam/ManageTeam.tsx","features/teams/pages/CreateTeam/styles.ts","features/teams/pages/CreateTeam/view.tsx","features/teams/pages/CreateTeam/controller.tsx","features/teams/pages/Training/PractisSetReport.tsx","features/teams/pages/CreateTeam/index.ts","features/teams/pages/Training/components/ChartBox/ChartBox.tsx","features/teams/pages/Training/components/ChartBox/ChartBoxTitle.tsx","features/teams/pages/Training/components/ChartBox/ChartBoxBody.tsx","features/teams/pages/Training/components/Sections/Completion.tsx","ui/icons/NoChartData.tsx","features/teams/pages/Training/components/Sections/EmptySection.tsx","ui/components/Charts/ToolTip.tsx","ui/components/Charts/LineChart.tsx","features/teams/pages/Training/components/ChartBox/ChartBoxHeader.tsx","features/teams/pages/Training/components/ChartBox/ChartBoxDescription.tsx","ui/icons/DailyTimeSpentIcon.tsx","features/teams/pages/Training/components/Sections/DailyTimeSpent.tsx","ui/icons/Scenarios.tsx","ui/icons/ChallengeIcon.tsx","ui/icons/TickIcon.tsx","features/teams/pages/Training/components/Sections/ReportItems/styles.ts","ui/icons/PlayTriangle.tsx","ui/icons/NoPlay.tsx","features/teams/pages/Training/components/Sections/ReportItems/ReportsItems.tsx","features/teams/pages/Training/ScenarioReps/store/actions.ts","helpers/functions/math.ts","features/teams/pages/Training/ScenarioReps/constants.ts","features/teams/pages/Training/ScenarioReps/store/services.ts","features/teams/pages/Training/ScenarioReps/store/states.ts","features/teams/pages/Training/ScenarioReps/styles.ts","features/teams/pages/Training/ScenarioReps/view.tsx","features/teams/pages/Training/ScenarioReps/controller.tsx","store/selectors.ts","ui/icons/Published.tsx","features/teams/tools/TraineeInvitationActionHelpers.ts","features/teams/pages/Training/helper.ts","features/teams/pages/Training/components/ListActions/DueDateListAction/styles.ts","features/teams/pages/Training/components/ListActions/DueDateListAction/index.tsx","features/teams/pages/Training/TraineeQuickAssignment.tsx","features/teams/pages/Training/TraineeInvitation.tsx","ui/components/PlaybackVideo/components/BlankVideo/styles.ts","ui/components/PlaybackVideo/components/BlankVideo/view.tsx","ui/components/PlaybackVideo/components/BlankVideo/index.ts","ui/components/PlaybackVideo/components/ScreenLoading/styles.ts","ui/components/PlaybackVideo/components/ScreenLoading/view.tsx","ui/components/PlaybackVideo/components/ScreenLoading/index.ts","ui/components/BrokenSharedLink/view.tsx","features/socketProgress(api1)/progresspage.tsx","ui/components/BrokenSharedLink/index.ts","ui/generalStyles/TextStyles.tsx","ui/components/PlaybackVideo/PlaybackScreen.tsx","ui/components/ProgressModal/index.tsx","pages/Auth/Onboarding/types.ts","ui/variables/constants.ts","assets/images/Learner-Desktop_img.png","assets/images/Learner-Desktop_img@2x.png","assets/images/Learner-Desktop_img@3x.png","assets/images/Learner-Tablet_img.png","assets/images/Learner-Tablet_img@2x.png","assets/images/Learner-Tablet_img@3x.png","assets/images/Learner-Phone_img.png","assets/images/Learner-Phone_img@2x.png","assets/images/Learner-Phone_img@3x.png","assets/images/button-app-store.png","assets/images/button-google-play.png","pages/Auth/Onboarding/components/UserOnboarding/styles.ts","pages/Auth/Onboarding/components/UserOnboarding/view.tsx","pages/Auth/Onboarding/components/UserOnboarding/index.ts","assets/images/Admin-Desktop_img.png","assets/images/Admin-Desktop_img@2x.png","assets/images/Admin-Desktop_img@3x.png","assets/images/Admin-Tablet_img.png","assets/images/Admin-Tablet_img@2x.png","assets/images/Admin-Tablet_img@3x.png","assets/images/Admin-Phone_img.png","assets/images/Admin-Phone_img@2x.png","assets/images/Admin-Phone_img@3x.png","pages/Auth/Onboarding/components/AdminOnboarding/styles.ts","pages/Auth/Onboarding/components/AdminOnboarding/view.tsx","pages/Auth/Onboarding/components/AdminOnboarding/index.ts","assets/images/TeamLeader-Desktop_img.png","assets/images/TeamLeader-Desktop_img@2x.png","assets/images/TeamLeader-Desktop_img@3x.png","assets/images/TeamLeader-Tablet_img.png","assets/images/TeamLeader-Tablet_img@2x.png","assets/images/TeamLeader-Tablet_img@3x.png","assets/images/TeamLeader-Phone_img.png","assets/images/TeamLeader-Phone_img@2x.png","assets/images/TeamLeader-Phone_img@3x.png","pages/Auth/Onboarding/components/TeamLeaderOnboarding/styles.ts","pages/Auth/Onboarding/components/TeamLeaderOnboarding/view.tsx","pages/Auth/Onboarding/components/TeamLeaderOnboarding/index.ts","pages/Auth/Onboarding/controller.tsx","pages/Auth/Onboarding/index.ts","assets/images/broken-link.svg","pages/Auth/InvalidInvite/styles.ts","pages/Auth/InvalidInvite/view.tsx","pages/Auth/InvalidInvite/index.ts","pages/Auth/AddMobileNumber/components/EnterMobileNumber/styles.ts","pages/Auth/AddMobileNumber/components/EnterMobileNumber/view.tsx","pages/Auth/AddMobileNumber/components/EnterMobileNumber/controller.tsx","pages/Auth/AddMobileNumber/components/EnterMobileNumber/index.ts","pages/Auth/AddMobileNumber/components/VerifyMobileNumber/controller.tsx","pages/Auth/AddMobileNumber/components/VerifyMobileNumber/index.ts","pages/Auth/AddMobileNumber/view.tsx","pages/Auth/AddMobileNumber/controller.tsx","pages/Auth/AddMobileNumber/index.ts","pages/Auth/TraineeSplash/styles.ts","pages/Auth/TraineeSplash/view.tsx","pages/Auth/TraineeSplash/index.ts","features/teams/pages/TeamMembers/components/Filters/TeamMembersFilter.tsx","ui/icons/NoMembers.tsx","ui/icons/TeamMembersIcon.tsx","features/teams/pages/TeamMembers/components/ListActions/ListActions.tsx","ui/icons/Corona.tsx","features/teams/pages/TeamMembers/styles.ts","features/teams/pages/TeamMembers/TeamMembers.tsx","features/teams/pages/TeamMembers/index.ts","features/teams/pages/controller.tsx","ui/components/ModalDialogs/styles.ts","ui/components/ModalDialogs/StopBulkActionModal.view.tsx","ui/components/ModalDialogs/FailedModal.view.tsx","services/ChunkRequestService/store/reducers.ts","ui/icons/StopWarning.tsx","ui/components/ModalDialogs/ProgressModal.view.tsx","ui/components/ModalDialogs/store/reducers.ts","ui/components/ModalDialogs/ConfirmationModal.view.tsx","ui/components/ModalDialogs/controller.tsx","pages/OldSubmission/components/OldSubmissionRouter/controller.tsx","pages/OldSubmission/components/OldSubmissionRouter/index.ts","pages/OldSubmission/OldAccuracyTest/controller.tsx","pages/OldSubmission/OldAccuracyTest/index.ts","pages/OldSubmission/OldChallenge/controller.tsx","pages/Reports/store/actions.ts","pages/OldSubmission/OldChallenge/index.ts","pages/Reports/store/services.ts","constants/interfaces/ReportItem.ts","api/reports/index.ts","pages/Reports/store/states.ts","ui/icons/PractisSetSummary.tsx","ui/icons/TeamLeaderSummary.tsx","ui/icons/UserActivity.tsx","ui/icons/BillingReport.tsx","features/filters/dynamic-filter/date-filter/constants.ts","pages/Reports/helpers.ts","ui/icons/TrainingTime.tsx","pages/Reports/constants.ts","pages/Reports/styles.ts","ui/components/ReportingCard/styles.ts","ui/components/ReportingCard/view.tsx","ui/components/ReportingCard/index.ts","ui/components/Skeleton/styles.ts","ui/components/Skeleton/reporting-card-skeleton.view.tsx","ui/components/Skeleton/filter-skeleton.view.tsx","pages/Reports/view.tsx","pages/Reports/controller.tsx","pages/Roleplays/RoleplaysList/store/actions.ts","pages/Reports/index.ts","pages/CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/styles.ts","pages/Roleplays/RoleplaysList/constants.ts","pages/Roleplays/RoleplaysList/styles.ts","ui/icons/SidebarRoleplaysLarge.tsx","pages/Roleplays/RoleplaysList/store/services.ts","pages/Roleplays/RoleplaysList/store/states.ts","pages/Roleplays/components/Skeletons/styles.ts","pages/Roleplays/components/Skeletons/RoleplaySkeleton.tsx","services/GoogleAnalytics/index.tsx","pages/Roleplays/GoogleAnalytics/index.tsx","pages/Roleplays/RoleplaysList/controller.tsx","features/filters/searchable-filter-header/store/actions.ts","pages/Roleplays/RoleplaysList/index.ts","features/filters/searchable-filter-header/store/types.ts","features/filters/dynamic-filter/practis-set-filter/store/actions.ts","features/filters/searchable-filter-header/store/services.ts","features/filters/dynamic-filter/single-team-filter/store/actions.ts","features/filters/dynamic-filter/practis-set-filter/store/services.ts","features/filters/dynamic-filter/single-team-filter/store/constants.ts","features/filters/dynamic-filter/single-team-filter/store/reducers.ts","features/filters/dynamic-filter/single-team-filter/store/services.ts","helpers/hooks/useCountdown.ts","features/filters/filters-sidebar/services.ts","ui/components/ReportingControlPanel/styles.ts","ui/components/ReportingControlPanel/view.tsx","ui/components/ReportingControlPanel/controller.tsx","ui/components/ReportingControlPanel/index.ts","helpers/hooks/useQueryParamListener.ts","helpers/hooks/useSetQueryParam.ts","features/filters/dynamic-filter/practis-set-filter/constants.ts","ui/icons/NoReportingPractisSets.tsx","features/filters/filter-header/styles.tsx","features/filters/filter-header/view.tsx","features/filters/searchable-filter-header/store/constants.ts","features/filters/searchable-filter-header/store/reducers.ts","features/filters/searchable-filter-header/components/SearchInput/styles.ts","features/filters/searchable-filter-header/components/SearchInput/view.tsx","features/filters/searchable-filter-header/components/SearchInput/controller.tsx","features/filters/searchable-filter-header/components/SearchInput/index.ts","features/filters/searchable-filter-header/styles.ts","features/filters/searchable-filter-header/view.tsx","features/filters/searchable-filter-header/controller.tsx","features/filters/searchable-filter-header/index.ts","features/filters/filter-container/styles.ts","features/filters/filter-container/view.tsx","features/filters/dynamic-filter/practis-set-filter/styles.ts","features/filters/dynamic-filter/practis-set-filter/view.tsx","features/filters/dynamic-filter/practis-set-filter/store/constants.ts","features/filters/dynamic-filter/practis-set-filter/store/reducers.ts","features/filters/dynamic-filter/practis-set-filter/controller.tsx","features/filters/dynamic-filter/single-team-filter/constants.ts","features/filters/dynamic-filter/single-team-filter/styles.ts","features/filters/dynamic-filter/single-team-filter/view.tsx","features/filters/dynamic-filter/single-team-filter/controller.tsx","features/filters/dynamic-filter/multiple-teams-filter/store/actions.ts","features/filters/dynamic-filter/multiple-teams-filter/constants.ts","features/filters/dynamic-filter/multiple-teams-filter/store/constants.ts","features/filters/dynamic-filter/multiple-teams-filter/store/reducers.ts","features/filters/dynamic-filter/multiple-teams-filter/store/services.ts","features/filters/dynamic-filter/multiple-teams-filter/styles.ts","features/filters/dynamic-filter/multiple-teams-filter/view.tsx","features/filters/dynamic-filter/multiple-teams-filter/controller.tsx","features/filters/dynamic-filter/labels-filter/store/actions.ts","features/filters/dynamic-filter/labels-filter/constants.ts","features/filters/dynamic-filter/labels-filter/store/reducers.ts","features/filters/dynamic-filter/labels-filter/styles.ts","features/filters/dynamic-filter/labels-filter/components/labels-filter-item/styles.tsx","features/filters/dynamic-filter/labels-filter/components/labels-filter-item/view.tsx","features/filters/dynamic-filter/labels-filter/components/labels-filter-item/controller.tsx","features/filters/dynamic-filter/labels-filter/view.tsx","features/filters/dynamic-filter/labels-filter/controller.tsx","features/filters/dynamic-filter/month-filter/store/actions.ts","features/filters/dynamic-filter/month-filter/store/reducers.ts","features/filters/dynamic-filter/month-filter/store/services.ts","features/filters/dynamic-filter/month-filter/components/month-item/styles.ts","features/filters/dynamic-filter/month-filter/components/month-item/view.tsx","features/filters/dynamic-filter/month-filter/components/month-selector/constants.ts","features/filters/dynamic-filter/month-filter/components/month-selector/styles.ts","features/filters/dynamic-filter/month-filter/components/month-selector/view.tsx","features/filters/dynamic-filter/month-filter/components/month-selector/controller.tsx","ui/icons/YearLeftArrow.tsx","ui/icons/YearRightArrow.tsx","features/filters/dynamic-filter/month-filter/components/year-selector/styles.ts","features/filters/dynamic-filter/month-filter/components/year-selector/view.tsx","features/filters/dynamic-filter/month-filter/components/year-selector/controller.tsx","features/filters/dynamic-filter/month-filter/constants.ts","features/filters/dynamic-filter/month-filter/styles.ts","features/filters/dynamic-filter/month-filter/view.tsx","features/filters/dynamic-filter/month-filter/controller.tsx","features/filters/dynamic-filter/date-filter/store/actions.ts","features/filters/dynamic-filter/date-filter/store/reducers.ts","features/filters/dynamic-filter/date-filter/store/services.ts","features/filters/dynamic-filter/date-filter/styles.ts","features/filters/dynamic-filter/date-filter/view.tsx","features/filters/dynamic-filter/date-filter/controller.tsx","features/filters/dynamic-filter/controller.tsx","features/filters/filters-sidebar/styles.ts","features/filters/filters-sidebar/view.tsx","features/filters/filters-sidebar/controller.tsx","pages/Reports/PractisSetSummaryReport/constants.ts","pages/Reports/PractisSetSummaryReport/styles.ts","pages/Reports/PractisSetSummaryReport/view.tsx","pages/Reports/PractisSetSummaryReport/controller.tsx","pages/Reports/UserActivityReport/constants.ts","pages/Reports/UserActivityReport/styles.ts","pages/Reports/UserActivityReport/view.tsx","features/filters/dynamic-filter/labels-filter/store/services.ts","pages/Reports/UserActivityReport/controller.tsx","pages/Reports/TeamLeaderActivityReport/constants.ts","pages/Reports/TeamLeaderActivityReport/styles.ts","pages/Reports/TeamLeaderActivityReport/view.tsx","pages/Reports/BillingReport/constants.ts","pages/Reports/TeamLeaderActivityReport/controller.tsx","pages/Reports/BillingReport/styles.ts","pages/Reports/BillingReport/view.tsx","pages/Reports/BillingReport/controller.tsx","ui/icons/DetailsNav.tsx","ui/icons/Seats.tsx","ui/icons/LogoNav.tsx","ui/icons/Voice.tsx","pages/CompanySettings/styles.ts","pages/CompanySettings/components/CompanyDetails/styles.ts","pages/CompanySettings/components/CompanyDetails/constants.ts","ui/components/FormikSelect/style.ts","ui/components/FormikSelect/FormikSelect.tsx","ui/components/CustomizedInput/styles.ts","ui/components/CustomizedInput/tools.ts","ui/components/CustomizedInput/view.tsx","ui/components/CustomizedInput/controller.tsx","pages/CompanySettings/components/CompanyDetails/view.tsx","pages/CompanySettings/components/CompanyDetails/controller.tsx","pages/CompanySettings/components/CompanyUserLimit/styles.ts","ui/components/CompanyUserStatsInfo/styles.ts","ui/components/CompanyUserStatsInfo/view.tsx","ui/components/CompanyUserStatsInfo/controller.tsx","pages/CompanySettings/components/CompanyUserLimit/view.tsx","pages/CompanySettings/components/CompanyUserLimit/controller.tsx","pages/CompanySettings/components/CompanyUpdateLogo/styles.ts","pages/CompanySettings/components/CompanyUpdateLogo/view.tsx","pages/CompanySettings/components/CompanyUpdateLogo/constants.ts","pages/CompanySettings/components/CompanyUpdateLogo/controller.tsx","pages/CompanySettings/components/CompanyVoice/constants.ts","pages/CompanySettings/components/CompanyVoice/styles.ts","ui/components/RangeInput/RangeInput/RangeInput.tsx","helpers/functions/count-decimals.ts","pages/CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/helpers.ts","ui/icons/Sound.tsx","pages/CompanySettings/components/CompanyVoice/components/VoiceSampleText/styles.ts","pages/CompanySettings/components/CompanyVoice/components/VoiceSampleText/view.tsx","pages/CompanySettings/components/CompanyVoice/components/VoiceSampleText/controller.tsx","pages/CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/view.tsx","pages/CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/controller.tsx","pages/CompanySettings/components/CompanyVoice/components/VoiceSettingsSkeleton/styles.ts","pages/CompanySettings/components/CompanyVoice/components/VoiceSettingsSkeleton/view.tsx","pages/CompanySettings/components/CompanyVoice/view.tsx","pages/CompanySettings/components/CompanyVoice/controller.tsx","pages/CompanySettings/view.tsx","pages/CompanySettings/controller.tsx","pages/Reports/TrainingTimeReport/constants.ts","pages/Reports/TrainingTimeReport/styles.ts","pages/Reports/TrainingTimeReport/view.tsx","pages/Reports/TrainingTimeReport/controller.tsx","ui/icons/ObjectiveIcon.tsx","ui/icons/ObjectiveIconActive.tsx","ui/icons/ProductIcon.tsx","ui/icons/ProductIconActive.tsx","ui/icons/ProspectIcon.tsx","ui/icons/ProspectIconActive.tsx","ui/icons/SitationIcon.tsx","ui/icons/SitationIconActive.tsx","pages/Roleplays/components/AIParamSelect/constants.ts","pages/Roleplays/components/AIParamSelect/styles.ts","pages/Roleplays/components/AIParamSelect/controller.tsx","pages/Roleplays/components/AIParamSelect/index.ts","pages/Roleplays/components/AIParamTextbox/styles.ts","pages/Roleplays/components/AIParamTextbox/controller.tsx","pages/Roleplays/components/AiParamsComponents/Objective.tsx","pages/Roleplays/components/AiParamsComponents/ProductService.tsx","pages/Roleplays/components/AiParamsComponents/Prospect.tsx","pages/Roleplays/components/AiParamsComponents/Situation.tsx","pages/Roleplays/CreateRoleplay/constants.ts","pages/Roleplays/CreateRoleplay/styles.ts","pages/Roleplays/CreateRoleplay/controller.tsx","pages/Roleplays/CreateRoleplay/index.ts","ui/icons/InfoIcon.tsx","pages/Roleplays/websocketV2/service.ts","pages/Roleplays/RoleplayPage/styles.ts","ui/icons/SendActive.tsx","ui/icons/SendIcon.tsx","pages/Roleplays/components/TextInputWithButtons/TextInputWithButtons.tsx","ui/icons/RefreshCircle.tsx","ui/icons/WarningIcon.tsx","pages/Roleplays/RoleplayPage/store/states.ts","pages/Roleplays/RoleplayPage/constants.ts","ui/icons/CustomerAvatar.tsx","pages/Roleplays/components/Skeletons/ContentLoading.tsx","pages/Roleplays/RoleplayPage/store/actions.ts","ui/icons/RefreshCircleDisables.tsx","pages/Roleplays/RoleplayPage/store/services.ts","ui/icons/LoadingAudio.tsx","pages/Roleplays/RoleplayPage/components/ContentPanel.tsx","pages/Roleplays/components/Skeletons/BodySkeleton.tsx","pages/Roleplays/RoleplayPage/components/ContextPanel.tsx","ui/icons/PencilIconActive.tsx","pages/Roleplays/components/Skeletons/HeaderSkeleton.tsx","pages/Roleplays/RoleplayPage/components/RoleplayHeader.tsx","pages/Roleplays/RoleplayPage/components/RoleplayInfoModal.tsx","pages/Roleplays/RoleplayPage/controller.tsx","pages/Roleplays/RoleplayPage/index.ts","pages/Auth/Auth0Callback/Auth0Callback.tsx","App.tsx","features/searchState/helpers/index.ts","ui/variables/generate-variables.ts","app.config.ts","ui/components/MultiContextProvider/MultiContextProvider.tsx","constants/interfaces/ErrorResult.ts","tools/http/DefaultHttp.ts","tools/url/UrlUtils.ts","tools/url/DefaultUrlBuilder.ts","tools/newRelic/DefaultNewRelic.tsx","tools/localStorage/DefaultLocalStorage.ts","config/index.ts","pages/Auth/store/states.ts","features/socketProgress(api1)/store/states.ts","features/searchState/store/states.ts","config/context.ts","serviceWorker.ts","store/actions/index.ts","store/reducers/globals.ts","features/portableScenarios/store/hors/withTeams/reducer.ts","features/teams/store/reducers.ts","features/textToSpeech/store/reducers.ts","features/challenges/store/reducers.ts","features/submissions/store/reducers.ts","features/labels/store/reducers.ts","pages/Auth/store/reducers.ts","features/telepromter/store/reducers.ts","features/assessment-logs/store/reducers.ts","pages/ActionPages/NewUser/store/reducers.ts","features/portableLabels/store/reducer.ts","features/roles/store/reducer.ts","features/library/store/reducers.ts","store/reducers/index.ts","features/companies/store/reducers.ts","features/portableTeams/store/reducer.ts","features/portablePractisSets/store/reducer.ts","features/logs/store/reducers.ts","features/portableScenarios/store/reducer.ts","pages/Reports/store/reducers.ts","pages/Roleplays/RoleplaysList/store/reducers.ts","pages/Roleplays/RoleplayPage/store/reducers.ts","features/teams/pages/OverdueLearners/store/reducers.ts","features/teams/pages/Training/ScenarioReps/store/reducers.ts","theme/GlobalStyle.ts","ui/wrapper/PortableLoaderWrapper/PortableLoaderWrapper.tsx","config/storage.ts","index.tsx","config/store.ts"],"names":["Variables","Colors","white","softBlue","skyBlueTwo","darkSkyBlue","mainBlue","darkSkyBlueTwo15Full","steelGrey","cloudyBlue","whiteFive","paleGrey","tomato","brown","topaz","greenTwo","darkGreen","dark","darkTwo","black","transparent","backgroundGray","backgroundDark","lightGray","lighterGray","iconGray","iconGrayBg","coolGray","labelGray","hoverGray","primaryBlue","dodgerBlue","primaryRed","validGreen","softerBlue","cornflowerBlue","skyBlue","coolBlue","whiteTwo","whiteThree","whiteSix","paleGreyTwo","blackTwo","blackThree","darkThree","coral","salmon","paleRed","fadedRed","fadedRedMobile","fadedRedTwoMobile","lightMint","green","lightBlueGray","windowsBlue","lightBlue","blueyGray","steelGrey40","blueyGreyTwo","battleshipGrey","darkerGray","transparentSoftBlueTwo","darkSkyBlueTwo","darkSkyBlueThree","darkSkyBlue15","darkSkyBlue50","cloudyBlue15","blackTwo5","macaroniAndCheese","macaroniAndCheeseOpaque","Breaks","sm","md","ld","xl","BreakPoints","mid","small","smaller","responsiveLg","responsiveMd","responsiveSm","responsiveSmPlus","Spacing","Fonts","manrope","ROUTES","LANDING","AUTH_PAGES","LOGIN","INTERNAL_LOGIN","AUTH0_CALLBACK","MOBILE_NUMBER_LOGIN","MOBILE_NUMBER_VERIFY","VERIFY_MOBILE_NUMBER_PRIVATE","ADD_MOBILE_NUMBER","TRAINEE_LOGIN","LOGOUT","REGISTER","REGISTRATION","RESET_PASSWORD","FORGOT_PASSWORD","ONBOARDING","INVALID_INVITE","TRAINEE_SPLASH","PROFILE","PROFILE_SETTINGS","SECURITY","NOTIFICATIONS","ORGANIZATION_LOGS","ORGANIZATION_ASSESSMENT_LOGS","COMPANY_SETTINGS","ROOT","LOGO","USER_LIMIT","VOICE","ACTION_ITEMS","NEW_USER","PROGRESS","PROGRESS_PAGES","PRACTIS_SETS","PRACTIS_SETS_DETAILS","TRAINEE_INVITATION","SUBMISSIONS","SUBMISSION_SETTINGS","ACCURACY_TESTS","ALL","SINGLE","OLD_SINGLE","CHALLENGES","LIBRARY","LIBRARY_SETTINGS","SCENARIOS","PRACTISSETS","QUICK_ASSIGNMENT","ASSIGN_USERS","TELEPROMTER","TELEPROMTER_PAGES","PLAYBACK","COMPLETED","TRAINING","EXIT","TEAMS","TEAMS_PAGES","LIST_OF_TEAMS","MEMBERS","NEW_TEAM","MANAGE_TEAM","TRAINING_PAGES","OVERDUE_LEARNERS","TRAINEE_DETAILS_REPS","TRAINEE_DETAILS","USERS","USER_INVITATIONS","USER_PERFORMANCE","INVITATION_PERFORMANCE","INVITATIONS","DRAFTS","PRIVACY","TERMS","SUPPORT","Health","BROKEN_SHARED_LINK","MOBILE_DEEP_LINKS","PRACTIS_SET_INVITATION","V2_SUBMISSIONS","CHALLENGE_FEEDBACK","V2_CHALLENGE_FEEDBACK","PRACTIS_SET_DETAILS","REPORTS","LIST_OF_REPORTS","PRACTIS_SET_SUMMARY_REPORT","USER_ACTIVITY_REPORT","TEAM_LEADER_ACTIVITY_REPORT","BILLING_REPORT","TRAINING_TIME_REPORT","ROLEPLAYS","LIST_OF_ROLEPLAYS","NEW_ROLEPLAY","useUserIdMatch","userId","useRouteMatch","params","parseInt","replaceUserId","path","replace","toString","useAuthTypeApi","http","useHttp","useCallback","post","useAuthZeroTokenTypeApi","useLoginApi","useRegistrationApi","useLoginByPhoneCodeApi","useForgotPasswordApi","email","useResetPasswordApi","password","token","useGetPhoneCodeApi","phone","useSearchAiLogsApi","get","undefined","useGetChallengeApi","challengeId","useSearchChallengesApi","searchParams","useDeleteChallengesApi","challengeIds","delete","useAssignChallengeLabelsApi","labels","useDeleteChallengeLabelsApi","useCreateChallengeApi","challengeInfo","useUpdateChallengeInfoApi","put","useUpdateChallengeStatusApi","status","useAssignLinesToChallengeApi","lines","useFileUploadApi","data","useCreateMediaApi","mimeType","useVerifyMediaApi","mediaId","useSearchCompaniesApi","statuses","limit","offset","query","searchTerm","sort","orderBy","field","asc","join","CompanyStatus","ACTIVE","DELETED","useGetCompanyApi","companyId","useUpdateCompanyNameApi","name","useGetCompanyUserStatsApi","useSetCompanyOwnerApi","ownerId","useSetCompanyLogoApi","useDeleteCompanyLogoApi","useGetCompanyVoiceSettingsApi","role","useSetCompanyVoiceSettingsApi","settings","useSearchInvitersApi","useCreateLabelApi","useSearchLabelsApi","useDeleteLabelApi","labelId","useUpdateLabelApi","useAssignLabelsApi","entities","deleted","entityType","selectAll","search","assignedArea","useAssignedLabelsIdsApi","entityIds","useSearchPractisSetsApi","useDeletePractisSetsApi","practisSetIds","useGetPractisSetApi","practisSetId","useGetPractisSetContentApi","useAssignPractisSetContentApi","practisSetContentData","useUpdatePractisSetApi","useAssignPractisSetLabelsApi","practisSetLabels","useDeletePractisSetLabelsApi","useCreateNewPractisSetApi","practisSet","useUpdatePractisSetStatusApi","useSearchScenariosApi","useDeleteScenariosApi","scenarioIds","useDownloadScenarioReportApi","scenarioId","useGetScenarioApi","useUpdateScenarioApi","useAssignScenarioLabelApi","useDeleteScenarioLabelApi","useCreateScenarioApi","scenarioInfo","useAssignLinesToScenarioApi","useUpdateScenarioStatusApi","ScenarioIds","useSearchLogsApi","useSearchPacingsApi","useGetUserApi","useLoadUserRolesApi","useSearchUserEnrollmentsApi","getSearchSortingValue","useSearchUsersApi","useDeleteUserApi","userIds","useGetUserReportApi","useSearchStagingDraftsApi","useDeleteStagingApi","stagingIds","useSearchCreatedByUsersListApi","useSearchEditedByUsersListApi","useAssignTeamsToUserApi","addedTeamIds","deletedTeamIds","useCreateUserStagingApi","users","useSearchStagingUsersApi","draftId","useAddStagingUsersApi","stagingId","useUpdateStagingUsersApi","stagingUserId","user","useDeleteStagingUsersApi","stagingUserIds","useInviteStagingUsersApi","useAssignFiltersToStagingUsersApi","assignFilters","useGetUserFeaturesApi","useAssignUserLabelsApi","useDeleteUserLabelsApi","useUpdateUserInfo","newUserInfo","useUpdateUserPhoneNumber","phoneNumber","useConfirmUserPhoneNumber","code","useUpdateUserPassword","useRevokePendingUsers","useGetUserPermissionsApi","useGetUserSettingsApi","useSaveUserSettingsApi","useSetUserPhotoApi","useGetUserPreferencesApi","useUpdateUserPreferencesApi","preferences","patch","useSearchSubmissionsApi","useGetSubmissionDetailsApi","submissionId","useRequestSubmissionRedoApi","senderName","text","usePerformSubmissionActionApi","action","useArchiveSubmissionsApi","submissionsIds","useRestoreSubmissionsApi","useGetSubmissionReviewApi","usePerformSubmissionReviewApi","useAddSubmissionFlag","type","useDeleteSubmissionFlag","flagId","useGetSubmissionIdByOldId","oldSubmissionId","useGetSubmissionRepLines","useSearchTeamsApi","useSearchTeamLeadersApi","useGetSingleTeamApi","teamId","useSearchTrainingPractisSetsApi","useSearchPractisSetDetailsUsersApi","useDeleteTeamsApi","teamIds","useGetMembersReportApi","useGetPractisSetsReportApi","useGetEnrollmentsReportApi","psetId","useSearchTeamMembersApi","useMarkTeamAsViewedApi","useCreateNewTeamApi","useAssignMembersToTeamsApi","members","useDeleteMembersFromTeamsApi","useAssignLabelsToTeamsApi","useDeleteLabelsFromTeamsApi","useUpdateTeamNameApi","useUpdateTeamLeaderApi","teamUserId","isTeamLead","useEnrollPractisSetsToUserApi","enrollments","useDeleteEnrollmentsApi","enrollmentIds","useCreateUpdateEnrollmentDueDate","enrollmentDueDates","useGetEnrollments","useGetEnrollmentApi","enrollmentId","useGetEnrollmentProgressApi","useGetEnrollmentDailyTrainingApi","useGetOverdueLearners","useUserPerformanceApi","isInvitation","useTestInvitationApi","useInviteUsers","useResendInvitationApi","invitationIds","useNudgeUsersApi","nudgeDateList","useRemindToStartApi","Check","forwardRef","ref","className","shadow","viewBox","width","height","xmlns","xmlnsXlink","x","y","filterUnits","dx","in","result","stdDeviation","values","fill","fillRule","d","Error","id","variantIcon","success","error","styleProperties","backgroundColor","SnackbarContainer","styled","div","props","open","IconWrapper","StyledIcon","theme","StyledText","StyledMessageContainer","InfoSnackbar","memo","content","message","variant","Icon","Array","isArray","map","index","data-test","handleMessage","dispatch","clientSideErrorMessage","CLIENT_SIDE_ERROR_MESSAGE","displayMessage","setTimeout","hideMessage","useShowMessage","useDispatch","connect","state","messages","getErrorMessages","bindActionCreators","handleClose","COLORS","default","light","normal","warning","gray","grayLight","StyledButtonContent","fontSize","hasIcon","borderRadius","StyledButtonIconContainer","onlyIcon","color","StyledButtonIcon","buttonSize","StyledButton","button","buttonWidth","customColor","customDisabledColor","Button","label","children","style","disabled","icon","iconRender","loading","loadingSize","loadingColor","dataTest","title","onClick","size","src","alt","SmallButton","NEW_PERMISSIONS","HttpContext","createContext","useContext","TrainingMode","trainingModeNames","SCRIPT","NO_SCRIPT","KEYWORDS","TEST_YOURSELF","trainingModeName","mode","ROLE_NAMES","COMPANY_ADMIN","USER","PRACTIS_ADMIN","TEAM_LEADER","PRACTIS_SET_STATUS_ITEMS","INVITE_TRAINEE","INVITE_COMPANY_ADMIN","value","ALL_FILTER_VALUE","isUserRole","isCompanyAdminRole","isPractisAdminRole","isAdminRole","isTeamLeader","userRoleTitle","pendingUserRoleTitle","toLowerCase","PractisWebMode","ASSIGN_LABEL_OPTIONS","SCENARIO","CHALLENGE","PRACTISSET","INVITATION","PRACTIS_SET","TEAM","LOAD_ASSIGNED_LABELS","PRACTIS_SETS_SCREEN_LIBRARY","SCENARIOS_SCREEN_LIBRARY","CHALLENGES_SCREEN_LIBRARY","USERS_ACTIVE","USERS_PENDING","TEAMS_SCREEN","MEMBERS_SCREEN","TRAINING_SCREEN","initialState","info","isLoading","getProfileState","profile","getProfileLoading","getProfileError","userProfileReducer","USER_PROFILE","USER_PROFILE_SUCCESS","USER_PROFILE_FAILURE","UPDATE_USER_PROFILE","UPDATE_USER_PROFILE_SUCCESS","UPDATE_USER_PROFILE_FAILURE","RESET_PROFILE_INFORMATION","ACTIONS","SAVE_LABEL_FILTERS_SUCCESS","labelFilters","filters","SELECT_LABEL_FILTER","selectedLabels","toggleItemInArray","searchFilter","CLEAR_LABEL_FILTERS","FETCH_ALL_USERS","FETCH_ALL_USERS_SUCCESS","FETCH_ALL_USERS_FAILURE","CLEAR_ALL_USERS","FETCH_USER","FETCH_USER_SUCCESS","FETCH_USER_FAILURE","UPDATE_USER","UPDATE_USER_SUCCESS","UPDATE_USER_FAILURE","searchUserPractisSetsStart","SEARCH_USER_PRACTIS_SETS_START","searchUserPractisSetsSuccess","practisSets","SEARCH_USER_PRACTIS_SETS_SUCCESS","searchUserPractisSetsFailure","SEARCH_USER_PRACTIS_SETS_FAILURE","fetchPortablePractisSetsStart","FETCH_PORTABLE_PRACTIS_SETS_START","fetchPortablePractisSetsSuccess","FETCH_PORTABLE_PRACTIS_SETS_SUCCESS","fetchPortablePractisSetsFailure","FETCH_PORTABLE_PRACTIS_SETS_FAILURE","updateTraineeProfilePractisSetCheckedState","UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE","updateAllPractisSetsCheckedState","selectedPractisSetIds","checked","partial","UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE","fetchAllUsers","fetchAllUsersSuccess","fetchAllUsersFailure","clearAllUsers","updateUserActionStart","UPDATE_USER_START","updateUserActionSuccess","updateType","updateUserActionFailure","fetchUserAction","fetchUserSuccess","fetchUserFailure","updateUserAction","updateUserSuccess","updateUserFailure","searchInvitationsStart","SEARCH_USER_INVITATIONS_START","searchInvitationsSuccess","SEARCH_USER_INVITATIONS_SUCCESS","searchInvitationsFailure","SEARCH_USER_INVITATIONS_FAILURE","updateInvitationStart","UPDATE_USER_INVITATION_START","updateInvitationSuccess","invitation","UPDATE_USER_INVITATION_SUCCESS","updateInvitationFailure","UPDATE_USER_INVITATION_FAILURE","getUserPerformanceStart","GET_USER_PERFORMANCE_START","getUserPerformanceSuccess","trainee","GET_USER_PERFORMANCE_SUCCESS","getUserPerformanceFailure","GET_USER_PERFORMANCE_FAILURE","resetUserPerformanceAction","RESET_USER_PERFORMANCE","fetchUserAllPractisSetsSuccess","FETCH_USER_ALL_PRACTIS_SETS","updateSelectedUserState","UPDATE_SELECTED_USER_STATE","updateAllSelectedUsersState","UPDATE_ALL_SELECTED_USERS_STATE","updateSelectedInvitationState","invitationId","UPDATE_SELECTED_INVITATION_STATE","updateAllSelectedInvitationsState","UPDATE_ALL_SELECTED_INVITATIONS_STATE","fetchAllDrafts","SEARCH_STAGING_DRAFTS","fetchAllDraftsSuccess","SEARCH_STAGING_DRAFTS_SUCCESS","fetchAllDraftsFailure","SEARCH_STAGING_DRAFTS_FAILURE","updateDraftsStart","UPDATE_STAGING_DRAFTS_START","updateDraftsSuccess","draft","UPDATE_STAGING_DRAFTS_SUCCESS","updateDraftsFailure","UPDATE_STAGING_DRAFTS_FAILURE","updateSelectedDraftState","UPDATE_SELECTED_DRAFT_STATE","updateAllSelectedDraftState","draftIds","UPDATE_ALL_SELECTED_DRAFT_STATE","fetchCreatedByUsersStart","FETCH_CREATED_BY_USERS_START","fetchCreatedByUsersSuccess","FETCH_CREATED_BY_USERS_SUCCESS","fetchCreatedByUsersFailure","FETCH_CREATED_BY_USERS_FAILURE","fetchEditedByUsersStart","FETCH_EDITED_BY_USERS_START","fetchEditedByUsersSuccess","FETCH_EDITED_BY_USERS_SUCCESS","fetchEditedByUsersFailure","FETCH_EDITED_BY_USERS_FAILURE","fetchUserFeaturesStart","FETCH_USER_FEATURES_START","fetchUserFeaturesSuccess","FETCH_USER_FEATURES_SUCCESS","fetchUserFeaturesFailure","FETCH_USER_FEATURES_FAILURE","removeUserLabel","REMOVE_USER_LABEL","removePendingUserLabel","REMOVE_PENDING_USER_LABEL","fetchUserPreferencesStart","FETCH_USER_PREFERENCES_START","fetchUserPreferencesSuccess","FETCH_USER_PREFERENCES_SUCCESS","fetchUserPreferencesFailure","FETCH_USER_PREFERENCES_FAILURE","updateUserPreferencesStart","UPDATE_USER_PREFERENCES_START","updateUserPreferencesSuccess","keys","UPDATE_USER_PREFERENCES_SUCCESS","updateUserPreferencesFailure","UPDATE_USER_PREFERENCES_FAILURE","useEncapsulatedDispatch","useWithLabelsContext","reducerName","scope","targetScope","DEFAULT_LABELS_SCOPE","WithLabelsScopes","includes","_scope","encapsulateAction","useFetchAllLabelsService","showMessage","searchLabels","sp","a","items","totalCount","pageNum","prevItems","unionWith","i1","i2","Math","min","length","numberOfPages","NOT_AUTHORIZED_ERROR_MESSAGE","useToggleCollapseLabel","toggleCollapseLabelAction","useToggleCollapseAllLabels","collapsedLabelsList","usePortableLabelsState","filter","item","ids","useResetCollapseAllLabels","useSaveLabels","useSelectLabels","selectLabelsAction","useSelectAllLabels","labelsList","selectedList","allLabels","useDeselectAllLabels","useResetSelectedLabels","useResetLabels","searchTree","leaf","i","recursiveParent","selected","labelsTree","parentId","parentLabel","siblingIds","every","has","add","some","recursiveMarkChildren","child","recursiveUnmarkChildren","useCalculatePreSelectedLabels","selectedItems","entity","assignedLabels","preAssignedLabelsSet","Set","preAssignedLabels","from","countLabels","selectedItemEntities","selectedEntity","forEach","labelIDs","hasOwnProperty","Number","listToTree","matchedLabel","useCalculatePreSelectedLabelsForSingleItem","useHandleSelectLabels","newSelectedLabels","selectedLabel","useCalculateDeletedLabels","calculateRemovedLabels","selectedLabelIds","initialSelectedIds","calculateAssignedLabels","clearSelectedItemIfNotLoaded","loadedList","useRenewLabelsStateOnUpdate","compare","b","sortLabels","nodes","node","filterLabels","term","reduce","getNodes","object","indexOf","push","LocationStateType","useLocations","history","useBaseHistory","location","useLocation","rootLocation","modalLocation","EXTERNAL_URL","MODAL","background","prevLocation","findRootLocation","useHistory","pushModal","replaceModal","showModalDialog","modalOptions","SHOW_MODAL","useHideModalDialog","HIDE_MODAL","useShowConfirmModalDialog","modalProps","modalType","CheckPermission","permissions","alternateContent","matchAll","useSelector","permissionList","r","searchLibraryPractisSetsStart","SEARCH_LIBRARY_PRACTIS_SETS_START","searchLibraryPractisSetsSuccess","SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS","searchLibraryPractisSetsFailure","SEARCH_LIBRARY_PRACTIS_SETS_FAILURE","getFullLibraryPractisSetsStart","GET_FULL_LIBRARY_PRACTIS_SETS_START","getFullLibraryPractisSetsSuccess","GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS","getFullLibraryPractisSetsFailure","GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE","updateLibraryPractisSetStart","UPDATE_LIBRARY_PRACTIS_SET_START","updateLibraryPractisSetSuccess","updatedPractisSet","UPDATE_LIBRARY_PRACTIS_SET_SUCCESS","updateLibraryPractisSetFailure","UPDATE_LIBRARY_PRACTIS_SET_FAILURE","updateAssignedLibraryPractisSet","assignedPractisSets","UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET","updateSeparateAssignedLibraryPractisSet","UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET","setSearchTermForLibraryPractisSet","SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET","updateLibraryPractisSetCheckedState","UPDATE_SELECTED_PRACTIS_SET_STATE","UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE","searchLibraryScenariosStart","SEARCH_LIBRARY_SCENARIOS_START","searchLibraryScenariosSuccess","scenarios","SEARCH_LIBRARY_SCENARIOS_SUCCESS","searchLibraryScenariosFailure","SEARCH_LIBRARY_SCENARIOS_FAILURE","updateLibraryScenarioStart","UPDATE_LIBRARY_SCENARIO_START","updateLibraryScenarioSuccess","updatedScenario","UPDATE_LIBRARY_SCENARIO_SUCCESS","updateLibraryScenarioFailure","UPDATE_LIBRARY_SCENARIO_FAILURE","updateLibraryScenarioCheckedState","UPDATE_SELECTED_SCENARIO_STATE","updateAllScenarioCheckedState","selectedScenarioIds","UPDATE_ALL_SELECTED_SCENARIOS_STATE","searchLibraryChallengesStart","SEARCH_LIBRARY_CHALLENGES_START","searchLibraryChallengesSuccess","challenges","SEARCH_LIBRARY_CHALLENGES_SUCCESS","searchLibraryChallengesFailure","SEARCH_LIBRARY_CHALLENGES_FAILURE","updateLibraryChallengeStart","UPDATE_LIBRARY_CHALLENGES_START","updateLibraryChallengeSuccess","updatedChallenge","UPDATE_LIBRARY_CHALLENGES_SUCCESS","updateLibraryChallengeFailure","UPDATE_LIBRARY_CHALLENGES_FAILURE","updateLibraryChallengeCheckedState","UPDATE_SELECTED_CHALLENGE_STATE","updateAllChallengesCheckedState","selectedChallengeIds","UPDATE_ALL_SELECTED_CHALLENGES_STATE","hasPermission","permission","useLoggedInUserPermissionsHelper","loggedInUser","useLoggedInUserProfileState","useMemo","hasActionPermission","createLoggedInUserPermissionsHelper","UserRoleLevel","userRoleLevelMap","getRoleLevel","roleName","NONE","getUserRoleLevel","useLoggedInUserRolesHelper","loggedInUserRoleLevel","canViewRole","createUserRolesHelper","InvitationActions","useInvitationActionsHelper","canAssignInvitationLabel","ASSIGN_INVITATION_LABEL","canResendInvitation","RESEND_INVITATION","canRevokeInvitation","hasRevokeInvitationPermission","REVOKE_INVITATION","getBulkActions","invitations","base","getBulkActionsAvailability","getBulkActionAvailabilityItem","isBulkActionVisible","createInvitationActionsHelper","momentTZ","require","formatTime","date","withSeconds","Date","hours","getHours","minutes","getMinutes","seconds","getSeconds","ampm","secondsStr","leadZero","formatAMPM","formatMMDDYY","dayjs","toDate","day","getDate","month","getMonth","year","getFullYear","slice","substring","formatHour","intDate","formatDate","showToday","shouldShowTime","isToday","formatDateWithTimeZone","stringifiedDate","splittedDate","toDateString","format","getDateWithTZOffset","timezone","tz","guess","startOf","formatDateChart","today","getCopyrightYear","StyledLoadingComponent","LoadingIcon","LoadingText","StyledCircularProgress","CircularProgress","LoadingComponent","shouldDelay","useState","show","setShow","useEffect","timeoutId","clearTimeout","StyledLabelListItemContainer","ChildLabelsContainer","expanded","LabelItemActions","StyledCheckbox","Checkbox","LabelNameContainer","ArrowContainer","CollapseArrow","LabelListItemInputContainer","LabelListItemInput","Input","hasChildren","StyledLabelListItem","modified","searched","PortableLabelListItem","openActions","toggleCollapse","labelsCollapseState","setLabelFilters","disableLabels","isLabelSelected","isLabelPartiallySelected","isExpanded","inputRef","useRef","handleSelectLabels","e","stopPropagation","TriangleDown","TriangleRight","colorTheme","maxLength","readOnly","hint","menuOpen","handleChange","border","childLabel","PortableLabelListItemContainer","setOpen","toggleOpenActions","StyledLabelsList","ScrollableLabelContainer","PortableLabelsList","Container","StyledEmptyContent","NoTeamsTitle","EmptyLabels","NoLabels","SmallContainer","StyledEmptyContentSmall","NoLabelsTitle","StyledEmptyLabelsContent","NoResults","version","NoSearchResult","StyledCreateLabels","CreateLabelsBody","FiltersHeader","FiltersSavePanel","SelectActions","StyledPlainActionsWrapper","PlainAction","span","css","colorHover","colorActive","SelectedCaption","FilterTitle","p","SearchWrapper","PortableLabels","collapsedList","onSave","onClearSelected","onDeselectAll","onSelectAll","onToggleCollapse","onToggleCollapseAll","onSetSelected","filtersTitle","showSelectActions","showSearch","showSave","noResultType","actionConfig","clear","select","setSearchTerm","transformedLabels","setTransformedLabels","processedSelectedList","setProcessedSelectedList","processedIds","setProcessedIds","getPrecessedLabels","compose","processedDataIds","treeToArray","abs","isAllSelected","clearHandler","deSelectAllHandler","treeToList","showNoItems","showNoResultsState","showEmptyState","selectedLabelsLength","onChange","PortableLabelsWithStore","resetSelectedOnUnmount","rest","useLabelsState","collapsed","collapseLabelHandler","collapseAllLabels","resetCollapsedLAbels","saveHandler","deselectAll","resetSelected","useCreateLabelService","createLabelApi","updateLabelStart","then","updateLabelSuccess","catch","updateLabelFailure","useSearchLabelsService","searchLabelsApi","searchLabelsStart","searchLabelsSuccess","searchLabelsFailure","useUpdateLabelService","updateLabelApi","useDeleteLabelService","deleteLabelApi","useSaveUserFiltersService","saveUserSettingsApi","isAuthorized","saveLabelFiltersStart","getCurrentUserId","saveLabelFiltersSuccess","setLabelFilterAction","saveLabelFiltersFailure","Promise","reject","useSelectLabelFilterActionService","selectLabelFilterAction","useSetPreviouslyAssignedLabelsAction","setPreviouslyAssignedLabels","useToggleCollapseLabelFieldService","toggleCollapseLabelFieldAction","useToggleCollapseAssignLabelFieldService","toggleCollapseAssignLabelFieldAction","useExpandLabelFieldByIdService","expandLabelFieldByIdAction","useSetLabelFilterActionService","useClearLabelFilterActionService","clearLabelFilterAction","useSetAssignLabelsActionService","setAssignLabelsAction","useCollapseAllLabelsService","collapseAllLabelsAction","useExpandAllLabelsService","expandAllLabelsAction","useExpandMultipleLabelsService","labelIds","expandMultipleLabelsAction","useOpenLabelCreationPanelService","openLabelCreationPanelAction","useCloseLabelCreationPanelService","closeLabelCreationPanelAction","useSetLabelsSearchTermService","setLabelsSearchTerm","useSetEditingLabelActionService","configs","setEditingLabelAction","lastUpdated","portableLabels","Arrow","StyledPopover","Popover","verticaloffset","horizontaloffset","Wrapper","padding","PopupComponent","triggerRef","onDismiss","arrow","hideOnOutsideClick","anchorOrigin","transformOrigin","verticalOffset","horizontalOffset","anchorEl","current","onClose","vertical","horizontal","clientWidth","clientHeight","Popup","dismissKey","singleton","shown","_setShown","shownRef","setShown","hide","toggleShown","enabled","setEnabled","enable","disable","key","forCurrentUser","itemKey","console","warn","getValue","dismissedHashString","localStorage","getItem","JSON","parse","setItem","stringify","isDismissed","setDismiss","onDismissHandler","dismissedItemsHash","useDismiss","dismissed","setDismissed","dismissProps","dismiss","innerTriggerRef","LabelsStateSelectorContext","React","isEqual","LabelsConfigStateSelectorContext","useLabelsConfigState","UpdatedLabelsStateSelectorContext","useUpdatedLabelsState","Checked","stroke","strokeLinecap","transform","Dash","checkedBackground","checkedColor","borderColor","StyledWrapper","StyledLabel","weight","SelectedIconContainer","marginLeft","PartialIconContainer","HiddenCheckbox","input","fontColor","fontWeight","labelStyles","disabledCheckedBackground","checkboxMarginLeft","withoutBorder","Title","Fieldset","appState","labelsState","_labels","SET_PREVIOUSLY_ASSIGNED_LABELS","SET_LABEL_FILTERS","SET_ASSIGN_LABELS","clearAssignLabelsAction","CLEAR_ASSIGN_LABELS","SAVE_LABEL_FILTERS_START","SAVE_LABEL_FILTERS_FAILURE","TOGGLE_COLLAPSE_LABEL_FIELD","TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD","EXPAND_LABEL_FIELD_BY_ID","COLLAPSE_ALL_LABELS","collapseAllTableLabelsAction","COLLAPSE_ALL_TABLE_LABELS","EXPAND_ALL_LABELS","EXPAND_MULTIPLE_LABELS","modifyLabelNameAction","MODIFY_LABEL_NAME","SET_EDITING_LABEL","SET_LABELS_SEARCH_TERM","OPEN_LABEL_CREATION_PANEL","CLOSE_LABEL_CREATION_PANEL","SEARCH_LABELS_START","SEARCH_LABELS_SUCCESS","SEARCH_LABELS_FAILURE","UPDATE_LABEL_START","updatedLabel","UPDATE_LABEL_SUCCESS","UPDATE_LABEL_FAILURE","ifChanged","prevSearchParams","newSearchParams","equal","ALL_FILTER_NAME","ENROLLMENT_OPTIONS","COMPLETION_OPTIONS","useSearchParamsState","initialSearchParams","setSearchParams","setInitial","setFilter","f","setOverrideFilter","setMultipleFilter","prevMatchedFieldFilters","newMatchedFieldValues","newFilters","setFilterByStatus","filterByStatus","filterByStatusValue","setCompletion","completionStatus","completion","setOrderBy","prevOrderBy","setLabelIDs","setPractisSetIDs","practisSetIDs","setRoleIDs","roles","roleIDs","setTeamIDs","teams","setLimit","setOffset","setCustom","getFilterByValue","filterValue","getCompletionValue","refreshSearchParams","refreshRate","random","applyLocalSearch","fields","RegExp","escapeRegExp","trim","test","applyLocalFiltering","statusFilter","filterLength","labelFilterLength","filteredData","filterParam","roleId","applyLocalSorting","mapItems","sortableItems","sortKey","sortDirection","first","second","Boolean","useSearchParams","getCompanyState","company","getCompanyLoading","companyProfileReducer","COMPANY_INFO","COMPANY_INFO_SUCCESS","COMPANY_INFO_FAILURE","RESET_COMPANY_INFORMATION","initialCompanyVoiceSettingsState","companyVoiceSettingsReducer","LOAD_VOICE_SETTINGS_START","LOAD_VOICE_SETTINGS_SUCCESS","voiceSettings","LOAD_VOICE_SETTINGS_FAILURE","initialCompanyAdminsState","companyAdminsReducer","FETCH_COMPANY_ADMINS_START","FETCH_COMPANY_ADMINS_SUCCESS","FETCH_COMPANY_ADMINS_FAILURE","CLEAR_COMPANY_ADMINS","initialCompanyUserStatsState","companyUserStatsReducer","FETCH_COMPANY_USER_STATS_START","FETCH_COMPANY_USER_STATS_SUCCESS","FETCH_COMPANY_USER_STATS_FAILURE","Storage","storage","this","removeItem","Object","freeze","Divider","hr","TableDivider","useSearchDraftsService","searchStagingApi","useDeleteStagingService","deleteStagingApi","successCallback","useUpdateAllSelectedDraftStateService","useUpdateSelectedDraftStateService","useSearchCreatedByUsersService","searchCreatedByUsersListApi","createdByUsers","useSearchEditedByUsersService","searchEditedByUsersListApi","lastEditedBy","useSearchInvitationsService","searchUsersApi","shouldSetStore","UserStatus","PENDING","invitedBy","invitersIDs","companies","setSearchState","SEARCH_STATE","PENDING_USERS","childrenKeys","useResendInvitationService","resendInvitationApi","isRowResend","response","find","useCopyInviteTextService","invitationCode","inviteTextParams","firstName","inviter","lastName","companyName","registrationUrl","buildRegistrationUrl","inviteText","UserRoles","buildAdminInviteText","copy","copyTextToClipboard","useRevokeInvitationService","revokeInvitationApi","useUpdateAllSelectedInvitationsStateService","useUpdateSelectedInvitationStateService","useSearchUsersService","userStatuses","ACTIVE_USERS","useDeleteUserService","deleteUserApi","usePractisSetsEnrollmentsService","searchUserPractisSetsApi","transformEnrollmentsToPractisSets","useAssignTeamsToUsersService","assignTeamsApi","useNudgeTraineesService","nudgeTraineesApi","nudgeUserData","numberOfUsers","useGetUsersReportService","getUserReportApi","url","window","URL","createObjectURL","Blob","link","document","createElement","href","setAttribute","body","appendChild","click","useDeleteUserLabelService","isPending","deleteUserLabelsApi","payload","findAllChildIds","useUpdateAllSelectedUsersStateService","useUpdateSelectedUserStateService","useSearchUserPractisSetsService","getSearchUserPractisSetsParams","useFetchUserAllPractisSets","fetchUserPractisSets","useUnEnrollPractisSetService","unenrollEnrollmentApi","unEnrolledPractisSetIds","useUserPerformanceService","userPerformanceApi","useResetUserPerformanceService","useUpdateAllPractisSetsCheckedStateService","useUpdateTraineeProfilePractisSetsCheckedStateService","useAssignFiltersToUserService","assignTeamsToUserApi","enrollPractisSets","unEnrollPractisSets","assignLabelsApi","updateEnrollmentsDueDate","shouldAssignTeams","all","assignedTeamIDs","deletedTeamIDs","isEmpty","assignedPractisSetIDs","dueDate","DATE_FORMAT","deletedEnrollmentIds","assignedLabelsIDs","deletedLabelIDs","updatedEnrollments","datas","updateDraftUsersFailure","useRemindUsersService","remindUsersApi","ENROLLMENT_REMIND_TO_START","axios","Http","request","useTempToken","method","getConfig","API_BASE_URL","headers","generateHeaders","clearAuthData","errorCode","details","customHeaders","authorization","Authorization","additionalHeaders","Client","useFetchUser","getUser","USER_NOT_FOUND_ERROR_MESSAGE","updateUser","self","successMessage","putProtected","res","updateUserProfileSuccess","useGetUserFeaturesService","getUserFeaturesApi","useGetUserPreferencesService","getUserPreferencesApi","useUpdateUserPreferenceService","updateUserPreferencesApi","onSuccess","UsersStateSelectorContext","useUsersState","UpdateUsersStateStateSelectorContext","useUpdateUsersState","InvitationsStateSelectorContext","selectSelectedInvitations","selectItemsByIds","selectedInvitations","useInvitationsState","UpdateInvitationStateStateSelectorContext","useUpdateInvitationsState","DraftsStateSelectorContext","useDraftsState","UpdateDraftsStateStateSelectorContext","useUpdatedDraftsState","UserPerformanceStateSelectorContext","useUserPerformanceState","UpdatedUserPractisSetsStateSelectorContext","useUpdatedUserPractisSetsState","ASSIGN_LABELS_TO_PRACTIS_SET_ACTION","DELETE_LABELS_FROM_PRACTIS_SET_ACTION","GET_PRACTIS_SET_CONTENT_ACTION","ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION","UPDATE_PRACTIS_SET_STATUS_ACTION","CREATE_PRACTIS_SET_ACTION","UPDATE_PRACTIS_SET_ACTION","CREATE_SCENARIO_ACTION","UPDATE_SCENARIO_ACTION","ASSIGN_LABELS_TO_SCENARIO_ACTION","DELETE_LABELS_FROM_SCENARIO_ACTION","ASSIGN_LINES_TO_SCENARIO_ACTION","UPDATE_SCENARIO_STATUS_ACTION","DELETE_LINES_FROM_SCENARIO_ACTION","CREATE_CHALLENGE_ACTION","UPDATE_CHALLENGE_ACTION","ASSIGN_LABELS_TO_CHALLENGE_ACTION","DELETE_LABELS_FROM_CHALLENGE_ACTION","ASSIGN_LINES_TO_CHALLENGE_ACTION","UPDATE_CHALLENGE_STATUS_ACTION","initialGenerateChallengeData","description","sourceScenarioId","tryLimit","DEFAULT_CHALLENGE_TRY_LIMIT","PractisSetStatuses","EventNameList","REFRESH_TEAMS_LIST","REFRESH_TEAM_MEMBERS","REFRESH_TEAM_CONTROLLER","REFRESH_TRAINING_PAGE","REFRESH_PENDING_USERS_PAGE","CLEAR_PAGING","useHtmlPageTitle","dependencies","suffix","isAdminPortal","generateHtmlTitle","htmlTitle","reverse","dependency","BulkActionAvailability","getBulkActionAvailability","canPerformAction","availableFor","AVAILABLE_FOR_ALL","AVAILABLE_FOR_SOME","UNAVAILABLE_FOR_ALL","availability","actions","actionsMap","getBulkActionsMap","areItemsEmpty","areBulkActionsDisabled","isBulkActionDisabled","ACCURACY","parentKey","HourGlass","StyledAvatarContainer","imgBorderRadius","StyledNavLink","NavLink","CustomPlaceholderContainer","CustomNamePlaceholder","PendingWrapper","bottomPosition","AvatarPlaceholder","customProfile","CustomPlaceholder","customPlaceholder","CustomWrapper","customWrapper","iconWidth","iconHeight","hidePending","noHint","Loading","picture","charAt","toUpperCase","mediaUrl","logoUrl","logo","imageUrl","to","Tooltip","trigger","preset","StyledConfirmDialogBlacker","motion","rgba","StyledConfirmDialog","minHeight","StyledTitle","marginBottom","StyledDescription","StyledActions","center","ButtonWrapper","DialogWrapper","modalTitle","dialogType","confirmButtonText","cancelButtonText","onConfirm","onCancel","customization","onClickAway","isConfirmDisabled","container","querySelector","titleMarginBottom","descriptionMarginBottom","shouldCenterButton","createPortal","initial","scale","animate","LibraryItemsStatus","libraryItemsStatusNames","DRAFT","ARCHIVED","IN_PROGRESS","libraryItemsStatusName","LIBRARY_STATUS","LIBRARY_STATUS_NAMES","LIBRARY_STATUS_ITEMS","createSearchLibraryParams","PractisSetActions","usePractisSetActionsHelper","canAssignLabels","ASSIGN_PRACTIS_SET_LABEL","canDuplicate","COPY_PRACTIS_SET","canArchive","ARCHIVE_PRACTIS_SET","canRestore","RESTORE_PRACTIS_SET","canDelete","DELETE_PRACTIS_SET","canEdit","UPDATE_PRACTIS_SET","canAssignUsers","ASSIGN_ENROLLMENT","ASSIGN_LABELS","DUPLICATE","ARCHIVE","RESTORE","DELETE","createPractisSetActionsHelper","ScenarioActions","useScenarioActionsHelper","scenario","ScenarioStatuses","ASSIGN_SCENARIO_LABEL","COPY_SCENARIO","ARCHIVE_SCENARIO","RESTORE_SCENARIO","DELETE_SCENARIO","UPDATE_SCENARIO","canGenerateChallenge","GENERATE_CHALLENGE","canDownloadPdf","createScenarioActionsHelper","ChallengeActions","useChallengeActionsHelper","challenge","ChallengeStatuses","ASSIGN_CHALLENGE_LABEL","COPY_CHALLENGE","ARCHIVE_CHALLENGE","RESTORE_CHALLENGE","DELETE_CHALLENGE","UPDATE_CHALLENGE","createChallengeActionsHelper","PermissionsStateSelectorContext","usePermissionsState","EnrollmentStatus","EnrollmentStatusEnum","TrainingContentType","searchDraftUsersStart","SEARCH_DRAFT_USERS_START","searchDraftUsersSuccess","SEARCH_DRAFT_USERS_SUCCESS","searchDraftUsersFailure","SEARCH_DRAFT_USERS_FAILURE","modifyDraftUsersAction","MODIFY_DRAFT_USERS","modifyDraftUsersWithoutValidationAction","MODIFY_DRAFT_USERS_WITHOUT_VALIDATION","resetDraftsPageAction","RESET_DRAFTS_PAGE","updateDraftUsersStart","UPDATE_DRAFT_USERS_START","updateDraftUsersSuccess","UPDATE_DRAFT_USERS_SUCCESS","UPDATE_DRAFT_USERS_FAILURE","StyledLogoContainer","StyledLogo","PractisAdminPlatformLogo","PractisLogo","AuthLogoView","BackgroundWrapper","BackgroundImage","img","PageContainer","LogoContainer","desktopMinWidth","heightToShowScroll","PageContent","contentWidth","Footer","FooterLink","FooterLinkSeparator","LoginAuthWrapperView","hideLogo","hideFooter","isMobile","useWindowDimensions","authBackground","srcSet","authBackground2x","authBackground3x","AuthLogo","target","useSearchDebounced","searchEntity","minChars","isRefreshed","searchTermLength","defaultField","isAscByDefault","useSearchPractisSetsService","searchPractisSetsApi","searchPractisSetsParams","useGetFullPractisSetsService","useUpdateAssignedLibraryPractisSetService","useSetSearchTermForLibraryPractisSetService","useDeletePractisSetsService","deletePractisSetsApi","plural","useArchivePractisSetService","updatePractisSetStatusApi","useRestorePractisSetService","useSearchScenariosService","searchScenariosApi","searchScenariosParams","useDeleteScenariosService","deleteScenariosApi","useArchiveScenarioService","updateScenarioStatusApi","useRestoreScenarioService","useSearchChallengesService","searchChallengesApi","searchChallengesParams","useDeleteChallengesService","deleteChallengesApi","useArchiveChallengeService","updateChallengeStatusApi","useRestoreChallengeService","useGenerateChallengeSuccessCallback","responses","createChallengeResponse","useUpdateAllScenarioCheckedStateService","useUpdateLibraryScenarioCheckedStateService","useUpdateAllChallengeCheckedStateService","useUpdateLibraryChallengeCheckedStateService","useUpdateLibraryPractisSetsCheckedStateService","useDownloadScenarioReportService","downloadScenarioReportApi","fileDownload","useDeleteLibraryLabelTag","deleteLabelsFromPractisSet","deleteLabelsFromScenario","deleteLabelsFromChallenge","getEntityItemLabels","entityData","deleteLabelFromLibraryActionList","entityName","entityItem","entityRemovedLabels","currentLabel","deleteLabelFromLibraryAction","useWithPractisSetsContext","DEFAULT_PRACTIS_SETS_SCOPE","WithPractisSetsScopes","useFetchAllPractisSetsService","searchPractisSets","count","useClearPractisSets","useSavePractisSets","useSelectMultiplePractisSets","selectMultiplePractisSetsAction","useSelectAllPractisSets","allPractisSets","useDeselectAllPractisSets","useResetSelectedPractisSets","useResetPractisSets","onTriggerEvent","eventName","event","CustomEvent","createEvent","initCustomEvent","dispatchEvent","onListenEvent","handler","addEventListener","attachEvent","onRemoveEvent","removeEventListener","detachEvent","StyledActionBox","OutsideActionBox","toggleOpen","styles","handleClickOutside","contains","element","offsetTop","scrollY","innerHeight","checkIfInView","scrollIntoView","setAuthToken","userInfo","isPractisAdmin","isUser","set","redirectAfterLogin","urlBuilder","redirectTo","buildAdminUrl","absolute","t","isSharedLink","pathname","remove","validEmailTLDs","validEmailRegex","validateEmail","domain","endsWith","isValidDomain","split","INVALID_EMAIL_ERROR","RULES","fullName","Yup","max","companyNameRequired","required","accountOwnerName","username","loginPassword","confirmPassword","oneOf","currentPassword","authEmail","timezoneId","organization","iconFile","instructions","list","localList","roots","parentsCount","countParents","LibraryPractisSetsStateSelectorContext","useLibraryPractisSetState","selectSelectedPractisSets","selectedPractisSets","UpdatedLibraryPractisSetsSelectorContext","createSelectorContext","useUpdatedLibraryPractisSetsState","LibraryScenariosStateSelectorContext","useLibraryScenariosState","selectSelectedScenarios","selectedScenarios","UpdatedLibraryScenariosSelectorContext","useUpdatedLibraryScenariosState","LibraryChallengesStateSelectorContext","useLibraryChallengesState","selectSelectedChallenges","selectedChallenges","UpdatedLibraryChallengesStateSelectorContext","useUpdatedLibraryChallengesState","DownArrow","UpArrow","UserFields","InviteRoleItems","INVITE_USER","filterInvitationRolesByPermissions","rolesList","invitationRoles","getUserRoleNameById","getUserRoleIdByName","InvitationEmailErrors","UserFieldNames","handleToggleSelectedItems","array","arrayItems","handleToggleSelectedItemsForPractisSets","currentSelectedPractisSets","practisSetIdToToggle","filteredPractisSetsToReturn","StyledSelectForm","LabelsContainer","displayOver","left","topMargin","Actions","CancelButtonWrapper","StyledContent","marginTop","StyledButtonContainer","Bold","NudgeUserStyledDescription","NudgeWarningStyledDescription","StyledFormArea","StyledInput","StyledInputContainer","TableAssignOptionsStyledSelectForm","IconHolder","fetchCompanyInfo","fetchCompanyInfoSuccess","fetchCompanyInfoFailure","loadVoiceSettingsStart","loadVoiceSettingsSuccess","loadVoiceSettingsFailure","fetchCompanyAdminsStart","fetchCompanyAdminsSuccess","fetchCompanyAdminsFailure","clearCompanyAdmins","fetchCompanyUserStatsStart","fetchCompanyUserStatsSuccess","fetchCompanyUserStatsFailure","Pencil","clipRule","StyledPractisSetsList","TopSideList","GeneralList","PractisSetsItemWrapper","PractisSetsItem","PencilWrapper","DueDateContainer","StyledEmpty","PortablePractisSetsList","setPractisSetFilters","hideDueDates","isDueDateCalendarVisible","setIsDueDateCalendarVisible","dueDateData","setDueDateData","dueDates","setDueDates","practisSetWithDueDatesArrayToDueDatesKeyValues","getUserDueDate","openDueDatePopup","updateDueDate","changedDueDates","prevState","isChecked","selectedPractisSet","setId","isPartiallyChecked","changeHandler","topListPractisSets","ps","bottomListPractisSets","EmptyCellDash","DueDateCalendar","isSubTitleVisible","onApply","StyledEmptyLabels","NoLabelsIcon","NoPractisSetsTitle","EmptyPractisSets","EmptyBox","StyledCreatePractisSets","CreatePractisSetsBody","DueDatesSelectedCaption","PortablePractisSets","selectAllWrapperClassName","processedPractisSets","filterPractisSets","toggleAllHandler","selectedPractisSetsLength","PortablePractisSetsWithStore","usePractisSetsState","usePortablePractisSetsState","team","convertObjectToArrayOfValues","entries","calculatePercentage","totalItems","currentIndex","toFixed","handleCreateChunks","options","fieldName","itemPerChunk","totalSelectedItems","lodashGet","chunk","offsetListArray","setPercentage","percentage","SET_PERCENTAGE","useChunkRequestsService","actionList","onError","shouldStopOnError","isStopped","setIsStopped","isStoppedRef","hasErrorRef","responsesRef","isIterationFinished","handleStartAction","handleExecuteActions","handleStopAction","resolve","handleCallAsyncChunks","chunkedActionList","isFromChildAction","chunkedActionListLength","actionName","actionFunction","actionFunctionOptions","childActionList","actionFunctionParameters","apply","childChunkedActionList","handleCreateChunkedActionList","childActionFunctionOptions","childActionParameters","parameters","childActionFieldName","childActionSecondaryFieldName","secondaryFieldName","childActionFieldNameValue","currentAction","ITEM_PER_CHUNK_SIZE","clonedActionFunctionOptions","cloneDeep","chunkedArrayOfSelectedItems","newChunkedAction","chunkedItem","lodashUpdate","flatten","Root","InputWrapper","SearchIcon","Search","TableSearchInput","placeholder","initialValue","debounceDelay","dataTestOrDefault","setValue","onChangeDebounced","debounce","SEARCH_INPUT_DEBOUNCE_DELAY","persist","clearInput","getWindowDimensions","innerWidth","windowDimensions","setWindowDimensions","handleResize","StyledFormikField","StyledErrorContainer","HintContainer","FormikField","errorContent","form","labelProps","autoComplete","labelLeftPosition","inputPadding","fontFamily","errorPadding","errorColor","hasManualError","hideError","autoFocus","customError","getIn","errors","touch","touched","focus","ProgressActions","useProgressActionsHelper","canNudgeUser","SEND_NUDGE","canChangeDueDate","SET_DUE_DATE","canRemindToStart","canExportReport","EXPORT_LIST_PRACTIS_SET_USER","canUnassignUser","UNASSIGN_ENROLLMENT","canViewPractisSetReport","VIEW_ENROLLMENT","canViewProfile","VIEW_PROFILE","trainees","NUDGE_USER","REMIND_TO_START","EXPORT_REPORT","UNASSIGN_USER","SET_DUEDATE","createProgressActionsHelper","ENROLLED","createSearchTeamMembersParams","overdueFilter","userStatus","filterByRegistrationStatus","enrollmentStatus","isOverdue","createSearchPractisSetDetailsParams","statusValues","userStatusFilters","filterByDueDate","dueDateFiltersValues","createSearchTeamsParams","leaders","teamLeadIds","StyledNoResults","StyledNoResultsContent","NoResultsTitle","NoResultsIcon","EmptyState","iconStyle","NoSearchResults","NoFiltersIcon","NoFilterResultsView","NoFilterResults","noFilterText","EmptyCalendar","clip-path","fill-rule","clip-rule","NoCalendarResultsView","NoCalendarResults","noResultsText","Td","td","clickable","TableCell","colSpan","shouldShowEmptyCell","data-test-custom-name","Th","th","isMultiple","Content","Text","MultiViewText","EmptyIcon","KeyboardArrowUp","IconContainer","QuestionIconWrapper","TitleContainer","titleWidth","TableHeaderCellMultiView","withTooltip","tooltipText","isHtmlTooltip","cursor","QuestionTooltip","isHtmlContent","TableHeaderCellSingleView","renderArrow","TableHeaderCellController","ListNameWrapper","minWidth","ListItemName","StyledAdditionalInfo","StyledIsNew","TableTitleOverflowText","isCurrent","isNew","renderIcon","appendIfEmpty","EmptyCellSpan","EMPTY_CELL","SET_SEARCH_STATE","deleteSearchState","DELETE_SEARCH_STATE","setSecondarySearchState","SET_SECONDARY_SEARCH_STATE","deleteSecondarySearchState","DELETE_SECONDARY_SEARCH_STATE","DueDateFilters","PHONE_ALREADY_EXISTS","PRACTIS_SET_ALREADY_EXISTED_ERROR_MESSAGE","ArrowRight","strokeLinejoin","itemIds","fetchUserProfile","fetchUserProfileSuccess","fetchUserProfileFailure","updateUserProfile","updateUserProfileFailure","resetProfileInfo","practisWebMode","storageKeys","PRACTIS_WEB","String","getOS","platform","navigator","Mac","Win","Linux","isProductionEnvironment","process","Close","solid","thin","buildConfig","assign","COMMIT_ID","BUILD_ID","_config","registerConfig","config","draftEdit","performance","teamEdit","teamMembers","practisSetsTraining","filteredItems","useCalculatePreSelectedPractisSets","countSelectedItems","outputArray","filteredEntities","useFindPractisSetDueDate","selectedItemsPractisSets","selectedItemsArray","lodash","filteredSelectedItemsArray","firstPractisSet","isAllPractisSetHaveEqualDueDates","useCalculateDeletedPractisSets","initialPractisSets","deletedPractisSets","useCalculateDeletedEnrollments","enrollmentsData","xor","pset","calculateCreatedUpdatedEnrollmentIds","addedPractisSets","existingItem","practisSetsWithDueDates","Tr","tr","TableRow","innerRef","getBrowserName","agent","userAgent","opr","chrome","isFirefox","isChrome","isOpera","isEdge","isSafari","getDeviceInfo","browserInfo","Firefox","Opera","IE","Edge","Chrome","Safari","browserName","regex","browserVersion","match","getBrowserInfo","phoneModel","phoneModelNumber","getNetworkConnectionType","connection","mozConnection","webkitConnection","effectiveType","NudgeUser","onSend","fromUser","practisSetName","mobile","messageData","setMessageData","handleMessageDataChange","labelFontWeight","minRows","placeholderFontWeight","textAreaMinHeight","counterColor","_practisSets","isObject","scrollable","ScrollPagination","itemsPerPage","itemCount","scrollableRef","scrollableWindow","onLimitChange","onOffsetChange","onLocalLimitChange","hideLoading","context","ScrollPaginationContext","rootRef","parentRef","getScrollParent","handleLoadMore","pageStart","loadMore","hasMore","loader","useWindow","threshold","DEV_ENV_URLS","babylon","rome","develop","statusesMap","useTestInvitationService","testInvitationApi","failureCallback","updateValues","useUserLogout","userLogoutAction","useAuthType","authTypeApi","useLogin","loginApi","useLoginByPhoneCode","loginByPhoneCodeApi","useResetProfileService","QuestionMark","cx","cy","fillOpacity","TooltipHeaderWrapper","FlexWrapper","position","Tag","TagDisabled","LabelTagsContainer","StyledLabelTag","isLabelLess","LabelIconWrapper","LabelText","TableLabelTags","assignedLabelNames","setAssignedLabelNames","names","TreeDfsNameMapper","getNames","LocalStorageContext","useLocalStorage","getPageUrl","route","acc","param","replaceUrlQueryParam","paramName","paramValue","nUrl","origin","getDevApiUrl","apiPlatform","accuracyTestRegex","challengeRegex","pluralText","withZero","marginRight","TableToolItem","SIZES","MIN_WIDTH","TableViewMode","useGetProfileService","getUserApi","getUserPermissionsApi","getUserSettingsApi","requests","userProfile","useUpdateProfileService","updateUserInfo","updateUserPhoneNumber","redirectToPhoneVerification","useRedirectToPhoneVerification","shouldShowMessage","updateUserInfoActionList","verificationStep","MobileNumberVerificationStep","VERIFY","useUploadPhotoService","uploadMedia","useUploadMediaService","setUserPhotoApi","file","defaultFileName","fileName","contentType","cd","exec","blob","msSaveOrOpenBlob","elem","download","removeChild","exc","handleDownloadVideoFile","responseType","revokeObjectURL","TableContainer","TableExtendContainer","Label","SelectLabel","MenuItem","destructive","SelectMenuItem","hideAction","forwardedRef","multiSelect","menuPosition","ContentArea","SelectMenu","exit","StyledSelect","StyledSelectValue","SelectInput","toggleSelect","SelectDropdown","labelColor","restrictShowAllName","openMenuWidth","selectedRef","selectedName","findNameByValue","UPDATE_LOADING_STATUS","tree","rootId","answer","existsInArray","existing","buildFlatArrayParents","combined","wholeArray","parent","flatArray","FilteredByWrapper","ScrollIconContainer","ArrowLeft","ScrollWrapper","StyledFilteredByContainer","StyledFilteredByItem","IconHolderForClose","TableHeaderFilterView","onLabelRemove","showLeftArrow","showRightArrow","wrapperRef","handleScroll","filteredByNames","scrollLeft","onScroll","TableHeaderFilterController","onRemoveLabel","saveUserFilters","savingLabels","setSavingLabels","setFilteredByNames","setShowLeftArrow","setShowRightArrow","setShowNavArrows","isLeftArrowVisible","isRightArrowVisible","scrollWidth","SAVE_SEARCH_FILTER","Trash","strokeWidth","getUserFeatures","cancelIfCanSkip","phoneSkip","allow","encapsulateTerm","EmptyStateContainer","StledTextareaContainer","StyledTextarea","Textarea","StyledCounter","counterPosition","TextAreaPlaceholderBox","onFocus","onBlur","maxRows","counterWarningText","flex","lineHeight","letterSpacing","portablePractisSets","top","ButtonIcon","LabelButton","windowBlue","ButtonText","StyledSpan","TableRefreshButton","onPress","TableRefreshIcon","TableRefresh","lastRefreshed","refreshData","buttons","scaleX","Header","Subtitle","RemoveDateTitle","StyledCalendar","Calendar","StyledDialogBlacker","StyledDialog","CancelButton","actionsDisabled","setActionsDisabled","currentDueDate","setCurrentDueDate","currentType","setCurrentType","activeStartDate","setActiveStartDate","isRemoveDateTitleDisabled","isPrevArrowDisabled","currentTarget","dueDateTitleTypes","userTimezoneOffset","getTimezoneOffset","getTime","getExactDate","calendarType","locale","formatShortWeekday","_","getDay","prev2Label","next2Label","nextLabel","prevLabel","showNeighboringMonth","onActiveStartDateChange","minDate","TrashBin","SelectedWrapper","SelectAllWrapper","ClearWrapper","SelectAll","selectedLength","onClearSelecion","isSelectAll","hasAllMembers","USER_LOGOUT","SET_TOKEN","setTokenAction","textArea","successful","outline","boxShadow","execCommand","err","isMac","prompt","CheckboxContainer","TableCheckbox","handleCheck","ADD_MESSAGE","REMOVE_MESSAGE","MULTIPLE","NO_DUEDATE","treeData","visited","visitedSubTreeVertexes","mp","currentAnswer","subTreeChecker","itemId","findIndex","childId","checkSubTreeSelection","treeChildren","pathId","toReverseAnswer","el","localAnswer","j","dfs","curObj","curObjParId","ans","AssignedLabelList","onDeleteLabel","hideDeleteButton","deletePermissions","kebabCase","TextareaAutosize","defaultValue","onMouseUp","onKeyDown","margin","useStyles","makeStyles","portablePractisSetContainer","selectAllWrapper","paddingRight","HeaderTitle","ButtonContainer","PractisSetsContainer","AssignPractisSetsView","isOpen","isSaving","isApplyButtonDisabled","handleApplyPractisSets","classes","Provider","AssignPractisSetsMultipleUsersView","ClickAwayListener","ENROLL_UNENROLL_ACTION","UPDATE_ENROLLMENT_ACTION","useFetchUserEnrollmentsService","getEnrollments","getEnrollmentSearchParams","usersEnrollmentsData","userEnrollmentResult","isAlreadyExist","isDueDateUpdated","useHandleEnrollmentService","userEnrollments","useHandleUpdateEnrollmentService","useEnrollUnenrollAllUsersBulkActionService","enrollUnenrollParams","totalUsersCount","onSuccessCallback","onErrorCallback","hideModalDialog","totalCompletedEnrollments","isRunning","setIsRunning","searchUsersWithTeamApi","handleFetchUserEnrollmentsService","handleEnrollmentService","handleUpdateEnrollmentService","handleSearchUserWithTeamService","handleSearchRegisteredUsersService","registeredUsers","totalUsers","searchUsersActionFunction","searchUsersActionParameters","searchRegisteredUsersParams","useGenerateAllUsersEnrollmentActionList","generateEnrollmentActionList","clearTotalCompletedEnrollments","handleSuccessServiceCallback","handleFailedBulkActionServiceCallback","handleStopEnrollUnenrollsBulkActionService","handleStartEnrollUnenrollBulkActionService","onStopBulkActionService","useEnrollUnrollMultipleUsersBulkActionService","selectedUserIds","useGenerateMultipleUsersEnrollmentActionList","generateMultipleUsersActionList","AssignPractisSetsController","isFromBulkAction","searchQuery","successApplyPractisSetsCallback","performanceState","selectedPractisSetsState","setPractisSets","getDeletedEnrollmentIds","setInitialPractisSets","setIsSaving","setIsApplyButtonDisabled","isMultipleUsersSelected","handleEnrollUnenrollAllUsersBulkActionService","handleEnrollUnenrollMultipleUsersBulkActionService","enrollUnEnrollPromiseChainArray","practisSetWithDueDate","practisSetsToSet","en","ext","country","AC","AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TA","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW","ZZ","DropDownComponent","ScrollableArea","StyledDropDownList","ListItem","ListCountryFlag","Flag","ListCountryNameContainer","ListCountryName","ListCountryCode","CountrySelectorWrapper","FlagContainer","CountryCode","ArrowsContainer","ArrowIcon","StyledDownArrow","StyledUpArrow","countries","getCountries","unshift","CountrySelector","selectedCountry","setSelectedCountry","getCountryCallingCode","useTopPadding","TrashIconContainer","InputPhone","disabledLabelColor","onDeleteNumber","showDeleteNumberBtn","handleCountryChange","countryCallingCodeEditable","defaultCountry","initialValueFormat","countrySelectComponent","TBody","tbody","TableBody","LABELS_CONFIGS","useGenerateLabelsConfiguration","sidePanel","savedLabelsState","LABELS_STATE","SIDE_PANEL","EXPANDED_LABELS","useGetSavedLabelPanelState","useGetSavedLabelExpandedState","DATE_TIME_FORMAT","TooltipLabel","TooltipContent","portalElement","propStyle","presetsConfig","dropdown","contentRef","getPortalElement","usePopup","cloneElement","WithLabelsContext","WithPractisSetsContext","Themes","lightTwo","filled","decreaseLabelFontSize","ShowPassword","ClearInput","PasswordEye","shouldShowPassword","HideIcon","ShowIcon","EmailPencilWrapper","onKeyPress","labelTopPosition","containerWidth","clearTopPosition","labelFontSize","containerStyle","showPassword","setShowPassword","clearShown","selectedColorTheme","inputType","htmlFor","PencilIcon","messageReducer","ContentContainerId","triggerElement","portal","contentContainer","getElementById","closest","StyledUserArea","UserProfilePictureSection","MinimizedUserProfileArea","Star","CustomCalendar","selectRange","restrictPast","restrictFuture","_value","outArray","start","end","getLibraryValue","transformLibraryToComponentValue","maxDate","allowPartialRange","StyledCalendarContainer","StyledCalendarSection","StyledActionsSection","Control","hasValue","DashSeparator","StyledValue","CalendarPopup","renderActions","beforeApply","bodyDOM","clearOnApply","setClearOnApply","tempValue","setTempValue","interactive","skipRestriction","getApiProps","applyContent","clearContent","resetComponentValue","clearState","defaultApplyContent","defaultClearContent","hasNoValue","startCaption","endCaption","renderControl","createMediaApi","verifyMediaApi","media","Axios","verificationResult","positionsConfig","overflowVertical","overflowHorizontal","defaultOffset","containerElement","targetConfig","autoBind","containerElementPositionChange","getBoundingClientRect","bounds","containerRects","triggerRects","right","bottom","currentTriggerRef","setPosition","savedHandler","clickHandler","useOutsideClick","useLayoutEffect","contentRects","getPositionStyles","zIndex","pointerEvents","getAdditionalStyles","TableAssignOptionTypes","ScrollContainer","addOverflow","TableInner","table","TableCont","InfiniteTableBodyContainer","StyledTable","TableCheckboxHeaderCell","StyledCellWrapper","TableHeader","headerConfiguration","masterCheckBoxConfig","columns","column","subColumns","multiHeaderContainerClassName","subColumn","TableCheckboxCell","DefaultTeamIconHolderWrapper","DefaultTeamIconHolder","StyledFirstTableContent","Avatar","AvatarTile","hasMargin","AvatarField","row","renderTitle","getAvatarProps","MinimizedAvatarField","AvatarFieldController","isMinimized","STATUS_COLORS","TableStatusCell","BadgeField","getBadgeFieldProps","fieldTypes","LabelTags","getLabelTagsProps","ListActionsField","getListActionsComponent","OverFlowTextField","getTextFieldProps","TextField","TextFieldController","isOverFlowText","DynamicTableField","fieldType","fieldProps","currentRowData","getCustomFieldComponent","component","TableAssignedLabelTags","TableBodyWrapper","rowConfig","cells","onRowClick","isRowChecked","onRowCheckHandler","isLabelTagsOpen","getClassName","getDataTest","shouldShowAllMembers","dataTestValue","cell","cellClassName","TableEmptyTd","EmptyStateTableWrapper","EmptyStateWrapper","tableStates","noEntriesOptions","noSearchResultsOptions","noFilterResultsOptions","noCalendarResultsOptions","showNoEntriesState","showNoSearchResultsState","showNoFilterResultsState","showNoCalendarResultsState","TableSimpleView","tableContainerClassName","tableInnerClassName","tableEmptyStateConfigurations","configuration","shouldShowEmptyState","TableInfiniteScrollView","scrollPaginationProps","scrollRef","TableController","viewMode","SIMPLE","PagerCount","qs","Paging","onPageChange","searchOrFiltersApplied","noUrlChange","pageFromUrl","page","pageNumber","setPageNumber","initialized","setInitialized","maxValue","ceil","pathString","handlePageChange","direction","TableToolsLeft","TableToolsRight","ItemCount","AssignLabelOptions","onAssignLabelsSubmit","containerLeftPosition","setShowOptions","applyDisabled","setApplyDisabled","onCloseHandler","onApplyHandler","collapseAssignLabels","TableAssignOptionsSelectDropdown","showUpArrow","disabledLabel","hideHint","render","SelectContainer","ScrollablePractisSetsContainer","PractisSetItemWrapper","PractisSetItem","SearchInputContainer","SearchInput","ScrollBar","ScrollBarTop","ScrollBarBottom","ScrollBarIcon","AssignPractisSetOptions","setAssignPractisSetsAction","setSearchTermForLibraryPractisSetService","onAssignPractisSetsSubmit","previouslyCheckedPractisSets","allowWithoutPreviousData","showScrollUp","setShowScrollUp","showScrollDown","setShowScrollDown","handleScrollUp","handleScrollDown","condition","scrollTop","scrollHeight","offsetHeight","onAssignPractisSets","updatedAssignedPractisSets","handleAssignPractisSets","isPreviouslyChecked","AssignPractisSetOptionsContainer","titlePadding","iconRightPosition","textAlignedLeft","searchPractisSetsDebounced","fullList","NudgeWarning","onProceed","BulkActionConfirmation","itemsCount","AssignPractisSetsAndDueDateOptions","isAssignPractisSetPopupOpen","setIsAssignPractisSetPopupOpen","getUserPractisSets","getUserPractisSetsSuccessCallback","OptionContainer","TableAssignOptionsMenu","updatedLabels","onNudgeSendButtonClicked","assignLabelsTitle","nudgeFromUser","onOpenAssignLabelAction","disabledPractisSets","onExportClicked","exportButtonDisabled","showNudgeWarning","nudgeButtonDisabled","onArchiveSubmissionsSubmit","onResendInvitesSubmit","onRevokeSubmit","onRestoreSubmissionsSubmit","onDuplicateSubmit","assignLabelsPermissions","sendNudgePermissions","showExportPermissions","assignPractisSetsAndDueDatePermissions","assignPractisSetPermissions","archivePermissions","onUpdateDueDatesSubmit","isDueDatesDisabled","dueDatesPermissions","resendInvitesPermissions","revokePermissions","removePractisSetPermission","onRemovePractisSetSubmit","onRemindSubmit","showRemindPermission","nudgeTitle","remindDisabled","removeItemsDisabled","restorePermissions","removeItemTitle","duplicateItemTitle","duplicateItemPermissions","removeItemPermissions","onRemoveItemsSubmit","removeItemTooltip","isAssignLabelsDisabled","isArchiveDisabled","isRestoreDisabled","isRevokeDisabled","isResendDisabled","isDuplicateDisabled","showNudgeDialog","setShowNudgeDialog","showNudgeWarningDialog","setShowNudgeWarningDialog","showOptions","showOptionType","setShowOptionType","nudgeCloseButtonClicked","onNudgeSendClicked","TableAssignOptionMenu","DUE_DATES","ASSIGN_PRACTIS_SETS_AND_DUE_DATE","ASSIGN_PRACTIS_SETS","NUDGE","REMIND","EXPORT","RESEND_INVITES","REVOKE","REMOVE_PRACTIS_SET","REMOVE_ITEMS","performSwitch","setPayload","setAction","TableAssignOptionsMenuContainer","renderAdditionalAction","assignLabelsMinWidth","hideSelectAll","assignedLabelsCount","assignLabelButtonTitle","practisState","labelsConfigState","TableTools","isSelectedItemOptionsVisible","selectedItemOptions","searchInputOptions","filterOptions","calendarFilterOptions","pagingOptions","itemCountDataTest","rootClassName","wrapperClassName","tableToolsLeftClassName","tableToolsRightClassName","onSearchChange","isSearchInputDisabled","filterComponent","calendarPopUpProps","onClearSelection","bulkActionsConfig","TableWrapperView","tableWrapperClassName","tableToolsOptions","cornered","shouldHideTableDivider","tableRefreshConfigurations","headerFilterPosition","configurations","ErrorMessages","imageUploaderStyles","checkboxContainer","alignItems","gap","userSelect","checkBoxAnchorTag","textDecoration","UserInfoContainer","UserTitle","UserEmail","FormContainer","FieldsContainer","StyledField","Field","RegisterSchema","shape","Validation","isSubmitButtonDisabled","formValues","RegistrationView","formRef","setProfileImage","handleSubmit","isTermsAccepted","handleToggleTerms","LoginAuthWrapper","ImageUploader","placeHolder","initialValues","enableReinitialize","onSubmit","validationSchema","isSubmitting","rel","RegistrationController","setUserInfo","profileImage","setIsTermsAccepted","handleTestInvitation","handleResetProfile","handleFileUpload","register","authType","handleSubmitError","NO_REGISTER_PERMISSION","INVITATION_NOT_FOUND","WRONG_EMAIL_FORMAT","handleUploadProfilePicture","formikActions","setSubmitting","registerValues","isNewUser","prev","handleRedirectToInvalidInvitationPage","invitationToken","Camera","StyledImageContainer","encodeURI","rectStyled","BadgeContainer","TrashContainer","LoadingContainer","ImageUploaderView","initialImage","fileInputRef","editedImage","handleImageChange","handleInputClick","isInProgress","onFileDelete","imageSrc","display","accept","uuid","getEditedImageFileInfo","imageEditorRef","dataUrl","getImage","toDataURL","fetch","File","ImageUploaderController","maxImageSize","checkImage","files","useCheckImage","isImageEditorVisible","setIsImageEditorVisible","selectedImage","setSelectedImage","setEditedImage","handleApplyImage","editedImageFileInfo","handleCloseImageEditor","ImageEditor","editorRef","handleApplyEditedImage","RegisterView","RegisterController","setFieldError","errorMessage","failureTestInvitationCallback","Person","PractisSet","TeamLeaders","stroke-width","stroke-miterlimit","SubheaderView","practisSetsCount","usersCount","teamLeadersCount","Skeleton","TeamLeader","CustomSlider","withStyles","root","rail","track","thumb","Slider","SliderContainer","SliderLabelContainer","ImageEditorView","onScaleChange","image","aria-label","step","marks","ImageEditorController","setScale","BackArrow","Description","FieldContainer","ForgotPasswordSchema","EnterEmailAddressView","isSending","onClearError","onBack","BackArrowImage","setFieldValue","EnterEmailAddressController","forgotPassword","setIsSending","setErrorMessage","handleSend","getErrorByCode","handleBack","FurtherInstructionsView","CheckEmailImage","FurtherInstructionsController","ForgotPasswordController","URLSearchParams","FurtherInstructions","EnterEmailAddress","UrlBuilderContext","useUrlBuilder","StyledActionsDivs","flexDirection","justifyContent","StyledActionsLinks","StyledLinkText","LinkText","StyledInputDivs","StyledLoginContent","LoginSchema","Login","setDisabled","Consumer","performLogin","LogoutPage","loginUrl","onUserLogout","LogoutPageContainer","userLogout","StyledForm","FormControl","ApiPlatformDropdownView","onPlatformChange","ApiPlatformDropdownController","ApiPlatformDropdown","reload","ForgotPasswordLink","StyledSeparatorWrapper","StyledSeparator","StyledSeparatorText","InternalLoginSchema","InternalLogin","login","forgotPasswordAction","mobileNumberLoginAction","phoneNumberVerified","ResetPasswordSchema","GeneralError","FooterText","ResetPasswordView","ResetPasswordController","queryParams","resetPasswordApi","setIsSubmitting","StyledCard","Item","strong","Value","tryParseBuildId","buildId","APP_VERSION","RedirectToUrl","PrivateRoute","Component","customPath","propsData","PhotoLoadingContainer","AddUser","StyledUploadContainer","StyledUploadImage","StyledImage","UploadPhoto","upload","currentImage","PlaceholderIcon","showCustomDescription","ProfilePageContainer","StyledContentHeader","UserInfoForm","StyledUploadPhoto","StyledDeleteButton","UploadPictureLink","StyledUploadLink","NoticeWrapper","Notice","Separator","ProfileInfo","editable","uploadUserPicture","deleteUser","isPhotoUploading","isSSOAuth","isSSOEnabled","handleUpload","showConfirmationModalDialog","handelDelete","sendValues","profilePhoneNumber","valuesUpdated","valuesMissing","ProfileInfoContainer","InputItem","validationSchemaDefault","validationSchemaWithCurrentPassword","Security","updateUserPassword","selfProfile","isSelf","showCurrentPasswordError","setShowCurrentPasswordError","currentPasswordError","validate","decapsulateAction","saved","withLabelsInitialState","baseInitialState","scopes","withLabelsReducer","baseReducer","nativeAction","newState","newCollapseLabels","collapsedLabelIDs","newSelectedList","DEFAULT_TEAMS_SCOPE","WithTeamsScopes","withTeamsInitialState","_teams","withTeamsReducer","updatedSelectedState","allTeams","withPractisSetsInitialState","withPractisSetsReducer","selectedUsers","loadingCreatedBy","loadingEditedBy","allUsersReducer","selectedUserIndex","splice","getAllUsersLoading","initialUpdateUserState","userInitialState","getUserState","getUserLoading","initialInvitationsState","invitationsReducer","selectedInvitationIds","selectedInvitationIndex","initialUpdateInvitationState","initialUserPerformanceState","userPerformanceReducer","practisSetsLoading","portablePractisSetsLoading","selectedIds","selectedIdIndex","initialUpdatedUserPractisiSetsState","initialDraftsState","draftedUsers","selectedDrafts","initialUpdatedDraftsState","initialUserFeaturesState","getUserFeaturesState","userFeatures","initialUserPreferencesState","pendingValues","getUserPreferencesState","userPreferences","getUserPreferencesPendingValues","getUserPreferencesLoading","NOTIFICATION_SETTING_TITLE","Info","ToggleContainer","StyledSwitchContainer","StyledSwitchCheckboxContainer","bulletRadius","StyledLabelText","SwitchToggle","NotificationWithToggleView","NotificationWithToggle","notificationKey","LoadingContent","NotificationsView","onToggle","NotificationsController","WEB_SITE_ID","Notifications","getPreferences","updatePreference","preference","pendingValue","handleToggle","newValue","WebSiteIdContext","StyledPractisIcon","Logo","RightArrow","PractisSupportWrapper","shrink","StyledSidebar","SidebarBody","SidebarLabels","ClosedLabels","OpenLabels","OpenLabelsContent","OpenLabelsFooter","StyledLabelsIcon","LabelIcon","StyledRightArrow","OpenLabelsButton","SidebarContent","SidebarMenu","SidebarProfile","ItemLoading","ItemLoadingIcon","ItemLoadingText","Link","StyledDot","isShrink","SideBarItem","ActiveIcon","activeIcon","alternateUrl","defaultItem","hasNewItems","isActive","isMatch","handleIsActive","activeClassName","Dots","menuListClassName","customWidth","customLeft","popper","borderWidth","borderStyle","ActionMenuHandler","hasCustomComponent","ActionButton","active","hideArrow","isHidden","menuItemsClassName","placement","isDisabled","menuListAnchorRef","customRandomId","isMenuListOpen","setIsMenuListOpen","arrowRef","setArrowRef","scrollableContainer","aria-controls","aria-expanded","aria-haspopup","prevOpen","Popper","modifiers","TransitionProps","Grow","MenuList","autoFocusItem","aria-labelledby","classNames","ActionContext","ActionItem","AddLabelActions","CancelLabelButton","SaveLabelButton","EditLabelActions","confirmDisabled","useFocus","htmlElRef","currentEl","LabelInput","AddNewLabelInput","setName","StyledWarning","StyledWarningLine","StyledWarningText","LabelInputWarning","keyPressed","ev","enterPressed","escPressed","DotsIconContainer","EditLabelActionsContainer","NoPermissionPlaceHolder","AddLabelSection","LabelListActions","handleOpen","labelsScrollableContainer","LabelListItem","searchResults","deleteLabel","editingLabels","setEditingLabel","createLabel","updateLabel","expandLabelById","labelName","setLabelName","newLabelName","setNewLabelName","editMode","isLabelListActionDisabled","setFocus","checkForNotUniqueLabelName","childLabelNotUnique","addNewLabelDisabled","editLabelNotUnique","editLabelDisabled","updateLabelName","createSubLabel","handleDeleteLabel","UPDATE_LABEL","CREATE_LABEL","DELETE_LABEL","LabelListItemContainer","selectLabelFilter","LabelsList","LabelsListContainer","AddLabels","saveLabel","setEditing","labelUnique","setLabelUnique","addLabelDisabled","filteredLabels","handleCreateLabel","NoLabelsDescription","usePreviousData","useIfChanged","dontCheckEmpty","previousValue","TeamsStateSelectorContext","useTeamsState","TeamUpdateStatus","UpdateTeamsStateStateSelectorContext","useUpdateTeamsState","TeamEditSelectorContext","useTeamEditState","UpdateMembersStateStateSelectorContext","TeamMembersStateSelectorContext","useTeamMembersState","TrainerStateSelectorContext","useTrainerPractisSetState","UpdatedProgressStateSelectorContext","EnrollmentStateSelectorContext","TrainerInvitationStateSelectorContext","useTrainerInvitationState","selector","PractisSetReportStateSelectorContext","usePractisSetReportState","CreateLabelsHeader","placeholderColor","FiltersSelectedPanel","SelectedLabelsStyle","ClearSelectedLabels","FilterActionsMenu","StyledAddLabels","LabelsActionMenu","LabelsScrollableContainer","CreateLabels","clearLabels","setAssignedLabels","expandAll","collapseAll","expandLabel","localSearchTerm","setLocalSearchTerm","setLabelsSearchTermDebounced","handleSearchTermChange","useDebounce","ifSearchParamsChanged","parentLabelPaths","flattened","concat","uniqueIds","ifAllLabelsChanged","isSearchDisabled","CreateLabelsContainer","searchLabelsDebounced","setLabels","loadingUsers","loadingInvitations","loadingScenarios","loadingChallenges","loadingPractisSets","loadingMyTeams","loadingTeamMembers","loadingPractisSetTraining","labelsShouldBeDisabledOnLoading","collapseLabels","labelsModified","selectedModified","useGetCompanyService","getCompanyApi","useLoadVoiceSettingsService","getCompanyVoiceSettingsApi","useGetCompanyUserStatsService","getCompanyUserStatsApi","callback","DropDownList","renderItem","StyledDropDownItem","StyledA","withComponent","iconSize","DropDownListItem","custom","externalUrl","replaceUrl","modalUrl","IconComponent","UserInfo","UserRole","UserName","UserRoleLoading","UserNameLoading","UserProfileArea","UserRolesStateSelectorContext","useUserRolesState","useLoadUserRolesService","loadUserRolesApi","LOAD_USER_ROLES_START","LOAD_USER_ROLES_SUCCESS","loadUserRolesSuccess","LOAD_USER_ROLES_FAILURE","loadUserRolesFailure","StyledProfileContainer","StyledMenu","ProfileSection","getProfile","getCompany","sideBarOpen","isItAdminPortal","defaultProfileItems","UPDATE_COMPANY_INFO","ProfileSectionContext","ProfileSectionContainer","profileLoading","userRoles","loadUserRoles","sendEmail","subject","isItSafari","userOS","emailLink","Support","ADMIN_ACTIONS","PractisSetSupport","handleSendEmail","deviceInfo","networkConnectionType","generateEmailBody","SidebarScrimmageAI","stroke-linecap","stroke-linejoin","SideBarExternalLinkItem","drawerPaper","overflowX","overflowY","whiteSpace","transition","transitions","create","easing","sharp","duration","enteringScreen","drawerPaperClose","leavingScreen","spacing","breakpoints","up","logoContainer","Sidebar","menuItems","openLabelsPanel","closeLabelsPanel","expandMultipleLabels","generateLabelsConfiguration","getLabelsPanelState","getLabelsExpandedState","expandedLabels","Drawer","paper","isScrimmageEnabled","prevProps","nextProps","Plus","Folder","NewUser","Document","Mountains","Team","StyledActionsContainer","StyledActionsButton","StyledPlus","defaultItems","FolderIcon","CREATE_PRACTIS_SET","DocumentIcon","CREATE_SCENARIO","MountainsIcon","CREATE_CHALLENGE","NewUserIcon","CREATE_STAGING","TeamIcon","CREATE_TEAM","ActionsDropdown","ActionsDropdownContext","HeaderContainer","hasBorder","headerPadding","SubHeaderContainer","hasBackButton","NavigationPanel","useReducedHeight","Toolbar","SecondaryNavigation","LeftPanel","TitleSection","MainTitle","SubTitle","RightPanel","CompanySectionWrapper","TitleIcon","SEARCH_ALL_COMPANIES_START","SEARCH_ALL_COMPANIES_SUCCESS","SEARCH_ALL_COMPANIES_FAILURE","FETCH_ACTIVE_COMPANIES_START","FETCH_ACTIVE_COMPANIES_SUCCESS","FETCH_ACTIVE_COMPANIES_FAILURE","adminChangeCompanyAction","CHANGE_COMPANY","changeCompanyOfPractisAdmin","openInNewTab","getState","tc","webSiteId","isCompanyPortal","COMPANY_PORTAL","buildCompanyUrl","ADMIN_PORTAL","useFetchActiveCompaniesService","searchCompaniesApi","fetchActiveCompaniesSuccess","fetchActiveCompaniesFailure","BoldDownArrow","BoldUpArrow","DownIcon","UpIcon","DropdownButton","DropdownButtonLabel","practis","CompaniesDropdownItem","handleClick","subTitle","practisCompanyItem","PractisIcon","PractisDropdownItem","StyledListCard","CompaniesDropdown","onChangeCompany","CompaniesDropdownContainer","updatedCompany","fetchActiveCompanies","activeCompanies","isActiveCompaniesLoading","prevUpdatedCompany","NamePlaceholder","CompaniesDropdownButton","newOpen","handleChangeCompany","StyledCompanySection","StyledCompanyLogo","LogoButton","NoLogoButton","Platform","changeCompany","clearUserFilters","successChangeCompanyCallback","BroadcastChannel","postMessage","log","postBroadCastChannelMessage","listenBroadCastChannelCallback","openCompanySettings","onmessage","listenBroadCastChannelMessage","ACCESS_ANY_COMPANY","VIEW_COMPANY","HeaderContext","companySectionComponent","CompanySection","tabs","subHeader","goBackUrl","useGoBack","hasTabs","goBack","WrapperContainer","main","contentPadding","StyledTest","isScrollable","StyledContainer","SidebarLibrary","SidebarLibraryActive","SidebarTeams","SidebarTeamsActive","SidebarFeed","SidebarFeedActive","SidebarUsers","SidebarUsersActive","SidebarAssessment","SidebarAssessmentActive","SidebarReports","SidebarRoleplays","SidebarRoleplaysActive","initialDefaultSideBarMenuItems","LIST_SUBMISSION","LIST_PRACTIS_SET","MANAGE_RECORDINGS","SidebarReportsActive","VIEW_USER_PRACTIS_SET_REPORT","LIST_SCENARIO","LIST_CHALLENGE","LIST_USER","LIST_INVITATION","MainWrapper","contentSize","headerMinHeight","hideHeader","sideBarMenuItems","headerHasBorder","refreshComponent","htmlPageTitle","mainRef","spContext","CssBaseline","MainWrapperContainer","maxWidth","obj","constructor","StyledUserProfile","StyledProfileDescription","ViewProfile","StyledAvatar","StyledProfileInfoWrapper","StyledProfileInfo","StyledProfileNavigation","NavigationItem","NavLinkText","NavLinkIcon","StyledProfileContent","StyledLoadingContent","Address","UserProfile","profileRoute","securityRoute","notificationsRoute","canUpdatePassword","SET_USER_PASSWORD","notificationsAllowed","prevCompanyRef","prevCompany","handleViewProfile","VIEW_USER_PERFORMANCE","handleUpdateUserPassword","pickBy","exact","UserProfileContainer","meProfile","userLoading","updateProfileService","fetchUser","uploadPhoto","setIsPhotoUploading","targetUser","fetchUserSettingData","handleUpdateUserSuccess","handleUpdateUserProfileInfo","handleUpdateUserProfilePicture","StyledFooterContainer","StyledTermsRow","StyledTermsItems","StyledLandingHeader","StyledActionPanel","LandingHeader","withAction","StyledLandingContainer","StyledLandingContent","withRouter","scrollTo","NotFoundContainer","StyledNotFoundImageContainer","StyledNotFoundImage","StyledNotFoundHeader","h1","StyledActionContainer","NotFoundPage","NotFoundImage","CardWidth","DESKTOP","LAPTOP","TABLET","MOBILE","CardHeight","CARDS","LandingCard1","LandingCard2","LandingCard3","getIsDocumentHidden","browserHidden","hidden","msHidden","webkitHidden","INVITATION_LABEL_ACTIONS","usePageVisibility","isVisible","setIsVisible","onVisibilityChange","visibilityChange","StyledCardContent","StyledNextCard","currentCardAnimation","opacity","nextCardAnimations","enter","CardContent","LandingCard","card","counterHeight","counterWidth","counterMargin","next","setCard","counter","setCounter","intervalId","browserTabVisible","goNext","clearInterval","cardWidth","windowWidth","useDynamicCardWidth","cardHeight","useDynamicCardHeight","exitBeforeEnter","variants","stiffness","damping","NextButton","StyledArrowIcon","LeftContentContainer","AuthBackground","Copyright","RightContentContainer","Body","WebLandingPage","StyledHeader","StyledHeaderContent","MobileLandingPage","TabletLandingPage","LandingPageContainer","LandingPage","useGetPlatform","updateSingleTeamStart","UPDATE_SINGLE_TEAM_START","updateSingleTeamSuccess","UPDATE_SINGLE_TEAM_SUCCESS","updateSingleTeamFailure","UPDATE_SINGLE_TEAM_FAILURE","fetchAllTeamsStart","FETCH_ALL_TEAMS","fetchAllTeamsSuccess","FETCH_ALL_TEAMS_SUCCESS","fetchAllTeamsFailure","FETCH_ALL_TEAMS_FAILURE","updateTeamActionSuccess","UPDATE_TEAM_SUCCESS","useGetTeamInfoService","getSingleTeam","GET_TEAM_INFO_START","GET_TEAM_INFO_SUCCESS","getTeamInfoSuccess","GET_TEAM_INFO_FAILURE","getTeamInfoFailure","useResetTeamInfoService","RESET_TEAM_INFO","useGetTeamInfoTrainingService","GET_TEAM_INFO_TRAINING_START","GET_TEAM_INFO_TRAINING_SUCCESS","getTeamInfoTrainingSuccess","GET_TEAM_INFO_TRAINING_FAILURE","getTeamInfoTrainingFailure","useGetSingleTeamService","SEARCH_SINGLE_TEAM_START","SEARCH_SINGLE_TEAM_SUCCESS","searchSingleTeamSuccess","SEARCH_SINGLE_TEAM_FAILURE","searchSingleTeamFailure","useSearchTeamsAllUsersService","searchTeamsAllUsers","searchAllUsersParams","excludeTeamId","SEARCH_SINGLE_TEAM_ALL_USERS_START","SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS","searchSingleTeamAllUsersSuccess","SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE","searchSingleTeamAllUsersFailure","useSearchSingleTeamMembersService","searchTeamMembersApi","SEARCH_SINGLE_TEAM_MEMBERS_START","SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS","searchSingleTeamMembersSuccess","SEARCH_SINGLE_TEAM_MEMBERS_FAILURE","searchSingleTeamMembersFailure","useTogglePromoteTeamLeader","updateTeamLeaderApi","UPDATE_TEAM_LEAD","updateTeamLead","useResetSingleTeamPageService","RESET_SINGLE_TEAM_PAGE","useCreateNewTeamService","createNewTeamApi","CREATE_SINGLE_TEAM_SUCCESS","useUpdateTeamNameService","updateTeamNameApi","MODIFY_TEAM_NAME","useSearchTeamsService","storeSearchParams","searchTeamsApi","useDeleteMemberLabelService","UPDATE_MEMBER_SUCCESS","useDeleteSingleTeamAllUsersLabelService","deleteMemberLabelService","REMOVE_SINGLE_TEAM_ALL_USERS_LABEL","removeSingleTeamAllUsersLabel","useDeleteSingleTeamMemberLabelService","REMOVE_SINGLE_TEAM_MEMBER_LABEL","removeSingleTeamMemberLabel","useUpdateAllSelectedTeamsStateService","UPDATE_ALL_SELECTED_TEAMS_STATE","updateAllSelectedTeamsState","useUpdateSelectedTeamStateService","UPDATE_SELECTED_TEAM_STATE","updateSelectedTeamState","useDeleteTeamsService","deleteTeamsApi","UPDATE_TEAM_START","UPDATE_TEAM_FAILURE","updateTeamActionFailure","useSearchTrainingPractisSets","searchTrainingPractisSets","SEARCH_TRAINER_PRACTIS_SETS_START","SEARCH_TRAINER_PRACTIS_SETS_SUCCESS","SEARCH_TRAINER_PRACTIS_SETS_FAILURE","searchTrainerFailure","useClearTrainerPractisSet","CLEAR_TRAINER_PRACTIS_SETS_SUCCESS","useSearchPractisSetDetailsUsersService","searchPractisSetDetailsUsers","SEARCH_TRAINER_PRACTIS_USERS_START","SEARCH_TRAINER_PRACTIS_USERS_SUCCESS","SEARCH_TRAINER_PRACTIS_USERS_FAILURE","searchPractisUsersFailure","getAssignUsersSearchParams","excludePSets","useSearchAssignUsersService","searchAssignUsers","SEARCH_TRAINER_INVITATION_USERS_START","SEARCH_TRAINER_INVITATION_USERS_SUCCESS","searchInvitationUsersSuccess","SEARCH_TRAINER_INVITATION_USERS_FAILURE","searchInvitationUsersFailure","useGetPractisSetService","getPractisSet","GET_PRACTIS_SET_START","GET_PRACTIS_SET_SUCCESS","GET_PRACTIS_SET_FAILURE","getPractisSetFailure","useResetPractisSetDetailsService","RESET_PRACTIS_SET_DETAILS","useEnrollPractisSetsToUsersService","createInvitationApi","useRemindToStartService","remindToStart","SEND_TRAINEE_INVITATION_START","inviteType","SEND_TRAINEE_INVITATION_SUCCESS","sendTraineeInvitationSuccess","SEND_TRAINEE_INVITATION_FAILURE","sendTraineeInvitationFailure","usePractisSetReportService","getEnrollmentApi","getEnrollmentProgressApi","getEnrollmentDailyTrainingApi","GET_PRACTIS_SET_REPORT_START","enrollment","progress","dailyTraining","GET_PRACTIS_SET_REPORT_SUCCESS","getPractisSetReportSuccess","GET_PRACTIS_SET_REPORT_FAILURE","getPractisSetReportFailure","useResetPractisSetReportService","RESET_PRACTIS_SET_REPORT","useCheckAllProgressService","progressIds","progressId","CHECK_ALL_PROGRESS","checkAllProgress","useCheckSingleProgressService","CHECK_SINGLE_PROGRESS","useDeleteTeamPractisSetLabelService","deletePractisSetLabelsApi","UPDATE_PROGRESS_SUCCESS","useUpdateAllSelectedInvitationTraineesStateService","UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE","updateAllSelectedInvitationTraineesState","useUpdateSelectedInvitationTraineesStateService","UPDATE_SELECTED_INVITATION_TRAINEES_STATE","updateSelectedInvitationTraineesState","useNudgeUsersService","nudgeUsersApi","useSaveSelectedInvitationLabelsService","SAVE_SELECTED_INVITATION_LABELS","useUpdateAllSelectedPractisSetsStateService","setIds","updateAllSelectedPractisSetsState","useUpdateSelectedPractisSetStateService","updateSelectedPractisSetState","useSearchTeamMembersService","teamMembersApi","SEARCH_TEAM_MEMBERS_START","SEARCH_TEAM_MEMBERS_SUCCESS","searchTeamMembersSuccessAction","SEARCH_TEAM_MEMBERS_FAILURE","searchTeamMembersFailureAction","useSearchTeamsLeadersService","searchTeamLeadersApi","SEARCH_TEAM_LEADERS_START","SEARCH_TEAM_LEADERS_SUCCESS","searchTeamLeadersSuccessAction","SEARCH_TEAM_LEADERS_FAILURE","searchTeamLeadersFailureAction","useSelectTeamLeaderService","leaderId","SELECT_TEAM_LEADER","selectTeamLeaderAction","useSelectMultipleTeamLeadersService","leaderIds","SELECT_MULTIPLE_TEAM_LEADERS","useResetTeamLeadersSelection","RESET_TEAM_LEADERS_SELECTION","useDeselectAllTeamLeadersSelection","DESELECT_ALL_TEAM_LEADERS_SELECTION","useSaveTeamLeaderSelection","SAVE_TEAM_LEADERS_SELECTION","useHandleAccessPage","TeamMemberStatusEnum","StyledNavigationItemContainer","disablehovereffect","widthPercent","StyledNavigationItemRouteContainer","HintWrapper","storageKey","firstTime","createRef","navigationItemStyles","activeNavigationItemStyles","disableHoverEffect","hintFirstTime","notReviewedCount","StyledNavigationContainer","Navigation","menu","setActive","StyledTutorialContent","TrainingTutorial","teamName","TeamsPageNavigation","useParams","TeamsLearnersNavigation","NoTrainings","NoTrainingsFiltering","FiltersIcon","StyledAssignAction","FiltersDotContainer","FiltersDot","TeamMembersFilterHandler","filtersCount","hasFilters","countAppliedFiltersCount","total","OverdueFlag","StatusContainer","StatusItem","SummaryCaption","OverdueFlagWrapped","TrainingFilters","preSelectedLabels","onLabelsChange","onStatusChange","onSuccessApply","onOverdueChange","overdue","setStatuses","saveLabels","selectLabels","hasOverdue","setHasOverdue","ifPreselectedLabelsChanged","onStatusChangeHandler","statusIn","totalFiltersSelected","deselectLabels","ListActions","handleRedirection","onExportSinglePractisClicked","handleViewAssignUsers","VIEW_PRACTIS_SET_PROGRESS","EXPORT_LIST_PRACTIS_SET","getSearchState","searchState","getSecondarySearchState","secondarySearchState","InvitationHeader","QuickAssignmentInvitationFooter","InvitationHeaderWrapper","QuickAssignmentInvitationHeaderText","InvitationHeaderSubText","CancelWrapper","StyledProgressContainer","ProgressBarContainer","DueDateWrapper","DueDateIcon","WrapperTableCell","StyledTraineeInvitationContainer","InvitationFooter","InvitationHeaderText","StyledInvitationTitle","StyledTableCell","StyledFirstTableItemContent","customTableCellStyle","multiHeaderContainer","teamMemberHeaderContainer","scrollWrapperStyle","tableWrapperStyle","tableBodyContainerStyleForInvitation","maxHeight","tableBodyContainerStyleForAssignment","customCellStyle","labelsCellStyle","TeamMemberStatusCell","StyledTraineeDetailsContainer","StyledLoading","StyledDetailsHeader","DetailsStatus","DetailsStatusPending","DetailsStatusInProgress","DetailsStatusCompleted","StyledDetailsAvatar","StyledUserInfo","StyledName","isFlex","StyledEmail","GraphSection","GraphRow","StyledPendingTitle","StyledPendingInvitationLabel","WarningTitle","DueDateSubTitle","StyledOverdueFlag","DueDateSkeletonContainer","useOrderBy","useTableStateHelper","appliedFilters","startDate","endDate","filtersAreAlwaysEnabled","tableState","disableFilters","disableSearch","disableSorting","noItems","noSearchTerm","noFilters","noCalendarFilters","normalizeSP","newParams","ITEMS_PER_PAGE","PractisSetProgress","updatedProgress","deleteTeamPractisSetLabel","updateSelectedPractisSet","updateAllSelectedPractisSets","getPractisSetReports","saveGlobalLabelFilters","canAccessPage","setLastRefreshed","setIsSelectAll","labelsOpen","setLabelsOpen","usableParams","ifCompanyChanged","pageIndex","initialOffset","isCheckboxPartiallySelected","hcName","hcOverdue","hcPending","hcInProgress","hcCompleted","hcLastTrainingAt","handleTableStates","updateAllPractisSetsCheck","filteredPractisSets","practisSetsToClear","labelChangeHandler","filterStatusHandler","filterOverdueHandler","isListEmpty","isFilteredByOverdue","isMasterCheckBoxChecked","isMasterCheckBoxDisabled","onDeleteLabelHandler","handleAssignedLabelDelete","countPractisSets","countMembers","lodashIsEmpty","FilterByHandler","handlePractisSetCheck","REMOVE_PRACTIS_SET_LABEL","isTeamMembers","pendingEnrollmentCount","inProgressEnrollmentCount","completedEnrollmentCount","lastTraining","PractisSetProgressContainer","teamData","getPractisSetsReportApi","psets","useGetPractisSetsReportService","getTeamInfo","User","secondsToMinSimple","tt","round","secondsToMinFormatted","time","sec","sec_min","secondsToMin","countPractisSetDetailsAppliedFiltersCount","overduesMap","ASSIGNED","OVERDUE","regStatusesMap","TrainingDetailsFilters","registrationStatus","onRegistrationStatusChange","overdues","setOverdues","registrationStatuses","setRegistrationStatuses","onOverdueChangeHandler","dueDateIn","onRegistrationStatusChangeHandler","Tray","newProgressBar","completed","completedColor","full","ValueLabel","isSmallerScreen","ProgressBar","isCompleted","isFull","StripedProgressBarView","InfoWrapper","calculatePercent","CompletedAtWrapper","GreenDot","GeneralProgressCol","completedAt","PlusInCircleIcon","ViewPractisSetIcon","ExportReportIcon","UPDATE_LABEL_ACTION","UPDATE_MULTIPLE_LABEL_ACTION","generateCopyOfEntityName","newDataTimeFormatPrefix","splittedTeamName","newTeamName","pop","useHandleSearchUsersAndNudge","searchCommonUsersAndNudge","nudgeUsers","senderData","nudgeUsersData","receiverId","useSearchCommonUsersAndNudge","searchUsersWithEnrollmentAndNudge","searchPractisSetDetailsParams","useSearchUsersWithEnrollmentAndNudge","searchOverdueLearnersAndNudge","searchOverdueLearnersApi","useSearchOverdueLearnersAndNudge","searchUsersFunctionParams","useUpdateLabelsBulkActionService","addLabelActionFunction","deleteLabelActionFunction","onStartCallback","entityRef","entityId","assignedLabelIdsRef","deletedLabelIdsRef","assignedLabelIds","deletedLabelIds","shouldShowModals","assignLabelsToEntityOptions","deleteLabelsFromEntityOptions","handleStopBulkActionService","handleStartBulkActionService","useUpdateMultipleEntityLabelsBulkActionService","fetchEntityAction","totalCompletedItems","deletedLabels","assignLabelsToEntityService","entityLabelIds","filteredAssignedLabelIds","processedAssignedLabelIds","deleteLabelsFromEntityService","filteredDeletedLabelIds","processedDeletedLabelIds","handleShowCompletedItemsMessage","numberOfCompletedItems","isSingleItem","assignLabelsToEntityServiceOptions","deleteLabelsFromEntityServiceOptions","useNudgeUsersBulkActionService","handleSearchUsersAndNudge","senderDataRef","totalCompletedNudgedUsers","clearTotalCompletedNudgedUsers","handleStopNudgeUsersBulkActionService","handleStartNudgeUsersBulkActionService","UPDATE_TEAM_ACTION","useUpdateTeamMembersBulkActionService","selectedItemIds","handleSuccessBulkActionServiceCallback","UPDATE_SINGLE_TEAM_STOP","useAssignMembersToTeamService","assignMembersToTeam","assignMembersToTeams","useAssignMembersToTeam","searchAndAssignMembersToTeam","searchAllUsers","useSearchAndAssignMembersToTeam","useDeleteMembersFromTeamService","searchAndDeleteMembersFromTeam","searchTeamsMembersApi","deleteMembersFromTeams","useSearchAndDeleteMembersFromTeam","deleteMembersFromTeam","useDeleteMembersFromTeam","useDeleteSelectedTeams","deleteTeams","useSearchAndDeleteTeams","deleteSelectedTeams","isDefault","useRemindToStartBulkActionService","handleSearchEnrollmentsAndRemind","useHandleSearchEnrollmentsAndRemind","totalCompletedRemindToStartItems","numberOfDoneItems","clearTotalCompletedRemindedUsers","handleStopRemindUsersBulkActionService","handleStartRemindUsersBulkActionService","useCreateEnrollmentBulkActionService","createEnrollmentsParams","searchUsersAndCreateEnrollment","enrollPractisSetsToUser","selectedEnrollments","useSearchUsersAndCreateEnrollment","handleStopCreateEnrollmentsBulkActionService","handleStartCreateEnrollmentBulkActionService","useDeleteEnrollmentBulkActionService","deleteEnrollmentsParams","totalEnrollmentsCount","searchEnrollmentsAndDelete","searchUserEnrollmentsApi","deleteEnrollments","useSearchEnrollmentsAndDelete","searchPsetEnrollmentsAndDelete","useSearchPsetEnrollmentsAndDelete","entityExpression","handleStopDeleteEnrollmentsBulkActionService","handleStartDeleteEnrollmentBulkActionService","useUpdateEnrollmentBulkActionService","updateEnrollmentsParams","searchEnrollmentsAndUpdate","useSearchEnrollmentsAndUpdate","dueDateRef","handleStopUpdateEnrollmentsBulkActionService","handleStartUpdateEnrollmentBulkActionService","RenderStarted","onResendInvitation","startedAt","ProgressDetails","practisSetsEnrollments","updateTrainees","onGetPractisSet","checkSingleProgress","selectedProgressIds","selectedProgresses","actionsHelper","onNudgeUsers","onUnenrollEnrollment","getTraineesReportService","locationState","dueDateCalendarParams","setDueDateCalendarParams","showNudgeDialogProgressId","setShowNudgeDialogProgressId","handleViewPractisSetReport","updateAllProgressCheck","practisSetsEnrollment","onNudgeSingleUserSuccessCallback","handleNudgeSingleUser","onNudgeMultipleUserSuccessCallback","nudgeUsersBulkActionService","handleNudgeMultipleUser","nudgeUsersDate","handleSingleRemind","remindToStartBulkActionService","handleBulkRemind","enFirstName","enAssigned","enStarted","enDueDate","enTime","enLastTrainingAt","enProgressValue","enAccuracyAvg","onExportReportButtonClick","registrationStatusHandler","headersDisabled","bulkActions","isExportButtonDisabled","dueDateDataManual","updateSuccessCallback","handleUpdateEnrollmentsBulkActionService","updateDueDateSuccessMessage","filteredPractisSetsEnrollments","enrollmentsToClear","handleDeleteEnrollmentsBulkActionService","handleUnassign","unAssignedPractisSetIds","selectedEntityIds","handleProgressCheck","averageAccuracy","floor","trainingTime","createdAt","lastTrainingAt","ProgressDetailsContainer","practisSetsState","searchPractisSetDetailsUsersDebounced","resendInvitation","resetPractisSetDetails","unenrollEnrollment","useUnenrollEnrollmentService","getEnrollmentsReportApi","useGetTraineesReportService","selectSelectedProgresses","update","Progress","Fragment","useAssignFiltersToStagingUsersService","assignFiltersToStagingUsersApi","SOCKET_PROGRESS_SHOW","HiddenRadioButton","StyledRadioButton","RadioButton","StyledLabelWrapper","SelectTitle","SelectLabelWrapper","RolesContainer","StyledRolesList","ScrollableRoleContainer","RoleItemWrapper","ROLE_PLACEHOLDER","AssignRoles","assignedRole","handleRoleCheck","assignedRoleName","updateCheckedRole","withBorder","AssignLabels","setLabelIds","onLabelChangeHandler","SelectHead","SelectedUserLabels","onSelectLabels","resetLabels","labelsDisabled","selectedUserLabelsCount","AssignPractisSets","savePractisSets","setPractisSetIds","onPractissetHandler","SelectButtonWrapper","SelectedUserPractisSetsComponent","onSelectPractisSets","selectMultiplePractisSets","resetPractisSets","practisSetsDisabled","WithTeamsContext","useWithTeamsContext","searchTeams","useSaveTeams","useSelectMultipleTeams","selectMultipleTeamsAction","useDeselectAllTeams","useResetTeams","StyledTeamsList","TeamsItemWrapper","TeamsItem","PortableTeamsList","selectedTeams","showDefaultMembers","setTeamFilters","topListTeams","bottomListTeams","processedTopListTeams","EmptyTeams","StyledCreateTeams","CreateTeamsBody","PortableTeams","setAllSelected","defaultTeam","processedTeams","sortBy","selectedTeamsLength","usePortableTeamsState","portableTeams","PortableTeamsWithStore","fetchOnMount","useClearTeams","useSelectAllTeams","useResetSelectedTeams","PortableTeamsWithStore2","onChangeSelectedTeams","handleSelectAll","handleDeselectAll","TeamsContainer","AssignTeams","saveTeams","selectMultipleTeams","initialTeams","setTeamIds","onTeamChangeHandler","SelectedUserTeamsComponent","onSelectTeams","resetTeams","teamsDisabled","StyledUserListItem","StyledRow","hasBlueBorder","hasNormalBorder","hasGreyBorder","hasError","AddIconArea","StyledAddUserIconContainer","StyledAddUserIconHolder","BorderSeparator","StyledPlusIconContainer","PlusIconHolder","ErrorLabel","AddNewUser","handleInputChange","onAssignRoleCheck","setSelectedUserLabels","selectedUserLabels","setSelectedUserPractisSets","selectedUserPractisSets","selectedUserTeams","setSelectedUserTeams","isSubmitDisabled","errorMessages","startedToFillInitialUser","hideNewUserTipDisplayed","creatingUser","isRoleDisabled","clearPractisSets","clearTeams","ASSIGN_INVITATION_ROLE","ASSIGN_INVITATION_PRACTIS_SET","SelectedUserTeams","SelectedUserPractisSets","AddNewUserContainer","useCalculatePreSelectedUserRoles","PortableRoles","selectedRoles","setSelectedRoles","calculatePreSelectedUserRoles","preSelectedUserRoles","FilterLabels","calculatePreSelectedLabels","getPreselectedLabels","setDefaultState","preselectedLabels","FilterPractisSets","calculatePreSelectedPractisSets","findPractisSetDueDate","preSelectedPractisSets","useCalculateDeletedTeams","assignedTeams","deletedTeams","FilterTeams","setInitialTeams","setTeams","calculatePreSelectedTeams","teamIDs","preSelectedTeams","AssignFilters","saving","setSaving","getDeletedLabels","getDeletedPractisSets","getDeletedTeams","updated","RemoveUser","CheckBoxWrapper","PortableRolesMultiselect","updatedRoles","handleSelectItem","ApplyFilters","applyFilters","selectedFiltersCount","FileDownload","Upload","excelExtensions","convertPresentVerbToPastVerb","string","isEmptyOrWhiteSpace","StyledLabelActionPanel","isActionPanelOpen","StyledLabelActionButtons","StyledIconWrapper","ActionDropdownsWrapper","StyledHeaderActionItems","StyledIconContainer","HeaderToolsItem","DeleteUsersIcon","UploadTemplateIcon","DownloadTemplateIcon","RemoveUsersIcon","SearchPanel","StyledUserCounterContainer","NewUserHeader","localUsers","existingUserIds","onUsersImported","onRemoveUsers","onRemoveExistingUsers","filterRoles","setFilterRoles","updateAllUsersCheck","userItemsList","updateSelectAll","handleDownloadTemplate","isUserTeamLeader","getRoleId","showFileFormatErrorMessage","handleParsedUsersData","parsedResults","isEntryInvalid","handleImportUsers","filename","fileExtension","parts","getFileExtension","isExcelFile","reader","FileReader","generatedResults","onload","bstr","wb","XLSX","read","bookVBA","SheetNames","sheetName","XL_row_object","utils","sheet_to_json","Sheets","json_object","sheetResults","readAsBinaryString","parseXlsFile","userItemsText","REMOVE_USER_FROM_STAGING","tooltipRef","EditAssignRoles","setModified","EditAssignPractisSets","EditAssignTeams","TeamsDisabled","EditAssignLabels","ThinClose","ThinCheck","ActionIcon","SectionItem","SectionError","EditUserItem","setUser","handleUpdateSelectedUser","resetSelectedLabels","hideActions","setHideActions","resetSelectedUser","isFirstNameInvalid","isLastNameInvalid","isEmailInvalid","EmailValidator","isEditFormInvalid","NewUserExclamation","Table","containerStyles","THead","thead","TableHead","EditPencil","StyledTableBody","TableNoResultBody","TableNoResult","TableHeaderFirstCell","TableHeaderCell","StyledTablePagination","TableBodyScrollContainer","FormatTableCellText","IconsContainer","StyledTableRow","hovered","IconsPlaceholder","StyledIconHint","ErrorStateCheckbox","ExclamationIconContainer","ExclamationIconHolder","StyledTableContainer","RenderTableCheckboxCell","handleUserCheck","emailExistsInSystem","UsersList","userList","onEditUser","onRemoveUser","isDraftSaved","selectedUser","setSelectedUser","usersToDisplay","setUsersToDisplay","updateDisplayUsers","displayUsers","firstEntry","secondEntry","getRoleName","hcUserFirstName","hcUserLastName","hcUserEmail","hcUserRole","hcPractisSets","hcTeams","hcLabels","hideSpacer","subTitleWidth","StyledErrorMessage","SaveAsDraftModal","newUsers","setTitle","setError","submitClicked","setSubmitClicked","createUserStagingService","createStagingApi","useCreateUserStagingService","DraftEditStateSelectorContext","useDraftEditState","NewUserPath","PathIconHolder","UserIconContainer","UserIconHolder","AddNewUserLabel","AddNewUserTip","useKeypress","onKeyup","Background","Modal","ModalPage","preventClick","closeModalPage","ModalPageContext","ModalPageContainer","closePath","closeGoingBack","restrictClosing","restrictClosingAction","handleManualClose","UserStatsContainer","StyledFooter","StyledFooterActions","StyledHeaderInput","AddNewUserWrapper","StyledSavedStatusContainer","CompanyVoiceSettingsStateSelectorContext","useCompanyVoiceSettingsState","CompanyAdminsStateSelectorContext","CompanyUserStatsStateSelectorContext","useCompanyUserStatsState","Cross","ModalBackground","ModalContainer","ModalHeader","ModalTitle","CrossContainer","ModalWithCrossView","titleStyle","titleContent","hideCross","QuickTip","UserLimitWarningModalView","quickTip","onManageInvitations","onRequestLimitChange","UserLimitWarningModal","handleManageInvitations","handleRequestLimitChange","NoFreeUsersModalView","userStats","ExceededFreeUsersModalView","Gear","GearButton","CompanyUserStatsTextView","showUnlimited","showSettingsButton","onSettingsClick","CompanyUserStatsText","userStatsState","getCompanyUserStats","handleSettingClick","navigateToInvitations","searchDraftUsers","modifyDraftUsers","modifyDraftUsersWithoutValidation","resetDraftsPage","addStagingUser","addMultipleStagingUsers","updateStagingUser","deleteStagingUser","inviteStagingUser","assignFiltersToStagingUsers","setGoBackTwice","existedEmailList","defaultTeamId","noFreeUsersModalOpen","setNoFreeUsersModalOpen","exceededFreeUsersModalOpen","setExceededFreeUsersModalOpen","loadingInvitation","setLoadingInvitation","saveDraftModalOpen","setSaveDraftModalOpen","setCreatingUser","usersSavedAt","setUsersSavedAt","draftSavedFirstTimeAt","setDraftSavedFirstTimeAt","userEmptyState","userRoleId","newUser","setNewUser","newUserRole","setNewUserRole","newUserPractisSets","setNewUserPractisSets","newUserTeams","setNewUserTeams","newUserLabels","setNewUserLabels","handleSetNewUserLabels","handleChangeNewUserRole","handleSetNewUserPractisSets","handleSetNewUserTeams","selectedUserRole","setSelectedUserRole","handleChangeSelectedUserRole","checkedUserIds","setCheckedUserIds","checkedUserRoles","setCheckedUserRoles","handleAssignFiltersToCheckedUsers","userIDs","deletedPractisSetIDs","manualRefreshSearchParams","filteredUsers","updatedUserLabels","updatedUserPractisSets","uniqBy","updatedUserTeams","localFilterParams","setLocalFilterParams","setFiltersCount","ifLocalFilterParamsChanged","ifUsersChanged","setLocalUsers","filteredUser","escapedSearchTerm","regSearchTerm","trimmedRegSearchTerm","handleApplyFiltersToCheckedUsers","ifDraftIdChanged","updatedUsers","userItemListIds","updatedCheckedUserIds","resetNewUserFields","resetEditingUserFields","useKeyPress","userItems","setExistingUserIds","existingUsers","handleSuccessAllUsersInvited","handleErrorUsersInvited","invitedUsers","alreadyInvitedUserItems","remainingUserItems","checkIfInviteUsersHaveErrors","inviteUsersBulkActionService","usersDataRef","inviteUsers","assignLabelsToUsers","assignPractisSetsToUsers","handleStopInviteUsersBulkActionService","handleStartActionModal","assignLabelsToUsersService","usersLabelIds","processedUsersLabels","assignPractisSetsToUsersService","usersPractisSets","processedUsersPractisSet","assignTeamsToUsersService","usersTeamIds","processedUsersTeams","inviteUsersService","handleStartInviteUsersBulkActionService","inviteUsersOptions","InviteUsersAction","teamsIds","usersData","useInviteUsersBulActionService","invitedUser","existedEmail","saveAsDraftConfirmed","saveAsDraftFailed","userSavedAtText","importedUsers","sendImportedUsers","currentUsers","trimmedFinalResults","deletedUsersLength","updatedList","roleIds","checkUser","finalResult","modifiedUser","updatedUserItems","userExists","modifySelectedUser","now","teamsCount","handleCreateNewUser","submitCount","modifyNewUser","isAllItemsSelected","checkedUsersIds","invitationResults","updatedErroredUsers","updatedFilteredUsers","duplicatedUsersCount","usersInvitedCount","invitingUsers","NewUserContainer","searchStagingUsersApi","useSearchStagingUsersService","useModifyDraftUsersService","useModifyDraftUsersWithoutValidationService","useResetDraftsPageService","addStagingUsersApi","useAddStagingUserService","useAddMultipleStagingUsersService","updateStagingUsersApi","useUpdateStagingUserService","deleteStagingUsersApi","useDeleteStagingUserService","inviteStagingUsersApi","useInviteStagingUserService","goBackTwice","go","updateScriptLineAction","UPDATE_SCRIPT_LINE","ScriptLineSpeaker","initialScenarioState","script","totalDuration","case","getScenarioState","imageColors","range","imageCount","n","c","useDuplicateRoleplayApi","roleplayId","useGetRoleplayApi","useGetRoleplayContentApi","useCreateCommandRoleplayApi","EditModeValues","useCreateScriptLineService","CREATE_SCRIPT_LINE","createScriptLineAction","useDeleteScriptLineService","lineId","DELETE_SCRIPT_LINE","useModifyScriptTextService","MODIFY_SCRIPT_TEXT","modifyScriptTextAction","useClearScriptLinesService","CLEAR_SCRIPT_LINES","useGetScenarioService","getScenarioApi","FETCH_SCENARIO_START","FETCH_SCENARIO_SUCCESS","fetchScenarioSuccess","FETCH_SCENARIO_FAILURE","fetchScenarioFailure","useUploadScenarioAudioService","fileUploadApi","associatedEntityId","UPLOAD_SCENARIO_AUDIO_START","formData","FormData","scriptLineId","UPLOAD_SCENARIO_AUDIO_SUCCESS","UPLOAD_SCENARIO_AUDIO_FAILURE","uploadScenarioAudioFailure","useModifyScenarioService","silent","MODIFY_SCENARIO","modifyScenarioAction","useResetScenarioService","RESET_SCENARIO","useStoreScenarioTempCopyService","STORE_SCENARIO_TEMP_COPY","useRestoreScenarioFromTempActionService","RESTORE_SCENARIO_FROM_TEMP","useSaveScenarioKeywordsService","keywords","UPDATE_SCRIPT_LINE_KEYWORDS","updateScriptLineKeywords","useGetRoleplayForScenario","getRoleplayContentByIdApi","contentId","useGetRoleplayContentByIdApi","getRoleplayApi","conversation","summary","aiLines","speaker","CUSTOMER","REP","StyledTextareaContainer","titleFontColor","titleFontWeight","ErrorContainer","TextAreaBox","focused","setFocused","TextAreaStyles","hideCounter","counterFontSize","StyledScenarioInfo","StyledScenarioInfoContent","ScenarioInfo","modifyScenario","edit","EditModeContext","VIEW","ScenarioInfoContainer","StyledEmptyScriptContainer","ScriptAction","handleAdd","ElevenLabsUrl","generateAudioWithElevenLabs","stability","voiceId","similarityBoost","ELEVEN_LABS_KEY","ok","statusText","getElevenLabsVoices","json","useTextToSpeechService","feature","VOICE_GENERATION_START","voice","VOICE_GENERATION_SUCCESS","voiceGenerationSuccess","VOICE_GENERATION_FAILURE","voiceGenerationFailure","useClearVoiceService","s","VOICE_GENERATION_CLEAR","VoiceGenerationSelectorContext","useVoiceGenerationState","R","appendItem","append","findItem","propEq","modifyArrayItem","idx","wField","lensPath","over","initialAudioState","playlist","recording","getAudioState","player","useCreatePlaylistService","CREATE_AUDIO_PLAYLIST","createPlaylistAction","usePlayAudioService","PLAY_AUDIO","playAudioAction","useStopAudioService","STOP_AUDIO","stopAudioAction","useResetAudioService","RESET_PLAYLIST","useStartAudioRecordingService","START_AUDIO_RECORDING","startAudioRecordingAction","useStopAudioRecordingService","STOP_AUDIO_RECORDING","useGoNextService","GO_NEXT","useGetSelectionCharacterOffsetWithin","sel","selectionRect","doc","ownerDocument","win","defaultView","parentWindow","getSelection","rangeCount","getRangeAt","preCaretRange","cloneRange","selectNodeContents","setEnd","startContainer","startOffset","endContainer","endOffset","selection","textRange","createRange","preCaretTextRange","createTextRange","moveToElementText","setEndPoint","KeywordIcon","StyledTooltip","textColor","Keyword","StyledContentEditable","ContentEditable","contentEditable","onInput","innerText","dangerouslySetInnerHTML","__html","KEYWORDS_CLASS","ContentEditableInput","selections","setCreateTooltip","setRemoveTooltip","setKeywordIdToRemove","textareaRef","localValue","setLocalValue","caretPosition","saveCaretPosition","setCaretPosition","currentNode","currentNodeLength","previousNodeLength","childNodes","textContent","setStart","collapse","removeAllRanges","addRange","getSelectionCharacterOffsetWithin","timeoutRef","selectionRef","selectedValues","handleKeywordClick","preventDefault","visible","dataset","getElementsByClassName","keyCode","str","StyledScriptItemTextarea","ScriptItemTextarea","handleValueChange","scriptLineKeywords","createToolTip","removeToolTip","setKeywords","saveKeyword","setSaveKeyword","removeKeyword","setRemoveKeyword","keywordIdToRemove","setSelections","clearSelection","empty","handleRemoveKeyword","handleToggleKeyword","newSelections","startIndex","endIndex","selectionConflict","conflict","setSaveToScenario","handleAddKeyword","saveScenarioKeyword","saveToScenario","valueLength","valueDiff","updatedSelections","handleModifyText","deleteKeyword","refs","CommentInner","CommentContext","CommentProvider","Comment","Blacker","CommentBody","CommentTools","CommentTitle","StyledRemoveIcon","CommentDescription","onDelete","hideRemoveIcon","Save","StyledScriptPlayingAudioAction","StyledPlayingAudioButton","StyledReactMicContainer","StyledReactMic","ReactMic","AudioRecorder","record","onStop","onData","strokeColor","mediaDevices","getUserMedia","audio","video","stream","getTracks","stop","PauseCircle","StopCircle","rx","StyledAudioPlayer","StyledActionButtons","AudioDuration","StyledAudioWrapper","StyledAudioLine","StyledLine","AudioPlayer","isPaused","_isMounted","customAudioUiPlayer","slider","currentTimeInterval","handlePlay","play","handlePause","pause","handleStop","currentTime","setState","handleRewind","getCurrentAudioClickDuration","clickFraction","clientX","getSliderLeftPosition","getSliderTotalWidth","componentDidMount","autoPlay","onplay","setInterval","onpause","onended","onchange","customAudioPlayer","PlayCircle","Generate","Record","Play","DEFAULT_CUSTOMER_VOICE_ID","DEFAULT_REP_VOICE_ID","getTextToSpeechSettingsOrDefault","customer","representative","StyledScriptItem","StyledScriptAction","StyledAudioSection","DisabledArea","ScriptItem","handleScriptLineDelete","handleScriptTextModify","handleUploadAudio","handlePlayAudio","handleStopAudio","handleGoNext","handleResetPlaylist","handleStartRecording","handleStopRecording","textToSpeech","clearAudio","generatingAudio","generating","loadingAudio","voiceData","setRecord","save","setSave","setAudio","isRepSpeaker","handleClickAway","myRef","handleRemoveItem","settingsOrDefault","audioUrl","behavior","block","ScriptItemContainer","resetPlaylist","playAudio","stopAudio","startRecording","stopRecording","deleteScriptLine","modifyScriptText","uploadScenarioAudio","Drag","StyledScriptLineContent","StyledDroppableContainer","StyledScriptHandle","StyledDraggableItem","ScriptLineContent","handleScriptLineUpdate","scriptLines","setScriptLines","ScenarioContainerContext","onDragEnd","destination","removed","Reorder","source","droppableId","provided","snapshot","isDraggingOver","draggableId","draggableProps","dragHandleProps","EDIT","ScriptLineContentContainer","updateScriptLine","useUpdateScriptLineService","Stop","Phone","useTextToSpeechBulkActionService","featureName","textToSpeechForScriptLine","line","lineSettings","useTextToSpeechForScriptLine","handleSuccess","handleFailed","handleStart","StyledScriptHeaderActions","ScriptHeaderActions","stopPlaylist","ScriptHeaderActionsContainer","PlayAudioContext","textToSpeechBulkAction","StyledScenarioScriptHeader","BuilderActions","BuilderConfigs","ConfigItem","BuilderDuration","ScenarioScriptHeader","customerLineCount","repLineCount","ScenarioScriptHeaderContainer","Customer","StyledScenarioScript","UserAvatarPanel","StyledCustomer","ImageContainer","StyledCustomerImage","ScriptsBody","PlaceholderWrapper","ScenarioScripts","createScriptLine","ScenarioScriptsContainer","CustomBodyContainerWrapper","CustomBodyContainer","CustomBody","StyledCheckboxContainer","StyledReminderTitle","StatusModalConfirmation","displayDontShow","dontShowHandle","danger","notShow","setNotShow","handleConfirm","buildPageTitle","StyledCustomWrapper","StyledCustomHeader","StyledHeaderActions","StyledHeaderActionItemsWrapper","PublishedDate","EDIT_MODAL_INFO","CANCEL_EDIT_MODAL_INFO","MODAL_INFO","buttonText","EDIT_VIEW_STATUS","CustomHeader","handleUpdateScenario","storeScenarioTemp","restoreScenarioFromTemp","isViewMode","handleRestoreArchivedScenario","updateScenarioStatus","useHandleRestoreArchivedScenario","publishModal","setPublishModal","editModal","setEditModal","cancelEditModal","setCancelEditModal","saveState","setSaveState","loadingSave","LoadingSaveContext","updatedAt","CustomHeaderContainer","isInput","SelectedPanel","LabelListItemNameContainer","LabelListItemLabel","StyledTitleContainer","LabelsActionItem","onToggleLabelsCollapse","LabelsActionItemContainer","NoAddedLabels","LabelsAction","showSelectedPanel","buttonTitle","isDropdownDisabled","DownloadPDF","TextInputContainer","DownloadContainer","DownloadIcon","TitleTextInput","ActionPanel","titleError","downloadScenario","disableDownload","useAssignLibraryEntityLabelsService","assignPractisSetLabels","assignScenarioLabels","assignChallengeLabels","assignLabelToLibraryActionList","assignLabelFromLibraryAction","useUpdateLibraryStatusService","updatePractisSetStatus","updateChallengeStatus","currentStatus","updateLibraryStatusActionList","createdPractisSetId","updateLibraryStatusAction","useGenerateCreateDuplicateScenarioActionList","createNewScenario","assignLibraryLabels","assignLinesToScenario","updateScenarioStatusService","handleUpdateScenarioStatus","updateScenarioStatusServiceOptions","handleAssignLabelsToScenario","handleAssignLinesToScenarioService","currentLines","createdScenarioId","createdScenarioLines","audioId","handleAssignLinesToScenario","assignLinesToScenarioOptions","newScenarioInfo","useGenerateCreateDuplicateChallengeActionList","createNewChallenge","assignLinesToChallenge","updateChallengeStatusService","handleUpdateChallengeStatus","updateChallengeStatusServiceOptions","handleAssignLabelsToChallenge","handleAssignLinesToChallengeService","createdChallengeId","createdChallengeLines","handleAssignLinesToChallenge","assignLinesToChallengeOptions","newChallengeInfo","useCreateEditDuplicateLibraryBulActionService","entityTitle","completedResponses","isAlreadyExistedErrorMessage","capitalize","handleStopDuplicateLibraryBulkActionService","duplicateLibraryActionList","PractisSetEntityTypes","StyledLoadingContainer","CreatedByWrapper","StatusItems","confirm","NewScenario","scenarioCase","handleCreateScriptLine","handleResetScenario","handleFetchScenario","handleCreatePlaylist","handleLoadVoiceSettings","createEditScenarioSuccessCallback","clearScriptLines","setLoadingSave","createScenarioResponse","editScenarioResponse","updateScenarioResponse","actionMessage","useCreateEditScenarioSuccessCallback","createEditScenarioFailedCallback","useCreateEditScenarioFailedCallback","handleArchiveScenario","useHandleArchiveScenario","getRoleplayForScenario","setEditMode","setTitleError","isLoaded","onUnload","returnValue","scriptId","setPreviouslyAssignedLabelsAction","generateCreateScenarioActionList","generateEditScenarioActionList","updateScenarioInfo","assignLabelsToScenario","addedLabelIds","assignLabelsToScenarioServiceOptions","deleteLabelsFromScenarioServiceOptions","handleDeleteScenarioLines","useGenerateEditScenarioActionList","createLibraryBulkActionService","callbacks","output","valid","validationService","previouslyAssignedLabels","editScenarioInfo","createScenarioActionList","editScenarioActionList","willBeLoaded","creator","playlistItems","when","getScenario","resetScenario","createScriptPlaylist","loadVoiceSettings","getSinglePractisSetSuccess","GET_SINGLE_PRACTIS_SET_SUCCESS","PractisSetEntityTypeNames","practisSetEntityTypeName","practisSetEntityTypeColors","PractisSetStatusNames","PractisSetStatusName","calculatePractisSetTotalDuration","newDurations","minRepsCount","PacingType","initialPractisSetsState","scenarioCount","challengeCount","pacingId","totalScenarios","totalChallenges","isScenariosLoading","isChallengesLoading","practisSetReducer","GET_SINGLE_PRACTIS_SET_START","GET_SINGLE_PRACTIS_SET_FAILURE","MODIFY_PRACTIS_SET","newPractisSetsInfo","SEARCH_PRACTIS_SCENARIOS_START","SEARCH_PRACTIS_SCENARIOS_SUCCESS","SEARCH_PRACTIS_SCENARIOS_FAILURE","SEARCH_PRACTIS_CHALLENGES_START","SEARCH_PRACTIS_CHALLENGES_SUCCESS","SEARCH_PRACTIS_CHALLENGES_FAILURE","GET_PRACTIS_SCENARIOS_COUNT_SUCCESS","GET_PRACTIS_CHALLENGES_COUNT_SUCCESS","UPDATE_PRACTIS_CONTENT","PRACTIS_CONTENT_REP_COUNT_INCREASE","newContent","isScenario","PRACTIS_CONTENT_REP_COUNT_DECREASE","LIBRARY_ACTIONS","STORE_PRACTIS_SET_TEMP_COPY","temp_info","RESTORE_PRACTIS_SET_FROM_TEMP","RESET_PRACTIS_SETS","getPractisSetState","useSearchPractisScenarios","searchPractisScenariosSuccess","searchPractisScenariosFailure","useSearchPractisChallenges","searchPractisChallengesSuccess","searchPractisChallengesFailure","useGetSinglePractisSetService","getPractisSetApi","getPractisSetContent","practisSetid","practisSetData","getSinglePractisSetFailure","useUpdatePractisContentService","updatePractisContentAction","usePractisContentRepCountIncrease","practisContentRepCountIncrease","usePractisContentRepCountDecrease","practisContentRepCountDecrease","useResetPractisSetService","useStorePractisSetTempCopyService","useRestorePractisSetFromTempActionService","useModifyPractisSetService","modifyPractisSetAction","ArchiveIcon","StyledHeaderBottomActionItemsWrapper","VerticalDivider","ArchiveButtonContainer","pacing","handleUpdatePractisSet","modifyPractisSet","storePractisSetTemp","restorePractisSetFromTemp","handleRestoreArchivedPractisSet","useHandleRestoreArchivedPractisSet","handleSaveWithModalAction","checkIsPractisContentDisabled","practisSetsContent","currentContent","isInViewMode","StyledListItemRow","isDragging","StyledListTitleItemCell","StyledListItemCell","GenerateTableCells","practisSetContent","addToBuilder","PRACTIS_SET_DRAGGABLE_ID","isDragDisabled","onDoubleClick","NavigationCover","Spacer","space","StyledLibraryNavigationContainer","PractisContentNavigation","scenariosCount","scenarioCountFiltered","challengeCountFiltered","challengesCount","setPage","PractisContentNavigationContainer","Stack","LabelFilters","onClearHandler","SearchContainer","TableFilters","setSelectLabels","StyledScenarioList","StyledTableHeaderRow","StyledBodyWrapper","StyledBody","StyledBodyContainer","StyledTableHeaderCell","ScenarioList","onChangeSearchParams","sortName","sortDuration","StackIcon","PRACTIS_SET_SCENARIO_LIST_DROP_ID","droppableProps","StyledChallengeList","ChallengeList","PRACTIS_SET_CHALLENGER_LIST_DROP_ID","StyledListContent","StyledDescriptionInfoContent","ListContent","getScenarios","getChallenges","addScenarioToBuilder","addChallengeToBuilder","ListContentContainer","searchPractisScenarios","searchPractisScenariosDebounced","searchPractisChallenges","searchPractisChallengesDebounced","StyledBuilderConfigs","MinimumAccuracy","minimumAccuracy","minTrainingScore","StyledBuilderDuration","PreviewItemContainer","PreviewHeader","Type","ChallengeType","ScenarioType","ScriptLineCard","LineTitle","LineDescription","LineCustomerTitle","LineRepTitle","PreviewItem","cardRef","cardPositions","setCardPositions","buildText","keyword","cardPosition","StyledBuilderListItem","StyledRemoveSection","InfoSection","EntityName","EntityItemTitle","EntityItemActions","EntityItemDuration","PreviewButton","SectionDivider","RepsSection","RepsTitle","RepsCounter","RepsCount","SetCountContainer","BuilderListItem","onRemove","showPreview","setShowPreview","increaseContentMinRepCount","decreaseContentMinRepCount","itemRef","itemPositions","decreaseContentDisabled","dataTestPrefix","onMouseDown","uniqueId","RepsRequired","reps","Documents","StyledBuilderContent","BuilderContent","BuilderBody","StyledBuilderBodyArea","NoResultContainer","NoResultLogo","NoResultHeader","NoResultText","StyledEmptyDroppableArea","handleRemoveContent","PRACTIS_SET_BUILDER_DROP_ID","PractisSetBuilder","totalRepsReqD","cur","PractisSetBuilderContainer","allScenarios","allChallenges","handleUpdatePractisContent","setContent","positionRef","reorderAndUpdate","reOrderedResult","changePosition","addScenarioToPractisSet","addedScenario","addedContent","addScenarioAsLastToPractisSet","addChallengeAsLastToPractisSet","addedChallenge","addChallengeToPractisSet","removeFromPractisSet","removePractisSetWithId","ContentContainer","updatePractisContent","ContainerBody","Select","valueColor","customMenuItem","pacingTypeNames","SEQUENTIAL","FREE","pacingTypeName","initialPacingsState","getPacingsState","pacings","useSearchPacingsService","searchPacingsApi","SEARCH_PACINGS_START","SEARCH_PACINGS_SUCCESS","SEARCH_PACINGS_FAILURE","searchPacingsFailure","searchPacings","handleSearchPacings","pacingItems","newPacing","PractisSetsComponent","handleFetchPractisSet","handleResetPractisSet","createEditPractisSetSuccessCallback","existedPractisSetId","newPractisSetId","createPractisSetResponse","editPractisSetResponse","updatePractisSetStatusResponse","isEditMode","useCreateEditPractisSetSuccessCallback","createEditPractisSetFailedCallback","useCreateEditPractisSetFailedCallback","handleArchivePractisSet","useHandleArchivePractisSet","setPreviousAssignedLabelsAction","practisSetLabelIds","generateCreatePractisSetActionList","createNewPractisSet","assignPractisSetContent","updatePractisSetStatusService","handleAssignPractisSetContent","practisSetContents","handleAssignLabelsToPractisSet","handleAssignContentToPractisSet","assignPractisSetContentOptions","handleUpdatePractisSetStatus","updatePractisSetStatusServiceOptions","newPractisSetInfo","useGenerateCreatePractisSetActionList","generateEditPractisSetActionList","updatePractisSetInfo","assignLabelsToPractisSet","handleUpdatePractisSetInfo","practisSetInfo","updatePractisSetInfoActionOptions","handleUpdatePractisSetLabels","assignLabelsToPractisSetServiceOptions","addedPractisSetLabels","deleteLabelsFromPractisSetServiceOptions","deletedPractisSetLabels","useGenerateEditPractisSetActionList","createEditPractisSetService","validateUpdate","editedPractisSetInfo","createPractisSetListAction","editPractisSetListAction","resetPractisSet","LibraryNavigation","LibraryNavigationContainer","LibraryFilters","selectedStatuses","savedStatuses","handleSelectStatus","handleSaveStatus","handleStatusSelection","ScenariosListActions","restoreScenario","handleItemEdit","handleViewScenario","handleGenerateChallenge","handleDeleteScenario","onDuplicateScenario","handleDownloadAsPDF","archiveScenario","assignLabelsToLibrary","assignSingleLabelOpen","setAssignSingleLabelOpen","handleSetPreselectedLabels","useSession","useSessionEffect","effect","deps","session","useFilter","onFilterChange","DEFAULT_FILTER_VALUE","Scenarios","updatedScenarios","onDeleteScenarios","onArchiveScenario","onRestoreScenario","searchScenarios","updateAllScenariosCheckedState","updateSelectedScenarioCheckedState","fetchAllPractisSets","deleteLibraryLabelTag","assignLabelsToScenarios","deleteLabelsFromScenarios","setSelectedStatuses","setSavedStatuses","generateChallengeService","generateChallengeData","useGenerateChallengeBulActionService","updateAllScenariosCheck","updateMultipleScenariosLabels","assignLabels","getAssignedLabelsIds","deletedLabelsFiltered","selectedLabelsFiltered","hcStatus","hcDuration","hcUpdatedAt","handleChangeEvent","onSelectStatus","onSaveStatus","successDeleteScenarioCallback","onConfirmDeleteScenario","scenarioIdToDelete","usersToClear","scnerioItem","updateLabelsBulkActionService","generateDuplicateScenarioActionList","duplicateLibraryBulkActionService","handleDuplicateScenario","newScenario","duplicateScenarioActionList","hideDivider","sc","REMOVE_CHALLENGE_LABEL","handleUpdateScenariosLabels","ScenariosContainer","deleteScenarios","searchScenariosDebounced","Box","PractisSetsListActions","onRestorePractisSet","handleViewPractisSet","handleDeletePractisSet","handleViewPractisSetProgress","onDuplicatePractisSet","onArchivePractisSet","SeparatingDot","PractisSets","onDeletePractisSets","updatedPractisSets","updateSelectedPractisSetCheckedState","onConfirmDeletePractisSet","practisSetIdToDelete","updateMultiplePractisSetLabels","hcTotalCount","hcLastUpdated","practisSetItem","generateDuplicatePractisSetActionList","handleGetPractisSetContent","currentPractisSetId","newPractisSetContentData","getPractisSetContentOptions","useGenerateDuplicatePractisSetActionList","handleDuplicatePractisSet","newPractisSet","duplicatePractisSetActionList","deletePractisSets","archivePractisSet","restorePractisSet","ChallengesListActions","restoreChallenge","handleViewChallenge","handleDeleteChallenge","onDuplicateChallenge","archiveChallenge","Challenges","updatedChallenges","onDeleteChallenges","onArchiveChallenge","onRestoreChallenge","searchChallenges","updateSelectedChallengeCheckedState","assignLabelsToChallenges","deleteLabelsFromChallenges","updateAllChallengesCheck","updateMultipleChallengesLabels","chName","chStatus","chUpdatedAt","successDeleteChallengeCallback","onConfirmDeleteChallenge","challengeIdToDelete","generateDuplicateChallengeActionList","handleDuplicateChallenge","newChallenge","duplicateChallengeActionList","handleChallengeCheck","challengeItem","handleUpdateChallengesLabels","ChallengesContainer","deleteChallenges","searchChallengesDebounced","Library","TermsContainer","TermsPage","PrivacyContainer","PrivacyPage","SupportContainer","SupportMail","SupportPage","StyledUsersPageNavigationContainer","UsersPageNavigation","LIST_STAGING","UsersPageNavigationContainer","StyledEmptyInviters","StyledEmptyInvitersContent","NoInvitersTitle","EmptyInviters","StyledInvitersList","InviterItemWrapper","YouWrapper","InviterItem","PortableInvitersList","inviters","selectedInviters","setInvitersFilters","invitersId","inviterId","topListInviters","bottomListInviters","StyledCreateInviters","CreateInvitersBody","PortableInviters","onSelectMultiply","getPrecessedInviters","selectedInvitersLength","selectMultipleInvitersAction","useDeSelectAllInvitersAction","filterUnique","initialInvitersState","ready","getInvitersState","PortableInvitersWithStore","invitersState","searchInviters","searchInvitersApi","responseData","useSearchInvitersService","selectMultiply","useSelectMultipleInvitersAction","useSelectAllInvitersAction","CustomFieldContainer","RoleContainer","InvitationsFilter","onRoleChange","onInvitersChange","preSelectedRoles","saveInviters","useSaveInvitersAction","selectMultipleInviters","deselectAllInviters","InvitationsListActions","onViewProfile","onCopyInviteText","handleRevokeInvitation","assignLabelsToUser","handleResendInvitation","Pending","customTableColumnStyle","avatarTableCellCustomStyle","useRevokeInvitationBulkActionService","searchUsersAndRevokeInvitation","revokeInvitations","searchPendingUsersParams","useSearchUsersAndRevokeInvitation","totalCompletedRevokeInvitations","clearTotalCompletedRevokeInvitations","handleStopRevokeInvitationsBulkActionService","handleStartRevokeInvitationBulkActionService","useResendInvitationBulkActionService","searchUsersAndResendInvitation","useSearchUsersAndResendInvitation","totalCompletedResendInvitations","clearTotalCompletedResendInvitations","handleStopDuplicateTeamBulkActionService","handleStartResendInvitationBulkActionService","useDeleteUserBulkActionService","searchUsersAndDeleteUser","useSearchUsersAndDeleteUser","deletedUsersTotalCount","ResetDeletedUsersTotalCount","handleStartDeleteUserBulkActionService","Invitations","searchInvitations","onRevokeInvitation","updatedInvitations","updateAllSelectedInvitations","updateSelectedInvitation","deleteUserLabel","refreshInvitersList","useRefreshInviters","prevCompanyId","onConfirmRevokeInvitations","revokeInvitationIds","onConfirmRevokeInvitationsSuccessCallback","onSuccessRevokeInvitationBulkActionService","revokeInvitationBulkActionService","handleResendInvitationBulkActionService","deleteLabelsFromUser","updateMultipleUsersLabels","hcFirstName","hcEmail","hcRole","hcInvitedOn","hcInvitedby","filterRoleHandler","filterInvitersHandler","assignedFiltersCount","deselectTeams","updateData","REMOVE_INVITATION_LABEL","handleUpdateUserLabels","InvitationsContainer","updatedInvitationsState","searchInvitationUsers","copyInviteText","revokeInvitation","handleCopyInviteText","UsersFilter","onTeamsChange","UsersListActions","handleUserSettings","setShowNudgeDialogMemberId","setUserIdsToDelete","ASSIGN_USER_LABEL","EXPORT_LIST_USER","DELETE_USER","SelectInputContainer","noText","teamsTableCellStyle","useBuildUserName","Users","searchUsers","assignTeamsToUsers","onDeleteUser","updateAllSelectedUsers","updateSelectedUser","getUsersReportService","onNudgeTrainees","buildUserName","showNudgeDialogMemberId","loggedInUserPermissions","handleDeleteUserBulkActionService","handleManageTeams","currentState","diff","onNudgeMultipleUsersSuccessCallback","handleNudgeMultipleUsers","nudgeUserDate","onExportClickedSingle","isOptionsDisabled","hcUserName","hcTeam","hcAssigned","hcLastActivity","hcRegisteredAt","teamsChangeHandler","onDeleteUsersSuccessCallback","onConfirmDeleteUser","selectAllState","handleOpenDeleteUsersConfirmDialog","userText","handleDeleteUsers","isLodashEmpty","countTeams","countEnrollments","registeredAt","lastActivity","UsersContainer","nudgeTrainees","useGetChallengeService","getChallengeApi","FETCH_CHALLENGE_START","FETCH_CHALLENGE_SUCCESS","fetchChallengeSuccess","FETCH_CHALLENGE_FAILURE","fetchChallengeFailure","useUploadChallengeAudioService","UPLOAD_CHALLENGE_AUDIO_START","UPLOAD_CHALLENGE_AUDIO_SUCCESS","UPLOAD_CHALLENGE_AUDIO_FAILURE","uploadChallengeAudioFailure","useCreateChallengeScriptLineService","CREATE_CHALLENGES_SCRIPT_LINE","createChallengeScriptLineAction","useDeleteChallengeScriptLineService","DELETE_CHALLENGES_SCRIPT_LINE","useModifyChallengeScriptLineService","MODIFY_CHALLENGES_SCRIPT_LINE","modifyChallengeScriptLineAction","useUpdateChallengeScriptLineService","UPDATE_CHALLENGES_SCRIPT_LINE","useModifyChallengeService","MODIFY_CHALLENGE","modifyChallengeAction","useResetChallengeService","RESET_CHALLENGE","useResetChallengeLogoService","RESET_CHALLENGE_LOGO","useStoreChallengeTempCopyService","STORE_CHALLENGE_TEMP_COPY","useRestoreChallengeFromTempActionService","RESTORE_CHALLENGE_FROM_TEMP","handleUpdateChallenge","storeChallengeTemp","restoreChallengeFromTemp","handleRestoreArchivedChallenge","modifyChallenge","useHandleRestoreArchivedChallenge","disableRestore","ChallengeStateSelectorContext","useChallengeState","ScriptLineSpeakers","ChallengeInfo","ChallengeInfoContainer","resetChallengeLogo","onRefreshLogo","StyledCommentTitle","StyledContentEditableInput","RepScriptItem","RepScriptItemContainer","StyledScriptLineWrapper","RepLine","CustomerScriptItem","handleScriptLineModify","generateAudio","CustomerScriptItemContainer","modifyScriptLine","uploadChallengeAudio","StyledCommentBody","TraineeRespondLine","CustomerLine","hideRepPlaceholder","ChallengeContainerContext","StyledChallengeScriptHeader","AttemptsCountContainer","AttemptsCountText","AttemptsCountValue","LeftButtons","Attempts","Form","UnlimitedSetting","SettingDescription","UnlimitedSettingDescription","LimitedSetting","LimitedSettingValue","LimitNumberContainer","LimitInput","LimitedSettingDescription","LimitWarning","customRadioButton","ChallengeAttemptsLimitView","initialSettings","isValidLimitValue","validateSettings","dirty","isValid","isLimited","limitValue","ChallengeAttemptsLimit","ModalContent","ModalSidebar","NavigationIcon","TabContent","ChallengeSettingsView","SmartGear","maskType","maskUnits","mask","ChallengeScriptHeaderView","showChallengeSettings","setShowChallengeSettings","isAudioProcessing","isGenerateForAllDisabled","isPlayDisabled","ChallengeScriptHeader","ChallengeScripts","ChallengeScriptsContainer","ChallengeBody","EditChallenge","getChallenge","handleResetChallenge","createEditChallengeSuccessCallback","editChallengeResponse","updateChallengeResponse","useCreateEditChallengeSuccessCallback","createEditChallengeFailedCallback","useCreateEditChallengeFailedCallback","handleArchiveChallenge","useHandleArchiveChallenge","allowedResponseTime","loggedInActionsHelper","generateCreateChallengeActionList","generateEditChallengeActionList","updateChallengeInfo","assignLabelsToChallenge","assignLabelsToChallengeServiceOptions","deleteLabelsFromChallengeServiceOptions","useGenerateEditChallengeActionList","editChallengeInfo","createChallengeActionList","editChallengeActionList","VIEW_TTS_SETTINGS","EditChallengeContainer","resetChallenge","createPlaylist","enableNewRelic","licenseKey","applicationID","beacon","errorBeacon","NewRelicApiContext","InjectNewRelic","async","innerHTML","NewRelic","getAppId","getLicenseKey","head","SubmissionsStateSelectorContext","SubmissionPaginationStateSelectorContext","AccuracyScoreStateSelectorContext","useSubmissionsState","useSubmissionPaginationState","useAccuracyScoreState","UpdatedSubmissionsStateSelectorContext","useUpdatedSubmissionsState","SubmissionDetailsStateSelectorContext","useSubmissionDetailsState","SUBMISSION_TYPE","SUBMISSION_VISIBILITY","SUBMISSION_FLAG_TYPE","searchSubmissionPaginationSuccess","submissionIds","SEARCH_SUBMISSION_PAGINATION_SUCCESS","updateChallengeSubmissionStart","UPDATE_CHALLENGE_SUBMISSION_START","updateChallengeSubmissionSuccess","UPDATE_CHALLENGE_SUBMISSION_SUCCESS","updateChallengeSubmissionFailure","UPDATE_CHALLENGE_SUBMISSION_FAILURE","getSubmissionDetailsStart","GET_SUBMISSION_DETAILS_START","getSubmissionDetailsFailure","GET_SUBMISSION_DETAILS_FAILURE","getSubmissionDetailsSuccess","submission","review","GET_SUBMISSION_DETAILS_SUCCESS","SubmissionActions","AccuracyScoreActions","SUBMISSION_STATUS","CHALLENGE_SUBMISSION_REVIEW_STATUS","CHALLENGE_SUBMISSION_REVIEW_STATUS_ITEMS","createSearchSubmissionsParams","order","visibility","showArchived","VISIBLE","useSubmissionActionsHelper","ARCHIVE_SUBMISSION","RESTORE_SUBMISSION","submissions","createSubmissionActionsHelper","useAccuracyScoreActionsHelper","createAccuracyScoreActionsHelper","SubmissionUpdateActions","UNAVAILABLE_SUBMISSION_ERROR","pluralize","noun","useSearchChallengeSubmissionsService","searchSubmissionsApi","shouldRemainFilterState","SEARCH_CHALLENGE_SUBMISSIONS_START","searchSubmissionsParams","reviewStatuses","filterChallenge","combinedParams","customFilters","SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS","SEARCH_CHALLENGE_SUBMISSIONS_FAILURE","searchChallengeSubmissionsFailure","useSearchChallengeSubmissionPaginationService","SEARCH_SUBMISSION_PAGINATION_START","SEARCH_SUBMISSION_PAGINATION_FAILURE","searchSubmissionPaginationFailure","useGetSubmissionDetailsService","getSubmissionDetailsApi","getSubmissionReviewApi","reviewedAt","useGetSubmissionReviewService","GET_SUBMISSION_REVIEW_SUCCESS","getSubmissionReviewSuccess","useModifyScoreService","MODIFY_SCORE","modifyScore","useCheckAllSubmissionsService","CHECK_ALL_SUBMISSIONS","checkAllSubmissions","useCheckSingleSubmissionService","CHECK_SINGLE_SUBMISSION","useCheckSingleAccuracyScoreService","CHECK_SINGLE_ACCURACY_SCORE","useCheckAllAccuracyScoresService","CHECK_ALL_ACCURACY_SCORES","checkAllAccuracyScores","useSearchAccuracyScoreService","SEARCH_ACCURACY_SCORE_START","accuracyScores","SEARCH_ACCURACY_SCORE_SUCCESS","SEARCH_ACCURACY_SCORE_FAILURE","searchAccuracyScoreFailure","useGetSubmissionFromFeedService","useArchiveSubmissionsService","isAccuracyTest","archiveSubmissionsApi","countText","useRestoreSubmissionsService","restoreSubmissionsApi","StatusSection","SubmissionFilters","setReviewStatuses","setShowArchived","handleReviewStatusSelection","reviewStatus","Files","StyledSubmissionsNavigationContainer","SubmissionsNavigation","SubmissionsNavigationContainer","CheckMark","minWidthTableCell","useUpdateSubmissionStatusBulkActionService","updateActionRef","searchSubmissionsAndUpdateStatus","archiveSubmissionApi","restoreSubmissionApi","UpdateSubmissionActionList","updateSubmissionAction","useHandleSearchSubmissionsAndUpdateStatus","clearTotalCompletedItems","DEFAULT_REVIEW_STATUSES","ChallengeSubmissions","searchSubmissions","updatedSubmissions","onArchiveSubmission","selectedSubmissionIds","selectedSubmissions","updateAllSelectedSubmissions","updateSelectedSubmission","onRestoreSubmission","initialFilters","setFilters","handleViewSubmissionDetails","relation","isViewed","updateAllSubmissionsCheck","updateSubmissionStatusBulkActionService","archiveSubmissions","restoreSubmissions","handleApplyFilters","sbFirstName","sbPractisSetName","sbChallengeTitle","sbReviewedAt","sbScore","sbSubmittedAt","appliedFiltersCount","difference","handleSubmissionCheck","userLabels","score","VIEW_SUBMISSION","ChallengeSubmissionsContainer","updatedTeamsState","selectSelectedSubmissions","submissionChallenges","submissionPractisSets","saveLoading","updatedTeams","DEFAULT_SCENARIOS_SCOPE","WithScenarioScopes","accuracyscore","WithScenariosContext","useWithScenariosContext","useSaveScenarios","useDeselectAllScenarios","useScenariosState","_scenarios","PortableScenariosList","topListScenarios","bottomListScenarios","StyledEmptyScenarios","StyledEmptyScenariosContent","EmptyScenarios","PortableScenarios","PortableScenariosWithStore","portableScenarios","selectMultipleScenariosAction","AccuracyTestsFilters","saveScenarios","deselectScenarios","Accuracy","AccuracyScores","selectedAccuracyScores","useableParams","clearPortableScenarios","useClearPortableScenarios","accuracyScore","sbScenarioTitle","accuracy","AccuracyScoreContainer","searchAccuracyScores","selectSelectedAccuracyScores","Submissions","AccuracyTests","PlayIcon","PauseIcon","VideoRangeSlider","played","onChangeCommitted","FullScreenIcon","VolumeRangeSlider","volume","CopyLink","StyledVideoPlayerControls","ControlsWrapper","Controls","IconContainerSpacer","VolumeRangeContainer","LeftControls","RangeControls","InfoControls","StyledTimer","StyledVolume","StyledInfoTools","VideoPlayerControls","playing","muted","setPlaying","setMuted","onVolumeChange","onVolumeSeekDown","onToggleFullScreen","onSeek","onSeekMouseDown","onSeekMouseUp","onDownloadVideo","onCopyLink","videoLoading","elapsedTime","VolumeOff","VolumeUp","ReactPlayerContainer","NoVideoContainer","VideoPlayer","getDuration","getPlaying","muteVideo","showControls","setShowControls","playedSeconds","seeking","setSeeking","showLoading","setShowLoading","playerRef","playerContainerRef","handlePlayPause","handleToggleFullScreen","screenfull","isEnabled","toggle","isNaN","hh","getUTCHours","mm","getUTCMinutes","ss","getUTCSeconds","padStart","formatDisplayDate","getCurrentTime","attributes","preload","onReady","onProgress","changeState","novideo","mt","onRewind","seekTo","parseFloat","Infinity","DetailsHeader","StyledDetailsSubmissionInfo","StyledInfoSection","Row","DetailsSubmissionInfo","redirectToChallenge","handleDownloadVideo","handleCopyLink","StyledSelectBoxItemContainer","StyledSelectBoxItemWrapper","StyledBulletBackground","StyledSelectBoxItem","StyledBullet","alignRight","SelectBoxItem","finalSpot","finalItem","firstItem","handleSelect","isRound","SelectBoxLabel","StyledSelectBoxContainer","BoxArea","ButtonArrow","StyledDetailsSubmissionReview","StyledDetailsBody","ScoreRow","ActionRow","ExampleContent","Example","StyledSelectBox","formatValueLabel","StyledSelectBoxHeader","StyledSelectBoxHeaderItem","StyledDetailsArrowsContainer","StyledLeftArrowContainer","StyledRightArrowContainer","SCORE_ITEMS","DetailsSubmissionReview","submitted","canRedo","onCompleteReviewClicked","changeSubmission","itemsTotalCount","currentItemPosition","requestRedoClicked","reviewPermissionDenied","reviewValue","arr","generateScoreItemArray","amount","paddingTop","paddingLeft","clarity","knowledge","confidence","enthusiasm","goalAchieved","note","REVIEW_SUBMISSION","REQUEST_SUBMISSION_REDO","RequestRedo","RequestReminder","doNotShowWarning","onShowWarningClicked","CopyLinkNotificationView","CopyLinkNotification","BrokenVideo","ErrorTitle","ErrorDescription","UnavailableContentView","UnavailableContent","UnavailableChallengeView","UnavailableChallenge","UserImage","UserText","MainContent","ThumbnailContainer","Thumbnail","ThumbnailTitle","ThumbnailDescription","StatsContainer","Stats","StatsTitle","StatsScore","StatsDelimiter","StatsItem","StatsItemTitle","StatsItemPoints","StatsItemLine","StatsItemPoint","Buttons","WhiteButton","WhiteButtonTitle","GreyButton","GreyButtonTitle","StatsItemsList","StatsItemPointList","ScreenLoadingView","LogEvent","ScreenLoading","StyledDetailsContainer","StyledDetailsContainerInner","ChallengeCopiedKeyName","SubmissionDetails","handleSaveSubmissionReview","requestSubmissionRedo","markSubmissionAsViewedService","handleCopyChallengeLink","showCopyLinkNotification","handleHideCopyLinkNotification","getSubmissionReview","DO_NOT_SHOW_WARNINGS","requestRedoOpened","setRequestRedoOpened","requestRedoReminderOpened","setRequestRedoReminderOpened","setDoNotShowWarning","setReviewPermissionDenied","saveReview","newReview","restrictedUsersList","finalUsersList","doNotShowRequestRedoWarning","requestRedoSubmitted","redo","setVideoLoading","traineeId","SubmissionDetailsContainer","localOffset","setLocalOffset","submissionPagination","submissionPaginationLoading","submissionTotalCount","saveSubmissionReview","performSubmissionReviewApi","usePerformSubmissionReviewService","requestSubmissionRedoApi","useRequestSubmissionRedoService","performSubmissionActionApi","useMarkSubmissionAsViewedService","getSubmissionDetails","getSubmissionFromFeed","challengeLoading","setShowCopyLinkNotification","copyChallengeLink","useCopyChallengeLink","searchChallengeSubmissionPaginationService","successGetSubmissionDetailCallback","isDirectLink","locationSearchParams","locationFilters","submissionIndex","changeSubmissionHandler","nextSubmissionId","StyledResetContent","TraineeLogin","SelectedSubtitle","UserProfileFilters","totalFiltersSelectedCount","PerformanceSectionRef","reff","PerformanceSection","onPractisSetsUpdate","searchUserPractisSets","unEnrollPractisSetService","onGetTrainee","remindUsers","updateAllPractisSetCheck","handleDeleteEnrollmentsSuccess","handleUnEnrollPractisSet","hcStarted","hcAccuracyAvg","hcTrainingTime","hcProgressValue","useImperativeHandle","filterIconCount","handleDeletePractisSets","showDueDateData","PerformanceSectionContainerRef","PerformanceSectionContainer","getUserPerformance","fetchPortablePractis","updatedUserPractisSetsState","searchUserPractisSetsDebounced","resetUserPerformance","perfSecConRef","refreshPractisSetsSearch","fetchPortablePractisSets","processedUser","practisSetDueDates","initialTeamIds","StyledUserDetailsInfo","ReportGeneralInfoWrapper","StyledUserInfoWrapper","StyledUserInfoContainer","StyledUserOptions","Performance","setPractisSetsCount","setUseGoBack","fetchUserAllPractisSets","handleSettingsClick","onNudgeUserSuccessCallback","assignFiltersToUserService","practisSetsWithEnrollmentIds","assignedPractisSet","handleOpenAssignFilter","perfRef","refreshPractisSets","flatListIds","updatedFlatListIds","isCancel","PerformanceContainer","libraryState","PublicRoute","eventInfo","isAdminOnly","PlatformVersions","eventInfos","CREATE_COMPANY","UPDATE_COMPANY","DELETE_COMPANY","CREATE_PRACTIS_ADMIN","UPDATE_PRACTIS_ADMIN","DELETE_PRACTIS_ADMIN","GENERATE_CHALLENGE_FROM_SCENARIO","UPDATE_STAGING","DELETE_STAGING","CREATE_SUBMISSION","UPDATE_SUBMISSION","DELETE_SUBMISSION","CREATE_SCORE","UPDATE_SCORE","DELETE_SCORE","UPDATE_SETTING","UPDATE_TEAM","DELETE_TEAM","DUPLICATE_TEAM","USER_ADDED_INTO_TEAM","USER_TEAM_LEAD_PROMOTION","USER_TEAM_LEAD_REVOKE","CREATE_THEME","UPDATE_THEME","DELETE_THEME","ASSIGN_THEME_TO_PRACTISE_SET","ADD_COVER_INTO_THEME","REMOVE_COVER","ASSIGN_COVER_TO_PRACTISE_SET","ASSIGN_COVER_TO_SCENARIO","eventInfosMap","userName","withEmail","userEmail","companyAndUserNames","atTime","platformVersionNames","IOS_VERSION","ANDROID_VERSION","Details","staging","tm","assignment","themeId","searchLogsDispose","SEARCH_LOGS_DISPOSE","useSearchLogsService","searchLogsApi","SEARCH_LOGS_START","logs","SEARCH_LOGS_SUCCESS","SEARCH_LOGS_FAILURE","searchLogsFailure","LogsStateSelectorContext","includeAdminOnly","FiltersApplyButton","FiltersButton","FiltersCheckbox","FiltersDivider","FiltersCheckboxList","divisible","topItems","bottomItems","renderCheckbox","List","FiltersClearButton","FiltersFieldSet","FiltersNoItems","itemsName","Column","NoItemsTitle","FiltersPopupActions","FiltersPopupBody","FiltersPopupButton","FiltersPopupFieldSets","FiltersSearchInput","FiltersSelectedItems","FiltersSelectedItemsText","selectedItemsCount","itemName","FiltersSelectedText","FiltersToggleAllButton","allItemsSelected","onToggleAllItems","colorsId","colorsInfos","unselect","LogFiltersEvents","selectedEvents","onChangeSelectedEvents","eventSearchPattern","setEventSearchPattern","checkboxListItems","pattern","allEvents","filteredEvents","setSelectedEvents","events","handleChangeSearchEventsPattern","searchPattern","handleChangeSelectedEvent","handleClickToggleAllEvents","UserRoleFilters","onChangeSelectedRoles","rolesHelper","rolesByName","getRoleByName","useUserRolesService","allRoles","Roles","roleCheckboxItems","handleSelectedRoleChange","LogFilters","onApplyFilter","handleClickClear","handleClickApplyFilter","NoLogs","Payload","StyledDetailsWrapper","StyledDetails","tableToolsRootStyle","CompanyLogs","searchLogs","onUnmount","hcEvent","hcCreatedAt","hcCreator","handleChangeRole","handleChangeStartDate","handleChangeEndDate","handleChangeDate","handleShowDetails","handleCloseDetails","onMouseEnter","onMouseLeave","VIEW_LOG_DETAILS","onShowDetails","CompanyLogsContainer","logsState","searchCompanyLogs","addCompanyFilter","searchCompanyLogsDebounced","handleUnmount","LogActionButton","MobileNumberContainer","SecondaryText","ErrorText","MobileNumberLogin","getPhoneCode","showLoginWithEmail","setShowLoginWithEmail","mobileNumber","setMobileNumber","getErrorMessage","handleSendCode","redirectToLogin","activeIndex","StyledCursorText","keyframes","KEY_CODE","VerificationCodeInput","pValue","emptyValue","setActiveIndex","codeInputRef","itemsRef","isCodeRegex","focusOrBlurItem","currentItem","focusItem","blurItem","onItemFocus","codeInput","onPaste","pastedString","clipboardData","getData","inputMode","changeValue","onKeyUp","nextIndex","prevIndex","isLast","isDeleting","tabIndex","MobileNumber","VerificationCodeContainer","VerificationError","SentLabel","CountdownTimer","CheckVerificationCodeView","isVerifying","verificationError","resendStatus","remainingTime","isCodeValid","showSent","showCountDown","onCodeChange","onVerify","onResend","CheckVerificationCodeController","CheckVerificationCode","onVerifySuccess","setCode","setRemainingTime","remainingTimeInterval","setIsVerifying","setVerificationError","setResendStatus","handleVerify","handleResend","CODE_TIMEOUT","newCode","VerifyMobileNumberController","VerifyMobileNumber","loginByPhoneCode","handleVerifySuccess","redirectToMobileNumberLogin","TelepromterStateSelectorContext","useTelepromterState","CompletedIcon","clipPath","ExitIcon","Completed","redirectToScenario","redirectToPlayback","redirectToTraining","PreviewContainer","VideoContainer","StyledVideoPlayer","LineContainer","Playback","telepromterState","generatedLines","playbackVideo","videoBlob","setDuration","redirectToCompleted","mapScriptLines","prevLineDuration","minDurationValue","maxDurationValue","localScriptLines","setLocalScriptLines","currentScriptLine","scriptLine","EmptyContainer","ScriptLineDuration","started","Next","enableBackground","IconSection","Circle","Hold","Fill","Left","Right","InnerCircle","Countdown","countdown","setCountdown","timer","prevCountdown","useGetTelepromterScenarioService","FETCH_TELEPROMTER_SCENARIO_START","FETCH_TELEPROMTER_SCENARIO_SUCCESS","fetchTelepromterScenarioSuccess","FETCH_TELEPROMTER_SCENARIO_FAILURE","fetchTelepromterScenarioFailure","useAddGeneratedScriptLineService","ADD_GENERATED_SCRIPT_LINE","addGeneratedScriptLineAction","useSetRecordedVideoService","SET_RECORDED_VIDEO","setRecordedVideoAction","useResetTelepromterService","RESET_TELEPROMTER","Hidden","ScriptLineContainer","GoNextButton","StyledVideo","Training","recorder","resetTelepromter","captureCamera","camera","addGeneratedScriptLine","setRecordedVideo","initializeCamera","srcObject","RecordRTC","startRecord","stopRecordingCallback","getBlob","destroy","stopRecord","renderVideo","playsInline","startTraining","setStartTraining","tempScriptLines","setTempScriptLines","repLineDuration","setRepLineDuration","redirectToExit","timeout","prevLines","prevScriptLines","shift","lineTimer","lineDurationTimer","Exit","PhoneEmulator","Telepromter","StyledCreatedByList","CreatedByItemWrapper","CreatedByItem","CreatedByFiltersList","setUserFilters","topListCreatedBy","bottomListCreatedBy","filterUsers","EmptyTextWrapper","CreatedByFilters","selectCreatedByUsers","fetchUsers","draftsState","getProcessedUsers","selectedUsersCount","EditedByFiltersList","EditedByFilters","selectEditedByUsers","editedByUsers","SectionContainer","DraftsFilter","createdBySelectedUsers","createdBySavedUsers","saveCreatedByUsers","editedBySavedUsers","editedBySelectedUsers","saveEditedByUsers","NoDrafts","getSocketState","socketProgress","Drafts","drafts","draftEditUpdated","searchDrafts","onDeleteDraft","updatedDrafts","updateAllSelectedDrafts","updateSelectedDraft","setCreatedBySelectedUsers","setCreatedBySavedUsers","setEditedBySelectedUsers","setEditedBySavedUsers","socketLoaderState","srtName","srtUsersCount","srtCreatedBy","srtCreatedAt","srtLastEditedBy","srtUpdatedAt","handleCreatorIdChangeEvent","handleEditorIdChangeEvent","handleDeleteDrafts","onConfirmDeleteDrafts","handleDraftCheck","DraftsContainer","updatedDraftsState","searchDraftsDebounced","deleteDraft","AiLogsStateSelectorContext","AiLogItemStatus","updateAiLogsFlagFailure","UPDATE_AI_LOGS_FLAG_FAILURE","useSearchAiLogsService","searchAiLogsApi","userTeamIds","SEARCH_AI_LOGS_START","requestParams","queryUser","dateStart","toISOString","dateEnd","aiLogs","SEARCH_AI_LOGS_SUCCESS","SEARCH_AI_LOGS_FAILURE","searchAiLogsFailure","useToggleAiLogsFlagService","addSubmissionFlag","deleteSubmissionFlag","UPDATE_AI_LOGS_FLAG_START","flagCompanyId","DELETE_AI_LOGS_FLAG_SUCCESS","deleteAiLogsFlagSuccess","COMPANY","ADD_AI_LOGS_FLAG_SUCCESS","addAiLogsFlagSuccess","AiAssessmentFilters","setSelectedTeams","ExclamationCircle","points","ScenarioWrapper","StyledExclamationCircleIcon","ExclamationCircleIcon","AssessmentLogsBig","FlagActive","FlagInactive","FlagHandle","FlagActiveIcon","FlagInactiveIcon","FlagToggleView","CompanyAiAssessment","searchHandler","unMount","toggleFlag","isFirstLoad","setIsFirstLoad","doSearch","isEmptyState","handleRefresh","headerOptions","useHeaderOptions","flag","useCalendarFilterOptions","emptyStateOptions","scenarioName","scenarioStatus","repNumber","submissionAccuracyMode","dateCreated","FlagToggle","CompanyAiAssessmentContainer","searchAiLogs","useAiLogsUnmountService","toggleAiLogsFlag","aiLogsState","loadingFlag","PortableTeamLeadersList","teamLeaders","topListTeamLeaders","bottomListTeamLeaders","leader","LeaderCrown","EmptyTeamLeaders","PortableTeamLeaders","processedTeamLeaders","filterTeamLeaders","selectedTeamLeadersLength","TeamLeadersContainer","MyTeamsFilters","onTeamLeadersChange","useMyTeamsState","onSelectTeamLeader","onSelectAllTeamLeaders","saveTeamLeaders","resetTeamLeaders","deselectTeamLeaders","NoTeams","handleViewTeam","handleManageTeam","handleDeleteTeam","onDuplicateTeam","assignLabelsToTeams","VIEW_TEAM","ASSIGN_TEAM_LABEL","multiTableCellStyle","ListOfTeams","updatedState","updatedTeam","deleteLabelFromTeam","updateAllSelectedTeams","updateSelectedTeam","fetchTeamLeaders","searchTeamsForFilters","useSearchTeamsPortableService","singleTeamDelete","useSingleDeleteTeamService","ifTeamsUpdateChanged","teamsWithoutDefault","hcMembers","clearAllTeamsCheck","updateAllTeamsCheck","isDefaultTeam","getTeamLeaderPicture","pictureCount","isNewlyAssigned","teamsLeadersChangeHandler","filteredTeams","teamsToClear","deleteTeamsServiceOptions","searchAndDeleteTeams","onDeleteTeamsSuccessCallback","handleStartDeleteMembersFromTeamBulkAction","useUpdateTeamsBulkActionService","handleRemoveSingleTeam","singleTeamId","deletedTeamId","handleConfirmDeleteDialog","handleOpenDeleteTeamConfirmDialog","handleRemoveSelectedTeams","LIST_TEAM","getTeamLabels","teamRemovedLabels","duplicateTeamBulkActionService","newTeamDataRef","createNewTeam","assignLabelsToTeam","getCurrentTeamMembers","getCurrentTeamMembersAndAssignToNewTeam","currentTeamId","newTeamId","handleAddAssignMembersActionToActionList","AssignMembersToTeamAction","handleAddAssignLabelsActionToActionList","currentTeamLabelIds","assignedLabelList","AssignLabelsToTeamAction","handleAssignRelationsToNewTeam","handleStartDuplicateTeamBulkActionService","generatedCopyOfTeamName","useDuplicateTeamBulActionService","handleDuplicateTeam","TotalCountForChecking","handleTeamCheck","deletedlabelIds","handleUpdateTeamLabels","ListOfTeamsContainer","searchTeamsDebounced","deleteLabelFromTeamApi","useDeleteLabelFromTeamService","teamSearchState","myTeams","selectedMyTeamsItems","OverdueLearnersNoResult","OverdueLearnersFilter","OverdueNudgeMessagePrefix","OverdueLearnersListActions","OverdueLearnersView","sorting","teamsData","handleToggleLabels","checkIsLabelTagsOpen","handleSearchChange","onLabelsFilterChange","onTeamsFilterChange","onNudgeSingleUser","updateIsSelectAll","updateSelectedUsers","selectAllHandler","onSelectUser","isTableHeadersDisabled","hcTeamName","existingTeams","OverdueLearnersStateSelectorContext","useGetOverdueLearnersService","getOverdueLearnersApi","GET_OVERDUE_LEARNERS_START","GET_OVERDUE_LEARNERS_SUCCESS","getOverdueLearnersSuccess","GET_OVERDUE_LEARNERS_FAILURE","getOverdueLearnersFailure","OverdueLearnersController","setSelectedUsers","searchOverdueLearners","selectUserHandler","CheckCircle","Warning","Saving","StatusText","LastUpdatedText","StatusIcon","UpdateStatusView","updateStatus","ERROR","StyledHeaderTitle","HeaderActions","handleCancel","UpdateStatus","ConfirmCheckMark","CancelCross","disabledButton","SaveButton","InputWithButtonsView","showButtons","isSaveDisabled","InputWithButtonsController","setShowButtons","setIsDisabled","setHasError","handleSave","blur","Tools","AssignLabelsButton","StyledActionsTitle","handleUpdateTeamName","getPreSelectedLabels","assignLabelsLocal","handleApplyLabels","InputWithButtons","ActionsContainer","AddArrow","AllUsersFilter","currentLabelIds","clearDisabled","Counter","showHeight","ListCell","ListRow","ListCheckboxCell","ManageUsersSection","ManageUsersButton","AddArrowIcon","StyledAssignedLabelList","LastTrainingAtCell","FilteredByLabelsContainer","AllUsers","orderByUserName","orderByLastTrainingAt","onSelectAllLoadedUsers","checkboxDisabled","onSuccessAddUsersBulkActionCallback","ifLabelsChanged","registrationFilters","setRegistrationFilters","assignMembersToTeamService","assignMembersToTeamServiceOptions","addMembersToTeamSuccessCallback","handleStartAddMembersToTeamBulkAction","handleAddMembersToTeam","isUserSelected","AllUsersContainer","teamEditState","searchTeamAllUsers","searchTeamAllUsersDebounced","updatedUsersState","allUsers","isPartiallySelected","registrationsStatusLength","newSelectedUsers","Crown","handleGenerateTeamLeadersCountText","leadersCount","TeamLeaderCell","TeamLeaderIcon","ToggleWrapper","TeamMembers","orderByTeamLeader","handleTeamLeaderChange","deleteMemberLabel","onSuccessRemoveUsersBulkActionCallback","filterByRegistrationLength","deleteMembersFromTeamServiceOptions","deleteMembersFromTeamSuccessCallback","handleRemoveSelectedUsers","member","TeamMembersContainer","searchTeamMembers","searchTeamMembersDebounced","tableBodyContainerStyle","tableToolsWrapperStyle","searchInputStyle","DefaultTeamMembers","revokeLeaderDisabled","INFINITE_SCROLL","DefaultTeamMembersContainer","deleteLabelFromUser","StyledModalPage","DefaultBody","ManageTeam","teamMembersRef","allUsersRef","ManageTeamContainer","teamState","teamStateData","resetPage","updateTeamName","handleGoBack","NameContainer","NameInput","ActionContainer","ButtonDelimiter","CreateTeamView","onChangeName","CreateTeamController","SubmissionsStatus","ChartBox","ChartBoxTitle","ChartBoxBody","StyledChartBox","Statistics","BigText","SmallText","AccuracyTestsContainer","ProgressContainer","NumbersChartsBodies","VerticalBorder","Completion","passedScenarioCount","passedChallengeCount","NoChartData","customIcon","EmptySection","emptyText","ToolTip","positions","singleTitle","LineChart","singleLabel","containerRef","dimensions","setDimensions","setSelection","showToolTip","setShowToolTip","toolTipPositions","setToolTipPositions","header","toolTipContent","setToolTipContent","offsetWidth","scaleBand","calculateMaxYValue","maxYValue","scaleLinear","xAxis","axisBottom","tickValues","tickFormat","tickSizeOuter","yAxis","axisLeft","svg","attr","rect","bandwidth","BAR_WIDTH","on","clientY","call","ChartBoxHeader","ChartBoxDescriptionValue","ChartBoxDescription","DailyTimeSpentIcon","ChartBoxDescriptionValueStyled","ChartBoxDescriptionValueNormal","DailyTimeSpent","totalTime","ScenariosIcon","ChallengeIcon","TickIcon","StyledListBox","StyledScenarioItem","ItemType","ItemWithIconContainer","ItemContainer","ItemTitle","ItemStatus","ItemStatusGreen","ItemStatusBlue","ItemStatusGrey","RepsContainer","StatisticsValue","StatisticsIndicator","RepsDescription","AttemptText","ReviewButton","PlayScreenContainer","PlayScreen","PlayButton","StyledTickIcon","PlayTriangle","NoPlay","ScenarioListItem","enrollmentProgress","redirect","handleReviewReps","modeScenario","passed","inProgress","countReps","notStarted","countTries","ChallengeListItem","isSubmitted","ReportsItems","redirectScenario","redirectChallenge","REVIEWED","UPLOADING","PractisSetReport","onGetPractisSetReport","onResetPractisSetReport","closeNudgeDialog","handleNudge","getDueDateTitle","rep","num","timeSpent","PractisSetReportContainer","resetPractisSetReport","useGetScenarioRepsService","getScenarioRepsApi","GET_SCENARIO_REPS_START","GET_SCENARIO_REPS_SUCCESS","getScenarioRepsSuccess","GET_SCENARIO_REPS_FAILURE","getScenarioRepsFailure","useClearScenarionRepsService","CLEAR_SCENARIO_REPS","ScenarioRepsStateSelectorContext","borderTop","ScenarioRepsView","repGeneralNumber","setProgress","searchScenarioReps","clearScenarioReps","selectTrainerState","selectTainerPractisSetState","selectUpdatedProgressState","PractisSetsEnrollmentState","TrainerInvitationState","assignUsers","PractisSetReportsState","report","UsersState","AuthState","auth","InvitationsState","UserPerformanceState","UpdatedUsersState","UpdatedInvitationsState","UpdatedUserPractisSetsState","VoiceGenerationState","voiceGeneration","LibraryPractisSetsState","libraryPractisSets","UpdatedLibraryPractisSetsState","libraryUpdatedPractisSets","LibraryScenariosState","libraryScenarios","UpdatedLibraryScenariosState","libraryUpdatedScenarios","LibraryChallengesState","libraryChallenges","UpdatedLibraryChallengesState","libraryUpdatedChallenges","ChallengeState","SubmissionsState","SubmissionPaginationState","SubmissionDetailsState","submissionDetails","AccuracyScoreState","UpdatedSubmissionsState","CompanyVoiceSettingsState","companyVoiceSettings","LabelsState","LabelsConfigState","labelsConfig","UpdatedLabelsState","SelectPermissionsState","SelectLogsState","SelectTelepromterState","telepromter","DraftsState","DraftEditState","UpdatedDraftsState","SelectAiLogsState","TeamsState","UpdatedMembersState","updatedMembers","UpdatedTeamsState","TeamMembersState","TeamsEditState","RolesState","CompanyAdminsState","companyAdmins","CompanyUserStatsState","companyUserStats","ReportsState","reports","OverdueLearnersState","overdueLearners","ScenarioRepsState","scenarioReps","RoleplaysState","roleplays","RoleplayState","roleplay","TraineeInvitationActions","Published","useTraineeInvitationActionHelpers","canUpdateDueDate","createTraineeInvitationActionHelper","findSelectedTraineeDueDate","selectedTraineeId","menuPaperStyle","DueDateListAction","setAnchorEl","MenuListProps","PaperProps","TraineeQuickAssignment","selectedTrainees","updateSelectedTrainees","updateAllSelectedTrainees","searchTrainees","onEnrollPractisSetsToUsers","localLabels","useLocalLabelsState","setLabelSelect","localSelectedLabels","onChangeOrderBy","atFirstName","atRegisteredOn","disabledAssign","setDisabledAssign","loadingAssign","setLoadingAssign","updateAllTraineesCheck","enrollmentParams","selectedTrainee","selectAllDueDate","handleCreateEnrollmentsBulkActionSuccess","handleCreateEnrollmentsBulkActionService","traineesToClear","clearLabelFilters","saveLabelFilters","dueDateSet","onLocalRemoveLabels","handleTraineeCheck","TraineeQuickAssignmentContainer","searchAssignUsersDebounced","enrollPractisSetsToUsers","updateAllSelectedInvitationTrainees","TraineeInvitation","initialTeamMembersSearchParams","TraineeInvitationContainer","MainImage","ErrorMessage","NoPlayIcon","BlankVideoView","BlankVideo","BlockSection","TopContainer","TopInfo","TopTitle","TopDescription","BottomTitle","BottomDescription","isError","BrokenSharedLinkView","wssurl","BrokenSharedLink","TextEllipsis","CloseWrapper","TopWrapper","ScoreWrapper","UserWrapper","PractisSetTitle","UserTextWrapper","DateWrapper","PlaybackVideo","videoDownloading","isLoadingError","userFullName","PlaybackScreen","setVideoDownloading","copyAccuracyLink","useCopyAccuracyLink","FilledCircle","ProgressModal","progressValue","thickness","OnboardingRole","socket","WebSocket","PAGE_KEYS","ProgressPage","setIsOpen","socketConnetion","setSocketConnection","close","keyArray","perc","onerror","readyState","SOCKET_PROGRESS_HIDE","OnboardingContent","OnboardingText","OnboardingGreeting","OnboardingTitle","OnboardingDescription","DownloadButtons","UserOnboardingView","isTablet","isDesktop","appStoreImage","googlePlayImage","mainImagePhone","mainImagePhone2x","mainImagePhone3x","mainImageTablet","mainImageTablet2x","mainImageTablet3x","mainImageDesktop","mainImageDesktop2x","mainImageDesktop3x","OnboardingButton","AdminOnboardingView","onRedirect","DownloadTitle","TeamLeaderOnboardingView","Onboarding","handleRedirect","ADMIN","AdminOnboarding","TEAM_LEAD","TeamLeaderOnboarding","UserOnboarding","InvalidInvite","brokenLink","EnterMobileNumberView","canSkip","onSendCode","onSkip","onMobileNumberChange","EnterMobileNumberController","confirmUserPhoneNumber","AddMobileNumberView","currentStep","onBackFromVerify","ENTER","EnterMobileNumber","AddMobileNumberController","AddMobileNumber","initialVerificationStep","setCurrentStep","setCanSkip","finalizeVerification","tempToken","handleBackFromVerify","pushState","TextSection","TraineeSplashView","TeamMembersFilter","NoMembers","TeamMembersIcon","viewProfileHandler","onSendNudge","getMembersReportService","onDeleteMember","canRemoveTeamLeader","Corona","StyledAvatarPlaceholder","StyledCoronaIcon","NameAdditionalInfo","itemsOnPage","teamUpdateState","onNudgeMembers","markTeamAsViewed","deleteMembersFromTeamService","lastRefreshedDate","setLastRefreshedDate","bulkRemoveDisabled","hcTeamMembers","hcTraining","hcCompletedEnrollmentCount","hcProgressEnrollmentCount","hcPendingEnrollmentCount","refreshHandler","onSinglePractisExportClicked","memberId","onDeleteTeamMembersSuccessCallback","CLEAR_TEAM_UPDATE_STATUS","handleDeleteTeamMembers","handleDeleteTeamMembersSingleAction","getAdditionalMemberInfo","REMOVE_TEAM_MEMBER","trainingStatus","enrollmentNotStarted","enrollmentEnrolled","enrollmentCompleted","isBefore","getFormattedLastTrainingAt","updatedMembersState","getMembersReportApi","useGetMembersReportService","markTeamAsViewedService","markTeamAsViewedApi","useMarkTeamAsViewedService","TeamsPageController","prevTeamId","searchTeam","resetTeamInfo","fetchTeamData","justify","ActionWarningContainer","WarningText","StopBulkActionModalView","FailedModalView","getChunkServiceState","chunkService","chunkServiceReducer","StopWarning","ProgressModalView","onStopProgressModal","handleClickAwayProgressModal","getModalDialogsState","modalDialogs","modalDialogsReducer","ConfirmationModalView","ModalDialogsController","isStopBulkActionModalOpen","setIsStopBulkActionModalOpen","handleStopBulkActionServiceModal","handleCancelClick","modalComponent","OldSubmissionRouterController","singleRoute","allRoute","getSubmissionIdByOldId","OldSubmissionRouter","OldAccuracyTestController","OldAccuracyTest","OldChallengeController","OldChallenge","ReportType","useGetReportsService","getReportsApi","useGetReportsApi","GET_REPORTS_START","GET_REPORTS_SUCCESS","getReportsSuccess","GET_REPORTS_FAILURE","getReportsFailure","ReportsStateSelectorContext","PractisSetSummary","TeamLeaderSummary","mask-type","UserActivity","BillingReport","DATE_RANGE_PARAM_NAME","getLastWeekDateRangeParam","TrainingTime","LOADING_ITEMS","ReportInfoMap","PRACTIS_SET_SUMMARY","resultFormat","USERS_ACTIVITY","TEAM_LEADER_ACTIVITY","BILLING","TRAINING_TIME","ResultFormat","ReportingCardView","ReportingCard","CardContainer","CardIcon","SingleTextLine","RoundSkeleton","TextLine","ReportingCardSkeletonView","FilterSkeletonView","ReportsView","ReportsController","Reports","getReports","reportsState","FieldName","AdvancedSettingsHeader","AdvancedSettingsTitle","ResetButton","AdvancedFieldContainer","QuestionContainer","TooltipContainer","TootlipTitle","TootlipContent","SampleTextContainer","Subheader","RoleplayCard","isDotMenuVisible","SkeletonContainer","NoRoleplayLink","OwnerName","SidebarRoleplaysLarge","useGetRoleplaysService","getRoleplaysApi","useGetRoleplaysApi","GET_ROLEPLAYS_START","GET_ROLEPLAYS_SUCCESS","getRoleplaysSuccess","GET_ROLEPLAYS_FAILURE","getRoleplaysFailure","RoleplaysStateSelectorContext","BodySkeletonContainer","RoleplayContainer","RoleplaySkeletonContainer","LineSkeleton","HeaderSkeletonContainer","bodyLineWidths","lineWidths","RoleplaySceleton","useGoogleAnalyticsEvents","gtag","category","userInformation","eventPayload","event_category","useGoogleAnalyticsWithRoleplay","sendEvent","additionalData","UserID","Email","CompanyID","CompanyName","Environment","RoleplaysController","Roleplays","getRoleplays","duplicateRoleplay","deleteRoleplay","rolepayIds","useDeleteRoleplayApi","trackEventWithRoleplay","infoPanel","roleplaySeachTrackEvent","handleCreateRoleplay","handleDeleteRoleplay","canCreateRoleplay","NoEntryText","owner","SearchableFilterHeaderKey","setFilterHeaderSearchTerm","SET_FILTER_HEADER_SEARCH_TERM","useSetFilterHeaderSearchActive","isSearchActive","SET_FILTER_HEADER_SEARCH_ACTIVE","setFilterHeaderSearchActive","selectPractisSet","selectedPractisSetId","SELECT_PRACTIS_SET","useClearSelectedPractisSet","useDisablePractisSetFilter","DISABLE_PRACTIS_SET_FILTER","disablePractisSetFilter","selectSingleTeam","selectedTeamId","SELECT_SINGLE_TEAM","initialSingleTeamFilterState","useSingleTeamFilterState","singleTeamFilterReducer","useClearSelectedTeam","useDisableSingleTeamFilter","DISABLE_SINGLE_TEAM_FILTER","disableSingleTeamFilter","COUNTDOWN_DATE_KEY","useGenerateReportService","interval","valueInterval","unmount","sessionStorage","startDateFromStorage","diffInMiliseconds","diffInSeconds","useCountdown","remainingTimeout","startCountDown","isGenerating","setIsGenerating","generateReportApi","reportType","reportData","useGenerateReportApi","generateReport","useGetReportAvailabilityService","isAvailable","setIsAvailable","getReportAvailabilityApi","useGetReportAvailabilityApi","getReportAvailability","available","InfoText","EmailText","ReportingControlPanelView","isSubmitLoading","submitText","isClearDisabled","clearText","onClear","ReportingControlPanelController","ReportingControlPanel","useQueryParamListener","paramValueRef","useSetQueryParam","PRACTIS_SET_QUERY_PARAM_NAME","NoReportingPractisSets","TitleSkeleton","SubHeader","FilterHeaderView","initialFilterHeaderState","SINGLE_TEAM","MULTIPLE_TEAMS","LABELS","useFilterHeaderState","filterHeader","SearchInputView","SearchInputController","onExit","handleKeyDown","handleBlur","ShowSearch","IconSkeleton","InputContainer","SearchButtons","ClearButton","ClearSeparator","SearchClose","SearchableFilterHeaderView","hasSearch","showSearchInput","onShowSearch","onHideSearch","onSearch","SearchableFilterHeader","storeKey","setSearchActive","useSetFilterHeaderSearchTerm","prevSearchTerm","handleShowSearch","handleHideSearch","handleClear","onSearchDebounced","FilterContainerView","headerProps","searchableHeaderProps","PractisSetFilterView","isNoSearchResultState","onPractisSetSearch","handleSelectPractisSet","initialPractisSetFilterState","usePractisSetFilterState","practisSetFilterReducer","PractisSetFilterController","prevSelectedTeamId","clearSelectedPractisSet","onSelectPractisSet","useSelectPractisSet","setQueryParam","setSelectedPractisSetInStore","setSelectedPractisSet","searchByTeamId","handleSearch","SINGLE_TEAM_QUERY_PARAM_NAME","SingleSelectTeamFilterView","onTeamSearch","onTeamSelect","SingleSelectTeamFilterController","selectSingeTeam","useSelectSingleTeam","clearSelectedTeam","setSelectedTeamInStore","setSelectedTeam","handleTeamSearch","TEAMS_QUERY_PARAM_NAME","SELECT_MULTIPLE_TEAMS","initialMultipleTeamsFilterState","selectedTeamIds","useMultipleTeamsFilterState","multipleTeamsFilter","useClearMultipleTeams","useDisableMultipleTeamsFilter","DISABLE_MULTIPLE_TEAMS_FILTER","disableMultipleTeamsFilter","useClearMultipleTeamsFilter","clearMultipleTeams","setMultipleTeamsSearchActive","CounterContainer","SelectionCounter","ToggleAllSelection","ListContainer","MultipleSelectTeamsFilterView","onTeamToggle","onAllToggle","isSelected","MultipleSelectTeamsFilterController","setSelectedTeamsInStore","handleTeamToggle","newTeamIds","handleAllToggle","LABELS_QUERY_PARAM_NAME","labelsFilterReducer","DISABLE_LABELS_FILTER","ChildContainer","LabelsFilterItemView","LabelsFilterItemController","openLabels","onSelect","LabelsFilterView","isInSearch","onToggleAll","LabelsFilterController","labelsFilter","toggleCollapseAll","resetCollapsed","processedLabels","setSelectedLabels","handleToggleAll","useMonthFilterState","monthFilter","useSelectYear","SELECT_YEAR","selectYear","useSelectMonth","SELECT_MONTH","selectMonth","useClearYearAndMonth","CLEAR_YEAR_AND_MONTH","useDisableMonthFilter","DISABLE_MONTH_FILTER","disableMonthFilter","Underline","MonthItemView","data-text","MONTHS","MonthSelectorView","isDisabledMonth","isSelectedMonth","isCurrentMonth","onSelectMonth","MonthSelector","selectedYear","selectedMonth","currentYear","presentYear","presentMonth","handleSelectMonth","YearLeftArrow","YearRightArrow","Year","YearSelectorView","isNextAvailable","isPrevAvailable","onNext","onPrev","YearSelector","minYear","handlePrev","handleNext","MONTH_DATE_QUERY_PARAM_NAME","MonthSelectorContainer","MonthFilterView","onSelectYear","MonthFilter","currentOrPresentYear","useDateRangeState","dateRange","useSelectDateRange","SELECT_DATE_RANGE","selectDateRange","useResetDateRange","CLEAR_DATE_RANGE","ClearText","DateFilterView","handleSelectDate","resetDate","DateRangeFilter","resetReduxDateRange","resetDateRange","useRemoveQueryParam","endOf","DynamicFilterComponentList","SINGLE_SELECT_TEAM","MULTIPLE_SELECT_TEAMS","MONTH","DATE","DynamicFilterController","filterType","headerHeight","DynamicFiltersContainer","DynamicFilterWrapper","StyledDivider","ControlPanelContainer","FiltersSidebarView","filtersConfig","onGenerateReport","onClearFilters","controlPanelMode","FiltersSidebarController","PractisSetSummaryReportFiltersConfig","PractisSetSummaryReportSubHeader","PractisSetSummaryReportView","PractisSetSummaryReportController","clearTrainerPractisSetData","clearSingleTeamFilter","clearSelectedSingleTeam","setSingleTeamSearchActive","useClearSingleTeamFilter","clearPractisSetFilter","setPractisSetSearchActive","useClearPractisSetFilter","isCalledFromUnmount","statusMap","noData","handleGeneratePractisSetSummaryReport","UserActivityReportFiltersConfig","UserActivityReportView","useClearLabelsFilter","setLabelsSearchActive","useDisableLabelsFilter","disableLabelsFilter","UserActivityReportController","isTeamsLoading","isLabelsLoading","clearMultipleTeamsFilter","clearLabelsFilter","handleClearFilters","getReportParams","handleGenerateReport","UserActivityReportWithLabelsContext","TeamLeaderActivityReportFiltersConfig","TeamLeaderActivityReportView","BillingReportFiltersConfig","TeamLeaderActivityReportController","clearDateRangeFilter","BillingReportView","BillingReportController","clearYearAndMonth","DetailsNav","Seats","LogoNav","Voice","ValidationSchema","NAME_ALREADY_EXISTS_ERROR","API_ERROR_MESSAGE","FormikSelect","showError","SuffixContainer","hasSuffix","isMaxLengthExceeded","Suffix","encodeStringForAttribute","maxLenght","maxWords","encodedValue","words","CustomizedInputView","remainingLength","hasCounter","CustomizedInput","transformValue","isTouched","targetValue","CompanyDetailsView","companyAdminItems","onApiResultValidation","CompanyDetails","onCompanyUpdate","nameApiError","setNameApiError","getCompanyAdmins","useGetCompanyAdmins","updateCompanyNameApi","setCompanyOwnerApi","useClearCompanyAdmins","emptyItem","mainItems","admin","workspaceUrl","subdomain","handleApiResultValidation","handleError","validateForm","resetForm","TipText","Counts","CompanyUserStatsInfoView","registered","pending","deactivated","CompanyUserStatsInfo","CompanyUserLimitView","CompanyUserLimit","hasFooter","LinkInfo","companyLogoUploader","NextButtonIcon","CompanyUpdateLogoView","showGuidelines","deleteLogo","CompanyUpdateLogo","setIsInProgress","uploadCompanyLogo","setCompanyLogoApi","useUploadLogoService","deleteCompanyLogo","RoleItems","RangeSliderContainer","RangeInput","formatLabel","decimals","countDecimals","minValue","draggableTrack","formatStabilityLabel","formatSimilarityLabel","Sound","isFocused","VoiceSampleTextView","canPlay","blobUrl","audioRef","setIsFocused","onAudioLoaded","onPlay","onLoadedData","onEnded","VoiceSampleText","onAction","setStatus","setBlobUrl","resultValue","val","handleAudioLoaded","similarity","PartialVoiceSettingsView","voiceItems","initialSampleText","canReset","getFieldName","onReset","onSampleAction","upperFirst","PartialVoiceSettings","voices","defaultSimilarity","defaultStability","defaultVoiceId","voice_id","item1","item2","handleReset","StyledSkeleton","InputSkeleton","TwoElementsContainer","VoiceSettingsSkeleton","CompanyVoiceView","initialFormValues","canChange","onChangeRole","CompanyVoice","setRole","setVoices","isSampleInProgress","setIsSampleInProgress","setCompanyVoiceSettingsApi","CompanySettingsView","createNavigationDescriptor","isCompanyLoaded","CompanySettings","loadCompany","TrainingTimeReportFiltersConfig","TrainingTimeReportView","TrainingTimeReportController","TrainingTimeReportWithLabelsContext","ObjectiveIcon","ObjectiveIconActive","ProductIcon","ProductIconActive","ProspectIcon","ProspectIconActive","SituationIcon","SituationIconActive","SalesMethologies","AIParamSelect","tooltip","analyticsKey","RequiredText","TextAreaContainer","ParamsContainer","TextContainer","AIParamTextbox","isRequired","isInvalid","warningText","setWarningText","ObjectiveAiParam","roleplayData","objectiveRep","objectiveNuances","salesMethod","ProductAiParam","emptyRequiredProps","product","ProspectAiParam","prospect","SituationAiParam","situation","RouteSettings","iconActive","routeComponents","initialRolePlayData","keysForGA","requiredContextParams","RoleplayCreate","activePage","setActivePage","setRoleplayData","setEmptyRequiredProps","createRoleplay","useCreateRoleplayApi","routes","isValidForm","handlePrevNext","keyGA","InfoIcon","useWebSocket","setResponse","socketRef","currentConnection","API_SOCKET_ENDPOINT","createWebSocket","newSocket","closeConnection","sendMessage","OPEN","send","BodyContainer","ContextContainer","fullHeight","NoEntryContainer","IconCountainer","ModalBody","ModalText","ContentPanelContainer","BtnCont","Contentbox","ContentBoxContainer","ContentItem","Img","TextBox","Author","Message","Sendbox","SendBoxContainer","DateText","BtnContainer","SpinnerContainer","StopIcon","MenuButton","RoleplayMenuDots","RegenerateBtn","CommandContainer","CommandBox","ErrorBox","WarningBtnContainer","BlueDot","StopGenIcon","SendActive","SendIcon","isWarning","CheckContainer","SendContainer","TextInputWithButtons","isLimitReached","RefreshCircle","WarningIcon","RoleplayStateSelectorContext","useRoleplayState","commandTexts","commandPattern","formatConversationToClipboard","formattedConversation","CustomerAvatar","ContentLoading","RefreshCircleDisabled","useGetRoleplayService","getRoleplayContent","GET_ROLEPLAY_START","rp","GET_ROLEPLAY_SUCCESS","getRoleplaySuccess","GET_ROLEPLAY_FAILURE","getRoleplayFailure","useUpdateRoleplayService","updateRoleplayApi","useUpdateRoleplayApi","createCommand","UPDATE_ROLEPLAY_START","UPDATE_ROLEPLAY_SUCCESS","updateRoleplaySuccess","UPDATE_ROLEPLAY_FAILURE","updateRoleplayFailure","useClearRoleplayService","CLEAR_ROLEPLAY","LoadingAudio","ContentPanel","contentData","revertCommand","stopIsDisabled","sendCommand","regenerateRoleplayApi","useRegenerateRoleplayApi","reportedLines","useGenerateAudioForRoleplay","setMessage","messagesContainerRef","lastItemRef","observedDivRef","observedHeight","setObservedHeight","userScrolled","setUserScrolled","handleUserScroll","lastItem","containerBottom","lastItemBottom","audioFiles","setAudioFiles","audioStatus","setAudioStatus","sendCustomCommand","CharacterLimit","isOwner","regenerateRoleplay","isRetry","downloadFile","roleplayConversation","downloadTxtFile","conversationId","stopAudioPlaying","playAudioBlobs","oldState","blobs","currentAudioIndex","audioBlob","Audio","currentAudio","getHighlightedText","splitText","matches","elements","part","topPosition","observedDiv","resizeObserver","ResizeObserver","entry","contentRect","observe","unobserve","contentItem","isFinished","roleplayText","copyClipboard","shiftKey","headerWidth","subHeaderWidth","BodySkeleton","ContextPanel","rpdata","Situation","Prospect","Objective","PencilIconActive","HeaderSkeleton","RoleplayHeader","updateRoleplay","editmode","closeEditMode","isRequiredTitle","RoleplayInfoModal","RoleplayPage","getRoleplay","clearRoleplay","generateRoleplay","useGenerateRoleplayApi","resetRoleplayApi","useResetRoleplayApi","setIsEditMode","isLastError","setLastError","setStopIsDisabled","actionSent","setActionSent","setContentData","showInfoPanel","setShowInfoPanel","revertRoleplayApi","useRevertRoleplayApi","edittedRoleplay","setEdittedRoleplay","hasContent","getContent","isAdmin","generateFirstRoleplay","isStop","showDiscardModal","socketResponse","dataItem","updatedConversation","existingItemIndex","cancelChanges","Auth0Callback","authZeroTokenTypeApi","handleRedirectToLoginPage","hash","accessToken","access_token","handleAccessToken","App","mobileDeepLinkRoutes","keyName","tagId","colorStyles","sheet","prepend","generateColorVariables","LogOut","Register","Registration","ForgotPassword","ResetPassword","TraineeSplash","HealthPage","TeamsPage","PractisSetSummaryReport","UserActivityReport","TeamLeaderActivityReport","TrainingTimeReport","CreateTeam","APP_CONFIG","API_CLIENT","API_V2_BASE_URL","CHATGPT_API_KEY","ADMIN_PORTAL_BASE_URL","COMPANY_PORTAL_BASE_URL","S3_FILES_BASE_URL","NEW_RELIC_LICENSE_KEY","NEW_RELIC_APP_ID","googleClientId","local","dev","beta","prod","MultiContextProvider","parseValidation","detail","DefaultHttp","isV2","dataInQuery","buildApiUrl","errorResult","validation","client","clientHeader","getToken","parseRawQueryString","parseQueryString","rawQuery","v","flatQueryValue","getQueryStringFromUrl","setQueryParameterToUrl","parsedUrl","resultQuery","setQueryObjectToUrl","getCurrentUrl","DefaultUrlBuilder","o","buildUrl","companyBaseUrl","adminBaseUrl","apiV2BaseUrl","apiBaseUrl","baseUrl","replaceParam","joinSegments","segments","DefaultNewRelic","newRelicLicenceKey","newRelicAppId","DefaultLocalStorage","loggedOutRoutes","logOut","AuthStateSelectorContext","SocketProgressSelectorContext","SocketProgressState","searchStateSelectorContext","SearchState","contextItem","hostname","FETCH_TIMEZONES","FETCH_TIMEZONES_SUCCESS","FETCH_TIMEZONES_FAILURE","timeZones","globalReducers","newTimeZoneList","timeZone","initialTeamsState","allTeamsReducer","selectedTeamIndex","initialTeamEditState","teamEditReducer","toUTCString","currentTeamMembers","updatedTeamMembers","currentTeam","teamLeader","SET_ASSIGNED_LABELS_TO_SINGLE_TEAM","SET_DELETED_LABELS_TO_SINGLE_TEAM","initialUpdateTeamState","initialUpdateMemberState","teamMembersInitialState","teamMembersReducer","trainerPractisSetsReducer","selectedPractisSetIndex","initialEnrollmentsState","initialPractisSetReportState","initialUpdatedProgressState","initialInvitationState","assignUsersReducer","updatedArray","UPDATE_TRAINEE_DUE_DATE","traineeItems","progressReducer","combineReducers","UPDATE_PROGRESS_START","UPDATE_PROGRESS_FAILURE","initialChallengeState","initialSubmissionsState","initialAccuracyScoreState","withScenariosInitialState","submissionsReducer","UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS","accuracyScoreReducer","initialLabelsState","initialLabelsConfigState","initialUpdatedLabelsState","initialTelepromterState","initialAiLogsState","initialDraftEditState","draftEditReducer","updatedDataItems","isEmailDuplicated","isRoleInvalid","drafted","loadingUpdate","portableLabelsReducer","initialLibraryPractisSetsState","libraryPractisSetsReducer","separateAssignedPractisSets","UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS","initialLibraryScenariosState","libraryScenariosReducer","UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS","initialLibraryChallengesState","libraryChallengesReducer","GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START","GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS","GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE","UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS","appReducer","errorAllCompanies","loadingAllCompanies","allCompanies","activeCompaniesError","UPDATE_MEMBER_START","UPDATE_MEMBER_FAILURE","UPDATE_USER_PRACTIS_SETS_START","UPDATE_USER_PRACTIS_SETS_SUCCESS","UPDATE_USER_PRACTIS_SETS_FAILURE","updatedLines","newLine","metadata","createdScriptLine","newScriptLines","newScriptLinesArr","newLines","UPDATE_SCENARIO_CASE","temp_data","newPlaylist","global","foundIdx","newData","labelsData","FETCH_FULL_LABELS_LIST_START","FETCH_FULL_LABELS_LIST_SUCCESS","FETCH_FULL_LABELS_LIST_FAILURE","newLabels","selectedDraftIds","selectedDraftIndex","SEARCH_AI_LOGS_DISPOSE","updatedItem","stateByKey","rootReducer","GlobalStyle","createGlobalStyle","PortableLoaderWrapper","fetchLabels","fetchTeams","prevAppVersion","newAppVersion","currentUrl","replaceState","configStorage","appConfig","newRelicApi","store","thunkContext","middlewareEnhancer","applyMiddleware","thunk","withExtraArgument","composedEnhancer","composeSource","reduxCreateStore","createStore","configServices","rootElement","contextItems","createContexts","ReactDOM","DateFnsUtils","serviceWorker","registration","unregister"],"mappings":"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,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAGSC,EACT,0JCxNG,SAASC,EAAclsD,GAC1B,GAAI6yC,kBAAQ7yC,GACR,OAAO,EAGX,GAAIisD,EAAgBjjB,KAAKhpC,IAetB,SAAuBmsD,GAC1B,IAAK,IAAIvoC,EAAI,EAAGA,EAAIooC,EAAe5pC,OAAQwB,IACvC,GAAIuoC,EAAOC,SAASJ,EAAepoC,IAC/B,OAAO,EAGf,OAAO,EAlBCyoC,CADWrsD,EAAMssD,MAAM,KAAK,IAE5B,OAAO,EAGf,OAAO,EClBJ,IAAMC,EAAsB,+BAE7BC,EAAQ,CACVC,SAAUC,WAAaC,IAAI,IAAjB,4CACVpe,YAAame,WAAaC,IACtB,IADS,oDAIbC,oBAAqBF,WAChB3jB,OACA4jB,IAAI,IAFY,oDAGhBE,SAAS,4BACd7pD,UAAW0pD,WACXrpD,QAASqpD,WACTI,iBAAkBJ,WAAaC,IAC3B,IADc,kDAIlBve,UAAWse,WACN3jB,OACA4jB,IAAI,GAFE,+DAGNE,SAAS,0BACdve,SAAUoe,WACL3jB,OACA4jB,IAAI,GAFC,8DAGLE,SAAS,yBACdE,SAAUL,WACLC,IAAI,IAAK,gDACTE,SAAS,wBACd3sD,SAAUwsD,WACLvqC,IAAI,EAAG,uCACP0qC,SAAS,mCACdG,cAAeN,WAAaG,SAAS,mCACrCI,gBAAiBP,WACZQ,MACG,CAACR,MAAQ,YAAa,MACtB,iDAEHG,SAAS,iCACdM,gBAAiBT,WACZvqC,IAAI,EAAG,wDACP0qC,SAAS,iCACd7sD,MAAO0sD,WACFC,IAAI,IAAK,sDACT3jB,KAAK,iBAAkBujB,GAAqB,SAAAj3C,GACzC,OAAO42C,EAAc52C,MAExBu3C,SAAS,wCACdO,UAAWV,WACNC,IAAI,IAAK,sDACT3sD,MAAMusD,GACNM,SAAS,wCACd/jD,YAAa4jD,WAAaG,SAAS,uCACnCQ,WAAYX,WACZxe,eAAgBwe,WAChBY,aAAcZ,WAAaG,SAAS,4BACpCj5C,MAAO84C,WACPjpD,KAAMipD,WAAaG,SAAS,oBAC5BU,SAAUb,UACL1jB,KAAK,WAAY,0BAA0B,SAAA1zB,GAAK,OAAIA,EAAMxB,MAAQ,MAClEk1B,KAAK,WAAY,2BAA2B,SAAA1zB,GAAK,MAC9C,CAAC,uBAAuB6L,SAAS7L,EAAM7K,SAE/C61C,SAAU,CACNnI,YAAauU,WACRG,SAAS,2BACTF,IAAI,IAAK,kCACda,aAAcd,WACTG,SAAS,4BACTF,IAAI,IAAK,oCAIPH,O,6BC7Ef,+CAEa/mC,EAAa,SAStBgoC,GAEA,IAAKA,EACD,MAAO,GAQX,IALA,IAGI9mC,EAHE+mC,EAAiBtsB,KAAKC,MAAMD,KAAKG,UAAUksB,IAC3C/8C,EAA8B,GAC9Bi9C,EAAQ,GAGL/pC,EAAI,EAAGA,EAAI8pC,EAAUtrC,OAAQwB,GAAK,EACvClT,EAAIg9C,EAAU9pC,GAAG1U,IAAM0U,EACvB8pC,EAAU9pC,GAAGzQ,SAAW,GAE5B,IAAK,IAAIyQ,EAAI,EAAGA,EAAI8pC,EAAUtrC,OAAQwB,GAAK,EAIvC,GAHA8pC,EAAU9pC,GAAGgqC,aAAeC,YAAaJ,EAAK7pC,GAAGzkB,MAAQ,KACzDwnB,EAAO+mC,EAAU9pC,IAERI,UAAY0pC,EAAUh9C,EAAIiW,EAAK3C,WAAY,CAChD,IAAM7Q,EAAWu6C,EAAUh9C,EAAIiW,EAAK3C,WAAW7Q,SAC3CA,GACAA,EAAS+T,KAAKP,QAGlBgnC,EAAMzmC,KAAKP,GAInB,OAAOgnC,I,6BCtCX,kiBAuBaG,EAAyC3rB,IAAM/tB,eAE1D,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS8+C,IACZ,OAAOhlC,YAAY1U,qBAAWy5C,IAG3B,SAASE,EAA0Bz8C,GAAgD,IAAD,EACrF,OAAO0kC,YAAgB,OAAc1kC,QAAd,IAAcA,OAAd,EAAcA,EAAO08C,oBAArB,OAA0C18C,QAA1C,IAA0CA,GAA1C,UAA0CA,EAAO3P,YAAjD,aAA0C,EAAa+f,OAS3E,IAAMusC,EAA2CC,cAIjD,SAASC,IACZ,OAAOrlC,YAAY1U,qBAAW65C,IAe3B,IAAMG,EAAuClsB,IAAM/tB,eAExD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAASq/C,IACZ,OAAOvlC,YAAY1U,qBAAWg6C,IAG3B,SAASE,EAAwBh9C,GAA2C,IAAD,EAC9E,OAAO0kC,YAAgB,OAAW1kC,QAAX,IAAWA,OAAX,EAAWA,EAAOi9C,kBAAlB,OAAqCj9C,QAArC,IAAqCA,GAArC,UAAqCA,EAAO3P,YAA5C,aAAqC,EAAa+f,OAStE,IAAM8sC,EAAyCN,cAI/C,SAASO,IACZ,OAAO3lC,YAAY1U,qBAAWo6C,IAe3B,IAAME,EAAwCxsB,IAAM/tB,eAEzD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS2/C,IACZ,OAAO7lC,YAAY1U,qBAAWs6C,IAG3B,SAASE,EAAyBt9C,GAA6C,IAAD,EACjF,OAAO0kC,YAAgB,OAAY1kC,QAAZ,IAAYA,OAAZ,EAAYA,EAAOu9C,mBAAnB,OAAuCv9C,QAAvC,IAAuCA,GAAvC,UAAuCA,EAAO3P,YAA9C,aAAuC,EAAa+f,OASxE,IAAMotC,EAA+CZ,cAIrD,SAASa,IACZ,OAAOjmC,YACH1U,qBAAW06C,M,8BCnInB,kBAGaE,EAAYphD,sBACrB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,sBACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGU,SAAS,UAAUD,KAAK,eAA3B,SACI,4BACI,sBACIE,EAAE,kTAWfigD,O,6BC7Bf,kBAGaC,EAAUrhD,sBACnB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,sBACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGU,SAAS,UAAUD,KAAK,eAA3B,SACI,4BACI,sBACIE,EAAE,+SAWfkgD,O,qTCzBHvgB,E,kCAAAA,K,YAAAA,E,8BAAAA,E,+BAAAA,M,KAML,IAyEKwgB,EAzECC,EAAkB,CAC3B,CACIlsD,KAAMyrC,EAAU35B,KAChB4T,YAAa1U,IAAgBm7C,aAEjC,CACInsD,KAAMyrC,EAAU55B,cAChB6T,YAAa1U,IAAgBmB,uBAIxBi6C,EAAqC,SAC9CC,EACA3mC,GAEA,OAAO2mC,EACF3sC,QAAO,SAAAnf,GACJ,OAAO2rD,EAAgBphB,MACnB,SAAAnrB,GAAI,OACAA,EAAK3f,OAASO,EAAKP,MACnB0lB,EAAYzH,SAAS0B,EAAK+F,mBAGrClY,KAAI,SAAAjN,GACD,MAAO,CACH6R,MAAO7R,EAAKyL,GACZhM,KAAMO,EAAKmQ,UAEhBylC,WAGEmW,EAAkB,SAC3BD,GAEA,OAAOA,EACF3sC,QAAO,SAAAnf,GACJ,OAAO2rD,EAAgBphB,MACnB,SAAAnrB,GAAI,OACAA,EAAK3f,OAASO,EAAKP,WAG9BwN,KAAI,SAAAjN,GACD,MAAO,CACH6R,MAAO7R,EAAKyL,GACZhM,KAAMO,EAAKmQ,UAEhBylC,WAGEoW,EAAsB,SAC/BlmB,EACAgmB,GAEA,GAAKhmB,GAAWgmB,EAAUntC,OAA1B,CAEA,IAAM3e,EAAO8rD,EAAUvhB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOq6B,KAChD,GAAK9lC,EAEL,OAAOA,EAAKmQ,QAGH87C,EAAsB,SAC/B1hC,EACAuhC,GAEA,GAAKvhC,GAAauhC,EAAUntC,OAA5B,CAEA,IAAM3e,EAAO8rD,EAAUvhB,MAAK,SAAAnrB,GAAI,OAAIA,EAAKjP,QAAUoa,KACnD,GAAKvqB,EAEL,OAAOA,EAAKyL,M,SAGJigD,K,sBAAAA,E,oBAAAA,E,cAAAA,E,aAAAA,M,KAOZ,IAkBYQ,EAlBNC,GAAc,mBACfT,EAAW/gB,UAAsB,cADlB,cAEf+gB,EAAW7gB,SAAqB,aAFjB,cAGf6gB,EAAWnvD,MAAkB,SAHd,cAIfmvD,EAAW1rD,KAAiB,QAJb,GAOO,mBACtBmsD,EAAexhB,UAAsB+gB,EAAW/gB,WAD1B,cAEtBwhB,EAAethB,SAAqB6gB,EAAW7gB,UAFzB,cAGtBshB,EAAe5vD,MAAkBmvD,EAAWnvD,OAHtB,cAItB4vD,EAAensD,KAAiB0rD,EAAW1rD,O,SAOpCksD,K,8CAAAA,E,8DAAAA,M,KAKL,IAAME,EAA4B,SAACC,EAAYjtC,GAClD,IAAIktC,EAAaD,EAAK,YAAOA,GAAS,GAWtC,OATIC,EAAW5uC,SAAS0B,GACpBktC,EAAaA,EAAWntC,QAAO,SAAAtU,GAAC,OAAIA,IAAMuU,KACnCktC,EAAW5uC,UAAU0B,IAC5BktC,EAAaA,EAAWntC,QAAO,SAAAtU,GAAC,OAAIA,KAAOuU,MAChCqE,KAAKrE,GAEhBktC,EAAW7oC,KAAKrE,GAGbktC,GAaEC,EAA0C,SAACC,EAAqDC,GACzG,IAAIC,EAA8BF,EAA0B,YAAOA,GAA8B,GAWjG,OATIE,EAA4Bz/C,KAAI,SAAApC,GAAC,OAAIA,EAAEvJ,gBAAcoc,SAAS+uC,GAC9DC,EAA8BA,EAA4BvtC,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,eAAiBmrD,KAClFC,EAA4Bz/C,KAAI,SAAApC,GAAC,OAAIA,EAAEvJ,gBAAcoc,UAAU+uC,IACtEC,EAA8BA,EAA4BvtC,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,gBAAkBmrD,MAC9DhpC,KAAK,CAAEniB,aAAcmrD,EAAsBnd,QAAS,OAEhFod,EAA4BjpC,KAAK,CAAEniB,aAAcmrD,EAAsBnd,QAAS,OAG7Eod,I,6BClJJ,IAAK9O,EAAZ,kC,SAAYA,K,cAAAA,E,gBAAAA,E,oBAAAA,E,mBAAAA,M,mwBCCC+O,EAAmB3gD,IAAOC,IAAV,mNAKX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OACRA,EAAM0D,SACF1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAKpB+pC,EAAUnvB,IAAOC,IAAV,uKAMF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGjCy8D,EAAkB5gD,YAAO8sC,IAAO7sC,IAAdD,CAAH,oRAOV,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAElC,SAAA+b,GAAK,OACTA,EAAM2gD,YAAc,OAAW3gD,EAAM4gD,KAAO5gD,EAAM4gD,KAAO,OACtD,SAAA5gD,GAAK,OAAKA,EAAM2gD,YAAN,WAAwB3gD,EAAM6gD,UAA9B,MAA8C,SAOtDC,EAAUhhD,IAAOC,IAAV,kMASPghD,EAAsBjhD,IAAOC,IAAV,qDAInBitC,EAAcltC,IAAOC,IAAV,6GAIX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAG5B87D,EAAgBlhD,IAAOC,IAAV,qIAObmtC,EAAoBptC,IAAOC,IAAV,8FAEjB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACnC,SAAAyb,GAAK,QAAMA,EAAMihD,WAAR,sBAAoCjhD,EAAMihD,UAA1C,QAIFC,EAAwBphD,IAAOC,IAAV,oKAMR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAKzCw8D,EAAOrhD,IAAO0nB,KAAV,oEAEJ,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAuC5Bk8D,GApCoBthD,IAAOC,IAAV,8HAOUD,IAAOC,IAAV,uJAQTD,IAAOC,IAAV,4GAGZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAIZsb,IAAOC,IAAV,oHAGb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAINsb,IAAOC,IAAV,qHAEnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKCsb,IAAOC,IAAV,wJAE1B,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,cAO5B88D,EAAgCvhD,IAAOC,IAAV,yIAE7B,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAM5B+8D,EAAiBxhD,IAAOC,IAAV,+CAIdotC,EAAgBrtC,IAAOC,IAAV,yJAIR,SAAAC,GAAK,OAAKA,EAAMihD,UAAN,UAAqBjhD,EAAMihD,UAA3B,MAA2C,KAI1DM,EAAczhD,YAAOokB,IAAPpkB,CAAH,wGACL,SAAAE,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAEtB,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAGvCm7D,EAAuB1hD,IAAOC,IAAV,sDAIpB0hD,EAAqC3hD,IAAOC,IAAV,+YAYjC,SAAAC,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAE3C,SAAAwB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACX,SAAA8a,GAAK,OAAKA,EAAMN,MAAQ,MAAQ,UAAW,SAAAM,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAGvF,SAAAoZ,GAAK,OACXA,EAAMC,KAAN,oBACmBD,EAAMI,MAAMpc,OAAOQ,YADtC,oBAEmBwb,EAAMI,MAAMpc,OAAOS,cAG7B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAIhC6hC,EAAYvmB,YAAO86C,IAAP96C,CAAH,qDAIT4hD,EAAa5hD,IAAOC,IAAV,gPAUV,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,c,6BCrNjC,omBAAO,IAKK8jB,EALCqyB,EAAe,qBACfC,EAAuB,6BACvBC,EAAuB,6BACvBC,EAA4B,4BAiBlC,SAAS8mB,IACZ,MAAO,CACH7mD,KAAM4/B,GAIP,SAASknB,EAAwB3vD,GACpC,MAAO,CACH6I,KAAM6/B,EACN1oC,QAID,SAAS4vD,EAAwBniD,GACpC,MAAO,CACH5E,KAAM8/B,EACNl7B,SAID,SAASoiD,IACZ,MAAO,CACHhnD,KAAMuN,EAAQ2yB,2BAIf,SAAS+mB,EAAyB7mB,GACrC,MAAO,CACHpgC,KAAMuN,EAAQ4yB,4BACdC,iBAID,SAAS8mB,EAAyBtiD,GACrC,MAAO,CACH5E,KAAMuN,EAAQ8yB,4BACdz7B,SAID,SAASuiD,IACZ,MAAO,CACHnnD,KAAMuN,EAAQizB,4BAIf,SAAS4mB,EAA0BjwD,GACtC,MAAO,CACH6I,KAAMuN,EAAQkzB,6BACdtpC,QAID,SAASkwD,EAA0BziD,GACtC,MAAO,CACH5E,KAAMuN,EAAQmzB,6BACd97B,SAID,SAAS0iD,IACZ,MAAO,CACHtnD,KAAMuN,EAAQozB,sBAKf,SAAS4mB,IACZ,MAAO,CACHvnD,KAAMuN,EAAQuzB,gCAIf,SAAS0mB,EAA6BrwD,GACzC,MAAO,CACH6I,KAAMuN,EAAQwzB,iCACd5pC,QAID,SAASswD,EAA6B7iD,GACzC,MAAO,CACH5E,KAAMuN,EAAQyzB,iCACdp8B,U,SAlGI2I,K,sDAAAA,E,0DAAAA,E,0DAAAA,E,wDAAAA,E,4DAAAA,E,4DAAAA,E,4CAAAA,E,gEAAAA,E,oEAAAA,E,qEAAAA,M,8PCiBGm6C,EAvBOtkD,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BACNC,WAAW,+BACXS,KAAK,OART,SAUI,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,kbACFF,KAAK,iB,4DCJnBujD,EAAwB5iD,IAAOC,IAAV,oEAKrB4iD,EAAc7iD,IAAO0nB,KAAV,0BAEXo7B,EAAc9iD,IAAO0nB,KAAV,0BAEXq7B,EAAyB/iD,IAAOC,IAAV,yHAOtB+iD,EAAkBhjD,IAAOC,IAAV,mYACR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAO3Buc,GAAOngB,IAAOC,IAAV,kDAIJgjD,GAAgBjjD,IAAOC,IAAV,8UAYD,qBAAGK,MAAkBpc,OAAOS,aAMxCu+D,GAAmBljD,IAAOC,IAAV,qbAOT,qBAAGK,MAAkBpc,OAAOkB,SAOnB,qBAAEkb,MAAiBpc,OAAOS,YAEtCs+D,IASJE,GAAcnjD,IAAO0nB,KAAV,6CACJ,qBAAGpnB,MAAkBpc,OAAOQ,cAG5B0+D,GAQR,SAAC,GAA8E,IAA5Ev5C,EAA2E,EAA3EA,YAAa20C,EAA8D,EAA9DA,oBAAqB6E,EAAyC,EAAzCA,qBAAsBC,EAAmB,EAAnBA,aAAmB,EAK3EngC,oBAAkB,GALyD,mBAG3EogC,EAH2E,KAI3EC,EAJ2E,OAMzCrgC,qBANyC,mBAMxEsgC,EANwE,KAM3DC,EAN2D,OAO/CvgC,qBAP+C,mBAOxEwgC,EAPwE,KAO9DC,EAP8D,KAS/EtgC,qBAAU,WACNsgC,EAAYC,YAA+CrF,MAC5D,CAACA,IAOJ,IAAMsF,EAAiB,SAACxuD,GACpB,IAAMS,EAAU,OAAG8T,QAAH,IAAGA,OAAH,EAAGA,EAAa00B,MAAK,SAACnrB,GAAD,OAAUA,EAAK3T,KAAOnK,KAE3D,OAAiB,OAAVS,QAAU,IAAVA,OAAA,EAAAA,EAAY0J,MAAZ,OACFkkD,QADE,IACFA,OADE,EACFA,EAAW5tD,EAAW0J,KACrBsiB,YAAsB,OAClB4hC,QADkB,IAClBA,OADkB,EAClBA,EAAW5tD,EAAW0J,KAE1B,MAQJskD,EAAgB,uCAAG,WAAMzuD,GAAN,iBAAA2c,EAAA,sDACfqxB,EAAUwgB,EAAexuD,GAIzBnD,EAAO,CACTknD,MAAO,EACPr+C,KAJOsoC,EAAU,SAAW,aAK5BA,WAGJogB,EAAe,2BAAIvxD,GAAL,IAAW8K,cAAe3H,KACxCkuD,GAA4B,GAZP,2CAAH,sDAsBhBQ,EAAa,uCAAG,WAAO/jC,GAAP,iBAAAhO,EAAA,sDACVhV,EAAkBwmD,EAAlBxmD,cAELgjB,IACOgkC,EAA+B,IAErBhnD,GAAiBgjB,EACjC2jC,GAAY,SAAAM,GAAS,kCAASA,GAAcD,OAE5CL,GAAY,SAACM,GAKT,OAJIA,IACAA,EAAUjnD,GAAiB,MAGxBinD,KAIXC,EAAUlnD,GACU,OAApBomD,QAAoB,IAApBA,KAAuB7E,EAAoBv9C,KAAI,SAAAmjD,GAC3C,OAAIA,EAAmB9uD,eAAiB2H,EAC7B,2BACAmnD,GADP,IAEI9gB,QAASrjB,IAGNmkC,MAIK,OAApBf,QAAoB,IAApBA,KAAoB,sBAAQ7E,GAAR,CAA6B,CAC7ClpD,aAAc2H,EACdqmC,QAASrjB,MAIjBujC,GAA4B,GApCV,2CAAH,sDAuCbW,EAAYn0D,uBACd,SAACq0D,GACG,QACM7F,KACA6F,KACA7F,EAAoBrrC,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,eAAiB+uD,KAAO1xC,SAGpE,CAAC6rC,IAGC8F,EAAqBt0D,uBACvB,SAACsF,GACG,QACMkpD,KACAlpD,KACAkpD,EAAoBrrC,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,gBAAkBygB,OAAOzgB,MAAeqd,SAGpF,CAAC6rC,IAGC+F,EAAgB,SAACjvD,GACfA,GAAgB+tD,GAChBA,EACI9C,YAAwC/B,EAAqBlpD,KAKzE,IAAKuU,GAAgBA,GAAsC,IAAvBA,EAAY8I,OAAe,OAAO,KAEtE,IAAM6xC,EAAqB36C,EAAYsJ,QACnC,SAAApd,GAAU,OACNA,EAAW0J,IAAM++C,EAAoBv9C,KAAI,SAAAwjD,GAAE,OAAIhyC,KAAKqX,IAAI26B,EAAGnvD,iBAAeoc,SAAS3b,EAAW0J,OAGhGilD,EAAwB76C,EAAYsJ,QACtC,SAAApd,GAAU,OACNA,EAAW0J,KAAO++C,EAAoBv9C,KAAI,SAAAwjD,GAAE,OAAIhyC,KAAKqX,IAAI26B,EAAGnvD,iBAAeoc,SAAS3b,EAAW0J,OAGvG,OACI,eAACmjD,EAAD,WACK4B,EAAmB7xC,OAAS,GACzB,eAACkwC,EAAD,WACK2B,EAAmBvjD,KAAI,SAAAlL,GACpB,OACI,eAACgtD,EAAD,CAEI5hD,YAAU,4BAFd,UAII,cAAC2iB,EAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUpuD,EAAW0J,KACrB6kD,EAAmBvuD,EAAW0J,IAElCmL,QAAS05C,EAAmBvuD,EAAW0J,IACvCqmB,aAAc,kBACVy+B,EAAcxuD,EAAW0J,KAE7ByE,SAAS,6BAEb,cAAC8+C,EAAD,CACI5+C,QAAS,kBAAMmgD,EAAcxuD,EAAW0J,KACxC0B,YAAU,wBAFd,SAIKpL,EAAWtC,QAEd6vD,GACE,eAACJ,GAAD,CAAkB/hD,YAAU,qBAA5B,UACI,cAAC,GAAD,CAAMA,YAAU,iBAAhB,SACKpL,EAAW0J,KAAX,OACDkkD,QADC,IACDA,OADC,EACDA,EAAW5tD,EAAW0J,KAClBsiB,YACI4hC,EACI5tD,EAAW0J,KAInB,cAACklD,EAAA,EAAD,MAGR,cAAC1B,GAAD,CACI7+C,QAAS,kBACLrO,EAAW0J,IACXskD,EAAiBhuD,EAAW0J,KAEhC0B,YAAU,uBALd,SAOI,cAAC,EAAD,WA1CPpL,EAAW0J,OAiD3B+kD,EAAmB7xC,OAAS9I,EAAY8I,QACrC,cAAC,IAAD,CAAclU,MAAM,WAIhC,cAACqkD,EAAD,UACK4B,EAAsBzjD,KAAI,SAAAlL,GACvB,OACI,eAACgtD,EAAD,CAEI5hD,YAAU,4BAFd,UAII,cAAC2iB,EAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUpuD,EAAW0J,KACrB6kD,EAAmBvuD,EAAW0J,IAElCmL,QAAS05C,EAAmBvuD,EAAW0J,IACvCqmB,aAAc,kBACVy+B,EAAcxuD,EAAW0J,KAE7ByE,SAAS,6BAEb,cAAC8+C,EAAD,CACI5+C,QAAS,kBAAMmgD,EAAcxuD,EAAW0J,KACxC0B,YAAU,wBAFd,SAIKpL,EAAWtC,QAEd6vD,GACE,eAACJ,GAAD,CAAkB/hD,YAAU,qBAA5B,UACI,cAAC,GAAD,CAAMA,YAAU,iBAAhB,SACI,cAACgiD,GAAD,UACKptD,EAAW0J,IACZkkD,GACAA,EAAS5tD,EAAW0J,IAChBshB,IACI4iC,EACI5tD,EAAW0J,KAEjB0iB,OAAO,YAET,cAACwiC,EAAA,EAAD,QAIZ,cAAC1B,GAAD,CACI7+C,QAAS,kBACLrO,EAAW0J,IACXskD,EAAiBhuD,EAAW0J,KAEhC0B,YAAU,uBALd,SAOI,cAAC,EAAD,WA7CPpL,EAAW0J,SAqD/B8jD,GACG,cAACqB,EAAA,EAAD,CACIzyD,KAAI,2BAAMsxD,GAAN,IAAmBoB,mBAAmB,IAC1C/W,SAAU,kBAAM0V,GAA4B,IAC5CsB,QAASd,Q,+DC5WvBe,GAAoB/kD,IAAOC,IAAV,gLASjB8mB,GAA2B/mB,IAAOC,IAAV,gIAOxB+kD,GAAehlD,IAAOC,IAAV,2GAGL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInCugE,GAAqBjlD,IAAOC,IAAV,sPACL,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cA6B1BwgE,GA1BwD,SAAC,GAGjE,IAFHnhD,EAEE,EAFFA,QACAq/B,EACE,EADFA,QAEA,OAAIr/B,EAEI,cAACghD,GAAD,UACI,cAAC,KAAD,MAMR,cAACA,GAAD,UACI,eAACh+B,GAAD,WACI,cAACi+B,GAAD,CAAc7jD,YAAU,yCAAxB,SACKiiC,EAAU,cAAC+hB,GAAA,EAAD,IAAe,cAACj+B,GAAA,EAAD,MAE9B,cAAC+9B,GAAD,CAAoB9jD,YAAU,0CAA9B,SACKiiC,EAAU,sBAAwB,gC,mBCnBjDgiB,GAA0BplD,IAAOC,IAAV,qIAQvBolD,GAAwBrlD,IAAOC,IAAV,kHAOrBonB,GAAgBrnB,IAAOC,IAAV,sMAUbqnB,GAAmBtnB,IAAOC,IAAV,6HAOhBsnB,GAAgBvnB,IAAOC,IAAV,yLAWbwnB,GAAcznB,IAAO0nB,KAAV,6OASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,iHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,wEAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,GAAkB9nB,IAAO0nB,KAAV,6CACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC6gE,GAA0BtlD,YAAO8nB,GAAP9nB,CAAH,8CAIvB+nB,GAAc/nB,IAAOgoB,EAAV,0GAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInC6iC,GAAgBjoB,IAAOC,IAAV,sDAIbunB,GAA4BxnB,IAAOC,IAAV,sDAKzBslD,GAAoD,SAAC,GAiBpD,IAhBH17C,EAgBE,EAhBFA,YACA+J,EAeE,EAfFA,aACAhQ,EAcE,EAdFA,SACAG,EAaE,EAbFA,QACAqkB,EAYE,EAZFA,OACAC,EAWE,EAXFA,gBACAC,EAUE,EAVFA,cACAC,EASE,EATFA,YACAG,EAQE,EARFA,cACAC,EAOE,EAPFA,aACAC,EAME,EANFA,kBACAC,EAKE,EALFA,WAKE,IAJFC,gBAIE,SAHFw6B,EAGE,EAHFA,aACAhlD,EAEE,EAFFA,UACAknD,EACE,EADFA,0BAEMx8B,EAOF,CACAC,MAAO,CACHjmB,MAAO/e,KAAUC,OAAOI,YACxBsjC,WAAY3jC,KAAUC,OAAOsD,UAC7BqgC,YAAa5jC,KAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,KAAUC,OAAOI,YACxBsjC,WAAY3jC,KAAUC,OAAOsD,UAC7BqgC,YAAa5jC,KAAUC,OAAOqD,cAIhCyiC,EAAeh6B,uBAAY,WACd,OAAfq4B,QAAe,IAAfA,SACD,CAACA,IAvBF,EAyBkClF,mBAAS,IAzB3C,mBAyBKtwB,EAzBL,KAyBiBs2B,EAzBjB,OA2BwDhG,mBAExD,IA7BA,mBA2BKmG,EA3BL,KA2B4BC,EA3B5B,KA+BIk8B,EAAuBxnC,mBAAQ,WACjC,GAAIpU,EAAa,CACb,IAAM3K,EAASyqB,mBACX+7B,YAAkB7yD,EAAY,CAACi2C,KAAmB11C,SAClD4jB,KAFW2S,CAGb9f,EAAYqI,OAEd,GAAIhT,EAAOyT,OAAS,EAAG,CACnB,IAAMiX,EAAmB1qB,EAAO+B,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MACjD8pB,EACI3V,EAAaT,QAAO,SAAAC,GAAI,OACpBwW,EAAiBlY,SAASe,KAAKqX,IAAI1W,EAAK9d,mBAKpD,OAAO4J,EAEP,MAAO,KAEZ,CAACrM,EAAYgX,EAAa+J,IAEvBmW,EAAgB9L,mBAClB,kBAAMrK,EAAajB,UAAb,OAAwB8yC,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAsB9yC,UAEpD,CAACiB,EAAajB,SAGZgzC,EAAmB31D,uBAAY,WAC7B+5B,GAAiBzB,EACjBA,IACOC,IACPk9B,EAAqB7vC,SAAQ,SAAAxC,GAAS,IAAD,EACjCA,EAAKkwB,SACD,UAAA1vB,EAAa2qB,MACT,qBAAGjpC,eAAoC8d,EAAK3T,aADhD,eAEG6jC,UAAW,QAGtB/a,EAAYk9B,MAEjB,CACCn9B,EACAC,EACAwB,EACA07B,EACA7xC,IAGEuW,IAAc,OAACtgB,QAAD,IAACA,OAAD,EAACA,EAAawvC,OAC5BhvB,GAAkBo7B,EAAqB9yC,QAAU5O,EACjD6hD,EAA4BhyC,EAAaT,QAC3C,SAAAsxC,GAAE,OAAIA,EAAGnvD,aAAe,KAC1Bqd,OAEF,OACI,cAACyyC,GAAD,CAAyB9mD,UAAWA,EAApC,SACI,eAAC+mD,GAAD,WACK18B,GACG,cAACtB,GAAD,UACI,cAACU,GAAD,UAAcY,MAGrBE,GACG,cAACZ,GAAD,CAAe9mB,YAAU,+BAAzB,SACI,cAAC,KAAD,CACIopB,SAvEF,SAAC1kB,GAAD,OAAmBsjB,EAActjB,IAwE/BjC,SAAUumB,EACVjmB,SAAS,iCAIpB0kB,IAAsBuB,GACnB,eAAC5C,GAAD,WACI,8BACI,cAACO,GAAD,CAAiB3mB,YAAU,8BAA3B,SACKykD,EAA4B,EAA5B,UACQA,EADR,YAESA,EAA4B,EACtB,yBACA,yBAEV,+BAGd,cAACp+B,GAAD,CACIlpB,UAAWknD,EADf,SAGKz7B,EACG,cAACtC,GAAD,CACI7jB,SACqC,IAAjC0lB,EAAsB3W,QACtB0X,EAEJrnB,MAAOgmB,EAAaC,MAAMjmB,MAC1B6kB,YAAamB,EAAaC,MAAMpB,YAChCD,WAAYoB,EAAaC,MAAMrB,WAC/BxjB,QAAS4lB,EACT7oB,YAAU,iCATd,0BAcA,cAACsmB,GAAD,CACI7jB,SAAUymB,EACVrnB,MAAOgmB,EAAaE,OAAOlmB,MAC3B6kB,YACImB,EAAaE,OAAOrB,YAExBD,WAAYoB,EAAaE,OAAOtB,WAChCxjB,QAASuhD,EACTxkD,YAAU,+BARd,2BAcNmiD,GACE,cAACgC,GAAD,CAAyBnkD,YAAU,yBAAnC,0BAMXkpB,EACG,cAAC,GAAD,CACItmB,QAASA,EACTq/B,UAAS,OAACv5B,QAAD,IAACA,OAAD,EAACA,EAAawvC,SAG3B,qCACI,cAAC,GAAD,CACIxvC,YAAa47C,EACbjH,oBAAqB5qC,EACrBhQ,SAAUA,EACVy/C,qBAAsB36B,EACtB46B,aAAcA,IAEjBl7B,GAAUU,GACP,cAACxB,GAAD,UACI,cAAC9jB,GAAA,EAAD,CACIxI,KAAM,SACNyI,MAAO,OACPhJ,OAAQ,kBAAM2tB,KACd1pB,OAAQ,OACRD,MAAO,qB,sCC3S9BonD,GAA0C,SAAC,GAKjD,IAJHn9B,EAIE,EAJFA,cAIE,IAHF+B,8BAGE,SAFF64B,EAEE,EAFFA,aACG54B,EACD,0EACMrW,EAAayxC,eAAbzxC,SADN,EAEwB0xC,eAAlB5zD,EAFN,EAEMA,KAAM4R,EAFZ,EAEYA,QACRimB,EAAesvB,eACftuB,EAAcuuB,eACdrwB,EAASswB,eACT3kD,EAAY6kD,eACZzuB,EAAc2uB,eACd1uB,EAAgB2uB,eAYtB,OAVAv2B,qBAAU,WACN,OAAO,WACCmH,GACAS,OAIT,IAIC,cAAC,GAAD,aACIrhB,YAAa1X,EACbyhB,aAAcS,EACdtQ,QAASA,EACTskB,gBAAiB,WACbK,GAAiBA,EAAc,IAC/BsB,KAEJ5B,OAAQ4C,EACRtC,cAAe,SAACs9B,GACZt9B,GAAiBA,EAAcs9B,GAC/B98B,EAAO88B,IAEXz9B,YAAa,SAAC1e,GACVhV,EAAUgV,GACV6e,GAAiBA,EAAc,KAEnCJ,cAAe,WACX2C,KAEJq4B,aAAcA,GACV54B,K,0JCxEHu7B,EAA+B,SACxC1uC,GACoB,IAAD,EACnB,OAAI6rB,kBAAQ7rB,GACD,KAEX,UAAO8kB,OAAO6pB,QAAQ3uC,UAAtB,aAAO,EAAwBtW,KAAI,SAAAmS,GAAI,OAAIA,EAAK,OASvC+yC,EAAsB,SAC/BC,EACAC,GAF+B,QAGJ,IAAfA,EAAsBD,GAAYE,QAAQ,IAW7CC,EAAqB,SAC9BC,EACAC,EACAC,GAEA,IAAMC,EAAqBC,cAAUJ,EAASC,EAAW,MAEzD,GAAI1lD,MAAMC,QAAQ2lD,GACd,OAAOE,gBAAMF,EAAoBD,GAC9B,GAAkC,kBAAvBC,EAAiC,CAG/C,IAFA,IAAMG,EAAkB,CAAC,GAEhB3yC,EAAI,EAAGA,EAAIwyC,EAAqBD,EAAcvyC,IACnD2yC,EAAgBrvC,KAAKqvC,EAAgB3yC,EAAI,GAAKuyC,GAGlD,OAAOI,EAGX,OAAO,M,kBC/CJ,SAASC,EAAcC,GAC1B,MAAO,CACHhsD,KAAMisD,IACND,WAAYA,GCgBb,SAASE,EACZC,EACAlhB,EACAmhB,GAK+B,IAD/BC,IAC8B,yDACxBhmD,EAAWO,cADa,EAGIuhB,oBAAkB,GAHtB,mBAGvBmkC,EAHuB,KAGZC,EAHY,KAKxBC,EAAeriC,kBAAO,GACtBsiC,EAActiC,kBAAO,GACrBuiC,EAAeviC,iBAAgC,IAC/CwiC,EAAsBxiC,kBAAO,GAM7ByiC,EAAoB,WACtBJ,EAAaz3B,SAAU,EACvB23B,EAAa33B,QAAU,GACvB43B,EAAoB53B,SAAU,EAC9B83B,KAOEC,EAAmB93D,uBAAY,WACjC28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbC,EAAaz3B,SAAU,EAEvBtuB,YAAW,WACPJ,EAAS0lD,EAAc,MACxB,UAER,CAAC1lD,IAQE2mD,EAAqB,uCAAG,WAC1BC,GAD0B,2BAAAh2C,EAAA,yDAE1Bi2C,EAF0B,iCAItBD,EAJsB,yCAAAh2C,EAAA,sCAAAA,EAAA,sDAKhBk2C,EAA0BF,EAAkBt1C,OAL5B,IAAAV,EAAA,iBAOb/Q,GAPa,iCAAA+Q,EAAA,0DASdu1C,EAAaz3B,QATC,8DAiBVk4B,EAAkB/mD,GAJlBknD,EAbU,EAaVA,WACAC,EAdU,EAcVA,eACAC,EAfU,EAeVA,sBAfU,IAgBVC,uBAhBU,MAgBQ,GAhBR,IAmBRC,EACFvC,EACIqC,IArBM,uCA4BJD,QA5BI,IA4BJA,GA5BI,UA4BJA,EACAI,aA7BI,iBA4BJ,OAAAJ,EACQrnB,SAAUwnB,UA7Bd,iBA4BJ,EAEAl9B,KAFA,+BAAArZ,EAAA,MAEK,WAAOqsB,GAAP,eAAArsB,EAAA,yDAGHy1C,EAAa33B,QAAQq4B,GAAc9pB,EAK9B8E,kBAAQmlB,GARV,qBAUOG,EACFC,EACIJ,EAAgBtnD,KAAI,SAAAxG,GAAW,IAAD,EAGlBmuD,EACJnuD,EAFA6tD,sBAMIO,EAKJD,EANAE,WAGIC,EAGJH,EAJAnC,UAGIuC,EACJJ,EAFAK,mBAMEC,EACFnoD,MAAMC,QAEE6nD,EAEAE,GACF,IAGIF,EAEAE,GACF7nD,GAEE2nD,EAEAE,GAkBd,OAf8B,2BAEnBtuD,GAFmB,IAGtB6tD,sBAAsB,2BACfM,GADc,IAEjBE,WAAW,2BACJD,GADG,uBAELE,EACGG,GAHE,cAILF,EACG1qB,GALE,aArDnC,gCAoEW0pB,EACFU,GACA,GAtET,OA2EER,GAAsBV,EAAaz3B,SACpC1uB,EACI0lD,EACIZ,EACIgC,EACAjnD,EAAQ,KAhFrB,2CAFL,8DA5BI,aA4BJ,EAwFAsqB,OAAM,SAAC5rB,GACDynD,GACAS,IACO,OAAPV,QAAO,IAAPA,KAAUxnD,EAAO8nD,EAAa33B,SAC9B03B,EAAY13B,SAAU,IAItB1uB,EACI0lD,EACIZ,EACIgC,EACAjnD,EAAQ,KAKb,OAAPkmD,QAAO,IAAPA,KAAUxnD,EAAO8nD,EAAa33B,aArIhC,OA6IgC,IAA9Ctd,KAAKqX,IAAI5oB,EAAQinD,IAChBD,IAEDP,EAAoB53B,SAAU,GAhJhB,2CAOb7uB,EAAQ,EAPK,YAOFA,EAAQinD,GAPN,0CAObjnD,GAPa,oFAO+BA,IAP/B,uBAsJjBumD,EAAY13B,UACb43B,EAAoB53B,SACnBy3B,EAAaz3B,UAEd+3B,IACS,OAAT7hB,QAAS,IAATA,KAAYyhB,EAAa33B,UA3JP,gGAAH,sDAsKrB44B,EAAgC,SAClCxB,GAEA,IADgD,EAC1Cc,EAAoB,GADsB,cAGpBd,GAHoB,yBAGrCgC,EAHqC,UASxCA,GAAiB,GATuB,IAKxCf,kBALwC,MAK3B,GAL2B,MAMxCC,sBANwC,MAMvB,aANuB,MAOxCE,uBAPwC,MAOtB,GAPsB,MAQxC7B,oBARwC,MAQzB0C,IARyB,EAYtCC,EAA8BC,oBAAS,OACzCH,QADyC,IACzCA,OADyC,EACzCA,EAAeb,uBAGnB,IAAKllB,kBAAQimB,GAA8B,CAAC,IAAD,EAEnCA,EADIP,EAD+B,EAC/BA,WAAYrC,EADmB,EACnBA,UAGd8C,EAA8BhD,EAChCuC,EACArC,EACAC,GAGE8C,EAAgB,OAAGD,QAAH,IAAGA,OAAH,EAAGA,EAA6BtoD,KAClD,SAACwoD,GAAD,mBAAC,uCACM,CAAErB,eACF,CAAEC,mBACF,CAAEE,oBAHT,IAII7B,eAIA4B,sBAAsB,eACdoB,iBACAJ,oBAAUR,GACVrC,GACA,kBAAMgD,WAMlBD,GACAvB,EAAkBxwC,KAAK+xC,KA3CnC,2BAAyC,IAHO,8BAmDhD,OAAOG,kBAAQ1B,IAQbJ,EAAoB,uCAAG,4BAAA51C,EAAA,yDAEzBw1C,EAAY13B,SAAU,EAEhBk4B,EAAoBU,EAA8BxB,GAEnD/jB,kBAAQ6kB,GANY,gCAOfD,EAAsBC,GAPP,2CAAH,qDA2B1B,OAhBA3kC,qBAAU,WACFgkC,EACAQ,IAEAF,MAGL,CAACN,IAEJhkC,qBAAU,WACN,OAAO,WACHwkC,OAGL,IAEI,CACHR,YACAC,kB,6ICxUKqC,EAAO5pD,IAAOC,IAAV,sGAOJsmB,EAAYvmB,IAAOC,IAAV,8PAMJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aACtB,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAGxB,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI3CmlE,EAAe7pD,IAAOC,IAAV,0CAGZwhD,EAAczhD,YAAOokB,IAAPpkB,CAAH,6CAGXc,EAAOd,IAAOC,IAAV,0KAQJ6pD,EAAa9pD,YAAO+pD,IAAP/pD,CAAH,+DAEV,SAAAE,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,a,OC4BlBulE,EA3DqCtpD,gBAAK,SAAAR,GAAU,IACvD+pD,EAA2E/pD,EAA3E+pD,YAAaC,EAA8DhqD,EAA9DgqD,aAAc3/B,EAAgDrqB,EAAhDqqB,SAAU3mB,EAAsC1D,EAAtC0D,SAAUM,EAA4BhE,EAA5BgE,SAAUimD,EAAkBjqD,EAAlBiqD,cAC3DC,EAAoBlmD,GAAY,qBAFwB,EAIpCif,mBAAS+mC,GAAgB,IAJW,mBAIvDrkD,EAJuD,KAIhDwkD,EAJgD,KAMxDC,EAAoBrsC,mBACtB,kBAAMsM,EAAWggC,mBAAShgC,EAAD,OAAW4/B,QAAX,IAAWA,IAAiBK,UAA+Bz5D,IACpF,CAACw5B,EAAU4/B,IAOT5F,EAAgBv0D,uBAClB,SAACq1B,GACGA,EAAEolC,UACF,IAAM5kD,EAAQwf,EAAEgwB,OAAOxvC,MACvBwkD,GAAS,SAAAnG,GAEL,OADiB,OAAjBoG,QAAiB,IAAjBA,KAAoBzkD,GACbA,OAGf,CAACykD,IAYL,OACI,cAACV,EAAD,CAAMzoD,YAAW+C,EAAjB,SACI,eAACqiB,EAAD,WACI,cAACzlB,EAAD,CAAMK,YAAA,UAAcipD,EAAd,SAAN,SACI,cAACN,EAAD,CAAYlmD,SAAUA,MAE1B,cAACimD,EAAD,UACI,cAACpI,EAAD,CACIwI,YAAaA,EACbnkC,aAAcy+B,EACd1+C,MAAOA,EACPlD,SAAS,OACT+nD,WAjBC,WACjBL,EAAS,IACT9/B,GAAYA,EAAS,KAgBL7rB,OAAO,OACPkF,SAAUA,EACVM,SAAUkmD,e,iFC/DlC,SAASO,IAAuB,IAAD,EACwBhqB,OACnD,MAAO,CACHliC,MAHuB,EACnBmsD,WAGJlsD,OAJuB,EACA48C,aAOhB,SAASvG,IAAuB,IAAD,EACM5xB,mBAC5CwnC,KAFsC,mBACnCE,EADmC,KACjBC,EADiB,KAc1C,OATAxnC,qBAAU,WACN,SAASynC,IACLD,EAAoBH,KAIxB,OADAhqB,OAAO6Z,iBAAiB,SAAUuQ,GAC3B,kBAAMpqB,OAAOga,oBAAoB,SAAUoQ,MACnD,IAEIF,I,sICtBEG,EAAoBhrD,IAAOC,IAAV,4DAKjBgrD,EAAuBjrD,IAAOC,IAAV,6GAIpB,SAAAC,GAAK,OACRA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOW,UAG1C,SAAAqb,GAAK,OAAKA,EAAMkvB,QAAUlvB,EAAMkvB,QAAU,oBAG5C87B,EAAgBlrD,IAAOC,IAAV,6GAIb,SAAAC,GAAK,OAAOA,EAAM8C,MAAQ9C,EAAM8C,MAAQ,sBAGtC,SAAA9C,GAAK,OAAKA,EAAMkvB,QAAUlvB,EAAMkvB,QAAU,oB,OCmF1C+7B,EAhGK,SAAC,GAuBF,IACXC,EAvBJC,EAsBc,EAtBdA,KACAr4D,EAqBc,EArBdA,MACAgI,EAoBc,EApBdA,KACAyI,EAmBc,EAnBdA,MACA/E,EAkBc,EAlBdA,OACAiE,EAiBc,EAjBdA,SACAiB,EAgBc,EAhBdA,SACA0nD,EAec,EAfdA,WACAC,EAcc,EAddA,aACAnzC,EAac,EAbdA,WACAozC,EAYc,EAZdA,kBACAC,EAWc,EAXdA,aACAC,EAUc,EAVdA,WACAC,EASc,EATdA,aACAC,EAQc,EARdA,WACAC,EAOc,EAPdA,eACAC,EAMc,EANdA,UACAC,EAKc,EALdA,UACAC,EAIc,EAJdA,YACApmC,EAGc,EAHdA,KACA1hB,EAEc,EAFdA,SACGhE,EACW,4QAERN,EAAQqsD,YAAMZ,EAAKa,OAAQl5D,EAAMS,OAASu4D,EAC1CG,EAAQF,YAAMZ,EAAKe,QAASp5D,EAAMS,MAClCyxB,EAAWC,iBAAY,MAmB7B,OAjBA7B,qBAAU,WACFyoC,GAAa7mC,GAAYA,EAAS6K,SAClC7K,EAAS6K,QAAQs8B,UAEtB,CAACN,IAEJX,EAAee,GAASvsD,GACpB,cAACqrD,EAAD,CACI77B,QAASu8B,EACT3oD,MAAO4oD,EACPzqD,YAAW+C,GAAQ,UAAOA,EAAP,UACnB5F,UAAW,qBAJf,SAMKsB,IAIL5E,GAAiB,UAATA,EAEJ,eAACgwD,EAAD,WACI,cAAC,IAAD,2BACQh4D,GADR,IAEIA,MAAOA,EACPgI,KAAMA,GAAc,OACpByI,MAAOA,EACPG,SAAUA,EACVhE,QAASwrD,EACTS,eAAgBA,EAChBzzC,WAAYA,EACZ1Z,OAAQA,EACRiE,SAAUA,EACVuB,SAAUA,GACNhE,IAEPkrD,KAMT,eAACJ,EAAD,WACI,cAAC,IAAD,2BACQh4D,GADR,IAEIA,MAAOA,EACPqL,IAAK6mB,EACLumC,aAAcA,EACdzwD,KAAMA,GAAc,OACpByI,MAAOA,EACP+nD,kBAAmBA,EACnBF,WAAYA,EACZ1nD,SAAUA,EACV2nD,aAAcA,EACd3rD,QAASwrD,EACThzC,WAAYA,EACZ1Z,OAAQA,EACRiE,SAAUA,EACV+oD,WAAYA,EACZI,UAAWA,EACX5nD,SAAUA,GACNhE,KAEN4rD,GAAaV,EACdxlC,IAASwlC,GAAgB,cAACF,EAAD,UAAgBtlC,S,2MC9F1C0mC,E,+CAoFL,SAASC,IACZ,IAAMxuC,EAAeC,cACrB,OAAOC,mBACH,kBA7ER,SAAqCF,GACjC,IAMMyuC,EAAe,SAAC/zD,GAAD,OACjBmlB,YAAcG,EAActZ,IAAgBgoD,aACzCh0D,EAAK1G,SAAW2rC,IAAWtqC,QAE5Bs5D,EAAmB,kBACrB9uC,YAAcG,EAActZ,IAAgBkoD,eAE1CC,EAAmB,SAAC//C,GACvB,OAAOA,EAAQ9a,SAAWugD,IAAiB1lD,WACnCgxB,YAAcG,EAActZ,IAAgB0a,oBAC5CtS,EAAQpU,KAAK1G,SAAW2rC,IAAWtqC,QAGxCy5D,EAAkB,kBACpBjvC,YAAcG,EAActZ,IAAgBqoD,+BAE1CC,EAAkB,kBACpBnvC,YAAcG,EAActZ,IAAgBuoD,sBAoChD,MAAO,CACHC,wBA5D4B,kBAC5BrvC,YAAcG,EAActZ,IAAgByoD,kBA4D5CC,eA1DmB,kBACnBvvC,YAAcG,EAActZ,IAAgB2oD,eA0D5CZ,eACAI,mBACAC,kBACAE,kBACAL,mBACAntC,eA1CmB,SAAC8tC,GAAsC,IAAD,EACnDn1D,EAAK,iBAAGm1D,QAAH,IAAGA,OAAH,EAAGA,EAAUpsD,KAAI,SAAA4L,GAAO,OAAIA,EAAQpU,eAApC,QAA6C,GACxD,OAAOinB,YACH2tC,EACA,CACI1tC,YACI2sC,EAAgBgB,WAChBp1D,EACAs0D,GAEJ7sC,YACI2sC,EAAgBiB,gBAChBF,EACAT,GAEJjtC,YACI2sC,EAAgBkB,cAChBt1D,EACA20D,GAEJltC,YACI2sC,EAAgBmB,cAChBv1D,EACA60D,GAEJptC,YACI2sC,EAAgBoB,YAChBx1D,EACAw0D,OAuBNiB,CAA4B5vC,KAClC,CAACA,K,SAxFGuuC,O,qDAAAA,I,+BAAAA,I,2BAAAA,I,qCAAAA,I,iCAAAA,I,iCAAAA,I,8BAAAA,M,+CCEe,mBACtBha,IAAiBsb,SAAqB,SADhB,cAEtBtb,IAAiB3U,QAAoB,WAFf,cAGtB2U,IAAiB1lD,UAAsB,aAGpB,mBACnB2lD,IAAqBxD,YAAwB,eAD1B,cAEnBwD,IAAqB5U,QAAoB,WAFtB,cAGnB4U,IAAqB3lD,UAAsB,aAiBzC,IAAMihE,EAAgC,SAAC18D,GAAgC,IAAD,YACnE28D,EAAa,UAAG38D,EAAauX,eAAhB,aAAG,EAAsB61B,MAAK,SAAApH,GAAC,MAAgB,eAAZA,EAAEnkC,SAWxD,MAVwC,CACpC+6D,WAAU,UAAE58D,EAAa68D,kCAAf,aAAE,EAAyC96D,KAAK,KAC1D+6D,iBAAgB,UAAE98D,EAAaumC,sBAAf,aAAE,EAA6BxkC,KAAK,KACpDg7D,aAAwB,OAAbJ,QAAa,IAAbA,OAAA,EAAAA,EAAejoD,aAAe9U,EACzCS,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCR,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BC,MAAOzB,EAAa0B,WACpBC,KAAMsE,YAAsBjG,EAAa4B,QAAS,QAAQ,KAMrDo7D,EAAsC,SAACn8C,GAAsB,IAAD,cAW/Do8C,EAAe/xB,OAAOj9B,OAAOivD,KAcnC,MAbuD,CACnD/qB,QAAO,UAAEtxB,EAAGs8C,uBAAL,aAAE,EAAoBrtD,KAAI,SAACmS,GAAD,OAAUm7C,IAAqBn7C,MAA4ClgB,KAAK,KACjH66D,WAAU,UAAE/7C,EAAGg8C,kCAAL,aAAE,EAA+B96D,KAAK,KAChD+6D,mBAAmB,UAAAj8C,EAAG0lB,sBAAH,eAAmB/kB,QAAnB,UAA4BX,EAAG0lB,sBAA/B,aAA4B,EAAmBz2B,KAAI,SAACmS,GAAD,OAAUi7C,IAAkBj7C,MAA0Cg7C,GAAcl7D,KAAK,KAC/J1B,OAAM,UAAEwgB,EAAG6D,gBAAL,aAAE,EAAa3iB,KAAK,KAC1BR,MAAK,UAAEsf,EAAGtf,aAAL,QAAc,GACnBC,OAAM,UAAEqf,EAAGrf,cAAL,QAAe,EACrBC,MAAOof,EAAGnf,WACVC,KAAMkf,EAAGjf,QAAH,UAnBS,CACf,UAAa,YACb,uBAAwB,WACxB,wBAAyB,UACzB,qBAAsB,WACtB,0BAA2B,gBAC3B,0BAA2B,gBAC3B,2BAA4B,WAC5B,6BAA8B,YAYVif,EAAGjf,QAAQC,OADzB,YAC8Dgf,EAAGjf,QAAQE,IAAM,MAAQ,QACvF,kBAYAu7D,EAA0B,SAACxmC,GAAqB,IAAD,UAUzD,MATiC,CAC7Bx2B,OAAM,UAAEw2B,EAAEnS,gBAAJ,aAAE,EAAY3iB,KAAK,KACzBslC,MAAK,UAAExQ,EAAEnsB,eAAJ,aAAE,EAAW3I,KAAK,KACvBu7D,QAAO,UAAEzmC,EAAE0mC,mBAAJ,aAAE,EAAex7D,KAAK,KAC7BR,MAAK,UAAEs1B,EAAEt1B,aAAJ,QAAa,GAClBC,OAAM,UAAEq1B,EAAEr1B,cAAJ,QAAc,EACpBC,MAAOo1B,EAAEn1B,WACTC,KAAMsE,YAAsB4wB,EAAEj1B,QAAS,c,sNC5FzC47D,EAAkB3uD,IAAOC,IAAV,uGAMf2uD,EAAyB5uD,IAAOC,IAAV,uJAQtB4uD,EAAiB7uD,IAAOC,IAAV,8PACD,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAC7B,SAAA4W,GAAK,OAAKA,EAAMyC,SAAN,UAAoBzC,EAAMyC,SAA1B,MAAyC,UAOvD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cACnC,SAAAwb,GAAK,QAAMA,EAAMzB,OAAR,iBAA2ByB,EAAMzB,MAAjC,QAGTqwD,EAAgB9uD,IAAOC,IAAV,2GAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI5BqqE,EAMRruD,gBAAK,gBAASI,EAAT,EAAG+C,KAAYmrD,EAAf,EAAeA,UAAWvwD,EAA1B,EAA0BA,MAAOkE,EAAjC,EAAiCA,SAAUuB,EAA3C,EAA2CA,SAAUR,EAArD,EAAqDA,SAArD,OACN,cAACirD,EAAD,UACI,eAACC,EAAD,WACK9tD,GACG,cAACguD,EAAD,CACI3tD,YAAW+C,GAAQ,UAAOA,EAAP,SACnBP,MAAOqrD,EAFX,SAII,cAACluD,EAAD,MAGR,cAAC+tD,EAAD,CACIpwD,MAAOA,EACPkE,SAAUA,EACVxB,YAAW+C,GAAQ,UAAOA,EAAP,UAHvB,SAKKR,YCjDFurD,ICRAA,EDEf,YAEG,IADGtW,EACJ,EADIA,WAAYz0C,EAChB,EADgBA,SAEd,OAAO,eAAC6qD,EAAD,CAAYlrD,KAAMqjB,IAAgBhjB,SAAUA,EAA5C,gBAA0Dy0C,EAA1D,aE2BIuW,EA/Bc9wD,sBACzB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,4BACI,sBACIC,EAAE,oxBACF4zB,UAAU,yECLnCg8B,ICfAC,EDEf,YAK0B,IAJtBvrD,EAIqB,EAJrBA,KACAwrD,EAGqB,EAHrBA,aAGqB,IAFrB5wD,aAEqB,MAFb,QAEa,EADrByF,EACqB,EADrBA,SAEA,OACI,cAAC6qD,EAAD,CAAYlrD,KAAMA,GAAQqrD,EAAezwD,MAAOA,EAAOyF,SAAUA,EAAjE,SACKmrD,GAAgB,0CEkBdC,EA3BclxD,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,oBAAG4wD,YAAU,mBAAb,UACI,sBAAMhwD,EAAE,ykBAAykBF,KAAK,YACtlB,sBAAMA,KAAK,OAAOE,EAAE,qBACpB,sBAAMiwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,oFAAoFF,KAAK,eAE7I,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,iBAAiB5zB,EAAE,4BCNxDmwD,ICdAC,EDEf,YAI4B,IAHxB9rD,EAGuB,EAHvBA,KACA+rD,EAEuB,EAFvBA,cACA1rD,EACuB,EADvBA,SAEA,OACI,cAAC6qD,EAAD,CAAYlrD,KAAMA,GAAQyrD,EAAeprD,SAAUA,EAAnD,SACK0rD,GAAiB,+C,4EETjBC,E,KAAK7vD,EAAO8vD,GAAV,qPAST,SAAA5vD,GAAK,OAAKA,EAAMzB,MAAN,iBAAwByB,EAAMzB,MAA9B,KAAyC,MAEtC,SAAAyB,GAAK,OAAKA,EAAM6vD,UAAY,GAAM,KAE/C,SAAA7vD,GAAK,OACHA,EAAM6vD,WAAN,sC,uBCoBOC,EA9BuBtvD,gBAAK,SAAAR,GAAU,IAE7CzB,EAOAyB,EAPAzB,MACAwxD,EAMA/vD,EANA+vD,QACA3xD,EAKA4B,EALA5B,UACAoF,EAIAxD,EAJAwD,SACAU,EAGAlE,EAHAkE,QACA8rD,EAEAhwD,EAFAgwD,oBACAhsD,EACAhE,EADAgE,SAGJ,OACI,cAAC2rD,EAAD,CACIpxD,MAAOA,EACPsxD,YAAa3rD,EACb6rD,QAASA,EACT3xD,UAAWA,EACX8F,QAASA,EACTjD,YAAU,aACVgvD,wBAAuBjsD,EAP3B,SASMgsD,EAGE,cAACvL,EAAA,EAAD,IAFAjhD,Q,8ICzBH0sD,EAAKpwD,IAAOqwD,GAAV,kLAOF,SAAAnwD,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAElB,SAAA8a,GAAK,OACZA,EAAMowD,WAAa,kBAAoB,qBAEhB,SAAApwD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YACrD,SAAAsb,GAAK,OAAKA,EAAMzB,MAAN,iBAAwByB,EAAMzB,MAA9B,KAAyC,MAG5C8xD,EAAUvwD,IAAOC,IAAV,sMAMN,SAAAC,GAAK,OAAKA,EAAM6vD,UAAY,UAAY,aAIzCS,EAAOxwD,IAAOC,IAAV,4KAIE,SAAAC,GAAK,OAAKA,EAAM6vD,UAAY,GAAM,KAGlC,SAAA7vD,GAAK,OAAKA,EAAM6vD,UAAY,GAAM,KAIxCU,EAAgBzwD,IAAOC,IAAV,sMAYbywD,EAAY1wD,YAAO2wD,IAAP3wD,CAAH,0FAMT4wD,EAAgB5wD,IAAOC,IAAV,yLAMZ,SAAAC,GAAK,OAAMA,EAAM6vD,UAAwB,UAAZ,aACrB,SAAA7vD,GAAK,OAAKA,EAAM6vD,UAAY,MAAQ,UAG7C3vD,EAAcJ,IAAOC,IAAV,mFAWX4wD,GALY7wD,IAAO0nB,KAAV,iEAKa1nB,IAAOC,IAAV,2HAOnB6wD,EAAiB9wD,IAAOC,IAAV,2NAKd,gBAAG8wD,EAAH,EAAGA,WAAH,OAAqBA,EAAU,UAAMA,EAAN,KAAsB,SAEnC,SAAA7wD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAI9C,SAAAsb,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,S,OCjG3B4rE,EAAqD,SAAA9wD,GAAU,IAE7DzB,EAWAyB,EAXAzB,MACAmF,EAUA1D,EAVA0D,SACAQ,EASAlE,EATAkE,QACAV,EAQAxD,EARAwD,SACApF,EAOA4B,EAPA5B,UACA6F,EAMAjE,EANAiE,MACA8sD,EAKA/wD,EALA+wD,YACAC,EAIAhxD,EAJAgxD,YACAC,EAGAjxD,EAHAixD,cACAJ,EAEA7wD,EAFA6wD,WACA7sD,EACAhE,EADAgE,SAGJ,OACI,eAACksD,EAAD,CACI3xD,MAAOA,EACPsxD,YAAa3rD,EACb9F,UAAWA,EACXsF,SAAUA,EACV0sD,YAAU,EACVnvD,YAAW+C,EANf,UAQI,eAAC4sD,EAAD,CAAgBC,WAAYA,EAAYntD,SAAUA,EAAlD,UACK,IACAO,EAAO,IACP8sD,GAAeC,GACZ,qBAAKvtD,MAAO,CAAEytD,OAAQ,WAAtB,SACI,cAACC,EAAA,EAAD,CACIC,cAAeH,EACf52D,KAAM22D,SAKtB,cAACT,EAAD,UAAgB/sD,QAKbhD,iBAAKswD,G,gBC/BdO,EAAsD,SAAArxD,GAAU,IAE9DzB,EAUAyB,EAVAzB,MACAxL,EASAiN,EATAjN,IACA2Q,EAQA1D,EARA0D,SACAQ,EAOAlE,EAPAkE,QACAV,EAMAxD,EANAwD,SACApF,EAKA4B,EALA5B,UACA4yD,EAIAhxD,EAJAgxD,YACAD,EAGA/wD,EAHA+wD,YACAE,EAEAjxD,EAFAixD,cACAjtD,EACAhE,EADAgE,SA+BJ,OACI,cAACksD,EAAD,CACI3xD,MAAOA,EACPsxD,YAAa3rD,EACb9F,UAAWA,EACXsF,SAAUA,EACVzC,YAAW+C,EALf,SAOI,eAACqsD,EAAD,CACIR,YAAa3rD,IAAYR,EACzBQ,QAAS,YACAR,GAAYQ,GACbA,KAJZ,UAQI,cAACosD,EAAD,CAAMT,YAAa3rD,IAAYR,EAAUzC,YAAW+C,GAAQ,UAAOA,EAAP,SAA5D,SAAqFR,IACpFutD,GAAeC,GACZ,cAACL,EAAD,UACI,cAACQ,EAAA,EAAD,CACIC,cAAeH,EACf52D,KAAM22D,EACNhtD,SAAUA,GAAQ,UAAOA,EAAP,kBAK3BE,GAlDK,SAACnR,GACjB,MAAmB,mBAARA,EACAA,EACH,cAAC29D,EAAD,CAAeb,WAAW,EAA1B,SACI,cAAC3vD,EAAD,CAAae,YAAU,uBAAvB,SACI,cAACs+C,EAAA,EAAD,QAIR,cAACmR,EAAD,CAAeb,WAAW,EAA1B,SACI,cAAC3vD,EAAD,CAAae,YAAU,uBAAvB,SACI,cAACq+C,EAAA,EAAD,QAOZ,cAACoR,EAAD,CAAeb,WAAW,EAA1B,SACI,cAACW,EAAD,MA+Bcc,CAAYv+D,SAM3ByN,iBAAK6wD,GCrFdE,EAAsD,SAAAvxD,GAAU,IAC1DowD,EAAwBpwD,EAAxBowD,WAAe5lC,EAD0C,YACjCxqB,EADiC,gBAGjE,OAAOowD,EACH,cAAC,EAAD,eAA8B5lC,IAE9B,cAAC,EAAD,eAA+BA,KAIxBhqB,iBAAK+wD,I,0DCdPC,EAAkB1xD,IAAOC,IAAV,qLAOX,SAAAC,GAAK,uBAAIA,EAAMyxD,gBAAV,QAAsB,WAG/BC,EAAe5xD,IAAOC,IAAV,yNAWZM,EAAaP,IAAO0nB,KAAV,2GAMVmqC,EAAuB7xD,IAAO0nB,KAAV,qMAMpB,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5B0sE,EAAc9xD,IAAO0nB,KAAV,+XAIA,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAGjC,SAAA2b,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAOjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,Y,OChB1BwtE,IA1BiD,SAAC,GAO1D,IANHC,EAME,EANFA,UACAC,EAKE,EALFA,MACAvuD,EAIE,EAJFA,SACAwuD,EAGE,EAHFA,WACAhuD,EAEE,EAFFA,SACAytD,EACE,EADFA,SAEA,OACI,cAACD,EAAD,CAAiBC,SAAUA,EAA3B,SACI,eAACC,EAAD,CAAczwD,YAAW+C,EAAzB,UACI,cAAC3D,EAAD,CACI4D,MAA2B,kBAAbT,EAAwBA,EAAW,GADrD,SAGKA,IAEJsuD,GACG,cAACH,EAAD,oBAEHK,GAAcA,EACdD,GAAS,cAACH,EAAD,yB,+GClBbjpD,G,MAAoB,SAACw3C,EAAYjtC,GAC1C,IAAIktC,EAAaD,EAAK,YAAOA,GAAS,GAQtC,OANIC,EAAW5uC,SAAS0B,GACpBktC,EAAaA,EAAWntC,QAAO,SAAAtU,GAAC,OAAIA,IAAMuU,KAE1CktC,EAAW7oC,KAAKrE,GAGbktC,IAGE6R,EAAgB,SAAC9R,EAAYjtC,GACtC,IAAIktC,EAAaD,EAAK,YAAOA,GAAS,GAMtC,OAJKC,EAAW5uC,SAAS0B,IACrBktC,EAAW7oC,KAAKrE,GAGbktC,I,qFC9BE8R,E,KAAgBpyD,EAAO0nB,KAAV,0D,OCIXi9B,EAHO,kBAClB,cAACyN,EAAD,CAAejxD,YAAU,aAAzB,SAAuCkxD,Q,8BCFpC,IAAK9pD,EAOL,SAASw1B,EAAe7M,EAAagN,EAAwB3uC,GAChE,MAAO,CACHyL,KAAMuN,EAAQ+pD,iBACdphC,MACA3hC,SACA2uC,gBAID,SAASq0B,IACZ,MAAO,CACHv3D,KAAMuN,EAAQiqD,qBAKf,SAASC,EAAwBvhC,EAAa3hC,GACjD,MAAO,CACHyL,KAAMuN,EAAQmqD,2BACdxhC,MACA3hC,UAID,SAASojE,EAA4BpjE,GACxC,MAAO,CACHyL,KAAMuN,EAAQqqD,8BACdrjE,UAlCR,0K,SAAYgZ,K,oCAAAA,E,0CAAAA,E,wDAAAA,E,+DAAAA,M,mCCFL,IAAKsqD,EAAZ,oE,SAAYA,K,wBAAAA,E,kBAAAA,E,qBAAAA,M,KAUL,IAAMtvB,EAAc,c,oLCVd1wB,EACT,iDAISigD,EAAuB,uCACvBC,EACT,6CAGSxxD,GAAyB,mBART,gBAUrB,iFAF8B,cAPR,+BAWtB,gEAJ8B,cANE,oCAWR,gCALM,cAMjCuxD,EACG,0DAP8B,cAQjCC,EACG,8CAT8B,I,6BCVtC,oDAGaC,EAAa50D,sBACtB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,WACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAMhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACI2zB,OAAO,eACPggC,eAAe,QACf1zD,EAAE,qBACF4zB,UAAU,+BAQnB6/B,O,4GC5DR,SAASxsB,EACZ0sB,EACAhhD,GAEA,OAAQ,OAACA,QAAD,IAACA,OAAD,EAACA,EAAOS,UAAW,OAACugD,QAAD,IAACA,OAAD,EAACA,EAASvgD,QAC/BT,EAAMiB,QAAO,SAAAgB,GAAC,OAAIA,EAAE1U,IAAMyzD,EAAQxhD,SAASyC,EAAE1U,OAC7C,GCFH,SAASi/C,IACZ,OAAO/5C,yBAAsC,WACzC,MAAM,IAAInF,MAAM,wB,6BCJxB,4dAAO,IAAMwI,EAAe,qBACfC,EAAuB,6BACvBC,EAAuB,6BACvBC,EAAsB,sBACtBC,EAA8B,8BAC9BC,EAA8B,8BAC9BC,EAA4B,4BAElC,SAAS6qD,IACZ,MAAO,CACHn4D,KAAMgN,GAIP,SAASorD,EAAwBjhE,GACpC,MAAO,CACH6I,KAAMiN,EACN9V,QAID,SAASkhE,EAAwBzzD,GACpC,MAAO,CACH5E,KAAMkN,EACNtI,SAID,SAAS0zD,IACZ,MAAO,CACHt4D,KAAMmN,GAIP,SAASu9B,EAAyBvzC,GACrC,MAAO,CACH6I,KAAMoN,EACNjW,QAID,SAASohE,EAAyB3zD,GACrC,MAAO,CACH5E,KAAMqN,EACNzI,SAID,SAAS4zD,IACZ,MAAO,CACHx4D,KAAMsN,K,+BCpDd,mIASO,SAASmhC,IACZ,IAAMgqB,EAAiBx3B,IAAQnrC,IAAI4iE,IAAYC,aAC/C,SACIF,GACAA,IAAmBG,OAAOrtD,IAAc,eAazC,SAASstD,IACZ,IAAMC,EAAWnzB,OAAOozB,UAAUD,SAQlC,OADIz3B,OAAOtrB,KANG,CACVijD,IAAK,SACLC,IAAK,UACLC,MAAO,UAGY31B,MAAK,SAAArN,GAAG,OAAI4iC,EAASpiD,SAASwf,OAAS,UAI3D,SAASijC,IACZ,OAAOC,I,6BCvCX,kBAKaC,EAAQj2D,sBAGnB,WAAwCC,GAAS,IAA9CC,EAA6C,EAA7CA,UAA6C,KAAlCC,OAAkC,EAA1BvD,aAA0B,MAAnB,QAAmB,EAuD9C,MAtDoD,CAChDs5D,MACI,qBACIj2D,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,cACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBACIS,KAAK,eACLC,SAAS,UACTb,MAAM,OACNC,OAAO,OAJX,SAMI,sBACIa,EAAE,otBAWlBg1D,KACI,qBACIl2D,IAAKA,EACLC,UAAWA,EACXK,MAAM,6BACNF,MAAM,OACNC,OAAO,OACPF,QAAQ,YANZ,SAQI,oBAAGa,KAAK,OAAOC,SAAS,UAAxB,UACI,sBACIC,EAAE,gBACF4zB,UAAU,4CAEd,sBACI9zB,KAAK,eACLC,SAAS,UACTC,EAAE,kVACF4zB,UAAU,kDAOXn4B,MAGRq5D,O,6BCvCR,SAASG,EAAY9lC,GAExB,OAAO2N,OAAOo4B,OACV/lC,EAAQtsB,QACGssB,EAAO,MAAmB,GACrC,CACIgmC,UAAWN,2CACXO,SAAUP,eAMtB,IAAIQ,EAEG,SAASC,EAAeC,GAC3BF,EAAUE,EAGP,SAASxwB,IACZ,OAAOswB,EApBX,uG,6BCvBA,oEAAO,IAAMpjD,EAAuB,UAEvBC,EAA6D,CACtEsjD,UAAW,CAAC,gBAAiB,aAAc,YAC3CC,YAAa,CAAC,gBAAiB,aAAc,YAC7CC,SAAU,CACN,WACA,cACA,qBACA,qBAEJz8B,MAAO,CAAC,cAAe,gBACvB08B,YAAa,CAAC,gBACdC,oBAAqB,CAAC,gBACtBp/D,WAAY,CAAC,iB,wTCXJ2vD,EAAoB,SAACtuC,EAAc3kB,GAAf,OAAuC,SACpEoX,GAEA,IAAIurD,EAAa,YAAOvrD,GAOxB,OANIpX,GAAYA,EAASkgB,SACrByiD,EAAgBA,EAAcjiD,QAAO,SAAAC,GAAI,OACrC3gB,EAASif,SAAS0B,EAAKrhB,YAI1BqlB,EAIEg+C,EAAcjiD,QACjB,SAAAC,GAAI,OAA6D,IAAzDA,EAAK3f,KAAK6S,cAAckR,QAAQJ,EAAK9Q,kBAJtC8uD,IAeFC,EAAqC,WAC9C,OAAOrlE,uBAAY,SAACklB,EAAyBC,GACzC,IAD8D,EAC1DmgD,EAA6C,GAC7CC,EAAwB,GAEtBC,EAAmBrgD,EAAOhC,QAAO,SAAAylC,GACnC,OAAO1jC,EAAcxD,SAASknC,EAAWn5C,OALiB,cAO3C+1D,GAP2C,IAO9D,2BAAqC,CAAC,IAAD,EAA5BrgD,EAA4B,sBACRA,EAAOtL,aADC,IACjC,2BAA6C,CAAC,IAArCvU,EAAoC,QACzCggE,EAAmBhgE,EAAaA,cAC5BggE,EAAmBhgE,EAAaA,cAAgB,GAAK,GAH5B,gCAPyB,8BAc9D,IAAK,IAAMA,KAAgBggE,EACnBA,EAAmBhgE,KAAkB4f,EAAcvC,OACnD4iD,EAAY99C,KAAK1B,OAAOzgB,IAExBigE,EAAY99C,MAAM1B,OAAOzgB,IAIjC,OAAOigE,IACR,KAwBME,EAA2B,WACpC,OAAOzlE,uBACH,SACIklB,EACAC,EACA7f,GAEA,IAoBO,IAhBDogE,EAJmBvgD,EAAOhC,QAAO,SAAAylC,GACnC,OAAO1jC,EAAcxD,SAASknC,EAAWn5C,OAGKwB,KAC9C,SAAA23C,GAAU,OAAIA,EAAW/uC,eAGvB8rD,EAAqBC,IAAOjM,QAAQ+L,GAEpCG,EAA0B,OAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAoBxiD,QACnD,SAAApd,GAAU,OAAIA,EAAWT,eAAiBmd,KAAKqX,IAAIx0B,MAIvD,OAC8B,OAA1BugE,QAA0B,IAA1BA,OAAA,EAAAA,EAA4BljD,QAAS,IAtCZ,SACrC9I,GAEA,IAAMisD,EAAkBjsD,EAAY,GAEpC,OAAOA,EAAY6K,OAAM,SAAAtB,GAAI,OAAQ,OAAJA,QAAI,IAAJA,OAAA,EAAAA,EAAMkwB,WAAYwyB,EAAgBxyB,WAkCtDyyB,CAAiCF,GAE3B,KAEP,oBACIA,EAA2Bt3B,MAAK,SAAAnrB,GAAI,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAMkwB,kBADlD,aACI,EACMA,eAFV,QAEqB,OAI7B,KAIK0yB,EAAiC,WAC1C,OAAOhmE,uBAAY,SAAC6qB,EAA+Bo7C,GAC/C,IADgF,EAC1EC,EAA+B,GAD2C,cAGzDD,GAHyD,IAGhF,2BAA2C,CAAC,IAAnClgE,EAAkC,QAElC8kB,EAAoBnJ,SAAS3b,IAC7B8kB,EAAoBnJ,UAAU3b,IAE/BmgE,EAAmBz+C,KACf1hB,EAAa,GAAKA,EAAaA,IATqC,8BAchF,OAAOmgE,IACR,KAOMC,EAAiC,WAC1C,OAAOnmE,uBAAY,SAAComE,EAAiBv7C,EAA+Bo7C,GAChE,IAAMC,EAA+BN,IAAOS,IAAIx7C,EAAqBo7C,GAC/DzyB,EAAiC,GAQvC,OANA4yB,EAAgBxgD,SAAQ,SAAC0gD,GACjBJ,EAAmBxkD,SAAS4kD,EAAK72D,KACjC+jC,EAAqB/rB,KAAK6+C,EAAKh5D,iBAIhCkmC,IACR,KAUM+yB,EAAuC,SAChDH,EACAv7C,EACAo7C,GAEA,IADC,EACKO,EAA4C,GAC5C7yB,EAAqB,GAF1B,cAIsB9oB,GAJtB,yBAIQ9kB,EAJR,QAKS0gE,EAAeR,EAAmB13B,MACpC,SAAAnrB,GAAI,OACAA,EAAK9d,eAAiBS,EAAWT,gBAGzC,GAAKmhE,GAEE,GAAIA,EAAanzB,UAAYvtC,EAAWutC,QAAS,CAAC,IAAD,EAC9ChmC,EAAY,UAAG84D,EAAgB73B,MAAK,SAAC+3B,GAAD,OAAUA,EAAK72D,KAAO1J,EAAWT,uBAAzD,aAAG,EAAqEgI,aAC1FqmC,EAAmBlsB,KAAK,CACpBna,aAAcA,EACdgmC,QAASvtC,EAAWutC,gBALxBkzB,EAAiB/+C,KAAK1hB,IAP9B,2BAA6C,IAJ5C,8BAqBD,MAAO,CAAEygE,mBAAkB7yB,uBAWlBkgB,EAAiD,SAC1D6S,GAEA,IAAM/S,EAAwB,GAU9B,OARa+S,EAAwBz1D,KAAI,SAAApC,GAAC,OAAIA,EAAEvJ,gBAE3CsgB,SAAQ,SAAAsb,GAAQ,IAAD,IAChByyB,EAASlxC,KAAKqX,IAAIoH,IAAlB,iBACIwlC,QADJ,IACIA,GADJ,UACIA,EAAyBvjD,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,eAAiB47B,KAAK,UADjE,aACI,EACMoS,eAFV,QAEqB,MAGlBqgB,I,mGCnNEgT,E,KAAK32D,EAAO42D,GAAV,6FACT,SAAA12D,GAAK,OACHA,EAAM6vD,WAAN,sC,OCkBO8G,EAjBqBn2D,gBAAK,SAAAR,GAAU,IACvCwD,EAA8DxD,EAA9DwD,SAAUpF,EAAoD4B,EAApD5B,UAAW8F,EAAyClE,EAAzCkE,QAAS0yD,EAAgC52D,EAAhC42D,SAAU5yD,EAAsBhE,EAAtBgE,SAAawmB,EADf,YACwBxqB,EADxB,0DAG9C,OACI,cAACy2D,EAAD,2BACQjsC,GADR,IAEIpsB,UAAWA,EACXD,IAAKy4D,EACL1yD,QAASA,EACT2rD,YAAa3rD,EACbjD,YAAW+C,GAAY,YAN3B,SAQKR,S,+BCjBb,kCAAO,IAAM0lD,EAAsB,I,uRCCtB2N,EAAiB,WAC1B,IAAMC,EAAQr2B,OAAOozB,UAAUkD,UAAU3wD,cACzC,QAAQ,GACJ,KAAK0wD,EAAMx/C,QAAQ,QAAU,EACzB,MAAO,OACX,KAAKw/C,EAAMx/C,QAAQ,QAAU,KAAQmpB,OAAeu2B,IAChD,MAAO,QACX,KAAKF,EAAMx/C,QAAQ,WAAa,KAAQmpB,OAAew2B,OACnD,MAAO,SACX,KAAKH,EAAMx/C,QAAQ,YAAc,EAC7B,MAAO,KACX,KAAKw/C,EAAMx/C,QAAQ,YAAc,EAC7B,MAAO,UACX,KAAKw/C,EAAMx/C,QAAQ,WAAa,EAC5B,MAAO,SACX,QACI,MAAO,UA4BZ,SAAS4/C,IACZ,MAA4B,YAArBL,IAGJ,SAASM,IACZ,MAA4B,WAArBN,IAGJ,SAASO,IACZ,MAA4B,UAArBP,IAGJ,SAASQ,IACZ,MAA4B,SAArBR,IAGJ,SAASS,IACZ,MAA4B,WAArBT,IAQJ,SAASU,IACZ,IAAMC,EA7CV,WAUI,IATA,IAAMT,EAAYlD,UAAUkD,UAS5B,MAAmC56B,OAAO6pB,QARzB,CACbyR,QAAS,qBACTC,MAAO,2BACPC,GAAI,qBACJC,KAAM,kBACNC,OAAQ,oBACRC,OAAQ,uBAEZ,eAA6D,CAAC,IAAD,sBAAjDC,EAAiD,KAApCC,EAAoC,KACzD,GAAIA,EAAM3+B,KAAK09B,GAAY,CAAC,IAAD,IACjBkB,EAAc,iBAAGlB,QAAH,IAAGA,GAAH,UAAGA,EAAWmB,MAAMF,UAApB,aAAG,EAA0B,UAA7B,QAAmC,GACvD,MAAM,GAAN,OAAUD,EAAV,YAAyBE,IAGjC,MAAO,kBA6BaE,GACpB,GACI,iEAAiE9+B,KAC7Dw6B,UAAUkD,WAEhB,CAEE,IAAMmB,EAAQrE,UAAUkD,UAAUmB,MAC9B,wCAEJ,GAAIA,EAAO,CAAC,IAAD,cACkCA,EADlC,GACEE,EADF,KACcC,EADd,KAEP,MAAM,GAAN,OAAUD,EAAV,YAAwBC,EAAiB5oE,QACrC,KACA,KAFJ,YAGK+nE,GAEL,MAAO,wBAIX,OAAOA,EAQR,SAASc,IAA4B,IAAD,MACjCC,GACF,UAAC1E,iBAAD,eAAoB0E,cAApB,UACC1E,iBADD,aACA,EAAoB2E,iBADpB,UAEC3E,iBAFD,aAEA,EAAoB4E,kBAExB,OAAIF,GACOA,EAAWG,eAEX,Y,yIC9FFC,EAOR,SAAC,GAAuE,IAArEC,EAAoE,EAApEA,OAAQ9oC,EAA4D,EAA5DA,QAAS7rB,EAAmD,EAAnDA,MAAO40D,EAA4C,EAA5CA,SAAUC,EAAkC,EAAlCA,eAAgB/O,EAAkB,EAAlBA,YAAkB,EAClC9mC,mBAAS,CAC3C1vB,KAAMslE,EACNx+D,KAAM,GACNhK,OAAO,EACP0oE,QAAQ,IAL4D,mBACjEC,EADiE,KACpDC,EADoD,KAQlEC,EAA0B,SAACloC,EAAarrB,GAC1CszD,GAAe,SAAAjV,GAAS,kCAAUA,GAAV,kBAAsBhzB,EAAMrrB,QAGxD,OACI,qCACI,cAAC,IAAD,CAAa1E,YAAU,cAAvB,mBACA,eAAC,IAAD,WACI,cAAC,IAAD,CAA4BA,YAAU,oBAAtC,SACOgD,GAEG,gDAEV,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,IAAD,CACInJ,KAAK,OACLvH,KAAK,OACLg4D,aAAa,sBACb5lD,MAAOqzD,EAAYzlE,KACnBgQ,MAAM,OACN+nD,kBAAkB,OAClB6N,gBAAiB,IACjB3zC,UAAW,IACXhnB,OAAO,OACPonB,aAAc,SAACT,GAAD,OACV+zC,EAAwB,OAAQ/zC,EAAEgwB,OAAOxvC,QAE7C3B,SAAS,iBAGjB,cAAC,IAAD,CACI2B,MAAOqzD,EAAY3+D,KACnBgwB,SAAU,SAAClF,GAAD,OACN+zC,EAAwB,OAAQ/zC,EAAEgwB,OAAOxvC,QAE7CpS,KAAK,mBACLw2D,YACMA,IAEI+O,EACA,0IACgBA,GAAkB,IAClC,2CAEV9b,IAAK,IACLoc,QAAS,EACT32D,SAAS,OACT42D,sBAAuB,IACvBnqC,QAAQ,YACRvsB,aAAa,MACb22D,kBAAkB,OAClBC,aAAcx1E,IAAUC,OAAOQ,WAC/Bwf,SAAS,qBAGjB,eAAC,IAAD,CAAei9C,UAAW,GAA1B,UACI,cAAC,IAAD,CACI1iD,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRnvB,QAAQ,UACRqD,SAAS,eALb,oBASA,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQ,mBAAQq+D,GAAUA,EAAOI,IACjCt1D,UACKs1D,EAAYzlE,OACZylE,EAAY3+D,OACX2+D,EAAY3oE,QAAU2oE,EAAYD,OAExC11D,oBAAqBtf,IAAUC,OAAOQ,WACtCwf,SAAS,aAVb,6B,6BChGpB,sEAOa4hD,EAAsB,WAAyB,IAAD,MACxB9M,cAAvB3nC,EAD+C,EAC/CA,YAAaC,EADkC,EAClCA,MACfkjB,EAAWlb,aAAY,SAAAxX,GAAK,OAAIA,KAEtC,QAAoB/Q,IAAhBsgB,EACA,MAAM,IAAI7R,MACN,+FAIR,IAAMi1B,EAAyC,UAO3CD,EAASnjB,UAPkC,iBAO3C,EAAuBqoD,oBAPoB,aAO3C,EAAsCpoD,GAASE,KAMnD,GAJIijB,IACAA,EAAYpgB,UAAsB,OAAXogB,QAAW,IAAXA,OAAA,EAAAA,EAAapgB,SAASpT,KAAI,SAACmS,GAAD,OAAUumD,mBAASvmD,GAAQA,EAAO,CAAC9d,aAAc8d,EAAMkwB,QAAS,WAAU,KAG1H7O,EACD,MAAM,IAAIj1B,MAAJ,4BACmB6R,EADnB,sCAKV,OAAOojB,I,6JCvBLm1B,EAAO5pD,IAAOC,IAAV,2DACQ,SAAAC,GAAK,OAAOA,EAAM05D,WAAa,OAAS,aACpD,SAAA15D,GAAK,OAAKA,EAAMxB,OAAN,kBAA0BwB,EAAMxB,OAAhC,OAA8C,MAmBjDm7D,EAA8C,SAAC,GAcrD,IAAD,EAbFC,EAaE,EAbFA,aACAC,EAYE,EAZFA,UACA5nD,EAWE,EAXFA,WACAynD,EAUE,EAVFA,WACAI,EASE,EATFA,cACAC,EAQE,EARFA,iBACA37D,EAOE,EAPFA,UACAI,EAME,EANFA,OACAgF,EAKE,EALFA,SACAw2D,EAIE,EAJFA,cACAC,EAGE,EAHFA,eACAC,EAEE,EAFFA,mBACAC,EACE,EADFA,YAEMC,EAAU11D,qBAAW21D,GACrBC,EAAUr1C,mBACVs1C,EAAYx8C,mBACd,yBACO27C,IAAF,OAAgBY,QAAhB,IAAgBA,OAAhB,EAAgBA,EAASzqC,WAA1B,OACAiqC,QADA,IACAA,OADA,EACAA,EAAejqC,WADf,UAEAuqC,EAAQN,qBAFR,aAEA,EAAuBjqC,UACvB,OAEJ,CACI6pC,EADJ,OAEIY,QAFJ,IAEIA,OAFJ,EAEIA,EAASzqC,QAFb,OAGIiqC,QAHJ,IAGIA,OAHJ,EAGIA,EAAejqC,QAHnB,UAIIuqC,EAAQN,qBAJZ,aAII,EAAuBjqC,UAGzBe,IACA2pC,GACmB,kBAAdV,GACe,kBAAf5nD,MACJ+nD,KAAmBC,KAAoBC,GAExCM,EAAkB1qE,uBAAY,kBAAMyqE,IAAW,CAACA,IAEhDE,EAAiB3qE,uBAAY,WAC/B,GAAI8gC,GAAWipC,EAAa5nD,EAAa,CACrC,IAAMzf,EAAQ+f,KAAKC,IAAIP,EAAa4nD,EAAaD,GAC3CnnE,EAAS8f,KAAKC,IAAIP,EAAa4nD,GACjCG,GAAeA,EAAcxnE,GAC7BynE,GAAgBA,EAAexnE,GAC/BynE,GAAoBA,EAAmB1nE,MAEhD,CACCo+B,EACAgpC,EACAC,EACA5nD,EACA+nD,EACAC,EACAC,IAGJ,OACI,cAACxQ,EAAD,CACItrD,UAAWA,EACXD,IAAKm8D,EACLZ,WAAYA,EACZl7D,OAAQA,EAJZ,SAMI,cAAC,IAAD,CACIk8D,UAAW,EACXC,SAAUF,EACVG,QAAShqC,GAAWipC,EAAa5nD,EACjC4oD,OAAQV,EAAc,6BAAQ,cAAC,IAAD,GAAa,+BAC3CW,YAAaf,EACbS,gBACMT,OAAmBlpE,EAAY2pE,EAErCO,UAAW,IACX38D,UAAWA,EAVf,SAYKoF,OAUJ62D,EAA0B51D,wBAErC,K,yJCxHWu2D,EAAyD,CAClEC,QAAS,CAAC,GAAM,gCAAiC,GAAM,oCACvDC,KAAM,CAAC,GAAM,6BAA8B,GAAM,iCACjDC,QAAS,CAAC,GAAM,wBAAyB,GAAM,6BAGtCC,GAGZ,mBACIhpB,IAAiB3U,QAAU,CACxBx5B,MAAO,cACPD,SAAU,gBAHjB,cAKIouC,IAAiBsb,SAAW,CACzBzpD,MAAO,cACPD,SAAU,gBAPjB,cASIouC,IAAiB1lD,UAAY,CAC1BuX,MAAO,YACPD,SAAU,cAXjB,GAeYwvD,EAAc,CACvBC,YAAa,gB,6BC3BjB,gQAiBa4H,EAA2B,WACpC,IAAMl6D,EAAWO,cACX45D,EAAoB59D,eAC1B,OAAO5N,uBACH,SAACuJ,EAAckiE,GACX,OAAOD,EAAkBjiE,GACpB+xB,MAAK,SAACma,GACH,GAAmB,UAAfA,EAAI1zC,OACJ,MAAM0zC,EAAI7kC,QAEd,IAAM86D,EAAe,CACjB/8B,UAAW8G,EAAI9G,UACfE,SAAU4G,EAAI5G,SACdtuC,MAAOk1C,EAAIl1C,MACXkuC,eAAgBgH,EAAIlsC,KACpBvF,KAAMyxC,EAAIzxC,MAGd,OADAqN,EAASqkC,YAAyBg2B,IAC3BA,KAEVlwC,OAAM,SAAC5rB,GACW,OAAf67D,QAAe,IAAfA,KAAe,OAAG77D,QAAH,IAAGA,OAAH,EAAGA,EAAOgB,cAGrC,CAACS,EAAUm6D,KAING,EAAgB,WACzB,IAAMt6D,EAAWO,cACjB,OAAO5R,uBAAY,WACf00C,cACArjC,EAASu6D,iBACV,CAACv6D,KAGKw6D,EAAc,WACvB,IAAMC,EAAcjsE,cACpB,OAAOG,uBACH,SAACT,GACG,OAAOusE,EAAYvsE,GACdi8B,OAAM,SAAC5rB,GACJ,MAAMA,OAGlB,CAACk8D,KAIIC,EAAW,WACpB,IAAMC,EAAW7rE,eACjB,OAAOH,uBACH,SAACT,GACG,OAAOysE,EAASzsE,GACXi8B,OAAM,SAAC5rB,GAEJ,MADA8kC,cACM9kC,OAGlB,CAACo8D,KASIC,EAAsB,WAC/B,IAAMC,EAAsB7rE,eAC5B,OAAOL,uBACH,SAACT,GACG,OAAO2sE,EAAoB3sE,GACtBi8B,OAAM,SAAC5rB,GAEJ,MADA8kC,cACM9kC,OAGlB,CAACs8D,KAUIC,EAAyB,WAClC,IAAM96D,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EAASmyD,iBACV,CAACnyD,M,gHC3FO+6D,EAfah+D,sBACxB,WAAwBC,GAAQ,EAA7BC,UAA6B,EAAlBC,OACV,OACQ,sBACAE,MAAM,KACNC,OAAO,KACNW,KAAK,OACLV,MAAM,6BAJP,UAKI,wBAAQ09D,GAAG,IAAIC,GAAG,MAAM9iD,EAAE,IAAIna,KAAK,YACnC,sBAAME,EAAE,+pBAA+pBF,KAAK,UAAUk9D,YAAY,cCLhtBC,EAAuBx8D,IAAOC,IAAV,wRASN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAW1Ci2E,EAAcz8D,IAAOC,IAAV,gDAIJoxD,EAMR3wD,gBAAK,YAMH,IALHnG,EAKE,EALFA,KACA+2D,EAIE,EAJFA,cACAptD,EAGE,EAHFA,SACAzJ,EAEE,EAFFA,OACAiiE,EACE,EADFA,SAEI,OACI,mCACI,cAACF,EAAD,CAAsBp4D,QAAS,SAACihB,GAAOA,EAAEC,kBAAyB,OAAN7qB,QAAM,IAANA,QAA5D,SACI,cAACiyC,EAAA,EAAD,CACIjpC,MAAOlJ,EACPqyC,OAAqB,QAAb8vB,EAAqB,oBAAqB,gBAClDp+D,UAAS,UAAmB,QAAdo+D,EAAsB,MAAQ,GAAnC,qBACT/vB,QAAS,QACT2kB,cAAeA,EACfptD,SAAUA,GAAQ,UAAOA,EAAP,SANtB,SAQI,cAACu4D,EAAD,CAAat7D,YAAW+C,GAAQ,UAAOA,EAAP,SAAhC,SACI,cAAC,EAAD,gB,yGCKby4D,EA1DIv+D,sBACf,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,mPACF4zB,UAAU,wD,SCU3BypC,EA1DYx+D,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,yXACF4zB,UAAU,yE,sBCjD7B0pC,EAAqB78D,IAAOC,IAAV,oLAQzB,SAAAC,GAAK,OACHA,EAAM0D,UACN+jB,YADA,qEAMKm1C,EAAiB98D,IAAOC,IAAV,mZAQd,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAE/B,SAAAwb,GAAK,OACHA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOU,SACnBsb,EAAMI,MAAMpc,OAAOQ,cACb,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAOnC,SAAAub,GAAK,OAAKA,EAAM0D,UAAY1D,EAAMI,MAAMpc,OAAOI,eAElD,SAAA4b,GAAK,OAAKA,EAAM0D,UAAY1D,EAAMI,MAAMpc,OAAOI,eAEvD,SAAA4b,GAAK,OACHA,EAAMC,MAAN,uBAEKD,EAAMI,MAAMpc,OAAOI,YAFxB,oCAGgB4b,EAAMI,MAAMpc,OAAOI,YAHnC,qCAIgB4b,EAAMI,MAAMpc,OAAO+D,cAJnC,UAMF,SAAAiY,GAAK,OACHA,EAAM0D,UACN+jB,YADA,wIAGwBznB,EAAMI,MAAMpc,OAAOU,aAGjD,SAAAsb,GAAK,OACCA,EAAM68D,aAAN,sCAEoB78D,EAAMI,MAAMpc,OAAOU,SAFvC,UAMKo4E,EAAmBh9D,IAAOC,IAAV,gGAKvB,SAAAC,GAAK,OACHA,EAAM0D,UACN+jB,YADA,6DAEa,SAAAznB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,eAIpCq4E,EAAYj9D,IAAOC,IAAV,4HAMhB,SAAAC,GAAK,OACHA,EAAM0D,UACN+jB,YADA,kEC5DKu1C,EAA0C,SAAC,GAOjD,IANH/8D,EAME,EANFA,KACA46C,EAKE,EALFA,WACAnyC,EAIE,EAJFA,eACAm0D,EAGE,EAHFA,YACAz+D,EAEE,EAFFA,UACA4F,EACE,EADFA,SACE,EACkDif,mBAAc,IADhE,mBACKg6C,EADL,KACyBC,EADzB,KAEI5rE,EAAS0hB,cAAyB/gB,KAClCyR,IACAu5D,GAAsBA,EAAmBxqD,OAAS,KAAOxS,EAuB/D,OArBAmjB,qBAAU,WACFnjB,GAAQg9D,EAAmBxqD,OAAS,IAC1B,OAAVooC,QAAU,IAAVA,UAEL,CAACoiB,EAAoBh9D,EAAM46C,IAE9Bz3B,qBAAU,WACN,IAAMpO,GAAiBtM,GAAkB,IAAI3H,KAAI,SAAAmS,GAAI,OACjDA,GAAQ,EAAIA,EAAOX,KAAKqX,IAAI1W,MAGhC,GAAM5hB,GAAUA,EAAO0gB,MAAMS,OAAS,GAAKuC,EAAe,CACtD,IAIMmoD,EAJoB,IAAIC,IAC1B9rE,EAAO0gB,MACPgD,GAE4BqoD,WAChCH,EAAsBC,MAE3B,CAAC7rE,EAAQoX,IAGR,cAACi0D,EAAD,CACIz4D,QAAS,SAAAihB,GACLA,EAAEC,kBACE1hB,GACAm3C,GACAA,KAGRn3C,SAAUA,EACVtF,UAAWA,EATf,SAWI,eAACw+D,EAAD,CACI38D,KAAMA,EACNyD,SAAUA,EACVm5D,YAAaA,EACb57D,YAAW+C,GAAY,eAJ3B,UAMI,cAAC84D,EAAD,CAAkBp5D,SAAUA,EAA5B,SACKm5D,EAAc,cAAC,EAAD,IAAkB,cAAC,EAAD,MAErC,cAACE,EAAD,CAAWr5D,SAAUA,EAArB,SACKm5D,EACK,GACAI,EACAA,EAAmBxqD,OACnB,W,+BClF1B,+EASa6qD,EAAsB74D,6BAA4B5T,GAExD,SAAS0sE,IACZ,OAAO74D,qBAAW44D,K,gCCZtB,oEAAO,IAAME,EAAa,SACtBC,EACApuE,GAEA,OAAKA,EAIE8sC,OAAOtrB,KAAKxhB,GAAQ8nB,QAAO,SAACumD,EAAKC,GACpC,IAAMh4D,EAAQtW,EAAOsuE,GACrB,OAAIh4D,EACO+3D,EAAIjuE,QAAJ,WAAgBkuE,GAASh4D,GAG7B+3D,IACRD,GAVQA,GAaFG,EAAuB,SAACp9B,EAAaq9B,EAAmBC,GACjE,IAAMC,EAAO,IAAIr9B,IAAIF,GAMrB,OALKs9B,EAGDC,EAAK9sE,aAAa0qD,IAAIkiB,EAAWC,GAFjCC,EAAK9sE,aAAaG,OAAOysE,GAItBE,EAAKruE,a,8BCzBhB,kIAQaovC,EAAuB,SAACzlC,GAAD,gBAC7BynC,SAASlpB,SAASomD,QADW,OACF30E,IAAOE,WAAWW,aADhB,kBACsCmP,IAE7D4kE,EAAe,SAACl3C,GACzB,IAAMm3C,EAAe3sC,IAAa3gC,IAAI,gBAAkB,UAExD,OAAOoqE,IAAakD,GAAan3C,IAQxBm1B,EAAe,SAAC1b,GACzB,IAAI29B,EAAoB,IAAIjlC,OAAJ,UAAc7vC,IAAOsC,oBAAoBC,eAAeC,IAAxD,UACpBuyE,EAAiB,IAAIllC,OAAJ,UAAc7vC,IAAOsC,oBAAoBK,WAAWH,IAApD,UACrB,QAAS20C,EAAI03B,MAAMiG,MACV39B,EAAI03B,MAAMkG,K,6BCtBvB,oEAAO,IAAMrlB,EAA6B,UAE7BC,EAAkE,CAC3E6b,UAAW,CAAC,gBAAiB,aAAc,YAC3CC,YAAa,CAAC,gBAAiB,aAAc,c,6BCRjD,kCAAO,IAAM3e,EAAS,SAACgD,EAAe9+C,EAAcgkE,EAAqBC,GACrE,OAAiB,IAAVnlB,GAAgBmlB,GAAsB,IAAVnlB,EAAe9+C,EAAQgkE,GAAU,UAAmBhkE,EAAnB,O,mFCC3DqvD,E,KAAO5pD,EAAOC,IAAV,qLASX,SAAAC,GAAK,OAAIA,EAAMzB,OAAN,iBAAyByB,EAAMzB,MAA/B,SAET,SAAAyB,GAAK,QAAMA,EAAMu+D,aAAR,wBAAwCv+D,EAAMu+D,YAA9C,UACT,SAAAv+D,GAAK,QAAMA,EAAM0zB,YAAR,uBAAsC1zB,EAAM0zB,WAA5C,U,OCMA8qC,EAf+Bh+D,gBAAK,SAAAR,GAAU,IACjDzB,EAAwDyB,EAAxDzB,MAAOiF,EAAiDxD,EAAjDwD,SAAUpF,EAAuC4B,EAAvC5B,UAAWmgE,EAA4Bv+D,EAA5Bu+D,YAAa7qC,EAAe1zB,EAAf0zB,WAEjD,OACI,cAACg2B,EAAD,CACInrD,MAAOA,EACPH,UAAWA,EACXmgE,YAAaA,EACb7qC,WAAYA,EAJhB,SAMKlwB,Q,+GCXPkf,EAAyB5iB,IAAOC,IAAV,gNAKd,SAAAC,GAAK,gBAAOA,EAAMxB,OAAb,SAMN,SAAAwB,GAAK,OAAIA,EAAMzB,SACf,SAAAyB,GAAK,OACVA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOG,cAG1C4nD,EAKRvrC,gBAAK,YAA6C,IAA1CjC,EAAyC,EAAzCA,MAAOuE,EAAkC,EAAlCA,MAAkC,IAA3BqB,YAA2B,MAApB,GAAoB,EAAhB/F,EAAgB,EAAhBA,UAClC,OACI,cAACskB,EAAD,CACInkB,MAAOA,GAAgB,OACvBH,UAAWA,EACX0E,MAAOA,EACPtE,OAAQ2F,EAJZ,SAMI,cAAC,IAAD,CAAkBA,KAAI,UAAKA,EAAL,MAAerB,MAAM,iBAKxCipC,O,8BCrCf,kBAGa2H,EAA2Bx1C,sBACpC,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBAAKD,IAAKA,EACNG,QAAQ,aACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BACXuC,YAAU,eAPd,UAQI,sBAAMquD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,2yEAA2yEF,KAAK,SACh2E,sBAAME,EAAE,qzLAAqzLF,KAAK,YACl0L,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yOAAyOF,KAAK,kBAM/Ru0C,O,6BCvBf,kBAGaC,EAAcz1C,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACQ,sBACIF,IAAKA,EACLG,QAAQ,aACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BACXuC,YAAU,eARd,YAUO5C,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,oBAAGI,KAAK,OAAOC,SAAS,UAAxB,UACI,sBACID,KAAK,UACLE,EAAE,iPAEN,sBACIF,KAAK,eACLE,EAAE,2tEAQfs0C,O,6BC9Df,kBAGakW,EAAS3rD,sBAClB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIU,SAAS,UACTD,KAAK,eACLE,EAAE,kYAOPwqD,O,6BCzBf,oEAAO,IAAM4U,EAAQ,CACjBC,UAAW,KAGFvM,EAAa,U,6BCGnB,IAAKwM,EAAZ,kC,SAAYA,O,mBAAAA,I,sCAAAA,M,mCCPZ,kBAGa1Z,EAAW/mD,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLK,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BANf,SAQI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,2jBACF4zB,UAAU,yDAU3BgyB,O,2OCiBF2Z,EAAuB,WAChC,IAAMz9D,EAAWO,cACXm9D,EAAa9nE,eACb+nE,EAAwBtlE,eACxBulE,EAAqBtlE,eACrBmY,EAAcnQ,cACpB,OAAO3R,uBAAY,WACf,IAAKq8B,cACD,OAAOva,EAAY,gDAAiD,SACxE,IAAMziB,EAASk9B,cACT2yC,EAA+B,CACjCH,EAAW1vE,GACX2vE,EAAsB3vE,GACtB4vE,EAAmB5vE,IAGvB,OADAgS,EAAS8xD,eACFxmC,QAAQsW,IAAIi8B,GACd5zC,MAAK,SAACn5B,GACH,IAAMsG,EAAOtG,EAAK,GACZgnB,EAAchnB,EAAK,GACnBsW,EAAetW,EAAK,GACpBgtE,EAAwB,2BACvB1mE,GADuB,IAE1B0gB,cACA1Q,iBAGJ,OADApH,EAAS+xD,YAAwB+L,IAC1BA,KAEV3zC,OAAM,SAAC5rB,GACJyB,EAASgyD,YAAwBzzD,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAU09D,EAAYC,EAAuBC,EAAoBntD,KAU5DstD,EAA0B,WACnC,IAAM/9D,EAAWO,cACXkQ,EAAcnQ,cAEd09D,EAAiBnmE,eACjBomE,EAAwBlmE,eACxBmmE,EAA8BC,cAYpC,OAAOxvE,uBACH,SACImC,EACA9C,EACAi2C,GAEE,IAAD,IADDm6B,IACC,yDACDp+D,EAASiyD,eACT,IASuB,EATjBoM,EAA2B,IAEjCA,EAAyBjoD,KACrB4nD,EAAc,OAAChwE,QAAD,IAACA,IAAD,OAAW8C,QAAX,IAAWA,OAAX,EAAWA,EAAMsN,GAAI,CAC/Bk/B,UAAS,iBAAExsC,QAAF,IAAEA,OAAF,EAAEA,EAAMwsC,iBAAR,QAAqB,GAC9BE,SAAQ,iBAAE1sC,QAAF,IAAEA,OAAF,EAAEA,EAAM0sC,gBAAR,QAAoB,MAIpC,OAAI1sC,QAAJ,IAAIA,OAAJ,EAAIA,EAAMkH,cACNqmE,EAAyBjoD,KACrB6nD,EAAqB,iBACjBjwE,QADiB,IACjBA,IADiB,OACP8C,QADO,IACPA,OADO,EACPA,EAAMsN,UADC,QACK,EACtBtN,EAAKkH,aACPiyB,MAAK,WACHi0C,EAA4B,CACxB9mE,KAAK,2BAAMtG,GAAP,IAAasN,GAAIpQ,IACrBswE,iBACIC,IAA6BC,aAMjD,OAAOlzC,QAAQsW,IAAIy8B,GACdp0C,MAAK,WAEIjqB,EADNikC,EACeI,YAAyB,CAAEjmC,GAAIpQ,IAC/Bsc,aAAkB,CAAElM,GAAIpQ,KACvCowE,GACI3tD,EAAY,mBAAoB,cAEvC0Z,OAAM,SAAC5rB,GAEEyB,EADNikC,EACeiuB,YAAyB3zD,GACzBgM,aAAkBhM,IAEjC6/D,GACI3tD,EACwB,MAApBlS,EAAM+kC,UAAoBpjC,IAA0BuxD,KAAwBlzD,EAAMgB,QAClF,cAIpB,CACIS,EACAk+D,EACAztD,EACAutD,EACAC,KAUCQ,EAAwB,WACjC,IAAMC,EAAcC,cACdC,EAAkBpmE,eAClBiY,EAAcnQ,cAQnB,OAAO3R,uBACJ,SAACX,EAAgB6wE,GACb,OAAOH,EAAYG,GACd50C,MAAK,SAAC/4B,GACH,OAAO0tE,EAAgB5wE,EAAQkD,MAElCi5B,OAAM,SAAC5rB,GAEJ,OADAkS,EAAYlS,EAAMgB,QAAS,SACpB+rB,QAAQC,OAAOhtB,QAGlC,CAACmgE,EAAaE,EAAiBnuD,M,gJClMhC,SAASqmC,EAAa7Z,EAAe6hC,GACxC,IACIC,EAAWD,GAAmB,aAC9BE,EAFoB,2BAGxB,GAAI/hC,EAASkG,QAAS,CAClB,IAAM87B,EAAKhiC,EAASkG,QAAQ,uBAGtB4zB,EADQ,yCACWmI,KAAKD,GAE9BD,EAAc/hC,EAASkG,QAAQ,gBAC/B47B,EAAWhI,EAAM,GAGrBgI,EAAWA,EAASzwE,QAAQ,KAAM,IAElC,IACI,IAAM6wE,EAAO,IAAI1/B,KAAK,CAACxC,EAASnsC,MAAQmsC,GAAW,CAC/CtjC,KAAMqlE,IAGV,GAAI1/B,OAAOozB,WAAcpzB,OAAOozB,UAAkB0M,iBAC7C9/B,OAAOozB,UAAkB0M,iBAAiBD,EAAMJ,OAC9C,CACH,IAAMM,EAAO//B,OAAOK,SAASC,cAAc,KAC3Cy/B,EAAKx/B,KAAOP,OAAOC,IAAIC,gBAAgB2/B,GACvCE,EAAKC,SAAWP,EAChBp/B,SAASI,KAAKC,YAAYq/B,GAC1BA,EAAKp/B,QACLN,SAASI,KAAKw/B,YAAYF,GAG9B,OAAO,EACT,MAAOG,GACL,OAAO,GAUR,SAAeC,EAAtB,oC,4CAAO,WACHpgC,EACA0/B,GAFG,SAAAnuD,EAAA,sEAIGgyB,IACDnzC,IAAI4vC,EAAK,CACN8D,QAAS,CACL,eAAgB,aAEpBu8B,aAAc,SAEjBz1C,MAAK,SAAAgT,GACF,GAAIA,EAASnsC,KAAM,CACf,IAAM+uC,EAAOP,OAAOC,IAAIC,gBAAgBvC,EAASnsC,MAC3C4uC,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAOA,EACZH,EAAKI,aACD,WADJ,UAEOi/B,EAAS5+C,UAAU,EAAG,IAF7B,SAKAwf,SAASI,KAAKC,YAAYN,GAG1BA,EAAKO,QAGLV,IAAIogC,gBAAgB9/B,GACpBH,EAAKub,aA5Bd,4C,mLC5CMntB,EAAUnvB,IAAOC,IAAV,+CAIPghE,EAAiBjhE,IAAOC,IAAV,8CAIdihE,EAAuBlhE,IAAOC,IAAV,iGAGf,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,U,yPCVxCg9E,EAAQnhE,IAAOC,IAAV,kVAWE,SAAAC,GAAK,OACVA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOO,aAK1C28E,EAKR,SAAC,GAA0C,IAAxC19D,EAAuC,EAAvCA,SAAUD,EAA6B,EAA7BA,MAAOT,EAAsB,EAAtBA,MAAOkB,EAAe,EAAfA,SAC5B,OAAO,cAACi9D,EAAD,CAAOn+D,MAAOA,EAAO7B,YAAW+C,EAAhC,SAA2CR,GAAYD,K,QCtB5D49D,EAAWrhE,IAAOC,IAAV,4VAMD,SAAAC,GAAK,OACRA,EAAM0D,SACF1D,EAAMI,MAAMpc,OAAOQ,WACjBwb,EAAMohE,YACRphE,EAAMI,MAAMpc,OAAOW,OACnBqb,EAAMI,MAAMpc,OAAOkB,SAQf,SAAA8a,GAAK,OACfA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAOqC,SACnB2Z,EAAMI,MAAMpc,OAAOC,SACnB,SAAA+b,GAAK,OAAKA,EAAM0D,SAAN,uBAEd,SAAA1D,GAAK,OACFA,EAAM0D,UAAP,sBAAkC1D,EAAMI,MAAMpc,OAAOqC,SAArD,QAGF,SAAA2Z,GAAK,OAAKA,EAAM0D,UAAP,mBAIN29D,EAaR,SAAC,GAaC,IAZH79D,EAYE,EAZFA,SACAU,EAWE,EAXFA,QACAyB,EAUE,EAVFA,MACApS,EASE,EATFA,KACA+tE,EAQE,EARFA,WACAntD,EAOE,EAPFA,SACAotD,EAME,EANFA,aACAC,EAKE,EALFA,YACA99D,EAIE,EAJFA,SACA09D,EAGE,EAHFA,YACA17C,EAEE,EAFFA,KACA1hB,EACE,EADFA,SAQA,OAAS0hB,EACL,cAAC8mB,EAAA,EAAD,CAASjpC,MAAOmiB,EAAMgnB,OAAO,cAA7B,SACI,cAACy0B,EAAD,CAAUz9D,SAAUA,EAAU09D,YAAaA,EAAangE,YAAW+C,EAAnE,SACKR,MAIT,cAAC29D,EAAD,CACIj9D,QAdiB,WACjBR,IACJQ,EAAQ,CAAEixC,OAAQ,CAAExvC,MAAOA,EAAOpS,KAAMA,KACnCiuE,GAAaF,MAYdntD,SAAUA,EACVzQ,SAAUA,EACV09D,YAAaA,EACbjjE,IAAKojE,EACLtgE,YAAW+C,EANf,SAQKR,K,QCjFP29D,EAAWrhE,YAAO8sC,IAAO7sC,IAAdD,CAAH,kRAIG,SAAAE,GAAK,OAAKA,EAAMzB,MAAQyB,EAAMzB,MAAQ,WAErC,SAAAyB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAExC,SAAA+b,GAAK,OAAIA,EAAMyhE,gBAQfC,EAAc5hE,IAAOC,IAAV,+FAQJ4hE,EAGR,SAAC,GAAuC,IAArCn+D,EAAoC,EAApCA,SAAUi+D,EAA0B,EAA1BA,aAAcljE,EAAY,EAAZA,MAC5B,OACI,cAAC,EAAD,CACI+vC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfkzB,aAAcA,GAA8B,QAC5CljE,MAAOA,EALX,SAOI,cAACmjE,EAAD,UAAcl+D,OCrCpBq+D,EAAe/hE,IAAOC,IAAV,sQASD,SAAAC,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAQzDq/D,EAAoBhiE,IAAOC,IAAV,2HAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5Bw9E,EASR,SAAC,GAAkE,IAAhEp8D,EAA+D,EAA/DA,MAAOq8D,EAAwD,EAAxDA,aAAcxjE,EAA0C,EAA1CA,OAAQ0wB,EAAkC,EAAlCA,QAASzsB,EAAyB,EAAzBA,SAAUuB,EAAe,EAAfA,SACpD,OACI,cAAC69D,EAAD,CACIrjE,OAAQA,EACR0F,QAAS89D,EACT9yC,QAASA,EACTzsB,SAAUA,EACVxB,YAAW+C,EALf,SAOI,cAAC89D,EAAD,UAAoBn8D,O,8CCjC1B1D,EAAc,CAChBE,MAAO,CACH+V,WAAYn0B,IAAUC,OAAOS,UAC7Bqe,MAAO/e,IAAUC,OAAOO,WAE5BS,KAAM,CACFkzB,WAAYn0B,IAAUC,OAAOiB,QAC7B6d,MAAO/e,IAAUC,OAAOqC,UAE5Bic,KAAM,CACF4V,WAAYn0B,IAAUC,OAAOqC,SAC7Byc,MAAO/e,IAAUC,OAAOkB,OAE5BC,YAAa,CACT+yB,WAAYn0B,IAAUC,OAAOmB,YAC7B2d,MAAO/e,IAAUC,OAAOO,YAI1Bk8D,EAAmB3gD,IAAOC,IAAV,gaAWR,SAAAC,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAE3C,SAAAwB,GAAK,OAAIiC,EAAOjC,EAAMW,SAASuX,cACpC,SAAAlY,GAAK,OAAIiC,EAAOjC,EAAMW,SAASmC,SACd,SAAA9C,GAAK,OAAKA,EAAMN,MAAQ,MAAQ,UAAW,SAAAM,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAGvF,SAAAoZ,GAAK,OAAKA,EAAM6lB,OAAS,EAAI,KACjC,SAAA7lB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAErB,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKvC6hC,EAAYvmB,YAAO86C,IAAP96C,CAAH,qDAIT4hD,EAAa5hD,IAAOC,IAAV,gPAUH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5B09E,EAmBR,SAAC,GAgBC,IAfH1+D,EAeE,EAfFA,MACA2+D,EAcE,EAdFA,WACAlwD,EAaE,EAbFA,MACArM,EAYE,EAZFA,MACA0kB,EAWE,EAXFA,SACA92B,EAUE,EAVFA,KACAgyB,EASE,EATFA,WACAk8C,EAQE,EARFA,aACAjjE,EAOE,EAPFA,OACAiE,EAME,EANFA,SACAiB,EAKE,EALFA,SACAtF,EAIE,EAJFA,UACAsB,EAGE,EAHFA,MACAyiE,EAEE,EAFFA,oBACAC,EACE,EADFA,cACE,EACsBn/C,oBAAS,GAD/B,mBACKhjB,EADL,KACW+lB,EADX,KAEIq8C,EAAcp9C,iBAAO,MACrBu8C,EAAc3gE,MAAMC,QAAQ6E,GAwB5B28D,EAvBkB,WACpB,GAAItwD,EAAO,CACP,IAAIgD,EAAgBhD,EAAMiB,QAAO,SAAAC,GAAI,OACjCrS,MAAMC,QAAQ6E,GACRA,EAAM6L,SAAS0B,EAAKvN,OACpBuN,EAAKvN,QAAUA,KAGzB,OAAIqP,EAAcvC,OAAS,EAChBuC,EAAc,IAAMA,EAAc,GAAGzhB,KAGxCyhB,GACAA,EACKjU,KAAI,SAAAmS,GACD,OAAOA,EAAK3f,QAEfP,KAAK,OAMLuvE,GAErB,OACI,eAAC9hB,EAAD,CACI9/C,QAAS4kB,GAA0B,QACnC7lB,MAAOA,EACPlB,OAAQA,EACRJ,UAAW,CAACA,EAAWsF,EAAW,mBAAgB7S,GAAWmC,KACzD,KAEJ6yB,OAAQ5lB,KAAW0F,GAASA,IAAUC,IAP1C,UASMrC,IAAUoC,GACPw8D,GACG5+D,KACEoC,GACFA,IAAUC,KACN,cAAC,EAAD,CAAarC,MAAOA,EAAOT,MAAOo/D,IAE9C,cAACxgB,EAAD,UAAazhD,EAAO,cAACs/C,EAAA,EAAD,IAAc,cAACD,EAAA,EAAD,MAClC,cAAC,EAAD,CACI35C,MACIw8D,GACMG,IAAiB7rC,IACb,GAEJ6rC,EAEVN,aAAc,kBAAOt+D,GAAYsiB,GAAS/lB,IAC1CzB,OAAQA,EACRiE,SAAUA,IAGd,cAAC4jB,EAAD,CAAWpmB,KAAMA,EAAM46C,WAAY70B,EAAnC,SACI,cAAC,EAAD,CAAYy7C,aAAcA,EAAcljE,MAAO6jE,EAA/C,SACKpwD,GACGA,EAAMjR,KAAI,SAACmS,GAAD,OACN,cAAC,EAAD,CACIquD,cAEQ1gE,MAAMC,QAAQ6E,GACRA,EAAM6L,SACF0B,EAAKvN,OAETuN,EAAKvN,QAAUA,GAEnB08D,EACA,KAGV18D,MAAOuN,EAAKvN,MACZpS,KAAMA,EACN+tE,WAAY,kBAAMt7C,GAAQ,IAC1B9hB,QAASmmB,EACTlW,SACItT,MAAMC,QAAQ6E,GACRA,EAAM6L,SAAS0B,EAAKvN,OACpBuN,EAAKvN,QAAUA,EAEzB67D,YAAaA,EAtBjB,SAwBKtuD,EAAK3f,MAZD2f,EAAKvN,mB,6BCvL1C,wIAAO,IAAM+S,EAAa,aACbE,EAAa,aACb4pD,EAAwB,wBAExBl7D,EAAqC,CAC9CE,WAAW,EACXuR,UAAW,KACXD,WAAY,O,+EC+BH2oB,G,WAAkB,SAAlBA,EACTghC,EACAC,EACAC,GAEA,IAAIn/D,EAAWi/D,EAAKxvD,QAAO,SAAAC,GAAI,OAAIA,EAAKmB,WAAaquD,KAErD,GAAMl/D,GAAcA,EAASiP,OAAQ,CACjCkwD,EAAOprD,KAAP,MAAAorD,EAAM,YAASn/D,IACf,IAAK,IAAIyQ,EAAI,EAAGA,EAAIzQ,EAASiP,OAAQwB,IACjCwtB,EAAgBghC,EAAMj/D,EAASyQ,GAAG1U,GAAIojE,O,qHClD5CC,EAAgB,SAAC9kB,EAAav+C,GAChC,OAAOu+C,EAAK7qC,QAAO,SAAA4vD,GAAQ,OAAIA,GAAYA,EAAStjE,KAAOA,KAAIkT,OAAS,GAGtEqwD,EAAwB,SAAxBA,EACF5vD,EACA6vD,EACAC,GAQA,OANI9vD,EAAK+vD,SACAL,EAAcI,EAAY9vD,EAAK+vD,OAAO1jE,KACvCwjE,EAASxrD,KAAKrE,EAAK+vD,QAEvBH,EAAsB5vD,EAAK+vD,OAAQF,EAAUC,IAE1CD,GAGE/4C,EAAa,SAAC8zB,GACvB,IAAKA,EAAM,MAAO,GAClB,IAFwC,EAEpColB,EAAiB,GAFmB,cAGvBplB,GAHuB,IAGxC,2BAAuB,CAAC,IAAf5qC,EAAc,QAWnB,GAVK0vD,EAAcM,EAAWhwD,EAAK3T,KAC/B2jE,EAAU3rD,KAAKrE,GAGfA,EAAK+vD,SACLC,EAAS,sBACFA,GADE,YAEFJ,EAAsB5vD,EAAM,GAAIgwD,MAGvChwD,EAAK1P,SAAU,CAAC,IAAD,gBACG0P,EAAK1P,UADR,IACf,2BAAiC,CAAC,IAAzBqR,EAAwB,QACxB+tD,EAAcM,EAAWruD,EAAMtV,KAChC2jE,EAAU3rD,KAAK1C,IAHR,iCAdiB,8BAuBxC,OAAOquD,GAIEv5C,EAAc,SAAdA,EAAe84C,GAA2C,IAA9BtiB,EAA6B,uDAAd,GACpD,KAAI,OAACsiB,QAAD,IAACA,OAAD,EAACA,EAAMhwD,QAAQ,MAAO,GADwC,oBAEjDgwD,GAFiD,IAElE,2BAAuB,CAAC,IACgB,EAD/BzrD,EAAc,QACnB,IAAK4rD,EAAcziB,EAAOnpC,EAAKzX,IAC3B4gD,EAAM5oC,KAAKP,GACPA,EAAKisD,SACL9iB,EAAQx2B,EAAY,CAAC3S,EAAKisD,QAAS9iB,KAEvC,UAAInpC,EAAKxT,gBAAT,aAAI,EAAeiP,UACf0tC,EAAQx2B,EAAY3S,EAAKxT,SAAU28C,KATmB,8BAalE,OAAOA,I,oMCtDE95B,EAAYvmB,IAAOC,IAAV,sNAEE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAQvCsvC,EAAczzB,IAAOC,IAAV,wIAEX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAM5Bi+E,EAAoBrjE,IAAOC,IAAV,6GAOjBqjE,EAAsBtjE,IAAOC,IAAV,mFAMnBsjE,EAAYvjE,YAAOgzD,IAAPhzD,CAAH,wDAITwjE,EAAgBxjE,IAAOC,IAAV,8PAebwjE,EAA4BzjE,IAAOC,IAAV,8LAWzByjE,EAAuB1jE,IAAOC,IAAV,gTAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO+D,iBAEvC,SAAAiY,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eACjB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAUvCq/E,EAAqB3jE,IAAOC,IAAV,oJAIlB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,e,OCF1Bs/E,EA9D+C,SAAA1jE,GAAU,IAEhE2jE,EAMA3jE,EANA2jE,cACAC,EAKA5jE,EALA4jE,cACAC,EAIA7jE,EAJA6jE,eACAC,EAGA9jE,EAHA8jE,WACAC,EAEA/jE,EAFA+jE,aACAC,EACAhkE,EADAgkE,gBAGJ,OACI,qCACI,eAAC39C,EAAD,WACI,cAACkN,EAAD,2BACCqwC,GACG,cAACN,EAAD,CACIp/D,QAAS,WC5BN,IAAC+2C,KD6BW,OAAC6oB,QAAD,IAACA,OAAD,EAACA,EAAYj0C,WC3B5CorB,EAAQgpB,YAVE,MDmCE,SAKI,cAACb,EAAD,UACI,cAACC,EAAD,QAIZ,cAACF,EAAD,UACI,cAACI,EAAD,CACIplE,IAAK2lE,EACLI,SAAU,SAAA/+C,GAAC,OAAI4+C,EAAa5+C,IAFhC,gBAIK6+C,QAJL,IAIKA,OAJL,EAIKA,EAAiBjjE,KAAI,SAACmS,GAAD,OAClB,eAACswD,EAAD,WACKtwD,EAAKjP,MACN,cAACw/D,EAAD,CACIv/D,QAAS,SAACihB,GACNA,EAAEC,kBACFu+C,GAAiBA,EAAczwD,IAHvC,SAMI,cAACihD,EAAA,EAAD,QARmBjhD,EAAK3T,WAc3CskE,GACG,cAACP,EAAD,CACIp/D,QAAS,WCjEP,IAAC+2C,KDkEY6oB,GAAcA,EAAWj0C,WChExDorB,EAAQgpB,YAJE,MDkEE,SAKI,cAACb,EAAD,UACI,cAACtQ,EAAA,EAAD,WAKhB,cAAC,IAAD,QE4CGqR,EAxG2D,SAAAnkE,GAAU,IACxE0I,EAAkC1I,EAAlC0I,eAAgB07D,EAAkBpkE,EAAlBokE,cAElB3wD,EAAaT,cAAyB/gB,KACtC0yB,EAAkB0I,cAClBnI,EAAqBjP,cACrBgD,EAAck5B,cACdkyB,EAAkBp4C,cAPuD,EAQvChJ,oBAAS,GAR8B,mBAQxEqhD,EARwE,KAQ1DC,EAR0D,OASjCthD,mBAE5C,IAX6E,mBASxE+gD,EATwE,KASvDQ,EATuD,OAYrCvhD,oBAAS,GAZ4B,mBAYxE2gD,EAZwE,KAYzDa,EAZyD,OAanCxhD,oBAAS,GAb0B,mBAaxE4gD,EAbwE,KAaxDa,EAbwD,KAezEZ,EAAa7+C,iBAAY,MAqBzB0/C,EAAmB70E,uBAAY,WACjC,IAAMmrD,EAAO,OAAG6oB,QAAH,IAAGA,OAAH,EAAGA,EAAYj0C,QAC5B,GAAKorB,EAAL,CACA,IAAM2pB,EAAqB3pB,EAAQgpB,WAAa,EAC1CY,EAAsB5pB,EAAQ6pB,YAAc7pB,EAAQhrB,aACnDgrB,EAAQgpB,WAAahpB,EAAQhrB,aAAegrB,EAAQ6pB,YAC3DL,EAAiBG,GACjBF,EAAkBG,MACnB,IA4CH,OA1CAzhD,qBAAU,WACN,IAAMpO,GAAiBtM,GAAkB,IAAI3H,KAAI,SAAAmS,GAAI,OACjDA,GAAQ,EAAIA,EAAOX,KAAKqX,IAAI1W,MAGhC,GAAMO,GAAcA,EAAWzB,MAAMS,OAAS,GAAKuC,EAAe,CAC9D,IAKMmoD,EALoB,IAAIC,IAC1B3pD,EAAWzB,MACXgD,GAG4BqoD,WAChCmH,EAAmBrH,GAEvB57D,WAAWojE,EAAkB,KAC9B,CAAClxD,EAAY/K,EAAgBi8D,IAEhCvhD,qBAAU,WAGN,OAFAuhD,IACAlkC,OAAO6Z,iBAAiB,SAAUqqB,GAC3B,WACHlkC,OAAOga,oBAAoB,SAAUkqB,MAE1C,CAACA,IAEJvhD,qBAAU,WAEFkhD,GACA57D,GACAuQ,EAAYzH,SAASjN,IAAgBwgE,sBAErCV,EAAgB37D,GAChB67D,GAAgB,MAErB,CACC77D,EACA47D,EACAC,EACAF,EACAprD,KAGCvQ,GAAkBA,EAAe+J,OAAS,EACpC,6BAIP,cAAC,EAAD,CACIkxD,cAAeS,GAxEM,SAAC7gE,GAC1B,GAAImF,EAAgB,CAChB,IAAM0L,EAAa0B,YAAU,OAACrC,QAAD,IAACA,OAAD,EAACA,EAAYzB,OAC1C2S,EACIO,EAAmB3hB,EAAOmF,EAAgB0L,IAE9CmwD,GAAgB,KAmEhBX,cAAeA,EACfC,eAAgBA,EAChBC,WAAYA,EACZC,aAAcY,EACdX,gBAAiBA,M,8BCpHtB,IAAKtE,EAAZ,kC,SAAYA,K,cAAAA,E,iBAAAA,M,sCCAZ,kBAGasF,EAAQ9mE,sBACjB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACL4zB,OAAO,eACPkyC,YAAY,MACZ5lE,EAAE,iTAOP2lE,O,6BCzDA,QAA0B,6C,6BCA1B,QAA0B,+C,6BCA1B,QAA0B,+C,6BCAzC,oEAca1F,EAAiC,WAC1C,IAAM5nD,EAAUW,cACV6sD,EAAkBz/B,cACxB,OAAO31C,uBAAY,SAACT,GAAuE,IAAtC81E,EAAqC,wDACtFD,EAAgB71E,EAAOkJ,KAAKgH,IACvB6rB,MAAK,SAACn5B,GAAU,IAAD,EACRkzE,GAAqBlzE,IAAS,UAACA,EAAKmzE,iBAAN,aAAC,EAAgBC,QAEnD3tD,EAAQH,KAAKluB,IAAOE,WAAWO,kBAAmBuF,QAE3D,CAACqoB,EAASwtD,M,6BCxBjB,kBAGa7/C,EAAennB,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,UACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIS,KAAK,eACLC,SAAS,UACTC,EAAE,2JAOPgmB,O,6BCzBf,kBAGaC,EAAgBpnB,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,UACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIS,KAAK,eACLC,SAAS,UACTC,EAAE,iKAOPimB,O,6BCzBf,kBAGamB,EAAWvoB,sBACpB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAR,SACI,4BACI,4BACI,8BACI,sBACIC,SAAS,UACTC,EAAE,2RACF4zB,UAAU,6EAEd,sBACI5zB,EAAE,6DACF4zB,UAAU,6FAYnCxM,O,0ECrCF/U,EAAoB,SAC7B4zD,EACA/qE,GAF6B,kCAGnBA,GAHmB,IAGXO,KAAK,GAAD,OAAKwqE,GAAL,OAAuB/qE,EAAOO,U,iGCFlDurB,EAAYvmB,IAAOC,IAAV,oLAUFwlE,EAA0B/kE,gBAAK,gBAAGgD,EAAH,EAAGA,SAAH,OACxC,cAAC6iB,EAAD,UAAY7iB,Q,4FCTVsnD,EAAoBhrD,IAAOC,IAAV,kDACL,SAAAC,GAAK,OAAOA,EAAM+sC,UAAY/sC,EAAM+sC,UAAY,WAG5Dy4B,EAAyB1lE,IAAOC,IAAV,uHASP,SAAAC,GAAK,OAChBA,EAAM2C,aAAe3C,EAAM2C,aAAe,UACrC,SAAA3C,GAAK,OAAOA,EAAMkvB,QAAUlvB,EAAMkvB,QAAU,eACzC,SAAAlvB,GAAK,uBAAIA,EAAMkY,kBAAV,QAAwBn0B,IAAUC,OAAOqC,YAG1Do/E,EAAiB3lE,YAAO4lE,IAAP5lE,CAAH,wRAKd,SAAAE,GAAK,OAAOA,EAAMyC,SAAR,qBAAiCzC,EAAMyC,SAAvC,KAAqD,MAC/D,SAAAzC,GAAK,OACDA,EAAM+sC,UAAR,sBACqB/sC,EAAM+sC,UAD3B,KAEM,MAEO,SAAA/sC,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAC5C,SAAAzC,GAAK,OACdA,EAAM+zB,WAAa/zB,EAAM+zB,WAAa,SAS9C4xC,EAAgB7lE,IAAOC,IAAV,yFAED,SAAAC,GAAK,OAAIA,EAAM4lE,gBAAkB5lE,EAAM4lE,gBAAmB,WAC/D,SAAA5lE,GAAK,OACRA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAO0B,YAwG1CmgF,IAxEV,SAAC,GA0BC,IAzBH/yE,EAyBE,EAzBFA,MACA6S,EAwBE,EAxBFA,MACAjC,EAuBE,EAvBFA,SACAs5C,EAsBE,EAtBFA,IACA9kC,EAqBE,EArBFA,WACA2zC,EAoBE,EApBFA,UACA/oD,EAmBE,EAnBFA,MACAunB,EAkBE,EAlBFA,SACAy7C,EAiBE,EAjBFA,QACAC,EAgBE,EAhBFA,OACAhc,EAeE,EAfFA,YACAtkC,EAcE,EAdFA,SACAhjB,EAaE,EAbFA,SACA22D,EAYE,EAZFA,QACA4M,EAWE,EAXFA,QACA92C,EAUE,EAVFA,QACAvsB,EASE,EATFA,aACA02D,EAQE,EARFA,sBACAtsB,EAOE,EAPFA,UACAwsB,EAME,EANFA,aACAD,EAKE,EALFA,kBACAt1D,EAIE,EAJFA,SACA5F,EAGE,EAHFA,UACAwnE,EAEE,EAFFA,gBACAK,EACE,EADFA,mBAQA,OACI,cAACnb,EAAD,CAAmB/d,UAAWA,EAA9B,SACI,eAACy4B,EAAD,CACI9hE,SAAUA,EACVZ,MAAOA,GAAgB/e,IAAUC,OAAOC,MACxCi0B,WAAYA,EACZgX,QAASA,EACTvsB,aAAcA,EACdvE,UAAWA,EANf,UAQI,cAACqnE,EAAD,yBACI9/D,MAAOA,EACPm1C,OAlBO,CACnBorB,KAAM,EACNC,WAAY,KACZC,cAAe,UAgBCtzE,GAHR,IAIIi3D,YAAaA,EACb/M,IAAKA,EACL3yB,SAAUA,EACVy7C,QAASA,EACTC,OAAQA,EACRriE,SAAUA,EACVmoD,UAAWA,EACXpmC,SAAUA,EACVhjB,SAAUA,EACV22D,QAASA,EACT4M,QAASA,EACTjyC,WAAYslC,EACZtsB,UAAWusB,EACXt1D,SAAUA,KAEbg5C,GACG,eAAC2oB,EAAD,CAAe7iE,MAAOy2D,EAAct4D,YAAW+C,GAAQ,UAAOA,EAAP,YAA2B4hE,gBAAiBA,EAAnG,UACKjgE,EAAQA,EAAM8M,OAAS,IAD5B,IACkCuqC,EADlC,IACuC,sBAAM/7C,YAAW+C,GAAQ,UAAOA,EAAP,eAAzB,SAAwDiiE,c,6BClJnH,+EAWa3+D,EAAe,CACxBrV,KAAM,CACF+f,MAAO,GACPxf,MAAO,EACPC,OAAQ,EACR0mD,MAAO,EACPzqB,iBAAa79B,GAEjBgT,SAAS,GAGAgiD,EAA8B,WAEvC,OADiBzsC,aAAY,SAAAxX,GAAK,OAAIA,KACtBykE,sB,sHCtBPhgD,EAAYvmB,IAAOC,IAAV,qDAITkvB,EAAUnvB,IAAOC,IAAV,kTAKT,gBAAGumE,EAAH,EAAGA,IAAH,OAAcA,EAAG,UAAMA,EAAN,MAAgB,WAE3B,gBAAG7jE,EAAH,EAAGA,SAAH,OAAmBA,EAAQ,UAAMA,EAAN,MAAqB,UAEpD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAO5BgiF,EAAazmE,IAAOC,IAAV,iEAKVymE,EAAc1mE,IAAOoD,OAAV,qaAML,SAAAlD,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAEjC,gBAAGgX,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOI,eAC5C,qBAAGsf,SAA2B,UAAY,aAGvC,gBAAGtD,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOsD,aAG7C,gBAAG8Y,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOyiF,aAGhDF,GACG,gBAAGnmE,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOsD,YAE/Ci/E,GACE,gBAAGnmE,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOyiF,cAMjDpqC,EAAUv8B,IAAO0nB,KAAV,2IAGI,qBAAGpnB,MAAkBpc,OAAOU,YAKvCgiF,EAAa5mE,IAAO0nB,KAAV,2EAKVm/C,EAAa7mE,IAAO0nB,KAAV,6E,eCzCRo/C,EApByCpmE,gBAAK,SAAAR,GAAU,IAC3DiZ,EAAyDjZ,EAAzDiZ,YAAa4tD,EAA4C7mE,EAA5C6mE,QAASnjE,EAAmC1D,EAAnC0D,SAAUC,EAAyB3D,EAAzB2D,KAAMpQ,EAAmByM,EAAnBzM,KAAMyQ,EAAahE,EAAbgE,SAEpD,OACI,eAAC,IAAD,CAAiBiV,YAAaA,EAA9B,UACI,cAAC0tD,EAAD,UACI,eAACH,EAAD,CACItiE,QAAS2iE,EACTnjE,SAAUA,EACVzC,YAAW+C,GAAQ,UAAOA,EAAP,WAHvB,UAKI,cAACuiE,EAAD,CAAYtlE,YAAW+C,GAAQ,UAAOA,EAAP,SAA/B,SAAwDL,IACxD,cAAC+iE,EAAD,CAAYzlE,YAAW+C,GAAQ,UAAOA,EAAP,SAA/B,SAAwDzQ,SAGhE,cAAC8oC,EAAD,UCAGyqC,EAxBiB5oE,sBAC5B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BACXS,KAAK,OART,SAUI,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,6WACFF,KAAK,sBCuBV4nE,EA7B6BvmE,gBAAK,SAAAR,GAAU,IAC/CgnE,EACJhnE,EADIgnE,cAAeC,EACnBjnE,EADmBinE,YAAaC,EAChClnE,EADgCknE,QAASZ,EACzCtmE,EADyCsmE,IAAK7jE,EAC9CzC,EAD8CyC,SADI,EAElDzC,EADwDgE,gBADN,MACiB,kBADjB,EAItD,OACI,cAACqiB,EAAD,UACI,eAAC4I,EAAD,CAASq3C,IAAKA,EAAK7jE,SAAUA,EAA7B,iBACKykE,QADL,IACKA,OADL,EACKA,EAASnmE,KAAI,SAAAmC,GAAM,OAChB,cAAC,EAAD,eAAwBA,OAE5B,eAACyjE,EAAD,CAAY1lE,YAAW+C,GAAQ,UAAOA,EAAP,UAA/B,oBAEKyd,YAAWulD,MAEhB,+BACI,cAACR,EAAD,CACItiE,QAAS+iE,EACThmE,YAAW+C,GAAQ,UAAOA,EAAP,YAFvB,SAII,cAACuiE,EAAD,UACI,cAACQ,EAAD,mB,yLC7BfrlB,EAAa5hD,IAAOC,IAAV,uMAGV,SAAAC,GAAK,aACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAO0C,WADzB,UAEMsZ,EAAMI,MAAMpc,cAFlB,aAEM,EAAoBG,cACV,SAAA6b,GAAK,OAAIA,EAAMmnE,QAAU,KAGhC,gBAAG/mE,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOsD,aAG7C,gBAAG8Y,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOyiF,cAIjDW,EAAStnE,IAAOC,IAAV,4OAOK,SAAAC,GAAK,uBAAIA,EAAMI,MAAMpc,cAAhB,aAAI,EAAoB8D,oBAIxCwsD,EAASx0C,IAAOC,IAAV,yGAMNq0B,EAAQt0B,IAAOC,IAAV,0FAGL,SAAAC,GAAK,uBAAIA,EAAMI,MAAMpc,cAAhB,aAAI,EAAoBC,SAG7BojF,EAAWvnE,IAAOC,IAAV,mEAER,SAAAC,GAAK,uBAAIA,EAAMI,MAAMpc,cAAhB,aAAI,EAAoBC,SAG7BqjF,EAAkBxnE,IAAOC,IAAV,iRAEf,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOG,cAKX,qBAAGuf,SAA2B,OAAS,aAG5C,gBAAGtD,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOsD,aAG7C,gBAAG8Y,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOyiF,cAIjD/V,EAAgB5wD,IAAOC,IAAV,yEAKbwnE,EAAiBznE,YAAO0nE,IAAP1nE,CAAH,snHAYD,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0C,cASvB,SAAAsZ,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAe5B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0C,cAkBvB,SAAAsZ,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAa7B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SASvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAS7B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAqBpC,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACV,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAY7C,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOG,cAE7B,SAAA6b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGvB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOG,cAUzCsjF,EAAsB3nE,YAAO8sC,IAAO7sC,IAAdD,CAAH,oPAanB4nE,EAAe5nE,YAAO8sC,IAAO7sC,IAAdD,CAAH,wLAIZ,SAAAE,GAAK,OAAIA,EAAMzB,OAAS,SAGb,SAAAyB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIvC0jF,EAAe7nE,YAAOwD,IAAPxD,CAAH,2MAMR,gBAAGM,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOsD,aAG7C,gBAAG8Y,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOyiF,c,yBClF/C/hB,EA/ImC,SAAC,GAI5C,IAHHzyD,EAGE,EAHFA,KACA27C,EAEE,EAFFA,SACAgX,EACE,EADFA,QACE,EACkD3yD,GAAQ,GAApDknD,EADN,EACMA,MAAOr+C,EADb,EACaA,KAAMsoC,EADnB,EACmBA,QAASuhB,EAD5B,EAC4BA,kBAD5B,EAE4C1hC,oBAAS,GAFrD,mBAEK2kD,EAFL,KAEsBC,EAFtB,OAG0C5kD,mBACxCmgB,EAAUviB,IAAMuiB,GAAiBnhB,OAAOohB,KAAe,MAJzD,mBAGKykC,EAHL,KAGqBC,EAHrB,OAMoC9kD,mBAAiBnoB,GANrD,mBAMKktE,EANL,KAMkBC,EANlB,OAO4ChlD,mBAAe,IAAIhD,MAP/D,mBAOKioD,EAPL,KAOsBC,EAPtB,KAwCIC,GACDN,GAAkC,aAAhBE,EAEjBK,EACFH,EAAgBhnD,cAAe,IAAIjB,MAAOiB,WAY9C,OACI,cAACumD,EAAD,CAAqBvjE,QA9BL,SAACihB,GACjBA,EAAEmjD,gBAAkBnjD,EAAEgwB,QAAUvH,KA6BhC,SACI,eAAC85B,EAAD,CAAcp5B,QAAS,CAAEC,MAAO,IAAOC,QAAS,CAAED,MAAO,GAAzD,UACI,eAAC64B,EAAD,WACI,eAAChzC,EAAD,WAEQm0C,IACKP,GACGltE,GAGXgtE,EACKrmD,YAAWqmD,GAAgB,GAAO,GAClC,QAETnjB,GACG,cAAC0iB,EAAD,oBACQluB,EADR,gBAEQA,EAAQ,EAAI,IAAM,GAF1B,wCAOR,cAACouB,EAAD,CACI5hE,MAAOmiE,EA7BF,SAACA,GAClB,IAAI/nD,EAAO,IAAIE,KAAK6nD,GAChBU,EAAgD,IAA3BzoD,EAAK0oD,oBAC9B,OAAO,IAAIxoD,KAAKF,EAAK2oD,UAAYF,GA0BGG,CAAab,GAAkB,KACvDc,aAAc,KACdC,OAAO,KACPC,mBAAoB,SAACC,EAAGhpD,GAAJ,MAChB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAKA,EAAKipD,WAE7CC,WAAY,KACZC,WAAY,KACZC,UACI,cAACznB,EAAD,UACI,cAACoR,EAAA,EAAD,MAGRsW,UACI,cAAC1nB,EAAD,CAAYylB,QAAS,EAAGzjE,SAAU2kE,EAAlC,SACI,cAACvV,EAAA,EAAD,MAGRzoC,SApFkC,SAAAtK,GAC9CgoD,EACIhoD,EAAOc,IAAMd,GAAckC,OAAOohB,KAAe,MAErD4kC,EAAe,UACfJ,GAAmB,IAgFPwB,sBAAsB,EACtBC,wBAAyB,SAAAvpD,GAAI,OAhEb,SAACA,GAC7BA,GAAQooD,EAAmBpoD,GAgEXupD,CAAuB,OAACvpD,QAAD,IAACA,OAAD,EAACA,EAAMmoD,kBAElCqB,QAAS1oD,MAAQnM,IAAI,EAAG,OAAO4N,QAAQ,OAAOxB,WAElD,eAACwzB,EAAD,WACI,eAACgzB,EAAD,CACI5jE,SAAU0kE,EACVlkE,QAAS,WACL+jE,EAAe,cACfF,EAAkB,MAClBF,GAAmB,IAL3B,UAQI,cAACnX,EAAD,UACI,cAAC8Y,EAAA,EAAD,MATR,qBAaA,cAAC7B,EAAD,CACIpkE,MAAO,SACP/E,OAAQ,OACRD,MAAO,OACPkF,MAAO,CAAEiwB,WAAY,QACrBn5B,OAAQqzC,IAEZ,cAACtqC,EAAA,EAAD,CACIC,MAAO,QACP/E,OAAQ,OACRD,MAAO,OACPmF,SAAUkkE,EACVrtE,OAAQ,kBAAMqqD,EAAQ1iC,YAAoB4lD,iB,kGC9JrD74C,EAAUnvB,IAAOC,IAAV,qWASP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAQ5BklF,EAAkB3pE,IAAOC,IAAV,qKAWf2pE,EAAmB5pE,IAAOoD,OAAV,oTAChB,SAAAlD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAaxB,SAAA2b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAIhCsiF,EAAe7pE,IAAOoD,OAAV,kVACZ,SAAAlD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAWxB,SAAA2b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,e,OCvDhCuiF,EAAY,YAWN,IAVf33D,EAUc,EAVdA,WACA43D,EASc,EATdA,eACAjQ,EAQc,EARdA,aACAkQ,EAOc,EAPdA,gBACAzhD,EAMc,EANdA,YACA0hD,EAKc,EALdA,YACAvmE,EAIc,EAJdA,SACAC,EAGc,EAHdA,MACAumE,EAEc,EAFdA,cACAhmE,EACc,EADdA,SAEA,IAAK6lE,EACD,OAAO,KAGX,IAAsB1wB,EAQtB,OACI,eAAClqB,EAAD,CAASxrB,MAAOA,EAAhB,UACKD,EACD,eAACimE,EAAD,YACMM,GAAeF,IAAmB53D,IAChCA,EAAc,GACd,MAHR,OAKI,uBAAMhR,YAAW+C,GAAQ,UAAOA,EAAP,qBAAzB,WAhBUm1C,EAkBF4wB,EACM93D,EAAc2nD,EACToQ,EAEG/3D,EAAc,EADdA,EAEJ43D,EAAiBjQ,EACjB3nD,EACAA,EAAc2nD,EAAeiQ,EACjCA,EAzBlB1wB,EAAQlnC,EACDA,EAEAknC,GAYH,OAaK4wB,EACK93D,GAAckkC,YAAOlkC,EAAY,OAAQ,SACzCkkC,YAAO0zB,EAAgB,OAAQ,YACjC,IArBZ,gBAwBEE,GAAeF,IAAmB53D,GAChC,eAACy3D,EAAD,CAAkBxlE,QAASmkB,EAAapnB,YAAW+C,GAAQ,UAAOA,EAAP,eAA3D,uBACe,IACX,uBAAM/C,YAAW+C,GAAQ,UAAOA,EAAP,uBAAzB,UACMgmE,EAA6B/3D,EAAc,EAA3BA,EAA8B,IAC/CA,GAAckkC,YAAOlkC,EAAY,OAAQ,eAItD,cAAC03D,EAAD,CAAczlE,QAAS4lE,EAAiB7oE,YAAW+C,GAAQ,UAAOA,EAAP,oBAA3D,kC,0CCvEZ,wIAAO,IACMimE,EAAc,cACdC,EAAY,YAQlB,SAASxO,IACZ,MAAO,CACH5gE,KAAMmvE,GAIP,SAASE,EAAe35E,GAC3B,MAAO,CACHsK,KAAMovE,EACN15E,W,6BCnBR,6CAEa2uC,EAAsB,SAAC9kC,GAChC,GAAG6oC,kBAAQ7oC,GACP,OAAO,EAGX,IAAM+vE,EAAgBtpC,SAASC,cAAc,YACzCspC,GAAiC,EAErCD,EAAS3mE,MAAM+4D,SAAW,QAC1B4N,EAAS3mE,MAAM6iE,IAAM,EACrB8D,EAAS3mE,MAAMm9C,KAAO,EAEtBwpB,EAAS3mE,MAAMlF,MAAQ,MACvB6rE,EAAS3mE,MAAMjF,OAAS,MAExB4rE,EAAS3mE,MAAMyrB,QAAU,EAEzBk7C,EAAS3mE,MAAMoiB,OAAS,OACxBukD,EAAS3mE,MAAM6mE,QAAU,OACzBF,EAAS3mE,MAAM8mE,UAAY,OAE3BH,EAAS3mE,MAAMyU,WAAa,cAE5BkyD,EAASzkE,MAAQtL,EAEjBymC,SAASI,KAAKC,YAAYipC,GAC1BA,EAASje,QACTie,EAASphD,SAET,IACIqhD,EAAavpC,SAAS0pC,YAAY,QACpC,MAAOC,GACLJ,GAAa,EAIjB,GADAvpC,SAASI,KAAKw/B,YAAY0J,IACrBC,EAAY,CACb,IAAMK,EAAQ7W,UAAUD,SAAS1nB,cAAc50B,QAAQ,QAAU,EAEjEqzD,OAAO,SAAD,OADaD,EAAQ,UAAO,UACJrwE,GAC9BgwE,EAAa,SAGjB,OAAOA,I,sICrCEtqC,EAAoC,SAAC9tC,GAA6E,IAAD,EACpH0X,EAAW,UAAG1X,EAAK+f,aAAR,aAAG,EAAYjR,KAAI,SAACmS,GACjC,OAAO,2BAAIA,EAAKrd,YAAhB,IAA4ButC,QAASlwB,EAAKkwB,QAAShmC,aAAc8V,EAAK3T,QAG1E,OAAO,2BAAKtN,GAAZ,IAAkB+f,MAAOrI,KAGhBk4B,EAAiC,SAAC5wC,GAAgC,IAAD,QAC1E,MAAO,CACHY,OAAM,UAAEZ,EAAaumC,sBAAf,aAAE,EAA6Bz2B,KAAI,SAACmS,GAAD,OAAUi7C,IAAkBj7C,MAAyClgB,KAAK,KACnHowC,QAAO,UAAEnyC,EAAam9D,uBAAf,aAAE,EAA8BrtD,KAAI,SAACmS,GAAD,OAAUm7C,IAAqBn7C,MAA4ClgB,KAAK,KAC3HR,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BC,MAAOzB,EAAa0B,WACpBC,KAAMsE,YAAsBjG,EAAa4B,QAAS,YAAY,M,sGCnBzD+3E,EAAoB9qE,IAAOC,IAAV,+LAUjB4jB,EAAiB7jB,YAAO8jB,IAAP9jB,CAAH,6J,OCeZ+qE,EAvB+B,SAAA7qE,GAAU,IAC5CyK,EAA4DzK,EAA5DyK,QAASC,EAAmD1K,EAAnD0K,QAAShH,EAA0C1D,EAA1C0D,SAAUonE,EAAgC9qE,EAAhC8qE,YAAa3mE,EAAmBnE,EAAnBmE,KAAMH,EAAahE,EAAbgE,SAEvD,OACI,cAAC4mE,EAAD,CACI1mE,QAAS,SAAAihB,GACLA,EAAEC,mBAFV,SAKI,cAACzB,EAAD,CACIxf,KAAMA,GAAc,GACpBsG,QAASA,EACTC,QAASA,EACThH,SAAUA,EACVwU,WAAYn0B,IAAUC,OAAOC,MAC7B2hC,aAAcklD,EACdjlD,OAAQ9hC,IAAUC,OAAOQ,WACzBwf,SAAUA,Q,6BCpB1B,wIAAO,IAAM+mE,EAAc,cACdC,EAAiB,iBAKvB,SAAS1pE,EACZ5B,GAEA,MAAO,CACH5E,KAAMiwE,EACNrrE,SAKD,SAAS8B,IACZ,MAAO,CACH1G,KAAMkwE,K,qECEF/3E,E,kBAAAA,K,gBAAAA,E,mBAAAA,M,KAKmB,mBAC1BA,EAAcC,OAAmB,UADP,cAE1BD,EAAcE,QAAoB,a,gDC9BvC,oEAAO,IAAMo1E,EAAoB,CAC7B0C,SAAU,kBACVn/E,OAAQ,aACRo/E,WAAY,eAGH7c,EAAwB,CACjC,WAAc,eACd,QAAW,UACX,SAAY,a,6BCThB,kCAAO,IAAMvqB,EAA6B,8B,8BCA1C,oDAGa0lC,EAAWtrE,sBAAqC,WACzD,OACI,qBACIK,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BALV,SAOI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,iYACFF,KAAK,sBAMNqqE,O,6BCtBf,kCAAO,IAAMlf,EAA8B,K,qFCS9B8S,EAAb,WAiBI,WAAmBnrE,EAAkB+iB,GAA0B,yBAA5C/iB,OAA2C,KAAzB+iB,gBAAyB,KATrDm2D,SAAgB,GASqC,KARrDziE,eAA2B,GAQ0B,KAPtD0iE,QAA2B,GAO2B,KANtDC,uBAA0C,GAMY,KALtD1I,OAAwB,GAK8B,KAJtD2I,GAAe,GAIuC,KAHtDC,cAA+B,GAGuB,KAFtDC,gBAAiB,EAGrBvvC,KAAKkvC,SAAWl5E,EAChBgqC,KAAKvzB,eAAiBsM,EAnB9B,yDAsBI,SAAsBzV,GAClB08B,KAAKovC,uBAAuB9rE,IAAM,EAIlC,IAHA,IAAMksE,EAASxvC,KAAKkvC,SAASO,WAAU,SAAAx4D,GAAI,OAAIA,EAAK3T,KAAOA,KACrDiE,EAAWy4B,KAAKkvC,SAASM,GAAQjoE,UAAY,GAE1CyQ,EAAI,EAAGA,EAAIzQ,EAASiP,OAAQwB,IAAK,CACtC,IAAI03D,EAAUnoE,EAASyQ,GAAG1U,GAE1B,GAC8B,OAA1B08B,KAAKmvC,QAAQO,IACoB,qBAA1B1vC,KAAKmvC,QAAQO,KACnB1vC,KAAKmvC,QAAQO,GAChB,CACE,IAAK1vC,KAAKvzB,eAAe8I,SAASm6D,GAE9B,YADA1vC,KAAKuvC,gBAAiB,GAGtBvvC,KAAK2vC,sBAAsBD,OAvC/C,iBA+CI,SAAIpsE,GAAwB,IAAD,OAAXhM,EAAW,uDAAJ,GACbiQ,EAAgB,GACtBy4B,KAAKmvC,QAAQ7rE,IAAM,EACnB,IAAMksE,EAASxvC,KAAKkvC,SAASO,WAAU,SAAAx4D,GAAI,OAAIA,EAAK3T,KAAOA,KAC3D08B,KAAKovC,uBAAyB,GAC9BpvC,KAAKuvC,gBAAiB,EACtB,IAAMK,EAAe5vC,KAAKkvC,SAASM,GAAQjoE,UAAY,GAEvD,KAAIqoE,EAAap5D,QAAU,IAAMwpB,KAAKvzB,eAAe8I,SAASjS,GAA9D,CAIA,GAFA08B,KAAK2vC,sBAAsBrsE,GAGvB08B,KAAKuvC,gBACJK,EAAap5D,QAAU,GAAKwpB,KAAKvzB,eAAe8I,SAASjS,GAC5D,CAAC,IAAD,aACE,IAAIusE,EAAS,EAAKR,GAAG/rE,GACjBwsE,EAAkB,GAMtB,IALI,EAAKrjE,eAAe8I,SAASjS,KAC7BhM,EAAO,EAAK43E,SAASM,GAAQl4E,KAC7Bw4E,EAAgBx0D,KAAKhkB,IAGP,OAAXu4E,GAAqC,qBAAXA,GAAwB,CAErD,IAAIJ,EAAY,EAAKP,SAASO,WAAU,SAAAM,GAAE,OAAIA,EAAGzsE,KAAOusE,KACxDv4E,EAAO,EAAK43E,SAASO,GAAWn4E,KAChCw4E,EAAgBx0D,KAAKhkB,GACrBu4E,EAAS,EAAKR,GAAGQ,GAIrB,IADA,IAAIG,EAAc,GACTh4D,EAAI83D,EAAgBt5D,OAAS,EAAGwB,GAAK,EAAGA,IAC7Cg4D,GAAeF,EAAgB93D,IAAY,IAANA,EAAU,GAAK,KAC1C,IAANA,GACA,EAAKs3D,cAAch0D,KAAK,CACpBhY,GAAIA,EACJ0E,MAAOgoE,IAKnB,MAAM,CAAN,UA3BF,qCA8BF,GAAIJ,EACA,IAAK,IAAIK,EAAI,EAAGA,EAAIL,EAAap5D,OAAQy5D,IACrC1oE,EAAS+T,KAAKs0D,EAAaK,IAInC,IAAK,IAAIA,EAAI,EAAGA,EAAI1oE,EAASiP,OAAQy5D,IACjCjwC,KAAKqvC,GAAG9nE,EAAS0oE,GAAG3sE,IAAMA,EACrB08B,KAAKmvC,QAAQ5nE,EAAS0oE,GAAG3sE,KAC1B08B,KAAKkwC,IAAI3oE,EAAS0oE,GAAG3sE,GAAIhM,MArGzC,sBA2GI,WACI,IADQ,IAAD,kBACE0gB,GACL,QAC6CpjB,IAAzC,EAAKu6E,QAAQ,EAAK1iE,eAAeuL,MAChC,EAAKm3D,QAAQ,EAAK1iE,eAAeuL,IACpC,CAAC,IAAD,aACE,EAAKs3D,cAAgB,GAErB,IAAIa,EAAS,EAAKjB,SAAS9sC,MACvB,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAO,EAAKmJ,eAAeuL,MAE5C,IAAKm4D,EACD,MAAM,CAAN,KAAO,EAAKzJ,SAGhB,IADA,IAAI0J,EAAcD,EAAO/3D,SAEL,OAAhBg4D,GAEqD,OAArD,EAAK3jE,eAAe21B,MAAK,SAAA1/B,GAAC,OAAIA,IAAM0tE,MACtC,CAAC,IAAD,EACED,EAAS,EAAKjB,SAAS9sC,MAEnB,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAO8sE,KAExBA,GAAoB,QAAN,EAAAD,SAAA,eAAQ/3D,WAAY,KAElC+3D,IAAW,EAAKhB,QAAQgB,EAAO7sE,MAC/B,EAAK6rE,QAAQgB,EAAO7sE,KAAM,EAC1B,EAAK4sE,IAAIC,EAAO7sE,GAAI6sE,EAAO74E,MACvB,EAAKg4E,cAAc94D,QAAU,GAC7B,EAAK84D,cAAch0D,KAAK,CACpBhY,GAAI6sE,EAAO7sE,GACX0E,MAAOmoE,EAAO74E,OAGtB,EAAKg4E,cAAcxqE,KAAI,SAAAurE,GAAG,OAAI,EAAK3J,OAAOprD,KAAK+0D,OA9BrD,uCAJGr4D,EAAI,EAAGA,EAAIgoB,KAAKjnB,cAAcvC,OAAQwB,IAAK,CAAC,IAAD,IAA3CA,GAA2C,kCAsCpD,OAAOgoB,KAAK0mC,WAlJpB,M,uHCCMt8C,EAAYvmB,IAAOC,IAAV,wKAES,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAO9Ck/E,EAAoBrjE,IAAOC,IAAV,6GAOjBwjE,EAA4BzjE,IAAOC,IAAV,yLAWzByjE,EAAuB1jE,IAAOC,IAAV,mXAEF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO+D,iBAEvC,SAAAiY,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eACjB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAY9Cq/E,EAAqB3jE,IAAOC,IAAV,gIAIX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAmE1BmoF,IAvDV,SAAC,GAMC,IALH7jE,EAKE,EALFA,eACA8jE,EAIE,EAJFA,cACAC,EAGE,EAHFA,iBACAC,EAEE,EAFFA,kBACAtuE,EACE,EADFA,UACE,EACkD6kB,mBAAc,IADhE,mBACKg6C,EADL,KACyBC,EADzB,KAEI5rE,EAAS0hB,cAAyB/gB,KAgBxC,OAfAmxB,qBAAU,WACN,IAAMpO,GAAiBtM,GAAkB,IAAI3H,KAAI,SAAAmS,GAAI,OACjDA,GAAQ,EAAIA,EAAOX,KAAKqX,IAAI1W,MAGhC,GAAM5hB,GAAUA,EAAO0gB,MAAMS,OAAS,GAAKuC,EAAe,CACtD,IAIMmoD,EAJoB,IAAIC,IAC1B9rE,EAAO0gB,MACPgD,GAE4BqoD,WAChCH,EAAsBC,MAE3B,CAAC7rE,EAAQoX,IAGR,cAAC2d,EAAD,CAAWjoB,UAAWA,EAAW6C,YAAU,oBAA3C,SACI,cAACkiE,EAAD,UACI,cAACI,EAAD,UACKtG,GACGA,EAAmBl8D,KAAI,SAACmS,EAAWlS,GAAZ,OACnB,eAACwiE,EAAD,CAAkCviE,YAAA,4BAAgC0rE,oBAAUz5D,EAAKjP,QAAjF,UACKiP,EAAKjP,OACJwoE,GAAoBD,GAClB,cAAC,IAAD,CACIvzD,YAAayzD,EADjB,SAGI,cAACjJ,EAAD,CACIv/D,QAAS,SAACihB,GACNA,EAAEC,kBACFonD,GACIA,EAAct5D,EAAK3T,KAJ/B,SAOI,cAAC,IAAD,UAbWyB,c,6BCpGvD,kCAAO,IAAM2nC,EAA8B,G,wHCqCrC4Y,EAAczhD,YAAO8sE,IAAP9sE,CAAH,6SAQJ,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAExB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACxB,SAAAyb,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,SAM7C1e,IAAUC,OAAOoB,gBAI1BsgF,EAAW,SAAC,GAsBH,IArBlB5yE,EAqBiB,EArBjBA,MACAgoD,EAoBiB,EApBjBA,OACAp3C,EAmBiB,EAnBjBA,SACAmoD,EAkBiB,EAlBjBA,UACAR,EAiBiB,EAjBjBA,aACA9nD,EAgBiB,EAhBjBA,MACAoC,EAeiB,EAfjBA,MACAknE,EAciB,EAdjBA,aACA9iB,EAaiB,EAbjBA,YACA/M,EAYiB,EAZjBA,IACA8oB,EAWiB,EAXjBA,QACAC,EAUiB,EAVjBA,OACA17C,EASiB,EATjBA,SACAjsB,EAQiB,EARjBA,UACAqnB,EAOiB,EAPjBA,SACAqnD,EAMiB,EANjBA,UACA1T,EAKiB,EALjBA,QACA4M,EAIiB,EAJjBA,QACAvjE,EAGiB,EAHjBA,SACAsqE,EAEiB,EAFjBA,UACA/oE,EACiB,EADjBA,SAEA,OACI,cAACu9C,EAAD,yBACI6X,QAAO,OAAEA,QAAF,IAAEA,IAAW,EACpB4M,QAAO,OAAEA,QAAF,IAAEA,IAAW,IACpBviE,MAAOq3C,GACHhoD,GAJR,IAKI4Q,SAAUA,EACVmoD,UAAWA,EACXR,aAAcA,EACd9nD,MAAOA,EACPspE,aAAcA,QAA8Bh8E,EAC5C8U,MAAOA,GAAmB,KAAVA,EAAeA,OAAQ9U,EACvCk5D,YAAaA,EACb1/B,SAAUA,EACVjsB,UAAW,CAACA,EAAWqnB,EAAW,aAAe,IAAIzyB,KAAK,KAC1Dg6E,OAAO,SACPxnD,UAAWw3B,EACX8oB,QAASA,EACTC,OAAQA,EACRtgD,SAAUA,EACVqnD,UAAWA,EACXrqE,SAAUA,EACVxB,YAAW+C,EACX+oE,UAAWA,O,wLCpGVE,EAAYC,aAAW,SAAA9sE,GAAK,MAAK,CAC1C+sE,4BAA6B,CACzB3uE,OAAQ,mBACRD,MAAO,oBAGX6uE,iBAAkB,CACdC,aAAc,wBAITC,EAAcxtE,IAAOC,IAAV,uRAWX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAG5B47D,EAAUhhD,IAAOC,IAAV,wJASPwtE,EAAkBztE,IAAOC,IAAV,qDAIfs8B,EAAUv8B,IAAOw8B,GAAV,sJAKI,SAAAt8B,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YACtC,SAAAsb,GAAK,OAAOA,EAAMgtE,OAAShtE,EAAMgtE,OAAS,WAG3CQ,EAAuB1tE,YAAO8sC,IAAO7sC,IAAdD,CAAH,yRAOf,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAElC,SAAA+b,GAAK,OACTA,EAAM2gD,YAAc,OAAW3gD,EAAM4gD,KAAO5gD,EAAM4gD,KAAO,OACtD,SAAA5gD,GAAK,OAAKA,EAAM2gD,YAAN,WAAwB3gD,EAAM6gD,UAA9B,MAA8C,S,uBCoBpD4sB,EAjEe,SAC1BztE,GACgB,IAEZovB,EAQApvB,EARAovB,WACAO,EAOA3vB,EAPA2vB,iBACAD,EAMA1vB,EANA0vB,eACAg+C,EAKA1tE,EALA0tE,OACAC,EAIA3tE,EAJA2tE,SACAC,EAGA5tE,EAHA4tE,sBACA99C,EAEA9vB,EAFA8vB,QACA+9C,EACA7tE,EADA6tE,uBAGEC,EAAUb,IAEhB,OACI,cAAC,IAAuBc,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,eAACgf,EAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAMytE,EACNr+C,UAAWS,EACXZ,QAAQ,sBACRS,iBAAkBA,EAClBD,eAAgBA,EANpB,UAQI,cAAC49C,EAAD,CAAarsE,YAAU,6BAAvB,+CACA,cAAC,IAAD,CACI2nB,UAAU,EACVF,mBAAmB,EACnBC,YAAY,EACZ4B,wBAAwB,EACxBnsB,UAAW0vE,EAAQX,4BACnB7nB,0BAA2BwoB,EAAQV,mBAEvC,cAAC/wC,EAAD,IACA,eAACykB,EAAD,WACI,cAACysB,EAAD,UACI,cAACjqE,EAAA,EAAD,CACIC,MAAO,SACP5C,QAAS,UACTpG,OAAQu1B,EACRvxB,MAAO,QACPmF,SAAUiqE,EACV3pE,SAAS,oBAGjB,cAACV,EAAA,EAAD,CACIC,MAAO,QACPhJ,OAAQszE,EACRtvE,MAAO,QACPsF,QAAS8pE,EACTjqE,SAAUkqE,EACV5pE,SAAS,0B,0BCSlBgqE,EAjE4B,SACvChuE,GACgB,IAEZ0tE,EAKA1tE,EALA0tE,OACAC,EAIA3tE,EAJA2tE,SACAC,EAGA5tE,EAHA4tE,sBACA99C,EAEA9vB,EAFA8vB,QACA+9C,EACA7tE,EADA6tE,uBAGEC,EAAUb,IAEhB,OAAKS,EAGD,cAAC,IAAuBK,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC88D,EAAA,EAAD,CAAmBngC,YAAahe,EAAhC,SACI,eAAC09C,EAAD,CACIl/B,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfsS,UAAW,EAJf,UAMI,cAACysB,EAAD,CAAarsE,YAAU,6BAAvB,+CACA,cAAC,IAAD,CACI2nB,UAAU,EACVF,mBAAmB,EACnBC,YAAY,EACZ4B,wBAAwB,EACxBnsB,UAAW0vE,EAAQX,4BACnB7nB,0BAA2BwoB,EAAQV,mBAGvC,cAAC/wC,EAAD,IACA,eAACykB,EAAD,WACI,cAACysB,EAAD,UACI,cAACjqE,EAAA,EAAD,CACIC,MAAO,SACP5C,QAAS,UACTpG,OAAQu1B,EACRvxB,MAAO,QACPmF,SAAUiqE,EACV3pE,SAAS,oBAGjB,cAACV,EAAA,EAAD,CACIC,MAAO,QACPhJ,OAAQszE,EACRtvE,MAAO,QACPsF,QAAS8pE,EACTjqE,SAAUkqE,EACV5pE,SAAS,2BA3Cb,8B,iHC7BXkqE,EAAyB,yBACzBC,EAA2B,2BCiClCC,EAAiC,WACnC,IAAMC,EAAiBnxE,eAMvB,OAAOpN,sBAAW,uCACd,WACIwuD,EACAjnD,GAFJ,mBAAA0a,EAAA,yDAISmxB,kBAAQ7rC,GAJjB,uBAKci3E,EAA4B,CAC9Bt2E,MAAK,OAAEX,QAAF,IAAEA,OAAF,EAAEA,EAASrE,KAAK,KACrB+6D,iBAAkB5xB,OAAOtrB,KAAKuhC,KAAkBp/C,KAAK,KACrDJ,KAAMsE,YAAsB,KAAM,aAAa,GAC/C1E,MAAO,KATnB,SAY2C67E,EAC/BC,GAbZ,UAYcC,EAZd,OAgBarrC,kBAAQqrC,GAhBrB,uBAiBkBC,EAAuBlwB,EAAoBnnC,QAC7C,SAACnY,EAA8BklD,GAAwB,IAAD,EAK9CqqB,EAAqBv8D,MAAMmF,QAC3B,SAACnY,EAAQkU,GAqBL,OAnBKlU,EAAOyvE,gBACRv7D,EAAKrd,WAAW0J,KACZ2kD,EAAmB9uD,eAEvB4J,EAAOyvE,gBAAiB,EACxBzvE,EAAO5B,aAAe,MAIrB4B,EAAO0vE,kBACRx7D,EAAKrd,WAAW0J,KACZ2kD,EAAmB9uD,cACvB8d,EAAKkwB,UACD8gB,EAAmB9gB,UAEvBpkC,EAAO0vE,kBAAmB,EAC1B1vE,EAAO5B,aAAe8V,EAAK3T,IAGxBP,IAEX,CACIyvE,gBAAgB,EAChBC,kBAAkB,EAClBtxE,aAAc,OA9BlBqxE,EAF8C,EAE9CA,eACAC,EAH8C,EAG9CA,iBACAtxE,EAJ8C,EAI9CA,aAgDJ,OAhBKqxE,GACDzvE,EAAOuY,KAAP,2BACO2sC,GADP,IAEI/0D,OAAQkI,EAAQ,GAChBq3E,kBAAkB,KAItBA,GAAoBtxE,GACpB4B,EAAOuY,KAAK,CACRna,eACAgmC,QAAS8gB,EAAmB9gB,QAC5BsrC,kBAAkB,IAInB1vE,IAEX,IAxEhB,kBA2EmBwvE,GA3EnB,2CADc,wDAgFd,CAACH,KAQHM,EAA6B,WAC/B,IAAMjsC,EAAoB9lC,cAM1B,OAAO9M,sBAAW,uCACd,WAAO8+E,GAAP,eAAA78D,EAAA,yDACU4I,EAAsBi0D,EAAgBz3D,QACxC,SACInY,EADJ,GAGM,IADA7P,EACD,EADCA,OAAQiG,EACT,EADSA,aAAcguC,EACvB,EADuBA,QASxB,OARC,EADgCsrC,kBAG7B1vE,EAAOuY,KAAK,CACRpoB,OAAQA,EACRiG,aAAcA,EACdguC,YAGDpkC,IAEX,IAGCkkC,kBAAQvoB,GAlBjB,gCAmBc+nB,EAAkB/nB,GAnBhC,2CADc,sDAuBd,CAAC+nB,KAQHmsC,EAAmC,WACrC,IAAMhsC,EAA2B7lC,cAMjC,OAAOlN,sBAAW,uCACd,WAAO8+E,GAAP,eAAA78D,EAAA,yDACU0xB,EAAqBmrC,EAAgBz3D,QACvC,SACInY,EADJ,GAGM,IADA5B,EACD,EADCA,aAAcgmC,EACf,EADeA,QAQhB,OAPC,EADwBsrC,kBAGrB1vE,EAAOuY,KAAK,CACRna,aAAcA,EACdgmC,YAGDpkC,IAEX,IAGCkkC,kBAAQO,GAjBjB,gCAkBcZ,EAAyBY,GAlBvC,2CADc,sDAsBd,CAACZ,KC1KF,SAASisC,GACZC,EACAC,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXytE,EAAkBx2D,cAClB/G,EAAcnQ,cAEd2tE,EAA4BnqD,iBAAe,GALnD,EAOoChC,oBAAkB,GAPtD,mBAOSosD,EAPT,KAOoBC,EAPpB,KAYQroB,EDiKH,WACH,IAAMsoB,EAAyBvzE,eACzBshC,EAAiBnmC,eACjBojC,EAAUnhB,YAAYkhB,KACtBk1C,EAAoCpB,IACpCqB,EAA0Bd,IAC1Be,EAAgCb,IAShCc,EAAkC7/E,sBAAW,uCAC/C,WACIyL,EACAtK,EACAqtD,GAHJ,mBAAAvsC,EAAA,0DAKQxW,EALR,iCAMkCg0E,EACtBh0E,EACAtK,GARZ,UAMc+jE,EANd,OAWa9xB,kBAAQ8xB,GAXrB,oBAYkB39D,EAZlB,UAY4B29D,EAAYhjD,aAZxC,aAY4B,EAAmBjR,KAC/B,qBAAGxI,KAAgBgH,MAGlB2jC,kBAAQ7rC,GAhBzB,iCAiB6Bm4E,EACTlxB,EACAjnD,GAnBpB,oFAD+C,0DA0B/C,CAACm4E,EAAmCD,IASlCK,EAAqC9/E,sBAAW,uCAClD,WACImB,EACAqtD,GAFJ,mBAAAvsC,EAAA,yDAISmxB,kBAAQjyC,GAJjB,iCAKsCqsC,EAAersC,GALrD,UAKc4+E,EALd,OAOa3sC,kBAAQ2sC,GAPrB,oBAQkBx4E,EARlB,UAQ4Bw4E,EAAgB79D,aAR5C,aAQ4B,EAAuBjR,KAAI,SAAAxI,GAAI,OAAIA,EAAKgH,MAEnD2jC,kBAAQ7rC,GAVzB,iCAW6Bm4E,EACTlxB,EACAjnD,GAbpB,oFADkD,wDAoBlD,CAACm4E,EAAmClyC,IAMxC,OAAOxtC,uBACH,YAK6B,IAJzByL,EAIwB,EAJxBA,OACAtK,EAGwB,EAHxBA,aACAqtD,EAEwB,EAFxBA,oBACAwxB,EACwB,EADxBA,WAEIC,EAA4B,KAC5BC,EAA8B,KAElC,GAAIz0E,EACAw0E,EAA4BJ,EAO5BK,EAA8B,CAC1Bz0E,SACAtK,aAR4B08D,YAA8B,2BACvD18D,GADsD,IAEzDuB,MAAO,EACPC,OAAQq9E,GAAc,KAMtBxxB,2BAED,CAAC,IAAD,QACG2xB,EAAiD,CACnDp+E,OAAQ2rC,IAAWtqC,OACnB5B,OAAM,OAAEL,QAAF,IAAEA,GAAF,UAAEA,EAAc0kB,gBAAhB,aAAE,EAAwB3iB,KAAK,KACrCmlC,MAAK,OAAElnC,QAAF,IAAEA,GAAF,UAAEA,EAAcmnC,eAAhB,aAAE,EAAuBplC,KAAK,KACnCslC,MAAK,OAAErnC,QAAF,IAAEA,GAAF,UAAEA,EAAc0K,eAAhB,aAAE,EAAuB3I,KAAK,KACnC4qC,UAAS,UAAErD,EAAQh7B,UAAV,aAAE,EAAY7P,WACvB8C,MAAO,EACPC,OAAQq9E,GAAc,EACtBp9E,MAAK,OAAEzB,QAAF,IAAEA,OAAF,EAAEA,EAAc0B,WACrBC,KAAMsE,YAAqB,OACvBjG,QADuB,IACvBA,OADuB,EACvBA,EAAc4B,QACd,QACA,IAIRk9E,EAA4BH,EAC5BI,EAA8B,CAC1B/+E,aAAcg/E,EACd3xB,uBAsCR,MAlCmD,CAC/C4J,WD1UmB,sBC2UnBC,eAAgB4nB,EAChBvpB,aAAc,EACd4B,sBAAuB,CACnBQ,WAAYonB,EACZzpB,UAAW,uBAEf8B,gBAAiB,CACb,CACIH,WAAYgmB,EACZ/lB,eAAgBsnB,EAChBrnB,sBAAuB,CACnBQ,WAAY,CACR32D,KAAM,IAEVs0D,UAAW,OACXwC,mBAAoB,SAG5B,CACIb,WAAYimB,EACZhmB,eAAgBunB,EAChBtnB,sBAAuB,CACnBQ,WAAY,CACR32D,KAAM,IAEVs0D,UAAW,OACXwC,mBAAoB,aAQxC,CACIxuB,EAAQh7B,GACRkwE,EACAG,EACAD,EACAD,ICvUJQ,EAEeC,CAA6B,2BACzCpB,GADwC,IAE3Ce,WAAYd,KAOVoB,EAAiC,kBAClChB,EAA0Bv/C,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bc,IAEAx+D,EAAY,0BAA2B,WACtB,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAC1C,SAAC4P,IACO,OAACA,QAAD,IAACA,OAAD,EAACA,EAAOgB,QAAQ8Q,SAAS,oBACzBib,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,YAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,oCACZzd,QAASq/C,MAKrBiB,IAEAf,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAIZ,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAGnC7nB,EAAiBL,YACrB,CAACC,GACDopB,EACAC,GACA,GAJIjpB,aAWFkpB,EAA6CzgF,uBAAY,WAC3D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,0BAA2B,WAEvCw+D,IAEiB,OAAjBnB,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhD4+D,EAA6C1gF,uBAAY,WAC3D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,YAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,oCACZkjC,wBACIF,EACJzgD,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAovE,EACApB,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACAmB,MAGL,CAACnB,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IAGA,SAASoB,GACZC,EACAryB,EACA2wB,EACAC,GAEA,IAAM/tE,EAAWO,cACXytE,EAAkBx2D,cAClB/G,EAAcnQ,cAEd2tE,EAA4BnqD,iBAAe,GALnD,EAOoChC,oBAAkB,GAPtD,mBAOSosD,EAPT,KAOoBC,EAPpB,KAYQroB,EDkMH,WACH,IAAMuoB,EAAoCpB,IACpCqB,EAA0Bd,IAC1Be,EAAgCb,IAMtC,OAAO/+E,uBACH,SACI6gF,EACAryB,GAuCA,MArCmD,CAC/C4J,WDzY4B,+BC0Y5BC,eAAgBqnB,EAChBhpB,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACRtK,sBACAjnD,QAASs5E,GAEbpqB,UAAW,WAEf8B,gBAAiB,CACb,CACIH,WAAYgmB,EACZ/lB,eAAgBsnB,EAChBrnB,sBAAuB,CACnBQ,WAAY,CACR32D,KAAM,IAEVs0D,UAAW,OACXwC,mBAAoB,SAG5B,CACIb,WAAYimB,EACZhmB,eAAgBunB,EAChBtnB,sBAAuB,CACnBQ,WAAY,CACR32D,KAAM,IAEVs0D,UAAW,OACXwC,mBAAoB,aAQxC,CACI0mB,EACAD,EACAE,IC5PJkB,EAEeC,CACfF,EACAryB,GAOE8xB,EAAiC,kBAClChB,EAA0Bv/C,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bc,IAEAx+D,EAAY,0BAA2B,WACtB,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAC1C,SAAC4P,IACO,OAACA,QAAD,IAACA,OAAD,EAACA,EAAOgB,QAAQ8Q,SAAS,oBACzBib,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,YAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,oCACZzd,QAASq/C,MAKrBiB,IAEAf,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAIZ,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAGnC7nB,EAAiBL,YACrB,CAACC,GACDopB,EACAC,GACA,GAJIjpB,aAWFkpB,EAA6CzgF,uBAAY,WAC3D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,0BAA2B,WAEvCw+D,IAEiB,OAAjBnB,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhD4+D,EAA6C1gF,uBAAY,WAC3D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,YAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,oCACZkjC,wBACIF,EACJzgD,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAovE,EACApB,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACAmB,MAGL,CAACnB,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,ICrRP,IAAMwB,GAEF,SAAA9wE,GAAU,IAAD,IAEL+wE,EAWA/wE,EAXA+wE,iBACA3hD,EAUApvB,EAVAovB,WACAO,EASA3vB,EATA2vB,iBACAD,EAQA1vB,EARA0vB,eACAg+C,EAOA1tE,EAPA0tE,OACA59C,EAMA9vB,EANA8vB,QACA93B,EAKAgI,EALAhI,MACAg5E,EAIAhxE,EAJAgxE,YACAjH,EAGA/pE,EAHA+pE,YACAkH,EAEAjxE,EAFAixE,gCACAh/D,EACAjS,EADAiS,WAGEi/D,EAAmBlqC,cACPmqC,EAA6BvrB,cAAvCzxC,SACFi9D,EAAiB93B,cACjB5W,EAAoB9lC,cACpBimC,EAA2B7lC,cAC3B2lC,EAAsB7lC,cACtBu0E,EAA0Bpb,cAC1BrkD,EAAcnQ,cAEd68C,EAA0B,iBAC3B4yB,QAD2B,IAC3BA,GAD2B,UAC3BA,EAAkB7K,2BADS,aAC5B,EAAgDtlE,KAC5C,SAAClL,GAGW,IAAD,EACP,MAAO,CACHT,aAAY,UAAES,EAAW0J,UAAb,QAAmB,EAC/B6jC,SAAmB,OAAVvtC,QAAU,IAAVA,OAAA,EAAAA,EAAYutC,SACfviB,IAAK,OAAChrB,QAAD,IAACA,OAAD,EAACA,EAAYutC,SAASnhB,OAAOohB,KAClC,gBAVU,QAavB,GArCA,EAwCLpgB,mBAAkCq7B,GAxC7B,mBAuCFyX,EAvCE,KAuCkBub,EAvClB,OA0CuBruD,oBAAkB,GA1CzC,mBA0CF0qD,EA1CE,KA0CQ4D,EA1CR,OA2CiDtuD,oBAAS,GA3C1D,mBA2CF2qD,EA3CE,KA2CqB4D,EA3CrB,KA6CHC,EACDV,GAAsC,KAAb,OAAL/4E,QAAK,IAALA,OAAA,EAAAA,EAAOya,SAAmC,KAAb,OAALza,QAAK,IAALA,OAAA,EAAAA,EAAOya,QAElDmqB,EAAkB,WACW,OAA/Bq0C,QAA+B,IAA/BA,OACAnhD,IACAyhD,GAAY,IAGVG,EACF5C,GACI,CACI79E,aAAc+/E,EACdz1E,QAAmB,OAAXy1E,QAAW,IAAXA,OAAA,EAAAA,EAAaz1E,SAAU,KAC/B+iD,oBAAqB6yB,EACrBn5E,MAAO+xE,EAAc,GAAM/xE,GAE/Bia,EACA2qB,GAGF+0C,EACFjB,GAA6C,OACzC14E,QADyC,IACzCA,IAAS,GACTm5E,EACAv0C,GAOFixC,EAAyB,WAC3B,GAAK4D,EA2DDV,GACAhH,IACK,OAAL/xE,QAAK,IAALA,OAAA,EAAAA,EAAOya,UAAWR,EAElBy/D,IAEAC,QAjE0B,CAC1B,IAAMC,EAAkC,GAClCtuC,EAAuB+tC,EACzBH,EAAiB7K,oBACjB8K,EAAyBpwE,KACrB,SAAA8wE,GAAqB,OAAIA,EAAsBz8E,gBAEnD2gE,EAAmBh1D,KACf,SAAA8wE,GAAqB,OAAIA,EAAsBz8E,iBAR7B,EAatBihE,YACI6a,EAAiB7K,oBACjB8K,EACApb,GAJAO,EAZkB,EAYlBA,iBAAkB7yB,EAZA,EAYAA,mBAOpB9oB,EAAsB27C,EAAiBv1D,KAAI,SAAAmS,GAAI,MAAK,CACtD9d,aAAc8d,EAAK9d,aACnBguC,SAAa,OAAJlwB,QAAI,IAAJA,OAAA,EAAAA,EAAMkwB,SACTviB,IAAM3N,EAAKkwB,SAASnhB,OAAOohB,KAC3B,KACNl0C,OAAM,OAAE6I,QAAF,IAAEA,OAAF,EAAEA,EAAQ,OAGfkrC,kBAAQvoB,IACTi3D,EAAgCr6D,KAC5BmrB,EAAkB/nB,IAIrBuoB,kBAAQI,IACTsuC,EAAgCr6D,KAC5BorB,EAAoBW,IAIvBJ,kBAAQO,IACTmuC,EAAgCr6D,KAC5BsrB,EAAyBY,IAIjC8tC,GAAY,GAEZ9kD,QAAQsW,IAAI6uC,GACPxmD,MAAK,WACFxZ,EAAY,0BAA2B,WACR,OAA/Bq/D,QAA+B,IAA/BA,UAEH3lD,OAAM,SAAA5rB,GACHkS,EAAYlS,EAAO,YAG3BowB,IACAyhD,GAAY,KAqCpB,OAzBAnuD,qBAAU,WACN,IAAKquD,EAAyB,CAC1B,IAAIK,EAAgB,OAAGxzB,QAAH,IAAGA,IAAuB,GAC9CgzB,EAAsBQ,GACtBV,EAAeU,MAGpB,IAEH1uD,qBAAU,WACDqP,kBAAQ0+C,EAA0Bpb,GAGnCyb,GAAyB,GAFzBA,GAAyB,KAI9B,CAACzb,EAAoBob,IAExB/tD,qBAAU,WACN,OAAO,WACHkuD,EAAsB,IACtBF,EAAe,OAGpB,IAEIL,EACH,cAAC,EAAD,CACI/4E,MAAOA,EACPo3B,WAAYA,EACZs+C,OAAQA,EACRC,SAAUA,EACVC,sBAAuBA,EACvB99C,QAASA,EACT+9C,uBAAwBA,IAG5B,cAAC,EAAD,CACI71E,MAAOA,EACPo3B,WAAYA,EACZO,iBAAkBA,EAClBD,eAAgBA,EAChBg+C,OAAQA,EACRC,SAAUA,EACVC,sBAAuBA,EACvB99C,QAASA,EACT+9C,uBAAwBA,KAKrBrtE,kBAAKswE,K,4ICnOPiB,EAAU,CACnBC,IAAK,OACLC,QAAS,uBACTvhF,MAAO,QACPwhF,GAAI,mBACJC,GAAI,UACJC,GAAI,uBACJC,GAAI,cACJC,GAAI,sBACJC,GAAI,WACJC,GAAI,UACJC,GAAI,UACJC,GAAI,SACJC,GAAI,aACJC,GAAI,YACJC,GAAI,iBACJC,GAAI,UACJC,GAAI,YACJC,GAAI,QACJC,GAAI,mBACJC,GAAI,aACJC,GAAI,yBACJC,GAAI,WACJC,GAAI,aACJC,GAAI,UACJC,GAAI,eACJC,GAAI,WACJC,GAAI,UACJC,GAAI,UACJC,GAAI,QACJC,GAAI,sBACJC,GAAI,UACJC,GAAI,oBACJC,GAAI,UACJC,GAAI,mCACJC,GAAI,SACJC,GAAI,UACJC,GAAI,SACJC,GAAI,gBACJC,GAAI,WACJC,GAAI,UACJC,GAAI,SACJC,GAAI,SACJC,GAAI,0BACJC,GAAI,oCACJC,GAAI,2BACJC,GAAI,QACJC,GAAI,cACJC,GAAI,gBACJC,GAAI,eACJC,GAAI,QACJC,GAAI,WACJC,GAAI,QACJC,GAAI,WACJC,GAAI,aACJC,GAAI,OACJC,GAAI,aACJC,GAAI,aACJC,GAAI,mBACJC,GAAI,SACJC,GAAI,iBACJC,GAAI,UACJC,GAAI,WACJC,GAAI,UACJC,GAAI,WACJC,GAAI,qBACJC,GAAI,UACJC,GAAI,UACJC,GAAI,UACJC,GAAI,QACJC,GAAI,iBACJC,GAAI,UACJC,GAAI,QACJC,GAAI,WACJC,GAAI,UACJC,GAAI,OACJC,GAAI,mBACJC,GAAI,iCACJC,GAAI,gBACJC,GAAI,SACJC,GAAI,QACJC,GAAI,iBACJC,GAAI,UACJC,GAAI,UACJC,GAAI,gBACJC,GAAI,WACJC,GAAI,QACJC,GAAI,YACJC,GAAI,YACJC,GAAI,SACJC,GAAI,SACJC,GAAI,aACJC,GAAI,oBACJC,GAAI,SACJC,GAAI,+CACJC,GAAI,YACJC,GAAI,OACJC,GAAI,gBACJC,GAAI,SACJC,GAAI,YACJC,GAAI,oCACJC,GAAI,WACJC,GAAI,UACJC,GAAI,QACJC,GAAI,UACJC,GAAI,YACJ5gB,GAAI,UACJ6gB,GAAI,SACJC,GAAI,cACJC,GAAI,QACJC,GAAI,iCACJC,GAAI,OACJC,GAAI,OACJC,GAAI,UACJC,GAAI,QACJC,GAAI,SACJC,GAAI,UACJC,GAAI,SACJC,GAAI,QACJC,GAAI,QACJC,GAAI,aACJC,GAAI,WACJC,GAAI,WACJC,GAAI,UACJC,GAAI,wBACJC,GAAI,cACJC,GAAI,cACJC,GAAI,SACJC,GAAI,iBACJC,GAAI,aACJC,GAAI,OACJC,GAAI,UACJC,GAAI,cACJC,GAAI,gBACJC,GAAI,YACJC,GAAI,UACJC,GAAI,UACJC,GAAI,YACJC,GAAI,aACJC,GAAI,SACJC,GAAI,QACJC,GAAI,UACJC,GAAI,SACJC,GAAI,UACJC,GAAI,aACJC,GAAI,6BACJC,GAAI,aACJC,GAAI,mBACJC,GAAI,kBACJC,GAAI,OACJC,GAAI,QACJC,GAAI,WACJC,GAAI,QACJC,GAAI,2BACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,QACJC,GAAI,YACJC,GAAI,WACJC,GAAI,SACJC,GAAI,SACJC,GAAI,WACJC,GAAI,aACJC,GAAI,UACJC,GAAI,gBACJC,GAAI,QACJC,GAAI,iBACJC,GAAI,UACJC,GAAI,YACJC,GAAI,cACJC,GAAI,SACJC,GAAI,QACJC,GAAI,QACJC,GAAI,OACJC,GAAI,cACJC,GAAI,OACJC,GAAI,SACJC,GAAI,OACJC,GAAI,mBACJC,GAAI,mBACJC,GAAI,cACJC,GAAI,WACJC,GAAI,SACJC,GAAI,4BACJC,GAAI,WACJC,GAAI,cACJC,GAAI,YACJC,GAAI,WACJC,GAAI,QACJC,GAAI,WACJC,GAAI,QACJC,GAAI,UACJC,GAAI,UACJC,GAAI,SACJC,GAAI,SACJC,GAAI,SACJC,GAAI,eACJC,GAAI,kBACJC,GAAI,aACJC,GAAI,QACJC,GAAI,SACJC,GAAI,YACJC,GAAI,eACJC,GAAI,WACJC,GAAI,yBACJC,GAAI,WACJC,GAAI,eACJC,GAAI,aACJC,GAAI,UACJC,GAAI,UACJC,GAAI,WACJC,GAAI,cACJC,GAAI,wBACJC,GAAI,cACJC,GAAI,eACJC,GAAI,QACJC,GAAI,YACJC,GAAI,mBACJC,GAAI,2BACJC,GAAI,OACJC,GAAI,8BACJC,GAAI,OACJC,GAAI,WACJC,GAAI,aACJC,GAAI,UACJC,GAAI,cACJC,GAAI,eACJC,GAAI,UACJC,GAAI,QACJC,GAAI,SACJC,GAAI,sBACJC,GAAI,SACJC,GAAI,SACJC,GAAI,WACJC,GAAI,UACJC,GAAI,SACJC,GAAI,uCACJC,GAAI,gBACJC,GAAI,UACJC,GAAI,aACJC,GAAI,gCACJC,GAAI,mCACJC,GAAI,YACJC,GAAI,0BACJC,GAAI,uBACJC,GAAI,UACJC,GAAI,UACJC,GAAI,oBACJC,GAAI,QACJC,GAAI,SACJC,GAAI,QACJC,GAAI,UACJC,GAAI,eACJC,GAAI,SACJC,GAAI,WACJC,GAAI,iB,uCC3PFx7D,EAAYvmB,YAAO86C,IAAP96C,CAAH,qDAITgiF,EAAoBhiF,YAAO8sC,IAAO7sC,IAAdD,CAAH,0QACL,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAYxCy9E,EAAc5hE,IAAOC,IAAV,yIAQXgiF,EAAiBjiF,IAAOC,IAAV,4RAME,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAK5B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cC5B5C+/B,EAAYvmB,IAAOC,IAAV,qCACT,SAAAC,GAAK,OACHA,EAAM0D,UAAN,2CAMFs+E,EAAqBliF,aD4BtB,SAAC,GAA+C,IAA7C0D,EAA4C,EAA5CA,SAAUvD,EAAkC,EAAlCA,KAAM46C,EAA4B,EAA5BA,WAAYz8C,EAAgB,EAAhBA,UAChC,OACI,cAACioB,EAAD,CACIpmB,KAAMA,EACN46C,WAAYA,EACZC,OAAQ,CAAE0hB,SAAU,YAHxB,SAKI,cAACslB,EAAD,CACI1jF,UAAWA,EACXkwC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAHtB,SAKI,cAACmzB,EAAD,UACI,cAACqgB,EAAD,UAAiBv+E,YCzCV1D,CAAH,0BAElBmiF,EAAWniF,IAAOC,IAAV,iZAeQ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAG5B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAI5Cy9F,EAAkBpiF,IAAOC,IAAV,sFAMfoiF,EAAOriF,IAAOi0C,IAAV,8CAIJquC,EAA2BtiF,IAAOC,IAAV,8JASxBsiF,EAAkBviF,IAAOC,IAAV,kQAQR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnCo9F,EAAkBxiF,IAAOC,IAAV,2GAIR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCg+F,EAAyBziF,IAAOC,IAAV,yLAWtByiF,EAAgB1iF,IAAOC,IAAV,kKASb0iF,EAAc3iF,IAAOC,IAAV,6TAMJ,SAAAC,GAAK,OAAIA,EAAM8zB,aACX,SAAA9zB,GAAK,OAAIA,EAAMyC,YAQ1BigF,EAAkB5iF,IAAOC,IAAV,sEAKf4iF,EAAY7iF,IAAOC,IAAV,8HAKF,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAG3Bq+F,EAAkB9iF,YAAOw/C,IAAPx/C,CAAH,0BAEf+iF,GAAgB/iF,YAAOy/C,IAAPz/C,CAAH,0BAEbgjF,GAAYC,cAAe9vE,QAAO,SAACg/D,GAAD,MAAiC,OAAZA,KAC7D6Q,GAAUE,QAAQ,MAElB,I,eA2EeC,GAnEV,SAAC,GAQC,IAPHhjF,EAOE,EAPFA,KACAyD,EAME,EANFA,SACAsiB,EAKE,EALFA,QACAk9D,EAIE,EAJFA,gBACAC,EAGE,EAHFA,mBACArvD,EAEE,EAFFA,UACArxB,EACE,EADFA,SAEA,OACI,eAAC,EAAD,CAAWiB,SAAUA,EAArB,UACI,eAAC6+E,EAAD,CAAwBr+E,QAAS,kBAAM8hB,GAAQ,IAA/C,UACI,cAACw8D,EAAD,UACI,cAACL,EAAD,CACI99E,IAAI,gBACJD,IAAG,qEAAgE8+E,EAAgBxzF,WAAhF,YAGX,eAAC+yF,EAAD,CACIhgF,SAAUA,GAAsB,OAChCqxB,UACIpwB,EACM3f,IAAUC,OAAOQ,WACjBsvC,GAEA/vC,IAAUC,OAAOC,MAP/B,cAUMm/F,YAAsBF,MAE5B,cAACR,EAAD,UACI,cAACC,EAAD,CAAWj/E,SAAUA,EAArB,SACKzD,EAAO,cAAC4iF,GAAD,IAAoB,cAACD,EAAD,WAIxC,cAACZ,EAAD,CAAoB/hF,KAAMA,EAAM46C,WAAY70B,EAA5C,SACK88D,GAAU/hF,KAAI,SAACkxE,GAAD,OACX,eAACgQ,EAAD,CAEI/9E,QAAS,WACLi/E,EAAmBlR,GACnBjsD,GAAQ,IAEZ5nB,UACI6zE,IAAYiR,EAAkB,gBAAaryF,EAPnD,UAUI,cAACqxF,EAAD,UACI,cAACC,EAAD,CACI99E,IAAK4tE,EACL7tE,IAAG,qEAAgE6tE,EAAQviF,WAAxE,YAGX,cAAC0yF,EAAD,UACI,cAACC,EAAD,UAAkBtQ,EAAGE,OAEzB,eAACqQ,EAAD,eACMc,YAAsBnR,QAnBvBA,Y,UC3LhB5rD,GAAYvmB,IAAOC,IAAV,+gBAUR,SAAAC,GAAK,OAAIA,EAAMxB,UAChB,SAAAwB,GAAK,OAAIA,EAAMzB,SACV,SAAAyB,GAAK,OAAIA,EAAMkY,cAChB,SAAAlY,GAAK,OAAIA,EAAMyC,YAKF,SAAAzC,GAAK,OAAKA,EAAMN,OAASM,EAAM2rD,eAAiB,MAAQ,UAM5E,SAAA3rD,GAAK,OACFA,EAAMN,OAASM,EAAM2rD,iBACtBlkC,YADC,QAAD,4DAKwB,SAAAznB,GAAK,OAAKA,EAAMN,OAASM,EAAM2rD,eAAkB,gBAAkB,iBAK1FhC,GAAe7pD,IAAOC,IAAV,wtBAMV,SAAAC,GAAK,OAAIA,EAAMqjF,cAAgB,OAAS,SAgBtC,SAAArjF,GAAK,OAAIA,EAAM8C,SACX,SAAA9C,GAAK,OAAIA,EAAMyC,YAGf,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGxB,SAAAwb,GAAK,OAAIA,EAAMyC,YACnB,SAAAzC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAK5B08E,GAAQnhE,IAAOC,IAAV,sJAEL,SAAAC,GAAK,OAAIA,EAAM8C,SAMfwgF,GAAqBxjF,IAAOC,IAAV,oLCkDhBwjF,IAvGV,SAAC,GAqBC,IApBH59E,EAoBE,EApBFA,MACA0kB,EAmBE,EAnBFA,SACA9mB,EAkBE,EAlBFA,MACAwmD,EAiBE,EAjBFA,YACAxrD,EAgBE,EAhBFA,MACAC,EAeE,EAfFA,OACA0Z,EAcE,EAdFA,WACA4b,EAaE,EAbFA,UACAouC,EAYE,EAZFA,WACAshB,EAWE,EAXFA,mBACAplF,EAUE,EAVFA,UACAqE,EASE,EATFA,SACA3P,EAQE,EARFA,MACA4M,EAOE,EAPFA,MACAgE,EAME,EANFA,SACAmoD,EAKE,EALFA,UACAF,EAIE,EAJFA,eACA3nD,EAGE,EAHFA,SACAy/E,EAEE,EAFFA,eACAC,EACE,EADFA,oBACE,EACsBzgE,oBAAS,GAD/B,mBACKhjB,EADL,KACW+lB,EADX,OAE4C/C,mBAC1C,MAHF,mBAEKigE,EAFL,KAEsBC,EAFtB,KAMIQ,EAAsB,SAACh+E,GACrBA,IACAw9E,EAAmBx9E,GACnB0kB,MAIR,OACI,eAAC,GAAD,CACI9rB,MAAOA,GAAgB,OACvBC,OAAQA,GAAkB,OAC1B0Z,WAAYA,GAA0Bn0B,IAAUC,OAAOiB,QACvDwd,SAAUA,GAAsB,OAChCrE,UAAWA,EACXsB,MAAOA,EACPisD,eAAgBA,EAChB1qD,YAAW+C,EARf,UAUI,cAACi9D,GAAD,CACIn+D,MACIY,EAAQ,OACF8/E,QADE,IACFA,IAAsBz/F,IAAUC,OAAOQ,WADrC,OAEF09E,QAFE,IAEFA,IAAcn+E,IAAUC,OAAOQ,WAJ7C,SAOK+e,IAEL,cAAComD,GAAD,CACIlnD,SAAUA,GAAsB,OAChCK,MAAOgxB,GAAwB/vC,IAAUC,OAAOC,MAChDyf,SAAUA,EACV2/E,gBAAiB9/E,EAJrB,SAMI,cAAC,IAAD,2BACQzQ,GADR,IAEI+4D,UAAWA,EACXomB,QAASiR,EACTU,4BAA4B,EAC5BC,eAAgBX,EAChBY,mBAAmB,WACnBC,uBAAwB,YAAgB,IAAbp+E,EAAY,EAAZA,MAIvB,OAHIA,GACAw9E,EAAmBx9E,GAGnB,cAAC,GAAD,CACI1F,KAAMA,EACNyD,SAAUA,EACVsiB,QAASA,EACT8N,UAAWA,EACXrxB,SAAUA,GAAsB,OAChCygF,gBAAiBA,EACjBC,mBAAoBQ,KAIhCn+D,UAAW,GACXukC,YAAaA,EACbpkD,MAAOA,EACPjC,SAAUA,EACV2mB,SAAUA,OAGjBq5D,GACG,cAACJ,GAAD,CAAoBp/E,QAAS,SAAAihB,GACzBA,EAAEC,kBACFq+D,GAAkBA,KAClBxiF,YAAW+C,GAAQ,UAAOA,EAAP,WAHvB,SAKI,cAACghE,GAAA,EAAD,W,kGC5HPgf,E,KAAQlkF,EAAOmkF,MAAV,ylBACL,SAAAjkF,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGf,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,Y,OCQvC69F,EATuB1jF,gBAAK,SAAAR,GAAU,IACzCwD,EAA2CxD,EAA3CwD,SAAUpF,EAAiC4B,EAAjC5B,UAAWw4D,EAAsB52D,EAAtB42D,SAAapsC,EADM,YACGxqB,EADH,qCAEhD,OACI,cAACgkF,EAAD,yBAAO5lF,UAAWA,EAAWD,IAAKy4D,GAAcpsC,GAAhD,aACKhnB,S,+BCTb,kCAAO,IAAM21B,EAAe,SAACxzB,GACzB,OAAOA,EAAMlW,QAAQ,sBAAuB,U,4KCWpC00F,E,wBATCjmC,EAAe,SAAC1uD,GACzB,OAAOA,EACDA,EACK4pC,OACAujB,MAAM,KACN1pC,QAAO,SAAAtU,GAAC,OAAIA,KAAG8T,OACpB,I,SAGE0xE,K,4BAAAA,E,wBAAAA,E,mCAAAA,M,KAML,IAAMC,EAAiC,WAC1C,IAAM7yD,EAAegsC,cAErB,OAAOztE,uBACH,SAACu0F,EAAoB37E,GACjB,IASO,EATH47E,EAAwB/yD,EAAa3gC,IACrCuzF,EAAeI,cAGfD,GAAoBA,GACpBA,EAAiBH,EAAeK,YAAcH,EAC9CC,EACIH,EAAeM,iBACf/7E,IAEJ47E,EAAmB,GACH,mBACXH,EAAeK,WAAaH,GADjB,cAEXF,EAAeM,gBAAkB/7E,GAFtC47E,EAAgB,GAMpB/yD,EAAaoqB,IAAIwoC,EAAeI,aAAcD,KAElD,CAAC/yD,KAIImzD,EAA6B,WACtC,IAAMnzD,EAAegsC,cAErB,OAAOztE,uBAAY,WACf,IAAIw0F,EAAwB/yD,EAAa3gC,IACrCuzF,EAAeI,cAGnB,QAAID,GACOA,EAAiBH,EAAeK,cAI5C,CAACjzD,KAGKozD,EAAgC,WACzC,IAAMpzD,EAAegsC,cAErB,OAAOztE,uBAAY,WACf,IAAIw0F,EAAwB/yD,EAAa3gC,IACrCuzF,EAAeI,cAGnB,QAAID,GACOA,EAAiBH,EAAeM,mBAI5C,CAAClzD,M,0CCaR,kCAAO,IAAM48B,EAAoB,CAC7B,QAAW,UACX,YAAe,WACf,UAAa,c,6BCzFjB,oEAAO,IAAMpH,EAAiB,iBAEjBz/C,EAAsC,CAC/Cw/C,WAAY,I,6BCLhB,oEAAO,IAAMzjB,EAAc,aACduhD,EAAmB,wB,4JCwC1BC,EAAe/kF,IAAOC,IAAV,yUAWL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIxC6gG,EAAiB5mF,sBAUrB,WAAsEC,GAAS,IAA5EC,EAA2E,EAA3EA,UAAWqF,EAAgE,EAAhEA,MAAOF,EAAyD,EAAzDA,MAAOwhF,EAAkD,EAAlDA,cAAe3zB,EAAmC,EAAnCA,cAAeptD,EAAoB,EAApBA,SACxD,OAAGotD,EACQ/iB,uBACH,cAACw2C,EAAD,CAAc1mF,IAAKA,EAAKC,UAAWA,EAAWqF,MAAOA,EAAOxC,YAAW+C,EAAvE,SACC,qBAAKP,MAAO,CAAClF,MAAO,KAApB,SAA2BgF,MAE5BwhF,GAGG12C,uBACH,cAACw2C,EAAD,CAAc1mF,IAAKA,EAAKC,UAAWA,EAAWqF,MAAOA,EAAOxC,YAAW+C,EAAvE,SACKT,IAELwhF,MAUCv4C,EAAU,YAY2B,IAX9CjpC,EAW6C,EAX7CA,MAW6C,IAV7Ci5D,gBAU6C,MAVlC,cAUkC,EAT7C/pE,EAS6C,EAT7CA,OACA2L,EAQ6C,EAR7CA,UACAoF,EAO6C,EAP7CA,SACAE,EAM6C,EAN7CA,SACAgpC,EAK6C,EAL7CA,OACAD,EAI6C,EAJ7CA,QACA2kB,EAG6C,EAH7CA,cACAptD,EAE6C,EAF7CA,SACOghF,EACsC,EAD7CvhF,MAEMwhF,EAOF,CACA,cAAe,CACXzoB,SAAU,uBACV/pE,OAAQ,CACJkM,EAAG,MACHC,EAAG,SAGXsmF,SAAU,CACN1oB,SAAU,uBACV/pE,OAAQ,CACJkM,EAAG,MACHC,EAAG,QAGX,gBAAiB,CACb49D,SAAU,uBACV/pE,OAAQ,CACJkM,EAAG,OACHC,EAAG,SAGX,aAAc,CACV49D,SAAU,sBACV/pE,OAAQ,CACJkM,EAAG,KACHC,EAAG,SAGX,gBAAiB,CACb49D,SAAU,sBACV/pE,OAAQ,CACJkM,EAAG,QACHC,EAAG,SAGX,oBAAqB,CACjB49D,SAAU,sBACV/pE,OAAQ,CACJkM,EAAG,QACHC,EAAG,WAGX,eAAgB,CACZ49D,SAAU,sBACV/pE,OAAQ,CACJkM,EAAG,QACHC,EAAG,SAKTwwB,EAAanK,iBAAU,MACvBkgE,EAAalgE,iBAAuB,MACpC8/D,EAAgBK,YAAiBh2D,EAAWS,QAAS,WA9Dd,EA+DMw1D,YAC/Cj2D,EACA+1D,EACAJ,EACA,CACItyF,OAAQi6C,EAASu4C,EAAcv4C,GAAQj6C,OAASA,EAChD+pE,SAAU9vB,EAASu4C,EAAcv4C,GAAQ8vB,SAAWA,EACpD/vB,QAASA,GAAW,UAPpBhpC,EA/DqC,EA+DrCA,MAAO6sB,EA/D8B,EA+D9BA,MAAOQ,EA/DuB,EA+DvBA,OAAQC,EA/De,EA+DfA,QAASH,EA/DM,EA+DNA,QAWvCxN,qBAAU,WACF1f,EACAqtB,IAEAD,MAEL,CAACC,EAASrtB,EAAUotB,IAgBvB,OACI,qCAdwB,oBAAbttB,EACAA,EAAS4rB,GAEhB5rB,EAEO8hF,uBAAa9hF,EAAU,CAC1BrF,IAAKixB,IAIN,KAMFkB,GAASM,GACN,cAACk0D,EAAD,CACI3mF,IAAKgnF,EACL/mF,UAAWA,EACXqF,MAAK,2BAAMA,GAAUuhF,GACrBzhF,MAAOA,EACPwhF,cAAeA,EACf3zB,cAAeA,EACfptD,SAAUA,S,6BCjN9B,sDAUauhF,EAAoB9gF,wBAAsC,CACnE0M,YAAa,iBACbC,MAAOE,O,6BCZX,sDAUak0E,EAAyB/gF,wBAClC,CACI0M,YAAa,sBACbC,MAAO2nC,O,0GCVF0sC,EAQT,CACAtjF,MAAO,CACH+V,WAAYn0B,IAAUC,OAAOS,UAC7Bqe,MAAO/e,IAAUC,OAAOkB,OAE5BwgG,SAAU,CACNxtE,WAAYn0B,IAAUC,OAAOC,MAC7B6e,MAAO/e,IAAUC,OAAOkB,MACxBg9E,WAAYn+E,IAAUC,OAAOQ,WAC7Bg/F,mBAAoBz/F,IAAUC,OAAOQ,YAEzCQ,KAAM,CACFkzB,WAAYn0B,IAAUC,OAAOiB,QAC7B6d,MAAO/e,IAAUC,OAAOqC,UAE5BpB,QAAS,CACLizB,WAAYn0B,IAAUC,OAAOgB,KAC7B8d,MAAO/e,IAAUC,OAAOC,OAE5B0C,UAAW,CACPuxB,WAAYn0B,IAAUC,OAAOiB,QAC7B6d,MAAO/e,IAAUC,OAAOqC,SACxB67E,WAAYn+E,IAAUC,OAAOQ,YAEjCW,YAAa,CACT+yB,WAAYn0B,IAAUC,OAAOmB,YAC7B2d,MAAO/e,IAAUC,OAAOkB,QCrCjB,MAA0B,gCCA1B,MAA0B,qC,SCQ5BmhC,EAAYvmB,IAAOC,IAAV,uoBAWR,SAAAC,GAAK,OAAIA,EAAMxB,UACvB,SAAAwB,GAAK,QAAMA,EAAMzB,OAAR,iBAA2ByB,EAAMzB,MAAjC,QAIS,gBAAGgnB,EAAH,EAAGA,WAAH,OAAoBkgE,EAAOlgE,GAAYrN,cAEzD,SAAAlY,GAAK,OACFA,EAAM4rD,WACPnkC,YADA,kGAE8BznB,EAAMN,MAAQ,MAAQ,OAC1CM,EAAMI,MAAMpc,OAAOW,WAK3B,SAAAqb,GAAK,OACFA,EAAM4rD,WACPnkC,YADA,8GAE8BznB,EAAMN,MAAQ,MAAQ,OAC1CM,EAAMI,MAAMpc,OAAOW,WAW/B,SAAAqb,GAAK,OACFA,EAAM4rD,aAAe5rD,EAAMN,OAC5B+nB,YADA,kEAKwB,SAAAznB,GAAK,OAAKA,EAAM4rD,WAAe5rD,EAAMN,MAAQ,gBAAkB,iBAStF6hD,EAAczhD,IAAO+zB,MAAV,+xBASL,SAAA7zB,GAAK,OAAIA,EAAMwrD,YAAcxrD,EAAMI,MAAMjX,MAAMC,WACjD,SAAA4W,GAAK,OAAKA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAE/C,SAAAzC,GAAK,OAAIA,EAAMxB,UAGd,SAAAwB,GAAK,OACVA,EAAMkvB,QAAUlvB,EAAMkvB,QAAU,yBAK7B,SAAAlvB,GAAK,OAAIylF,EAAOzlF,EAAMulB,YAAYziB,SAMZ,SAAA9C,GAAK,OAAIylF,EAAOzlF,EAAMulB,YAAYziB,SAEvD,SAAA9C,GAAK,OAAIylF,EAAOzlF,EAAMulB,YAAYrN,cAEzB,SAAAlY,GAAK,OAAIylF,EAAOzlF,EAAMulB,YAAYziB,SAGxC,kBAAMw0D,cAAa,mBAAqB,uBAGhC,SAAAt3D,GAAK,OAAKA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAChD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI5B,SAAAwb,GAAK,OAAKA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAChD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAIhC08E,EAAQnhE,IAAOyD,MAAV,2wBAWP,SAAAvD,GAAK,OAAKA,EAAM2lF,OAAU3lF,EAAMsmE,IAAMtmE,EAAMsmE,IAAM,OAAU,OAC3D,SAAAtmE,GAAK,OAAIA,EAAM4gD,MAAQ,UAElB,qBAAGn+C,UAA2B,UAC5B,YAAiC,IAA9BsxB,EAA6B,EAA7BA,WAAYxO,EAAiB,EAAjBA,WAC1B,OAAIwO,IAGe,aAAfxO,EACO,IAGJ,QAUF,SAAAvlB,GAAK,OACRylF,EAAOzlF,EAAMulB,YAAY28C,WACrBujB,EAAOzlF,EAAMulB,YAAY28C,WACzBliE,EAAMI,MAAMpc,OAAOO,aAC3B,qBAAGohG,QAEDl+D,YADM,0EAKR85B,GAGI,SAAAvhD,GAAK,QACDA,EAAM4lF,uBAAR,iCAGK,SAAA5lF,GAAK,OACRylF,EAAOzlF,EAAMulB,YAAYi+D,mBACrBiC,EAAOzlF,EAAMulB,YAAYi+D,mBACzBxjF,EAAMI,MAAMpc,OAAOQ,cAIhB,SAAAwb,GAAK,OAAIA,EAAM2lF,OAAS,OAAS3lF,EAAMyC,YAC7C,SAAAzC,GAAK,OAAKA,EAAM2lF,OAAS,QAAU,MAG5CpkC,EAIAA,GAOOskC,EAAe/lF,IAAOC,IAAV,uVACR,SAAAC,GAAK,OAAKA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAWhD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAGxB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAIhCy+F,EAAahmF,IAAOC,IAAV,yRAKR,qBAAGuwB,MAAqB,OAAS,UAQnC,gBAAG/K,EAAH,EAAGA,WAAH,OAAoBkgE,EAAOlgE,GAAYziB,SAOvCijF,EAAcjmF,IAAOC,IAAV,0OAMA,gBAAGimF,EAAH,EAAGA,mBAAH,MACE,cAAlBA,EAA4BC,EAAqBC,EAA/B,QAKbC,EAAqBrmF,IAAOC,IAAV,4K,+BC7NzBmkB,EAAwBhmB,sBAC1B,WAqCIC,GACE,IApCErD,EAoCH,EApCGA,KACAhI,EAmCH,EAnCGA,MACA4Q,EAkCH,EAlCGA,SACA2nD,EAiCH,EAjCGA,aACAQ,EAgCH,EAhCGA,UACArtD,EA+BH,EA/BGA,OACAiE,EA8BH,EA9BGA,SACAc,EA6BH,EA7BGA,MACAoC,EA4BH,EA5BGA,MACAigB,EA2BH,EA3BGA,aACAmgD,EA0BH,EA1BGA,OACAvgD,EAyBH,EAzBGA,UACAukC,EAwBH,EAxBGA,YACA3rD,EAuBH,EAvBGA,UACAmnB,EAsBH,EAtBGA,WACA7lB,EAqBH,EArBGA,MACA+lB,EAoBH,EApBGA,SACA+kC,EAmBH,EAnBGA,WACA47B,EAkBH,EAlBGA,WACArZ,EAiBH,EAjBGA,UACAjH,EAgBH,EAhBGA,QACAugB,EAeH,EAfGA,iBACA/6B,EAcH,EAdGA,kBACAC,EAaH,EAbGA,aACA+6B,EAYH,EAZGA,eACAntB,EAWH,EAXGA,gBACAotB,EAUH,EAVGA,iBACAC,EASH,EATGA,cACAh7B,EAQH,EARGA,WACAI,EAOH,EAPGA,UACAg6B,EAMH,EANGA,sBACA5hF,EAKH,EALGA,SACAyiF,EAIH,EAJGA,eACA/gE,EAGH,EAHGA,KAGH,EACuCzC,oBAAS,GADhD,mBACMyjE,EADN,KACoBC,GADpB,KAEKjvE,GAAwBW,cACxBuuE,MACFp8B,GACA7kD,GACAA,EAAMjW,WAAW+iB,OAAS,GAExBo0E,GAAqBthE,GAAc,QACnCuhE,KAAYJ,IAEH,sBAAT5rF,EACI,WACAA,GAEV,OACI,eAACurB,EAAD,CACId,WAAYshE,GACZroF,OAAQA,GAAkB,OAC1BD,MAAO+nF,EACP16B,UAAWA,EACXlsD,MAAOA,EACPtB,UAAWA,EAAS,UAAMA,EAAN,cAA8B,GAClDqF,MAAOgjF,EAPX,UASI,cAACllC,EAAD,yBACItgD,YAAW+C,EACX7F,IAAKA,GACDrL,GAHR,IAII04D,WAAYA,EACZ1wD,KAAMgsF,GACNtoF,OAAQA,GAAkB,OAC1BiE,SAAUA,EACViB,SAAUA,EACV2nD,aAAcA,EACdjtD,UAAWA,IAAgBsB,IAAUksD,EAAZ,UAA2BxtD,EAA3B,YAAwCA,EAAxC,eAAiEA,GAC1FuH,MAAOA,EACP6f,UAAWA,EACX4gE,WAAY,SAACjhE,GAAD,OACRihE,GAAcA,EAAWjhE,IAE7B4nD,UAAW,SAAC5nD,GAAD,OACP4nD,GAAaA,EAAU5nD,IAE3BkF,SACIzE,IAEM9yB,EACAA,EAAMu3B,cACNx5B,GAEV+6D,UAAWA,EACXC,UAAWA,EACXka,OAAQA,EACRD,QAASA,EACTvgD,WAAYshE,GACZnnF,MAAOA,EACPqqD,YAAaA,EACbtkC,SAAUA,EACVyJ,QAASq8B,EACTtnD,MAAOyhB,KAEX,cAACu7C,EAAD,CACI0kB,SAAUhgF,EACV2gE,IACI3gE,GAASigF,EACH,OACAS,EAEVzlC,KAAM0K,EACNy7B,QAAQ,QACRhzD,WAAYolC,EACZz1D,SAAUA,EACVjB,SACIkD,GAASigF,EAAwB,OAASY,EAE9CZ,sBAAuBA,EACvBrgE,WAAYshE,GACZzoF,WAAYA,EAAS,UAAMA,EAAN,WAA2B,KAAOsF,EAAW,cAAgB,IAhBtF,SAkBKH,IAEL,cAACuiF,EAAD,CACIvgE,WAAYshE,GACZv2D,MAAOs2D,GACPtgB,IAAKigB,EACLriF,QAAS,SAAAihB,GACLA,EAAEC,kBACFolC,GAAcA,KAElBvpD,YAAW+C,GAAQ,UAAOA,EAAP,UARvB,SAUI,cAACmwD,EAAA,EAAD,CAAOr5D,KAAK,WAEN,aAATA,GACG,cAAC+qF,EAAD,CACI3hF,QAAS,kBAAMyiF,IAAiBD,IAChCjkF,SAAUA,EACVxB,YAAW+C,EAAQ,UAAMA,EAAN,YAAkB0iF,EAAe,OAAS,QAAW,KAH5E,SAKKA,EAAe,OAAS,SAGvB,sBAAT5rF,GACG,cAACirF,EAAD,CACI7hF,QAAS,kBAAMyiF,IAAiBD,IAChCV,mBAAoBU,EACpBzlF,YAAW+C,EAAQ,UAAMA,EAAN,QAAuB,OAGxC,yBAATlJ,GACG,cAACqrF,EAAD,CAAoBjiF,QAAS,WACzBwT,GAAQH,KAAKluB,IAAOE,WAAWC,QADnC,SAGI,cAACw9F,EAAA,EAAD,YAQT9iE,O,6BClLf,+CAKM5c,EAAuC,CACzCzV,OAAQ,KACR6O,QAAS,IAoBAoB,EAAmB,SAACF,GAAD,OAAqBA,EAAMC,UAE5ColF,IAnB+D,WAGhD,IAF1BrlF,EAEyB,uDAFjB0F,EACR/M,EACyB,uCACzB,OAAQA,EAAOO,MACX,KAAKiwE,IACD,MAAO,CACHl5E,OAAQ0I,EAAOmF,MAAM7N,OACrB6O,QAASnG,EAAOmF,MAAMgB,SAE9B,KAAKsqE,IACD,OAAO1jE,EACX,QACI,OAAO1F,K,+BCvBnB,kBAGaolF,EAAa9oF,sBACtB,WAAwBC,GAAQ,EAA7BC,UAA6B,EAAlBC,OACV,OAAQ,qBAAKI,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxF,SACZ,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,4ZAA4ZF,KAAK,iBAMtc6nF,O,2CCZf,qE,6BCAA,sCAAME,EAAqB,0BAEd9B,EAAmB,SAC5B+B,EACArsF,GAEA,IAAIssF,EAAStmD,SAASmN,cAAc,QAEpC,GAAa,YAATnzC,EACA,OAAOssF,EAGX,IAAMC,EAAmBvmD,SAASwmD,eAAeJ,GAKjD,OAHIG,IAAgB,OAAIF,QAAJ,IAAIA,OAAJ,EAAIA,EAAgBI,QAAhB,WAA4BL,OAChDE,EAASC,GAEND,I,yECZLI,EAAiB1nF,IAAOC,IAAV,+IAQd0nF,EAA4B3nF,IAAOC,IAAV,8IAMzB,SAAAC,GAAK,OAAIA,EAAMC,MAAN,sCAiBAynF,IAVV,SAAC,GAAiC,IAA/BhgF,EAA8B,EAA9BA,QAASzH,EAAqB,EAArBA,KAAM+D,EAAe,EAAfA,SACnB,OACI,cAACwjF,EAAD,UACI,cAACC,EAAD,CAA2BxnF,KAAMA,EAAjC,SACI,cAAC,IAAD,CAAmByH,QAASA,EAASvD,KAAM,KAAMH,SAAUA,U,6BC9B3E,sDAIakN,EAAuB,WAChC,IAAMkpD,EAAU11D,qBAAW6gF,KAE3B,IAAKnrB,EACD,MAAM,IAAI96D,MACN,0HAGR,OAAO86D,I,6BCZX,kBAGautB,EAAOzpF,sBAChB,WAAiCC,GAAS,IAAvCC,EAAsC,EAAtCA,UAAWC,EAA2B,EAA3BA,OAAQC,EAAmB,EAAnBA,QAClB,OACI,sBACIH,IAAKA,EACLG,QAAWA,GAAoB,cAC/BF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BALf,YAOOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,4GACF4zB,UAAU,kDAOf00D,O,6BCvDf,sDAIa7uC,EAA4B,WACrC,IAAMshB,EAAU11D,qBAAW8gF,KAE3B,IAAKprB,EACD,MAAM,IAAI96D,MACN,oIAGR,OAAO86D,I,6BCZX,iE,4KCGamN,EAAiBznE,YAAO0nE,IAAP1nE,CAAH,8qGAUD,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAQ5B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAe5B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0C,cAkBvB,SAAAsZ,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAc7B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cASvB,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOuB,eAQ5B,SAAAya,GAAK,OAAIA,EAAMI,MAAMpc,OAAOE,YACjC,SAAA8b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAI3B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiC,cAGxB,SAAA+Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiC,cACjC,SAAA+Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAI3B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGxB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eACjC,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAI3B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGxB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eACjC,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAWxCy9D,EAAa5hD,IAAOC,IAAV,8GAGV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0C,cACjB,SAAAsZ,GAAK,OAAIA,EAAMmnE,QAAU,K,OC3GpCygB,EAAiB,YAMoB,IAL9CjiF,EAK6C,EAL7CA,MACAigB,EAI6C,EAJ7CA,aACAiiE,EAG6C,EAH7CA,YAG6C,IAF7CC,oBAE6C,aAD7CC,sBAC6C,SAkC7C,OACI,cAACxgB,EAAD,CACIqB,aAAc,KACdE,mBAAoB,SAACD,EAAQ9oD,GAAT,MAChB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAKA,EAAKipD,WAE7CC,WAAY,KACZC,WAAY,KACZC,UACI,cAACznB,EAAD,CAAYzgD,YAAU,uBAAtB,SACI,cAAC6xD,EAAA,EAAD,MAGRsW,UACI,cAAC1nB,EAAD,CAAYylB,QAAS,EAAGlmE,YAAU,uBAAlC,SACI,cAAC6xD,EAAA,EAAD,MAGRntD,MAnDgB,WACpB,GAAIkiF,EAAa,CACb,IAAMG,EAASriF,EAETsiF,EAAW,CAACD,EAAOE,MAAOF,EAAOG,KAClCl1E,QAAO,SAAAC,GAAI,OAAa,OAATA,KACfnS,KAAI,SAAAmS,GAAI,OAAI2N,IAAM3N,GAAuB4N,YAE9C,OAAOmnE,EAASx1E,OAAS,EAAIw1E,EAAW,KAG5C,IAAMD,EAASriF,EAEf,OAAOqiF,EAASnnE,IAAMmnE,GAAQlnE,SAAW,KAsC9BsnE,GACP/9D,SAxBoC,SAAAtK,GAExC6F,EAdqC,SACrC7F,GAEA,OAAIlf,MAAMC,QAAQif,IAAS8nE,EAChB,CACHK,MAAOnoE,EAAK,IAAM,KAClBooE,IAAKpoE,EAAK,IAAM,MAGjBA,EAKMsoE,CAAiCtoE,KAuB1C8nE,YAAaA,EACbte,QAASue,EAAe,IAAI7nE,UAASpvB,EACrCy3F,QAASP,EAAiB,IAAI9nE,UAASpvB,EACvC03F,mBAAmB,K,yDCtBzBC,EAA0B1oF,IAAOC,IAAV,2QAWX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGxCwkG,EAAwB3oF,IAAOC,IAAV,qGAMrB2oF,EAAuB5oF,IAAOC,IAAV,sKAUpB4oF,EAAU7oF,IAAOC,IAAV,0TASA,SAAAC,GAAK,OAAIA,EAAM4oF,SAAW5oF,EAAMI,MAAMpc,OAAOkB,MAAQ8a,EAAMI,MAAMpc,OAAOO,aAE7D,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAK9C,YAAiC,IAA9B6rC,EAA6B,EAA7BA,MAAOlwB,EAAsB,EAAtBA,MAAOsD,EAAe,EAAfA,SACf,GAAI4sB,IAAU5sB,EACV,OAAO+jB,YAAP,+EACwBrnB,EAAMpc,OAAOQ,eAK3C,YACE,GADgB,EAAfkf,SAEG,OAAO+jB,YAAP,uGAEa,SAAAznB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,iBAM/CqkG,EAAgB/oF,IAAOC,IAAV,mDAIb+oF,EAAchpF,IAAOC,IAAV,kEAMJgpF,EAAgB,YAYoB,IAX7CpjF,EAW4C,EAX5CA,MACA0kB,EAU4C,EAV5CA,SACA3mB,EAS4C,EAT5CA,SACAtF,EAQ4C,EAR5CA,UACAypF,EAO4C,EAP5CA,YAO4C,IAN5CC,oBAM4C,aAL5CC,sBAK4C,SAJ5CiB,EAI4C,EAJ5CA,cACAC,EAG4C,EAH5CA,YACAzlF,EAE4C,EAF5CA,SACAQ,EAC4C,EAD5CA,SAEMklF,EAAUpoD,SAASmN,cAAc,QACjCk3C,EAAalgE,iBAAuB,MACpCmK,EAAanK,iBAAuB,MAHE,EAKJhC,oBAAS,GALL,mBAKrCkmE,EALqC,KAKvBC,EALuB,OAMVnmE,mBAA2Btd,GANjB,mBAMrC0jF,EANqC,KAM1BC,EAN0B,KAOtCvE,EAAgBK,YAAiBh2D,EAAWS,QAAS,SAPf,EASmBw1D,YAC3Dj2D,EACA+1D,EACAJ,EACA,CACIwE,aAAa,EACb98C,QAAS,QACT+vB,SAAU,eACV/pE,OAAQ,CACJmM,EAAG,MACHD,EAAG,SAVP2xB,EAToC,EASpCA,MAAOI,EAT6B,EAS7BA,KAAMxN,EATuB,EASvBA,KAAMzf,EATiB,EASjBA,MAAOmtB,EATU,EASVA,QAASG,EATC,EASDA,QAASD,EATR,EASQA,OAepD1N,qBAAU,WACNkmE,EAAa3jF,KACd,CAACA,IAEJyd,qBAAU,WACF1f,EACAqtB,IAEAD,MAEL,CAACC,EAASrtB,EAAUotB,IAEvB,IAAMhH,EAAe,WAGbw/D,EAFAzB,EAEa,CAAEK,MAAO,KAAMC,IAAK,MAGpB,OAIfr9D,EAAc,WAAuC,IAAtC0+D,EAAqC,wDACtD,GAAIP,EAAa,CACb,IAAM1jD,EAAM0jD,EAAYQ,MACxB,IAAKlkD,IAAQikD,EACT,OAKRn/D,EAAS8+D,EAAe,KAAOE,GAC/BD,GAAgB,GAChB14D,KAqBEg5D,EACF,cAACpmF,EAAA,EAAD,CACIC,MAAO,QACP/E,OAAQ,OACRD,MAAO,QACPhE,OAAQ,kBAAMuwB,KACd9mB,SAAS,iBAGX2lF,EACF,cAACrmF,EAAA,EAAD,CACIC,MAAO,QACP/E,OAAQ,OACRD,MAAO,QACPhE,OAAQuvB,EACRnpB,QAAS,UACT+C,YAhCAmkF,GAC6C,OAA5CwB,EAAkCnB,OACQ,OAA1CmB,EAAkClB,OAKjCN,GAAsD,OAAtCwB,QACqBx4F,IAAtCw4F,EAyBDrlF,SAAS,iBAIXylF,GAAc,iBAAoB,CACpC1gE,MAAOe,EACPy+B,MAAOz9B,EACPs+D,gBAAiB,SAAAxnF,GACbwnF,EAAgBxnF,IAEpBynF,YACAO,oBAAqB,kBAAMN,EAAa3jF,IACxCA,QACAkkF,WAAYV,EACZW,oBAAqBJ,EACrBK,oBAAqBJ,EACrBjmF,WAAYA,EACZgtB,OACAxN,OACAoN,UAuCE7O,GAAa,SAAC1B,GAAD,OACfc,IAAMd,GAAMkC,OAAO,aAsDvB,IAAKinE,EACD,OAAO,KAGX,IAAMc,KAAgBrkF,KAAS,OAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAeuiF,SAAWviF,EAE3D,OACI,qCACKnC,EA3DmB,oBAAbA,EACAA,EAAS4rB,EAAYq6D,MAE5BjmF,EAEO8hF,uBAAa9hF,EAAU,CAC1BrF,IAAKixB,SAHb,EA2DQ,cAACu5D,EAAD,CACIjlF,SAAUA,EACVvF,IAAKixB,EACLkB,MAAOA,EACPs4D,UAAWoB,GACX/oF,YAAA,OAAW+C,QAAX,IAAWA,IAAY,oBAL3B,SAnDU,WAClB,IAAIimF,EAAe5mD,IACf6mD,EAAa7mD,IAEjB,GAAIwkD,GAAeliF,EAAO,CACtB,IAAMqiF,EAASriF,EAQf,OAPIqiF,EAAOE,QACP+B,EAAexoE,GAAWumE,EAAOE,QAEjCF,EAAOG,MACP+B,EAAazoE,GAAWumE,EAAOG,MAI/B,qCACI,cAACW,EAAD,CAAa7nF,YAAU,mBAAvB,SACKgpF,IAEL,cAACpB,EAAD,CAAe5nF,YAAU,iBAAzB,oBACA,cAAC6nF,EAAD,CAAa7nF,YAAU,iBAAvB,SACKipF,OAWjB,OALevkF,IAEXskF,EAAeC,EAAazoE,GAFjB9b,IAMX,mCACI,cAACmjF,EAAD,CAAa7nF,YAAU,mBAAvB,SACKgpF,MAwBAE,KAGR75D,GAASM,GAAWyd,uBAjGrB,eAACm6C,EAAD,CACIrqF,IAAKgnF,EACL1hF,MAAOA,EACPrF,UAAWA,EAHf,UAKI,cAACqqF,EAAD,UACI,cAAC,EAAD,CACI9iF,MAAO0jF,EACPzjE,aAAc,SAAA7F,GACVupE,EAAavpE,IAEjB8nE,YAAaA,EACbC,aAAcA,EACdC,eAAgBA,MA3B5BiB,EACOA,EAAcS,MAIrB,eAACf,EAAD,CAAsBznF,YAAU,6BAAhC,UACK0oF,EACAD,QAwG8CR,Q,uGC3WlDppB,EAAwB,WACjC,IAAMsqB,EAAiBl4F,cACjBm4F,EAAiBj4F,eAOvB,OAAOtC,uBACH,SAACkwE,GACG,OAAIA,EAAK77D,KCvBQ,SDwBNsoB,QAAQC,OAAO,CAAEhsB,QAAS,kCAG9B0pF,EAAepqB,EAAKllE,MACtBswB,MAAK,SAACk/D,GAEH,OADAj4F,EAAUi4F,EAAM/qF,GACTgrF,IAAM54F,IAAI24F,EAAM9pD,IAAKw/B,EAAM,CAAE17B,QAAS,CAAE,eAAgB07B,EAAKllE,WAEvEswB,MAAK,WACF,OAAOi/D,EAAeh4F,MAEzB+4B,MAAK,SAACo/D,GACH,MAAkC,WAA9BA,EAAmB34F,OACZ46B,QAAQo7B,QAAQx1D,GAEhBo6B,QAAQC,OAAO,CAAEhsB,QAAS,6CAb7C,IAAIrO,IAiBR,CAAC+3F,EAAgBC,M,iGEUnBI,EAOF,CACA,aAAc,CACVC,iBAAkB,UAClBC,mBAAoB,eACpBC,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,eAAgB,CACZ8rF,iBAAkB,YAClBC,mBAAoB,aACpBC,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,YAAa,CACT8rF,iBAAkB,eAClBC,mBAAoB,UACpBC,cAAe,CACXjsF,EAAG,MACHC,EAAG,SAGX,UAAW,CACP8rF,iBAAkB,aAClBC,mBAAoB,YACpBC,cAAe,CACXjsF,EAAG,MACHC,EAAG,SAGX,aAAc,CACV+rF,mBAAoB,cACpBC,cAAe,CACXjsF,EAAG,OACHC,EAAG,QAGX,cAAe,CACX+rF,mBAAoB,aACpBC,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,uBAAwB,CACpB+rF,mBAAoB,sBACpBD,iBAAkB,oBAClBE,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,sBAAuB,CACnB+rF,mBAAoB,uBACpBD,iBAAkB,mBAClBE,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,oBAAqB,CACjB+rF,mBAAoB,mBACpBD,iBAAkB,uBAClBE,cAAe,CACXjsF,EAAG,MACHC,EAAG,QAGX,mBAAoB,CAChB+rF,mBAAoB,uBACpBD,iBAAkB,sBAClBE,cAAe,CACXjsF,EAAG,MACHC,EAAG,SAaFymF,EAAW,SACpBj2D,EACA+1D,EACA0F,EACAj2B,GAEA,IAAMk2B,EAAmC,aACrCr4F,OAAQ,CAAEkM,EAAG,MAAOC,EAAG,OACvB49D,SAAU,eACV/vB,QAAS,QACT88C,aAAa,EACbwB,UAAU,EACVx7D,oBAAoB,GACjBqlC,GAGDn0B,EAASoU,cACTm2C,EAAiCH,EAAiBI,wBAElDC,EAASntE,mBAAQ,WAAO,IAAD,EACnBotE,EAAiBN,EAAiBI,wBAClCG,EAAY,UAAGh8D,EAAWS,eAAd,aAAG,EAAoBo7D,wBACzC,MAAO,CACH3kB,MAAkB,OAAZ8kB,QAAY,IAAZA,OAAA,EAAAA,EAAc9kB,MAAO,GAAK6kB,EAAe7kB,IAC/C1lB,MAAOwqC,EAAeA,EAAaxqC,KAAO,GAAKuqC,EAAevqC,KAC9DyqC,OACKD,EAAeA,EAAaC,MAAQ,GAAKF,EAAeE,MAC7DC,SAAqB,OAAZF,QAAY,IAAZA,OAAA,EAAAA,EAAcE,SAAU,GAAKH,EAAeG,OACrD9sF,QAAoB,OAAZ4sF,QAAY,IAAZA,OAAA,EAAAA,EAAc5sF,SAAU,EAChCD,OAAmB,OAAZ6sF,QAAY,IAAZA,OAAA,EAAAA,EAAc7sF,QAAS,KAGnC,CACCssF,EACAG,EACA57D,EACAA,EAAWS,QACX4Q,IAIJrd,qBAAU,WACP,IAAMmoE,EAAiB,OAAGn8D,QAAH,IAAGA,OAAH,EAAGA,EAAYS,QAErC,GAAI07D,GAAqBT,EAAaC,SAClC,OAAQD,EAAar+C,SACjB,IAAK,QACD8+C,EAAkBjxC,iBAAiB,aAAcp3B,GACjDqoE,EAAkBjxC,iBAAiB,aAAc5pB,GACjD,MACJ,IAAK,QACD66D,EAAkBjxC,iBAAiB,QAAS3pB,GAKxD,OAAO,WACH,GAAI46D,GAAqBT,EAAaC,SAClC,OAAQD,EAAar+C,SACjB,IAAK,QACD8+C,EAAkB9wC,oBACd,aACAv3B,GAEJqoE,EAAkB9wC,oBACd,aACA/pB,GAEJ,MACJ,IAAK,QACD66D,EAAkB9wC,oBACd,QACA9pB,OAOrB,IA1EU,MA6EmB1N,mBAC5B6nE,EAAatuB,UA9EJ,mBA6ENA,EA7EM,KA6EIgvB,EA7EJ,OAiFcvoE,oBAAS,GAjFvB,mBAiFNqN,EAjFM,KAiFCC,EAjFD,KAmFPC,EAAWvL,iBAAOqL,GAClBG,EAAW,SAAC9qB,GACd6qB,EAASX,QAAUlqB,EACnB4qB,EAAU5qB,IAERud,EAAO,WACTuN,GAAS,IAEPC,EAAO,WACTD,GAAS,IAEPE,EAAc,WACZH,EAASX,QACTa,IAEAxN,MC1PmB,SAC3B/kB,EACAk8C,GAEE,IADFzpB,IACC,yDACK66D,EAAexmE,iBAAOo1B,GAEtBqxC,EAAe57F,uBACjB,SAACq1B,GACQyL,KAIQ/vB,MAAMC,QAAQ3C,GAAOA,EAAM,CAACA,IACjBkgC,MACpB,SAAAnrB,GAAI,OACiB,OAAjBA,EAAK2c,SACL3c,EAAK2c,QAAQmrB,SAAS71B,EAAEgwB,YAI5Bs2C,EAAa57D,QAAQ1K,MAG7B,CAACyL,EAASzyB,IAGdilB,qBAAU,WACNqoE,EAAa57D,QAAUwqB,KAG3Bj3B,qBAAU,WACN,IAAM8d,EAAOJ,SAASmN,cAAc,QAMpC,OAJI/M,GACAA,EAAKoZ,iBAAiB,QAASoxC,GAG5B,WACCxqD,GACAA,EAAKuZ,oBAAoB,QAASixC,MAG3C,CAACvtF,EAAKk8C,EAASqxC,IDmNlBC,CACI,CAACxG,EAAY/1D,GACbsB,EACAo6D,EAAav7D,oBAIjBq8D,2BAAgB,WACZ,GAAIt7D,GAAS60D,EAAWt1D,QAAS,CAC7B,IAAMg8D,EAAe1G,EAAWt1D,QAAQo7D,yBAEpCY,EAAaR,MAAQ5qD,EAAOliC,OAASstF,EAAajrC,KAAO,IAIzD6pC,EAAgBjuB,GAAUmuB,oBAE1Ba,EACIf,EAAgBjuB,GACXmuB,uBAKlB,CAACr6D,IA9HS,MAgIiBrN,oBAAS,GAhI1B,mBAgIN2N,EAhIM,KAgIGC,EAhIH,KAiIPC,EAAS,WACXD,GAAW,IAETE,EAAU,WACZL,IACAG,GAAW,IAGf,GAA2B,OAAvBzB,EAAWS,QACX,MAAO,CACHpsB,MAAO,CACHm9C,KAAM,MACN0lB,IAAK,OAETh2C,QACAI,OACAxN,OACA0N,UACAE,SACAC,UACAJ,cACA6rC,YAgHR,MAAO,CACH/4D,MAAM,2BAlGgB,WACtB,IAAMhR,EAXFmiE,GAAUA,EAAOniE,OACV,CACHkM,EAAGi2D,EAAOniE,OAAOkM,GAAK8rF,EAAgBjuB,GAAUouB,cAAcjsF,EAC9DC,EAAGg2D,EAAOniE,OAAOmM,GAAK6rF,EAAgBjuB,GAAUouB,cAAchsF,GAI/D6rF,EAAgBjuB,GAAUouB,cAKjC,OAAQpuB,GACJ,IAAK,eACD,MAAO,CACH8J,IAAI,QAAD,QAAW4kB,EAAO5kB,IAAM4kB,EAAO1sF,QAAQ9O,WAAvC,gBACC+C,EAAOmM,EADR,KAGHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,MAEZ,IAAK,aACD,MAAO,CACH2nE,IAAI,QAAD,QAAW4kB,EAAO5kB,IAAM4kB,EAAO1sF,QAAQ9O,WAAvC,gBACC+C,EAAOmM,EADR,KAGHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBACAw7F,EAAO3sF,MADP,gBAEI9L,EAAOkM,EAFX,KAGJs0B,UAAW,qBAEnB,IAAK,cACD,MAAO,CACHqzC,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBACAw7F,EAAO3sF,MADP,gBAEI9L,EAAOkM,EAFX,MAIZ,IAAK,aACD,MAAO,CACH2nE,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAW,qBAEnB,IAAK,YACD,MAAO,CACHqzC,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAW,qBAEnB,IAAK,UACD,MAAO,CACHqzC,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBACAw7F,EAAO3sF,MADP,gBAEI9L,EAAOkM,EAFX,KAGJs0B,UAAW,uCAEnB,IAAK,uBACD,MAAO,CACHqzC,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAU,cAAD,OAAgBi4D,EAAO1sF,OAAS,EAAhC,0BACL0sF,EAAO3sF,MAAQ,EADV,QAIjB,IAAK,sBACD,MAAO,CACH+nE,IAAI,QAAD,OAAU4kB,EAAO5kB,IAAI52E,WAArB,gBAAuC+C,EAAOmM,EAA9C,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAU,cAAD,OACLi4D,EAAO1sF,OAAS,EADX,uCAEsB0sF,EAAO3sF,MAAQ,EAFrC,SAIjB,IAAK,oBACD,MAAO,CACH+nE,IAAI,QAAD,OAAU4kB,EAAOI,OAAO57F,WAAxB,gBAA0C+C,EAAOmM,EAAjD,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAU,2BAAD,OACLi4D,EAAO1sF,OAAS,EADX,gBAED/L,EAAOmM,EAFN,yBAEwBssF,EAAO3sF,MAAQ,EAFvC,QAIjB,IAAK,mBACD,MAAO,CACH+nE,IAAI,QAAD,OAAU4kB,EAAOI,OAAO57F,WAAxB,gBAA0C+C,EAAOmM,EAAjD,KACHgiD,KAAK,QAAD,OAAUsqC,EAAOtqC,KAAKlxD,WAAtB,gBAAwC+C,EAAOkM,EAA/C,KACJs0B,UAAU,2BAAD,OACLi4D,EAAO1sF,OAAS,EADX,gBAED/L,EAAOmM,EAFN,sCAGLssF,EAAO3sF,MAAQ,EAHV,UAuBTutF,IAdY,WACxB,IAAMhxC,EAAwB,CAC1B0hB,SAAU,WACVuvB,OAAQ,MAOZ,OAJKjB,EAAavB,cACdzuC,EAAOkxC,cAAgB,QAGpBlxC,EAI6BmxC,IACpC37D,QACAI,OACAxN,OACA0N,UACAE,SACAC,UACAJ,cACA6rC,c,gVEzaI0vB,E,sECGCC,EAAkBrsF,IAAOC,IAAV,mSACtB,SAAAC,GAAK,OAAIA,EAAMosF,aAAN,yBACT,SAAApsF,GAAK,OAAIA,EAAMosF,aAAN,uBAMO,SAAApsF,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAK5B,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAIrC+lG,EAAavsF,IAAOwsF,MAAV,yXAON7tB,IAAMC,WAGD,SAAA1+D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAK5B,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAIrCimG,EAAYzsF,IAAOC,IAAV,yHAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIjCuoG,EAA6B1sF,IAAOC,IAAV,wEAK1B0sF,EAAc3sF,IAAOwsF,MAAV,sG,2BChDXI,EAA0B5sF,YAAOgwD,IAAPhwD,CAAH,gFAEL,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAG9CioG,EAAoB7sF,IAAOC,IAAV,2NAMjB,gBAAGxB,EAAH,EAAGA,MAAH,OAAgBA,EAAK,UAAMA,EAAN,KAAiB,S,gBCmDpCquF,GAxD2B,SAAA5sF,GAAU,IAAD,EACfA,EAAxB6sF,oBAEAC,EAHuC,EAGvCA,qBAAsBC,EAHiB,EAGjBA,QAE9B,OACI,gCACI,eAAC,IAAD,WACKD,GACG,cAACJ,EAAD,CAAyBnuF,MAAO,GAAKyF,SAAU8oF,EAAqB9oF,UAArB,UAAoC8oF,EAAqB9oF,SAAzD,WAA/C,SACI,cAAC,IAAD,CACIyG,QAASqiF,EAAqBriF,QAC9B/G,SAAUopF,EAAqBppF,SAC/BgH,QAASoiF,EAAqBpiF,QAC9BogE,YAAagiB,EAAqBhiB,YAClC3mE,KAAM2oF,EAAqB3oF,KAC3BH,SAAU8oF,EAAqB9oF,UAArB,UAAoC8oF,EAAqB9oF,SAAzD,eAIpBk/B,kBAAQ6pD,IACNA,EAAQhsF,KAAI,SAAAisF,GAAW,IAAD,EACV/oF,EAA4C+oF,EAA5C/oF,MAAOT,EAAqCwpF,EAArCxpF,SADG,EACkCwpF,EAA3BC,kBADP,WACoBp8F,EADpB,EAGlB,OAAOqyC,kBAAQ+pD,GACX,cAAC,IAAD,2BAAiCD,GAAjC,8BACKxpF,QADL,IACKA,IAAYS,SADjB,QAC0B,KADJA,GAItB,cAAC,IAAD,2BAAiC+oF,GAAjC,IAAyC58B,YAAU,EAAnD,SACI,cAACu8B,EAAD,CACIpuF,MAAK,OAAEyuF,QAAF,IAAEA,OAAF,EAAEA,EAAQn8B,WACfzyD,UAAS,OACL4uF,QADK,IACLA,OADK,EACLA,EAAQE,8BAHhB,gBAMKD,QANL,IAMKA,OANL,EAMKA,EAAYlsF,KAAI,SAAAosF,GAAc,IACnBlpF,EAAmBkpF,EAAnBlpF,MAAUumB,EADQ,YACC2iE,EADD,WAE1B,OACI,wBAAC,IAAD,2BACQ3iE,GADR,IAEIwG,IAAK/sB,IAFT,OAIKA,QAJL,IAIKA,IAAS,WAdRA,Y,mBClCrCmpF,GAAoBttF,YAAOgwD,IAAPhwD,CAAH,6CAIjButF,GAA+BvtF,IAAOC,IAAV,qJAKjB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmE,qBAGvCmlG,GAAwBxtF,IAAOC,IAAV,uGAIrB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,S,6BChB5BspG,GAA0BztF,IAAOC,IAAV,qIAQvBytF,GAAS1tF,YAAOurC,KAAPvrC,CAAH,uIAQN2tF,GAAa3tF,IAAOC,IAAV,wFAMVw8D,GAAcz8D,IAAOC,IAAV,mGAGL,SAAAC,GAAK,OAAKA,EAAM0tF,WAAa,GAAK,KCRtCC,GAf2B,SAAA3tF,GAAU,IACxC4tF,EAA0D5tF,EAA1D4tF,IAAKC,EAAqD7tF,EAArD6tF,YAAaC,EAAwC9tF,EAAxC8tF,eAAgB1vF,EAAwB4B,EAAxB5B,UAAW4F,EAAahE,EAAbgE,SAErD,OACI,cAACupF,GAAD,CAAyBnvF,UAAWA,EAApC,SACI,eAACqvF,GAAD,WACI,cAACD,GAAD,aAAQxpF,SAAUA,GAAQ,UAAOA,EAAP,YAA1B,OAAwD8pF,QAAxD,IAAwDA,OAAxD,EAAwDA,EAAiBF,KACzE,cAAC/7B,GAAA,EAAD,CAAwB7tD,SAAUA,GAAQ,UAAOA,EAAP,UAA1C,gBACK6pF,QADL,IACKA,OADL,EACKA,EAAcD,W,UCUpBG,GAjBoC,SAAA/tF,GAAU,IAAD,UAChD4tF,EAAqE5tF,EAArE4tF,IAAKC,EAAgE7tF,EAAhE6tF,YAAaC,EAAmD9tF,EAAnD8tF,eAAgBJ,EAAmC1tF,EAAnC0tF,UAAWtvF,EAAwB4B,EAAxB5B,UAAW4F,EAAahE,EAAbgE,SAEhE,OACI,eAACu4D,GAAD,CACImxB,UAAS,iBAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAYE,UAAd,SACTxvF,UAAWA,EAFf,UAII,cAACspF,GAAA,EAAD,CACIhgF,QAAO,iBAAEomF,QAAF,IAAEA,GAAF,UAAEA,EAAiBF,UAAnB,aAAE,EAAuBlmF,eAAzB,QAAoC,GAC3C1D,SAAQ,iBAAE8pF,QAAF,IAAEA,GAAF,UAAEA,EAAiBF,UAAnB,aAAE,EAAuB5pF,gBAAzB,QAAsCA,EAAQ,UAAMA,EAAN,gBAA0BnT,IAEpF,sBAAMoQ,YAAW+C,GAAQ,UAAOA,EAAP,UAAzB,gBAAmD6pF,QAAnD,IAAmDA,OAAnD,EAAmDA,EAAcD,SCH9DI,GAVqC,SAAAhuF,GAAU,IAClDiuF,EAAyBjuF,EAAzBiuF,YAAgBzjE,EADiC,YACxBxqB,EADwB,iBAGzD,OAAOiuF,EACH,cAAC,GAAD,eAA0BzjE,IAE1B,cAAC,GAAD,eAAiBA,KCVZ0jE,GAAqB,CAC9Bh7F,OAAQ,CACJmH,KAAM,oBACN6d,WAAY,qBAEhB/kB,QAAS,CACLkH,KAAM,uBACN6d,WAAY,oBAEhBulB,QAAS,CACLpjC,KAAM,qBACN6d,WAAY,sBAEhBy2B,MAAO,CACHt0C,KAAM,mBACN6d,WAAY,qBAEhB02B,SAAU,CACNv0C,KAAM,UACN6d,WAAY,YAIPy3C,GAAK7vD,IAAO8vD,GAAV,qPAST,SAAA5vD,GAAK,OAAKA,EAAMzB,MAAN,iBAAwByB,EAAMzB,MAA9B,KAAyC,MAEtC,SAAAyB,GAAK,OAAKA,EAAM6vD,UAAY,GAAM,KAE/C,SAAA7vD,GAAK,OACHA,EAAM6vD,WAAN,sCASKS,GAAOxwD,IAAOC,IAAV,wKAKC,SAAAC,GAAK,OACfA,EAAMnO,OACAq8F,GAAcluF,EAAMnO,OAAOq6C,eAAeh0B,WAC1Cg2E,GAAa,SAAah2E,cAC3B,SAAAlY,GAAK,OACVA,EAAMnO,OACAq8F,GAAcluF,EAAMnO,OAAOq6C,eAAe7xC,KAC1C6zF,GAAa,SAAa7zF,QCvDlC8zF,GAA4C,SAAC,GAAD,IAC9C5vF,EAD8C,EAC9CA,MACAwxD,EAF8C,EAE9CA,QACA3xD,EAH8C,EAG9CA,UACAoF,EAJ8C,EAI9CA,SACA3R,EAL8C,EAK9CA,OACAqS,EAN8C,EAM9CA,QACAF,EAP8C,EAO9CA,SAP8C,OAS9C,cAAC2rD,GAAD,CACIpxD,MAAOA,EACPsxD,YAAa3rD,EACb6rD,QAASA,EACT3xD,UAAWA,EACX8F,QAASA,EALb,SAOI,eAACosD,GAAD,CAAMz+D,OAAQA,EAAQoP,YAAW+C,EAAjC,cAA6CR,QAItChD,kBAAK2tF,ICpBdC,GAAkC,SAAApuF,GAAU,IACtC4tF,EAAyC5tF,EAAzC4tF,IAAKC,EAAoC7tF,EAApC6tF,YAAaQ,EAAuBruF,EAAvBquF,mBAC1B,OAAOA,EACH,cAAC,GAAD,2BAAqBA,EAAmBT,IAAxC,oBACKC,QADL,IACKA,OADL,EACKA,EAAcD,MAGnB,8BAIOptF,kBAAK4tF,ICTPE,GAPa,aAObA,GANe,eAMfA,GALc,cAKdA,GAJe,eAIfA,GAHa,aAGbA,GAFe,e,UCQbC,GARuB,SAAAvuF,GAAU,IACpC4tF,EAAsC5tF,EAAtC4tF,IAAKY,EAAiCxuF,EAAjCwuF,kBAAmBpwF,EAAc4B,EAAd5B,UAEhC,OACI,cAAC4+D,GAAA,EAAD,kCAAoBwxB,QAApB,IAAoBA,OAApB,EAAoBA,EAAoBZ,IAAxC,IAA8CxvF,UAAWA,MCClDqwF,GANqC,SAAAzuF,GAAU,IAAD,EACjD4tF,EAAiC5tF,EAAjC4tF,IAAKc,EAA4B1uF,EAA5B0uF,wBAEb,iBAAO,0CAAGA,QAAH,IAAGA,OAAH,EAAGA,EAA0Bd,YAApC,QAAgD,8BCLvCL,GAA0BztF,IAAOC,IAAV,qICgBrB4uF,GAZuC,SAAA3uF,GAAU,IACpD4tF,EAA6D5tF,EAA7D4tF,IAAKC,EAAwD7tF,EAAxD6tF,YAAae,EAA2C5uF,EAA3C4uF,kBAAmBxwF,EAAwB4B,EAAxB5B,UAAW4F,EAAahE,EAAbgE,SAExD,OACI,cAAC,GAAD,CAAyB5F,UAAWA,EAApC,SACI,cAACyzD,GAAA,EAAD,kCAA4B+8B,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAoBhB,IAAhD,IAAsD5pF,SAAUA,EAAhE,gBACK6pF,QADL,IACKA,OADL,EACKA,EAAcD,SCFhBiB,GANuB,SAAA7uF,GAAU,IACpC4tF,EAA+B5tF,EAA/B4tF,IAAKC,EAA0B7tF,EAA1B6tF,YAAa7pF,EAAahE,EAAbgE,SAE1B,OAAO,sBAAM/C,YAAW+C,EAAjB,gBAA4B6pF,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAcD,MCStCkB,GAViC,SAAA9uF,GAAU,IAC9C+uF,EAA4B/uF,EAA5B+uF,eAAmBvkE,EAD0B,YACjBxqB,EADiB,oBAGrD,OAAO+uF,EACH,cAAC,GAAD,eAAuBvkE,IAEvB,cAAC,GAAD,eAAeA,KCuCRwkE,GAzCuC,SAAAhvF,GAAU,IAAD,EAEvDivF,EAIAjvF,EAJAivF,UACAC,EAGAlvF,EAHAkvF,WACAC,EAEAnvF,EAFAmvF,eACAC,EACApvF,EADAovF,wBAGAC,EAAY,wBAEhB,OAAQJ,GACJ,KAAKX,GACDe,EAAY,cAAC,GAAD,2BAAeH,GAAf,IAA2BtB,IAAKuB,KAC5C,MAEJ,KAAKb,GACDe,EAAY,cAAC,GAAD,2BAAiBH,GAAjB,IAA6BtB,IAAKuB,KAC9C,MACJ,KAAKb,GACDe,EAAY,cAAC,GAAD,2BAAgBH,GAAhB,IAA4BtB,IAAKuB,KAC7C,MACJ,KAAKb,GACDe,EAAS,iBAAGD,QAAH,IAAGA,OAAH,EAAGA,EAA0BD,UAA7B,QAAgD,wBACzD,MACJ,KAAKb,GACDe,EAAY,cAAC,GAAD,2BAAeH,GAAf,IAA2BtB,IAAKuB,KAC5C,MAEJ,KAAKb,GACDe,EACI,cAAC,GAAD,2BAAsBH,GAAtB,IAAkCtB,IAAKuB,KAQnD,OAAOE,G,UC3CL54B,GAAK32D,IAAO42D,GAAV,+DAkCO44B,GArBiD,SAAC,GAM1D,IALH5mF,EAKE,EALFA,eAKE,IAJFqnD,eAIE,MAJQ,IAIR,EAHFyc,EAGE,EAHFA,cACAC,EAEE,EAFFA,iBACAC,EACE,EADFA,kBAEA,OACI,cAACjW,GAAD,UACI,oBAAI1G,QAASA,EAAb,SACI,cAACwc,GAAA,EAAD,CACI7jE,eAAgBA,EAChB+jE,iBAAkBA,EAClBC,kBAAmBA,EACnBF,cAAeA,SCyEpB+iB,GAvFqC,SAAAvvF,GAAU,IAClD/N,EAAoB+N,EAApB/N,KAAMu9F,EAAcxvF,EAAdwvF,UAGVC,EAWAD,EAXAC,MACAC,EAUAF,EAVAE,WACAC,EASAH,EATAG,aACAC,EAQAJ,EARAI,kBACAC,EAOAL,EAPAK,gBACArB,EAMAgB,EANAhB,kBACAsB,EAKAN,EALAM,aACAC,EAIAP,EAJAO,YACA/rF,EAGAwrF,EAHAxrF,SAZqD,EAerDwrF,EAFArrF,YAbqD,WAa9CtT,EAb8C,IAerD2+F,EADAQ,4BAdqD,SAiBzD,OACI,cAAC,KAAD,iBACK/9F,QADL,IACKA,OADL,EACKA,EAAM8O,KAAI,SAAC6sF,GAAc,IAAD,IACfqC,EAAa,iBAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAcnC,UAAjB,QAAyB5pF,EAC5C,OACI,eAAC,WAAD,WACI,eAAC,IAAD,CAEIE,QACIwrF,EAAa,yBAAMA,QAAN,IAAMA,OAAN,EAAMA,EAAa9B,SAAO/8F,EAE3CuN,UAAS,OAAE0xF,QAAF,IAAEA,OAAF,EAAEA,EAAelC,GAC1B5pF,SAAUisF,EANd,UAQKL,GAAqBD,GAClB,cAACvC,GAAD,UACK4C,IAAoB,OACrBA,QADqB,IACrBA,OADqB,EACrBA,EAAuBpC,IACnB,cAACphD,GAAA,EAAD,CACIjpC,MAAM,+BACNmpC,OAAO,gBAFX,SAII,cAAC2gD,GAAD,UACI,cAACC,GAAD,CAAuBrsF,YAAWgvF,GAAa,UAAOA,EAAP,kBAA/C,SACI,cAACtI,GAAA,EAAD,UAKZ,cAAC,IAAD,CACIl9E,QAAO,iBACHklF,QADG,IACHA,OADG,EACHA,EAAe/B,UADZ,SAGP9iB,YAAa,SAAA3lD,GAAC,cACVyqE,QADU,IACVA,OADU,EACVA,EAAoBzqE,EAAGyoE,IAE3BzpF,KAAMA,EACNH,SAAUisF,GAAa,UAAOA,EAAP,iBA/B3C,OAoCKR,QApCL,IAoCKA,OApCL,EAoCKA,EAAO1uF,KAAI,SAAAmvF,GAAI,aACZ,cAAC,IAAD,CACI9xF,UAAS,OAAE8xF,QAAF,IAAEA,OAAF,EAAEA,EAAMC,cACjBngC,oBAAmB,OAAEkgC,QAAF,IAAEA,GAAF,UAAEA,EAAMlgC,2BAAR,aAAE,OAAAkgC,EACjBtC,GAEJrvF,MAAK,OAAE2xF,QAAF,IAAEA,OAAF,EAAEA,EAAM3xF,MALjB,SAOI,cAAC,GAAD,2BACQ2xF,GADR,IAEIf,eAAgBvB,YA9ChC,OACSA,QADT,IACSA,OADT,EACSA,EAAKruF,KAmDE,OAAfswF,QAAe,IAAfA,OAAA,EAAAA,EAAkBjC,KACf,cAAC,GAAD,sBACQY,QADR,IACQA,OADR,EACQA,EAAoBZ,OAvDpC,OAAeA,QAAf,IAAeA,OAAf,EAAeA,EAAKruF,U,oBCpClC2kF,GAAYpkF,IAAOmkF,MAAV,0BACTmM,GAAetwF,IAAO8vD,GAAV,+CAgBHygC,GAZoB7vF,gBAAK,YAAmB,IAAhBgD,EAAe,EAAfA,SACvC,OACI,cAAC0gF,GAAD,UACI,6BACI,cAACkM,GAAD,CAAcrgC,QAAS,IAAvB,SACI,cAACwV,GAAA,EAAD,UAAsB/hE,aC6B3B8sF,GA/BuC,SAAAtwF,GAAU,IAExDuwF,EAKAvwF,EALAuwF,YACAC,EAIAxwF,EAJAwwF,iBACAC,EAGAzwF,EAHAywF,uBACAC,EAEA1wF,EAFA0wF,uBACAC,EACA3wF,EADA2wF,yBAGJ,OACI,cAAC,GAAD,UACI,eAACprB,GAAA,EAAD,WACKgrB,EAAYK,oBACT,cAAC,KAAD,CAAYjtF,KAAI,OAAE6sF,QAAF,IAAEA,OAAF,EAAEA,EAAkB7sF,KAAMpF,MAAK,OAAEiyF,QAAF,IAAEA,OAAF,EAAEA,EAAkBjyF,MAAOyF,SAAQ,OAAEwsF,QAAF,IAAEA,OAAF,EAAEA,EAAkBxsF,SAAtG,gBACKwsF,QADL,IACKA,OADL,EACKA,EAAkBn2F,OAG1Bk2F,EAAYM,0BACT,cAAC,KAAD,eAAqBJ,IAExBF,EAAYO,0BACT,cAAC,KAAD,eAAqBJ,IAExBH,EAAYQ,4BACT,cAAC,KAAD,eAAuBJ,UC5BrCK,GAAkC,SAAAhxF,GAAU,IAE1C/N,EAOA+N,EAPA/N,KACAs+F,EAMAvwF,EANAuwF,YACAnE,EAKApsF,EALAosF,YACA6E,EAIAjxF,EAJAixF,wBACAC,EAGAlxF,EAHAkxF,oBACAC,EAEAnxF,EAFAmxF,8BACAC,EACApxF,EADAoxF,cAGI5B,EAAc4B,EAAd5B,UAXqC,EAmBzC2B,GAAiC,GALjCE,EAdyC,EAczCA,qBACAb,EAfyC,EAezCA,iBACAC,EAhByC,EAgBzCA,uBACAC,EAjByC,EAiBzCA,uBACAC,EAlByC,EAkBzCA,yBAGJ,OACI,cAACpE,EAAD,CAAWnuF,UAAW6yF,EAAtB,SACI,cAAC9E,EAAD,CAAiBC,YAAaA,EAA9B,SACI,eAACC,EAAD,CAAYjuF,UAAW8yF,EAAvB,UACI,cAAC,GAAD,CAAarE,oBAAqBuE,KAEhCb,EAAYpmE,gBACV,cAAC,GAAD,CAAkBl4B,KAAMA,EAAMu9F,UAAWA,IAG5C6B,GAAwBd,EAAYpmE,gBACjC,cAAC,GAAD,CACIomE,YAAaA,EACbC,iBAAkBA,EAClBC,uBAAwBA,EACxBC,uBAAwBA,EACxBC,yBAA0BA,YASvCnwF,kBAAKwwF,I,mBC5CdM,GAA0C,SAAAtxF,GAAU,IAElD/N,EAOA+N,EAPA/N,KACAs+F,EAMAvwF,EANAuwF,YACAU,EAKAjxF,EALAixF,wBACAM,EAIAvxF,EAJAuxF,sBACAC,EAGAxxF,EAHAwxF,UACAL,EAEAnxF,EAFAmxF,8BACAC,EACApxF,EADAoxF,cAGI5B,EAAc4B,EAAd5B,UAX6C,EAmBjD2B,GAAiC,GALjCE,EAdiD,EAcjDA,qBACAb,EAfiD,EAejDA,iBACAC,EAhBiD,EAgBjDA,uBACAC,EAjBiD,EAiBjDA,uBACAC,EAlBiD,EAkBjDA,yBAGJ,OACI,qCACI,cAAC,GAAD,CAAa9D,oBAAqBuE,IAClC,cAAC5E,EAAD,CACIruF,IAAKqzF,EACLpzF,UAAW6yF,EAFf,SAII,cAACt3B,GAAA,EAAD,2BAAsB43B,GAAtB,aACI,eAAC9E,EAAD,YACM8D,EAAYpmE,gBACV,cAAC,GAAD,CACIl4B,KAAMA,EACNu9F,UAAWA,IAGlB6B,GAAwBd,EAAYpmE,gBACjC,cAAC,GAAD,CACIomE,YAAaA,EACbC,iBAAkBA,EAClBC,uBAAwBA,EACxBC,uBAAwBA,EACxBC,yBAA0BA,YAM9C,cAAC,KAAD,QAKGnwF,kBAAK8wF,IC/CLG,GAVyB,SAAAzxF,GAAU,IACtC0xF,EAAsB1xF,EAAtB0xF,SAAalnE,EADwB,YACfxqB,EADe,cAG7C,OAAO0xF,IAAa/yB,IAAcgzB,OAC9B,cAAC,GAAD,eAAqBnnE,IAErB,cAAC,GAAD,eAA6BA,K,iECVxBonE,GAAa9xF,IAAOC,IAAV,sJAQVuD,GAASxD,IAAOoD,OAAV,8UAKK,SAAAlD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YACtC,SAAAsb,GAAK,OAAKA,EAAM0D,SAAW,SAAW,aAOrC,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,MAAQ,OAE5C,qBAAGA,UAED+jB,YADA,mMAG4B,SAAAznB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI5B,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,gBAKnDmsE,GAAgB5wD,IAAOC,IAAV,uKAKR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aCnCxCstG,GAAKhyE,EAAQ,IAWNiyE,GAAS,SAAC,GAOH,IANhB7/E,EAMe,EANfA,WACA2nD,EAKe,EALfA,aACAm4B,EAIe,EAJfA,aACAC,EAGe,EAHfA,uBACAC,EAEe,EAFfA,YAEe,IADfjuF,gBACe,MADJ,eACI,EACT4T,EAAWC,eACXH,EAAUW,eACV65E,EAAcL,GAAGngE,MAAM9Z,EAAShjB,QAAQu9F,KAH/B,EAImBlvE,mBAC9B3zB,SAAS4iG,IAAgB,GALd,oBAIVE,EAJU,KAIEC,EAJF,OAOuBpvE,oBAAkB,GAPzC,oBAORqvE,EAPQ,KAOKC,EAPL,KAQTC,EAAWjgF,KAAKkgF,KAAKxgF,EAAc2nD,GACnC84B,EAAa96E,EAASukC,SAASzsD,WAErC0zB,qBAAU,WACFgvE,EAAaI,IAAaF,GACtBE,EAAW,IACX96E,EAAQH,KAAR,UAAgBm7E,EAAhB,iBAAmCF,IACnCH,EAAcG,MAIvB,CAACA,IAEJpvE,qBAAU,WACN,GAAIkvE,GAAeF,EAAa,EAAG,CAC/B,IAAM3/F,EACa,IAAf2/F,EAAmB,GAAKA,EAAa,GAAKx4B,EACxCpnE,EACa,IAAf4/F,EAAmBx4B,EAAew4B,EAAax4B,GAClDq4B,GAAev6E,EAAQH,KAAR,UAAgBm7E,EAAhB,iBAAmCN,IAEnDL,EAAav/F,EAAOC,MAGzB,CAAC6/F,EAAaF,IAEjBhvE,qBAAU,WACF4uE,IACAK,EAAc,GACVH,GACAx6E,EAAQH,KAAR,UAAgBm7E,EAAhB,eAIT,CAACzgF,IAEJmR,qBAAU,WAEFnR,GACA2nD,GACA3nD,EAAc2nD,IAAiB,GAC/Bw4B,EAAa,IAEb16E,EAAQH,KAAR,UAAgBm7E,EAAhB,iBAAmCN,EAAa,IAChDC,EAAcD,EAAa,MAGhC,CAACngF,EAAY2nD,IAIhBx2C,qBAAU,WAEN,OADAg3B,aAAcvR,KAAcM,OAAe,kBAAMkpD,EAAc,MACxD,WACH73C,aAAc3R,KAAcM,OAAe,kBAAMkpD,EAAc,SAGpE,IAGH,IAAMM,EAAmB,SAACC,GACtBL,GAAe,GACG,SAAdK,EAEMP,EADND,EAAaI,EACOJ,EAAa,EACbI,GACC,SAAdI,GAEDP,EADND,EAAa,EACO,EACAA,EAAa,IAyBzC,OACI,qCArBKngF,GAAe+/E,GAER//E,GAAc+/E,EACf,cAACJ,GAAD,CAAY3wF,YAAW+C,GAAQ,UAAOA,EAAP,YAA/B,qBAIP,eAAC4tF,GAAD,CAAY3wF,YAAW+C,GAAQ,UAAOA,EAAP,YAA/B,WACMouF,EAAa,GAAKx4B,EAAe,EAC7B,GACCw4B,EAAa,GAAKx4B,EAAe,EAH5C,IAKKw4B,EAAax4B,EAAe3nD,EACvBmgF,EAAax4B,EACb3nD,EAAY,IAPtB,MAQQA,EARR,YANO,KAsBP,cAAC3O,GAAD,CACIY,QAAS,kBAAMyuF,EAAiB,SAChCjvF,SAAU0uF,GAAc,IAAMngF,EAC9BhR,YAAW+C,GAAQ,UAAOA,EAAP,SAHvB,SAKI,cAAC0sD,GAAD,UACI,cAACoC,GAAA,EAAD,CAAY10D,UAAU,eAG9B,cAACkF,GAAD,CACIY,QAAS,kBAAMyuF,EAAiB,SAChCjvF,SAAU0uF,GAAcI,IAAavgF,EACrChR,YAAW+C,GAAQ,UAAOA,EAAP,SAHvB,SAKI,cAAC0sD,GAAD,UACI,cAACoC,GAAA,EAAD,CAAYt0D,OAAQ,GAAID,MAAO,Y,kBC7ItCmrD,GAAO5pD,IAAOC,IAAV,sJACA0+D,IAAMC,WAOVzvC,GAAUnvB,IAAOC,IAAV,2KAIKhc,KAAU2E,YAAYO,kBAKlC4pG,GAAiB/yF,IAAOC,IAAV,gDAId+yF,GAAkBhzF,IAAOC,IAAV,+NAIHhc,KAAU2E,YAAYO,kBAOlC8pG,GAAYjzF,IAAOgoB,EAAV,oGACT,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,a,gHClB5ByuG,GAOR,SAAC,GAOC,IANHtvF,EAME,EANFA,SACAuvF,EAKE,EALFA,qBACAxlE,EAIE,EAJFA,sBACArvB,EAGE,EAHFA,UACA80F,EAEE,EAFFA,sBACAC,EACE,EADFA,eACE,EACsBlwE,oBAAS,GAD/B,oBACKC,EADL,KACWC,EADX,KAEImF,EAAmB2E,eACnB1E,EAAsBzV,eACtBxhB,EAASm5B,eACThX,EAAaT,eAAyB/gB,KAL1C,EAMwCgxB,oBAAS,GANjD,oBAMKmwE,EANL,KAMoBC,EANpB,KA0BIC,EAAiBxjG,uBAAY,WAC/B28B,QAAQo7B,UAAUz8B,MAAK,WACnBjI,GAAQ,GACRgwE,GAAe,QAEpB,CAACA,IAEEI,EAAiBzjG,uBAAY,WAC/BmjG,GAAwBA,IACxBK,MACD,CAACL,EAAsBK,IAE1B,IAAKpwE,EAAM,OAAO,yBASlB,OACI,cAAC+qD,GAAA,EAAD,CAAmBngC,YAAawlD,EAAhC,SACI,cAAC,KAAD,CAAkB5vF,SAAUA,EAAUtF,UAAWA,EAAjD,SACI,eAAC,KAAD,CACIkwC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfsS,UAAW,EACXD,KAAMsyC,EALV,UAOI,cAAC,KAAD,UACI,cAAC7+D,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,KAAD,CACI1S,OAAQmiB,EACRwU,cAAe32B,EAAOkiG,qBACtB9/E,aAAcpiB,EAAO4jB,eACrBoT,iBAAkBA,EAClBC,oBAAqBA,EACrBC,cAzBU,SAACuF,GAC/Bta,GAAcga,IACdA,EAAsBM,GACtBslE,GAAiB,KAuBGhrE,YA1DJ,WAChB5U,GAAcga,GACdA,EAAsBha,EAAWzB,MAAMjR,KAAI,SAAAwC,GAAK,OAAIA,EAAMhE,OAE9D8zF,GAAiB,IAuDOlrE,gBApDR,WACZ1U,GAAcga,GACdA,EAAsB,IAE1B4lE,GAAiB,IAiDOnrE,OAAQqrE,EACR3qE,UAAU,EACVD,YAAU,EACVD,mBAAiB,EACjBG,aAAc,YAI1B,eAAC,KAAD,WACI,cAAC,KAAD,UACI,cAAC,KAAD,CACItqB,MAAO,QACPhE,OAAQ+4F,EACR3yF,QAAS,UACTqD,SAAS,gBAJb,sBASJ,cAAC,KAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACd7vF,SAAU0vF,EACVpvF,SAAS,eAJb,8B,oC9BzHZkoF,K,8BAAAA,E,0CAAAA,E,oEAAAA,E,cAAAA,E,gBAAAA,E,kBAAAA,E,kBAAAA,E,gBAAAA,E,gCAAAA,E,iBAAAA,E,wCAAAA,E,sBAAAA,E,4BAAAA,E,uBAAAA,M,mH+BoBCuH,GAOR,SAAC,GAOC,IANHzhF,EAME,EANFA,MACA0hF,EAKE,EALFA,YACAhwF,EAIE,EAJFA,SAIE,IAHFiwF,qBAGE,MAHc,uCAGd,EAFFC,EAEE,EAFFA,SACAvpE,EACE,EADFA,SACE,EACsBpH,oBAAS,GAD/B,oBACKC,EADL,KACWC,EADX,KAQI0wE,EAAS,WACX,OACI,eAAC,KAAD,CACIlzF,QAAQ,QACRV,KAAMijB,EACN9kB,UAAWsF,EAAW,mBAAgB7S,EACtC6S,SAAUA,EAJd,UAMI,cAAC,KAAD,CACIH,MAAM,SACNT,MAAOY,EAAW3f,KAAUC,OAAOQ,gBAAaqM,EAChDmT,SAAS,8BAEb,cAAC,KAAD,CAAYN,SAAUA,EAAtB,SACKwf,GAAQwwE,EAAc,cAACn0C,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,MAEzC,cAAC,KAAD,CAAa0iB,aAAc,WArB9Bt+D,GACDyf,GAASD,MAsBL,cAAC,KAAD,CAAWjjB,KAAMijB,EAAM23B,WAAY13B,EAAnC,SACI,cAAC,KAAD,CAAYs+C,aAAa,OAAOljE,MAAM,QAAtC,SACKyT,GACGA,EAAMjR,KAAI,SAACmS,GACP,OACIA,EAAKgQ,MACD,cAAC,KAAD,CAEIjK,YAAa/F,EAAK+F,YAFtB,SAII,cAAC,KAAD,CAEItT,MAAOuN,EAAKvN,MACZ27D,WAAY,kBACRn+C,GAAQ,IAEZjf,QAASmmB,EACT3mB,SAAUwP,EAAKxP,SACf09D,YAAaluD,EAAKkuD,YAClB17C,KAAMxS,EAAKwS,KACX1hB,SAAUkP,EAAKlP,SAVnB,SAYKkP,EAAK3f,MAXD2f,EAAKvN,QAJTuN,EAAK3f,iBA2BlD,OAAImQ,EACQkwF,EAKJC,IAJA,cAACrnD,GAAA,EAAD,CAASjpC,MAAOowF,EAAejnD,OAAQ,WAAvC,SACKmnD,MAONA,K,2FCjELpzC,GAAmB3gD,IAAOC,IAAV,8NAIhB,SAAAC,GAAK,QAAMA,EAAMyxD,UAAR,qBAAkCzxD,EAAMyxD,SAAxC,QAEG,SAAAzxD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OACRA,EAAM0D,SACF1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAK3B4uG,GAAkBh0F,YAAO86C,KAAP96C,CAAH,uDAIf0tE,GAAuB1tE,YAAO8sC,KAAO7sC,IAAdD,CAAH,8TAQR,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAElC,SAAA+b,GAAK,OACTA,EAAM2gD,YAAc,OAAW3gD,EAAM4gD,KAAO5gD,EAAM4gD,KAAO,OACpD,SAAA5gD,GAAK,OAAKA,EAAM2gD,YAAc,OAAS,OACzC,SAAA3gD,GAAK,OAAKA,EAAM2gD,YAAN,WAAwB3gD,EAAM6gD,UAA9B,MAA8C,SAO7D6B,GAAwB5iD,IAAOC,IAAV,4BAErBg0F,GAAiCj0F,IAAOC,IAAV,oGAM9Bi0F,GAAwBl0F,IAAOC,IAAV,gGAMrBk0F,GAAiBn0F,IAAOC,IAAV,4VACP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAMvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAM3Bw9C,GAAwBphD,IAAOC,IAAV,mFAKrB6wD,GAAiB9wD,IAAOC,IAAV,yGAMdm0F,GAAuBp0F,IAAOC,IAAV,qGAMpBo0F,GAAcr0F,YAAOokB,KAAPpkB,CAAH,6NAMO,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAGnC,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAIvCoc,GAAOd,IAAOC,IAAV,sNAWJ6pD,GAAa9pD,YAAO+pD,KAAP/pD,CAAH,iEAEH,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0D,kBAGnC0sG,GAAYt0F,IAAOC,IAAV,4RAEF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOnB,SAAA8a,GAAK,OAAKA,EAAM0D,UAAY1D,EAAMI,MAAMpc,OAAOqC,YAG/C,SAAA2Z,GAAK,OACdA,EAAM0D,UAAY1D,EAAMI,MAAMpc,OAAOsC,cAI5C+tG,GAAev0F,YAAOs0F,GAAPt0F,CAAH,mGAKZw0F,GAAkBx0F,YAAOs0F,GAAPt0F,CAAH,yGAKfy0F,GAAgBz0F,YAAO8sC,KAAO7sC,IAAdD,CAAH,8FAQN00F,GAoBR,SAAC,GAgBC,IAfH7qF,EAeE,EAfFA,YACAuvC,EAcE,EAdFA,kBACAvmD,EAaE,EAbFA,WACA+Q,EAYE,EAZFA,SACA+tD,EAWE,EAXFA,SACA92C,EAUE,EAVFA,oBACA85E,EASE,EATFA,2BACAC,EAQE,EARFA,yCACAt2F,EAOE,EAPFA,UACAu2F,EAME,EANFA,0BACAC,EAKE,EALFA,6BACAhjF,EAIE,EAJFA,YACAijF,EAGE,EAHFA,yBACA3B,EAEE,EAFFA,sBACAC,EACE,EADFA,eAEMt8D,EAAoC,CACtClkC,WAAYA,GAAc,GAC1B6V,QAAS,GACT3V,QAAS,GACTJ,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAPjB,EAUEkkB,aAAqBC,GADjB5lC,EATN,EASMA,aAAcg4B,EATpB,EASoBA,cATpB,EAWsBhG,oBAAS,GAX/B,oBAWKC,EAXL,KAWWC,EAXX,KAYIquE,EAAYvsE,iBAAY,MAZ5B,EAasChC,oBAAS,GAb/C,oBAaK6xE,EAbL,KAamBC,EAbnB,OAc0C9xE,oBAAS,GAdnD,oBAcK+xE,EAdL,KAcqBC,EAdrB,KAgBF7xE,qBAAU,WACN6F,EAAc,IACdyrE,EAAyC,MAC1C,CAACzrE,EAAeyrE,IAEnBtxE,qBAAU,WACN6F,EAAct2B,GAAc,MAC7B,CAACA,EAAYs2B,IAEhB7F,qBAAU,WACN81B,EAAkBjoD,KACnB,CAACioD,EAAmBjoD,IAEvB,IAKMikG,EAAiB,SAAC5uB,GAChBA,EAAM,KAAOwuB,EACbC,GAAgB,GACTzuB,GAAO,IAAMwuB,GACpBC,GAAgB,IAIlBI,EAAmB,SAACl6C,GACtB,IAAMm6C,EACFn6C,EAAQo6C,YAAcp6C,EAAQq6C,aAAer6C,EAAQs6C,aAErDH,GAAaJ,EACbC,GAAkB,GACVG,GAAcJ,GACtBC,GAAkB,IAIpBO,EAAsB1lG,uBACxB,SAACyP,GACG,IAAIk2F,EAA6B,GAE7BA,EADA96E,GAAuBA,EAAoBnJ,SAASjS,GACvBob,EAAoB1H,QAC7C,SAAAC,GAAI,OAAIA,IAAS3T,KAGK,uBAClBob,GAAuB,IADL,CAEtBpb,IAIRk1F,GACIA,EAA2BgB,KAEnC,CAAC96E,EAAqB85E,IAGpBiB,EAA0B5lG,uBAAY,WACxC,IAAM2iB,EAASoiF,GACRl6E,GAAuB,IAAIlI,OAC5BmiF,GACAA,EAA6BniF,QAC7BkI,GACAA,EAAoBlI,OACpBkI,EAAoBlI,OAASmiF,EAA6BniF,OAC1DkI,GAAuBA,EAAoBlI,OAC3CkI,EAAoBlI,OACpB,EAEAgiF,IACFA,EAA2B95E,GAAuB,IAC9C/I,GAAe+I,GAAyBlI,GACxCb,EAAY,GAAD,OAEHa,EAAS,EAAT,UACSA,EADT,oCAEM,mCAEV,YAKNkiF,GACFA,MAEL,CACCh6E,EACA85E,EACAG,EACAhjF,EACA+iF,EACAE,IAGE5wC,EAAYn0D,uBACd,SAACq0D,GACG,QACOxpC,KACGwpC,GACFxpC,EAAoBnJ,SAAS2yC,KAC/B0wC,KACID,KACAzwC,GACFywC,EAA6BpjF,SAAS2yC,KAGlD,CACIxpC,EACAi6E,EACAC,IAIFc,EAAsB7lG,uBACxB,SAACq0D,GACG,OACK0wC,KACCD,KACAzwC,GACFywC,EAA6BpjF,SAAS2yC,KAG9C,CAACywC,EAA8BC,IAO7BvB,EAAiB,WACnB7mE,QAAQo7B,UAAUz8B,MAAK,WACnBjI,GAAQ,GACRgwE,GAAe,OAIvB,OACI,cAACllB,GAAA,EAAD,CAAmBngC,YAAawlD,EAAhC,SACI,cAAC7yC,GAAD,CACI/8C,SAAUA,EACV+tD,SAAUA,EACVrzD,UAAWA,EAHf,SAKI,cAAC01F,GAAD,CAAiB7zF,KAAMijB,IAASxf,EAAhC,SACI,cAAC8pE,GAAD,CACIl/B,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfsS,UAAW,EACXD,KAAMsyC,EALV,SAOI,eAACxwC,GAAD,WACI,cAACkO,GAAD,kCACA,eAACsjC,GAAD,WACI,cAACtzF,GAAD,UACI,cAACgpD,GAAD,MAEJ,cAACuqC,GAAD,CACIpqC,aACKpgD,GACEA,IACEA,EAAYqI,MAAMS,OACjB,4BACA,6BAEVjU,OAAQ,OACR8nF,eAAe,OACfC,iBAAiB,OACjB5gF,MAAOhT,EACPizB,aAAc,SAACT,GACXuvE,EACIvvE,EAAEgwB,OAAOxvC,QAGjBjC,SAAUA,EACV8mD,WAAY,WACRkqC,EACI,UAKfI,GACG,cAACT,GAAD,CACInwF,QAAS,WC1arB,IAAC+2C,KD0amCu2C,EAAU3hE,WCxa9DorB,EAAQo6C,WAJE,MD6akB3xF,UAAWoxF,EAFf,SAII,cAAC,KAAD,UACKA,GACG,cAACP,GAAD,CACIjmD,QAAS,CAAEC,MAAO,GAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GAHnB,SAKI,cAACgR,GAAA,EAAD,UAMpB,cAACw0C,GAAD,CACI51F,IAAKqzF,EACLttB,SA9LP,SAAC/+C,GAClB+vE,EAAe/vE,EAAEgwB,OAAOkgD,WACxBF,EAAiBhwE,EAAEgwB,SA0LC,SAIKxrC,IACIA,GAAe,IAAIqI,MACfiB,QACG,SAAAC,GAAI,OACAA,EAAKrhB,SACL+2C,KAAmB11C,UAE1B6N,KAAI,SAAA46C,GAAG,OACJ,eAACq4C,GAAD,WACI,cAACpwE,GAAA,EAAD,CACIzf,KAAM,GACNsG,QAASw5C,EAAUtI,EAAIp8C,IACvBmE,SAAUiyF,EACNh6C,EAAIp8C,IAER4zB,kBACIwiE,EACIh6C,EAAIp8C,IAEFxb,KAAUC,OACLQ,WACLy/D,EAAUtI,EAAIp8C,IACdxb,KAAUC,OACLE,SACLH,KAAUC,OACLC,MAEf4hC,OACI8vE,EACIh6C,EAAIp8C,IAEFxb,KAAUC,OACLO,UACLR,KAAUC,OACLQ,WAEfohC,aAAc,SAACT,GAAD,OACVqwE,EACI75C,EAAIp8C,OAIhB,cAAC00F,GAAD,CACIvwF,SAAUiyF,EACNh6C,EAAIp8C,IAER2E,QAAS,kBACLsxF,EACI75C,EAAIp8C,KANhB,SAUKo8C,EAAIpoD,SA5CeooD,EAAIp8C,SAiDhD,cAAC+0F,GAAD,CACIpwF,QAAS,WClff,IAAC+2C,KDkf+Bu2C,EAAU3hE,WChf5DorB,EAAQo6C,WAVE,MD2fc3xF,UAAWsxF,EAFf,SAII,cAAC,KAAD,UACKA,GACG,cAACT,GAAD,CACIjmD,QAAS,CAAEC,MAAO,GAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GAHnB,SAKI,cAAC+Q,GAAA,EAAD,UAKhB,cAAC4B,GAAD,UACI,cAAC,KAAD,CACI3iD,MAAM,QACNC,OAAO,OACPjE,OAAQ,WACJ+4F,IACAoC,KAEJ1xF,SAAS,cAPb,gCAsFjB4xF,GArDV,SAAC,GAaC,IAZH3xF,EAYE,EAZFA,MACAwtD,EAWE,EAXFA,SACAokC,EAUE,EAVFA,aACAnyF,EASE,EATFA,SACAoyF,EAQE,EARFA,kBACAnB,EAOE,EAPFA,0BACAC,EAME,EANFA,6BACAx2F,EAKE,EALFA,UACA23F,EAIE,EAJFA,gBACAlB,EAGE,EAHFA,yBACA3B,EAEE,EAFFA,sBACAC,EACE,EADFA,eAEMvxF,EAAQw8C,eAERq2C,EACF1+C,eACE2+C,EACF1+C,eAEEkD,EAAoBpD,eACpBkgD,EAA6B5gD,aAAmB8D,GAEhDtnC,EAAcnQ,eAEpB,OACI,cAAC,GAAD,CACIkI,YAAa/H,EAAMq0F,SACnBt7E,oBAAqB/Y,EAAM+Y,oBAC3BhoB,WAAYiP,EAAMjP,WAClB+Q,SAAUA,EACVO,MAAOA,EACPwtD,SAAUA,EACVokC,aAAcA,EACd38C,kBAAmB88C,EACnBvB,2BAA4BA,EAC5BC,yCACIA,EAEJoB,kBAAmBA,EACnBnB,0BAA2BA,EAC3BC,6BAA8BA,EAC9BhjF,YAAaA,EACbxT,UAAWA,EACX23F,gBAAiBA,EACjBlB,yBAA0BA,EAC1B3B,sBAAuBA,EACvBC,eAAgBA,K,mBEjlBf+C,GAGR,SAAC,GAA4B,IAA1BC,EAAyB,EAAzBA,UAAWrmE,EAAc,EAAdA,QACf,OACI,qCACI,cAAC,KAAD,uBACA,eAAC,KAAD,WACI,cAAC,KAAD,wHAIA,eAAC,KAAD,CAAemxB,UAAW,GAA1B,UACI,cAAC,KAAD,CACI1iD,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRnvB,QAAQ,UAJZ,qBAQA,cAAC,KAAD,CACIpC,MAAM,QACNC,OAAO,OACPjE,OAAQ,mBAAQ47F,GAAaA,KAHjC,+BCjBPC,GAIR,SAAC,GAAwC,IAAtCD,EAAqC,EAArCA,UAAWrmE,EAA0B,EAA1BA,QAASumE,EAAiB,EAAjBA,WACxB,OACI,eAAC/oD,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,uBAD1C,UAGI,cAAC,KAAD,CAAajuB,YAAU,2BAAvB,iCACA,eAAC,KAAD,WACI,eAAC,KAAD,CAAmBggD,UAAU,MAAMhgD,YAAU,iCAA7C,yCACgC,eAAC,KAAD,WAAOo1F,EAAP,YADhC,0CAIA,eAAC,KAAD,CAAep1C,UAAW,GAA1B,UACI,cAAC,KAAD,CACI1iD,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRhtB,MAAM,UACNnC,QAAQ,UACRqD,SAAS,4BANb,oBAUA,cAAC,KAAD,UACI,cAAC,KAAD,CACIzF,MAAM,QACNC,OAAO,OACPsE,MAAM,UACNM,YAAarf,KAAUC,OAAOW,OAC9B4V,OAAQ,mBAAQ47F,GAAaA,KAC7BnyF,SAAS,6BANb,iC,mBC4CTsyF,GAjEV,SAAC,GAOC,IANHt+F,EAME,EANFA,MACAg5E,EAKE,EALFA,YACAjH,EAIE,EAJFA,YACAkH,EAGE,EAHFA,gCACAkiB,EAEE,EAFFA,eACAlhF,EACE,EADFA,WACE,EAIEgR,oBAAS,GAJX,oBAEEszE,EAFF,KAGEC,EAHF,KAMIC,EAAqB52D,cACvB,OAAC7nC,QAAD,IAACA,OAAD,EAACA,EAAQ,IAActI,YAGrB0/B,EAAanK,iBAAO,MAiBpByxE,EAAoC,WACtCF,GAA+B,IAWnC,OARApzE,qBAAU,WACgB,KAAb,OAALprB,QAAK,IAALA,OAAA,EAAAA,EAAOya,QACPgkF,EAAmBC,GAEnBF,GAA+B,KAEpC,CAACC,EAAoBz+F,IAEnBu+F,EAKD,cAAC,KAAD,CACIv+F,MAAK,OAAEA,QAAF,IAAEA,IAAS,GAChBg5E,YAAaA,EACbjH,YAAaA,EACbkH,gCAAiCA,EACjC7hD,WAAYA,EACZs+C,OAAQ6oB,EACRzmE,QAnCiC,WACrCrD,QAAQo7B,UAAUz8B,MAAK,WACnBorE,GAA+B,GAC/BrD,GAAe,OAiCfpiB,kBAAgB,EAChB9+D,WAAYA,IAbT,8BCpCToU,GAAYvmB,IAAOC,IAAV,uOAIS,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAO9C0yG,GAAkB72F,YAAO86C,KAAP96C,CAAH,yEAKf4hE,GAAc5hE,IAAOC,IAAV,sDAIX62F,GAA0D,SAAC,GA8D1D,IA7DHtlG,EA6DE,EA7DFA,OACAqY,EA4DE,EA5DFA,YACAjG,EA2DE,EA3DFA,SACA/Q,EA0DE,EA1DFA,WACAkkG,EAyDE,EAzDFA,cACAt8D,EAwDE,EAxDFA,QACA04D,EAuDE,EAvDFA,qBACA6D,EAsDE,EAtDFA,yBACAC,EAqDE,EArDFA,kBACAC,EAoDE,EApDFA,cACAC,EAmDE,EAnDFA,wBACAxpE,EAkDE,EAlDFA,sBACAypE,EAiDE,EAjDFA,oBACAC,EAgDE,EAhDFA,gBACAC,EA+CE,EA/CFA,qBACAt+B,EA8CE,EA9CFA,eACAu+B,EA6CE,EA7CFA,iBACAC,EA4CE,EA5CFA,oBACAC,EA2CE,EA3CFA,2BACAC,EA0CE,EA1CFA,sBACAC,EAyCE,EAzCFA,eACAC,EAwCE,EAxCFA,2BACAC,EAuCE,EAvCFA,kBACAC,EAsCE,EAtCFA,wBACAC,EAqCE,EArCFA,qBACAC,EAoCE,EApCFA,sBACAC,EAmCE,EAnCFA,uCACAC,EAkCE,EAlCFA,4BACAC,EAiCE,EAjCFA,mBACAC,EAgCE,EAhCFA,uBACAC,EA+BE,EA/BFA,mBACAC,EA8BE,EA9BFA,oBACAC,EA6BE,EA7BFA,yBACAC,EA4BE,EA5BFA,kBACAC,EA2BE,EA3BFA,2BACAC,EA0BE,EA1BFA,yBACAC,EAyBE,EAzBFA,eACAC,EAwBE,EAxBFA,qBACAC,EAuBE,EAvBFA,WACAC,EAsBE,EAtBFA,eACAC,EAqBE,EArBFA,oBACAC,EAoBE,EApBFA,mBACAC,EAmBE,EAnBFA,gBACAC,EAkBE,EAlBFA,mBACAC,EAiBE,EAjBFA,yBACAC,EAgBE,EAhBFA,sBACAC,EAeE,EAfFA,oBACAxF,EAcE,EAdFA,cACAC,EAaE,EAbFA,SACAwF,EAYE,EAZFA,kBACAC,GAWE,EAXFA,uBACAC,GAUE,EAVFA,kBACAC,GASE,EATFA,kBACAC,GAQE,EARFA,iBACAC,GAOE,EAPFA,iBACAC,GAME,EANFA,oBACA3vB,GAKE,EALFA,YACA93D,GAIE,EAJFA,WACA+C,GAGE,EAHFA,cACAg8D,GAEE,EAFFA,YACAC,GACE,EADFA,gCAEMp6C,GAAoC,CACtClkC,WAAYA,EACZ6V,QAAS,GACT3V,QAAS,GACTJ,OAAQ,EACR0mD,MAAO,EACPzmC,cAAe,GAEXmmB,GAAwBjC,aAAqBC,IAA7CgC,oBATN,GAW4C5V,oBAAS,GAXrD,sBAWK02E,GAXL,MAWsBC,GAXtB,SAY0D32E,oBAAS,GAZnE,sBAYK42E,GAZL,MAY6BC,GAZ7B,SAaoC72E,oBAAS,GAb7C,sBAaK82E,GAbL,MAakB5G,GAblB,SAiBElwE,qBAjBF,sBAeE+2E,GAfF,MAgBEC,GAhBF,MAmBIC,GAA0B,WAC5BN,IAAmB,IAajBO,GAAqB,SAACloG,GACpB6kG,IACAA,EAAyB7kG,GACzB2nG,IAAmB,KAS3Bx2E,qBAAU,WACFyzE,GAAeh+D,OACpB,CAACg+D,EAAeh+D,GAAqB0B,IAExC,IAAM6/D,GAA2D,CAC7D,CACI7mG,KAAM,WACNoS,MAAOumF,EAAuBmO,UAC9BphF,YAAam/E,GAAuB,GACpCl1E,OAAQk1E,KAAyBF,EACjCx0F,WAAYA,KAAcy0F,EAC1B/2B,aAAa,EACbp9D,SAAU,yBAEd,CACIzQ,KAAM,sBACNoS,MAAOumF,EAAuBoO,iCAC9BrhF,YAAa8+E,GAA0C,GACvD70E,OAAQ60E,EACRr0F,WAAYA,EACZM,SAAU,oCAEd,CACIzQ,KAAMwjG,GAAqB,gBAC3BpxF,MAAOumF,EAAuB/7C,cAC9Bl3B,YAAa2+E,GAA2B,GACxC10E,OAAQ00E,EACRl0F,WACMA,IACDpS,KACEA,KAAYA,EAAO0gB,QAAU1gB,EAAO0gB,MAAMS,UAC3C4mF,GACNr1F,SAAU,8BAEd,CACIzQ,KAAM,cACNoS,MAAOumF,EAAuBqO,oBAC9BthF,YAAa++E,GAA+B,GAC5C90E,OAAQ80E,EACRt0F,WACMA,IACDiG,KACEA,KACGA,EAAYqI,QACbrI,EAAYqI,MAAMS,OAC3BzO,SAAU,4BAEd,CACIzQ,KAAMolG,GAAc,cACpBhzF,MAAOumF,EAAuBsO,MAC9BvhF,YAAa4+E,GAAwB,GACrC30E,OAAQ20E,EACRn0F,WAAY4zF,KAAyB5zF,EACrCM,SAAU,4BAEd,CACIzQ,KAAM,kBACNoS,MAAOumF,EAAuBuO,OAC9BxhF,YAAay/E,GAAwB,GACrCx1E,OAAQw1E,EACRh1F,WAAYA,KAAck1F,EAC1B50F,SAAU,gCAEd,CACIzQ,KAAM,gBACNoS,MAAOumF,EAAuBwO,OAC9BzhF,YAAa6+E,GAAyB,GACtC50E,OAAQ40E,EACRp0F,WAAY0zF,KAA0B1zF,EACtCM,SAAU,8BAEd,CACIzQ,KAAM,iBACNoS,MAAOumF,EAAuByO,eAC9B1hF,YAAao/E,GAA4B,GACzCn1E,OAAQm1E,EACR30F,WAAYA,KAAc+1F,GAC1Bz1F,SAAU,+BAEd,CACIzQ,KAAM,SACNoS,MAAOumF,EAAuB0O,OAC9B3hF,YAAaq/E,GAAqB,GAClCp1E,OAAQo1E,EACR50F,WAAYA,KAAc81F,GAC1Bp4B,aAAa,EACb17C,KACMhiB,GAAc81F,GACV,gDACA3oG,EACVmT,SAAU,uBAEd,CACIzQ,KAAM,wBACNoS,MAAOumF,EAAuB2O,mBAC9B5hF,YAAas/E,GAA8B,GAC3Cr1E,OAAQq1E,EACR70F,WAAYA,EACZ09D,aAAa,EACbp9D,SAAU,sCAEd,CACIzQ,KAAMylG,GAA0C,YAChDrzF,MAAOumF,EAAuB97C,UAC9Bn3B,YAAaggF,GAA4B,GACzC/1E,OAAQ+1E,EACRv1F,WAAYA,KAAcg2F,GAC1B11F,SAAU,0BAEd,CACIzQ,KAAM,UACNoS,MAAOumF,EAAuB57C,QAC9Br3B,YAAa6/E,GAAsB,GACnC51E,OAAQ41E,KAAwBpB,EAChCh0F,WAAYA,KAAc61F,GAC1Bv1F,SAAU,wBAEd,CACIzQ,KAAMwlG,GAAoC,eAC1CpzF,MAAOumF,EAAuB4O,aAC9B7hF,YAAaigF,GAAyB,GACtCh2E,OAAQg2E,EACRx1F,WAAYm1F,KAAyBn1F,EACrCgiB,KAAQmzE,EAAsBO,EAAoB,GAClDh4B,aAAa,EACbp9D,SAAU,uBAEd,CACIzQ,KAAM,UACNoS,MAAOumF,EAAuB77C,QAC9Bp3B,YAAag/E,GAAsB,GACnC/0E,OAAQ+0E,KAAwBV,EAChC7zF,WAAYA,KAAc41F,GAC1Bl4B,aAAa,EACbp9D,SAAU,yBAIZ+2F,GAAgB,SAACp1F,GACnB,OAAQA,GACJ,KAAKumF,EAAuB/7C,cACxB8iD,GAAwBA,IACxB,MACJ,KAAK/G,EAAuBqO,oBACxB,MACJ,KAAKrO,EAAuBsO,MACxBL,IAAsBA,GAAmB34D,IACzC,MACJ,KAAK0qD,EAAuBuO,OACtBhC,GAAkBA,IACpB,MACJ,KAAKvM,EAAuB77C,QACtBknD,GAA8BA,IAChC,MACJ,KAAKrL,EAAuB57C,QACtBonD,GAA8BA,IAChC,MACJ,KAAKxL,EAAuByO,eACtBnD,GAAyBA,IAC3B,MACJ,KAAKtL,EAAuB0O,OACtBnD,GAAkBA,IACpB,MACJ,KAAKvL,EAAuB2O,mBACtBrC,GAA4BA,IAC9B,MACJ,KAAKtM,EAAuB97C,UACtBunD,GAAqBA,IACvB,MACJ,KAAKzL,EAAuB4O,aACtB3B,GAAuBA,IACzB,MACJ,KAAKjN,EAAuBmO,UACtBnC,GAA0BA,IAC5B,MACJ,QACI/E,IAAe,GACf6H,GAAW,QA9NrB,GAmR0B/3E,mBAAwB,MAnRlD,sBAmRK1oB,GAnRL,MAmRa0gG,GAnRb,SAoR4Bh4E,mBAAc,MApR1C,sBAoRKue,GApRL,MAoRcw5D,GApRd,MAsRF,OACI,eAAC30E,GAAD,aACO9rB,IACC,cAAC,GAAD,CACIu1B,QAAS,kBAAMmrE,GAAU,OACzB9E,UAAW,WACP4E,GAAcxgG,IACd0gG,GAAU,OAEd5E,WAAYpkF,IAAc,IAGlC,cAAC,GAAD,CACID,MAAOooF,GACP/vE,SAlEa,SAAC0vB,GACtB,IAAMp0C,EACFo0C,GAASA,EAAM5E,QAAU4E,EAAM5E,OAAOxvC,MAChCo0C,EAAM5E,OAAOxvC,MACb,GACV,GAAKA,EAEL,OAAQA,GACJ,KAAKumF,EAAuB/7C,cACpB7+C,GAAUA,EAAO0gB,OAAS1gB,EAAO0gB,MAAMS,SAChB,OAAvBwkF,QAAuB,IAAvBA,OACA9D,IAAe,GACf8G,GAAkBt0F,IAEtB,MACJ,KAAKumF,EAAuBqO,oBAEpB5wF,GACAA,EAAYqI,OACZrI,EAAYqI,MAAMS,SAElB0gF,IAAe,GACf8G,GAAkBt0F,IAEtB,MACJ,KAAKumF,EAAuBoO,iCACxBnH,IAAe,GACf8G,GAAkBt0F,GAElB,MACJ,KAAKumF,EAAuBsO,MAxO3B92F,GAAa4zF,IACRD,EACFyC,IAA0B,GAE1BF,IAAmB,IAsOnB,MACJ,KAAK1N,EAAuBwO,OACtBvD,GAAmBA,IACrB,MACJ,KAAKjL,EAAuBmO,UACtBnC,GAA0BA,IAC5B,MACJ,QACQnuB,GACAkxB,GAAUt1F,GAEVo1F,GAAcp1F,KAwBlB+tF,YAAaqG,GACbr2F,SAAUA,EACViwF,cAAeA,EACfC,SAAUA,IAEd,cAAC+C,GAAD,CAAiB12F,KAAM85F,GAAvB,SACI,eAACr4B,GAAD,WACKs4B,KACG9N,EAAuB/7C,eACvB,cAAC,GAAD,CACIzsC,SAAUA,EACVuvF,qBAAsB,WAClBA,GAAwBA,KAE5BxlE,sBAAuBA,EACvB0lE,eAAgBA,KAIvB6G,KACG9N,EAAuBqO,qBACvB,cAAC,GAAD,CACI72F,SAAUwzF,EACV/D,eAAgBA,KAIvB6G,KACG9N,EAAuBoO,kCACvB,cAAC,GAAD,CACItiG,MAAOgd,GACPg8D,YAAaA,GACbjH,YAAaA,GACbopB,eAAgBA,GAChBliB,gCACIA,GAEJh/D,WAAYA,UAM3B0nF,IACG,cAACrsD,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACIE,SAAUm+B,EACVl+B,eAAgBA,EAChBF,OAAQ,SAAA3mE,GACA83E,IACAkxB,GAAU/O,EAAuBsO,OACjCQ,GAAW/oG,GACXioG,MAEAC,IAAsBA,GAAmBloG,IAGjD69B,QAASoqE,OAIpBL,IACG,cAACvsD,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAAC,GAAD,CACIinE,UAvUU,WAC1B2D,IAA0B,GAC1BF,IAAmB,IAsUH9pE,QAAS,kBAAMgqE,IAA0B,YAQpDoB,GAA4E,SAAC,GA4DnF,IA3DHx3F,EA2DE,EA3DFA,SACAy3F,EA0DE,EA1DFA,uBACAlE,EAyDE,EAzDFA,wBACAhE,EAwDE,EAxDFA,qBACA6D,EAuDE,EAvDFA,yBACAC,EAsDE,EAtDFA,kBACAqE,EAqDE,EArDFA,qBACAC,EAoDE,EApDFA,cACAC,EAmDE,EAnDFA,oBACApE,EAkDE,EAlDFA,oBACAqE,EAiDE,EAjDFA,uBACApE,EAgDE,EAhDFA,gBACAC,EA+CE,EA/CFA,qBACAt+B,EA8CE,EA9CFA,eACAu+B,EA6CE,EA7CFA,iBACAC,EA4CE,EA5CFA,oBACAC,EA2CE,EA3CFA,2BACAW,EA0CE,EA1CFA,uBACAV,EAyCE,EAzCFA,sBACAC,EAwCE,EAxCFA,eACAgB,EAuCE,EAvCFA,eACAf,EAsCE,EAtCFA,2BACAC,EAqCE,EArCFA,kBACAC,EAoCE,EApCFA,wBACAC,EAmCE,EAnCFA,qBACAC,EAkCE,EAlCFA,sBACAC,EAiCE,EAjCFA,uCACAC,EAgCE,EAhCFA,4BACAC,EA+BE,EA/BFA,mBACAI,EA8BE,EA9BFA,yBACAC,EA6BE,EA7BFA,kBACAC,EA4BE,EA5BFA,2BACAU,EA2BE,EA3BFA,yBACAT,EA0BE,EA1BFA,yBACAE,EAyBE,EAzBFA,qBACAI,EAwBE,EAxBFA,mBACAH,EAuBE,EAvBFA,WACAC,EAsBE,EAtBFA,eACAC,EAqBE,EArBFA,oBACAE,EAoBE,EApBFA,gBACAG,EAmBE,EAnBFA,sBACAC,EAkBE,EAlBFA,oBACAxF,EAiBE,EAjBFA,cACAC,EAgBE,EAhBFA,SACAoF,EAeE,EAfFA,mBACAI,EAcE,EAdFA,kBACAC,EAaE,EAbFA,uBACAC,EAYE,EAZFA,kBACAnB,EAWE,EAXFA,mBACAoB,EAUE,EAVFA,kBACAC,EASE,EATFA,iBACAC,EAQE,EARFA,iBACAC,GAOE,EAPFA,oBACA3vB,GAME,EANFA,YACAquB,GAKE,EALFA,oBACAnmF,GAIE,EAJFA,WACA+C,GAGE,EAHFA,cACAg8D,GAEE,EAFFA,YACAC,GACE,EADFA,gCAEMrvE,GAAQ6oB,eACRhX,GAAaT,eAAyB/gB,KACtCupG,GAAep9C,eACfq9C,GAAoB9oE,eACpBkkE,GAAgBhkE,eAChB0H,GAAUnhB,aAAYkhB,MACtB5yB,GAAU0R,aAAY3R,MACtBgmB,GAAwBD,eAE9B,OACI,cAAC,GAAD,CACIl8B,OAAQmiB,GACR9J,YAAa6xF,GAAavF,SAC1BY,cAAeA,GAAc5kG,KAC7ByR,SAAUA,EACV/Q,WAAY8oG,GAAkB9oG,WAC9BwoG,uBAAwBA,EACxB5gE,QAASA,GACT08D,wBAAyBA,EACzBhE,qBAAsBA,EACtB+D,cACMtvF,GAAF,UAAeA,GAAQ+2B,UAAvB,YAAoC/2B,GAAQi3B,UAAa,GAE7Dm4D,yBAA0BA,EAC1BC,kBAAmBA,EACnBqE,qBAAsBA,EACtBC,cAAeA,EACfC,oBAAqBA,EACrB7tE,sBAAuBA,GACvBypE,oBAAqBA,EACrBqE,uBAAwBA,EACxBpE,gBAAiBA,EACjBC,qBAAsBA,EACtBt+B,eAAgBA,EAChBu+B,iBAAkBA,EAClBC,oBAAqBA,EACrBC,2BAA4BA,EAC5BW,uBAAwBA,EACxBO,eAAgBA,EAChBf,2BAA4BA,EAC5BC,kBAAmBA,EACnBC,wBAAyBA,EACzBC,qBAAsBA,EACtBC,sBAAuBA,EACvBC,uCAAwCA,EACxCC,4BAA6BA,EAC7BC,mBAAoBA,EACpBgB,yBAA0BA,EAC1BZ,yBAA0BA,EAC1BD,oBAAqBA,GACrBE,kBAAmBA,EACnBd,sBAAuBA,EACvBC,eAAgBA,EAChBc,2BAA4BA,EAC5BC,yBAA0BA,EAC1BE,qBAAsBA,EACtBC,WAAYA,EACZC,eAAgBA,EAChBE,mBAAoBA,EACpB5jF,eAAgBtT,GAAMsT,eACtB2jF,oBAAqBA,EACrBE,gBAAiBA,EACjBI,oBAAqBA,EACrBD,sBAAuBA,EACvBvF,cAAeA,EACfC,SAAUA,EACVoF,mBAAoBA,EACpBI,kBAAmBA,EACnBC,uBAAwBA,EACxBC,kBAAmBA,EACnBnB,mBAAoBA,EACpBoB,kBAAmBA,EACnBC,iBAAkBA,EAClBC,iBAAkBA,EAClBC,oBAAqBA,GACrB3vB,YAAaA,GACb93D,WAAYA,GACZ+C,cAAeA,GACfg8D,YAAaA,GACbC,gCAAiCA,M,UCxf9ByqB,GA3GyBl7F,gBAAK,SAAAR,GAAU,IAAD,EAE9C6tC,EASA7tC,EATA6tC,cACA8tD,EAQA37F,EARA27F,6BACAC,EAOA57F,EAPA47F,oBACAC,EAMA77F,EANA67F,mBACAC,EAKA97F,EALA87F,cACAC,EAIA/7F,EAJA+7F,sBACAC,EAGAh8F,EAHAg8F,cACAniC,EAEA75D,EAFA65D,UACAoiC,EACAj8F,EADAi8F,kBAV8C,EAkB9CpuD,GAAiB,GAJjBquD,EAd8C,EAc9CA,cACAC,EAf8C,EAe9CA,iBACAC,EAhB8C,EAgB9CA,wBACAC,EAjB8C,EAiB9CA,yBAjB8C,EA2B9CR,GAAsB,GANtB7xC,EArB8C,EAqB9CA,aACAsyC,EAtB8C,EAsB9CA,eACAC,EAvB8C,EAuB9CA,sBACAn+F,EAxB8C,EAwB9CA,UAxB8C,IAyB9C4F,gBAzB8C,MAyBnC,qBAzBmC,MA0B9C+lD,mBA1B8C,WA0BhCl5D,EA1BgC,KA6BVirG,GAAiB,IAAjDU,uBA7B0C,WA6BxB3rG,EA7BwB,KA8BPkrG,GAAyB,IAA5DU,0BA9B0C,WA8BrB5rG,EA9BqB,EAgClD,OACI,cAAC64D,GAAD,CAAMtrD,UAAW89F,EAAjB,SACI,eAACjtE,GAAD,CAAS7wB,UAAW+9F,EAApB,UACI,eAACtJ,GAAD,CAAgBz0F,UAAWg+F,EAA3B,UACKT,GAAgCC,GAC7B,cAAChyB,GAAA,EAAD,CACIG,YAAa6xB,EAAoB7xB,YACjCF,eAAc,iBACV+xB,QADU,IACVA,OADU,EACVA,EAAqB/xB,sBADX,QAC6B,EAE3C53D,WAAY2pF,EAAoB3pF,WAChC2nD,aAAcgiC,EAAoBhiC,aAClCkQ,gBACI8xB,EAAoBc,iBAExBr0E,YAAauzE,EAAoBvzE,YACjC5kB,MAAK,OAAEm4F,QAAF,IAAEA,OAAF,EAAEA,EAAqBn4F,MAC5BO,SAAS,QAZb,UAcwB,OAAnB43F,QAAmB,IAAnBA,OAAA,EAAAA,EAAqBe,oBAClB,cAAC,KAAD,CAAep+F,MAAO,IAAKggE,YAAa,GAAxC,SACI,cAAC,GAAD,eACQq9B,EAAoBe,wBAM3Cd,GACG,cAAC,KAAD,CACIt9F,MAAO,IACPggE,YAAa,GACbngE,UAAWA,EAHf,SAKI,cAAC,KAAD,CACI4rD,aAAcA,EACdD,YAAaA,EACb1/B,SAAUiyE,EACV54F,SAAU64F,EACVv4F,SAAUA,OAIpBk/B,kBAAQ44D,IACN,cAAC,KAAD,CAAev9B,YAAa,GAA5B,SACKi+B,KAGPt5D,kBAAQ64D,IACN,cAAC,KAAD,CAAex9B,YAAa,GAA5B,SACI,cAACiJ,GAAA,EAAD,eACSi1B,SAKrB,eAAC3J,GAAD,CAAiB10F,UAAWi+F,EAA5B,UACKL,GACG,cAAC,KAAD,UACI,cAAC,GAAD,eAAYA,MAGnBniC,GACG,cAAC,KAAD,UACI,cAACk5B,GAAD,CAAW9xF,YAAA,OAAWg7F,QAAX,IAAWA,IAAqB,sBAA3C,SACKpiC,iBCvG3B+iC,GAAmB,SAAC58F,GAA8B,IAEhDosF,EAkBApsF,EAlBAosF,YACAyQ,EAiBA78F,EAjBA68F,sBACA5L,EAgBAjxF,EAhBAixF,wBACAC,EAeAlxF,EAfAkxF,oBACA4L,EAcA98F,EAdA88F,kBACAC,EAaA/8F,EAbA+8F,SACAC,EAYAh9F,EAZAg9F,uBACAC,EAWAj9F,EAXAi9F,2BACA9L,EAUAnxF,EAVAmxF,8BACAzoF,EASA1I,EATA0I,eAX+C,EAoB/C1I,EARAk9F,4BAZ+C,MAYxB,MAZwB,EAa/C94B,EAOApkE,EAPAokE,cACA+4B,EAMAn9F,EANAm9F,eACAlrG,EAKA+N,EALA/N,KACAs+F,EAIAvwF,EAJAuwF,YACAiB,EAGAxxF,EAHAwxF,UACAD,EAEAvxF,EAFAuxF,sBAlB+C,EAoB/CvxF,EADA0xF,gBAnB+C,MAmBpC/yB,IAAcgzB,OAnBsB,EAsBnD,OACI,cAAC,IAAD,UACI,eAAC,IAAD,CAAgBvzF,UAAWy+F,EAA3B,UACKI,GACG,cAAC,KAAD,2BACQA,GADR,IAEI32B,IACKpjC,kBAAQx6B,IACgB,QAAzBw0F,OAEMrsG,GADC,MAKlB6X,GAA2C,QAAzBw0F,GACf,cAAC,KAAD,CACIx0F,eAAgBA,EAChB07D,cAAeA,IAGvB,cAAC,GAAD,eAAgB04B,IAEhB,cAAC,KAAD,CAAcpsE,KAAMssE,IAEnBt0F,GAA2C,WAAzBw0F,GACf,cAAC,KAAD,CACIx0F,eAAgBA,EAChB07D,cAAeA,IAIvB,cAAC,IAAD,UACI,cAAC,GAAD,CACInyE,KAAMA,EACNs+F,YAAaA,EACbwM,SAAUA,EACV3Q,YAAaA,EACb6E,wBAAyBA,EACzBC,oBAAqBA,EACrBC,8BACIA,EAEJC,cAAe+L,EACf3L,UAAWA,EACXD,sBAAuBA,EACvBG,SAAUA,YAQnBlxF,mBAAKo8F,K,iCCvFRQ,E,kGAAAA,K,2EAAAA,E,iFAAAA,E,yDAAAA,M,yECICnwB,EAAYC,aAAW,SAAA9sE,GAAK,MAAK,CAC1Ci9F,oBAAqB,CACjBpwD,aAAc,kBAEd,4BAA6B,CACzBgU,UAAW,SAInBq8C,kBAAmB,CACfC,WAAY,wBACZvwB,OAAQ,iBACRwwB,IAAK,MACLC,WAAY,QAGhBC,kBAAmB,CACf56F,MAAO,sBACP66F,eAAgB,OAChBjqE,WAAY,OAIPkqE,EAAoB99F,IAAOC,IAAV,iGAMjB89F,EAAY/9F,IAAOC,IAAV,iFAIT+9F,EAAYh+F,IAAOC,IAAV,gFAKTutE,EAAcxtE,IAAOC,IAAV,iRAaXg+F,EAAgBj+F,IAAOC,IAAV,8CAIbi+F,EAAkBl+F,IAAOC,IAAV,iMAOH,SAAAC,GAAK,OAChBA,EAAMitC,aAAejtC,EAAMitC,aAAe,UAI3CgxD,EAAcn+F,YAAOo+F,IAAPp+F,CAAH,0CAIXu8B,EAAUv8B,IAAOC,IAAV,sI,gBCvEPo+F,EAAiBphD,WAAaqhD,MAAM,CAC7C7tG,SAAU8tG,IAAW9tG,SACrB+sD,gBAAiB+gD,IAAW/gD,kB,iBCCnBghD,EAAyB,SAClCp/F,GAEA,IAAKA,EAAQ,OAAO,EAEpB,IAAM2R,EAAOsrB,OAAOtrB,KAAK3R,GACnBq/F,EAAkBr/F,EACxB,OAAO2R,EAAKoC,QAAO,SAAA+d,GAAG,OAAIutE,EAAWvtE,MAAMve,OAAS5B,EAAK4B,Q,eC8J9C+rF,MAtJf,SAA0Bx+F,GAA2B,IAAD,QAE5Cy+F,EAMAz+F,EANAy+F,QACAjjD,EAKAx7C,EALAw7C,SACAkjD,EAIA1+F,EAJA0+F,gBACAC,EAGA3+F,EAHA2+F,aACAC,EAEA5+F,EAFA4+F,gBACAC,EACA7+F,EADA6+F,kBAGE/wB,EAAUb,IAEhB,OACI,eAAC6xB,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAKQ,YAAY,EAA1E,UACI,cAACoqD,EAAA,cAAD,CACIL,gBAAiBA,EACjBM,YAAW,OAAExjD,QAAF,IAAEA,GAAF,UAAEA,EAAU/c,iBAAZ,aAAE,EAAqBwN,OAAO,GAAGC,cAC5C9tC,UAAW0vE,EAAQuvB,oBACnBr5F,SAAS,gBAEb,eAAC45F,EAAD,WACI,cAACC,EAAD,CAAW58F,YAAU,YAArB,oCACQu6C,QADR,IACQA,OADR,EACQA,EAAU/c,iBADlB,QAC+B,GAD/B,6BACqC+c,QADrC,IACqCA,OADrC,EACqCA,EAAU7c,gBAD/C,QAC2D,MAE3D,cAACm/D,EAAD,CAAW78F,YAAU,aAArB,0BAAmCu6C,QAAnC,IAAmCA,OAAnC,EAAmCA,EAAUnrD,aAA7C,QAAsD,KACtD,cAACgsC,EAAD,OAGJ,cAACixC,EAAD,CAAarsE,YAAU,qBAAvB,+BACA,cAAC88F,EAAD,UACI,cAAC,IAAD,CACI5/F,IAAKsgG,EACLQ,cAAe,CACX1uG,SAAU,GACV+sD,gBAAiB,IAErB4hD,oBAAoB,EACpBC,SAAUR,EACVS,iBAAkBjB,EARtB,SAUK,gBAAGj/F,EAAH,EAAGA,OAAQmgG,EAAX,EAAWA,aAAX,OACG,eAAC,IAAD,WACI,eAACrB,EAAD,WACI,cAACC,EAAD,CACInjG,KAAK,oBACLuwD,aAAa,eACbgkC,UAAWpkC,IACX13D,KAAK,WACLgQ,MAAM,WACNgiB,WAAW,YACX9iB,SAAS,OACT+jF,cAAc,OACdhoF,OAAO,OACP26D,gBAAiB,IACjB/6D,UAAU,cACVqtD,aAAa,QACbC,WAAW,qBACXhmC,KFtEJ,2CEuEImmC,WAAS,EACT+5B,uBAAqB,EACrB5hF,SAAS,aAEb,cAACi6F,EAAD,CACInjG,KAAK,oBACLuwD,aAAa,eACbgkC,UAAWpkC,IACX13D,KAAK,kBACLgQ,MAAM,mBACNgiB,WAAW,YACX9iB,SAAS,OACT+jF,cAAc,OACdhoF,OAAO,OACP26D,gBAAiB,IACjB/6D,UAAU,cACVqtD,aAAa,YACbC,WAAW,qBACXk6B,uBAAqB,EACrB5hF,SAAS,wBAIjB,cAAC4f,EAAA,EAAD,CACIxlB,UAAW0vE,EAAQwvB,kBACnB7yF,QAASm0F,EACTh5E,aAAci5E,EACd3mF,WAAW,cACX3U,MACI,0EAEI,mBACIy9B,KAAK,oDACLmU,OAAO,SACPmqD,IAAI,aACJlhG,UACI0vE,EAAQ4vB,kBALhB,4BAFJ,IAYI,mBACI18D,KAAK,kDACLmU,OAAO,SACPmqD,IAAI,aACJlhG,UACI0vE,EAAQ4vB,kBALhB,0BAZJ,QAsBI,mBACI18D,KAAK,sDACLmU,OAAO,SACPmqD,IAAI,aACJlhG,UACI0vE,EAAQ4vB,kBALhB,kCAYRv5F,KAAM,GACNH,SAAS,iBACT8vB,UAAU,qBAGd,cAACxwB,EAAA,EAAD,CACIxI,KAAK,SACLyD,MAAM,OACNC,OAAO,OACP2E,YAAY,OACZV,SAAU,GACVgB,MAAO,CAAEw9C,UAAW,QACpBv9C,SACI46F,EAAuBp/F,KACtB0/F,EAEL/6F,QAASw7F,EACTr7F,SAAS,kBAZb,kC,mECrHtB6tF,GAAKhyE,EAAQ,IAEnB,SAAS0/E,KACL,IAAM7nF,EAAUW,cACVT,EAAWC,cAFa,EAGEoL,mBAA8B,MAHhC,mBAGvBu4B,EAHuB,KAGbgkD,EAHa,OAIUv8E,mBAAsB,MAJhC,mBAIvBw8E,EAJuB,KAITf,EAJS,OAKgBz7E,oBAAS,GALzB,mBAKvB27E,EALuB,KAKNc,EALM,KAQxB9qD,EADmBC,cACSt2C,MAAQxa,IAAU2E,YAAYE,MAEhEwgD,YAAiB,qBAGjB,IAAMq1D,EAAUx5E,iBAAO,MACjB06E,EAAuBtkC,cACvBukC,EAAqB3jC,cACrB4jC,EAAmBjgC,cACnBhuD,EAAcnQ,cACd49D,EAA8BC,cAC9BwgC,EAAW5vG,eACX6vG,EAAWpkC,cAOXqkC,EAAoBlwG,uBACtB,SAAC4P,GACG,GAAmB,MAAfA,EAAMrG,KACNuY,EAAYwrF,EAAc6C,uBAAwB,cAC/C,GAAmB,MAAfvgG,EAAMrG,KACbuY,EAAYwrF,EAAc8C,qBAAsB,cAC7C,GAAmB,MAAfxgG,EAAMrG,MAAgBqG,EAAMglC,QAAS,CAC5C,IAAMA,EAAUhlC,EAAMglC,QAKlBhkC,EAAU,GAEVA,EANegkC,EAAQrG,MACvB,SAACnrB,GAAD,MAA8B,UAAfA,EAAKpgB,SAKVsqG,EAAc+C,mBAEdz7D,EAAQ,GAAGhkC,QAGzBkR,EAAYlR,EAAS,cAErBkR,EAAYlS,EAAMgB,QAAS,WAGnC,CAACkR,IAOCwuF,EAA6BtwG,sBAAW,uCAC1C,WAAOX,GAAP,SAAA4iB,EAAA,sDACQ0tF,GACAI,EAAiB1wG,EAAQswG,GAFjC,2CAD0C,sDAM1C,CAACI,EAAkBJ,IAQjBd,EAAe7uG,uBACjB,SACIoP,EACAmhG,GACE,IAAD,EACOC,EAAkBD,EAAlBC,cAEFC,EAAiB,CACnB9hE,WAAmB,OAAR+c,QAAQ,IAARA,OAAA,EAAAA,EAAU/c,YAAa,GAClCE,UAAkB,OAAR6c,QAAQ,IAARA,OAAA,EAAAA,EAAU7c,WAAY,GAChCtuC,OAAe,OAARmrD,QAAQ,IAARA,OAAA,EAAAA,EAAUnrD,QAAS,GAC1BE,SAAU2O,EAAO3O,SACjB8I,KAAI,UAAEw4F,GAAGngE,MAAM9Z,EAAShjB,QAAQpE,aAA5B,QAAqC,GACzC2I,YAAa,MAGjB2mG,EAASS,GACJn1E,MAAK,SAACgT,GACHrC,IAAQ4f,IAAI,aAAcvd,EAAS5tC,OACnC4vG,EAA2BhiE,EAAS7lC,KAAKgH,IACzC,IAAM5C,EAAasJ,YAAam4B,EAAS7lC,KAAKzE,KAAKP,MAC7CgF,EAAO4jC,OAAOo4B,OAAO,CAAE53D,cAAcyhC,EAAS7lC,MACpD8mE,EAA4B,CACxB9mE,OACAioG,WAAW,OAGlBl1E,OAAM,SAAC5rB,GACJ4gG,GAAc,GACdN,EAAkBtgG,QAG9B,CACI0gG,EACAxoF,EACA4jC,EACAwkD,EACA3gC,EACAygC,IAQFjB,EAAoB/uG,uBAAY,WAClC4vG,GAAmB,SAAAe,GAAI,OAAKA,OAC7B,IAMGC,EAAwC5wG,uBAAY,WACtD4nB,EAAQH,KAAKluB,IAAOE,WAAWe,kBAChC,CAACotB,IA0CJ,OAxCA0L,qBAAU,WAAO,IAAD,EACNu9E,EAAe,UAAG9O,GAAGngE,MAAM9Z,EAAShjB,QAAQpE,aAA7B,QAAsC,KAEtDmwG,GACDD,IAGJl8D,cAEAu7D,EAAS,CAAE3zF,WAAYu0F,IAClBv1E,MAAK,SAACgT,GACH,IAAMoC,EAAMpC,EAASoC,IACjBA,EACAC,OAAO7oB,SAASopB,KAAO48B,aAAqBp9B,EAAK,eAAgBC,OAAO7oB,SAASomD,OAAhB,mBAEjE2hC,EACIgB,EACAD,GACFt1E,MAAK,SAAAgT,GACCA,GACAohE,EAAYphE,SAIzB9S,OAAM,WACTo1E,SAEL,CACCA,EACAf,EACA/nF,EAAShjB,SAGbwuB,qBAAU,WACN,OAAO,WACHw8E,OAGL,IAGC,cAAC,EAAD,CACInB,QAASA,EACT7pD,SAAUA,EACV4G,SAAUA,EACVkjD,gBAAiBA,EACjBC,aAAcA,EACdC,gBAAiBA,EACjBC,kBAAmBA,IAKhBr+F,mBAAK++F,K,yFClLLqB,EAlCO1iG,sBAClB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLf,UAAWA,EACXK,MAAM,6BAPV,UASI,mBAAG4wD,YAAU,mBAAb,SACI,sBACIC,YAAU,UACVC,YAAU,UACVlwD,EAAE,2jBACFF,KAAK,WAGb,+BACI,0BAAUI,GAAG,aAAb,SACI,sBACIJ,KAAK,OACL8zB,UAAU,uBACV5zB,EAAE,gC,+BC3BjBgnB,EAAYvmB,IAAOC,IAAV,uJAQT8gG,EAAuB/gG,IAAOC,IAAV,yfAWT,gBAAGqE,EAAH,EAAGA,IAAH,OAAcA,EAAG,eAAW08F,UAAU18F,GAArB,YASnC,gBAAG28F,EAAH,EAAGA,WAAY38F,EAAf,EAAeA,IAAf,OAA0B28F,GAAU,iPAQlB38F,EAAG,YARe,yHAe7B48F,EAAiBlhG,IAAOC,IAAV,iXAgBrB,qBAAGghG,YAA4B,mKASxBE,EAAiBnhG,IAAOC,IAAV,+YAiBdmhG,EAAmBphG,IAAOC,IAAV,qDCpBdohG,MAvDf,SAA2BnhG,GAAgC,IAEnDohG,EAWAphG,EAXAohG,aACAC,EAUArhG,EAVAqhG,aACAjjG,EASA4B,EATA5B,UACA4gG,EAQAh/F,EARAg/F,YACAsC,EAOAthG,EAPAshG,YACAC,EAMAvhG,EANAuhG,kBACAC,EAKAxhG,EALAwhG,iBACAC,EAIAzhG,EAJAyhG,aACAz9F,EAGAhE,EAHAgE,SACA09F,EAEA1hG,EAFA0hG,aACAX,EACA/gG,EADA+gG,WAEEY,EAAWL,GAAeF,EAEhC,OACI,eAAC/6E,EAAD,CACIjoB,UAAWA,EACX8F,QAAS,+BAAMm9F,QAAN,IAAMA,GAAN,UAAMA,EAAcxxE,eAApB,aAAM,EAAuBuR,SACtCngC,YAAW+C,GAAQ,UAAOA,EAAP,cAHvB,UAKI,uBACIzE,GAAG,UACHzE,KAAK,OACLqD,IAAKkjG,EACL59F,MAAO,CAAEm+F,QAAS,QAClBC,OAAO,mCACPx3E,SAAUk3E,EACVr9F,QAASs9F,EACTvgG,YAAW+C,GAAQ,UAAOA,EAAP,YAEvB,eAAC68F,EAAD,CAAsBz8F,KAAMq9F,GAAgBE,EAAU1gG,YAAW+C,GAAQ,UAAOA,EAAP,UAAyB+8F,WAAYA,EAA9G,WACMY,IAAaF,GAAgBzC,EAC9ByC,GACG,cAACP,EAAD,UACI,cAAC,IAAD,CAAS/8F,KAAM,UAI1B48F,GAAcY,EACX,cAACV,EAAD,CAAgBhgG,YAAW+C,GAAQ,UAAOA,EAAP,WAA0BE,QAAS,SAACihB,GACnEA,EAAEC,kBACFs8E,GAAgBA,KAFpB,SAII,cAACl4B,EAAA,EAAD,MAEJ,cAACw3B,EAAD,CAAgB//F,YAAW+C,GAAQ,UAAOA,EAAP,WAA0B+8F,WAAYA,EAAzE,SACK,cAAC,EAAD,U,iBCvDfe,EAAOjiF,EAAQ,KAsCRkiF,EAAsB,uCAAG,WAClCC,GADkC,uBAAAjwF,EAAA,yDAG5BkwF,EAH4B,OAGlBD,QAHkB,IAGlBA,GAHkB,UAGlBA,EAAgBnyE,eAHE,iBAGlB,EAAyBqyE,kBAHP,aAGlB,EAAqCC,YAHnB,yCAKb,MALa,uBAObC,MAAMH,GAPO,cAO5BjjG,EAP4B,gBAQfA,EAAOshE,OARQ,cAQ5BA,EAR4B,yBAU3B,CACH9/B,IAAKE,IAAIC,gBAAgB2/B,GACzBN,KAAM,IAAIqiC,KAAK,CAAC/hC,GAAV,eAAyBwhC,IAAzB,QAAuC,CAAEhnG,KAAM,gBAZvB,4CAAH,sDClC5BwnG,EAA0B,SAAC,GAUI,IATlClB,EASiC,EATjCA,aACA1C,EAQiC,EARjCA,gBACAM,EAOiC,EAPjCA,YACA5gG,EAMiC,EANjCA,UACA4F,EAKiC,EALjCA,SACAu+F,EAIiC,EAJjCA,aACAb,EAGiC,EAHjCA,aACAX,EAEiC,EAFjCA,WACAU,EACiC,EADjCA,aAEMJ,EAAep8E,iBAAyB,MACxC+8E,EAAiB/8E,iBAA4B,MAE7Cu9E,EDXmB,SAACD,GAC1B,IAAM3wF,EAAcnQ,cAEpB,OAAO3R,uBACH,SAACiqD,GAAgD,IAAD,IAC5CA,EAAMwQ,UACN,IAAIyV,EAAI,OAAGjmB,QAAH,IAAGA,GAAH,UAAGA,EAAO5E,cAAV,iBAAG,EAAestD,aAAlB,aAAG,EAAuB,GAElC,QAAKziC,IACA,CAAC,aAAc,YAAa,aAAaxuD,SAASwuD,EAAKllE,MAIxDklE,EAAK77D,MAAQo+F,GACb3wF,EAAY,yCAAD,QAA2C2wF,EAAa,SAASn8C,UAAjE,OAAiF,UACrF,KACC4Z,EAAKllE,KAAK0W,SAAS,WAC3BI,EAAY,wBAAyB,UAC9B,IARPA,EAAY,iCAAkC,UACvC,MAYf,CAACA,EAAa2wF,ICZCG,CAAcH,GCvBF,UDmBE,EAMuBt/E,oBACpD,GAP6B,mBAM1B0/E,EAN0B,KAMJC,EANI,OAUS3/E,mBAAsB,MAV/B,mBAU1B4/E,EAV0B,KAUXC,EAVW,OAWK7/E,mBAAwB,MAX7B,mBAW1Bq+E,EAX0B,KAWbyB,EAXa,KAiB3BC,EAAgB,uCAAG,4BAAAjxF,EAAA,0DACjBiwF,EADiB,gCAEiBD,EAC9BC,GAHa,QAEXiB,EAFW,SAObx2E,QAAQo7B,UAAUz8B,MAAK,WACnB23E,EAAc,OAACE,QAAD,IAACA,OAAD,EAACA,EAAqBziE,KACrB,OAAfk+D,QAAe,IAAfA,KAAe,OAAGuE,QAAH,IAAGA,OAAH,EAAGA,EAAqBjjC,MACvCkjC,OAVS,2CAAH,qDAyBhBA,EAAyB,WAC3BN,GAAwB,IAmC5B,OACI,qCACI,cAAC,EAAD,CACIxB,aAAcA,EACdC,aAAcA,EACdrC,YAAaA,EACb5gG,UAAWA,EACXkjG,YAAaA,EACbC,kBApCkB,SAC1BxnD,GAEuByoD,EAAWzoD,IAG9BttB,QAAQo7B,UAAUz8B,MAAK,WAAO,IAAD,KACzB,OAAI2uB,QAAJ,IAAIA,GAAJ,UAAIA,EAAO5E,cAAX,iBAAI,EAAestD,aAAnB,aAAI,EAAuB,MACvBK,EAAiB/oD,EAAM5E,OAAOstD,MAAM,IACpCG,GAAwB,QA4B5BpB,iBAhBa,SACrBznD,GACQ,IAAD,GACiBA,GAAS,IAAzB5E,aADD,MACU,GADV,GAEsBxvC,MAAQ,IAa7B87F,aAAcA,EACdz9F,SAAUA,EACV09F,aAzDa,WACrBqB,EAAe,MACfrB,GAAgBA,KAwDRX,WAAYA,IAEf4B,GAAwBE,GACrB,cAACM,EAAA,YAAD,CACIC,UAAWpB,EACXa,cAAeA,EACf7gG,YAAakhG,EACbG,uBAAwBL,EACxBjC,WAAYA,QAOjBvgG,mBAAK8hG,I,sHE1HPh1B,EAAcxtE,IAAOC,IAAV,iRAaXswD,EAAUvwD,IAAOC,IAAV,yOAePi+F,EAAkBl+F,IAAOC,IAAV,iMAOH,SAAAC,GAAK,OAChBA,EAAMitC,aAAejtC,EAAMitC,aAAe,UAI3CgxD,EAAcn+F,YAAOo+F,IAAPp+F,CAAH,0CCpCXw+F,EAAyB,SAACp/F,GACnC,IAAKA,EAAQ,OAAO,EAEpB,IAAM2R,EAAOsrB,OAAOtrB,KAAK3R,GACnBq/F,EAAkBr/F,EACxB,OAAO2R,EAAKoC,QAAO,SAAA+d,GAAG,OAAIutE,EAAWvtE,MAAMve,OAAS5B,EAAK4B,Q,gBCRhD0rF,EAAiBphD,WAAaqhD,MAAM,CAC7C7/D,eAAgB8/D,IAAW9/D,eAAe2e,SACtC,iC,OCiEOomD,MAxDf,SAAsBtjG,GAA2B,IAAD,EACpCy+F,EAAgCz+F,EAAhCy+F,QAASlmG,EAAuByH,EAAvBzH,KAAMomG,EAAiB3+F,EAAjB2+F,aAEvB,OACI,cAACG,EAAA,EAAD,UACI,eAACzuC,EAAD,WACI,cAACid,EAAD,yCACA,cAAC,IAAD,CACInvE,IAAKsgG,EACLQ,cAAe,CACX1gE,eAAc,iBAAEhmC,QAAF,IAAEA,OAAF,EAAEA,EAAMgmC,sBAAR,QAA0B,IAE5C2gE,oBAAoB,EACpBC,SAAUR,EACVS,iBAAkBjB,EAPtB,SASK,gBAAGj/F,EAAH,EAAGA,OAAQmgG,EAAX,EAAWA,aAAX,OACG,eAAC,IAAD,WACI,cAACrB,EAAD,UACI,cAACC,EAAD,CACInjG,KAAK,OACL4I,YAAW,OAACnL,QAAD,IAACA,OAAD,EAACA,EAAMgmC,gBAClB8wD,UAAWpkC,IACX13D,KAAK,iBACLgQ,MAAM,cACNgiB,WAAW,YACX9iB,SAAS,OACT+jF,cAAc,OACdhoF,OAAO,OACP26D,gBAAiB,IACjB1N,aAAa,QACbC,WAAW,qBACXttD,UAAU,cACVwnF,uBAAqB,MAG7B,cAACtiF,EAAA,EAAD,CACIxI,KAAK,SACLyD,MAAM,OACNC,OAAO,OACP2E,YAAY,OACZV,SAAU,GACVgB,MAAO,CAAEw9C,UAAW,QACpBv9C,SAAU46F,EAAuBp/F,GACjC2E,QAASw7F,EARb,kC,wBCrCtBxN,EAAKhyE,EAAQ,IAEnB,SAAS0jF,IACL,IAAM9E,EAAUx5E,iBAAO,MACjBvN,EAAUW,cACVT,EAAWC,cAEXtf,EAAgC6gB,YAAY3R,KAC5Ck4F,EAAuBtkC,cAE7BjyB,YAAiB,8BASjB,IAYMu1D,EAAe7uG,uBACjB,SACIoP,EACAmhG,GACE,IACM9hE,EAAmBr/B,EAAnBq/B,eACA+hE,EAAiCD,EAAjCC,cAAekD,EAAkBnD,EAAlBmD,cAEnBjlE,IACAohE,EAAqBphE,GAAgB,SAAAklE,GAAY,OArBvB,SAClCD,EACAC,GAEAA,GAAgBD,EAAc,iBAAkBC,GAkBpCC,CAA8BF,EAAeC,MAC/Cr4E,MAAK,SAAAgT,GACCA,GACA1mB,EAAQH,KAAR,UACOluB,IAAOE,WAAWW,aADzB,kBAC+Cq0C,OAKvD+hE,GAAc,MAGtB,CAACX,EAAsBjoF,IAOrBgpF,EAAwC5wG,uBAAY,WACtD4nB,EAAQH,KAAKluB,IAAOE,WAAWe,kBAChC,CAACotB,IAaJ,OAXA0L,qBAAU,WAAO,IAAD,EACNu9E,EAAe,UAAG9O,EAAGngE,MAAM9Z,EAAShjB,QAAQyE,YAA7B,QAAqC,KAEtDsnG,GACAhB,EACIgB,EACAD,KAGT,CAACA,EAAuCf,EAAsB/nF,IAG7D,cAAC,EAAD,CACI6mF,QAASA,EACTlmG,KAAMA,EACNomG,aAAcA,IAKXn+F,mBAAK+iG,I,sECtELI,EAxBOzlG,sBAClB,WAA0BC,GAAS,IAAhCC,EAA+B,EAA/BA,UAAW4F,EAAoB,EAApBA,SACV,OACI,qBACI7F,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNL,UAAWA,EACX6C,YAAW+C,EARf,SAUI,sBACIsrD,YAAU,UACVC,YAAU,UACVlwD,EAAE,yMACFF,KAAK,iBCMVykG,EAxBW1lG,sBACtB,WAA0BC,GAAS,IAAhCC,EAA+B,EAA/BA,UAAW4F,EAAoB,EAApBA,SACV,OACI,qBACI7F,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNL,UAAWA,EACX6C,YAAW+C,EARf,SAUI,sBACIsrD,YAAU,UACVC,YAAU,UACVlwD,EAAE,0dACFF,KAAK,iBCwCV0kG,EAxDY3lG,sBACvB,WAA0BC,GAAS,IAAhCC,EAA+B,EAA/BA,UAAW4F,EAAoB,EAApBA,SACV,OACI,sBACI7F,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNL,UAAWA,EACX6C,YAAW+C,EARf,UAUI,mBAAGqrD,YAAU,mBAAb,SACI,oBAAGA,YAAU,mBAAb,UACI,sBACIhwD,EAAE,uCACF0zB,OAAO,UACP+wE,eAAa,MACbC,oBAAkB,OAEtB,sBACI1kG,EAAE,4GACF0zB,OAAO,UACP+wE,eAAa,MACbC,oBAAkB,OAEtB,sBACI1kG,EAAE,+KACFF,KAAK,UACL4zB,OAAO,UACPgxE,oBAAkB,OAEtB,sBACI1kG,EAAE,oCACFF,KAAK,iBAIjB,iCACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,oBAExB,0BAAUE,GAAG,aAAb,SACI,sBACIJ,KAAK,OACL8zB,UAAU,iBACV5zB,EAAE,mC,cCjDjBgnB,EAAYvmB,IAAOC,IAAV,qGAMT2wD,EAAgB5wD,IAAOC,IAAV,8GAMbq0B,EAAQt0B,IAAOC,IAAV,8HCiEHikG,IAtEf,SAAuBhkG,GAAwB,IACnCikG,EAAmDjkG,EAAnDikG,iBAAkBC,EAAiClkG,EAAjCkkG,WAAYC,EAAqBnkG,EAArBmkG,iBAEtC,OACI,eAAC99E,EAAD,CAAWplB,YAAU,sBAArB,UACKgjG,GAAqB,EAClB,cAACz3D,EAAA,EAAD,CAASjpC,MAAM,eAAei5D,SAAS,eAAvC,SACI,eAAC9L,EAAD,CAAezvD,YAAU,+BAAzB,UACI,cAAC,EAAD,CAAgB+C,SAAS,4BACzB,cAACowB,EAAD,CAAOnzB,YAAU,2BAAjB,SACKgjG,SAKb,cAACG,EAAA,EAAD,CACIzjG,QAAQ,OACR8C,MAAO,CACHyU,WAAY,mBACZqmD,YAAa,IAEjBhgE,MAAO,GACPC,OAAQ,OAGf0lG,GAAe,EACZ,cAAC13D,EAAA,EAAD,CAASjpC,MAAM,QAAQi5D,SAAS,eAAhC,SACI,eAAC9L,EAAD,CAAezvD,YAAU,0BAAzB,UACI,cAAC,EAAD,CAAY+C,SAAS,uBACrB,cAACowB,EAAD,CAAOnzB,YAAU,sBAAjB,SACKijG,SAKb,cAACE,EAAA,EAAD,CACIzjG,QAAQ,OACR8C,MAAO,CACHyU,WAAY,mBACZqmD,YAAa,IAEjBhgE,MAAO,GACPC,OAAQ,OAIf2lG,GAAqB,EAClB,cAAC33D,EAAA,EAAD,CAASjpC,MAAM,eAAei5D,SAAS,eAAvC,SACI,eAAC9L,EAAD,CAAezvD,YAAU,iCAAzB,UACI,cAACojG,EAAD,CAAiBrgG,SAAS,8BAC1B,cAACowB,EAAD,CAAOnzB,YAAU,6BAAjB,SACKkjG,SAKb,cAACC,EAAA,EAAD,CACIzjG,QAAQ,OACR8C,MAAO,CACHyU,WAAY,mBACZqmD,YAAa,IAEjBhgE,MAAO,GACPC,OAAQ,Y,gICpEf8lG,EAAeC,YAAW,CACnCC,KAAM,CACF1hG,MAAO,sBACPtE,OAAQ,EACR0wB,QAAS,SAEbu1E,KAAM,CACHjmG,OAAQ,EACR0Z,WAAY,mBACZ2N,OAAQ,6BACRljB,aAAc,GAEjB+hG,MAAO,CACHlmG,OAAQ,EACRmE,aAAc,GAElBgiG,MAAO,CACHnmG,OAAQ,GACRD,MAAO,GACPqB,gBAAiB,sBACjBimB,OAAQ,yBACRo7B,WAAY,EACZvtB,YAAa,GACb62C,UAAW,kCACX,6BAA8B,CAC1BA,UAAW,kCAEfznE,MAAO,qBA3BayhG,CA6BzBK,KAEUn9B,EAAsB3nE,YAAO8sC,IAAO7sC,IAAdD,CAAH,oPAanB4nE,EAAe5nE,YAAO8sC,IAAO7sC,IAAdD,CAAH,wLAID,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIvC4gH,EAAkB/kG,IAAOC,IAAV,wDAGf+kG,EAAuBhlG,IAAOC,IAAV,mKAQpBqnE,EAAStnE,IAAOC,IAAV,gKAQNu0C,EAASx0C,IAAOC,IAAV,gDAGNwtE,EAAkBztE,IAAOC,IAAV,oHAMfs8B,EAAUv8B,IAAOC,IAAV,qI,OCMLglG,MA1Ef,SAAyB/kG,GAA8B,IAE/C6iG,EAOA7iG,EAPA6iG,cACA7gG,EAMAhC,EANAgC,YACAohG,EAKApjG,EALAojG,UACAC,EAIArjG,EAJAqjG,uBACA90D,EAGAvuC,EAHAuuC,MACAy2D,EAEAhlG,EAFAglG,cACAjE,EACA/gG,EADA+gG,WAGJ,OACI,cAACt5B,EAAD,CAAqBvjE,QAASlC,EAA9B,SACI,eAAC0lE,EAAD,CACIp5B,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBrqC,QAAS,SAAC61C,GACNA,EAAM30B,mBAJd,UAOI,cAACgiD,EAAD,CAAQnmE,YAAU,mBAAlB,wBACI,cAAC,IAAD,CACI9C,IAAKilG,EACL6B,MAAOpC,EACPtkG,MAAO,IACPC,OAAQ,IACRqnB,OAAQk7E,EAAa,CAAC,GAAI,IAAM,CAAC,GAAG,IACpCp+F,aAAco+F,EAAa,EAAI,IAC/Bj+F,MAAO,CAAC,EAAG,EAAG,EAAG,KACjByrC,MAAOA,IAEf,eAAC+F,EAAD,WACI,eAACuwD,EAAD,WACI,eAACC,EAAD,WACI,sBAAM7jG,YAAU,wBAAhB,kBACA,sBAAMA,YAAU,wBAAhB,SAAyCstC,OAE7C,sBAAMttC,YAAU,yBAAhB,SACI,cAACqjG,EAAD,CACIY,aAAW,QACX76E,SAAU26E,EACVr/F,MAAO4oC,EACP42D,KAAM,GACNC,OAAO,EACP5yF,IAAK,EACLwqC,IAAK,SAIjB,cAAC3gB,EAAD,IACA,eAACkxC,EAAD,WACI,cAACjqE,EAAA,EAAD,CACI/I,OAAQyH,EACRrB,QAAQ,UACRwC,YAAY,QACZa,SAAS,2BAJb,oBAQA,cAACV,EAAA,EAAD,CACIxI,KAAK,SACLP,OAAQ8oG,EACRlgG,YAAY,QACZa,SAAS,yBAJb,8BCtExB,SAASqhG,EAAsBrlG,GAAoC,IAE3DojG,EAKApjG,EALAojG,UACAP,EAIA7iG,EAJA6iG,cACA7gG,EAGAhC,EAHAgC,YACAqhG,EAEArjG,EAFAqjG,uBACAtC,EACA/gG,EADA+gG,WAN0D,EASpC99E,mBAAiB,KATmB,mBASvDsrB,EATuD,KAShD+2D,EATgD,KAkB9D,OACI,cAAC,EAAD,CACIlC,UAAWA,EACXP,cAAeA,EACf7gG,YAAaA,EACbqhG,uBAAwBA,EACxB2B,cAbc,SAClBjrD,EACAxL,GAEA+2D,EAAS/2D,IAULA,MAAOA,EACPwyD,WAAYA,IAKTvgG,mBAAK6kG,I,0CCpCpB,gE,6BCAA,oE,6BCAA,mE,inBCAe,MAA0B,uC,OCE5BjxE,EAAQt0B,IAAOC,IAAV,oMAULwlG,EAAYzlG,IAAOi0C,IAAV,6IASTyxD,EAAc1lG,IAAOC,IAAV,wJAQXg+F,EAAgBj+F,IAAOC,IAAV,8CAIb0lG,EAAiB3lG,IAAOC,IAAV,6K,OCfrB2lG,EAAuB3oD,WAAaqhD,MAAM,CAC5C/tG,MAAOguG,IAAW5gD,YAqEPkoD,MAlEf,YAMgC,IAL5BC,EAK2B,EAL3BA,UACAnC,EAI2B,EAJ3BA,aACAoC,EAG2B,EAH3BA,aACAjtC,EAE2B,EAF3BA,OACAktC,EAC2B,EAD3BA,OAEA,OACI,eAAChH,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACI,eAAC/f,EAAD,WACI,cAACmxE,EAAD,CAAWnhG,IAAK2hG,EAAgB7hG,QAAS4hG,IAD7C,qBAIA,eAACN,EAAD,2DACiD,uBADjD,sDAGA,cAACzH,EAAD,UACI,cAAC,IAAD,CACIkB,cAAe,CACX5uG,MAAO,IAEX8uG,SAAU,SAAAjgG,GAAM,OAAI05D,EAAO15D,EAAO7O,QAClC+uG,iBAAkBsG,EALtB,SAOK,gBAAGxmG,EAAH,EAAGA,OAAQ8mG,EAAX,EAAWA,cAAX,OACG,eAAC,IAAD,WACI,cAACP,EAAD,UACI,cAAC,IAAD,CACI3qG,KAAK,OACLu0F,UAAWpkC,IACX13D,KAAK,QACLgQ,MAAM,gBACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACTkD,MAAOzG,EAAO7O,MACdm2F,cAAc,OACdrtB,gBAAiB,IACjBrN,YAAa23C,EACb/3C,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,wBACT6nD,WAAW,EACXjmC,aAAc,SAACT,GACX6gF,EAAc,QAAS7gF,EAAEgwB,OAAOxvC,OAChCkgG,SAIZ,cAAC,IAAD,CACIniG,UAAWxE,EAAO7O,MAClBmO,OAAO,OACPD,MAAM,QACNkE,SAAU,GACVoB,QAAS+hG,EALb,mC,QCYbK,I,ICjFAA,EDUf,YAA8E,IAAtClgE,EAAqC,EAArCA,UAC9BruB,EAAUW,cACV6tF,EAAiB91G,cAFkD,EAGvC6yB,oBAAkB,GAHqB,mBAGlE2iF,EAHkE,KAGvDO,EAHuD,OAIjCljF,mBAAiB,IAJgB,mBAIlEwgF,EAJkE,KAIpD2C,EAJoD,KAoCnEC,EAAav2G,uBAAY,SAACO,GAC5B81G,GAAa,GACbD,EAAe71G,GACd+6B,MACG,SAACgT,GACG+nE,GAAa,GACbC,EAAgB,IAChBrgE,OAGPza,OAAM,SAAC5rB,GACJymG,GAAa,GACbC,EA7Be,SAAC/sG,GACpB,OAAOA,GACH,KAAK,IACD,MAxBY,wDAyBhB,KAAK,IACD,MA3BgB,+DA4BpB,QACI,OAAO,MAsBKitG,CAAe5mG,EAAMrG,OAASqG,EAAMgB,cAEzD,CAACwlG,EAAgBngE,IAMdwgE,EAAaz2G,uBAAY,WAC3B4nB,EAAQH,KAAKluB,IAAOE,WAAWC,SAChC,CAACkuB,IAIJ,OAFA0xB,YAAiB,mBAEV,cAAC,EAAD,CACHw8D,UAAWA,EACXnC,aAAcA,EACdoC,aAvDqB,WACrBO,EAAgB,KAuDhBxtC,OAAQytC,EACRP,OAAQS,KE/ED,MAA0B,wCCE5BnyE,EAAQt0B,IAAOC,IAAV,4NAWLylG,EAAc1lG,IAAOC,IAAV,mLCmBTymG,MAvBf,YAA+E,IAA3CrH,EAA0C,EAA1CA,SAChC,OACI,eAACL,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACI,qBAAK/vC,IAAKqiG,EAAiBloG,MAAM,OAAOC,OAAO,OAAO6F,IAAI,qBAC1D,cAAC,EAAD,+BAGA,cAAC,EAAD,oGAGA,cAAC,IAAD,CACI7F,OAAO,OACPD,MAAM,QACNkE,SAAU,GACVlI,OAAQ4kG,EAJZ,wBCAGuH,ICjBAA,EDGf,WACI,IAAMhvF,EAAUW,cAMVsmF,EAAe7uG,uBAAY,WAC7B4nB,EAAQH,KAAKluB,IAAOE,WAAWC,SAChC,CAACkuB,IAEJ,OAAO,cAAC,EAAD,CAAyBynF,SAAUR,KEM/BgI,I,MCpBAA,GDGf,WACI,IAAMjvF,EAAUW,cACRzjB,EAAWijB,cAAXjjB,OAUR,MAAkC,SATpB,IAAIgyG,gBAAgBhyG,GASxBhE,IAAI,gBACH,cAACi2G,EAAD,IACJ,cAACC,EAAD,CAAmB/gE,UALJ,kBAClBruB,EAAQH,KAAR,UAAgBluB,IAAOE,WAAWa,gBAAlC,2BEOK28G,GAAoBv0E,IAAM/tB,mBACnC5T,GAGG,SAASm2G,KACZ,OAAOtiG,qBAAWqiG,ICzBf,I,wBAAME,GAAoBnnG,IAAOC,IAAV,qMAQR,SAAAC,GAAK,OAAIA,EAAMknG,eAAiB,iBAC/B,SAAAlnG,GAAK,OAAIA,EAAMmnG,gBAAkB,mBACrC,SAAAnnG,GAAK,OAAIA,EAAMu9F,YAAc,YAC9B,SAAAv9F,GAAK,OAAIA,EAAMihD,WAAa,MAC/B,SAAAjhD,GAAK,OAAOA,EAAMkvB,QAAUlvB,EAAMkvB,QAAU,aAI9Ck4E,GAAqBtnG,IAAOC,IAAV,qGAGb,SAAAC,GAAK,OAAIA,EAAMihD,WAAa,K,IAGbnhD,IAAOC,IAAV,2FAIb,SAAAC,GAAK,OAAIA,EAAMyC,UAAY,MACzB,SAAAzC,GAAK,OAAIA,EAAM+zB,YAAc,YACnC,SAAA/zB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,S,2BCzBnCojH,GAAiBvnG,IAAOiS,EAAV,+SAMP,SAAA/R,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAM8C,MACN9C,EAAM8C,MACN9C,EAAMI,MAAMpc,OAAOI,eAChB,SAAA4b,GAAK,OAAIA,EAAMyC,UAAY,MAEzB,SAAAzC,GAAK,OAAIA,EAAMwzB,QAAU,OAM3B,SAAAxzB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAEvC,SAAA2Y,GAAK,OAAIA,EAAM0D,UAAY,0BAGpB4jG,GAUR,SAAC,GAUC,IATH9zE,EASE,EATFA,OACA/wB,EAQE,EARFA,SACAe,EAOE,EAPFA,SACAU,EAME,EANFA,QACA9F,EAKE,EALFA,UACA0E,EAIE,EAJFA,MACAe,EAGE,EAHFA,QACAH,EAEE,EAFFA,SACAM,EACE,EADFA,SAEA,OACI,cAACqjG,GAAD,CACIjpG,UAAWA,EACXo1B,OAAQA,EACR/wB,SAAUA,EACVyB,QAASA,EACTpB,MAAOA,EACPY,SAAUA,EACVzC,YAAW+C,EAPf,SASKH,EAAU,cAAC,KAAD,IAAcL,KAKtB8jG,MClEFC,GAAkBznG,IAAOC,IAAV,2MAUH,SAAAC,GAAK,OAClBA,EAAM40C,SACA,MACE50C,EAAMitC,aACRjtC,EAAMitC,aACN,UAYLu6D,IARqB1nG,YAAOwnG,GAAPxnG,CAAH,uJAQGA,IAAOC,IAAV,sH,IAQOD,IAAOC,IAAV,4HAOJD,IAAO0nB,KAAV,qHAEV,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAEjC,SAAAyb,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAGd90C,IAAO0nB,KAAV,8QACb,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAC7B,SAAA4W,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAQxC,SAAA50C,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,c,iBCpCnCijH,GAAc1qD,WAAaqhD,MAAM,CACnC/tG,MAAOguG,IAAWhuG,QAgHPq3G,GA3GD,WAAO,IAAD,EACgBzkF,oBAAS,GADzB,mBACTvf,EADS,KACCikG,EADD,KAEVjwF,EAAwBW,cACxB0nF,EAAWpkC,eACX/pD,EAAcnQ,cAEdmzC,EADmBC,eACSt2C,MAAQxa,IAAU2E,YAAYG,QA2BhE,OAFAugD,YAAiB,SAGb,cAAC29D,GAAkBa,SAAnB,UACK,SAAA/rD,GAAU,OACP,cAACijD,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,SACI,cAACqzD,GAAD,UACI,cAAC,IAAD,CACIvI,cAAe,CACX5uG,MAAO,IAEX8uG,SAAU,SAAAjgG,IAlCb,SAACA,EAAa28C,GAC/B8rD,GAAY,GAEZ5H,EAAS,CAAE1vG,MAAO6O,EAAO7O,QACpB+6B,MAAK,SAACgT,GACH,IAAMoC,EAAMpC,EAASoC,IACjBA,EACAC,OAAO7oB,SAASopB,KAAO48B,aAAqBp9B,EAAK,eAAgBC,OAAO7oB,SAASomD,OAAhB,oBAEjEjiC,KAAQ4f,IAAI,aAAcz8C,EAAO7O,OACjCqnB,EAAQH,KAAKluB,IAAOE,WAAWE,oBAGtC6hC,OAAM,SAAA5rB,GACH,IAAM+jG,EACa,MAAf/jG,EAAMrG,KAzBM,gBA2BNqG,EAAMgB,QAChBinG,GAAY,GACZ/1F,EAAY6xF,EAAc,YAgBVoE,CAAa3oG,IAEjBkgG,iBAAkBqI,GAPtB,SASK,gBAAGvoG,EAAH,EAAGA,OAAQ8mG,EAAX,EAAWA,cAAX,OACG,eAAC,IAAD,WACI,cAACuB,GAAD,CAAiB3yD,SAAUA,EAA3B,SACI,cAAC,IAAD,CACI95C,KAAK,OACLu0F,UAAWpkC,IACX13D,KAAK,QACLgQ,MAAM,gBACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACTmjB,aAAc,SACVT,GAEA6gF,EACI,QACA7gF,EACMA,EAAEgwB,OAAOxvC,MAAMyzB,OACf,KAGdzzB,MAAOzG,EAAO7O,MACdm2F,cAAc,OACdrtB,gBAAiB,IACjB1N,aAAa,iBACbC,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,kBAIjB,cAACijG,GAAD,CACIE,eAAe,SACf5J,WAAW,SACX2J,cAAc,SACdjmD,UAAW,GACX/xB,QAAQ,IALZ,SAOI,cAAC,IAAD,CACIxrB,UAAWxE,EAAO7O,QAAU,mCAAmCgpC,KAAKn6B,EAAO7O,OAC3EmO,OAAO,OACPD,MAAM,OACNsF,QAASH,EACTP,YAAY,OACZV,SAAU,GACVuB,SAAS,eAPb,sCC1GlC8jG,GAAkC,SAAC,GAIlC,IAHHpwF,EAGE,EAHFA,QACAqwF,EAEE,EAFFA,SACAC,EACE,EADFA,aAOA,OALA5kF,qBAAU,WACN4kF,IACAtwF,EAAQH,KAAKwwF,KACd,CAACC,EAAcD,EAAUrwF,IAErB,MAiBIuwF,GAZV,SAAC,GAAkB,IAAhBF,EAAe,EAAfA,SACErwF,EAAUW,cACV6vF,EAAazsC,eACnB,OACI,cAAC,GAAD,CACI/jD,QAASA,EACTqwF,SAAUA,GAAY1+G,IAAOE,WAAWC,MACxCw+G,aAAcE,K,2DC7BbC,GAAaroG,YAAOsoG,KAAPtoG,CAAH,6aCuBRuoG,OAtBf,YAAmG,IAAjEnqC,EAAgE,EAAhEA,YAAaoqC,EAAmD,EAAnDA,iBAAkBtkG,EAAiC,EAAjCA,SAK7D,OAAO,cAACmkG,GAAD,UACH,cAAC,KAAD,CACAxiG,MAAOu4D,EACP36D,MAAM,WACN8mB,SARiB,SAAC0vB,GAClBuuD,EAAiBvuD,EAAM5E,OAAOxvC,QAQ9BokD,YAAY,+BACZ9oD,YAAW+C,EALX,SAQQm4B,OAAOtrB,KAAKmqD,MAAcj6D,KAAI,SAAC4E,GAC3B,OAAQ,cAACw7D,GAAA,EAAD,CAAUx7D,MAAOA,EAAjB,SAAyBA,EAAMumC,wBCO5Cq8D,I,0CCzBAC,GDGf,YAAwE,IAA/BxkG,EAA8B,EAA9BA,SAC/Bk6D,EAAcngD,mBAAQ,WACxB,OAAOwT,KAAa3gC,IAAI,gBAAkB,YAC3C,IAYH,OAAO,cAAC,GAAD,CACHstE,YAAaA,EACboqC,iBAPoB,SAAC3iG,GACrB4rB,KAAaoqB,IAAI,cAAeh2C,GAAS,WACzC86B,OAAO7oB,SAAS6wF,UAMhBzkG,SAAUA,KEpBLujG,GAAkBznG,IAAOC,IAAV,qPAUH,SAAAC,GAAK,OAClBA,EAAM40C,SACA,MACE50C,EAAMitC,aACRjtC,EAAMitC,aACN,UAGL,SAAAjtC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5BmkH,GAAqB5oG,YAAOwnG,GAAPxnG,CAAH,uJAQlB0nG,GAAqB1nG,IAAOC,IAAV,qHAQlB4oG,GAAyB7oG,IAAOC,IAAV,4HAOtB6oG,GAAkB9oG,IAAO0nB,KAAV,qHAEV,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAEjC,SAAAyb,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAGpCi0D,GAAsB/oG,IAAO0nB,KAAV,8QACb,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAC7B,SAAA4W,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAQxC,SAAA50C,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cC9BnCskH,GAAsB/rD,WAAaqhD,MAAM,CAC3C/tG,MAAOguG,IAAWhuG,MAClBE,SAAU8tG,IAAWhhD,gBA4LV0rD,GAvLO,WAAO,IAAD,IACQ9lF,oBAAS,GADjB,mBACjBvf,EADiB,KACPikG,EADO,KAElBjwF,EAAwBW,cACxB/C,EAAI,UAAGoC,EAAQE,SAAShW,aAApB,aAAG,EAAwB0T,KAC/B0zF,EAAQntC,eACRjqD,EAAcnQ,cACdkpD,EAAmB9V,eACnBwqB,EAA8BC,eAC9B1qB,EAAW+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYG,QAgC1DogH,EAAuB,WACzBvxF,EAAQH,KAAK,YAGX2xF,EAA0B,WAC5BxxF,EAAQH,KAAKluB,IAAOE,WAAWI,sBAKnC,OAFAy/C,YAAiB,kBAGb,cAAC29D,GAAkBa,SAAnB,UACK,SAAA/rD,GAAU,OACP,cAACijD,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,SACI,eAAC,GAAD,WACK,CAAC,MAAO,SAAS3iC,SA9CtB0iD,SA+CQ,cAACs0C,GAAD,CAAqBxkG,SAAS,0BAElC,cAAC,IAAD,CACIi7F,cAAe,CACX5uG,MAAO0rC,KAAQnrC,IAAI,eAAiB,GACpCL,SAAU,IAEd4uG,SAAU,SAAAjgG,IApDb,SAACA,EAAa28C,GAC/B8rD,GAAY,GACZqB,EAAM,CAAEA,MAAO9pG,EAAO7O,MAAOE,SAAU2O,EAAO3O,WACzC66B,MAAK,SAACgT,GACH,IAAM7lC,EAAO6lC,EAAS7lC,KACjBA,EAAK4wG,qBAIN5tD,aAAahjD,EAAM6lC,EAAS5tC,OAC5BorD,aACIlkC,EACAmkC,EACAtjD,EACA6lC,EAAS5tC,MACT8kB,KATJymB,KAAQ4f,IAAI,aAAcvd,EAAS5tC,OACnC6uE,EAA4B,CAAE9mE,OAAM+c,aAY3CgW,OAAM,SAAA5rB,GACH,IAAM+jG,EACa,MAAf/jG,EAAMrG,KAlCM,oCAoCNqG,EAAMgB,QAChBinG,GAAY,GACZ/1F,EAAY6xF,EAAc,YA4BVoE,CAAa3oG,EAAQ28C,IAEzBujD,iBAAkB0J,GARtB,SAUK,gBAAG5pG,EAAH,EAAGA,OAAH,OACG,eAAC,IAAD,WACI,cAAC,GAAD,CAAiB01C,SAAUA,EAA3B,SACI,cAAC,IAAD,CACI95C,KAAK,uBACLu0F,UAAWpkC,IACX13D,KAAK,QACLgQ,MAAM,gBACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACTiB,UAAU,EACViC,MAAOzG,EAAO7O,MACdm2F,cAAc,OACdrtB,gBAAiB,IACjB1N,aAAa,iBACbC,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,kBAIjB,cAAC,GAAD,CACI4wC,SAAUA,EACV3H,aAAa,MAFjB,SAII,cAAC,IAAD,CACInyC,KAAK,oBACLu0F,UAAWpkC,IACX13D,KAAK,WACLgQ,MAAM,WACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACT+jF,cAAc,OACdrtB,gBAAiB,IACjB1N,aAAa,iBACbC,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,qBAGjB,cAAC,GAAD,CACIE,QAAS+kG,EACTjlG,SAAS,kBAFb,8BAMA,cAACijG,GAAD,CACIE,eAAe,SACf5J,WAAW,SACX2J,cAAc,SACdjmD,UAAW,GACX/xB,QAAQ,IALZ,SAOI,cAAC,IAAD,CACI1wB,OAAO,OACPD,MAAM,OACNsF,QAASH,EACTP,YAAY,OACZV,SAAU,GACVuB,SAAS,eANb,sBAWJ,cAACijG,GAAD,CACIhmD,UAAW,GACX/xB,QAAQ,IAFZ,SAII,eAAC,GAAD,WACI,cAAC,GAAD,CACI0lB,SAAUA,IAEd,cAAC,GAAD,CACIA,SAAUA,EACV3zC,YAAU,yBAFd,4BAMA,cAAC,GAAD,CACI2zC,SAAUA,SAItB,cAACqyD,GAAD,CACIE,eAAe,SACf5J,WAAW,SACX2J,cAAc,SACdjmD,UAAW,EACX/xB,QAAQ,IALZ,SAOI,cAAC,IAAD,CACIp0B,KAAK,SACL0D,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZxC,QAAQ,UACR8B,SAAU,GACVlI,OAAQ2uG,EACRllG,SAAS,uBARb,4C,oBCrM3BolG,GAAsBrsD,WAAaqhD,MAAM,CAClD7tG,SAAU8tG,IAAW9tG,SACrB+sD,gBAAiB+gD,IAAW/gD,gBACvBC,MAAM,CAACR,MAAQ,YAAa,MAAO,qDCN/B12B,GAAYvmB,IAAOC,IAAV,iGAMTq0B,GAAQt0B,IAAOC,IAAV,sMAULwlG,GAAYzlG,IAAOi0C,IAAV,+IASTs1D,GAAevpG,IAAOC,IAAV,8KASZg+F,GAAgBj+F,IAAOC,IAAV,gDAIb0lG,GAAiB3lG,IAAOC,IAAV,qJASdwtE,GAAkBztE,IAAOC,IAAV,qDAIfupG,GAAaxpG,IAAOC,IAAV,mPC+DRwpG,OAhGf,YAM4B,IALxBlK,EAKuB,EALvBA,aACAoE,EAIuB,EAJvBA,aACAoC,EAGuB,EAHvBA,aACA1G,EAEuB,EAFvBA,SACA2G,EACuB,EADvBA,OAEA,OACI,cAAChH,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,SACI,eAAC9tB,GAAD,WACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAWjiB,IAAK2hG,EAAgB7hG,QAAS4hG,IAD7C,sBAKMrC,GACE,cAAC4F,GAAD,UAAe5F,IAGvB,cAAC,GAAD,UACI,cAAC,IAAD,CACIxE,cAAe,CACX1uG,SAAU,GACV+sD,gBAAiB,IAErB6hD,SAAU,SAAAjgG,GAAM,OAAIigG,EAASjgG,EAAO3O,WACpC6uG,iBAAkBgK,GANtB,SAQK,gBAAGlqG,EAAH,EAAGA,OAAQ8mG,EAAX,EAAWA,cAAX,OACG,eAAC,IAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIlrG,KAAK,oBACLu0F,UAAWpkC,IACX13D,KAAK,WACLgQ,MAAM,eACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACTkD,MAAOzG,EAAO3O,SACdi2F,cAAc,OACdrtB,gBAAiB,IACjBzN,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,eACT0hB,KAAK,sCACLE,aAAc,SAACT,GACX6gF,EAAc,WAAY7gF,EAAEgwB,OAAOxvC,OACnCkgG,SAIZ,cAAC,GAAD,UACI,cAAC,IAAD,CACI/qG,KAAK,oBACLu0F,UAAWpkC,IACX13D,KAAK,kBACLgQ,MAAM,mBACN/E,OAAO,OACP+mB,WAAW,YACX9iB,SAAS,OACTkD,MAAOzG,EAAOo+C,gBACdkpC,cAAc,OACdrtB,gBAAiB,IACjBzN,WAAY3nE,IAAUC,OAAOW,OAC7ByZ,UAAU,cACV4F,SAAS,mBACT4hB,aAAc,SAACT,GACX6gF,EAAc,kBAAmB7gF,EAAEgwB,OAAOxvC,OAC1CkgG,SAIZ,cAACt4B,GAAD,UACI,cAAC,IAAD,CACI/uE,OAAO,OACPD,MAAM,QACNkE,SAAU,GACVoB,QAASw7F,EACT37F,UAAWxE,EAAO3O,WAAa2O,EAAOo+C,gBAL1C,8BAUJ,eAACgsD,GAAD,oFAC0E,mBAAGtoE,KAAK,+BAAR,mCAD1E,qB,SC/F1B6wD,GAAKhyE,EAAQ,IA2DJ2pF,I,YClEAA,GDSf,WACI,IAAM9xF,EAAUW,cACVT,EAAWC,cACX4xF,EAAc5X,GAAGngE,MAAM9Z,EAAShjB,QAChC80G,EAAmBp5G,eAJO,EAKQ2yB,oBAAkB,GAL1B,mBAKzBo8E,EALyB,KAKXsK,EALW,OAMQ1mF,mBAAiB,IANzB,mBAMzBwgF,EANyB,KAMX2C,EANW,KAazBzH,EAAe7uG,uBAAY,SAACS,GAC/Bo5G,GAAgB,GAChBD,EAAiBn5G,EAAUk5G,EAAYj5G,OACtC46B,MAAK,WAAO,IAAD,EACR1T,EAAQH,MAAK,UAAAkyF,EAAY31G,YAAZ,eAAkBslC,UAAWj0B,KAAWE,KAC/Chc,IAAOE,WAAWQ,cAClBV,IAAOE,WAAWC,UAE3B8hC,OAAM,SAAC5rB,GACJiqG,GAAgB,GAChBvD,EACmB,MAAf1mG,EAAMrG,KHhCe,yFGkCfqG,EAAMgB,cAGrB,CAACgX,EAAS+xF,EAAaC,IAepBnD,EAAaz2G,uBAAY,WAC3B4nB,EAAQH,KAAKluB,IAAOE,WAAWC,SAChC,CAACkuB,IAEJ,OAAO,cAAC,GAAD,CACH2nF,aAAcA,EACdoE,aAAcA,EACdqC,OAAQS,EACRV,aAjB6B,WAC7B8D,GAAgB,GAChBvD,EAAgB,KAgBhBjH,SAAUR,K,UE9DLiL,GAAa9pG,IAAOC,IAAV,iJAOV8pG,GAAO/pG,IAAOC,IAAV,uEAKJkhE,GAAQnhE,IAAOgqG,OAAV,qEAKLC,GAAQjqG,IAAOC,IAAV,qDCTlB,SAASiqG,GAAgBC,GACrB,GAAIA,EACA,IACI,OAAO36G,SAAS26G,GAClB,UAEN,OAAOA,EAGJ,I,8HAyBQj8G,GAzBiB,WAC5B,IAAM4mE,EAASxwB,eACf,OACI,cAAC06D,EAAA,EAAD,CAAkBpqD,UAAU,EAA5B,SACI,eAACk1D,GAAD,WACI,2CACA,eAACC,GAAD,WACI,cAAC5oC,GAAD,uBACA,cAAC8oC,GAAD,CAAOxqG,GAAG,cAAV,SAAyBq1D,EAAOs1C,iBAEpC,eAACL,GAAD,WACI,cAAC5oC,GAAD,uBACA,cAAC8oC,GAAD,CAAOxqG,GAAG,eAAV,SACKyqG,GAAgBp1C,EAAOH,eAGhC,eAACo1C,GAAD,WACI,cAAC5oC,GAAD,sBACA,cAAC8oC,GAAD,CAAOxqG,GAAG,YAAV,SAAuBq1D,EAAOJ,qB,uDC1B5C21C,GAA2C,SAAC,GAAa,IAAX3pE,EAAU,EAAVA,IAEhD,OADAC,OAAO7oB,SAASopB,KAAOR,EAChB,MAiDI4pE,GAnC8B,SAAC,GAOvC,IANQC,EAMT,EANFhb,UACAib,EAKE,EALFA,WACA9pE,EAIE,EAJFA,IACAh9B,EAGE,EAHFA,SACA+mG,EAEE,EAFFA,UACG//E,EACD,wEACF,OACI,cAAC,IAAD,6BACQA,GADR,IAEIqpE,OAAQ,SAAA7zF,GACJ,OA/BH+7B,KAAQnrC,IAAI,SAgCLy5G,EACI,cAACA,EAAD,0CAAerqG,GAAWwqB,GAAU+/E,IAEpC,mCAAG/mG,IAEPg9B,EACA,cAAC2pE,GAAD,CAAe3pE,IAAKA,IAEpB,cAAC,IAAD,CACI+L,GAAI,CACA4P,SAAUmuD,GAEJjhH,IAAOE,WAAWC,MACxBoY,MAAO,CAAE0T,KAAMtV,EAAM4X,kBCzCpCy4C,IAVuBvwD,IAAOC,IAAV,oCAIZD,IAAOC,IAAV,+FAEL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAIlB8a,IAAOC,IAAV,iCASPyqG,IANU1qG,IAAOC,IAAV,2GAMiBD,IAAOC,IAAV,4LCuCnB0qG,GAzDQvsG,sBACnB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIkB,GAAG,IACHhB,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBANhB,UAQI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,6yBACF4zB,UAAU,mCC/ChCy3E,GAAwB5qG,IAAOC,IAAV,6JACT,SAAAC,GAAK,OAAIA,EAAMihD,WAAa,UAOxC0pD,GAAoB7qG,IAAOC,IAAV,oVAKV,SAAAC,GAAK,OAAIA,EAAMzB,SACd,SAAAyB,GAAK,OAAIA,EAAMxB,UAGL,SAAAwB,GAAK,OACrBA,EAAMJ,iBAAmBI,EAAMI,MAAMpc,OAAOiB,WAC5B,SAAA+a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAW9CkmH,GAAc9qG,IAAOi0C,IAAV,6JASX9I,GAA6BnrC,IAAOC,IAAV,iEAEnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnC0oD,GAAoBptC,IAAOC,IAAV,0LACN,SAAAC,GAAK,OAAKA,EAAMyC,SAAWzC,EAAMyC,SAAW,MAEhD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAiF1BsmH,GA7DV,SAAC,GAaC,IACCC,EAbJC,EAYE,EAZFA,aACmBC,EAWjB,EAXFx/D,kBACA5lB,EAUE,EAVFA,aACAqlF,EASE,EATFA,sBACArrG,EAQE,EARFA,gBACAqhD,EAOE,EAPFA,UACAz9C,EAME,EANFA,SACApF,EAKE,EALFA,UACAqE,EAIE,EAJFA,SACAlE,EAGE,EAHFA,MACAC,EAEE,EAFFA,OACAkF,EACE,EADFA,SAGA,OACI,eAACgnG,GAAD,CAAuBzpD,UAAWA,EAAW7iD,UAAWA,EAAxD,UACI,uBACImB,GAAG,UACHzE,KAAK,OACLqD,IAAK,SAAAA,GAAG,OAAK2sG,EAAS3sG,GACtBsF,MAAO,CAAEm+F,QAAS,QAClBv3E,SAAU,SAAAlF,GAAC,OAAIS,EAAaT,IAC5BzhB,SAAUA,IAEd,cAACinG,GAAD,CACInsG,OAAQA,GAAkB,IAC1BD,MAAOA,GAAgB,IACvB2F,QAAS,kBAAM4mG,EAAO1pE,SACtBxhC,gBAAiBA,EACjBqB,YAAU,yBALd,SAOK8pG,EACG,cAACH,GAAD,CAAaxmG,IAAK2mG,IAClBC,EACA,cAAC//D,GAAD,CAA4BhqC,YAAU,+BAAtC,SACI,cAAC+pG,EAAD,MAGJ,cAAC//D,GAAD,UACI,cAAC,GAAD,UAIRggE,GACA,cAAC/9D,GAAD,CAAmBhpC,QAAS,kBAAM4mG,EAAO1pE,SAAzC,SACK59B,KAGL,eAAC0pC,GAAD,CACIhpC,QAAS,kBAAM4mG,EAAO1pE,SACtB3+B,SAAUA,EAFd,UAII,uDACA,yD,SC3GdyoG,GAAuBprG,IAAOC,IAAV,4BAEpBorG,GAAsBrrG,IAAOC,IAAV,4BAEnBqrG,GAAetrG,IAAOC,IAAV,wDAIZs8B,GAAUv8B,IAAOC,IAAV,sJAMW,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAG9C2mH,GAAoBvrG,YAAO+qG,GAAP/qG,CAAH,uGAMjBwrG,GAAqBxrG,IAAOC,IAAV,sDAIlBwrG,GAAoBzrG,YAAOwnG,GAAPxnG,CAAH,gJAQjBotC,GAAoBptC,IAAOC,IAAV,2KAGV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAOnCmmH,GAAwB5qG,IAAOC,IAAV,sGAMrByrG,GAAmB1rG,IAAOC,IAAV,sDAIhB4pD,GAAe7pD,IAAOC,IAAV,uIAOZ0rG,GAAgB3rG,IAAOC,IAAV,qIAOb2rG,GAAS5rG,IAAOC,IAAV,sHAIC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnConH,GAAY7rG,IAAOC,IAAV,kEAYF6rG,GAaR,SAAC,GAUC,IAAD,EACExM,EAVJ13F,EASE,EATFA,QACA6yB,EAQE,EARFA,QACAsxE,EAOE,EAPFA,SACAz4C,EAME,EANFA,kBACA04C,EAKE,EALFA,kBACAC,EAIE,EAJFA,WACA3mE,EAGE,EAHFA,KACAphC,EAEE,EAFFA,SACAgoG,EACE,EADFA,iBAGMvwD,EAAiB11C,aAAkB,UAAC2B,EAAQ5T,YAAT,aAAC,EAAcP,MAClD04G,EAAS,OAAG1xE,QAAH,IAAGA,OAAH,EAAGA,EAAS2xE,aAGvB9M,EADAh6D,GAAQ19B,EAAQvO,aAAeuO,EAAQvO,YAAYsZ,OAAS,EACzCsqC,WAAaqhD,MAAc,CAC1C3/D,UAAW4/D,IAAW5/D,UACtBE,SAAU0/D,IAAW1/D,SACrBxlC,YAAaklG,IAAWllG,YACxB9I,MAAOguG,IAAWhuG,QAGH0sD,WAAaqhD,MAAc,CAC1C3/D,UAAW4/D,IAAW5/D,UACtBE,SAAU0/D,IAAW1/D,WAI7B,IAAMwtE,EAAer8G,uBACjB,SAACq1B,GACGA,EAAEolC,UACF,IAAIyV,EAAO76C,EAAEgwB,OAAOstD,MAAM,GAC1BqJ,EAAkBpkG,EAAQnI,GAAKygE,KAEnC,CAACt4D,EAASokG,IAGTM,EAA8BvzF,eAE7BwzF,EAAev8G,uBAAY,WAC7Bs8G,EAA4B,CACxB7+D,WAAY,oCACZ/E,YACI,6DACJmF,UAAW,yBAAMo+D,QAAN,IAAMA,OAAN,EAAMA,EAAarkG,EAAQnI,KACtCkuC,kBAAmB,sBAExB,CAAC2+D,EAA6BL,EAAYrkG,EAAQnI,KAErD,OACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC4rG,GAAD,UACKU,GACG,eAAC,GAAD,WACKG,GACG,cAACxB,GAAD,UACI,cAAC,KAAD,CAASrmG,KAAM,OAGvB,cAACknG,GAAD,CACIpqD,UAAU,MACV8pD,aAAY,OACRrjG,QADQ,IACRA,OADQ,EACRA,EAAS4kC,SAEb1mB,aAAcumF,EACdlB,uBAAuB,EACvBrrG,gBAAiB7b,IAAUC,OAAOS,UAClCif,SAAUsoG,EACV/qG,YAAA,UAAc+C,EAAd,iBATJ,SAWI,eAACwnG,GAAD,WACI,cAACD,GAAD,CACIvnG,SAAQ,UAAKA,EAAL,gBADZ,kCAKA,eAAC,GAAD,CACI/C,YAAA,UAAc+C,EAAd,uBADJ,UAGI,sDACA,+DAOxB,cAACq4B,GAAD,IACA,cAAC,IAAD,CACI4iE,cAAe,CACXxgE,UAAW/2B,EAAQ+2B,UAAY/2B,EAAQ+2B,UAAY,GACnDE,SAAUj3B,EAAQi3B,SAAWj3B,EAAQi3B,SAAW,GAChDxlC,YAAauO,EAAQvO,YACfuO,EAAQvO,YACR,GACN9I,MAAOqX,EAAQrX,MAAQqX,EAAQrX,MAAQ,IAE3C6uG,oBAAoB,EACpBC,SAAU,SAAAjgG,GACN,IAAIotG,EAKAA,EAHAlnE,GACA19B,EAAQvO,cAAgB+F,EAAO/F,YAElB,CACTslC,UAAWv/B,EAAOu/B,UAClBE,SAAUz/B,EAAOy/B,SACjBxlC,YAAa+F,EAAO/F,aAGX,CACTslC,UAAWv/B,EAAOu/B,UAClBE,SAAUz/B,EAAOy/B,UAGzBy0B,EAAkBk5C,EAAY5kG,EAAQnI,KAE1C6/F,iBAAkBA,EA7BtB,SA+BK,YAAgC,IAA7BlgG,EAA4B,EAA5BA,OAAQ8mG,EAAoB,EAApBA,cACFuG,EAAqB7kG,EAAQvO,YAC7BuO,EAAQvO,YACR,GACAqzG,EACFttG,EAAO7O,QAAUqX,EAAQrX,OACzB6O,EAAOu/B,YAAc/2B,EAAQ+2B,WAC7Bv/B,EAAOy/B,WAAaj3B,EAAQi3B,UAC5Bz/B,EAAO/F,cAAgBozG,EAErBE,GACDvtG,EAAOu/B,YAAcv/B,EAAOy/B,SAEjC,OACI,eAAC,IAAD,WACI,eAACysE,GAAD,WACI,eAACzhD,GAAD,WACI,cAAC,IAAD,CACI7uD,KAAK,OACLu0F,UAAWpkC,IACXzlC,UAAW,IACXjyB,KAAK,YACLgQ,MAAM,aACNG,SAAU+3C,IAAmBowD,GAAYI,EACzC/zF,WACIn0B,IAAUC,OAAO+C,WAGzB,cAAC4kH,GAAD,IACA,cAAC,IAAD,CACI7wG,KAAK,OACLu0F,UAAWpkC,IACXzlC,UAAW,IACXjyB,KAAK,WACLgQ,MAAM,YACNG,SAAU+3C,IAAmBowD,GAAYI,OAGjD,eAACtiD,GAAD,WACI,cAAC,IAAD,CACI7uD,KAAK,QACLu0F,UAAWpkC,IACX13D,KAAK,QACLgQ,MAAM,QACNG,UAAU,EACVwU,WAAYn0B,IAAUC,OAAOC,QAEjC,cAAC0nH,GAAD,IACA,cAAC,IAAD,CACI7wG,KAAK,QACLu0F,UAAWpkC,IACX5gC,SAAU,SAAClF,GACP6gF,EACI,cACA7gF,GAAQ,KAGhB5xB,KAAK,cACLgQ,MAAM,gBACN2U,WACIn0B,IAAUC,OAAOS,UAErBqvC,UAAW/vC,IAAUC,OAAOkB,MAC5Bg9E,WACIn+E,IAAUC,OAAOO,UAErBmf,UAAWmoG,IAAazmE,GAAQ6mE,EAChCjoG,SAAQ,UAAKA,EAAL,sBAGfohC,GACG,cAACqmE,GAAD,UACI,cAACC,GAAD,+FASZ,cAACrvE,GAAD,IACCwvE,GACG,eAAC5E,GAAD,CAAmBE,eAAe,UAAlC,UACI,cAAC,IAAD,CACI3oG,OAAQ,OACRD,MAAO,QACPmF,UACK8oG,GAAiBC,EAEtBzoG,SAAQ,UAAKA,EAAL,WANZ,sBAUG+nG,GACC,cAACT,GAAD,UACI,cAAC,IAAD,CACI9sG,OAAQ,OACRD,MAAO,QACPzD,KAAK,SACLgI,MAAM,UACNvI,OAAQ8xG,EACRroG,SAAQ,UAAKA,EAAL,WANZ,0BAYR,cAACojG,GAAD,mBAgDzBsF,GA1BV,SAAC,GAUC,IATHhlG,EASE,EATFA,QACA6yB,EAQE,EARFA,QACAsxE,EAOE,EAPFA,SACAz4C,EAME,EANFA,kBACA04C,EAKE,EALFA,kBACAC,EAIE,EAJFA,WACA3mE,EAGE,EAHFA,KACAphC,EAEE,EAFFA,SACAgoG,EACE,EADFA,iBAEA,OACI,cAAC,GAAD,CACItkG,QAASA,EACT6yB,QAASA,EACTsxE,SAAUA,EACVz4C,kBAAmBA,EACnB04C,kBAAmBA,EACnBC,WAAYA,EACZ3mE,KAAMA,EACNphC,SAAUA,EACVgoG,iBAAkBA,K,SCzXxBd,GAAuBprG,IAAOC,IAAV,qDAIpBqrG,GAAetrG,IAAOC,IAAV,wDAIZs8B,GAAUv8B,IAAOC,IAAV,sJAMW,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAG9CinH,GAAY7rG,IAAOC,IAAV,kEAKT4sG,GAAY7sG,IAAOC,IAAV,6FAMT4pD,GAAe7pD,IAAOC,IAAV,sHAIZ,gBAAGktC,EAAH,EAAGA,aAAH,OAAsBxlB,YAArB,QAAD,wCAA2CwlB,MAG3CojB,GAAUvwD,IAAOC,IAAV,4BAEP6sG,GAA0B7vD,WAAaqhD,MAAM,CAC/C7tG,SAAU8tG,IAAW9tG,SACrB+sD,gBAAiB+gD,IAAW/gD,kBAG1BuvD,GAAsC9vD,WAAaqhD,MAAM,CAC3D7tG,SAAU8tG,IAAW9tG,SACrB+sD,gBAAiB+gD,IAAW/gD,gBAC5BE,gBAAiB6gD,IAAW7gD,kBAuGjBsvD,GAhGV,SAAC,GAA+C,IAA7CplG,EAA4C,EAA5CA,QAASqlG,EAAmC,EAAnCA,mBAAoB/oG,EAAe,EAAfA,SAC3BgpG,EAAc5zF,YAAY3R,MAC1BwlG,GAAoB,OAAXD,QAAW,IAAXA,OAAA,EAAAA,EAAaztG,OAAb,OAAoBmI,QAApB,IAAoBA,OAApB,EAAoBA,EAASnI,IACtCG,EAAQ0Z,YAAYxR,MAHsB,EAKgBqb,oBAAS,GALzB,mBAKzCiqF,EALyC,KAKfC,EALe,KAM1CC,EAAuBH,GAA+B,OAAhB,OAALvtG,QAAK,IAALA,OAAA,EAAAA,EAAO+kC,YAAqByoE,GAA4B,sBAG/F,OACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIjO,cAAe,CACX1uG,SAAU,GACV+sD,gBAAiB,GACjBE,gBAAiB,IAErB2hD,SAAU,SAACjgG,EAAQkrC,GACf6iE,GAAUE,GAA4B,GACtC,IAAM3xC,EAAe,CACjBjrE,SAAU2O,EAAO3O,SACjBitD,gBAAiBt+C,EAAOs+C,iBAE5BuvD,EAAmBvxC,EAAc9zD,EAAQnI,KAE7C6/F,iBAAkB6N,EAASJ,GAAsCD,GAdrE,SAgBK,gBAAG1tG,EAAH,EAAGA,OAAH,OACG,eAAC,IAAD,WACI,eAAC,GAAD,WACK+tG,GACG,eAAC,GAAD,CAAchgE,aAAc,GAA5B,UACI,cAAC0/D,GAAD,UACI,cAAC,IAAD,CACI7xG,KAAK,WACLu0F,UAAWpkC,IACXI,aAAa,mBACb93D,KAAK,kBACLgQ,MAAM,mBACNuoD,YAAashD,EACbC,SAAU,kBAAMF,GAA4B,QAGpD,cAAC,GAAD,IACA,cAACR,GAAD,OAGR,eAAC,GAAD,CAAc1/D,aAAc,GAA5B,UACI,cAAC0/D,GAAD,UACI,cAAC,IAAD,CACI7xG,KAAK,WACLu0F,UAAWpkC,IACXI,aAAa,eACb93D,KAAK,WACLgQ,MAAM,eACNS,SAAQ,UAAKA,EAAL,qBAGhB,cAAC,GAAD,IACA,cAAC2oG,GAAD,UACI,cAAC,IAAD,CACI7xG,KAAK,WACLu0F,UAAWpkC,IACXI,aAAa,uBACb93D,KAAK,kBACLgQ,MAAM,mBACNS,SAAQ,UAAKA,EAAL,+BAKxB,cAAC,GAAD,IACA,eAACijG,GAAD,WACI,cAAC,IAAD,CACIzoG,OAAQ,OACRD,MAAO,QACPmF,UACKxE,EAAO3O,WACP2O,EAAOo+C,iBACP2vD,IAAW/tG,EAAOs+C,gBAEvBx5C,SAAQ,UAAKA,EAAL,WARZ,oBAYA,cAACojG,GAAD,kB,oCCtJnBkG,GAAoB,SAC7BhoC,EACA/qE,GAF6B,oCAGnBA,GAHmB,IAGXO,KAAMP,EAAOO,KAAKrL,QAAQ61E,EAAiB,O,UCgB3Dh+D,GAA4B,CAC9BojB,UAAW,GACXvW,SAAU,GACVo5F,MAAO,GACP7tG,MAAO,MAGE8tG,GAAyB,SAClCC,EACAt8F,GAEA,IAAMu8F,OACgC78G,IAAlC0gB,KAAiBJ,GACX,CAACG,MADP,uBAGcC,KAAiBJ,IAH/B,CAIUG,OAGd,OAAO,6BACAm8F,GADP,IAEIj5E,QAASk5E,EAAOv2F,QAAO,SAACumD,EAAkCtsD,GAEtD,OADAssD,EAAItsD,GAASg4C,oBAAU9hD,IAChBo2D,IACR,OAMEiwC,GAAoB,SAC7B/4C,GAD6B,OAE5B,SAACg5C,GAAD,OAA6B,SAAChsG,EAAUisG,GACzC,IAAIC,EAAWlsG,EACPuP,EAAgByjD,EAAhBzjD,YACF5W,EAAS+yG,GAAkB,GAAD,OAAIn8F,EAAJ,YAA2B08F,GACrDz8F,EAAQ7W,EAAOkX,OAErB,IAAKL,EACD,OAAOw8F,EAAYE,EAAUvzG,GAGjC,OAAQA,EAAOO,MACX,IAAK,cACDgzG,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAU,GACVzJ,QAAS,SAIrB,MACJ,IAAK,aACDojG,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAICm8F,MAAM,aAAK3rG,EAAM4yB,QAAQpjB,GAAO+C,gBAI5C,MACJ,IAAK,eACD25F,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAU5Z,EAAO4Y,UAI7B,MACJ,IAAK,sBACD,IAAI46F,EAAiB,aAAOnsG,EAAM4yB,QAAQpjB,GAAOsZ,WAE7CqjF,EAAkBv8F,SAASjX,EAAOgF,IAClCwuG,EAAoBA,EAAkB96F,QAClC,SAAA1T,GAAE,OAAIA,IAAOhF,EAAOgF,MAGxBwuG,EAAkBx2F,KAAKhd,EAAOgF,IAGlCuuG,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAICsZ,UAAWqjF,QAIvB,MACJ,IAAK,0BACD,IAAIC,EAAoBzzG,EAAO4Y,IAE/B26F,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAICsZ,UAAWsjF,QAIvB,MACJ,IAAK,yBAEDF,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAICsZ,UAAW,SAIvB,MACJ,IAAK,kBACD,IAAMujF,EAAkB1zG,EAAOoZ,UAC/Bm6F,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAU85F,QAItB,MACJ,IAAK,oBACDH,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAU,SAItB,MACJ,IAAK,sBACD25F,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAUvS,EAAM4yB,QAAQpjB,GAAOm8F,YAI3C,MAEJ,IAAK,cACDO,EAAQ,6BACDA,GADC,IAEJt5E,QAAQ,6BACD5yB,EAAM4yB,SADN,mBAEFpjB,EAFE,6BAGIxP,EAAM4yB,QAAQpjB,IAHlB,IAIC+C,SAAU,GACVo5F,MAAO,GACP7iF,UAAW,SAO/B,OAAOkjF,EAAYE,EAAUvzG,MCxMpB2zG,GAAsB,UAEtBC,GAA4D,CACrEt5C,UAAW,CAAC,gBAAiB,aAAc,YAC3CC,YAAa,CAAC,gBAAiB,aAAc,a,UCiB3CxtD,GAA2B,CAC7BrV,KAAM,CACF+f,MAAO,GACPxf,MAAO,EACPC,OAAQ,EACRigB,cAAe,EACfT,WAAY,EACZyc,iBAAa79B,GAEjBsjB,SAAU,GACVo5F,MAAO,GACP1pG,SAAS,EACTnE,MAAO,MAGE0uG,GAAwB,SACjCX,EACAt8F,GAEA,IAAMu8F,OAC+B78G,IAAjCs9G,GAAgBh9F,GACV,CAAC+8F,IADP,uBAGcC,GAAgBh9F,IAH9B,CAIU+8F,KAGd,OAAO,6BACAT,GADP,IAEIY,OAAQX,EAAOv2F,QAAO,SAACumD,EAAiCtsD,GAEpD,OADAssD,EAAItsD,GAASg4C,oBAAU9hD,IAChBo2D,IACR,OAME4wC,GAAmB,SAA2B15C,GAA3B,OAA8C,SAC1Eg5C,GAD0E,OAEzE,SAAChsG,EAAUisG,GACZ,IAAIC,EAAWlsG,EACPuP,EAAgByjD,EAAhBzjD,YACF5W,EAAS+yG,GAAkB,GAAD,OAAIn8F,EAAJ,WAA0B08F,GACpDz8F,EAAQ7W,EAAOkX,OAErB,IAAKL,EACD,OAAOw8F,EAAYE,EAAUvzG,GAGjC,OAAQA,EAAOO,MACX,IAAK,aACDgzG,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAU,GACVzJ,QAAS,SAIrB,MACJ,IAAK,YACDojG,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIEm8F,MAAM,aAAK3rG,EAAMysG,OAAOj9F,GAAO+C,gBAI3C,MACJ,IAAK,cACD,IAAIo6F,EAAoB,aAAO3sG,EAAMysG,OAAOj9F,GAAO+C,UAEnDo6F,EAAuB5lG,aACnB4lG,EACAh0G,EAAOgF,IAGXuuG,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAUo6F,QAItB,MACJ,IAAK,sBACDT,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAU5Z,EAAO4Y,UAI7B,MAEJ,IAAK,iBACD,IAAM86F,EAAkB1zG,EAAOi0G,SAE/BV,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAU85F,QAItB,MACJ,IAAK,mBACDH,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAU,SAItB,MACJ,IAAK,qBACD25F,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAUvS,EAAMysG,OAAOj9F,GAAOm8F,YAI1C,MAEJ,IAAK,aACDO,EAAQ,6BACDA,GADC,IAEJO,OAAO,6BACAzsG,EAAMysG,QADP,mBAEDj9F,EAFC,6BAGKxP,EAAMysG,OAAOj9F,IAHlB,IAIE+C,SAAU,GACVo5F,MAAO,GACP7iF,UAAW,SAO/B,OAAOkjF,EAAYE,EAAUvzG,M,UC9J3B+M,GAAiC,CACnCrV,KAAM,CACF+f,MAAO,GACPmnC,MAAO,GAEXhlC,SAAU,GACVo5F,MAAO,GACP1pG,SAAS,EACTnE,MAAO,MAGE+uG,GAA8B,SACvChB,EACAt8F,GAEA,IAAMu8F,OACqC78G,IAAvCmoD,KAAsB7nC,GAChB,CAAC4nC,MADP,uBAGcC,KAAsB7nC,IAHpC,CAIU4nC,OAGd,OAAO,6BACA00D,GADP,IAEIj0C,aAAck0C,EAAOv2F,QACjB,SAACumD,EAAuCtsD,GAEpC,OADAssD,EAAItsD,GAASg4C,oBAAU9hD,IAChBo2D,IAEX,OAOCgxC,GAAyB,SAClC95C,GADkC,OAEjC,SAACg5C,GAAD,OAA6B,SAAChsG,EAAUisG,GACzC,IAAIC,EAAWlsG,EACPuP,EAAgByjD,EAAhBzjD,YACF5W,EAAS+yG,GAAkB,GAAD,OACzBn8F,EADyB,iBAE5B08F,GAEEz8F,EAAQ7W,EAAOkX,OAErB,IAAKL,EACD,OAAOw8F,EAAYE,EAAUvzG,GAGjC,OAAQA,EAAOO,MACX,IAAK,mBACDgzG,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAU,GACVzJ,QAAS,SAIrB,MACJ,IAAK,kBACDojG,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJm8F,MAAM,aAAK3rG,EAAM43D,aAAapoD,GAAO+C,gBAIjD,MACJ,IAAK,oBACD,IAAIo6F,EAAoB,aAAO3sG,EAAM43D,aAAapoD,GAAO+C,UAEzDo6F,EAAuB5lG,aACnB4lG,EACAh0G,EAAOgF,IAGXuuG,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAUo6F,QAItB,MACJ,IAAK,4BACDT,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAU5Z,EAAO4Y,UAI7B,MAEJ,IAAK,uBACD,IAAM86F,EAAkB1zG,EAAOk/C,eAAe14C,KAAI,SAAAmS,GAAI,MAAK,CAAC9d,aAAc8d,EAAK3T,GAAI6jC,QAASlwB,EAAKkwB,SAAW,SAE5G0qE,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAU85F,QAItB,MACJ,IAAK,yBACDH,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAU,SAItB,MACJ,IAAK,2BACD25F,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAUvS,EAAM43D,aAAapoD,GAAOm8F,YAIhD,MAEJ,IAAK,mBACDO,EAAQ,6BACDA,GADC,IAEJt0C,aAAa,6BACN53D,EAAM43D,cADD,mBAEPpoD,EAFO,6BAGDxP,EAAM43D,aAAapoD,IAHlB,IAIJ+C,SAAU,GACVo5F,MAAO,GACP7iF,UAAW,SAO/B,OAAOkjF,EAAYE,EAAUvzG,MC7F3B+M,GAAkCkmG,GACpCY,GACI,CACItwD,KAAM,CACF9rC,MAAO,GACPmnC,MAAO,GAEXw1D,cAAe,GACf9qG,SAAS,EACT+qG,kBAAkB,EAClBC,iBAAiB,EACjBnvG,MAAO,IAEX,SAEJ,SAyESovG,GAAkBrlF,mBAC3BkkF,GAAkB,CAAEx8F,YAAa,UACjCm9F,GAAiB,CAAEn9F,YAAa,UAFLsY,EAtEH,WAAwC,IAAvC7nB,EAAsC,uDAA9B0F,GAAc/M,EAAgB,uCAC/D,OAAQA,EAAOO,MACX,KAAKgO,KACD,OAAO,6BACAlH,GADP,IAEIiC,SAAS,EACTnE,MAAO,GACP+oG,QAAQ,IAEhB,KAAK1/F,KACD,OAAO,6BACAnH,GADP,IAEIk8C,KAAMvjD,EAAOtI,KACb4R,SAAS,EACTnE,MAAO,KAEf,KAAKsJ,KACD,OAAO,6BACApH,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAKuJ,KACD,OAAO3B,GAEX,KAAKe,KAAQ+E,2BACT,IAAMujE,EAAe,aAAQ/uE,EAAM+sG,eAAiB,IAE9CI,EAAoBp+B,EAAgBjF,WACtC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOpL,UAQtC,OANI4/G,GAAqB,EACrBp+B,EAAgBq+B,OAAOD,EAAmB,GAE1Cp+B,EAAgBp5D,KAAKhd,EAAOpL,QAGzB,6BACAyS,GADP,IAEI+sG,cAAeh+B,IAEvB,KAAKtoE,KAAQiF,gCACT,OAAO,6BACA1L,GADP,IAEI+sG,cACIp0G,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOlD,QAAU,KAEhE,KAAKgR,KAAQ4H,kBACT,IAAM6tC,EAAI,6BACHl8C,EAAMk8C,MADH,IAEN9rC,MAAOpQ,EAAMk8C,KAAK9rC,MAAMjR,KAAI,SAAAmS,GAAS,IAAD,EAChC,OAAIA,EAAK3T,KAAOhF,EAAOpL,OACZ,6BACA+jB,GADP,IAEI5hB,OAAM,UAAE4hB,EAAK5hB,cAAP,aAAE,EAAa2hB,QACjB,SAAA5e,GAAO,OAAIA,IAAYkG,EAAOlG,aAGnC6e,OAGf,OAAO,6BACAtR,GADP,IAEIk8C,SAER,QACI,OAAOl8C,MAUNqtG,GAAqB,SAACrtG,GAAD,OAAqBA,EAAM5J,MAAM6L,SAG7DqrG,GAA2C,GAwC3CC,GAA8B,CAChC5nG,UAAM1W,EACN2W,WAAW,EACX9H,MAAO,IAgDE0vG,GAAe,SAACxtG,GAAD,OAAqBA,EAAMrJ,KAAKgP,MAC/C8nG,GAAiB,SAACztG,GAAD,OAAqBA,EAAMrJ,KAAKiP,WAUxD8nG,GAAgD9B,GAClDY,GACI,CACIn8G,KAAM,CACF+f,MAAO,GACPmnC,MAAO,GAEX5S,oBAAqB,GACrB1iC,SAAS,EACTnE,MAAO,IAEX,eAEJ,eAqFS6vG,GAAqB9lF,mBAC9BkkF,GAAkB,CAAEx8F,YAAa,gBACjCm9F,GAAiB,CAAEn9F,YAAa,gBAFFsY,EAzEI,WAGd,IAFpB7nB,EAEmB,uDAFX0tG,GACR/0G,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,KAAQuD,8BACT,OAAO,6BACAhK,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQyD,gCACT,OAAO,6BACAlK,GADP,IAEI3P,KAAMsI,EAAOvC,MACb6L,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ2D,gCACT,OAAO,6BACApK,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQoF,iCACT,IAAM+hG,EAAqB,aACnB5tG,EAAM2kC,qBAAuB,IAG/BkpE,EAA0BD,EAAsB9jC,WAClD,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOiT,gBAQtC,OANIiiG,GAA2B,EAC3BD,EAAsBR,OAAOS,EAAyB,GAEtDD,EAAsBj4F,KAAKhd,EAAOiT,cAG/B,6BACA5L,GADP,IAEI2kC,oBAAqBipE,IAE7B,KAAKnnG,KAAQsF,sCACT,OAAO,6BACA/L,GADP,IAEI2kC,oBACIhsC,EAAOkQ,SAAWlQ,EAAOmQ,QACnBnQ,EAAOsD,cACP,KAElB,KAAKwK,KAAQ8H,0BACT,IAAMle,EAAI,6BACH2P,EAAM3P,MADH,IAEN+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAAAmS,GAAS,IAAD,EAChC,OAAIA,EAAK3T,KAAOhF,EAAOpL,OACZ,6BACA+jB,GADP,IAEI5hB,OAAM,UAAE4hB,EAAK5hB,cAAP,aAAE,EAAa2hB,QACjB,SAAA5e,GAAO,OAAIA,IAAYkG,EAAOlG,aAGnC6e,OAGf,OAAO,6BACAtR,GADP,IAEI3P,SAER,QACI,OAAO2P,MASb8tG,GAAsD,GAqCtDC,GAA8BnC,GAGhCY,GACIK,GACI,CACI5qG,SAAS,GAEb,eAEJ,eAEJ,eA+HS+rG,GAAyBnmF,mBAGlCkkF,GAAkB,CAAEx8F,YAAa,gBACjCm9F,GAAiB,CAAEn9F,YAAa,gBAChCu9F,GAAuB,CAAEv9F,YAAa,gBALJsY,EA1GlC,WAGwB,IAFxB7nB,EAEuB,uDAFf+tG,GACRp1G,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAKuN,KAAQoE,2BACT,OAAO,6BACA7K,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQuE,6BACT,OAAO,6BACAhL,GADP,IAEI3P,KAAMsI,EAAOoS,QACb9I,SAAS,IAEjB,KAAKwE,KAAQyE,6BACT,OAAO,6BACAlL,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQoB,+BACT,OAAO,6BACA7H,GADP,IAEIiuG,oBAAoB,EACpBnwG,MAAO,KAEf,KAAK2I,KAAQuB,iCACT,OAAO,6BACAhI,GADP,IAEI+H,YAAapP,EAAOoP,YACpBkmG,oBAAoB,EACpBnwG,MAAO,KAEf,KAAK2I,KAAQyB,iCACT,OAAO,6BACAlI,GADP,IAEIiuG,oBAAoB,EACpBnwG,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQ2B,kCACT,OAAO,6BACApI,GADP,IAEIkuG,4BAA4B,EAC5BpwG,MAAO,KAEf,KAAK2I,KAAQ6B,oCACT,OAAO,6BACAtI,GADP,IAEIykE,oBAAqB9rE,EAAOoP,YAAYqI,MACxC89F,4BAA4B,EAC5BpwG,MAAO,KAEf,KAAK2I,KAAQ+B,oCACT,OAAO,6BACAxI,GADP,IAEIkuG,4BAA4B,EAC5BpwG,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQiC,kDACT,IAAMylG,EAAW,aAAQnuG,EAAM08C,qBAAuB,IAEhD0xD,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEI08C,oBAAqByxD,IAE7B,KAAK1nG,KAAQsC,uDACT,OAAO,6BACA/I,GADP,IAEI08C,oBACI/jD,EAAOkQ,SAAWlQ,EAAOmQ,QACnBnQ,EAAOiQ,sBACP,KAGlB,KAAKnC,KAAQ6E,4BACT,OAAO,6BACAtL,GADP,IAEI43D,aAAa,6BACN53D,EAAM43D,cADD,IAER5gE,cAAe,CACX3G,KAAMsI,EAAOtI,KACbkiB,SAAU,GACVo5F,MAAO,GACP1pG,SAAS,EACTnE,MAAO,QAIvB,KAAK2I,KAAQ2E,uBACT,OAAO2iG,GAEX,QACI,OAAO/tG,MAYbquG,GAAmE,GAoCnEC,GAA0B,CAC5Bj+G,KAAM,CACF+f,MAAO,IAEXm+F,aAAc,CACVn+F,MAAO,IAEXo+F,eAAgB,GAChBvsG,SAAS,EACTnE,MAAO,IA4GL2wG,GAAgD,GAqChDC,GAA8C,CAChDr+G,KAAM,GACN4R,SAAS,EACTnE,MAAO,IAuCE6wG,GAAuB,SAAC3uG,GAAD,OAAqBA,EAAM4uG,aAAav+G,MAItEw+G,GAAoD,CACtDx+G,UAAMpB,EACN6/G,mBAAe7/G,EACfgT,SAAS,EACTnE,MAAO,IAyEEixG,GAA0B,SAAC/uG,GAAD,OAAqBA,EAAMgvG,gBAAgB3+G,MACrE4+G,GAAkC,SAACjvG,GAAD,OAAqBA,EAAMgvG,gBAAgBF,eAC7EI,GAA4B,SAAClvG,GAAD,OAAqBA,EAAMgvG,gBAAgB/sG,SCv4BvEktG,GAAqD,CAC9D,iBAAoB,mCACpB,oBAAuB,oD,SCAd38E,GAAQt0B,IAAOC,IAAV,6GAMLixG,GAAOlxG,IAAOC,IAAV,4LAQJylG,GAAc1lG,IAAOC,IAAV,0HAOXkxG,GAAkBnxG,IAAOC,IAAV,gDCRtBmxG,GAAwBpxG,IAAOC,IAAV,4EAKrBoxG,GAAgCrxG,IAAOC,IAAV,uDAI7B4mE,GAAa7mE,IAAO0nB,KAAV,+RAQH,SAAAxnB,GAAK,OAAIA,EAAMoxG,gBACd,SAAApxG,GAAK,OAAIA,EAAMoxG,gBAGX,SAAApxG,GAAK,OACfA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOiE,aACnB+X,EAAMyK,QACNzK,EAAMI,MAAMpc,OAAO+D,cACnBiY,EAAMI,MAAMpc,OAAOiE,gBAGvB,SAAA+X,GAAK,OACHA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOU,SACnBsb,EAAMyK,QACNzK,EAAMI,MAAMpc,OAAOI,YACnB4b,EAAMI,MAAMpc,OAAOQ,cAG/B+uC,GAAczzB,IAAOyD,MAAV,2XAUH,SAAAvD,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aACxC,SAAA1D,GAAK,OAAIA,EAAMzB,SACd,SAAAyB,GAAK,OAAIA,EAAMxB,UAGnB,SAAAwB,GAAK,OACHA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOU,SACnBsb,EAAMyK,QACNzK,EAAMI,MAAMpc,OAAOI,YACnB4b,EAAMI,MAAMpc,OAAOQ,cACb,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,YAIrCkiF,IACE,SAAA3mE,GAAK,OACVA,EAAM0D,SAAW1D,EAAMoxG,aAAepxG,EAAMoxG,aAAe,MAIjE7vD,GAAczhD,IAAO+zB,MAAV,2PAQCN,GAAeozC,IAM3B0qC,GAAkBvxG,IAAOC,IAAV,4EAoDNuxG,GA/CiC,SAAC,GAU1C,IATHtwG,EASE,EATFA,MACAuC,EAQE,EARFA,MACA8mB,EAOE,EAPFA,SACA5f,EAME,EANFA,QACA/G,EAKE,EALFA,SACAlF,EAIE,EAJFA,OACAD,EAGE,EAHFA,MACA6yG,EAEE,EAFFA,aACAptG,EACE,EADFA,SAOA,OACI,eAACktG,GAAD,WACI,eAACC,GAAD,WACI,cAAC5vD,GAAD,CACI92C,QAASA,EACTlL,GAAE,wBAAmByB,GACrBlG,KAAK,WACLuvB,SAZK,SAAClF,GACdzhB,GACJ2mB,EAASlF,IAWGlkB,YAAW+C,IAEf,cAACuvB,GAAD,CACIwzD,QAAO,wBAAmB/lF,GAC1ByJ,QAASA,EACTjM,OAAQA,GAAkB,GAC1BD,MAAOA,GAAgB,GACvB6yG,aAAcA,GAA8B,GAC5C1tG,SAAUA,EACVzC,YAAW+C,GAAQ,UAAOA,EAAP,UAPvB,SASI,cAAC2iE,GAAD,CACIl8D,QAASA,EACT2mG,aAAcA,GAA8B,GAC5C1tG,SAAUA,SAItB,cAAC2tG,GAAD,UAAkB9tG,QC5GfguG,I,GClCAC,GDOf,YAOiC,IAN7BC,EAM4B,EAN5BA,gBACAxtG,EAK4B,EAL5BA,MACAukC,EAI4B,EAJ5BA,YACA/9B,EAG4B,EAH5BA,QACA/G,EAE4B,EAF5BA,SACA2mB,EAC4B,EAD5BA,SAEA,OAAO,qCACH,cAAC,GAAD,UAAQpmB,IACR,eAAC+sG,GAAD,WACI,cAAC,GAAD,UAAcxoE,IACd,cAACyoE,GAAD,UACI,cAAC,GAAD,CACIjwG,MAAOywG,EACPlzG,MAAO,GACPC,OAAQ,GACR4yG,aAAc,GACd3mG,QAASA,EACT/G,SAAUA,EACV2mB,SAAUA,aE3BjBqnF,GAAiB5xG,IAAOC,IAAV,mICmCZ4xG,OAhCf,YAI4B,IAHxBnqG,EAGuB,EAHvBA,UACAwK,EAEuB,EAFvBA,MACA4/F,EACuB,EADvBA,SAEA,OAAIpqG,IAAcwK,EAEV,cAAC0/F,GAAD,UACI,cAAC,KAAD,MAIR,0CACK1/F,QADL,IACKA,OADL,EACKA,EAAOjR,KAAI,SAAAmS,GACR,MAAkB,YAAdA,EAAKpY,KAED,cAAC02G,GAAD,CACIC,gBAAiBv+F,EAAK8d,IAEtB/sB,MAAOiP,EAAKjP,MACZukC,YAAat1B,EAAKs1B,YAClB/9B,QAASyI,EAAKvN,MACdjC,SAAUwP,EAAKy6D,SACftjD,SAAU,kBAAMunF,EAAS1+F,EAAK8d,OALzB9d,EAAK8d,KAQf,WC0CR6gF,ICvEHC,GCAGC,GFcf,YAAkE,IAA/B5iH,EAA8B,EAA9BA,OACzB2K,EAAcsf,YAAYu3F,IAC1BD,EAAgBt3F,YAAYy3F,IAC5BrpG,EAAY4R,YAAY03F,IACxBkB,EAAiBrsE,eACjBssE,EAAmBpsE,eACnBj0B,EAAcnQ,cAEduQ,EAAQ+L,mBACV,yBACIjkB,QADJ,IACIA,OADJ,EACIA,EAAaiH,KAAI,SAAAmxG,GAAe,IAAD,IACrBC,EAAY,OAAGzB,QAAH,IAAGA,GAAH,UAAGA,EAAeryE,MAChC,SAAAnrB,GAAI,OAAIA,EAAK8d,MAAQkhF,EAAWlhF,cADlB,aAAG,EAElBrrB,MACH,MAAO,CACHqrB,IAAKkhF,EAAWlhF,IAChBl2B,KAAMo3G,EAAWp3G,KACjBmJ,MAAK,UAAE8sG,GAA2BmB,EAAWlhF,YAAxC,QAAgD,GACrDwX,YAAa0pE,EAAW1pE,YACxB7iC,MAAK,OAAEwsG,QAAF,IAAEA,IAAgBD,EAAWvsG,MAClCgoE,SAAkC,qBAAjBwkC,QAG7B,CAACr4G,EAAa42G,IAGZ0B,EAAetiH,uBACjB,SAACkhC,GACG,IAAM9d,EAAI,OAAGlB,QAAH,IAAGA,OAAH,EAAGA,EAAOqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK8d,MAAQA,KAC9C,GAAK9d,EAAL,CACA,IAAMm/F,GAAYn/F,EAAKvN,MACvBssG,EAAiB9iH,EAAQ6hC,EAAKqhF,GAAU,WACpCzgG,EAAY,2BAAD,OAEHygG,EAAW,UAAY,YAE3B,iBAIZ,CAACljH,EAAQ6iB,EAAOigG,EAAkBrgG,IAQtC,OALAwR,qBAAU,WACN4uF,EAAe7iH,KAEhB,IAGC,cAAC,GAAD,CACIqY,UAAWA,EACXwK,MAAOA,EACP4/F,SAAUQ,K,sCClEVN,K,4BAAAA,E,iCAAAA,Q,KAKL,I,iLAAMQ,GAAmB9/E,IAAM/tB,cAClC,I,wFEFE8tG,GAAoBzyG,YAAOypC,eAAkBmK,KAA2BC,KAApD7zC,CAAH,+CACV,SAAAE,GAAK,OAAKA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOC,SAGhEwvD,GAAa3zC,IAAOC,IAAV,4JACF,SAAAC,GAAK,OAAIA,EAAMxB,UAChB,SAAAwB,GAAK,OAAKA,EAAMzB,MAAQyB,EAAMzB,MAAQ,KAAO,UA4B3Ci0G,GAbVhyG,gBAAK,YAAmD,IAAhDhC,EAA+C,EAA/CA,OAAQD,EAAuC,EAAvCA,MAAOuE,EAAgC,EAAhCA,MAAO1E,EAAyB,EAAzBA,UAAW8F,EAAc,EAAdA,QAC1C,OACI,cAACuvC,GAAD,CACIj1C,OAAQA,GAAkB,GAC1BD,MAAOA,EACP2F,QAASA,EACT9F,UAAWA,EAJf,SAMI,cAACm0G,GAAD,CAAmBzvG,MAAOA,SCHvB2vG,GA7BWv0G,sBACtB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,oBACIS,KAAK,OACLC,SAAS,UACT2zB,OAAO,eACPkyC,YAAY,IAJhB,UAMI,sBACI5lE,EAAE,kBACF4zB,UAAU,oCAEd,sBAAM5zB,EAAE,YAAY4zB,UAAU,2BCEnCguC,GAxBM/iE,sBACjB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLK,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BANf,SAQI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,yUACF4zB,UAAU,kCCZzBy/E,GAAwB5yG,IAAOC,IAAV,gOAGd,SAAAC,GAAK,OAAKA,EAAM2yG,OAAS,OAAS,UAQzCC,GAAgB9yG,IAAOC,IAAV,mEAKb8yG,GAAc/yG,IAAOC,IAAV,gEAKX+yG,GAAgBhzG,IAAOC,IAAV,4JACR,SAAAC,GAAK,OAAKA,EAAM0tE,OAAS,uBAAyB,UAOvDqlC,GAAejzG,IAAOC,IAAV,2LASZizG,GAAalzG,IAAOC,IAAV,gHAOVkzG,GAAoBnzG,IAAOC,IAAV,6FAMjBmzG,GAAmBpzG,IAAOC,IAAV,6DAIhBozG,GAAmBrzG,YAAOszG,GAAPtzG,CAAH,mEAKhBuzG,GAAmBvzG,YAAO2yG,GAAP3yG,CAAH,gDAIhBwzG,GAAmBxzG,IAAOC,IAAV,0UAgBhBwzG,GAAiBzzG,IAAOC,IAAV,kIAOdyzG,GAAc1zG,IAAOC,IAAV,qKAQX0zG,GAAiB3zG,IAAOC,IAAV,4BAEd2zG,GAAc5zG,IAAOC,IAAV,0KAGL,SAAAC,GAAK,OAAKA,EAAM0tE,OAAS,OAAS,UAMxCimC,GAAkB7zG,IAAOC,IAAV,yIAOf6zG,GAAkB9zG,IAAOC,IAAV,uIAOf2hD,GAAa5hD,IAAOC,IAAV,4FAMV8zG,GAAO/zG,YAAOkrC,UAAPlrC,CAAH,wqBAEG,SAAAE,GAAK,OAAKA,EAAM2yG,OAAS,OAAS,UAuBhD,SAAA3yG,GAAK,OACHA,EAAM2yG,QAAN,4EAUK1xC,GAAQnhE,IAAOC,IAAV,+KAED,SAAAC,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAOlDqxG,GAAYh0G,IAAOC,IAAV,yJAKhB,SAAAC,GAAK,OAAKA,EAAM+zG,UAAY,wBAC5B,SAAA/zG,GAAK,QAAMA,EAAM+zG,UAAY,4CChLtBC,GAA0CxzG,gBACnD,YAUO,IATHjN,EASE,EATFA,KACMqN,EAQJ,EARF+C,KACYswG,EAOV,EAPFC,WACA1zE,EAME,EANFA,IACAmyE,EAKE,EALFA,OACAwB,EAIE,EAJFA,aACAC,EAGE,EAHFA,YACA3xG,EAEE,EAFFA,SACA4xG,EACE,EADFA,YAEMz8F,EAAWC,cACXy8F,EAAWxkH,uBACb,SAACykH,GAAD,OACIA,KACGH,GAAqC,MAAtBx8F,EAASukC,YACxBg4D,GAAgBA,EAAa3iG,SAASoG,EAASukC,YACtD,CAACi4D,EAAax8F,EAAUu8F,IAGtBK,EAAiB1kH,uBACnB,SAACooE,GAAD,OAAuBo8C,IAAWp8C,KAClC,CAACo8C,IAEL,OACI,eAACT,GAAD,CACItnE,GAAI/L,EACJi0E,gBAAiB,YACjBH,SAAUE,EACV7B,SAAUA,EACV1xG,YAAA,kBAAsB0rE,oBAAUp5E,IALpC,UAOI,cAACmuD,GAAD,CAAYz9C,MAAO1Q,EAAnB,SACK+gH,EAAS18F,EAASukC,SAAS7kC,QAAQkpB,IAAQ,GACxC,cAACyzE,EAAD,IAEA,cAACrzG,EAAD,OAGN+xG,GAAU,cAAC,GAAD,CAAOlwG,SAAUA,EAAjB,SAA4BlP,IACvC8gH,GAAe,cAACP,GAAD,CAAWC,UAAWpB,U,SCmBvC+B,GAhEKx2G,sBAChB,WAAkCC,GAAS,IAAxCC,EAAuC,EAAvCA,UAAWC,EAA4B,EAA5BA,OAAQ2F,EAAoB,EAApBA,SAClB,OACI,sBACI7F,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,cACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BACXuC,YAAW+C,EARf,YAUO3F,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,wBAAQ+8D,GAAG,MAAMC,GAAG,SAAS9iD,EAAE,eAGvC,mBAAGna,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,wBAAQ+8D,GAAG,MAAMC,GAAG,MAAM9iD,EAAE,eAGpC,mBAAGna,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,wBAAQ+8D,GAAG,MAAMC,GAAG,UAAU9iD,EAAE,qB,6DCrD3C2zD,GAAYC,cAA8B,SAAA9sE,GAAK,MAAK,CAC7Du0G,kBAAmB,CACfp2G,MAAO,gBAAGq2G,EAAH,EAAGA,YAAH,OACHA,EAAW,UAAMA,EAAN,MAAwB,SACvCrqC,UAAW,kCACXr7C,QAAS,WACTvsB,aAAc,iBACd0oF,MAAO,gBAAGwpB,EAAH,EAAGA,WAAH,gBAAuBA,GAAc,KAArC,kBACPvpB,OAAQ,gBAAGupB,EAAH,EAAGA,WAAH,gBAAuBA,EAAa,MAAO,QAA3C,gBACR5zD,UAAW,gBAAGA,EAAH,EAAGA,UAAH,OACPA,EAAS,UAAMA,EAAN,iBAAiC,mBAC9C/oC,WAAY,QAEhB48F,OAAQ,CACJ/oB,OAAQ,EACR,kCAAmC,CAC/BzlB,IAAK,EACL1lB,KAAM,EACNmrC,OAAQ,EACRxtF,MAAO,MACPC,OAAQ,MACR,YAAa,CACTu2G,YAAa,gBACb1hF,YAAY,0DAGpB,+BAAgC,CAC5Bi4D,OAAQ,EACR1qC,KAAM,EACN3T,aAAc,SACd8+C,OAAQ,EACRxtF,MAAO,MACPC,OAAQ,MACR,YAAa,CACTu2G,YAAa,gBACb1hF,YAAY,wDACZk3C,UAAU,2JAMlB,iCAAkC,CAC9B3pB,KAAM,EACNltB,WAAY,SACZq4D,OAAQ,EACRvtF,OAAQ,MACRD,MAAO,MACP,YAAa,CACTw2G,YAAa,gBACb1hF,YAAY,wDACZk3C,UAAU,2JAMlB,gCAAiC,CAC7B8gB,MAAO,EACP9sB,YAAa,SACbwtB,OAAQ,EACRvtF,OAAQ,MACRD,MAAO,MACP,YAAa,CACTw2G,YAAa,gBACb1hF,YAAY,wDACZk3C,UAAU,4JAQtBj7C,MAAO,CACHktC,SAAU,WACV/5D,SAAU,GAEV,YAAa,CACThC,QAAS,KACTusE,OAAQ,OACR40B,QAAS,QACTrjG,MAAO,EACPC,OAAQ,EACRw2G,YAAa,cAKZC,GAAoBn1G,IAAOC,IAAV,iOAKxB,qBAAGm1G,oBAAyB,mBAKrB,SAAAl1G,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACvB,SAAAyb,GAAK,OACfA,EAAMC,OAASD,EAAMk1G,mBAArB,oBACmBl1G,EAAMI,MAAMpc,OAAOQ,YAChC,UACU,SAAAwb,GAAK,OACrBA,EAAMC,OAASD,EAAMk1G,mBACfl1G,EAAMI,MAAMpc,OAAOqC,SACnB,WAGDid,GAASxD,IAAOC,IAAV,2HAON2wD,GAAgB5wD,IAAOC,IAAV,yMCnHpB+hG,GAAOjiF,EAAQ,KAERs1F,GAA4C,SAAC,GAanD,IAZH3xG,EAYE,EAZFA,SACAy9C,EAWE,EAXFA,UACA2zD,EAUE,EAVFA,YACAC,EASE,EATFA,WACAO,EAQE,EARFA,OACAlyG,EAOE,EAPFA,OAOE,IANFmyG,iBAME,SALFC,EAKE,EALFA,SACAC,EAIE,EAJFA,mBACAvxG,EAGE,EAHFA,SACAwxG,EAEE,EAFFA,UACAC,EACE,EADFA,WAEM3nC,EAAUb,GAAU,CACtB2nC,cACA3zD,YACA4zD,eAEEa,EAAoBzwF,iBAAuB,MAC3C0wF,EAAiB7T,KAPrB,EAS0C7+E,oBAAkB,GAT5D,mBASK2yF,EATL,KASqBC,EATrB,OAU8B5yF,mBAAkB,MAVhD,mBAUK6yF,EAVL,KAUeC,EAVf,KA2BI/zG,EAAc,SAChB+3C,GAGI27D,EAAkB7lF,SAClB6lF,EAAkB7lF,QAAQmrB,SAA1B,OAAmCjB,QAAnC,IAAmCA,OAAnC,EAAmCA,EAAO5E,SAK9C0gE,GAAkB,IAoBtB,OAhBAzyF,qBAAU,WACN,IAAM4yF,EAAsBl1E,SAASwmD,eACjC,2BAOJ,OAJmB,OAAnB0uB,QAAmB,IAAnBA,KAAqB17D,iBAAiB,UAAU,SAAAP,GAC5C/3C,OAGG,WACgB,OAAnBg0G,QAAmB,IAAnBA,KAAqBv7D,oBAAoB,UAAU,SAAAV,GAC/C/3C,UAGT,IAGC,qCACI,cAAC,GAAD,CACI7D,IAAKu3G,EACLn2G,GAAE,wBAAmBo2G,GACrBM,gBACIL,EAAc,sBAAkBD,QAAmB9kH,EAEvDqlH,gBAAeN,EAAiB,YAAS/kH,EACzCslH,gBAAc,OACdjyG,QAAS,SAACihB,GAAD,OAAQswF,IAA2BtwF,EAjD9CC,uBACNywF,GAAkB,SAAAO,GAAQ,OAAKA,OAiDvBh4G,UAAU,wBACV6C,YAAW+C,GAAQ,UAAOA,EAAP,WAVvB,SAYI,cAAC0sD,GAAD,WACM4kD,GACE,cAACL,GAAD,CACIh1G,OAAQm1G,GAAUQ,EAClBV,qBAAsBhyG,EACtB9E,UAAU,qBAHd,SAKK8E,GAAkB,cAAC,GAAD,UAKnC,cAACmzG,GAAA,EAAD,CACIp2G,KAAM21G,EACNhmF,SAAU8lF,EAAkB7lF,QAC5BzxB,UAAW0vE,EAAQgnC,OACnBwB,UAAW,CACPhnF,MAAO,CACHsB,SAAUykF,EACVp6D,QAAS66D,IAGjBN,UAAWA,IAAwBX,EAAa,kBAAchkH,GAVlE,SAYK,gBAAG0lH,EAAH,EAAGA,gBAAH,OACG,qCACMlB,EAEE,KADA,sBAAMj3G,UAAW0vE,EAAQx+C,MAAOnxB,IAAK43G,IAEzC,cAACS,GAAA,EAAD,6BAAUD,GAAV,aACI,cAACtoC,GAAA,EAAD,CAAmBngC,YAAa9rC,EAAhC,SACI,cAACy0G,GAAA,EAAD,CACIC,cAAed,EACfr2G,GAAE,sBAAiBo2G,GACnBgB,kBAAA,wBAAkChB,GAClC10G,YAAA,UAAc+C,EAAd,SACA5F,UAAWw4G,KACP9oC,EAAQ6mC,kBACRY,GAEJrxG,QAAS,SAAC61C,GACNA,EAAM30B,kBACNpjB,EAAY+3C,IAXpB,SAeKv2C,mBCtIxBqzG,GAAgBrkF,IAAM/tB,cAAoC,ICAjEolG,GAAO/pG,IAAOC,IAAV,qUCNgC,IDepC,SAAAC,GAAK,OAAIA,EAAM0D,UAAN,0BAEO,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAG5B,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAI5C2rE,GAAUvwD,IAAO0nB,KAAV,4FAGA,SAAAxnB,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACJ,YAAfwb,EAAMlF,KACNkF,EAAMI,MAAMpc,OAAOW,OACnBqb,EAAMI,MAAMpc,OAAOkB,SAIpB4xH,GAKR,SAAC,GAA4D,IAA1D11C,EAAyD,EAAzDA,YAAa59D,EAA4C,EAA5CA,SAAUU,EAAkC,EAAlCA,QAASR,EAAyB,EAAzBA,SAAUM,EAAe,EAAfA,SAC9C,OACI,cAAC6yG,GAAcjP,SAAf,UACK,SAAAxtC,GAAO,OACJ,cAAC,GAAD,CACIl2D,QAAO,+GAAE,SAAAihB,GACDzhB,IACA02D,EAAQvf,YAAYuf,EAAQvf,YAAW,GACvC32C,GAASA,EAAQihB,OAEzBzhB,SAAUA,EACVzC,YAAW+C,EAPf,SASI,cAAC,GAAD,CACIlJ,KAAMsmE,EAAc,eAAYvwE,EAChC6S,SAAUA,EAFd,SAIKF,U,aEtDZ1D,YAAO86C,KAAP96C,CAAH,uDAIIA,IAAOC,IAAV,4PAOE,SAAAC,GAAK,OAAKA,EAAM40G,YAAc50G,EAAM40G,YAAc,OAK7C,SAAA50G,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,S,OChBxC8yH,GAAkBj3G,IAAOC,IAAV,kGAMfi3G,GAAoBl3G,YAAOwnG,GAAPxnG,CAAH,qEAEV,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC0yH,GAAkBn3G,YAAOwnG,GAAPxnG,CAAH,oFAGf,SAAAE,GAAK,OACHA,EAAM0D,UAAN,0DAGS1D,EAAMI,MAAMpc,OAAOO,UAH5B,cAsBO2yH,GAXV,SAAC,GAA8C,IAA5CtpE,EAA2C,EAA3CA,SAAUD,EAAiC,EAAjCA,UAAWwpE,EAAsB,EAAtBA,gBACzB,OACI,eAACJ,GAAD,WACI,cAACC,GAAD,CAAmB9yG,QAAS0pC,EAAU5pC,SAAS,wBAA/C,oBACA,cAACizG,GAAD,CAAiB/yG,QAASypC,EAAWjqC,SAAUyzG,EAAiBnzG,SAAS,sBAAzE,sBChCCozG,GAAW,WACpB,IAAMC,EAAYpyF,mBAKlB,MAAO,CAACoyF,EAJS,WACb,IAAMC,EAAYD,EAAUxnF,QAC5BynF,GAAaA,EAAUnrD,W,SCFzBorD,GAAaz3G,YAAOokB,KAAPpkB,CAAH,gIA4BD03G,GAhBV,SAAC,GAAmC,IAAjCjkH,EAAgC,EAAhCA,KAAMkkH,EAA0B,EAA1BA,QAASrxB,EAAiB,EAAjBA,WACnB,OACI,cAACmxB,GAAD,CACI/4G,OAAO,OACP+mB,WAAW,OACXsmC,WAAW,EACX9B,YAAY,aACZvkC,UAAW,IACX7f,MAAOpS,EACPqyB,aAAc,SAAAT,GAAC,OAAIsyF,EAAQtyF,EAAEgwB,OAAOxvC,QACpCygF,WAAYA,EACZpiF,SAAS,8B,oBCxBf0zG,GAAgB53G,IAAOC,IAAV,+FAMb43G,GAAoB73G,IAAOC,IAAV,yGAEK,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAIlDgxH,GAAoB93G,IAAOC,IAAV,4FAGV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAY1BixH,GATW,WACtB,OACI,eAACH,GAAD,WACI,cAACC,GAAD,IACA,cAACC,GAAD,2CCzBNE,GAAa,SAACC,EAAmB/mF,GACnC,QAAK+mF,EAAG/mF,KACD+mF,EAAG/mF,MAAQA,GAGTgnF,GAAe,SAACD,GAAD,OAAuBD,GAAWC,EAAI,UACrDE,GAAa,SAACF,GAAD,OAAuBD,GAAWC,EAAI,W,oCCCnD9qC,GAAYC,cAA8B,SAAA9sE,GAAK,MAAK,CAC7Du0G,kBAAmB,CACfp2G,MAAO,gBAAGq2G,EAAH,EAAGA,YAAH,OACHA,EAAW,UAAMA,EAAN,MAAwB,SACvCrqC,UAAW,kCACXr7C,QAAS,WACTvsB,aAAc,iBACd0oF,MAAO,kBACPpqC,UAAW,gBAAGA,EAAH,EAAGA,UAAH,OACPA,EAAS,UAAMA,EAAN,iBAAiC,kBAC9CvtB,WAAY,mBACZxb,WAAY,qBAEhB48F,OAAQ,CACJ/oB,OAAQ,YAIHmsB,GAAoBp4G,IAAOC,IAAV,gLAKjB,SAAAC,GAAK,OACVA,EAAM0D,SAAW,mBAAqB,uBAE7B,SAAA1D,GAAK,OACVA,EAAM0D,SAAW,mBAAqB,uBAIrC6f,GAA+BzjB,IAAOC,IAAV,4BAE5ByjB,GAAuB1jB,IAAOC,IAAV,wEAGlB,SAAAC,GAAK,OAAKA,EAAMyjB,SAAW,QAAU,UAIvC00F,GAA4Br4G,IAAOC,IAAV,mDAIzB2jB,GAAmB5jB,IAAOC,IAAV,sHACd,SAAAC,GAAK,OAAKA,EAAM2lB,SAAW,OAAS,UAMtChC,GAAiB7jB,YAAO8jB,KAAP9jB,CAAH,yEAKd+jB,GAAqB/jB,IAAOC,IAAV,4KAQzB,SAAAC,GAAK,OAAIA,EAAM0D,UAAY,0BAGpBogB,GAAiBhkB,IAAOC,IAAV,2HAOdgkB,GAAgBjkB,IAAOC,IAAV,oEAKbikB,GAA8BlkB,IAAOC,IAAV,4CAI3BkkB,GAAqBnkB,YAAOokB,KAAPpkB,CAAH,kNAWzB,SAAAE,GAAK,OAAIA,EAAMylB,UAAN,0BAGF2yF,GAA0Bt4G,IAAOC,IAAV,gDAIvBqkB,GAAsBtkB,IAAOC,IAAV,2jBAe1B2jB,IACa,SAAA1jB,GAAK,OAAKA,EAAMmU,SAAW,OAAS,SAEjD8P,GAAuBH,IACZ,SAAA9jB,GAAK,OACVA,EAAMmU,UAAYnU,EAAMqkB,UAAYrkB,EAAMskB,SACpC,oBACA,UAEJZ,GAGAO,GAA8BH,IAQ/Bu0F,GAAkBv4G,IAAOC,IAAV,6EClEbu4G,GAtEqC,SAAAt4G,GAAU,IAEtDwD,EAOAxD,EAPAwD,SACAoyG,EAMA51G,EANA41G,eACA2C,EAKAv4G,EALAu4G,WACAv2G,EAIAhC,EAJAgC,YACA4yG,EAGA50G,EAHA40G,YACA3zD,EAEAjhD,EAFAihD,UACAv9C,EACA1D,EADA0D,SAGEoqE,EAAUb,GAAU,CAAE2nC,cAAa3zD,cACnCy0D,EAAoBzwF,iBAAuB,MAmBjD,OAhBA7B,qBAAU,WACN,IAAMo1F,EAA4B13E,SAASwmD,eACvC,+BAOJ,OAJyB,OAAzBkxB,QAAyB,IAAzBA,KAA2Bl+D,iBAAiB,UAAU,SAAAP,GAClD/3C,OAGG,WACsB,OAAzBw2G,QAAyB,IAAzBA,KAA2B/9D,oBAAoB,UAAU,SAAAV,GACrD/3C,UAGT,CAACA,IAGA,eAACk2G,GAAD,CACI/5G,IAAKu3G,EACLn2G,GAAE,2BACF02G,gBACIL,EAAc,8BAA8B/kH,EAEhDqlH,gBAAeN,EAAiB,YAAS/kH,EACzCslH,gBAAc,OACdzyG,SAAUA,EACVQ,QAASq0G,EATb,UAWI,cAAC,GAAD,IACC3C,GACG,cAACS,GAAA,EAAD,CACIp2G,KAAM21G,EACNhmF,SAAU8lF,EAAkB7lF,QAC5BzxB,UAAW0vE,EAAQgnC,OAHvB,SAKK,gBAAGyB,EAAH,EAAGA,gBAAH,OACG,cAACC,GAAA,EAAD,6BAAUD,GAAV,aACI,cAACtoC,GAAA,EAAD,CAAmBngC,YAAa9rC,EAAhC,SACI,cAACy0G,GAAA,EAAD,CACIC,cAAed,EACfr2G,GAAE,yBACFo3G,kBAAA,2BACAv4G,UAAW0vE,EAAQ6mC,kBAJvB,SAMKnxG,gBCjBxBi1G,GAAwC,SAAC,GAkB/C,IAjBHl1G,EAiBE,EAjBFA,MACAoQ,EAgBE,EAhBFA,UACA+kG,EAeE,EAfFA,cACAl0F,EAcE,EAdFA,YACAyB,EAaE,EAbFA,kBACA0yF,EAYE,EAZFA,YACAC,EAWE,EAXFA,cACAC,EAUE,EAVFA,gBACAC,EASE,EATFA,YACAC,EAQE,EARFA,YACAt0F,EAOE,EAPFA,eACAC,EAME,EANFA,oBACAC,EAKE,EALFA,gBACAjc,EAIE,EAJFA,eACA27D,EAGE,EAHFA,gBACA20C,EAEE,EAFFA,gBACAp0F,EACE,EADFA,cAEMwnF,EAA8BvzF,eADlC,EAGsCoK,oBAAS,GAH/C,mBAGKqhD,EAHL,KAGmBC,EAHnB,OAIgCthD,mBAAS1f,EAAMhQ,MAJ/C,mBAIK0lH,EAJL,KAIgBC,EAJhB,OAKsCj2F,mBAAS,IAL/C,mBAKKk2F,EALL,KAKmBC,EALnB,KAOIv0F,EAAkBnc,EAAe8I,SAASjO,EAAMhE,IAChDulB,EAA2Bpc,EAAe8I,UAAUjO,EAAMhE,IAE1D85G,EACAT,GAAiBA,EAAcr5G,KAAOgE,EAAMhE,GACxCq5G,EAAc1zG,KACd,OAEJo0G,EAAoD,UAAX,OAAbV,QAAa,IAAbA,OAAA,EAAAA,EAAe1zG,MAC3C6f,EAAaL,EAAoBlT,SAASjO,EAAMhE,IAhBpD,EAkB2B63G,KAlB3B,mBAkBKpyF,EAlBL,KAkBeu0F,EAlBf,KAoBIp1F,EAAc,SAAC5gB,GACjB,OAAOA,GAASA,EAAMC,UAAYD,EAAMC,SAASiP,OAAS,GAGxD+mG,EAA6B,SAC/BP,EACA3nH,EACA+C,GAEA,SAAK/C,IAAWA,EAAOkS,WACNlS,EAAOkS,SACQyP,QAC5B,SAAC1P,GAAD,OAAkBA,EAAMhQ,OAAS0lH,GAAa11G,EAAMhE,KAAOlL,KAEzCoe,OAAS,GAG7BgnG,EAAsBD,EAA2BL,EAAc51G,GAC/Dm2G,EAAsBD,GAAuBN,EAAa1mG,OAAS,EAEnEknG,EAAqBH,EACvBP,EACAtlG,GACIA,EAAUV,QAAO,SAAAgwD,GAAM,OAAIA,EAAO1jE,KAAOgE,EAAM8Q,YAAU,GAC7D9Q,EAAMhE,IAEJq6G,EAAoBD,GAAsBV,EAAUxmG,OAAS,EAE7DyS,EAAqBjP,eAQrBgD,EAAck5B,eACpB/uB,qBAAU,WAEFkhD,GACArrD,EAAYzH,SAASjN,KAAgBwgE,sBAErCV,EAAgB37D,GAChB67D,GAAgB,MAErB,CACC77D,EACA47D,EACAC,EACAF,EACAprD,IAGJ,IAAM4gG,EAAkB,WACpBd,EAAYx1G,EAAMhE,GAAI,CAClBhM,KAAM0lH,EACN5kG,SAAU9Q,EAAM8Q,WAEf+W,MAAK,WACFytF,OAEHvtF,OAAM,WACH4tF,EAAa31G,EAAMhQ,MACnBslH,QAaNiB,GAAiB,WACnBhB,EAAY,CACRvlH,KAAM4lH,EACN9kG,SAAU9Q,EAAMhE,KAEpB65G,EAAgB,IAChBP,KAIEkB,GAAoBjqH,uBACtB,SAACiqD,GACGA,EAAM30B,kBACNgnF,EAA4B,CACxB7+D,WAAY,gBACZ/E,YACI,mGACJiF,kBAAmB,UACnBC,iBAAkB,SAClBC,UAAW,WACPgrE,EAAYp1G,GACZ0iB,GAAkB,MAG1BA,GAAkB,KAEtB,CAAC0yF,EAAap1G,EAAO6oG,EAA6BnmF,IAGtD,OACI,qCACI,eAAC1C,GAAD,WACI,eAACa,GAAD,CACIngB,MAAOg1G,EACP9kG,SACI0Q,GACAC,GACAN,EAEJH,SAAuB,SAAbg1F,EACV/0F,SAAUo0F,GAAiBA,EAAclnG,SAASjO,EAAMhE,IAR5D,UAUI,eAACskB,GAAD,CACI3f,QAAS,kBAAMugB,EAAelhB,EAAMhE,KACpCmE,UAAWygB,EAAY5gB,GACvBtC,YAAA,8BAAkC0rE,oBAC9BssC,IAJR,UAOI,cAACn1F,GAAD,UACKK,EAAY5gB,IACT,cAACwgB,GAAD,UACKW,EAAoBlT,SAASjO,EAAMhE,IAChC,cAAC8lB,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,QAKhB,cAACtB,GAAD,UACI,cAACC,GAAD,CACI9lB,IAAK6mB,EACLxmB,OAAQ,OACRmH,MAAOszG,EACPrzF,aAAc,SAACT,GAAD,OACV+zF,EAAa/zF,EAAEgwB,OAAOxvC,QAE1BygF,WAAY,SAAAjhE,GACJ6yF,GAAa7yF,KAAOy0F,GACpBC,KAGRt0F,WAAW,cACXC,UAAW,IACXC,SAAuB,SAAb4zF,SAItB,eAAC31F,GAAD,CAAkBiC,SAAUnB,EAA5B,UACI,cAACb,GAAD,CACIlZ,QACIoa,GAAmBC,EAEvBpa,QAASoa,EACTc,aAnIK,WACzB,IAAMxR,EAAa0B,aAAWnC,GAC9BgR,EAAgBO,EAAmB3hB,EAAOmF,EAAgB0L,IAC1DmwD,GAAgB,IAiIIpgE,KAAM,GACNT,SAAUkhB,EACV1M,WAAYn0B,IAAUC,OAAOgB,KAC7B6gC,OAAQ9hC,IAAUC,OAAOO,YAE7B,cAAC,KAAD,CACI00B,YAAa,CACT1U,KAAgBy1G,aAChBz1G,KAAgB01G,aAChB11G,KAAgB21G,cAEpBhhG,iBAAkB,cAACk/F,GAAD,IANtB,SAQI,eAAC,GAAD,CACIxC,eAAgBpxF,EAChB+zF,WAAY,kBACPe,GACDrzF,GAAkB,IAEtBjkB,YAAa,kBAAMikB,GAAkB,IACrCviB,SAAU41G,EAPd,UASK/1G,EAAM06C,aAAe,GAClB,cAAC,KAAD,CACIhlC,YAAa,CACT1U,KAAgB01G,cAFxB,SAKI,cAAC,GAAD,CACI/1G,QAAS,SAAAihB,GACLA,EAAEC,kBA5H1Ca,GAAkB,GAClB4yF,EAAgB,CACZt5G,GAAIgE,EAAMhE,GACV2F,KAAM,QAEV8zG,EAAgBz1G,EAAMhE,KAqHU,+BAUR,cAAC,KAAD,CACI0Z,YAAa,CAAC1U,KAAgBy1G,cADlC,SAGI,cAAC,GAAD,CACI91G,QAAS,SAAAihB,GACLA,EAAEC,kBACFa,GAAkB,GAClB4yF,EAAgB,CACZt5G,GAAIgE,EAAMhE,GACV2F,KAAM,SAEVq0G,KARR,yBAcJ,cAAC,KAAD,CACItgG,YAAa,CAAC1U,KAAgB21G,cADlC,SAGI,cAAC,GAAD,CACI94C,aAAa,EACbl9D,QAAS61G,GAFb,uCAWN,SAAbV,GACG,gCACKM,GAAsB,cAAC,GAAD,IACvB,cAACxB,GAAD,UACI,cAAC,GAAD,CACIxqE,UAAWksE,EACX1C,gBAAiByC,EACjBhsE,SAAU,WACNsrE,EAAa31G,EAAMhQ,MACnBslH,YAMN,QAAbQ,GACG,eAAChB,GAAD,WACI,cAAC,GAAD,CACI9kH,KAAM4lH,EACN1B,QAAS2B,EACThzB,WAAY,SAAAjhE,GACJ6yF,GAAa7yF,KAAOu0F,GACpBI,QAIXL,GAAuB,cAAC,GAAD,IACxB,cAAC,GAAD,CACI9rE,UAAWmsE,GACX3C,gBAAiBuC,EACjB9rE,SAAU,WACNwrE,EAAgB,IAChBP,aAMnB10F,EAAY5gB,IACT,cAACigB,GAAD,CACIC,SAAUsB,EADd,SAGKxhB,EAAMC,SAAUzC,KAAI,SAAC+kB,GAAD,OACjB,cAAC,GAAD,CAEIviB,MAAOuiB,EACPpB,oBAAqBA,EACrBhc,eAAgBA,EAChB6L,WACIhR,EAAMC,UACND,EAAMC,SAASzC,KAAI,SAAAwC,GAAK,OAAIA,EAAMhE,MAEtCqlB,cAAeA,GARVkB,EAAWvmB,aAiBtC46G,GAMD,SAAC,GAAmE,IAAjE52G,EAAgE,EAAhEA,MAAOmhB,EAAyD,EAAzDA,oBAAqBhc,EAAoC,EAApCA,eAAgBkc,EAAoB,EAApBA,cAAoB,EAC5C3B,oBAAS,GADmC,mBAC7DhjB,EAD6D,KACvD+lB,EADuD,KAE9D2yF,EAAc5sF,eAEdpY,EAAY8W,eAEZgxE,EAAoB9oE,eACpBkmF,EAAkBtqF,eAClBuqF,EAAc7tF,eACd8tF,EAAcltF,eAEdpH,EAAiBsI,eACjBisF,EAAkB7rF,eAClBitF,EAAoBztF,eACpBhI,EAAkB0I,eAClBg3C,EAAkBp4C,eAExB,OACI,cAAC,GAAD,CACI1oB,MAAOA,EACPm1G,cAAe/kG,EAAU+kG,cACzB/kG,UAAWA,EAAU1hB,MAAQ0hB,EAAU1hB,KAAK+f,MAC5CwS,YAAavkB,EACb04G,YAAaA,EACb1yF,kBAAmBD,EACnBgzF,gBAAiBA,EACjBJ,cAAend,EAAkBmd,cACjCC,gBAAiBA,EACjBC,YAAaA,EACbC,YAAaA,EACbt0F,eAAgBA,EAChBC,oBAAqBA,EACrB01F,kBAAmBA,EACnBz1F,gBAAiBA,EACjB0/C,gBAAiBA,EACjB37D,eAAgBA,EAChBkc,cAAeA,KAKZu1F,MCraTj0F,GAAmBpmB,IAAOC,IAAV,gFAKhBomB,GAA2BrmB,IAAOC,IAAV,iDAIxBs6G,GAKD,SAAC,GAAoE,IAAlE/oH,EAAiE,EAAjEA,OAAQozB,EAAyD,EAAzDA,oBAAqBhc,EAAoC,EAApCA,eAAgBkc,EAAoB,EAApBA,cACjD,OAAKtzB,GAAWA,GAA4B,IAAlBA,EAAOmhB,OAAsB,KAEnD,cAACyT,GAAD,UACI,cAACC,GAAD,UACK70B,GACGA,EAAOyP,KAAI,SAAAwC,GACP,OACI,cAAC,GAAD,CAEIA,MAAOA,EACPmhB,oBAAqBA,EACrBhc,eAAgBA,EAChBkc,cAAeA,GAJVrhB,EAAMhE,YA6B5B+6G,GAXV,SAAC,GAAoE,IAAlEhpH,EAAiE,EAAjEA,OAAQozB,EAAyD,EAAzDA,oBAAqBhc,EAAoC,EAApCA,eAAgBkc,EAAoB,EAApBA,cACjD,OACI,cAAC,GAAD,CACItzB,OAAQA,EACRozB,oBAAqBA,EACrBhc,eAAgBA,EAChBkc,cAAeA,K,SC3CrByzF,GAAkBv4G,IAAOC,IAAV,uDAsDNw6G,GA9CV,SAAC,GAAuC,IAArCC,EAAoC,EAApCA,UAAWC,EAAyB,EAAzBA,WAAYnpH,EAAa,EAAbA,OAAa,EACN2xB,mBAAS,IADH,mBACjCg2F,EADiC,KACtBC,EADsB,OAEFj2F,oBAAS,GAFP,mBAEjCy3F,EAFiC,KAEpBC,EAFoB,KAGlCC,GAAoBF,GAAezB,EAAU7/E,OAAO3mB,OAAS,EACnE2Q,qBAAU,WACN,GAAK9xB,EAAL,CACA,IAAMupH,EAAiBvpH,EAAO2hB,QAC1B,SAAC1P,GAAD,OAAkBA,EAAMhQ,OAAS0lH,IAAc11G,EAAM8Q,YAEzDsmG,EAAeE,EAAepoG,OAAS,MACxC,CAACnhB,EAAQ2nH,IAEZ,IAAM6B,EAAoB,WACtBN,GACIA,EAAU,CAAEjnH,KAAM0lH,IACb7tF,MAAK,SAAApsB,GACFy7G,IACAvB,EAAa,OAEhB5tF,OAAM,SAAAnG,QAGnB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CACI5xB,KAAM0lH,EACNxB,QAASyB,EACT9yB,WAAY,SAAAjhE,GACJ6yF,GAAa7yF,KAAOy1F,GACpBE,QAIVJ,GAAe,cAAC,GAAD,IACjB,cAAC,GAAD,CACI9sE,SAAU,WACNsrE,EAAa,IACbuB,KAEJtD,gBAAiByD,EACjBjtE,UAAWmtE,Q,oBCrDrBj2D,GAAoB/kD,IAAOC,IAAV,iIAOjB8mB,GAA2B/mB,IAAOC,IAAV,yJAQxB+kD,GAAehlD,IAAOC,IAAV,8GAGL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInCoiC,GAAgB9mB,IAAOC,IAAV,sHAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInCu2H,GAAsBj7G,IAAOC,IAAV,uHAEZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAqB1BgiC,GAhBK,WAChB,OACI,cAACq+B,GAAD,UACI,eAACh+B,GAAD,WACI,cAACi+B,GAAD,UACI,cAACr+B,GAAA,EAAD,MAEJ,cAACG,GAAD,gCACA,cAACm0F,GAAD,+D,qBCxCT,SAASC,GAAmBr1G,GAC/B,IAAMxH,EAAM8mB,mBAIZ,OAHA7B,qBAAU,WACNjlB,EAAI0xB,QAAUlqB,KAEXxH,EAAI0xB,QASR,SAASorF,GAAgBt1G,EAAUu1G,GACtC,IAAMC,EAAgBH,GAAgBr1G,GAEtC,SAAKw1G,GAAiBD,KAGd1kF,KAAM7wB,EAAOw1G,GAAiBA,G,gCCS7BC,GAA4B5oF,IAAM/tB,eAC3C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS+7G,KACZ,OAAOjiG,YAAY1U,qBAAW02G,IAA4B3oF,WAWvD,IAUK6oF,GAVCC,GAAuC/oF,IAAM/tB,eACtD,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASk8G,KACZ,OAAOpiG,YAAY1U,qBAAW62G,M,SAGtBD,K,yBAAAA,E,sBAAAA,E,eAAAA,Q,KAoBL,IAAMG,GAA0BjpF,IAAM/tB,eACzC,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASo8G,KACZ,OAAOtiG,YAAY1U,qBAAW+2G,KAwB3B,IAAME,GAAyCnpF,IAAM/tB,eACxD,WACI,MAAM,IAAInF,MAAM,sBAUjB,IAAMs8G,GAAkCppF,IAAM/tB,eACjD,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASu8G,KACZ,OAAOziG,YAAY1U,qBAAWk3G,KAqB3B,IAAME,GAA8BtpF,IAAM/tB,eAC7C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASy8G,KACZ,OAAO3iG,YAAY1U,qBAAWo3G,KAW3B,IAAME,GAAsCxpF,IAAM/tB,eACrD,WACI,MAAM,IAAInF,MAAM,sBAkBjB,IAAM28G,GAAiCzpF,IAAM/tB,eAChD,WACI,MAAM,IAAInF,MAAM,sBAsBjB,IAAM48G,GAAwC1pF,IAAM/tB,eACvD,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS68G,KACZ,IAAMC,EAAW13G,qBAAWw3G,IAG5B,MAAO,CAFO9iG,YAAYgjG,GACT16G,eAgBd,IAAM26G,GAAuC7pF,IAAM/tB,eACtD,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASg9G,KACZ,OAAOljG,YAAY1U,qBAAW23G,K,8FCxPtBh0G,G,sCCgEN4e,GAAqBnnB,IAAOC,IAAV,6FAMlBw8G,GAAqBz8G,IAAOC,IAAV,8DAIlBo0F,GAAcr0F,YAAOokB,KAAPpkB,CAAH,mIAMX,SAAAE,GAAK,QACDA,EAAMw8G,kBAAR,sDAGSx8G,EAAMw8G,iBAHf,yCAQFt1F,GAAmBpnB,IAAOC,IAAV,6FAMhBonB,GAAgBrnB,IAAOC,IAAV,0LASb08G,GAAuB38G,IAAOC,IAAV,gKAQpB28G,GAAsB58G,IAAOC,IAAV,4FAGZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCo4H,GAAsB78G,IAAOC,IAAV,0OAKZ,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOI,eAEhB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAEvC,SAAA2Y,GAAK,OAAIA,EAAM0D,UAAY,0BAG3Bk5G,GAAoB98G,IAAOC,IAAV,oPAQD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAG5C,SAAAgb,GAAK,OAAIA,EAAM0D,UAAN,0BAGTmkB,GAAc/nB,IAAOgoB,EAAV,qFAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGnC44H,GAAkB/8G,IAAOC,IAAV,+DAIfsnG,GAAiBvnG,YAAOwD,IAAPxD,CAAH,oLAUdg9G,GAAmBh9G,IAAOC,IAAV,iQAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxC84H,GAA4Bj9G,IAAOC,IAAV,4RAOThc,IAAUC,OAAOwD,YAKjBzD,IAAUC,OAAOwD,aAIjC6+B,GAAYvmB,IAAOC,IAAV,gQAMG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QACtB,SAAAgb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAGxB,SAAAgb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAIlDqc,GAAOd,IAAOC,IAAV,oKASJ6pD,GAAa9pD,YAAO+pD,KAAP/pD,CAAH,iEAEH,SAAAE,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAO0D,eACnBsY,EAAMI,MAAMpc,OAAOO,aAK3By4H,GA0BD,SAAC,GAwBC,IAvBH1rH,EAuBE,EAvBFA,OACAqiB,EAsBE,EAtBFA,UACA+Q,EAqBE,EArBFA,oBACAhc,EAoBE,EApBFA,eACAwM,EAmBE,EAnBFA,eACA4jG,EAkBE,EAlBFA,YACAjnG,EAiBE,EAjBFA,aACAglF,EAgBE,EAhBFA,cACA1rF,EAeE,EAfFA,WACAovB,EAcE,EAdFA,QACA0iF,EAaE,EAbFA,YACAtqH,EAYE,EAZFA,WACA27B,EAWE,EAXFA,oBACAsqF,EAUE,EAVFA,cACAC,EASE,EATFA,gBACAl0F,EAQE,EARFA,gBACAu4F,EAOE,EAPFA,kBACAC,EAME,EANFA,UACAC,EAKE,EALFA,YACAC,EAIE,EAJFA,YACAh5C,EAGE,EAHFA,gBACAz/C,EAEE,EAFFA,cACA/gB,EACE,EADFA,QACE,EAC0Bof,oBAAS,GADnC,mBACShjB,EADT,KACe+lB,EADf,OAE0C/C,oBAAS,GAFnD,mBAESqhD,EAFT,KAEuBC,EAFvB,KAIQr7C,EAAoBnL,mBACtB,kBAAMjI,aAAWkU,aAAW14B,GAAUA,EAAO0gB,UAC7C,CAAC1gB,IANP,EASgD2xB,mBAAStwB,GATzD,mBASS2qH,EATT,KAS0BC,EAT1B,KAUQC,EAA+Bz/F,mBACjC,kBAAMssC,mBAAS/7B,EAAqBg8B,QACpC,CAACh8B,IAECmvF,EAAyB3tH,uBAC3B,SAAC6V,EAAO+3G,GACJH,EAAmB53G,GACf+3G,EACAF,EAA6B73G,GAE7B2oB,EAAoB3oB,KAE5B,CAAC63G,EAA8BlvF,IAG7B+qF,EACAT,IAAkBA,EAAcr5G,GAAKq5G,EAAc1zG,KAAO,OAE1D2xB,EAAoC,CACtClkC,WAAYA,EACZ6V,QAAS,GACT3V,QAAS,GACTJ,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAlCrB,EAyCMkkB,aAAqBC,GAHrB5lC,EAtCN,EAsCMA,aACAg4B,EAvCN,EAuCMA,cACA4P,EAxCN,EAwCMA,oBAEE8kF,EAAwB1C,GAAahqH,GAE3CmyB,qBAAU,WACFu6F,GACA9rG,EAAa5gB,KAElB,CAAC4gB,EAAc5gB,EAAcspC,EAASojF,IAEzCv6F,qBAAU,WACN6F,EAAct2B,KACf,CAACA,EAAYs2B,IAEhB,IAAMhQ,EAAck5B,eACpB/uB,qBAAU,WAEFkhD,GACArrD,EAAYzH,SAASjN,KAAgBwgE,sBAErCV,EAAgB37D,GAChB67D,GAAgB,MAErB,CACC77D,EACA47D,EACAC,EACAF,EACAprD,IAGJmK,qBAAU,WACN,GAAIzwB,EAAW8f,OAAS,EAAG,CACvB,IAAMmrG,EACFtsH,GACAA,EAAO0gB,MACFiB,QAAO,SAAC1P,GACL,QAASA,EAAM/T,QAElBuR,KAAI,SAACwC,GAAD,OAAkBA,EAAM/T,MAAQ+T,EAAM/T,KAAKmtD,MAAM,QAC9D,GAAIihE,GAAoBA,EAAiBnrG,OAAS,EAO9C,IANA,IAAMorG,EAAY,GAAGC,OAAOv1D,MAAM,GAAIq1D,GAEhCG,EAAY,IAAI3oG,IAClByoG,EAAU5qG,QAAO,SAACC,GAAD,MAA2B,KAATA,MAGvC,MAAerS,MAAMyU,KAAKyoG,GAA1B,eAAsC,CAAjC,IAAIx+G,EAAE,KACP89G,EAAYxnG,OAAOtW,QAIhC,CAAC5M,EAAYrB,EAAQ+rH,IAExBj6F,qBAAU,WACFyzE,GAAeh+D,MACpB,CAACg+D,EAAeh+D,IAEnB,IAAM3T,EAAqBvO,eACrBqnG,EAAqB/C,GAAatnG,GAExCyP,qBAAU,WACN,IAAMhP,EAAa0B,aAAWnC,GAE1BqqG,GACAnnB,IACgB,WAAf1rF,GAA0C,WAAfA,KAE5BwZ,EACIO,EACI2xE,EACAnuF,EACA0L,EACAjJ,IAIRo5D,GAAgB,MAErB,CACC5wD,EACAkjF,EACA1rF,EACA+Z,EACAxc,EACAic,EACAq5F,IAEJ56F,qBAAU,WACF46F,GAAsBnnB,GAAgC,WAAf1rF,GACpB,WAAfA,GACA+xG,EACIhoG,EAAejC,QACX,SAAA5e,GAAO,OAAIA,IAAYwiG,EAAct3F,SAKtD,CACCs3F,EACA1rF,EACA+J,EACAgoG,EACAc,IAOJ,IAAMC,GAAmB,WACrB,QACM3sH,GACFA,EAAO0gB,MAAMS,OAAS,GACtB6qG,EAAgB7qG,OAAS,IACxB5O,GAIT,OAAIA,IAAYvS,GAAUqB,EAAW8f,OAAS,EACnC,cAAC,KAAD,IAIP,eAACwU,GAAD,WACI,cAACs1F,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC3yD,GAAD,CAAYlmD,SAAUu6G,SAE1B,cAAC9pB,GAAD,CACI5uE,WAAW,UACX/mB,OAAQ,OACRmH,MAAO23G,EACP13F,aAAc,SAACT,GACXs4F,EAAuBt4F,EAAEgwB,OAAOxvC,OAAO,IAE3C62G,iBACIyB,KACMl6H,IAAUC,OAAOO,UACjBR,IAAUC,OAAOQ,WAE3Bkf,SAAUu6G,KACVzzD,WAAY,WACRizD,EAAuB,IAAI,IAE/Bz5G,SAAS,qCAIrB,eAACkjB,GAAD,WACI,eAACC,GAAD,WACI,cAACU,GAAD,CAAa5mB,YAAU,6BAAvB,uBACC3P,GAAUA,EAAO0gB,MAAMS,OAAS,GAC7B,cAACmqG,GAAD,CACI14G,QAAS,kBAAM8hB,GAAQ,IACvB/kB,YAAU,sBAFd,SAII,cAAC,GAAD,MAGPhB,GACG,cAACguE,GAAA,EAAD,CACIngC,YAAa,kBAAM9nB,GAAQ,IAD/B,SAGI,eAAC82F,GAAD,WACI,cAAC,GAAD,CACI54G,QAAS,SAAAihB,GACLA,EAAEC,kBACFg4F,IACAp3F,GAAQ,IAJhB,0BASA,cAAC,GAAD,CACI9hB,QAAS,SAAAihB,GACLA,EAAEC,kBACF+3F,IACAn3F,GAAQ,IAJhB,gCAahB,eAACy2F,GAAD,WACI,eAACC,GAAD,CAAqBz7G,YAAU,kCAA/B,UACKyH,GAAkBA,EAAe+J,OAAS,EACrC/J,EAAeuK,QAAO,SAAAtU,GAAC,OAAIA,EAAI,KAAG8T,OAClC,KAAM,IAHhB,qBAMA,cAACkqG,GAAD,CACIz4G,QAAS,WACL+4G,IACA14C,GAAgB,IAEpB7gE,WACMgF,GAAkBA,EAAe+J,OAAS,GAEhDxR,YAAU,uBARd,sBAaHtO,EAAW8f,OAAS,GACrBnhB,GACAA,EAAO0gB,MAAMS,OAAS,EAClB,cAAC,GAAD,IAEA,eAACsqG,GAAD,CAA2Bx9G,GAAG,8BAA9B,UACI,cAAC,GAAD,CACIjO,OAAQwlB,aAAWoS,GACnBxE,oBAAqBA,EACrBhc,eAAgBA,EAChBkc,cAAeA,IAEnB,cAAC,KAAD,CACI3L,YAAa,CAAC1U,KAAgB01G,cADlC,SAGI,eAAC4C,GAAD,WACkB,SAAbxD,GACG,cAAC,GAAD,CACImB,UAAW1B,EACX2B,WAAY5B,EACZvnH,OAAQA,GAAUA,EAAO0gB,QAGjC,qBAAK/Q,YAAU,qBAAf,SACI,eAAC,GAAD,CACIN,QAAQ,cACRpG,OAAQ,kBACJs+G,EAAgB,CACZt5G,GAAI,KACJ2F,KAAM,UAGdxB,SAAuB,SAAb21G,EARd,UAUI,qCAVJ,gCAgGzB6E,GA1E0B,WACrC,IAAMt8G,EAAQ6oB,eACRhX,EAAaT,eAAyB/gB,KACtCwpG,EAAoB9oE,eACpBkkE,EAAgBhkE,eAChB0H,EAAUnhB,YAAYkhB,MAEtBw+E,EAAc7tF,eAEdpZ,EAAe2Z,eACf2yF,EAAwB/oE,aAAmBvjC,EAAc,GAEzDyc,EAAsBD,eACtBwqF,EAAkBtqF,eAClB81C,EAAkBp4C,eAClBmyF,EAAY/wF,eACZ4vF,EAAc3vF,eAEd6vF,EAAYvvF,eACZyvF,EAAclwF,eACdiwF,EAAc1vF,eACd/I,EAAkB0I,eAClB6vF,EAAoB1vF,eAEpB6wF,EAAejlG,YAAY61F,IAC3BqP,EAAqB93E,eAAsB3iC,QAC3C06G,EAAmB5/D,eAA2B96C,QAC9C26G,EAAoBv/D,eAA4Bp7C,QAChD46G,EAAqBrgE,eAA4Bv6C,QACjD66G,EAAiBrD,KAAgBx3G,QACjC86G,EAAqB9C,KAAsBh4G,QAC3C+6G,EAA4B7C,KAA4Bl4G,QAExDg7G,EACFR,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EAEJ,OACI,cAAC,GAAD,CACIttH,OAAQsQ,EAAM3P,KACd0hB,UAAWF,EAAWzB,MACtB0S,oBAAqB9iB,EAAMk9G,eAC3Bp2G,eAAgB9G,EAAMuS,UAAY,GAClCe,eAAgBtT,EAAMsT,gBAAkB,GACxC6pG,eAAgBn9G,EAAMo9G,iBACtBntG,aAAcssG,EACd95C,gBAAiBA,EACjBwyB,cAAeA,EAAc5kG,KAC7BkZ,WAAY0rF,EAAc1rF,WAC1BovB,QAASA,EACT6jF,UAAWA,EACXnB,YAAaA,EACbnE,YAAaA,EACbnmH,WAAY8oG,EAAkB9oG,WAC9B27B,oBAAqBA,EACrBsqF,cAAend,EAAkBmd,cACjCC,gBAAiBA,EACjBl0F,gBAAiBA,EACjBu4F,kBAAmBA,EACnBC,UAAWA,EACXC,YAAaA,EACbC,YAAaA,EACbz4F,cAAei6F,EACfh7G,QAASjC,EAAMiC,W,uCClmBdo7G,GAAuB,WAChC,IAAM99G,EAAWO,cACXw9G,EAAgB9rH,cAChBwe,EAAcnQ,cACpB,OAAO3R,uBACH,SAACuD,GAEG,OADA8N,EAASwgD,gBACFu9D,EAAc7rH,GAChB+3B,MAAK,SAAAn5B,GAEF,OADAkP,EAASygD,aAAwB3vD,IAC1BA,KAEVq5B,OAAM,SAAC5rB,GACJyB,EAAS0gD,aAAwBniD,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU+9G,EAAettG,KAIrButG,GAA8B,WACvC,IAAMC,EAA6BvrH,cAC7B+d,EAAcnQ,cACdN,EAAWO,cACjB,OAAO5R,uBAAY,SAACuD,GAEhB,OADA8N,EAAS2gD,gBACFs9D,EAA2B/rH,GAC7B+3B,MAAK,SAAAn5B,GAEF,OADAkP,EAAS4gD,aAAyB9vD,IAC3BA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAkS,EAAYlS,EAAMgB,QAAS,SAC3BS,EAAS6gD,aAAyBtiD,EAAMgB,UAClChB,OAEf,CAACyB,EAAUi+G,EAA4BxtG,KA+CjCytG,GAAgC,WACzC,IAAMl+G,EAAWO,cACX49G,EAAyB9rH,cACzBoe,EAAcnQ,cAOpB,OAAO3R,uBACH,SAACuD,EAAmBksH,GAChBp+G,EAASkhD,gBACTi9D,EAAuBjsH,GAClB+3B,MAAK,SAACpsB,GACHmC,EAASmhD,aAA6BtjD,IAC9B,OAARugH,QAAQ,IAARA,KAAWvgH,MAEdssB,OAAM,SAAC5rB,GACJyB,EAASohD,aAA6B7iD,EAAMgB,UAC5CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUm+G,EAAwB1tG,K,SCzIrCyU,GAAYvmB,YAAO86C,KAAP96C,CAAH,uDAITgiF,GAAoBhiF,YAAO8sC,KAAO7sC,IAAdD,CAAH,4PAIL,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAEjC,SAAA+b,GAAK,OAAKA,EAAMzB,MAAQyB,EAAMzB,MAAQ,WAIjC,SAAAyB,GAAK,OAAKA,EAAMihD,UAAN,UAAqBjhD,EAAMihD,UAA3B,MAA2C,UAKjEygB,GAAc5hE,IAAOC,IAAV,0QAKK,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAK5B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAGrCk5H,GAOR,SAAC,GAQC,IAPHh8G,EAOE,EAPFA,SACAvD,EAME,EANFA,KACA46C,EAKE,EALFA,WACAz8C,EAIE,EAJFA,UACA6iD,EAGE,EAHFA,UACA1iD,EAEE,EAFFA,MACAkhH,EACE,EADFA,WAEA,OACI,cAAC,GAAD,CACIx/G,KAAMA,EACN46C,WAAYA,EACZC,OAAQ,CAAE0hB,SAAU,YAHxB,SAKI,eAACslB,GAAD,CACI1jF,UAAWA,EACXkwC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClB0S,UAAWA,EACX1iD,MAAOA,EACP0C,YAAU,wBANd,UAQKw+G,EACD,cAAC/9C,GAAD,UAAcl+D,UCjExBk8G,GAAqB5/G,IAAOC,IAAV,qHACX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAQnC6lD,GAAgBjrC,YAAOkrC,UAAPlrC,CAAH,2XACN,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAUxB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAGvB,SAAAqb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAG5B,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAI5Ck7H,GAAU50E,GAAc60E,cAAc,KACtCz/G,GAAaL,IAAOC,IAAV,qHACF,SAAAC,GAAK,OAAIA,EAAM6/G,UAAY,MAC5B,SAAA7/G,GAAK,OAAIA,EAAM6/G,UAAY,MAK3BC,GAWR,SAAC,GAWC,IAVHvsH,EAUE,EAVFA,KACAitC,EASE,EATFA,IACM5/B,EAQJ,EARF+C,KACAo8G,EAOE,EAPFA,OACAC,EAME,EANFA,YACAC,EAKE,EALFA,WACAC,EAIE,EAJFA,SACA9hH,EAGE,EAHFA,UACAyhH,EAEE,EAFFA,SACA37G,EACE,EADFA,QAEI0T,EAAWC,cACTsoG,EAAgBv/G,GAClB,cAACT,GAAD,CAAY0/G,SAAUA,EAAtB,SACI,cAACj/G,EAAD,MAIR,OAAIo/G,EAEI,cAACN,GAAD,CAAoBthH,UAAWA,EAAW6C,YAAU,mBAApD,SACI,eAAC0+G,GAAD,CAAS3+E,KAAMR,EAAKpiC,UAAW2hH,EAAS,WAAa,GAAI5qE,OAAO,QAAQl0C,YAAU,mBAAlF,UACI1N,EAAM4sH,OAKbF,EAED,cAACP,GAAD,CAAoBthH,UAAWA,EAAW6C,YAAU,mBAApD,SACI,eAAC0+G,GAAD,CAAS3+E,KAAMR,EAAKpiC,UAAW2hH,EAAS,WAAa,GAAI9+G,YAAU,mBAAnE,UACI1N,EAAM4sH,OAKbD,EAED,cAACR,GAAD,CAAoBthH,UAAWA,EAAW6C,YAAU,mBAApD,SACI,eAAC8pC,GAAD,CACI0pE,gBAAgB,WAChBr2G,UAAW2hH,EAAS,WAAa,GACjCxzE,GAAI,CACA4P,SAAU3b,EACV5+B,MAAO,CAAEsW,WAAYN,IAEzB3W,YAAU,mBAPd,UASKk/G,EACA5sH,OAOb,cAACmsH,GAAD,CAAoBx7G,QAASA,EAASjD,YAAU,mBAAhD,SACI,eAAC8pC,GAAD,CACI0pE,gBAAgB,WAChBr2G,UAAW2hH,EAAS,WAAa,GACjCxzE,GAAI/L,EACJv/B,YAAU,mBAJd,UAMKk/G,EACA5sH,QCpHJi0F,GAAiB1nF,IAAOC,IAAV,6KAKrB,SAAAC,GAAK,OAAIA,EAAMC,MAAN,sCAKFmgH,GAAWtgH,IAAOC,IAAV,iDAIRsgH,GAAWvgH,IAAOC,IAAV,yGAMRugH,GAAWxgH,IAAOC,IAAV,yLASR0nF,GAA4B3nF,IAAOC,IAAV,4IAQzBwgH,GAAkBzgH,IAAOC,IAAV,kLASfygH,GAAkB1gH,IAAOC,IAAV,yJCDb0gH,GA7BVjgH,gBAAK,YAAiC,IAA9BkH,EAA6B,EAA7BA,QAASzH,EAAoB,EAApBA,KAAM4D,EAAc,EAAdA,QAClBG,EAAW,oBAEjB,OACI,eAACwjF,GAAD,CAAgBvnF,KAAMA,EAAtB,UACI,cAACwnF,GAAD,UACI,cAACp8C,GAAA,EAAD,CAAmB3jC,QAASA,EAASvD,KAAM,KAAMH,SAAQ,UAAKA,EAAL,eAE7D,cAACo8G,GAAD,UAEQv8G,EACE,qCACE,cAAC28G,GAAD,IACA,cAACD,GAAD,OAGJ,qCACI,eAACD,GAAD,CAAUr/G,YAAA,UAAc+C,EAAd,SAAV,UACK0D,EAAQ+2B,UADb,IACyB/2B,EAAQi3B,YAEjC,cAAC0hF,GAAD,CAAUp/G,YAAA,UAAc+C,EAAd,SAAV,SACKkC,aAAcwB,gB,oBNrC/BW,K,gDAAAA,E,kDAAAA,E,mDAAAA,Q,KOUL,IAAMq4G,GAAgCluF,IAAM/tB,eAC/C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAASqhH,KACZ,OAAOvnG,YAAY1U,qBAAWg8G,KCN3B,I,MAAME,GAA0B,WACnC,IAAMz/G,EAAWO,cACXm/G,EAAmB7pH,eACnB4a,EAAcnQ,cACpB,OAAO3R,uBAAY,WACfqR,ERTG,CACHrG,KAAMuN,GAAQy4G,wBQSdD,IACKz1F,MAAK,SAAAn5B,GACFkP,ERPT,SAA8BlP,GACjC,MAAO,CACH6I,KAAMuN,GAAQ04G,wBACd9uH,QQIiB+uH,CAAqB/uH,OAEjCq5B,OAAM,SAAC5rB,GACJyB,ERHT,SAA8BzB,GACjC,MAAO,CACH5E,KAAMuN,GAAQ44G,wBACdvhH,SQAiBwhH,CAAqBxhH,EAAMgB,UACpCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAU0/G,EAAkBjvG,KCE9BuvG,GAAyBrhH,IAAOC,IAAV,0PAYtBqhH,GAAathH,IAAOC,IAAV,mOAGJ,SAAAC,GAAK,OAAIA,EAAM4gD,QACT,SAAA5gD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAmBjCo9H,GAOR7gH,gBAAK,YAAyE,IAAD,EAArEkH,EAAqE,EAArEA,QAAS45G,EAA4D,EAA5DA,WAAYC,EAAgD,EAAhDA,WAAYC,EAAoC,EAApCA,YAAajnF,EAAuB,EAAvBA,QAAS12B,EAAc,EAAdA,QAAc,EACtDof,oBAAS,GAD6C,mBACvEhjB,EADuE,KACjE+lB,EADiE,KAExE6wE,EAAgBhkE,eAChB5Z,EAAck5B,eACd0J,EAAamrD,KAEnB5jF,qBAAU,YACF,OAAC1b,QAAD,IAACA,OAAD,EAACA,EAASnI,OAAO,OAACs3F,QAAD,IAACA,OAAD,EAACA,EAAe5kG,OACjCqvH,MAEL,CAACA,EAAD,OAAa55G,QAAb,IAAaA,OAAb,EAAaA,EAASnI,GAAtB,OAA0Bs3F,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAe5kG,OAE5CmxB,qBAAU,WACF1b,EAAQrU,YACHknC,GAAWA,EAAQh7B,KAAOmI,EAAQrU,WACnCkuH,EAAW75G,EAAQrU,cAG5B,CAACknC,EAASgnF,EAAYtoG,EAAavR,IAEtC0b,qBAAU,WAAO,IAAD,EACNq+F,EAAkBl4E,gBAGpBxjC,aAAkB,UAAC2B,EAAQ5T,YAAT,aAAC,EAAcP,OAChCmU,EAAQrU,WACRouH,IAEDhhF,OAAO7oB,SAASopB,KAAO6a,EAAWE,cAAc,CAC5CC,UAAU,EACVtpD,MAAO,CACHupD,EAAGlgB,KAAQnrC,IAAI,SACf2O,GAAImI,EAAQnI,GACZuoB,EAAGiU,KAAQnrC,IAAI,qBAI5B,CAAC8W,EAAQrU,UAAWqU,EAAQnI,GAA5B,UAAgCmI,EAAQ5T,YAAxC,aAAgC,EAAcP,KAAMsoD,IAGvD,IAAM6lE,EAA6C,CAC/C,CAAEnuH,KAAM,UAAWitC,IAAKn3C,IAAOE,WAAWS,OAAQ+1H,QAAQ,GAC1D,CACIxsH,KAAM,mBACNitC,IAAKn3C,IAAOyB,iBAAiBC,KAC7BkuB,YAAa,CAAC1U,KAAgBo9G,qBAC9BzB,UAAU,GAEd,CAAE3sH,KAAM,cAAeitC,IAAKn3C,IAAOmB,QAAQiF,QAAQ,UAAW,QAGlE,OACI,cAACmyH,GAAsBha,SAAvB,UACK,SAAAxtC,GAAO,OACJ,eAAC+mD,GAAD,CACIj9G,QAAS,kBAAM8hB,GAAS/lB,IAD5B,UAGKuhH,EACG,cAAC95B,GAAA,EAAD,CACIhgF,QAASA,EACTzH,KAAMA,IAGV,cAAC,GAAD,CAAiByH,QAASA,EAASzH,KAAMA,EAAM4D,QAASA,IAE5D,cAAC+2C,GAAA,EAAD,CACI36C,KAAMA,EACN46C,WAAY,kBAAM70B,GAAQ,IAF9B,SAII,cAACo7F,GAAD,CACIxgE,KAAM4gE,EAAc,EAAI,GAD5B,UAGMpnD,EAAQpoD,OAAS0vG,GAAqB3gH,KACpC,SAAAmS,GAAI,OACA,cAAC,KAAD,CAEI+F,YAAa/F,EAAK+F,YAFtB,SAII,cAAC,GAAD,CACI1lB,KAAM2f,EAAK3f,KACXitC,IAAKttB,EAAKstB,IACVu/E,OAAQ7sG,EAAK6sG,OACbC,YAAa9sG,EAAK8sG,YAClBC,WAAU,OAAE/sG,QAAF,IAAEA,OAAF,EAAEA,EAAM+sG,WAClBt8G,KAAMuP,EAAKvP,KACXk8G,SAAU3sG,EAAK2sG,SACfK,SAAUhtG,EAAKgtG,YAXdhtG,EAAKstB,qBAoDnCqhF,GA5B+C,SAAC,GAExD,IAAD,EADFL,EACE,EADFA,YAEMjnF,EAAUnhB,YAAYkhB,KAAiB7H,WACvC6uF,EAAa1iD,eACb2iD,EAAatC,KACbv3G,EAAU0R,YAAY3R,KAAiBgrB,WACvCqvF,EAAiB1oG,YAAYzR,KAAmB8qB,WAChDsvF,EAAYpB,KACZqB,EAAgBpB,KAOtB,OANAx9F,qBAAU,WAAO,IAAD,GACR,OAAC2+F,QAAD,IAACA,GAAD,UAACA,EAAWjkE,YAAZ,aAAC,EAAiBrrC,SAClBuvG,MAEL,QAACD,QAAD,IAACA,GAAD,UAACA,EAAWjkE,YAAZ,aAAC,EAAiBrrC,OAAQuvG,IAGzB,cAACX,GAAD,CACI9mF,QAASA,EACT7yB,QAASA,GAAW,GACpB7D,QAASi+G,EACTR,WAAYA,EACZC,WAAYA,EACZC,YAAaA,KAWZI,GAAwBpvF,IAAM/tB,cACvC,I,mBC/LG,SAASw9G,GAAUC,EAAiBhhF,GACvC,IAAMihF,EAAa7qD,eACb8qD,EAASzuD,eAET0uD,EAAYxwB,gBAAgB,CAC9BrxD,IAAI,UAAD,OCnB0B,yBDoB7B9tC,MAAO,CAAEwvH,UAAShhF,OAAMjf,OAAQ,UAGhCkgG,GAAyB,QAAXC,EACd3hF,OAAO7oB,SAASopB,KAAOqhF,EAEvB5hF,OAAOxgC,KAAKoiH,EAAW,SArBR,+CEFhB,IAuBQC,GAvBQpkH,sBACnB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACIA,UAAWA,EACXD,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,0PACFF,KAAK,iBCRlB,I,gDCRKkJ,GAMAk6G,GDECC,GAA6C,SAAC,GAAgB,IAAd7P,EAAa,EAAbA,OACnDjrG,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MAEtBmoF,EAAkB3yH,uBAAY,WAAO,IAAD,EAChCoxC,EENP,WACH,IAAMwhF,EAAanrD,eACb3C,EAASxwB,eACTu+E,EAAwBrqD,eAE9B,MAAM,2BAAN,OAAkCoqD,EAAlC,kCAAsEC,EAAsBz2E,cAA5F,8BACI0oB,EAAOs1C,aFAM0Y,GACPV,EAAO,8BAAmBx6G,QAAnB,IAAmBA,OAAnB,EAAmBA,EAAS+2B,UAA5B,mBACT/2B,QADS,IACTA,OADS,EACTA,EAASi3B,SADA,yBAENpE,EAAQhnC,YAFF,QAEU,IAEnB2tC,GACA+gF,GAAUC,EAAShhF,KAExB,CAAC3G,EAAQhnC,KAAMmU,IAElB,OACI,eAACgrG,GAAD,CAAuBxuG,QAASu+G,EAAiB9P,SAAUA,EAA3D,UACI,cAACjxD,GAAD,CAAYz9C,MAAM,kBAAlB,SACI,cAAC,GAAD,MAEF0uG,EAA0D,KAAjD,cAAC,GAAD,CAAOlwG,SAAS,OAAhB,iCGARogH,GA5BmB3kH,sBAC9B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BAPV,UAQI,oBAAG4wD,YAAU,mBAAmBt8B,OAAO,UAAU+vF,iBAAe,QAAhE,UACI,sBAAMzjH,EAAE,oJAAoJ0jH,kBAAgB,UAC5K,sBAAM1jH,EAAE,oJAAoJ0jH,kBAAgB,UAC5K,sBAAM1jH,EAAE,iLAAiL0jH,kBAAgB,UACzM,sBAAM1jH,EAAE,2EAA2E0jH,kBAAgB,UACnG,sBAAM1jH,EAAE,oBAAoB0kG,oBAAkB,UAElD,+BACI,0BAAUxkG,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCjB/B2jH,GAAkExiH,gBAC3E,YAMO,IALHjN,EAKE,EALFA,KACMqN,EAIJ,EAJF+C,KACA68B,EAGE,EAHFA,IACAmyE,EAEE,EAFFA,OACAlwG,EACE,EADFA,SAGA,OACI,eAACoxG,GAAD,CACI1+D,OAAQ,SACR5I,GAAI,CAAC4P,SAAU3b,GACfi0E,gBAAiB,YACjB9B,SAAUA,EACV1xG,YAAA,kBAAsB0rE,oBAAUp5E,IALpC,UAOI,cAACmuD,GAAD,CAAYz9C,MAAO1Q,EAAnB,SACI,cAACqN,EAAD,OAEF+xG,GAAU,cAAC,GAAD,CAAOlwG,SAAUA,EAAjB,SAA4BlP,UC2BlD05E,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CACnC6iH,YAAa,CACTzmD,SAAU,QACV0mD,UAAW,SACXC,UAAW,UACXp3B,OAAQ,IACRq3B,WAAY,SACZ7kH,MC3D0B,ID4D1B2Z,WAAYn0B,IAAUC,OAAOgB,KAC7Bq+H,WAAYjjH,EAAMkjH,YAAYC,OAAO,QAAS,CAC1CC,OAAQpjH,EAAMkjH,YAAYE,OAAOC,MACjCC,SAAUtjH,EAAMkjH,YAAYI,SAASC,kBAG7CC,iBAAiB,cACbV,UAAW,SACXG,WAAYjjH,EAAMkjH,YAAYC,OAAO,QAAS,CAC1CC,OAAQpjH,EAAMkjH,YAAYE,OAAOC,MACjCC,SAAUtjH,EAAMkjH,YAAYI,SAASG,gBAEzCtlH,MAAO6B,EAAM0jH,QAAQ,IACpB1jH,EAAM2jH,YAAYC,GAAG,MAAQ,CAC1BzlH,MAAO6B,EAAM0jH,QAAQ,KAG7BG,cAAe,CACXhjE,UAAW,GACX2gD,QAAS,OACTrE,WAAY,SACZ2J,cAAe,cAsJRgd,GA7IV1jH,gBACD,YAA8B,IAA3B2jH,EAA0B,EAA1BA,UAAW1hH,EAAe,EAAfA,SACJqrE,EAAUb,KACV37E,EAASm5B,eACTxqB,IAAS3O,GAAUA,EAAO2O,KAC1BmkH,EAAkBn2F,eAClBo2F,EAAmBl2F,eACnBm2F,EAAuBx2F,eACvBpmB,EAAU0R,YAAY3R,MACtBq6G,EAAiB1oG,YAAYzR,MAC7B48G,EAA8BngC,eAC9BogC,EAAsB9/B,eACtB+/B,EAAyB9/B,eACzB88B,EAAkBl4E,eAClBhP,EAAUnhB,YAAYkhB,KAAiB7H,WAqB7C,OAnBAm5D,2BAAgB,WACZ,IAAM84B,EAAiBD,IACnBC,GAAkBA,EAAejyG,OAAS,GAC1C6xG,EAAqBI,KAE1B,CAACD,EAAwBH,IAE5B14B,2BAAgB,WACR44B,KACAJ,MAEL,CAACI,EAAqBJ,IAEzBhhG,qBAAU,WACF9xB,GAAUoW,GAAWA,EAAQnI,IAC7BglH,EAA4BjzH,EAAO2O,KAAM3O,EAAOwtH,kBAErD,CAACxtH,EAAQoW,EAAS68G,IAGjB,cAAC3R,GAAD,UACI,eAAC+R,GAAA,EAAD,CACIhkH,QAAQ,YACRmtE,QAAS,CACL82C,MAAO92C,EAAQm1C,aAHvB,UAMI,qBAAK7kH,UAAW0vE,EAAQm2C,cAAxB,SACI,cAAC,GAAD,CACI1lH,MAAOkjH,EAAkB,IAAM,GAC/BjjH,OAAQijH,EAAkB,GAAK,OAGvC,eAAC5O,GAAD,WACI,eAACU,GAAD,WACI,eAACC,GAAD,WACI,gCACMj5E,GAAWA,EAAQsqF,oBACjB,cAAC7B,GAAD,CACIzvH,KAAM,eACNitC,IAAK,mCACLmyE,OAAQ1yG,EACRwC,SAAUA,EACVkB,KAAMk/G,KAEbsB,EAAUpjH,KAAI,SAACmS,EAAMlS,GAAP,OACX,mCACK8gH,EACG,eAACpO,GAAD,CAAahmC,OAAQztE,EAArB,UACI,cAAC0zG,GAAD,KACE1zG,GACE,cAAC2zG,GAAD,OAIR,cAAC,KAAD,CAEI36F,YACI/F,EAAK+F,YAHb,SAMI,cAAC+6F,GAAD,6BACQ9gG,GADR,IAEIy/F,OAAQ1yG,EACRwC,SAAUA,MARTzB,YAevBygH,GACE,cAAC,GAAD,CAAmB9O,OAAQ1yG,OAGnC,cAACwzG,GAAD,UACI,cAAC,GAAD,CAAyB+N,YAAavhH,SAG7C3O,GACG,cAACwhH,GAAD,CAAeplC,OAAQztE,EAAvB,SACMA,EAcE,eAAC+yG,GAAD,WACI,cAACE,GAAD,UACI,cAACI,GAAD,CACIpvG,QAAS,kBACLmgH,KAEJpjH,YAAU,0BAJd,SAMI,cAACoyG,GAAD,QAGR,cAACJ,GAAD,UACI,cAAC,GAAD,SAzBR,cAACF,GAAD,UACI,cAACO,GAAD,CACIpvG,QAAS,kBAAMkgH,KACfnjH,YAAU,wBAFd,SAIK6gH,EACG,cAACnO,GAAD,IAEA,cAACR,GAAD,qBA4B5C,SAAC2R,EAAWC,GAAZ,OACItyF,kBACIqyF,EACAC,M,8BExMGC,GAzBK9mH,sBAChB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,wJACF4zB,UAAU,iCCwCvBgyF,GAxDO/mH,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIkB,GAAG,IACHhB,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBANhB,UAQI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACIG,GAAG,WACHJ,KAAK,eACLE,EAAE,gYCQX6lH,GAxDQhnH,sBACnB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIkB,GAAG,IACHhB,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBANhB,UAQI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACIG,GAAG,WACHJ,KAAK,eACLE,EAAE,2jCCQX8lH,GAxDSjnH,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIkB,GAAG,IACHhB,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBANhB,UAQI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACIG,GAAG,WACHJ,KAAK,eACLE,EAAE,mvBCOX+lH,GAvDUlnH,sBACrB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACIC,EAAE,8SACFE,GAAG,YACHJ,KAAK,yBClBdkmH,GA7BKnnH,sBAChB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,sBACIC,EAAE,0kCACF4zB,UAAU,4ECNxCqyF,GAAyBxlH,IAAOC,IAAV,+EAKtBwlH,GAAsBzlH,IAAOC,IAAV,sDAInBylH,GAAa1lH,YAAOklH,GAAPllH,CAAH,gDAWV2lH,GAAsC,CACxC,CACIxhH,MAAO,cACPN,KAAM+hH,GACNllF,IAAKn3C,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QAC5C,gBACA,OAEJwpB,YAAa,CAAC1U,KAAgBohH,qBAElC,CACI1hH,MAAO,WACPN,KAAMiiH,GACNplF,IAAKn3C,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QAC1C,cACA,OAEJwpB,YAAa,CAAC1U,KAAgBshH,kBAElC,CACI5hH,MAAO,YACPN,KAAMmiH,GACNtlF,IAAKn3C,IAAO6C,iBAAiBF,WAAWF,OAAO2D,QAC3C,eACA,OAEJwpB,YAAa,CAAC1U,KAAgBwhH,mBAElC,CACI9hH,MAAO,OACPN,KAAMqiH,GACNxlF,IAAKn3C,IAAO8B,aAAaC,SAASqE,QAAQ,WAAY,OACtDwpB,YAAa,CAAC1U,KAAgB0hH,iBAElC,CACIhiH,MAAO,OACPN,KAAMuiH,GACN1lF,IAAKn3C,IAAOyD,YAAYG,SACxBgsB,YAAa,CAAC1U,KAAgB4hH,eAiDvBC,GA7C0B,WAAO,IAAD,EAChBnjG,oBAAS,GADO,mBACpChjB,EADoC,KAC9B46C,EAD8B,KAG3C,OACI,cAACwrE,GAAuBze,SAAxB,UACK,SAAAxtC,GACG,IAAMpoD,EAAQooD,EAAQpoD,OAASyzG,GAC/B,OACI,eAACH,GAAD,CAAwBrkH,YAAU,0BAAlC,UACI,cAACskH,GAAD,CACIrhH,QAAS,kBAAM22C,GAAY56C,IAC3BgB,YAAU,6BAFd,SAII,cAAC,IAAD,UACI,cAACukH,GAAD,QAGPvlH,GACG,cAAC,GAAD,CACIA,KAAMA,EACN46C,WAAYA,EACZoG,UAAW,EAHf,SAKKjvC,EAAMjR,KAAI,SAAAmS,GAAI,OACX,cAAC,KAAD,CAEI+F,YAAa/F,EAAK+F,YAFtB,SAII,cAAC,GAAD,CACI1lB,KAAM2f,EAAKjP,MACXi8G,UAAU,EACVv8G,KAAMuP,EAAKvP,KACX68B,IAAKttB,EAAKstB,OAPTttB,EAAKjP,mBA0BrCoiH,GAAyB7zF,IAAM/tB,cACxC,ICvGW8gG,GAvBUrnG,sBACrB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIU,SAAS,UACTD,KAAK,eACLE,EAAE,mHACF4zB,UAAU,6BCjBjBqzF,GAAkBxmH,IAAOC,IAAV,qIAMV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACxC,SAAA+b,GAAK,QACDA,EAAMumH,WAAR,mCAC4BvmH,EAAMI,MAAMpc,OAAOU,aAEjD,SAAAsb,GAAK,QAAMA,EAAMwmH,eAAR,mBAAqCxmH,EAAMwmH,cAA3C,QACT,SAAAxmH,GAAK,QAAMA,EAAM+sC,WAAR,sBAAoC/sC,EAAM+sC,cAG5C05E,GAAqB3mH,IAAOC,IAAV,qDACZ,SAAAC,GAAK,OAAIA,EAAM0mH,cAAgB,OAAS,OAG9CC,GAAkB7mH,IAAOC,IAAV,yIAKtB,SAAAC,GAAK,MAC+B,qBAA3BA,EAAM4mH,iBACP,GACA5mH,EAAM4mH,iBAAmB,oBAAsB,uBAIhDC,GAAU/mH,IAAOC,IAAV,4BAEP+mH,GAAsBhnH,IAAOC,IAAV,gDAInBgnH,GAAYjnH,IAAOC,IAAV,+DAKT6wD,GAAiB9wD,IAAOC,IAAV,oHAId,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5ByiI,GAAelnH,IAAOC,IAAV,qDACN,SAAAC,GAAK,OAAKA,EAAMqjF,cAAgB,MAAQ,SAE9C4jC,GAAYnnH,IAAOC,IAAV,+IAQTmnH,GAAWpnH,IAAOC,IAAV,2IAGR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAK5BiiI,GAAarnH,IAAOC,IAAV,0HAOVqnH,GAAwBtnH,IAAOC,IAAV,mFAEV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAGvC2iI,GAAYvnH,IAAOC,IAAV,yTAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SASxB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5B,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,c,oBd7FjC6jB,K,sDAAAA,E,0DAAAA,E,2DAAAA,Q,cAMAk6G,K,iCAAAA,Q,KA0BL,IAAM+E,GAA6B,6BAC7BC,GAA+B,+BAC/BC,GAA+B,+BAC/BC,GAA+B,+BAC/BC,GAAiC,iCACjCC,GAAiC,iCAEvC,SAASC,KACZ,MAAO,CACH9sH,KAAMynH,GAAcsF,gBerBrB,I,uFAAMC,GAA8B,SACvCz0H,EACAupC,EACAmrF,GAEA,OAAO,SAAC5mH,EAAe6mH,EAAeC,GAClC9mH,EAASymH,MAD8C,IAE/CM,EAA0BD,EAA1BC,UAAWrsE,EAAeosE,EAAfpsE,WACbtjD,EAAOkP,aAAgBugH,KAE7B,OADAJ,KACOziF,aACH,CAAE9xC,UAAWA,GAAa,MAC1BkF,EAAMgH,IACN,EACA,oBACA,WACI,IAAIihC,EAAM,KACV,GAAIntC,EAAW,CACX,IAAM80H,EACFD,IAAcpW,GAAYsW,eAC9B5nF,EAAMqb,EAAWwsE,gBAAgB,CAC7B74H,KAAMnG,IAAOqC,YACbgH,MAAO,CACHupD,EAAGksE,OACGt3H,EACAkrC,KAAQnrC,IAAI,SAClB2O,GAAIw8B,KAAQnrC,IAAI,UAChBk3B,EAAGiU,KAAQnrC,IAAI,gBAEnBorD,UAAU,SAEPksE,IAAcpW,GAAYwW,eACjC9nF,EAAMqb,EAAWE,cAAc,CAC3BrpD,MAAO,CACHupD,EAAGlgB,KAAQnrC,IAAI,SACf2O,GAAIw8B,KAAQnrC,IAAI,UAChBk3B,EAAGiU,KAAQnrC,IAAI,gBAEnBorD,UAAU,KAGdxb,IACIunF,EACAtnF,OAAOxgC,KAAKugC,EAAK,UAEjBC,OAAO7oB,SAASopB,KAAOR,GAIhB,OAAf5D,QAAe,IAAfA,SAvCDuI,CAyCLhkC,KA4BGonH,GAAiC,WAC1C,IAAMpnH,EAAWO,cACX8mH,EAAqBl2H,eACrBsf,EAAcnQ,cAMpB,OAAO3R,uBACH,WAEI,OADAqR,Ef5CD,CACHrG,KAAM2sH,Ke4CKe,OAAmB33H,EAAW,CAAEoC,KAAcC,SAChDk4B,MAAK,SAAAn5B,GACFkP,Ef1Cb,SAAqClP,GACxC,MAAO,CACH6I,KAAM4sH,GACNz1H,QeuCqBw2H,CAA4Bx2H,OAExCq5B,OAAM,SAAC5rB,GACJyB,EftCb,SAAqCzB,GACxC,MAAO,CACH5E,KAAM6sH,GACNjoH,SemCqBgpH,CAA4BhpH,EAAMgB,UAC3CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUqnH,EAAoB52G,KC5FxB+2G,GA5BczqH,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,sBACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGU,SAAS,UAAUD,KAAK,eAA3B,SACI,4BACI,sBACIE,EAAE,8cCafupH,GA5BY1qH,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,sBACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGU,SAAS,UAAUD,KAAK,eAA3B,SACI,4BACI,sBACIE,EAAE,2bCHjBqqD,GAAO5pD,IAAOC,IAAV,yLAOC,SAAAC,GAAK,OACfA,EAAMC,KAAOD,EAAMI,MAAMpc,OAAOqC,SAAW2Z,EAAMI,MAAMpc,OAAOC,SAGzD4kI,GAAW/oH,YAAO6oH,GAAP7oH,CAAH,iIACR,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAO5B4jI,GAAShpH,YAAO8oH,GAAP9oH,CAAH,iIACN,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAO5B6jI,GAAiBjpH,IAAOC,IAAV,wJASdipH,GAAsBlpH,IAAOC,IAAV,0NACnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAU5BivD,GAAgBn0C,IAAOC,IAAV,iHACZ,SAAAC,GAAK,OAAKA,EAAMipH,QAAU,OAAS,UACpC,SAAAjpH,GAAK,OAAKA,EAAMipH,QAAU,OAAS,UAKnCx1E,GAAa3zC,IAAOi0C,IAAV,2FC/DjB2V,GAAO5pD,IAAOC,IAAV,uSAGG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAOnB,SAAAgb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAO5CmsH,GAAO1yG,IAAOC,IAAV,oTASQ,SAAAC,GAAK,OAAKA,EAAMipH,QAAU,OAAS,UAO/C70F,GAAQt0B,IAAOC,IAAV,yLACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QASnCkiI,GAAWpnH,IAAO0nB,KAAV,+DD7CU,+MCkDX0hG,GAIR,SAAC,GAAoC,IAAlC3uF,EAAiC,EAAjCA,QAASr2B,EAAwB,EAAxBA,QAASF,EAAe,EAAfA,SAEhBmlH,EAAcr5H,uBAAY,kBAAMoU,EAAQq2B,KAAU,CAACA,EAASr2B,IAC1DmoC,EAAkC9R,EAAlC8R,KAAMD,EAA4B7R,EAA5B6R,QAAS74C,EAAmBgnC,EAAnBhnC,KAAM61H,EAAa7uF,EAAb6uF,SACvBj9E,EAAWE,GAAQD,EACzB,OACI,eAAC,GAAD,CAAMnrC,YAAW+C,EAAUilH,UAAW1uF,EAAQ0uF,QAAS/kH,QAASilH,EAAhE,UACI,cAAC,GAAD,CAAMF,UAAW1uF,EAAQ0uF,QAAzB,SACK98E,EACG,qBAAK/nC,IAAK+nC,EAAU9nC,IAAI,QAExB,cAACgnC,GAAA,EAAD,CAAmB3jC,QAAS6yB,EAASp2B,KAAK,SAGlD,cAAC,GAAD,UAAQ5Q,IACP61H,GAAY,cAAC,GAAD,UAAWA,QC7DvBC,GAAkC,CAC3C91H,KAAM,UACN84C,KCdW,IAA0B,yCDerC+8E,SAAU,UACVH,SAAS,GEyCEK,GAtDYprH,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACID,KAAK,UACLE,EAAE,yPC5CpBgnB,GAAYvmB,IAAOC,IAAV,uGAMT2pD,GAAO5pD,IAAOC,IAAV,uSAGG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAOnB,SAAAgb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAO5CmsH,GAAO1yG,IAAOC,IAAV,wKASJs8B,GAAUv8B,IAAOC,IAAV,qGAEW,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAClC,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAGxC+uD,GAAa3zC,YAAOwpH,GAAPxpH,CAAH,iDAIVs0B,GAAQt0B,IAAOC,IAAV,yLACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAS5BukI,GAGR,SAAC,GAA0B,IAAxBhvF,EAAuB,EAAvBA,QAASr2B,EAAc,EAAdA,QACPilH,EAAcr5H,uBAAY,kBAAMoU,EAAQq2B,KAAU,CAACA,EAASr2B,IAClE,OACI,qCACI,cAAC,GAAD,UACI,eAAC,GAAD,CAAMA,QAASilH,EAAaloH,YAAU,4BAAtC,UACI,cAAC,GAAD,CAAMgoH,UAAW1uF,EAAQ0uF,QAAShoH,YAAU,uBAA5C,SACI,cAAC,GAAD,MAEJ,cAAC,GAAD,CAAOA,YAAU,wBAAjB,gCAGR,cAAC,GAAD,QC3DNuoH,GAAiB1pH,YAAO0/G,GAAP1/G,CAAH,oHACF,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMjCwlI,GAMR,SAAC,GAA0E,IAAxE7rF,EAAuE,EAAvEA,UAAW39B,EAA4D,EAA5DA,KAAM46C,EAAsD,EAAtDA,WAAY6uE,EAA0C,EAA1CA,gBAAiBL,EAAyB,EAAzBA,mBAClD,OACI,cAACG,GAAD,CACIvpH,KAAMA,EACN46C,WAAYA,EACZt8C,MAAO,OACPkhH,WACI,cAAC,GAAD,CACIllF,QAAS8uF,EACTnlH,QAASwlH,IAPrB,gBAWK9rF,QAXL,IAWKA,OAXL,EAWKA,EAAW78B,KAAI,SAACw5B,GAAD,OACZ,cAAC,GAAD,CAEIA,QAASA,EACTr2B,QAASwlH,EACT1lH,SAAU,YAAcu2B,EAAQh7B,IAAM,KAHjC,YAAcg7B,EAAQh7B,IAAM,WA6CtCoqH,GA9BV,SAAC,GAA2D,IAAzDC,EAAwD,EAAxDA,eAAgB3pH,EAAwC,EAAxCA,KAAM46C,EAAkC,EAAlCA,WAAY6uE,EAAsB,EAAtBA,gBAChCG,EAAuBtB,KAD+B,ECpD3CnvG,aAAY,SAAAxX,GAAK,OAAIA,KACtBg8B,UDqDRksF,EAFoD,EAEpDA,gBAAiBC,EAFmC,EAEnCA,yBAEnBC,EAAqBhP,GAAgB4O,GAe3C,OAbAxmG,qBAAU,YACF,OAAC0mG,QAAD,IAACA,OAAD,EAACA,EAAiB93G,QAAU+3G,GAC5BF,MAGL,IAEHzmG,qBAAU,WACF8f,kBAAQ8mF,IAAuBxzF,KAAMozF,EAAgBI,IACzDH,MAED,CAACD,IAGA,cAAC,GAAD,CACIhsF,UAAS,OAAEksF,QAAF,IAAEA,OAAF,EAAEA,EAAiB93G,MAC5B/R,KAAMA,EACN46C,WAAYA,EACZ6uE,gBAAiBA,EACjBL,mBAAoBA,ME5E1Bx+E,GAAwB/qC,IAAOC,IAAV,ySAOT,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aACjC,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAC1B,SAAA8a,GAAK,OAAKA,EAAM0D,SAAW,GAAM,KACxB,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAO9ComH,GAAc9qG,IAAOi0C,IAAV,oHAsCFk2E,GAhBV,SAAC,GAAoD,IAAlDhlB,EAAiD,EAAjDA,MAAO1xG,EAA0C,EAA1CA,KAAMmQ,EAAoC,EAApCA,SAAUtF,EAA0B,EAA1BA,UAAW4F,EAAe,EAAfA,SACtC,OAAIihG,EAEI,cAACp6D,GAAD,CAAuBnnC,SAAUA,EAAUtF,UAAWA,EAAtD,SACI,cAAC,GAAD,CAAagG,IAAK6gG,EAAO5gG,IAAK,UAAWpD,YAAW+C,MAKxD,cAAC6mC,GAAD,CAAuBnnC,SAAUA,EAAUtF,UAAWA,EAAW6C,YAAW+C,EAA5E,SACKzQ,GAAQA,EAAK,GAAG24C,iBCoBlBg+E,GA1D0D,SAAC,GAInE,IAHH3vF,EAGE,EAHFA,QACAqvF,EAEE,EAFFA,eACAF,EACE,EADFA,gBACE,EACsBzmG,oBAAS,GAD/B,mBACKhjB,EADL,KACW+lB,EADX,KAEI84F,EAAiBpxF,eACjBmtB,EAAa/qD,uBACf,SAACq6H,GAAD,OACInkG,GAAQ,SAAAowF,GAAQ,MACO,mBAAZ+T,EAAwBA,GAAW/T,OAElD,CAACpwF,IAECokG,EAAsBt6H,uBACxB,SAACyqC,GACGvU,GAAQ,GACR84F,IACA4K,EAAgBnvF,KAEpB,CAACvU,EAAS0jG,EAAiB5K,IAGzB3yE,EAAW5R,EAAQ8R,MAAQ9R,EAAQ6R,QAEzC,OACI,eAACsd,GAAD,CAAMzpD,KAAMA,EAAZ,UACI,eAAC8oH,GAAD,CACI7kH,QAAS,kBAAM22C,GAAY56C,IAC3BgB,YAAU,8BAFd,UAII,cAACgzC,GAAD,CAAeg1E,QAAS1uF,EAAQ0uF,QAAhC,SACK98E,EACG,cAAC,GAAD,CAAY/nC,IAAK+nC,EAAU9nC,IAAI,QAE/B,cAAC,GAAD,CACI4gG,MAAO94D,EACP54C,KAAMgnC,EAAQhnC,SAI1B,cAACy1H,GAAD,UAAsBzuF,EAAQhnC,OAC7B0M,EACG,cAAC6oH,GAAD,CAAQ7nH,YAAU,0BAElB,cAAC4nH,GAAD,CAAU5nH,YAAU,+BAG5B,cAAC,GAAD,CACI2oH,eAAgBA,EAChB3pH,KAAMA,EACN46C,WAAYA,EACZ6uE,gBAAiBU,QC1CjC,IAAMC,GAAuBvqH,IAAOC,IAAV,2KAUpBuqH,GAAoBxqH,IAAOC,IAAV,mEAKjBwqH,GAAazqH,IAAOC,IAAV,gFAKVk0C,GAAgBn0C,IAAOC,IAAV,iHACL,SAAAC,GAAK,OAAKA,EAAMipH,QAAU,OAAS,UACpC,SAAAjpH,GAAK,OAAKA,EAAMipH,QAAU,OAAS,UAK1Cv/D,GAAO5pD,IAAOC,IAAV,mKAMQ,SAAAC,GAAK,OACfA,EAAMC,KAAOD,EAAMI,MAAMpc,OAAOqC,SAAW2Z,EAAMI,MAAMpc,OAAOC,SAGhE8kI,GAAiBjpH,IAAOC,IAAV,0GAMdipH,GAAsBlpH,IAAOC,IAAV,0NACZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAUnCyuD,GAAa3zC,IAAOi0C,IAAV,2FAMVy2E,GAAe1qH,IAAOC,IAAV,+RAyJlB,I,+GCzOY0qH,GDiPG9oH,gBAjBf,SAAyBC,EAAYosC,GACjC,MAAO,CACHk6E,UAAWl6E,EAAUk6E,UACrBrsE,WAAY7N,EAAU6N,WACtBthB,QAASD,aAAgB14B,GACzBiC,QAAS22B,aAAkB54B,OAIR,SAACT,GAAD,OACvBY,8BACI,CACI2oH,cAAe5C,IAEnB3mH,KAGOQ,EAxIV,SAAC,GAAgC,IAA9B44B,EAA6B,EAA7BA,QAASmwF,EAAoB,EAApBA,cACPrmD,EAAkBp4C,eAClBvU,EAAUW,cAMVsyG,EAAmB76H,uBAAY,WACjCu0E,EAAgB,MACjB,CAACA,IAMEumD,EAA+B96H,uBACjC,SAAAyqC,GACI8vB,mBAASsgE,EAAkB,KE3HhC,SAAwCjqH,GAC3C,IAC6B,IAAImqH,iBAAiB,YAE7BC,YAAYpqH,GAC/B,MAAOhB,GACLyxB,QAAQ45F,IACJ,sDACArrH,IFoHAsrH,CAA4BzwF,EAAQh7B,MAExC,CAACorH,IASCP,EAAsBt6H,sBAAW,yCACnC,WAAOyqC,GAAP,UAAAxoB,EAAA,0DACQ24G,EADR,gCAEcA,EAAcnwF,EAAQh7B,IAAI,kBAC5BqrH,EAA6BrwF,MAHzC,2CADmC,sDAQnC,CAACmwF,EAAeE,IAOdK,EAAiCn7H,sBAAW,yCAC9C,WAAM4Q,GAAN,UAAAqR,EAAA,6EACU24G,QADV,IACUA,OADV,EACUA,EAAgBhqH,EAAS2pD,mBAASsgE,EAAkB,MAD9D,2CAD8C,sDAI9C,CAACD,EAAeC,IAGdO,EAAsBp7H,uBAAY,WACpCwoB,YAAUZ,EAASruB,IAAOyB,iBAAiBC,QAC5C,CAAC2sB,IAOJ,GAJA0L,qBAAU,YEhJP,SACHm8F,GAEA,IAC6B,IAAIsL,iBAAiB,YAE7BM,UAAY,SAAApxE,GACzBwlE,EAASxlE,EAAM9nD,OAErB,MAAOyN,GACLyxB,QAAQ45F,IACJ,wDACArrH,IFqIJ0rH,CAA8BH,KAC/B,CAACA,KAEC1wF,EACD,OAAO,KAGX,IAAM4R,GAAkB,OAAP5R,QAAO,IAAPA,OAAA,EAAAA,EAAS6R,WAAT,OAAoB7R,QAApB,IAAoBA,OAApB,EAAoBA,EAAS8R,MAExCA,EACFF,EACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAe88E,SAAS,EAAxB,SACI,cAAC,GAAD,CAAY7kH,IAAK+nC,EAAU9nC,IAAI,UAEnC,cAAC,GAAD,iBACKk2B,QADL,IACKA,OADL,EACKA,EAAShnC,YAKtB,cAAC,GAAD,UACI,eAACi3H,GAAD,WACI,cAACn/E,GAAA,EAAD,CACI3jC,QAAS6yB,EACTp2B,KAAK,KACL/F,UAAU,uBAEd,sCAAOm8B,QAAP,IAAOA,OAAP,EAAOA,EAAShnC,YAKhC,OACI,cAAC,KAAD,CACI0lB,YAAa,CAAC1U,KAAgB8mH,oBAC9BnyG,iBACI,cAACmxG,GAAD,UACI,cAACC,GAAD,UACI,cAAC,KAAD,CACIrxG,YAAa,CAAC1U,KAAgB+mH,cAC9BpyG,iBAAkBmzB,EAFtB,SAII,cAACk+E,GAAD,CAAYrmH,QAASgnH,EAArB,SACK7+E,UAVzB,SAiBI,cAAC,GAAD,CACI9R,QAASA,EACTqvF,eAAgBrvF,EAChBmvF,gBAAiBU,SG3MpBmB,GAAgB9mH,wBAAkC,CAC3D+mH,wBAAyBC,KCsHdrkD,GAlH8B5mE,gBACzC,YAWO,IAVHyD,EAUE,EAVFA,MACAmlH,EASE,EATFA,SACAsC,EAQE,EARFA,KACAC,EAOE,EAPFA,UACApF,EAME,EANFA,UACAqF,EAKE,EALFA,UACAC,EAIE,EAJFA,UACArF,EAGE,EAHFA,cACAxiH,EAEE,EAFFA,SACA+oC,EACE,EADFA,UAEMr1B,EAAUW,cACiBozG,EAC7B/mH,qBAAW6mH,IADPC,wBAEFM,IAAYJ,EACZhF,IAAkBkF,KAAeC,EAUvC,OACI,cAAC,GAAD,CACItF,UAAWA,EACXC,cAAeA,EACfz5E,UAAS,OAAEA,QAAF,IAAEA,IAAc++E,OAAUj7H,EAAY,QAHnD,SAKI,eAACg2H,GAAD,WACI,eAACF,GAAD,CAAiBC,iBAAkB75E,OAAYl8C,EAAYi7H,EAA3D,UACI,eAAC,GAAD,WACI,eAACl7D,GAAD,WACK81D,GACG,cAACW,GAAD,CACInjH,QApBX,WACX2nH,EACFn0G,EAAQq0G,SACCH,GACTl0G,EAAQH,KAAKq0G,IAiBW3qH,YAAU,oBAFd,SAII,cAAC,GAAD,MAGR,eAAC+lH,GAAD,CAAc3jC,eAAgBp/E,EAA9B,UACKA,GACG,cAACgjH,GAAD,CACIhmH,YACI+C,GAAQ,UACLA,EADK,eAFhB,SAMKC,IAIRmlH,EACG,cAAClC,GAAD,CACIjmH,YACI+C,GAAQ,UACLA,EADK,kBAFhB,SAMKolH,IAGL,cAAChlB,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,IACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,4BAM/ByzG,GACG,cAAClF,GAAD,CAAoBC,cAAeA,EAAnC,SACKiF,OAIb,eAAC,GAAD,WACI,cAACvE,GAAD,CAAuBnmH,YAAU,yBAAjC,SACI,cAACwqH,EAAD,MAEJ,cAAC,KAAD,CACIxyG,YAAa,CACT1U,KAAgBohH,mBAChBphH,KAAgBshH,gBAChBthH,KAAgBwhH,iBAChBxhH,KAAgB0hH,gBALxB,SAQI,cAAC,GAAD,YAIZ,cAACa,GAAD,UACK4E,YAMrB,SAAC5G,EAAWC,GAAZ,OACItyF,kBACIqyF,EACAC,M,UCrICiH,GAAmBlsH,IAAOC,IAAV,sEAKhBswD,GAAUvwD,IAAOmsH,KAAV,kGAIL,SAAAjsH,GAAK,OACVA,EAAMksH,eAAiBlsH,EAAMksH,eAAiB,YAIlD,SAAAlsH,GAAK,QAAMA,EAAMxB,QAAR,kBAA6BwB,EAAMxB,OAAnC,QAGF2tH,GAAarsH,IAAOC,IAAV,+EAEjB,SAAAC,GAAK,QAAMA,EAAMosH,cAAR,yBAIFC,GAAkBvsH,YAAOumB,KAAPvmB,CAAH,8FAEN,SAAAE,GAAK,OAAIA,EAAMitC,cAAgB,UAC/C,SAAAjtC,GAAK,QAAMA,EAAMxB,QAAR,kBAA6BwB,EAAMxB,OAAnC,QCJA8tH,GAtBepuH,sBAC1B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,SAQI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,shBACFF,KAAK,iBCWVotH,GA1BqBruH,sBAChC,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,UAQI,sBACIU,KAAK,OACLE,EAAE,6BAEN,sBACIiwD,YAAU,UACVC,YAAU,UACVlwD,EAAE,shBACFF,KAAK,kBCGVqtH,GAtBatuH,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,SAQI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,2LACFF,KAAK,iBCKVstH,GApBmBvuH,sBAC9B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,UAQI,sBAAMY,EAAE,uCAAuCF,KAAK,SACpD,sBAAMA,KAAK,UAAUE,EAAE,4BACvB,sBAAMiwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,6IAA6IF,KAAK,YAClM,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,gCAAgCF,KAAK,eCgBtFutH,GA9BYxuH,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNL,UAAWA,EAPf,UASI,mBAAGixD,YAAU,mBAAb,SACI,sBACIC,YAAU,UACVC,YAAU,UACVlwD,EAAE,gVACFF,KAAK,cAGb,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCU7BstH,GAhCkBzuH,sBAC7B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNL,UAAWA,EAPf,UASI,oBAAGixD,YAAU,mBAAmBlwD,KAAK,OAArC,UACI,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,kVAChD,oBAAGgwD,YAAU,mBAAb,UACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,kVAChD,sBAAMA,EAAE,0DAGhB,iCACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,oBAExB,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,6BCD7ButH,GAvBa1uH,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLM,MAAM,6BACNF,MAAM,KACNC,OAAO,KACPW,KAAK,OACLf,UAAWA,EACXE,QAAQ,YAPZ,SASI,sBACIgxD,YAAU,UACVC,YAAU,UACVlwD,EAAE,wuBACFF,KAAK,iBCOV0tH,GAvBmB3uH,sBAC9B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLM,MAAM,6BACNF,MAAM,KACNC,OAAO,KACPW,KAAK,OACLf,UAAWA,EACXE,QAAQ,YAPZ,SASI,sBACIgxD,YAAU,UACVC,YAAU,UACVlwD,EAAE,sbACFF,KAAK,cCIV2tH,GApBkB5uH,sBAC7B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BANV,SAQI,sBACIY,EAAE,4kCACFF,KAAK,iBCKV4tH,GAlBwB7uH,sBACnC,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BANV,UAQI,sBAAMY,EAAE,m3BAAm3BF,KAAK,SACh4B,sBAAME,EAAE,gBAAgB0zB,OAAO,UAAU+vF,iBAAe,gBCMzDkK,GAlBe9uH,sBAC1B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,UAQI,sBAAM6wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yEAAyEF,KAAK,YAC9H,sBAAMA,KAAK,UAAUE,EAAE,oECKxB2tH,GAjBe9uH,sBAC1B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BANV,SAQI,sBAAM6wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,6GAA6GF,KAAK,cCOnK8tH,GAlBiB/uH,sBAC5B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBAAKD,IAAKA,EAAKC,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxH,UACA,oBAAGkwD,YAAU,mBAAmBt8B,OAAO,UAAUgxE,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,QAA/G,UACI,sBAAM1jH,EAAE,gIACR,sBAAMA,EAAE,sKAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCQzB6tH,GAlBuBhvH,sBAClC,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBAAKD,IAAKA,EAAKC,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxH,UACI,oBAAGkwD,YAAU,mBAAmBC,YAAU,UAAUC,YAAU,UAAUpwD,KAAK,OAA7E,UACI,sBAAME,EAAE,+SACR,sBAAMA,EAAE,6QAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCK/B8tH,GAAoD,CAC7D,CACI55H,KAAM,OACNoQ,KAAM+oH,GACNxY,WAAYyY,GACZnsF,IAAKn3C,IAAOqC,YACZutB,YAAa,CAAC1U,KAAgB6oH,kBAElC,CACI75H,KAAM,QACNoQ,KAAM6oH,GACNtY,WAAYuY,GACZjsF,IAAKn3C,IAAOwD,MACZosB,YAAa,CAAC1U,KAAgB8oH,mBAElC,CACI95H,KAAM,eACNoQ,KAAMmpH,GACN5Y,WAAY6Y,GACZvsF,IAAKn3C,IAAOwB,6BACZouB,YAAa,CAAC1U,KAAgB+oH,oBAElC,CACI/5H,KAAM,UACNoQ,KAAMqpH,GACN9Y,WAAYqZ,GACZ/sF,IAAKn3C,IAAOmF,QAAQC,gBACpBwqB,YAAa,CAAC1U,KAAgBipH,+BAElC,CACIj6H,KAAM,UACNoQ,KAAM2oH,GACNpY,WAAYqY,GACZ/rF,IAAKn3C,IAAO4C,QACZgtB,YAAa,CACT1U,KAAgBkpH,cAChBlpH,KAAgBmpH,eAChBnpH,KAAgB8oH,mBAGxB,CACI95H,KAAM,QACNoQ,KAAMipH,GACN1Y,WAAY2Y,GACZrsF,IAAKn3C,IAAOkE,MACZ4mH,aAAc,CAAC9qH,IAAOsE,YAAatE,IAAOuE,QAC1CqrB,YAAa,CACT1U,KAAgBopH,UAChBppH,KAAgBqpH,kBAGxB,CACIr6H,KAAM,cACNoQ,KAAMspH,GACN/Y,WAAYgZ,GACZ1sF,IAAKn3C,IAAO0F,UAAUC,oBCvDjB6+H,GAA0CrtH,gBACnD,YAuBO,IAtBHgD,EAsBE,EAtBFA,SACAsqH,EAqBE,EArBFA,YACAtH,EAoBE,EApBFA,cACAuH,EAmBE,EAnBFA,gBACA7B,EAkBE,EAlBFA,eACAjoH,EAiBE,EAjBFA,MACAmlH,EAgBE,EAhBFA,SACAuC,EAeE,EAfFA,UACAqC,EAcE,EAdFA,WACAnqH,EAaE,EAbFA,QACAoqH,EAYE,EAZFA,iBACAvC,EAWE,EAXFA,KACAE,EAUE,EAVFA,UACAC,EASE,EATFA,UACArtH,EAQE,EARFA,OACA0vH,EAOE,EAPFA,gBAEAzrH,GAKE,EANF0rH,iBAME,EALF1rH,UAKE,IAJF2pH,oBAIE,aAHFgC,qBAGE,MAHc,qBAGd,EAFFpqH,EAEE,EAFFA,SACAipC,EACE,EADFA,aAEMr1B,EAAWC,cACXw2G,EAAUppG,mBACVqpG,EAAYvwG,mBACd,iBAAO,CAAE+7C,cAAeu0D,KACxB,CAACA,IASL,OALAjrG,qBAAU,WACN0d,SAAS78B,MAAQmqH,IAClB,CAACA,EAAex2G,IAIf,eAACo0G,GAAD,CAAkB/qH,YAAW+C,EAA7B,UACI,cAACuqH,GAAA,EAAD,IACA,cAAC,GAAD,CACIpK,UACI8J,GAAoBd,GAExB1qH,SAAUA,IAEd,cAAC0pH,GAAD,CACI5sH,GAAG,0BACHpB,IAAKkwH,EACLjC,aAAcA,EAHlB,SAKI,eAAC,GAAD,CAAS5tH,OAAQA,EAAQ0tH,eAAgBA,EAAzC,WACM8B,GACE,cAAC,GAAD,CACI/pH,MAAOA,EACPmlH,SAAUA,EACVsC,KAAMA,EACNC,UAAWA,EACXC,UAAWA,EACXC,UAAWA,EACXtF,UAAW2H,EACX1H,cAAeA,EACfxiH,SAAUA,EACV+oC,UAAWghF,IAGnB,eAACS,GAAD,CACIV,YAAaA,EACbjqH,QAASA,EACTrF,OAAQA,EACRyuC,aAAcA,EAJlB,WAMM+gF,GAAc,cAAC,KAAD,CAAct9F,MAAM,IACpC,cAACipC,GAAA,EAAwBoU,SAAzB,CAAkCpoE,MAAO2oH,EAAzC,SACK9qH,kBAUpBgrH,GAKRhuH,gBAAK,YAA+D,IAA5DstH,EAA2D,EAA3DA,YAAajqH,EAA8C,EAA9CA,QAASrF,EAAqC,EAArCA,OAAQgF,EAA6B,EAA7BA,SAAUypC,EAAmB,EAAnBA,aACjD,OACI,cAACo/E,GAAD,CACIoC,SAAiC,qBAAhBX,EAA8BA,EAAc,KAC7DtvH,OAAQA,EACRyuC,aAAcA,EAHlB,SAKI,8BAAMppC,EAAU,cAACkoC,GAAA,EAAD,IAAcvoC,SAK3BqqH,MCtHF3qF,GAAU,SAACwrF,GACpB,QAAKA,IAG8B,IAA5BvyF,OAAOtrB,KAAK69G,GAAKj8G,QAAgBi8G,EAAIC,cAAgBxyF,SC+B1DyyF,GAAoB9uH,IAAOC,IAAV,+EAKV8uH,GAA2B/uH,IAAOC,IAAV,6GAMxBshH,GAAiBvhH,IAAOC,IAAV,oGAMd+uH,GAAchvH,IAAOC,IAAV,4BAEXgvH,GAAejvH,IAAOC,IAAV,gPAID,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAS9CyoD,GAAoBptC,IAAOC,IAAV,4IAQjBivH,GAA2BlvH,IAAOC,IAAV,8FAMxBkvH,GAAoBnvH,IAAOC,IAAV,gHAOjBmvH,GAA0BpvH,IAAOC,IAAV,gDAIvBovH,GAAiBrvH,YAAOkrC,UAAPlrC,CAAH,gZAOP,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGjB,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAE5B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAEnC,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACjB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAIlD4qI,GAActvH,IAAOC,IAAV,+DAKXsvH,GAAcvvH,YAAOgzD,KAAPhzD,CAAH,mIAQXwvH,GAAuBxvH,IAAOC,IAAV,uMAKF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAI9C6qI,GAAuBzvH,IAAOC,IAAV,mIAOpBsgH,GAAWvgH,IAAOC,IAAV,4FAGD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC6vC,GAAQt0B,IAAOC,IAAV,4FAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnCsqI,GAAU1vH,IAAOC,IAAV,yHAOA0vH,GAcR,SAAC,GAcC,IAAD,MAbF/3G,EAaE,EAbFA,QACA6iB,EAYE,EAZFA,QACAprC,EAWE,EAXFA,OACAuY,EAUE,EAVFA,QACA7D,EASE,EATFA,QACAuhC,EAQE,EARFA,KACAsqF,EAOE,EAPFA,aACAC,EAME,EANFA,cACAC,EAKE,EALFA,mBACA5jB,EAIE,EAJFA,iBACA54C,EAGE,EAHFA,kBACA04C,EAEE,EAFFA,kBACAC,EACE,EADFA,WAEMgB,EAAqBzzG,eACrBsY,EAAcnQ,cACd2lF,EAAS1iF,qBAAW4tG,IACpBr5F,EAAck5B,eACd05D,EAAWzmE,GAAQnsB,EAAYzH,SAASjN,KAAgB8E,aACxDwmH,EACFzqF,GAAQnsB,EAAYzH,SAASjN,KAAgBurH,mBAC3Cr0E,EAAiB11C,aAAkB,OAAC2B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAEnDw8H,EACF9pH,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAASuS,aAAkB,OAAC4B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MACrEiU,IACF49B,GAAS19B,GAAWvY,IAAWuY,EAAQnI,KAAcsE,EACnDooG,EAAS,OAAG1xE,QAAH,IAAGA,OAAH,EAAGA,EAAS2xE,aAErB8jB,EAAiB/qG,iBAAOsV,GAC9BnX,qBAAU,WACN4sG,EAAengG,QAAU0K,KAE7B,IAAM01F,EAAcD,EAAengG,QAEnCzM,qBAAU,WAEDmX,GACCA,GAAWA,EAAQh7B,IACpB0wH,GACCA,GAAeA,EAAY1wH,IAG7Bg7B,EAAQh7B,KAAO0wH,EAAY1wH,IAAiB,OAAXpQ,GACjCuoB,EAAQH,KAAKluB,IAAOkE,SAEzB,CAACgtC,EAAS01F,EAAav4G,EAASvoB,IAEnC,IAAM+gI,EAAoBpgI,uBAAY,WAC7B4X,GAEDuR,EAAYzH,SAASjN,KAAgB4rH,wBACrCz4G,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QACpB,UACAiY,EAAQnI,GAAI7P,YAEhB,CAAEm8H,WAAW,MAGtB,CAACnkH,EAASgQ,EAASuB,IAQhBm3G,EAAwB,yCAAG,WAC7Bn+H,EACA9C,GAF6B,UAAA4iB,EAAA,sEAIvBg7F,EACF59G,GD5NRkoB,EC6NyBplB,ED3NlBo+H,iBAAOh5G,GAAQ,SAAA1R,GAAK,OAAIA,OC6NtBylB,MAAK,WACFxZ,EAAY,mBAAoB,cAEnC0Z,OAAM,SAAC5rB,GACJA,EAAMgB,SAAWkR,EAAYlS,EAAMgB,QAAS,YAZvB,iCDxNL,IAC5B2W,ICuNiC,OAAH,wDAgB9B,OACI,eAACu3G,GAAD,WACI,eAACC,GAAD,WACI,eAAC,GAAD,WACI,cAACE,GAAD,UACI,cAAC1jF,GAAA,EAAD,CACI3jC,QAASA,EACT7D,QAAS2D,EACTrD,KAAK,UACLH,SAAS,0BAGjB,eAAC,GAAD,YACMwD,GACE,cAAC,GAAD,CAAUvG,YAAU,oBAApB,SACKiF,aAAcwB,MAGrBF,GACE,eAAC,GAAD,CAAOvG,YAAU,yBAAjB,UACKyG,GAAWA,EAAQ+2B,UAAW,IAC9B/2B,GAAWA,EAAQi3B,aAG1Bn3B,GACE,cAACgoH,GAAD,CAASvuH,YAAU,qBAAnB,SACKyG,GAAWA,EAAQrX,cAKnC+2F,IAAW0qB,GAAYsW,gBACpB,cAAC0G,GAAD,UACI,cAAC,IAAD,CACIvrH,MAAO,eACPhF,MAAO,QACPC,OAAQ,OACRjE,OAAQ21H,SAKxB,cAAC,KAAD,IACA,eAAClB,GAAD,WACI,cAACC,GAAD,UACI,eAACC,GAAD,WACI,eAAC,GAAD,CACI3iF,GAAIh9C,YAAcmgI,EAAcvgI,GAChCslH,gBAAiB,YACjB6b,OAAK,EACLrvH,YAAU,eAJd,UAMI,cAACmuH,GAAD,gCACA,cAACC,GAAD,OAEHxjB,GAAYgkB,GAAsBnoH,IAAY+zC,IAAoBwwD,GAC/D,eAAC,GAAD,CACI1/D,GAAIh9C,YAAcogI,EAAexgI,GACjCslH,gBAAiB,YACjB6b,OAAK,EACLrvH,YAAU,kBAJd,UAMI,cAACmuH,GAAD,8BACA,cAACC,GAAD,OAGPxjB,GAAYkkB,GACT,eAAC,GAAD,CACIxjF,GAAIh9C,YAAcqgI,EAAoBzgI,GACtCslH,gBAAiB,YACjB6b,OAAK,EACLrvH,YAAU,gBAJd,UAMI,cAACmuH,GAAD,4BACA,cAACC,GAAD,YAKhB,cAACC,GAAD,WACM9nH,GAAaE,EACX,eAAC,IAAD,WACI,cAAC,GAAD,CAAclY,KAAMkgI,EAAcY,OAAK,EAAvC,SACI,cAAC,GAAD,CACI5oH,QAASA,EACT6yB,QAASA,EACTsxE,SAAUA,EACVz4C,kBAAmBA,EACnB04C,kBAAmBA,EACnBC,WAAYA,EACZ3mE,KAAMA,EACNphC,SAAU,eACVgoG,iBAAkBA,MAGzBH,GACG,cAAC,GAAD,CAAcr8G,KAAMmgI,EAAeW,OAAK,EAAxC,SACI,cAAC,GAAD,CACI5oH,QAASA,EACTqlG,mBACIqjB,EAEJpsH,SAAU,sBAIrB6nG,GAAYkkB,GACT,cAAC,GAAD,CAAcvgI,KAAMogI,EAAoBU,OAAK,EAA7C,SACI,cAACve,GAAD,CAAe5iH,OAAQuY,EAAQnI,UAK3C,cAACgwH,GAAD,UACI,cAAC,KAAD,eAyHbgB,GAhHyB,WAAO,IAAD,EACpC74G,EAAUW,cACVkiB,EAAUnhB,YAAYkhB,MACtBnrC,EAASD,cACTshI,EAAYp3G,YAAY3R,MACxBlP,EAAO6gB,YAAYg2F,IACnBqhB,EAAcr3G,YAAYi2F,IAC1BiS,EAAa1iD,eACb8xD,EAAuBxxD,eACvByxD,EAAY3rF,eACZ4rF,EAAchxD,eACdhuD,EAAcnQ,cAXsB,EAYMwhB,oBAAS,GAZf,mBAYnC+oF,EAZmC,KAYjB6kB,EAZiB,KActCzrF,EAAI,UACHorF,GAAaj4H,GAAQi4H,EAAUjxH,KAAOhH,EAAKgH,UADxC,SAGJuxH,EAAa1rF,GAAOorF,GAAoBj4H,EAEtB,kBAAXpJ,GAAuB2hI,GAAcA,EAAWvxH,KAAOpQ,IAC9D2hI,OAAajgI,EACbu0C,GAAO,GAOX,IAAM2rF,EAAuBjhI,uBAAY,WACrC6gI,EAAqB,OAAXxhI,EAAA,OAAkBqhI,QAAlB,IAAkBA,OAAlB,EAAkBA,EAAWjxH,GAAOpQ,KAC/C,CAACwhI,EAAD,OAAYH,QAAZ,IAAYA,OAAZ,EAAYA,EAAWjxH,GAAIpQ,IAOvB6hI,EAA0BlhI,uBAAY,SAACX,GAC1C,OAAIA,KAAM,OAAKqhI,QAAL,IAAKA,OAAL,EAAKA,EAAWjxH,IACf+hH,IAEJqP,EAAUxhI,KAClB,QAACqhI,QAAD,IAACA,OAAD,EAACA,EAAWjxH,GAAI+hH,EAAYqP,IAOzBM,EAA8BnhI,uBAChC,SAACmC,EAAc9C,GACXuhI,EAAqBz+H,EAAM9C,EAAQi2C,GAAM,GACpCha,MAAK,kBAAM4lG,EAAwB7hI,QAE5C,CAACuhI,EAAsBtrF,EAAM4rF,IAO3BE,EAAiCphI,uBACnC,SAACX,EAAgB6wE,GACb6wD,GAAoB,GACpBD,EAAYzhI,EAAQ6wE,GACf50C,MAAK,kBAAM4lG,EAAwB7hI,MACnCm8B,OAAM,WAEH,OADAulG,GAAoB,GACbpkG,QAAQC,YAElBtB,MAAK,WACFylG,GAAoB,GACpBj/G,EAAY,kBAAmB,gBAG3C,CAACg/G,EAAaI,EAAyBp/G,IAO3C,OAJAwR,qBAAU,YACgB,kBAAXj0B,IAAP,OAA8BqhI,QAA9B,IAA8BA,OAA9B,EAA8BA,EAAWjxH,MAAIwxH,MAClD,CAACA,EAAD,OAAuBP,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAWjxH,GAAIpQ,IAGrC,cAAC,GAAD,CACIy8H,UAAWviI,IAAOkE,MAClB67H,SAAS,gBACTgF,cAAa,wBACT0C,EAAU,YACCA,EAAWryF,UADZ,YACyBqyF,EAAWnyF,UACxC,GAHG,cAKbktF,WAAW,EACX7nH,SAAS,gBATb,SAWI,cAAC,GAAD,CACI0T,QAASA,EACT6iB,QAASA,EACTprC,OAAQA,EACRuY,QAASopH,EACTjtH,QAAS4sH,EACTrrF,KAAMA,EACNsqF,aAAcrmI,IAAOmB,QACrBmlI,cAAetmI,IAAOoB,iBAAiBC,SACvCklI,mBAAoBvmI,IAAOoB,iBAAiBE,cAC5CqhH,iBAAkBA,EAClB54C,kBAAmB69D,EACnBnlB,kBAAmBolB,OCzepB,OAA0B,gC,SCKnCC,GAAwBrxH,IAAOC,IAAV,6EACT,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOuB,eAIxC6rI,GAAiBtxH,IAAOC,IAAV,6GAMdsxH,GAAmBvxH,YAAOkrC,UAAPlrC,CAAH,+KACT,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0B,YAiC1B4uD,GAzBA,WACX,OACI,cAAC68E,GAAD,UACI,eAACC,GAAD,WACI,8BACI,eAACC,GAAD,CAAkB9kF,GAAG,IAArB,0BACe9pB,oBAGnB,gCACI,cAAC4uG,GAAD,CAAkB9kF,GAAIljD,IAAO0E,QAA7B,qBAGA,cAACsjI,GAAD,CAAkB9kF,GAAIljD,IAAOyE,MAA7B,gCAGA,cAACujI,GAAD,CAAkB9kF,GAAIljD,IAAOwE,QAA7B,qCC7BdyjI,GAAsBxxH,IAAOC,IAAV,6JAQnByzC,GAAsB1zC,IAAOC,IAAV,0FAMnB0zC,GAAa3zC,YAAO0yG,GAAP1yG,CAAH,0EAKVyxH,GAAoBzxH,IAAOC,IAAV,wEAoDRyxH,GA/CO,SAAC,GAAqD,IAAnDC,EAAkD,EAAlDA,WAAY/5G,EAAsC,EAAtCA,QAajC,OACI,eAAC45G,GAAD,WACI,cAAC99E,GAAD,UACI,cAAC,GAAD,CACItvC,QARO,WACnBwT,EAAQH,KAAKluB,IAAOC,UAQRkV,OAAQ,GACRsE,MAAO/e,IAAUC,OAAOkB,UAG/BusI,GACG,eAACF,GAAD,WACI,cAAC,IAAD,CACI5wH,QAAQ,UACR8C,MAAO,CACHguD,SAAU,IACVviC,QAAS,SACTqvC,YAAa,IAEjBhkE,OA9BQ,WACxBmd,EAAQH,KAAKluB,IAAOE,WAAWU,WAsBnB,4BAWA,cAAC,IAAD,CACIwZ,MAAO,CAAEguD,SAAU,GAAIhvD,SAAU,IACjClI,OAhCA,WAChBmd,EAAQH,KAAKluB,IAAOE,WAAWC,QA6BnB,0BCxDdkoI,GAAyB5xH,IAAOC,IAAV,yKAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGxC0tI,GAAuB7xH,IAAOC,IAAV,gEA0BX6xH,gBArBQ,SAAC,GAK8B,IAJlDpuH,EAIiD,EAJjDA,SACAkU,EAGiD,EAHjDA,QACA+5G,EAEiD,EAFjDA,WACArzH,EACiD,EADjDA,UAMA,OAJAglB,qBAAU,WACNqd,OAAOoxF,SAAS,EAAG,KACpB,IAGC,eAACH,GAAD,WACI,cAAC,GAAD,CAAeD,WAAYA,EAAY/5G,QAASA,IAChD,cAACi6G,GAAD,CAAsBvzH,UAAWA,EAAjC,SACKoF,IAEL,cAAC,GAAD,UCjCNsuH,GAAoBhyH,IAAOC,IAAV,mQAYjBgyH,GAA+BjyH,IAAOC,IAAV,+EAI5BiyH,GAAsBlyH,IAAOi0C,IAAV,oDAGnBk+E,GAAuBnyH,IAAOoyH,GAAV,mKAIb,SAAAlyH,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAInCmtI,GAAwBryH,IAAOC,IAAV,uFAoCZqyH,GA/BM,SAAC,GAAwC,IAAtC16G,EAAqC,EAArCA,QAKpB,OACI,cAAC,GAAD,CAAgBlZ,OAAQ,QAAxB,SACI,eAACszH,GAAD,WACI,cAACC,GAAD,UACI,cAACC,GAAD,CAAqB5tH,IAAKiuH,OAE9B,cAACJ,GAAD,2EAGA,cAACE,GAAD,UACI,cAAC,IAAD,CACI1uH,MAAO,CACHguD,SAAU,IACVviC,QAAS,SACTqvC,YAAa,IAEjBhkE,OApBC,WACjBmd,EAAQH,KAAKluB,IAAOwD,QAaR,6B,sEC1DL,OAA0B,yCCA1B,OAA0B,yCCA1B,OAA0B,0C,S9BM7B49H,K,kBAAAA,E,gBAAAA,E,gBAAAA,E,iBAAAA,Q,KAOZ,IAAM6H,IAAS,sBACV7H,GAAS8H,QAAU,KADT,gBAEV9H,GAAS+H,OAAS,KAFR,gBAGV/H,GAASgI,OAAS,KAHR,gBAIVhI,GAASiI,OAAS,KAJR,IAOTC,IAAU,sBACXlI,GAAS8H,QAAU,KADR,gBAEX9H,GAAS+H,OAAS,KAFP,gBAGX/H,GAASgI,OAAS,KAHP,gBAIXhI,GAASiI,OAAS,KAJP,IAiDHE,GAAQ,CACjB,CACIpqF,YAAa,wDACby8D,MAAO4tB,IAEX,CACIrqF,YACI,qEACJy8D,MAAO6tB,IAEX,CACItqF,YACI,gEACJy8D,MAAO8tB,K+BrDR,SAASC,KACZ,IAAMC,EAbyB,qBAApBnyF,SAASoyF,OACT,SAE6B,qBAAtBpyF,SAASqyF,SAChB,WAEiC,qBAA1BryF,SAASsyF,cAChB,eAQX,OAAOH,IAAkBnyF,SAASmyF,GAG/B,I,kKCnBK5qH,GA8rBAgrH,GD9pBGC,GAbkB,WAAO,IAAD,EACD9gG,IAAMvP,SAAS+vG,MADd,mBAC5BO,EAD4B,KACjBC,EADiB,KAE7BC,EAAqB,kBAAMD,EAAaR,OAQ9C,OAPAxgG,IAAMpP,WAAU,WACZ,IAAMswG,EApCqB,qBAApB5yF,SAASoyF,OAET,mBAE6B,qBAAtBpyF,SAASqyF,SAChB,qBAEiC,qBAA1BryF,SAASsyF,aAChB,yBAEA,UA4BP,OADA3yF,OAAO6Z,iBAAiBo5E,EAAkBD,GAAoB,GACvD,WACHhzF,OAAOga,oBAAoBi5E,EAAkBD,OAG9CF,GEhCLI,GAAoB7zH,YAAO8sC,KAAO7sC,IAAdD,CAAH,yMAUjB8pG,GAAa9pG,YAAO8sC,KAAO7sC,IAAdD,CAAH,qEACF,SAAAE,GAAK,OAAIA,EAAMxB,UAChB,SAAAwB,GAAK,OAAIA,EAAMzB,SAGtBq1H,GAAiB9zH,YAAO8sC,KAAO7sC,IAAdD,CAAH,gJAKN,SAAAE,GAAK,OAAIA,EAAMxB,UAChB,SAAAwB,GAAK,OAAIA,EAAMzB,SACT,SAAAyB,GAAK,OAAIA,EAAMgtE,UACf,SAAAhtE,GAAK,OAChBs3D,gBAAcF,gBAAaC,eACrBr3D,EAAMzB,MAAQ,GACO,GAApByB,EAAMzB,MAAQ,OAIvBonE,GAAgB7lE,YAAO8sC,KAAO7sC,IAAdD,CAAH,qeAML,SAAAE,GAAK,OAAIA,EAAMxB,UAChB,SAAAwB,GAAK,OAAIA,EAAMzB,SACV,SAAAyB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIhC,SAAA+b,GAAK,OAAKA,EAAMgtE,OAAShtE,EAAMgtE,OAAS,MAOhC,SAAAhtE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOE,YAEjC,SAAA8b,GAAK,OAAIA,EAAM8mD,cAEV,SAAA9mD,GAAK,OACfA,EAAM8mD,WAAa,EAAI,kBAAoB,uBAMjD+sE,GAAuB,CACzBvlF,QAAS,CAAEwlF,QAAS,EAAGvlF,MAAO,GAC9BnB,OAAQ,CAAE0mF,QAAS,EAAGvlF,MAAO,GAC7BqzB,KAAM,CAAEkyD,QAAS,EAAGvlF,MAAO,KAGzBwlF,GAAqB,CACvBC,MAAO,CACHr1H,EAAG,IACHm1H,QAAS,GAEb1mF,OAAQ,CACJzuC,EAAG,EACHm1H,QAAS,IAEblyD,KAAM,SAACrjE,GACH,MAAO,CACHI,IAAKJ,EAAQ,IACbu1H,QAAS,KAoHNG,GA1GV,SAAC,GAAuE,IAA/DC,EAA8D,EAApEC,KAAmBC,EAAiD,EAAjDA,cAAeC,EAAkC,EAAlCA,aAAcC,EAAoB,EAApBA,cAAoB,EAChDrxG,mBAAS,CAAE4M,QAAS,EAAG0kG,KAAM,IADmB,mBACjEJ,EADiE,KAC3DK,EAD2D,OAE1CvxG,mBAAS,GAFiC,mBAEjEwxG,EAFiE,KAExDC,EAFwD,KAGpEC,EAAa1vG,mBACX2vG,EAAoBtB,KAEpBuB,EAAS/kI,uBAAY,WACnBqkI,EAAKI,OAAS3B,GAAMngH,OAAS,EAC7B+hH,EAAQ,CAAE3kG,QAASskG,EAAKI,KAAMA,KAAM,IAEpCC,EAAQ,CAAE3kG,QAASskG,EAAKI,KAAMA,KAAMJ,EAAKI,KAAO,MAErD,CAACJ,EAAKI,OAETnxG,qBAAU,WAWN,OAVAuxG,EAAW9kG,QAAUtuB,YAAW,WACxBqzH,IACgB,IAAZH,GACAC,EAAW,GACXG,KAEAH,EAAWD,EAAU,MAG9B,KACI,WACHK,cAAcH,EAAW9kG,YAE9B,CAACglG,EAAQJ,EAASG,IAErB,IAKMG,EjC/FyB,WAC/B,IAAMC,EAAcngF,eAAsBt2C,MAE1C,OAAIy2H,EAAcjxI,IAAU2E,YAAYC,IAC7B2pI,GAAU7H,GAAS8H,SACnByC,EAAcjxI,IAAU2E,YAAYE,MACpC0pI,GAAU7H,GAAS+H,QACnBwC,EAAcjxI,IAAU2E,YAAYG,QACpCypI,GAAU7H,GAASgI,QAEnBH,GAAU7H,GAASiI,QiCqFZuC,GACZC,EjClF0B,WAChC,IAAMF,EAAcngF,eAAsBt2C,MAE1C,OAAIy2H,EAAcjxI,IAAU2E,YAAYC,IAC7BgqI,GAAWlI,GAAS8H,SACpByC,EAAcjxI,IAAU2E,YAAYE,MACpC+pI,GAAWlI,GAAS+H,QACpBwC,EAAcjxI,IAAU2E,YAAYG,QACpC8pI,GAAWlI,GAASgI,QAEpBE,GAAWlI,GAASiI,QiCwEZyC,GAEnB,OACI,eAACxB,GAAD,WACI,cAAC,KAAD,CAAiBrlF,SAAS,EAAO8mF,iBAAe,EAAhD,SACI,cAAC,GAAD,CACI72H,MAAOw2H,EACPv2H,OAAQ02H,EAER5mF,QAAQ,UACRE,QAAQ,UACRozB,KAAM,CACFrzB,MAAO,CAAC,EAAG,GAAK,GAAK,EAAG,GACxBulF,QAAS,CAAC,EAAG,GAAK,EAAG,EAAG,IAE5BuB,SAAUxB,GACVxQ,WAAY,CACRK,SAAU,GAZlB,SAeI,cAACwQ,EAAD,CACIjvB,MAAO2tB,GAAMuB,EAAKtkG,SAASo1E,MAC3Bz8D,YAAaoqF,GAAMuB,EAAKtkG,SAAS2Y,YACjCqsF,OAAQ,WA5BxBC,cAAcH,EAAW9kG,SACzB6kG,EAAW,GA6BSG,QAjBHV,EAAKtkG,WAsBlB,cAAC,KAAD,CAAiBye,SAAS,EAAOyxE,OAAQgV,EAAzC,SACI,cAACnB,GAAD,CACIr1H,MAAOw2H,EACPv2H,OAAQ02H,EACRloD,OACIsnD,EACMn9D,gBAAcD,eACV,GACA,GACJC,gBAAcD,eACd,GACA,GAGV6oD,OAAQgV,EACRM,SAAUtB,GACVzlF,QAAQ,QACRE,QAAQ,SACRozB,KAAK,OACLyhD,WAAY,CACR1kH,EAAG,CAAE7D,KAAM,SAAUw6H,UAAW,IAAKC,QAAS,IAC9C7R,SAAU,IApBlB,SAuBI,cAACwQ,EAAD,CACIjvB,MAAO2tB,GAAMuB,EAAKI,MAAMtvB,MACxBz8D,YAAaoqF,GAAMuB,EAAKI,MAAM/rF,eAb7B2rF,EAAKI,QAiBlB,cAAC5uD,GAAD,CACI7e,WAAa2tE,EAAU,EAAK,IAC5Bl2H,MAAO81H,EACP71H,OAAQ41H,EACRpnD,OAAQsnD,QCnMlBX,GAAoB7zH,IAAOC,IAAV,uLAGK,SAAAC,GAAK,OAAIA,EAAMilG,SAMrC+L,GAAOlxG,IAAOC,IAAV,uMAIQ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMxCuhH,GAAc1lG,IAAOC,IAAV,4FACA,SAAAC,GAAK,OAAIA,EAAMyC,YACnB,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCswI,GAAa11H,IAAOC,IAAV,4UAIE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAOhC,SAAA2Z,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG3C,SAAA1D,GAAK,OAAKA,EAAM0D,UAAY,mBAIhC+xH,GAAkB31H,YAAO2yG,GAAP3yG,CAAH,oFAGR,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SA4B1BgvI,GArBV,SAAC,GAAoC,IAAlCjvB,EAAiC,EAAjCA,MAAOz8D,EAA0B,EAA1BA,YAAaqsF,EAAa,EAAbA,OACxB,OACI,cAAC,GAAD,CAAmB5vB,MAAOA,EAA1B,SACI,eAAC,GAAD,WACI,cAAC,GAAD,CACIxiG,SACIoyC,eAAsBt2C,MAAQxa,IAAU2E,YAAYC,IAC9C,GACA,GAJd,SAOK6/C,IAEL,cAACgtF,GAAD,CAAYtxH,QAAS2wH,EAAQnxH,UAAWmxH,EAAxC,SACI,cAACY,GAAD,YC9DdC,GAAuB51H,IAAOC,IAAV,+IAQpB41H,GAAiB71H,IAAOi0C,IAAV,2GAOdN,GAAa3zC,IAAOC,IAAV,oIAGH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SA6B1B8iI,G,gKAvBX,WACI,OACI,eAAC2O,GAAD,WACI,cAACC,GAAD,CACIvxH,IAAK0wC,KACLC,OAAM,UAAKC,KAAL,gBAA6BC,KAA7B,SAEV,cAAC,GAAD,UACK1L,eACG,cAACmK,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,MAER,cAAC,GAAD,CACIwgF,KAAMD,GACNE,cAAe,GACfC,aAAc,a,GAjBVhqB,aC/BXurB,GAAgB,WACzB,OACI,uDAAenzG,eAAf,0CCEFozG,GAAwB/1H,IAAOC,IAAV,mQAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxCmjF,GAAStnE,IAAOC,IAAV,wJAQN+1H,GAAOh2H,IAAOC,IAAV,wHAOJswD,GAAUvwD,IAAOC,IAAV,qEAKPq0B,GAAQt0B,IAAOC,IAAV,wJAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnCsgH,GAAc1lG,IAAOC,IAAV,sHAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCovD,GAASx0C,IAAOC,IAAV,sIAIC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAmC1BiiI,GA/BI,WACf,IAAMzvG,EAAUW,cAMhB,OACI,eAACw9G,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACItyH,MAAM,SACNhJ,OATI,WAChBmd,EAAQH,KAAKluB,IAAOE,WAAWC,QASnB+U,MAAM,QACNC,OAAO,WAGf,cAACs3H,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,gCACA,cAAC,GAAD,kIAMR,cAAC,GAAD,UAAQ,cAAC,GAAD,UC1ELC,GATQ,WACnB,OACI,qCACI,cAAC,GAAD,IACA,cAAC,GAAD,QCHNpC,GAAoB7zH,IAAOC,IAAV,oQAGK,SAAAC,GAAK,OAAIA,EAAMilG,SAQrC+L,GAAOlxG,IAAOC,IAAV,uMAIQ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMxCuhH,GAAc1lG,IAAOC,IAAV,qEAEJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnCswI,GAAa11H,IAAOC,IAAV,4UAIE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAOhC,SAAA2Z,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG3C,SAAA1D,GAAK,OAAKA,EAAM0D,UAAY,mBAIhC+xH,GAAkB31H,YAAO2yG,GAAP3yG,CAAH,oFAGR,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAoB1BgvI,GAbV,SAAC,GAAoC,IAAlCjvB,EAAiC,EAAjCA,MAAOz8D,EAA0B,EAA1BA,YAAaqsF,EAAa,EAAbA,OACxB,OACI,cAAC,GAAD,CAAmB5vB,MAAOA,EAA1B,SACI,eAAC,GAAD,WACI,cAAC,GAAD,UAAcz8D,IACd,cAAC,GAAD,CAAYtkC,QAAS2wH,EAAQnxH,UAAWmxH,EAAxC,SACI,cAAC,GAAD,YCnDda,GAAuB51H,IAAOC,IAAV,sHAOpB41H,GAAiB71H,IAAOi0C,IAAV,wGAOdiiF,GAAel2H,IAAOC,IAAV,iDAIZk2H,GAAsBn2H,IAAOC,IAAV,2GAMnB0zC,GAAa3zC,IAAOC,IAAV,oFAGH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGnCojH,GAAiBvnG,YAAOwnG,GAAPxnG,CAAH,4EAyCLinH,GApCG,WACd,IAAMrvG,EAAUW,cAMhB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CACIjU,IAAK0wC,KACLC,OAAM,UAAKC,KAAL,gBAA6BC,KAA7B,SAEV,cAAC+gF,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,UACK1sF,eACG,cAACmK,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,MAER,cAAC,GAAD,CAAgBzvC,QAlBZ,WAChBwT,EAAQH,KAAKluB,IAAOE,WAAWC,QAiBnB,yBAKR,cAAC,GAAD,CACI2qI,KAAMD,GACNE,cAAe,EACfC,aAAc,GACdC,cAAe,SC3EzBuB,GAAwB/1H,IAAOC,IAAV,2PAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxC6xI,GAAOh2H,IAAOC,IAAV,gEAKJswD,GAAUvwD,IAAOC,IAAV,mKAQPq0B,GAAQt0B,IAAOC,IAAV,iLAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAMnCsgH,GAAc1lG,IAAOC,IAAV,sKAIJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAMnCovD,GAASx0C,IAAOC,IAAV,qMAGC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAwB1BiiI,GAjBI,WACf,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,gCACA,cAAC,GAAD,kIAMR,cAAC,GAAD,UAAQ,cAAC,GAAD,UCxDL+O,GATW,WACtB,OACI,qCACI,cAAC,GAAD,IACA,cAAC,GAAD,QCHNvC,GAAoB7zH,IAAOC,IAAV,uLAGK,SAAAC,GAAK,OAAIA,EAAMilG,SAMrC+L,GAAOlxG,IAAOC,IAAV,uMAIQ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMxCuhH,GAAc1lG,IAAOC,IAAV,2FAEJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCswI,GAAa11H,IAAOC,IAAV,4UAIE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAOhC,SAAA2Z,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG3C,SAAA1D,GAAK,OAAKA,EAAM0D,UAAY,mBAIhC+xH,GAAkB31H,YAAO2yG,GAAP3yG,CAAH,oFAGR,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAoB1BgvI,GAbV,SAAC,GAAoC,IAAlCjvB,EAAiC,EAAjCA,MAAOz8D,EAA0B,EAA1BA,YAAaqsF,EAAa,EAAbA,OACxB,OACI,cAAC,GAAD,CAAmB5vB,MAAOA,EAA1B,SACI,eAAC,GAAD,WACI,cAAC,GAAD,UAAcz8D,IACd,cAAC,GAAD,CAAYtkC,QAAS2wH,EAAQnxH,UAAWmxH,EAAxC,SACI,cAAC,GAAD,YCrDda,GAAuB51H,IAAOC,IAAV,+IAQpB41H,GAAiB71H,IAAOi0C,IAAV,2GAOdiiF,GAAel2H,IAAOC,IAAV,4BAEZk2H,GAAsBn2H,IAAOC,IAAV,0HAMnB0zC,GAAa3zC,IAAOC,IAAV,oFAGH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SA+B1B8iI,G,gKA3BX,WACI,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CACI3iH,IAAK0wC,KACLC,OAAM,UAAKC,KAAL,gBAA6BC,KAA7B,SAEV,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,GAAD,UACK1L,eACG,cAACmK,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,UAIhB,cAAC,GAAD,CACIwgF,KAAMD,GACNG,aAAc,GACdD,cAAe,W,GArBX/pB,aCjClBwrB,GAAwB/1H,IAAOC,IAAV,mQAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxCmjF,GAAStnE,IAAOC,IAAV,wJAQN+1H,GAAOh2H,IAAOC,IAAV,wHAOJswD,GAAUvwD,IAAOC,IAAV,qEAKPq0B,GAAQt0B,IAAOC,IAAV,wJAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnCsgH,GAAc1lG,IAAOC,IAAV,6IAIJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCovD,GAASx0C,IAAOC,IAAV,6JAKC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAmC1BiiI,GA/BI,WACf,IAAMzvG,EAAUW,cAMhB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACI9U,MAAM,SACNhJ,OATI,WAChBmd,EAAQH,KAAKluB,IAAOE,WAAWC,QASnB+U,MAAM,QACNC,OAAO,WAGf,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,gCACA,cAAC,GAAD,kIAMR,cAAC,GAAD,UAAQ,cAAC,GAAD,UC5EL23H,GATW,WACtB,OACI,qCACI,cAAC,GAAD,IACA,cAAC,GAAD,QCDNC,GAAuBt2H,IAAOC,IAAV,4KAGR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAGxB,SAAAgb,GAAK,OAAKA,EAAM40C,SAAW,SAAW,SA+B7CyhF,GA5BK,WAChB,IAAMziE,E/CUoB,WAC1B,IAAMohE,EAAcngF,eAAsBt2C,MAE1C,OAAIy2H,EAAcjxI,IAAU2E,YAAYC,IAC7B8hI,GAAS8H,QACTyC,EAAcjxI,IAAU2E,YAAYE,MACpC6hI,GAAS+H,OACTwC,EAAcjxI,IAAU2E,YAAYG,QACpC4hI,GAASgI,OAEThI,GAASiI,O+CpBH4D,GACX1hF,EAAWgf,IAAa62D,GAASiI,OACnCjyH,EAAU,cAAC,GAAD,IAEd,OAAQmzD,GACJ,KAAK62D,GAAS8H,QAGd,KAAK9H,GAAS+H,OACV/xH,EAAU,cAAC,GAAD,IACV,MACJ,KAAKgqH,GAASgI,OACVhyH,EAAU,cAAC,GAAD,IACV,MACJ,KAAKgqH,GAASiI,OACVjyH,EAAU,cAAC,GAAD,IACV,MACJ,QACIA,EAAU,cAAC,GAAD,IAElB,OACI,cAAC21H,GAAD,CAAsBxhF,SAAUA,EAAhC,SACKn0C,Kf4QN,SAAS81H,KACZ,MAAO,CACHz7H,KAAMuN,GAAQmuH,0BAIf,SAASC,GAAwB3wE,GACpC,MAAO,CACHhrD,KAAMuN,GAAQquH,2BACd5wE,QAID,SAAS6wE,GAAwBj3H,GACpC,MAAO,CACH5E,KAAMuN,GAAQuuH,2BACdl3H,SAsCD,SAASm3H,KACZ,MAAO,CACH/7H,KAAMuN,GAAQyuH,iBAIf,SAASC,GAAqB9kI,GACjC,MAAO,CACH6I,KAAMuN,GAAQ2uH,wBACd/kI,QAID,SAASglI,GAAqBv3H,GACjC,MAAO,CACH5E,KAAMuN,GAAQ6uH,wBACdx3H,SAsDD,SAASy3H,GACZrxE,EACA36C,GAEA,MAAO,CACHrQ,KAAMuN,GAAQ+uH,oBACdtxE,OACA36C,e,SAtaI9C,K,oDAAAA,E,wDAAAA,E,wDAAAA,E,wEAAAA,E,4EAAAA,E,4EAAAA,E,oEAAAA,E,wEAAAA,E,wEAAAA,E,oCAAAA,E,oCAAAA,E,wEAAAA,E,sEAAAA,E,gDAAAA,E,wEAAAA,E,kEAAAA,E,wDAAAA,E,oDAAAA,E,wDAAAA,E,wDAAAA,E,kDAAAA,E,oDAAAA,E,kCAAAA,E,kDAAAA,E,kDAAAA,E,wDAAAA,E,kEAAAA,E,sCAAAA,E,0CAAAA,E,0CAAAA,E,kDAAAA,E,0FAAAA,E,gFAAAA,E,4DAAAA,E,gEAAAA,E,oEAAAA,E,oEAAAA,E,gEAAAA,E,0EAAAA,E,0EAAAA,E,8CAAAA,E,kDAAAA,E,kDAAAA,E,wEAAAA,E,4EAAAA,E,4EAAAA,E,wEAAAA,E,8EAAAA,E,kFAAAA,E,kFAAAA,E,8DAAAA,E,kEAAAA,E,kEAAAA,E,sFAAAA,E,8FAAAA,E,4DAAAA,E,gEAAAA,E,gEAAAA,E,oDAAAA,E,sDAAAA,E,8CAAAA,E,kDAAAA,E,kDAAAA,E,wCAAAA,E,8CAAAA,E,gFAAAA,E,sEAAAA,E,0CAAAA,E,8CAAAA,E,8CAAAA,E,0CAAAA,E,8CAAAA,E,8CAAAA,E,kCAAAA,E,4DAAAA,E,gEAAAA,E,gEAAAA,E,sDAAAA,E,0DAAAA,E,0DAAAA,E,sDAAAA,E,0DAAAA,E,0DAAAA,E,wCAAAA,E,4DAAAA,E,4DAAAA,E,0EAAAA,E,2DAAAA,Q,cA8rBAgrH,K,qDAAAA,E,0DAAAA,E,yDAAAA,E,gFAAAA,E,kEAAAA,E,4DAAAA,E,sDAAAA,Q,KA+DL,I,uFgBxmBDvxB,GAAOjiF,EAAQ,KAERw3G,GAAwB,WACjC,IAAMl2H,EAAWO,cACX41H,EAAgBh8H,eAChBsW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoI,GACGiJ,EhBrBD,CACHrG,KAAMuN,GAAQkvH,sBgBqBVD,EAAcp/H,GACTkzB,MAAK,SAAAn5B,GAEF,OADAkP,EhBnBb,SAA4BlP,GAC/B,MAAO,CACH6I,KAAMuN,GAAQmvH,sBACdvlI,QgBgBqBwlI,CAAmBxlI,IACrBA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBhBb,SAA4BzB,GAC/B,MAAO,CACH5E,KAAMuN,GAAQqvH,sBACdh4H,SgBaqBi4H,CAAmBj4H,EAAMgB,UAClCkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAUm2H,EAAe1lH,KAIrBgmH,GAA0B,WACnC,IAAMz2H,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBpBG,CACHrG,KAAMuN,GAAQwvH,oBgBoBf,CAAC12H,KAGK22H,GAAgC,WACzC,IAAM32H,EAAWO,cACX41H,EAAgBh8H,eAChBsW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoI,GACGiJ,EhBxBD,CACHrG,KAAMuN,GAAQ0vH,+BgBwBVT,EAAcp/H,GACTkzB,MAAK,SAAAn5B,GAEF,OADAkP,EhBtBb,SAAoClP,GACvC,MAAO,CACH6I,KAAMuN,GAAQ2vH,+BACd/lI,QgBmBqBgmI,CAA2BhmI,IAC7BA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBnBb,SAAoCzB,GACvC,MAAO,CACH5E,KAAMuN,GAAQ6vH,+BACdx4H,SgBgBqBy4H,CAA2Bz4H,EAAMgB,UAC1CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAUm2H,EAAe1lH,KAIrBwmH,GAA0B,WACnC,IAAMj3H,EAAWO,cACX41H,EAAgBh8H,eAChBsW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoI,GACGiJ,EhB5FD,CACHrG,KAAMuN,GAAQgwH,2BgB4FVf,EAAcp/H,GACTkzB,MAAK,SAAAn5B,GAEF,OADAkP,EhB1Fb,SAAiClP,GACpC,MAAO,CACH6I,KAAMuN,GAAQiwH,2BACdrmI,QgBuFqBsmI,CAAwBtmI,IAC1BA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBvFb,SAAiCzB,GACpC,MAAO,CACH5E,KAAMuN,GAAQmwH,2BACd94H,SgBoFqB+4H,CAAwB/4H,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAUm2H,EAAe1lH,KAIrB8mH,GAAgC,WACzC,IAAMv3H,EAAWO,cACXi3H,EAAsBxhI,eACtBuQ,EAAU0R,YAAY3R,MACtBmK,EAAcnQ,cAEpB,OAAO3R,uBACH,SAACmB,EAA4BskD,GAA2B,IAAD,cACnD,GAAI,OAAC7tC,QAAD,IAACA,OAAD,EAACA,EAASrU,UAAd,CACA,IAAMulI,EAA0C,CAC5C/mI,QACI,UAAAZ,EAAauX,eAAb,eAAsB2O,QAAO,SAAC5kB,EAAU0gB,GAKpC,MAJqB,WAAjBA,EAAOngB,QACPP,EAAWmhE,OAAOzgD,EAAOtN,QAGtBpT,IACR,MANH,UAMairC,KAAWtqC,OANxB,YAMkCsqC,KAAWC,SACjDnsC,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCmlC,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClCslC,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC4qC,UAAS,OAAEl2B,QAAF,IAAEA,GAAF,UAAEA,EAASrU,iBAAX,aAAE,EAAoB3D,WAC/B8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQxB,EAAawB,OACrBC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,GAC1DgmI,cAAa,UAAE5nI,EAAasK,cAAf,aAAE,EAAqB7L,YAExCyR,EhBtED,CACHrG,KAAMuN,GAAQywH,qCgBsEVH,EAAoBC,GACfxtG,MAAK,SAAAn5B,GAQF,OAPAkP,EhBpEb,SACHlP,EACAQ,EACA8iD,GAEA,MAAO,CACHz6C,KAAMuN,GAAQ0wH,qCACd9mI,OACAQ,SACA8iD,egB4DgByjF,CACI/mI,EACAhB,EAAawB,OACb8iD,IAGDtjD,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBjEb,SAAyCzB,GAC5C,MAAO,CACH5E,KAAMuN,GAAQ4wH,qCACdv5H,SgB8DqBw5H,CAAgCx5H,EAAMgB,UAC/CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,QAGlB,CAACyB,EAAD,OAAWuG,QAAX,IAAWA,OAAX,EAAWA,EAASrU,UAAWslI,EAAqB/mH,KAI/CunH,GAAoC,SAAC59H,GAC9C,IAAM4F,EAAWO,cACX03H,EAAuBp9H,eACvB4V,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgiB,EAAkByjC,GACfp0C,EhBxED,CACHrG,KAAMuN,GAAQgxH,mCgBwEVD,EAAqB79H,EAAQoyD,aAA8B77C,IACtDsZ,MAAK,SAAAn5B,GAQF,OAPAkP,EhBtEb,SACHlP,EACAQ,EACA8iD,GAEA,MAAO,CACHz6C,KAAMuN,GAAQixH,mCACdrnI,OACAQ,SACA8iD,egB8DgBgkF,CACItnI,EACA6f,EAAGrf,OACH8iD,IAGDtjD,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBnEb,SAAwCzB,GAC3C,MAAO,CACH5E,KAAMuN,GAAQmxH,mCACd95H,SgBgEqB+5H,CAA+B/5H,EAAMgB,UAC9CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAUi4H,EAAsB79H,EAAQqW,KAIpC8nH,GAA6B,WACtC,IAAMC,EAAsBl9H,eACtB0E,EAAWO,cACjB,OAAO5R,uBACH,SAAC4M,EAAoBC,GACjBwE,EAASo1H,MACToD,EAAoBj9H,EAAYC,GAC3ByuB,MAAK,WACFjqB,EhBtEb,SAAwBzE,EAAoBC,GAC/C,MAAO,CACH7B,KAAMuN,GAAQuxH,iBACdl9H,aACAC,cgBkEqBk9H,CAAen9H,EAAYC,IACpCwE,EAASs1H,SAEZnrG,OAAM,SAAC5rB,GACJyB,EAASw1H,GAAwBj3H,EAAMgB,eAGnD,CAACS,EAAUw4H,KA2BNG,GAAgC,WACzC,IAAM34H,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBpFG,CACHrG,KAAMuN,GAAQ0xH,2BgBoFf,CAAC54H,KAGK64H,GAA0B,WACnC,IAAM74H,EAAWO,cACXu4H,EAAmB/9H,cACnB0V,EAAcnQ,cACpB,OAAO3R,uBACH,SAACyD,GACG,OAAO0mI,EAAiB1mI,GACnB63B,MAAK,SAAAn5B,GhB1Ef,IAAiC6zD,EgB6EpB,OAFA3kD,GhB3EoB2kD,EgB2Ea7zD,EhB1E1C,CACH6I,KAAMuN,GAAQ6xH,2BACdp0E,UgByEYl0C,EAAY,4BAA6B,WAClC3f,KAEVq5B,OAAM,SAAC5rB,GAEJ,MADAkS,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAU84H,EAAkBroH,KAWxBuoH,GAA2B,SAAC5+H,GACrC,IAAM4F,EAAWO,cACX04H,EAAoB59H,eACpBoV,EAAcnQ,cACpB,OAAO3R,uBACH,SAACyD,GAEG,OADA4N,EAASo1H,MACF6D,EAAkB7+H,EAAQhI,GAC5B63B,MAAK,WhB1Jf,IAAwBzlB,EgB2JXxE,EAASs1H,GAAwB,CAAEl3H,GAAIsW,OAAOta,MAC9C4F,GhB5JWwE,EgB4JapS,EhB3JjC,CACHuH,KAAMuN,GAAQgyH,iBACd10H,cgB2JS2lB,OAAM,SAAC5rB,GAOJ,MANAyB,EAASw1H,GAAwBj3H,EAAMgB,UACvChB,EAAMgB,SACFkR,EACIvQ,KAA0B3B,EAAMgB,SAChC,SAEFhB,OAGlB,CAACnE,EAAQ4F,EAAUi5H,EAAmBxoH,KAIjC0oH,GAAwB,WAAyC,IAAxCC,EAAuC,wDACnEp5H,EAAWO,cACX84H,EAAiBp/H,eACjBwW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACg4B,GACG3mB,EAAS01H,MACT,IAAMxnI,EAA2Bi/D,aAAwBxmC,GAEzD0yG,EAAenrI,GACV+7B,MAAK,SAAAn5B,GACEsoI,GACAp5H,EACIoxD,aAAwBz0B,KAAajxC,MAAM0G,KAAMu0B,IAGzD3mB,EAAS41H,GAAqB9kI,OAEjCq5B,OAAM,SAAC5rB,GACJyB,EAAS81H,GAAqBv3H,EAAMgB,UACpCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUq5H,EAAgB5oH,EAAa2oH,KA6BnCE,GAA8B,SAACl/H,GACxC,IAAM4F,EAAWO,cACX6/B,EAAsBxoC,cACtB6Y,EAAcnQ,cACdnQ,EAAS0hB,eACf,OAAOljB,uBACH,SAACX,EAAgBkF,GACb,IAAMmtC,EAAiD,CACnD,CAAEryC,SAAQkF,YAERmP,EAAkB,GAMxB,OALAi+B,aAAgBnwC,EAAOW,KAAK+f,MAAO3d,EAASmP,GACxCA,EAASiP,OAAS,GAClBjP,EAASkS,SAAQ,SAAAxC,GAAI,OACjBsuB,EAAQjqB,KAAK,CAAEpoB,SAAQkF,QAAS6e,EAAK3T,QAEtCgiC,EAAoBC,GACtBpW,MAAK,WhBnFf,IACH06B,EACA36C,EgBkFgBhK,GhBnFhB2kD,EgBqFwB,CAAEvmD,GAAIhE,GhBpF9B4P,EgBqFwB,ShBnFjB,CACHrQ,KAAMuN,GAAQqyH,sBACd50E,OACA36C,gBgBmFYyG,EAAY,6BAA8B,cAE7C0Z,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACnF,EAAQjK,EAAQsgB,EAAa2vB,EAAqBpgC,KAY9Cw5H,GAA0C,SACnDp/H,GAEA,IAAM4F,EAAWO,cACXk5H,EAA2BH,GAA4Bl/H,GAC7D,OAAOzL,uBACH,SAACX,EAAgBkF,GACb8M,EAASo1H,MACTqE,EAAyBzrI,EAAQkF,GAC5B+2B,MAAK,WACFjqB,EhBjPb,SAAuChS,EAAgBkF,GAC1D,MAAO,CACHyG,KAAMuN,GAAQwyH,mCACd1rI,SACJkF,WgB6OyBymI,CAA8B3rI,EAAQkF,IAC/C8M,EAASs1H,SAEZnrG,OAAM,SAAC5rB,GACJyB,EAASw1H,GAAwBj3H,EAAMgB,eAGnD,CAACS,EAAUy5H,KAYNG,GAAwC,SACjDx/H,GAEA,IAAM4F,EAAWO,cACXk5H,EAA2BH,GAA4Bl/H,GAC7D,OAAOzL,uBACH,SAACX,EAAgBkF,GACb8M,EAASo1H,MACTqE,EAAyBzrI,EAAQkF,GAC5B+2B,MAAK,WACFjqB,EhBtQb,SAAqChS,EAAgBkF,GACxD,MAAO,CACHyG,KAAMuN,GAAQ2yH,gCACd7rI,SACAkF,WgBkQqB4mI,CAA4B9rI,EAAQkF,IAC7C8M,EAASs1H,SAEZnrG,OAAM,SAAC5rB,GACJyB,EAASw1H,GAAwBj3H,EAAMgB,eAGnD,CAACS,EAAUy5H,KAuCNM,GAAwC,WACjD,IAAM/5H,EAAWO,cACjB,OAAO5R,uBACH,SAAC6L,EAAmB8O,EAAkBC,GAClCvJ,EhBxNL,SACHxF,EACA8O,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQ8yH,gCACdx/H,UACA8O,UACAC,WgB+Ma0wH,CAA4Bz/H,EAAS8O,EAASC,MAE3D,CAACvJ,KAIIk6H,GAAoC,WAC7C,IAAMl6H,EAAWO,cACjB,OAAO5R,uBACH,SAACyL,GACG4F,EhBzOL,SAAiC5F,GACpC,MAAO,CACHT,KAAMuN,GAAQizH,2BACd//H,UgBsOaggI,CAAwBhgI,MAErC,CAAC4F,KA2BIq6H,GAAwB,WACjC,IAAMr6H,EAAWO,cACX+5H,EAAiB//H,cACjBkW,EAAcnQ,cACpB,OAAO3R,uBACH,SAAC6L,EAAiBihC,GAEd,OADAz7B,EhB/ND,CACHrG,KAAMuN,GAAQqzH,oBgB+NHD,EAAe,CAAC9/H,IAClByvB,MAAK,SAACn5B,GAKH,OAJAkP,EAASg2H,GAAwB,CAAE53H,GAAIuiG,MAAU,WAEjDlwF,EAAY,wBAAyB,WACtB,OAAfgrB,QAAe,IAAfA,OACO3qC,KAEVq5B,OAAM,SAAC5rB,GACJyB,EhBzNb,SAAiCzB,GACpC,MAAO,CACH5E,KAAMuN,GAAQszH,oBACdj8H,SgBsNqBk8H,CAAwBl8H,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUs6H,EAAgB7pH,KAItBiqH,GAA+B,SAACtgI,GACzC,IAAM4F,EAAWO,cACXo6H,EAA4BtgI,eAC5BoW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgiB,GAAsB,IAAD,UAClB3Q,EhB/KD,CACHrG,KAAMuN,GAAQ0zH,oCgB+KV,IAAMnuE,EAAa,UAAG97C,EAAGtJ,eAAN,aAAG,EAAY61B,MAC9B,SAAApH,GAAC,MAAgB,eAAZA,EAAEnkC,SAELzD,EAA0C,CAC5C0+D,iBAAgB,UAAEj8C,EAAG0lB,sBAAL,aAAE,EAAmBxkC,KAAK,KAC1Cg7D,aAAwB,OAAbJ,QAAa,IAAbA,OAAA,EAAAA,EAAejoD,aAAe9U,EACzCS,OAAM,UAAEwgB,EAAG6D,gBAAL,aAAE,EAAa3iB,KAAK,KAC1BR,MAAK,UAAEsf,EAAGtf,aAAL,QAAc,GACnBC,OAAM,UAAEqf,EAAGrf,cAAL,QAAe,EACrBC,MAAOof,EAAGnf,WACVC,KAAMsE,aAAsB4a,EAAGjf,QAAS,QAAQ,IAEpD,OAAOipI,EAA0BvgI,EAAQlM,GACpC+7B,MAAK,SAACn5B,GhBxLhB,IACH0X,EgBgMgB,OARAxI,EACI08B,aACIC,KAAanxC,SAAS4G,KACtBuqC,KAAanxC,SAASqxC,aACtBlsB,IAGR3Q,GhB/LhBwI,EgB+L8C1X,EhB7LvC,CACH6I,KAAMuN,GAAQ2zH,oCACdryH,iBgB4LmB1X,KAEVq5B,OAAM,SAAC5rB,GAGJ,OAFAyB,EhBrLb,SAA8BzB,GACjC,MAAO,CACH5E,KAAMuN,GAAQ4zH,oCACdv8H,SgBkLqBw8H,CAAqBx8H,EAAMgB,UACpCkR,EAAYlS,EAAMgB,QAAS,SACpB,aAGnB,CAACS,EAAU26H,EAA2BlqH,EAAarW,KAK9C4gI,GAA4B,WACrC,IAAMh7H,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EhBxMG,CACHrG,KAAMuN,GAAQ+zH,uCgBwMf,CAACj7H,KAGKk7H,GAAyC,SAClD9gI,EACAnG,GAEA,IAAM+L,EAAWO,cACX46H,EAA+B7gI,eAC/BmW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgiB,GACG,IAAMziB,EAAS4+D,aAAoCn8C,GAEnD,OADA3Q,EhBjLD,CACHrG,KAAMuN,GAAQk0H,qCgBiLHD,EAA6B/gI,EAAQnG,EAAc/F,GACrD+7B,MAAK,SAACn5B,GhB9KhB,IACH+F,EgBsLgB,OARAmJ,EACI08B,aACIC,KAAavvC,oBAAoBgF,KACjCuqC,KAAavvC,oBAAoByvC,aACjClsB,IAGR3Q,GhBrLhBnJ,EgBqLmD/F,EhBnL5C,CACH6I,KAAMuN,GAAQm0H,qCACdxkI,WgBkLmB/F,KAEVq5B,OAAM,SAAC5rB,GAGJ,OAFAyB,EhBjLb,SAAmCzB,GACtC,MAAO,CACH5E,KAAMuN,GAAQo0H,qCACd/8H,SgB8KqBg9H,CAA0Bh9H,EAAMgB,UACzCkR,EAAYlS,EAAMgB,QAAS,SACpB,aAGnB,CACIS,EACA/L,EACAknI,EACA1qH,EACArW,KAKCohI,GAA6B,SAAC1rI,GAAgC,IAAD,YAEtE,MAAO,CACHY,QAFyBZ,EAAa68D,4BAA8B78D,EAAa68D,2BAA2Br7C,OAElExhB,EAAa68D,2BAA6B,CAACtwB,KAAWtqC,OAAQsqC,KAAWC,UAAUzqC,KAAK,KAClI1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCslC,MAAK,UAAErnC,EAAasK,cAAf,aAAE,EAAqB7L,WAC5B8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,GAC1D+pI,aAAY,UAAE3rI,EAAamE,oBAAf,aAAE,EAA2B1F,WACzCkuC,UAAS,UAAE3sC,EAAaoC,iBAAf,aAAE,EAAwB3D,aAI9BmtI,GAA8B,WACvC,IAAM17H,EAAWO,cACXkQ,EAAcnQ,cACdq7H,EAAoB3lI,eAE1B,OAAOrH,uBACH,SAACmB,EAA4BskD,GACzBp0C,EhB9MD,CACHrG,KAAMuN,GAAQ00H,wCgB8MV,IAAM1tI,EAASstI,GAA2B1rI,GAC1C,OAAO6rI,EAAkBztI,GACpB+7B,MAAK,SAAAn5B,GAQF,OAPAkP,EhB7Mb,SACHnJ,EACAvF,EACA8iD,GAEA,MAAO,CACHz6C,KAAMuN,GAAQ20H,wCACdhlI,QACAvF,SACA8iD,egBqMgB0nF,CACIhrI,EACA5C,EAAOoD,OACP8iD,IAGDtjD,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhB1Mb,SAAsCzB,GACzC,MAAO,CACH5E,KAAMuN,GAAQ60H,wCACdx9H,SgBuMqBy9H,CAA6Bz9H,EAAMgB,UAC5CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAU27H,EAAmBlrH,KAIzBwrH,GAA0B,WACnC,IAAMj8H,EAAWO,cACX27H,EAAgBloI,eACtB,OAAOrF,uBACH,SAACsF,GAEG,OADA+L,EhBzLD,CACHrG,KAAMuN,GAAQi1H,wBgByLHD,EAAcjoI,GAChBg2B,MAAK,SAAAn5B,GhBtLf,IAA8B4D,EgBwLjB,OADAsL,GhBvLiBtL,EgBuLa5D,EhBtLvC,CACH6I,KAAMuN,GAAQk1H,wBACd1nI,gBgBqLmB5D,KAEVq5B,OAAM,SAAC5rB,GAEJ,MADAyB,EhBpLb,SAA8BzB,GACjC,MAAO,CACH5E,KAAMuN,GAAQm1H,wBACd99H,SgBiLqB+9H,CAAqB/9H,EAAMgB,UAC9BhB,OAGlB,CAACyB,EAAUk8H,KAINK,GAAmC,WAC5C,IAAMv8H,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhB7JG,CACHrG,KAAMuN,GAAQs1H,8BgB6Jf,CAACx8H,KAGKy8H,GAAqC,WAC9C,IAAMC,EAAsBjhI,cACtBgV,EAAcnQ,cACpB,OAAO3R,sBAAW,yCACd,WAAO+M,GAAP,UAAAkV,EAAA,+EAEc8rH,EAAoBhhI,GAFlC,4DAIQ+U,EAAW,OAAC,EAAD,yBAAC,KAAOlR,QAAS,SAJpC,YAOIkR,EAAY,GAAD,OACJ/U,EAAY4V,OADR,kBAEH5V,EAAY4V,OAAS,EAAI,OAAS,MAF/B,kBAIP,WAXR,yDADc,sDAed,CAACorH,EAAqBjsH,KAIjBksH,GAA0B,WACnC,IAAM38H,EAAWO,cACXq8H,EAAgB//H,eAChB4T,EAAcnQ,cACpB,OAAO3R,uBACH,SAACiN,GACGoE,EhBlQD,CACHrG,KAAMuN,GAAQ21H,gCgBmQV,IAAMnhI,EAAcE,EAAcgE,KAC9B,SAAA3D,GAAY,MACP,CACGA,eACAtC,KAAMgpC,SAIlB,OAAOi6F,EAAclhI,GAChBuuB,MAAK,SAAAn5B,GAUF,OAT2B,IAAvB4K,EAAY4V,SACZtR,EhB1QjB,SACHtE,EACAohI,GAEA,MAAO,CACHnjI,KAAMuN,GAAQ61H,gCACdrhI,cACAohI,cgBoQoBE,CACIthI,EACA,aAGR+U,EAAY,wBAAyB,YAElC3f,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhB1Qb,SAAsCzB,GACzC,MAAO,CACH5E,KAAMuN,GAAQ+1H,gCACd1+H,SgBuQqB2+H,CAA6B3+H,EAAMgB,UAC5CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAU48H,EAAensH,KAIrB0sH,GAA6B,WACtC,IAAMn9H,EAAWO,cACX68H,EAAmBphI,eACnBqhI,EAA2BnhI,eAC3BohI,EAAgCnhI,eAChCsU,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsN,GAEG,OADA+D,EhBhQD,CACHrG,KAAMuN,GAAQq2H,+BgBgQHjyG,QAAQsW,IAAI,CACfw7F,EAAiBnhI,GACjBohI,EAAyBphI,GACzBqhI,EAA8BrhI,KAE7BguB,MAAK,SAAAn5B,GACF,IAAM0sI,EAAa1sI,EAAK,GAClB2sI,EAAW3sI,EAAK,GAChB4sI,EAAgB5sI,EAAK,GAQ3B,OAPAkP,EhBrQb,SACHw9H,EACAC,EACAC,GAEA,MAAO,CACH/jI,KAAMuN,GAAQy2H,+BACdH,aACAC,WACAC,iBgB6PgBE,CACIJ,EACAC,EACAC,IAGD5sI,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBlQb,SAAoCzB,GACvC,MAAO,CACH5E,KAAMuN,GAAQ22H,+BACdt/H,SgB+PqBu/H,CAA2Bv/H,EAAMgB,UAC1CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CACIyB,EACAo9H,EACAC,EACAC,EACA7sH,KAKCstH,GAAkC,WAC3C,IAAM/9H,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBtQG,CACHrG,KAAMuN,GAAQ82H,6BgBsQf,CAACh+H,KAGKi+H,GAA6B,WACtC,IAAMj+H,EAAWO,cACjB,OAAO5R,uBACH,SAACuvI,EAAuB50H,EAAkBC,GACtCvJ,EhB9OL,SACHm+H,EACA70H,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQk3H,mBACdD,aACA70H,UACAC,WgBqOa80H,CAAiBH,EAAa50H,EAASC,MAEpD,CAACvJ,KAIIs+H,GAAgC,WACzC,IAAMt+H,EAAWO,cACjB,OAAO5R,uBACH,SAACwvI,GhBlRF,IAA6B//H,EgBmRxB4B,GhBnRwB5B,EgBmRK+/H,EhBlR9B,CACHxkI,KAAMuN,GAAQq3H,sBACdngI,UgBkRA,CAAC4B,KAWIw+H,GAAsC,WAC/C,IAAMx+H,EAAWO,cACXk+H,EAA4BjqI,cAC5Bic,EAAcnQ,cACdnQ,EAAS0hB,eACf,OAAOljB,uBACH,SAACsF,EAAsBf,GACnB,IAAMmtC,EAAuD,CACzD,CAAEpsC,eAAcf,YAEdmP,EAAkB,GACxBi+B,aAAgBnwC,EAAOW,KAAK+f,MAAO3d,EAASmP,GACxCA,EAASiP,OAAS,GAClBjP,EAASkS,SAAQ,SAAAxC,GAAI,OACjBsuB,EAAQjqB,KAAK,CAAEniB,eAAcf,QAAS6e,EAAK3T,QAEnDqgI,EAA0Bp+F,GACrBpW,MAAK,WhBpcf,IACHwzG,EACAzzH,EgBmcgBhK,GhBpchBy9H,EgBscwB,CAAEr/H,GAAInK,GhBrc9B+V,EgBscwB,ShBpcjB,CACHrQ,KAAMuN,GAAQw3H,wBACdjB,WACAzzH,gBgBocYyG,EAAY,6BAA8B,cAE7C0Z,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACpP,EAAQsgB,EAAaguH,EAA2Bz+H,KAI5C2+H,GAAqD,WAC9D,IAAM3+H,EAAWO,cACjB,OAAO5R,uBACH,SAACuH,EAAmBoT,EAAkBC,GAClCvJ,EhB/TL,SACH9J,EACAoT,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQ03H,8CACd1oI,UACAoT,UACAC,WgBuTQs1H,CACI3oI,EACAoT,EACAC,MAIZ,CAACvJ,KAII8+H,GAAkD,WAC3D,IAAM9+H,EAAWO,cACjB,OAAO5R,uBACH,SAACX,GACGgS,EhBlUL,SAA+ChS,GAClD,MAAO,CACH2L,KAAMuN,GAAQ63H,0CACd/wI,UgB+TagxI,CAAsChxI,MAEnD,CAACgS,KAIIi/H,GAAuB,WAChC,IAAMC,EAAgBviI,eAChB8T,EAAcnQ,cACpB,OAAO3R,uBACH,SAACswC,EAA4BxD,GACzByjG,EAAcjgG,GACThV,MAAK,WACFxZ,EAAY,gCAAiC,WAC9B,OAAfgrB,QAAe,IAAfA,UAEHtR,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAAC2/H,EAAezuH,KAwBX0b,GAAmC,WAC5C,IAAMnsB,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBnSG,CACHrG,KAAMu4H,GAAyBxqH,wBgBmShC,CAAC1H,KAGKm/H,GAAyC,WAClD,IAAMn/H,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBhTG,CACHrG,KAAMu4H,GAAyBkN,oCgBgThC,CAACp/H,KAuHKq/H,GAA8C,WACvD,IAAMr/H,EAAWO,cACjB,OAAO5R,uBACH,SAAC2wI,EAAkBh2H,EAAkBC,GACjCvJ,EhBjtBL,SACHs/H,EACAh2H,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQ8S,uCACdslH,SACAh2H,UACAC,WgBysBQg2H,CAAkCD,EAAQh2H,EAASC,MAG3D,CAACvJ,KAIIw/H,GAA0C,WACnD,IAAMx/H,EAAWO,cACjB,OAAO5R,uBACH,SAACq0D,GACGhjD,EhBhtBL,SAAuCgjD,GAC1C,MAAO,CACHrpD,KAAMuN,GAAQ6S,kCACdipC,SgB6sBay8E,CAA8Bz8E,MAE3C,CAAChjD,KA2BI0/H,GAA8B,SAACtlI,GACxC,IAAMulI,EAAiB9kI,eACjBmF,EAAWO,cAEjB,OAAO5R,uBACH,SAACgiB,GACG3Q,EhB/cD,CACHrG,KAAMuN,GAAQ04H,4BgB+cVD,EAAevlI,EAAQoyD,aAA8B77C,IAChDsZ,MAAK,SAAAn5B,GACFkP,EACI08B,aACIC,KAAa9wC,QAAQuG,KACrBuqC,KAAa9wC,QAAQgxC,aACrBlsB,IAGR3Q,EhBpd0B,SAC1ClP,GAIA,MAAO,CACH6I,KAAMuN,GAAQ24H,4BACd/uI,QgB6cqBgvI,CAA+BhvI,OAE3Cq5B,OAAM,SAAC5rB,GACJyB,EhB5c0B,SAC1CzB,GAEA,MAAO,CACH5E,KAAMuN,GAAQ64H,4BACdxhI,SgBucqByhI,CAA+BzhI,EAAMgB,eAG1D,CAACogI,EAAgBvlI,EAAQ4F,KAIpBigI,GAA+B,WACxC,IAAMjgI,EAAWO,cACX2/H,EAAuBhmI,eACvBuW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgiB,GACG3Q,EhB/cD,CACHrG,KAAMuN,GAAQi5H,4BgB+cVD,EAAqBvvH,GAChBsZ,MAAK,SAAAn5B,GAEF,OADAkP,EhB7c0B,SAC1ClP,GAEA,MAAO,CACH6I,KAAMuN,GAAQk5H,4BACdtvI,QgBwcqBuvI,CAA+BvvI,IACjCA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EhBxc0B,SAACzB,GAC3C,MAAO,CACH5E,KAAMuN,GAAQo5H,4BACd/hI,SgBqcqBgiI,CAA+BhiI,EAAMgB,UAC9CkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAUkgI,EAAsBzvH,KAI5B+vH,GAA6B,WACtC,IAAMxgI,EAAWO,cACjB,OAAO5R,uBACH,SAAC8xI,GACGzgI,EhB9c0B,SAACygI,GACnC,MAAO,CACH9mI,KAAMuN,GAAQw5H,mBACdD,YgB2caE,CAAuBF,MAEpC,CAACzgI,KAII4gI,GAAsC,WAC/C,IAAM5gI,EAAWO,cACjB,OAAO5R,uBACH,SAAC8xI,GhBhdqC,IAACI,EgBidnC7gI,GhBjdmC6gI,EgBidKJ,EhBhdzC,CACH9mI,KAAMuN,GAAQ45H,6BACdD,iBgBgdA,CAAC7gI,KAII+gI,GAA+B,WACxC,IAAM/gI,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBldG,CACHrG,KAAMuN,GAAQ85H,iCgBkdf,CAAChhI,KAGKihI,GAAqC,WAC9C,IAAMjhI,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBndG,CACHrG,KAAMuN,GAAQg6H,wCgBmdf,CAAClhI,KAGKmhI,GAA6B,WACtC,IAAMnhI,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EhBpdG,CACHrG,KAAMuN,GAAQk6H,gCgBodf,CAACphI,KCvyCD,SAASqhI,KACZ,IAAMnpH,EAAiB84B,eACjBz6B,EAAUW,cAChB,OAAOvoB,uBACH,SAACmpB,GACG,OAAII,EAAe5G,OAAS,MACNwG,EAAYtE,MAAK,SAAA2E,GAAC,OACpCD,EAAe7H,SAAS8H,YAKxB5B,EAAQH,KAAKluB,IAAOmB,QAAQiF,QAAQ,UAAW,UAGvD,CAAC4pB,EAAgB3B,I,kOCHb+qH,G,kBCFNC,GAAgC5iI,IAAOC,IAAV,mpBAQrB,SAAAC,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAI5C,SAAAwB,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAOlD,SAAAzC,GAAK,OACVA,EAAMs0G,SACAt0G,EAAMI,MAAMpc,OAAOkB,MACnB8a,EAAMI,MAAMpc,OAAOO,aAKX,SAAAyb,GAAK,OACfA,EAAMs0G,SACAt0G,EAAMI,MAAMpc,OAAOK,YAEnB,SAAA2b,GAAK,OAAKA,EAAM2iI,mBAAqB,IAAM,SAQxC,SAAA3iI,GAAK,OAAIA,EAAM4iI,cAAgB,OAG9C,SAAA5iI,GAAK,OACHA,EAAMs0G,UACN7sF,YADA,maAMsBznB,EAAMI,MAAMpc,OAAOK,SACvB2b,EAAM2iI,mBAAqB,IAAM,MAGlC3iI,EAAM4iI,cAAgB,QAOzCC,GAAqC/iI,YAAOkrC,UAAPlrC,CAAH,+hCAM1B,SAAAE,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAI5C,SAAAwB,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAQlD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAKnB,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAChC,SAAA2b,GAAK,OAAKA,EAAM2iI,mBAAqB,IAAM,SAY5C,SAAA3iI,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAChC,SAAA2b,GAAK,OAAKA,EAAM2iI,mBAAqB,IAAM,SAW3D7uB,GAAYh0G,IAAOC,IAAV,+MAGS,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAS9Cm+I,GAKD,SAAC,GAAkD,IAAhDt/H,EAA+C,EAA/CA,SAAU/C,EAAqC,EAArCA,QAASsiI,EAA4B,EAA5BA,WAAYC,EAAgB,EAAhBA,UACnC,OAAIviI,EAEI,cAAC0vB,GAAA,EAAD,CACI1vB,QAAS,kBAAGiwB,EAAH,EAAGA,KAAU2B,EAAb,EAAaA,QAAb,OACL5xB,EAAQ,CAAE4xB,QAAS2wG,EAAY3wG,EAAU3B,KAE7CN,WAAY4yG,EAAYD,OAAalyI,EACrC2+B,aAAc,CACVO,SAAU,SACVC,WAAY,QAEhBP,gBAAiB,CACbM,SAAU,MACVC,WAAY,QAEhBV,OAAO,EACPJ,QAAS,sBACTQ,eAAgB,EAChBC,iBAAkB,GAhBtB,SAkBK,SAAAxxB,GAAG,OAAI,mCAAGqF,EAASrF,QAKzB,mCAAGqF,EAASy/H,0BAgHR9T,GA7FV,SAAC,GAgBC,IAfHlrH,EAeE,EAfFA,MACA1J,EAcE,EAdFA,OACA66G,EAaE,EAbFA,OACA52G,EAYE,EAZFA,OACAokI,EAWE,EAXFA,aACApiG,EAUE,EAVFA,IACA0iG,EASE,EATFA,qBACAC,EAQE,EARFA,2BACAC,EAOE,EAPFA,mBACA3gI,EAME,EANFA,SACAijB,EAKE,EALFA,KACA29G,EAIE,EAJFA,cACA9vI,EAGE,EAHFA,KACA+vI,EAEE,EAFFA,iBACAt/H,EACE,EADFA,SAEM++H,EAAahlH,mBAAQ,WACvB,OACWxqB,IAGZ,CAACA,EAAMitC,IAEV,OAAKA,EAmCG,cAAC,GAAD,CACI//B,QAASilB,EACTs9G,UAAWK,EACXN,WAAYA,EAHhB,SAKK,SAAA5kI,GAAG,OACA,eAAC0kI,GAAD,CACI1kI,IAAKA,EACLouC,GAAI/L,EACJhiC,OAAQA,EACRi2G,gBAAiB,YACjBkuB,mBAAoBS,EACpB3/H,MACI2xG,EAAM,6BAEO8tB,GACAC,GAHP,gBAMOD,GAGjBzgI,SAAUA,EACVxB,YAAW+C,GAAQ,UAAOA,EAAP,YAAmB2oE,oBAAU1oE,IAjBpD,UAoBKA,EApBL,MAoBeq/H,GAAoB,cAAC,GAAD,UA3D3C,cAAC,GAAD,CACI7iI,QAASilB,EACTs9G,UAAWK,EACXN,WAAYA,EAHhB,SAKK,SAAA5kI,GAAG,OACA,eAACukI,GAAD,CACIvkI,IAAKA,EACL+F,QAAS3J,EACT+5G,WAAYc,EACZ52G,OAAQA,EACRokI,aAAcA,EACdD,mBAAoBS,EACpB3gI,SAAUA,EACVgB,MACI2xG,EAAM,6BAEO8tB,GACAC,GAHP,gBAMOD,GAGjBjiI,YAAW+C,GAAQ,UAAOA,EAAP,YAAmB2oE,oBAAU1oE,IAlBpD,UAoBKA,EApBL,OAoBgBq/H,GAAoB,cAAC,GAAD,WCnNlDC,GAA4BzjI,IAAOC,IAAV,kDA8DhByjI,GA1DmC,SAAC,GAW5C,IACCrf,EAXJsf,EAUE,EAVFA,KACAruB,EASE,EATFA,OACAsuB,EAQE,EARFA,UACAllI,EAOE,EAPFA,OACAokI,EAME,EANFA,aACAM,EAKE,EALFA,qBACAC,EAIE,EAJFA,2BACAC,EAGE,EAHFA,mBACA3gI,EAEE,EAFFA,SACAuB,EACE,EADFA,SA6CA,OA1CAmgH,EAAYsf,EAAK1iI,KAAI,SAAC0iI,GAClB,OAAKA,EAAKjjG,IAqBF,cAAC,KAAD,CAAgCvnB,YAAawqH,EAAKxqH,YAAlD,SACI,cAAC,GAAD,CACIhV,MAAOw/H,EAAKx/H,MACZu8B,IAAKijG,EAAKjjG,IACVhiC,OAAQA,EACR0kI,qBAAsBA,EACtBC,2BAA4BA,EAC5BC,mBAAoBA,EACpB3gI,SAAUA,EACVijB,KAAM+9G,EAAK/9G,KACX29G,cAAeI,EAAKJ,cACpB9vI,KAAMkwI,EAAKzyG,IACXsyG,iBAAkBG,EAAKH,iBACvBt/H,SAAUA,KAbIy/H,EAAKzyG,KAnB3B,cAAC,KAAD,CAAgC/X,YAAawqH,EAAKxqH,YAAlD,SACI,cAAC,GAAD,CACIhV,MAAOw/H,EAAKx/H,MACZ1J,OAAQ,kBAAMmpI,GAAaA,EAAUD,EAAKzyG,MAC1CokF,OAAQA,IAAWquB,EAAKzyG,IACxBxyB,OAAQA,EACRokI,aAAcA,EACdM,qBAAsBA,EACtBC,2BAA4BA,EAC5BC,mBAAoBA,EACpB3gI,SAAUA,EACVlP,KAAMkwI,EAAKzyG,IACXsyG,iBAAkBG,EAAKH,iBACvBt/H,SAAUA,KAbIy/H,EAAKzyG,QAuChC,cAACuyG,GAAD,UAA4Bpf,KCtFjCwf,GAAwB7jI,IAAOC,IAAV,iDAIrBitC,GAAcltC,IAAOC,IAAV,iPAIE,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAKjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC87D,GAAgBlhD,IAAOC,IAAV,uIAObmtC,GAAoBptC,IAAOC,IAAV,0QAIJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAMjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC4oD,GAAgBrtC,IAAOC,IAAV,sJAQbmhD,GAAwBphD,YAAOwD,IAAPxD,CAAH,oEAKd8jI,GAGR,SAAC,GAA6B,IAA3Bv0G,EAA0B,EAA1BA,UAAWw0G,EAAe,EAAfA,SACf,OACI,eAACF,GAAD,WACI,cAAC32F,GAAD,CAAa/rC,YAAU,0BAAvB,sDAGA,cAAC+/C,GAAD,UACI,eAAC,GAAD,CAAmB//C,YAAU,gCAA7B,+EAES4iI,EAFT,mEAMJ,cAAC12F,GAAD,UACI,cAAC+T,GAAD,UACI,cAAC,IAAD,CACI3iD,MAAM,QACNC,OAAO,OACPjE,OAAQ,kBAAM80B,KACdrrB,SAAS,gBAJb,4BCtEPqiB,GAAYvmB,IAAOC,IAAV,qDCOT+jI,GAAiD,SAAC,GAExD,IADHD,EACE,EADFA,SAEMx0I,EAAS00I,cACf,OACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIthI,SAAS,OACTuB,SAAS,OACTy/H,KAAM,CACF,CACIzyG,IAAK,WACL/sB,MAAO,WACPu8B,IAAKg9B,aAAWn0E,IAAOyD,YAAYH,SAAU,CACzC4O,OAAQlM,EAAOkM,SAEnBmqB,KAAM,gBAAG2M,EAAH,EAAGA,QAAH,OACF,cAAC,GAAD,CACIwxG,SAAUA,GAAY,GACtBx0G,UAAWgD,KAGnBgxG,eAAe,GAEnB,CACIryG,IAAK,UACL/sB,MAAO,UACPu8B,IAAKg9B,aAAWn0E,IAAOyD,YAAYE,QAAS,CACxCuO,OAAQlM,EAAOkM,gBChC9ByoI,GAA0B,WACnC,OACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIvhI,SAAS,OACTuB,SAAS,OACTy/H,KAAM,CACF,CACIzyG,IAAK,QACL/sB,MAAO,QACPu8B,IAAKn3C,IAAOyD,YAAYC,eAE5B,CACIikC,IAAK,kBACL/sB,MAAO,mBACPu8B,IAAKg9B,aAAWn0E,IAAO+D,yBCyChC62I,GA1DY/lI,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,glBACF4zB,UAAU,qCCU3BixG,GA1DqBhmI,sBAChC,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,0xBACF4zB,UAAU,sECvB3BkxG,GAzBYjmI,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,4zBACF4zB,UAAU,mC,SCZzBy2B,GAAO5pD,IAAOoD,OAAV,8TAQH,SAAAlD,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aACxC,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cACvB,qBAAG4b,MAAkBpc,OAAOS,aAChB,qBAAGwb,KAAmB,EAAI,KAC9C,qBAAGG,MAAkBpc,OAAOQ,cAIzBksE,GAAgB5wD,IAAOC,IAAV,+IAQb2hD,GAAa5hD,IAAOC,IAAV,oFAGV,gBAAGK,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOO,aAE7C6/I,GAAqBtkI,IAAOoD,OAAV,8TAYjB,SAAAlD,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aACxC,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cACvB,qBAAG4b,MAAkBpc,OAAOS,aAChB,qBAAGwb,KAAmB,EAAI,KAC9C,qBAAGG,MAAkBpc,OAAOQ,cAIzB6/I,GAAsBvkI,IAAOC,IAAV,+MAWnBukI,GAAaxkI,IAAOC,IAAV,4LCnBRwkI,GArCkBrmI,sBAS/B,WAAqEC,GAAS,IAA3E08C,EAA0E,EAA1EA,WAAY56C,EAA8D,EAA9DA,KAA8D,IAAxDyD,gBAAwD,aAAtC8gI,oBAAsC,MAAvB,EAAuB,EAApBxgI,EAAoB,EAApBA,SACvD,OACI,cAACogI,GAAD,CACIjmI,IAAKA,EACL+F,QAAS,kBAAOR,GAAYm3C,KAC5B56C,KAAMA,EACNyD,SAAUA,EACV+gI,WAAYD,EAAe,EAC3BvjI,YAAW+C,GAAQ,UAAOA,EAAP,WANvB,SAQI,cAAC,KAAD,CAAST,MAAO,UAAWmpC,OAAQ,cAAe1oC,SAAS,kBAA3D,SACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAYN,SAAUA,EAAtB,SACI,cAAC,GAAD,MAEH8gI,EAAe,GACZ,cAACH,GAAD,UACI,cAACC,GAAD,CACIrjI,YAAW+C,GAAQ,UAAOA,EAAP,0BCrCtC0gI,GAA2B,SAACzzI,GAAgC,IAAD,UAmB1B,EAlBtC0zI,EAAQ,IAEZ,OAAI1zI,QAAJ,IAAIA,GAAJ,UAAIA,EAAcumC,sBAAlB,aAAI,EAA8B/kB,UAC9BkyH,GAAgB1zI,EAAaumC,eAAe/kB,SAGhD,OAAIxhB,QAAJ,IAAIA,GAAJ,UAAIA,EAAc68D,kCAAlB,aAAI,EAA0Cr7C,UAC1CkyH,GAAgB1zI,EAAa68D,2BAA2Br7C,SAG5D,OAAIxhB,QAAJ,IAAIA,GAAJ,UAAIA,EAAc0kB,gBAAlB,aAAI,EAAwBlD,UACxBkyH,GAAgB1zI,EAAa0kB,SAAS1C,QAAO,SAAC1T,GAAD,OAAgBA,EAAK,KAAGkT,SAGzE,OAAGxhB,QAAH,IAAGA,GAAH,UAAGA,EAAcuX,eAAjB,aAAG,EAAuBmM,MAAK,SAAAzB,GAAI,MAAmB,eAAfA,EAAKpgB,QAAyC,IAAfogB,EAAKvN,YACvEg/H,GAAS,GAGb,OAAG1zI,QAAH,IAAGA,GAAH,UAAGA,EAAcm9D,uBAAjB,aAAG,EAA+B37C,UAC9BkyH,GAAK,OAAE1zI,QAAF,IAAEA,GAAF,UAAEA,EAAcm9D,uBAAhB,aAAE,EAA+B37C,QAG1C,OAAOkyH,G,2BCMIC,GA5BY1mI,sBACvB,WAAkCC,GAAS,IAAxCC,EAAuC,EAAvCA,UAAmB4F,GAAoB,EAA5B3F,OAA4B,EAApB2F,UAClB,OACI,sBACI7F,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BACNwC,YAAW+C,EARf,UAUI,sBACIsrD,YAAU,UACVC,YAAU,UACVlwD,EAAE,0OACFF,KAAK,YAET,sBACIE,EAAE,8OACFF,KAAK,kBCCnBknB,GAAYvmB,IAAOC,IAAV,iHAMTkvB,GAAUnvB,IAAOC,IAAV,+IASP2gD,GAAkB5gD,IAAOC,IAAV,2HAQf8kI,GAAkB/kI,IAAOC,IAAV,gKAQf+kI,GAAahlI,IAAOC,IAAV,qGAMV+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8oD,GAAgBvtC,IAAOC,IAAV,uDAIbilI,GAAqBllI,YAAO8kI,GAAP9kI,CAAH,qDAuKTmlI,GAzJV,SAAC,GAQC,IAPHC,EAOE,EAPFA,kBACAC,EAME,EANFA,eACAC,EAKE,EALFA,eACAvzI,EAIE,EAJFA,OACAwzI,EAGE,EAHFA,eACAC,EAEE,EAFFA,gBACAC,EACE,EADFA,QACE,EAC8BtiH,mBAASpxB,GADvC,mBACKU,EADL,KACeizI,EADf,KAEIl0I,EAASm5B,eACTg7G,EAAapyH,eACbqyH,EAAepyH,eAJnB,EAKkC2P,qBAAWsiH,GAL7C,mBAKKI,EALL,KAKiBC,EALjB,KAOIC,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAKJ,IAAMI,EAAwBh2I,uBAC1B,SAACi2I,EAA4B5gH,GACrBA,EAAEgwB,OAAO1qC,QACT+6H,EAAY,GAAD,oBAAKjzI,GAAL,CAAewzI,KAE1BP,EAAYjzI,EAAS0gB,QAAO,SAAAC,GAAI,OAAIA,IAAS6yH,QAGrD,CAACP,EAAajzI,IAGZghG,EAAiBzjG,uBAAY,WAC/Bs1I,EAAe7yI,GACf4yI,EAAe7zI,EAAO6iB,UACtBsxH,IACAJ,IACAC,EAAgBK,KACjB,CACCP,EACA7yI,EACA4yI,EACA7zI,EAAO6iB,SACPkxH,EACAI,EACAH,EACAK,IAGEK,GACI,OAAN10I,QAAM,IAANA,OAAA,EAAAA,EAAQ6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,QAASlgB,EAASkgB,QAAUkzH,EAAa,EAAI,GAEjFM,EAAiBryH,eASvB,OACI,eAAC,GAAD,WACI,eAACqb,GAAD,WACI,cAACoF,GAAA,EAAD,CACIpwB,MAAO,qBACPD,SAAS,qBAFb,SAII,cAAC6gI,GAAD,UACM1oG,OAAOtrB,KAAKuqD,MAAoCr6D,KAC9C,SAAAmS,GAAI,aACA,cAAC4xH,GAAD,CAAuB7jI,YAAU,oCAAjC,SACI,cAAC2iB,GAAA,EAAD,CACInZ,QAASlY,EAASif,SAAS0B,GAC3B0S,aAAc,SAAAT,GAAC,OACX2gH,EAAsB5yH,EAAMiS,IAEhC5hB,MAAO63D,KAAYloD,GAAMjP,MACzB4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAEo3D,KAAYloD,UAAd,aAAE,EAAmBlP,YAVpBkP,UAiBjC,cAACmhB,GAAA,EAAD,CAAUpwB,MAAO,UAAWD,SAAS,UAArC,SACI,cAAC6gI,GAAD,UACI,eAACC,GAAD,WACI,cAAClhH,GAAA,EAAD,CACInZ,QAASk7H,EACT//G,aAAc,SAAAT,GAAC,OACXygH,EAAczgH,EAAEgwB,OAAO1qC,UAE3BlH,MAAM,UACNsiB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAS,sBAEb,cAACghI,GAAD,CAAoBhhI,SAAS,6BAIzC,cAACqwB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,SAApC,SACI,cAAC08C,GAAD,UACI,cAAC,KAAD,CACI93B,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAACo8G,GAAD,CAAgB9jI,YAAU,wBAA1B,UACK+kI,EADL,eAGA,cAAC34F,GAAD,UACI,cAAC,IAAD,CACI3pC,UAAWsiI,EACXrlI,QAAQ,UACRpC,MAAO,QACPhE,OAAQ,kBArExB0rI,IACAT,EAAY,SACZI,GAAc,IAoEE5hI,SAAS,uBALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,uBAHb,iCC9FDkiI,GA5HV,SAAC,GAOC,IAAD,EANFrwI,EAME,EANFA,WACAiwD,EAKE,EALFA,KACAp+C,EAIE,EAJFA,QACAy+H,EAGE,EAHFA,kBACAC,EAEE,EAFFA,6BACA9wB,EACE,EADFA,SAGM59F,EAAUW,cACV+W,EAAanK,iBAAO,MAEpBohH,EAAwBv2I,uBAC1B,SAACyP,GACQA,GAAOumD,KAASA,GAASA,EAAKvmD,KAEnC+Y,YACIZ,EACAruB,IAAOyD,YAAYK,eAAe1B,mBAAmBgE,QACjD,UACAq2D,EAAKvmD,GAAKumD,EAAKvmD,GAAG7P,WAAa,IACjCD,QAAQ,gBAAiB8P,EAAG7P,eAGtC,CAACgoB,EAASouC,IAGd,OACI,+BACI,qBAAK3nD,IAAKixB,EAAV,SACI,eAAC,GAAD,CAAcwlF,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,cAA7D,UACI,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgB+hI,2BAFxB,SAKI,cAAC,GAAD,CACIpiI,QAAS,kBACLiiI,EAAkBtwI,EAAWT,eAEjC4O,SAAS,4BAJb,6BASJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB2rC,mBADlC,SAGI,cAAC,GAAD,CACIhsC,QAAS,SAAAihB,GACLA,EAAEC,kBAEEvvB,EAAWT,cACX0wD,GACAA,EAAKvmD,IAEL8mI,EACIxwI,EAAWT,eAIvB4O,SAAS,2BAbb,4BAkBJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBgiI,yBADlC,SAGI,cAAC,GAAD,CACIriI,QAAS,SAAAihB,GACLA,EAAEC,kBACFghH,EACIvwI,EAAWT,eAGnB4O,SAAS,4BAPb,6BAYHiC,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MACzB,cAAC,GAAD,CACI2Q,QAAS,SAAAihB,GACLA,EAAEC,kBACEvvB,EAAWT,cACXsiB,EAAQH,KACJluB,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QACvC,gBACAoG,EAAWT,aAAa1F,cAIxCsU,SAAS,8BAXb,8BAgBA,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgByrC,oBADlC,SAGI,cAAC,GAAD,CACI9rC,QAAS,SAAAihB,GACLA,EAAEC,kBACEvvB,EAAWT,cACXsiB,EAAQH,KACJluB,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QACvC,gBACAoG,EAAWT,aAAa1F,cAIxCsU,SAAS,8BAXb,wCC9GfwiI,GAAiB,SAAC5kI,GAAD,OAAqBA,EAAM6kI,aAiC5CC,GAA0B,SAAC9kI,GAAD,OAAqBA,EAAM+kI,sB,UCpCrDC,GAAmB9mI,IAAOC,IAAV,oIAOhB8mI,GAAkC/mI,IAAOC,IAAV,+IAO/B+mI,GAA0BhnI,IAAOC,IAAV,kDAIvBgnI,GAAsCjnI,IAAOC,IAAV,oKAInC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAK5Bgb,GAAcJ,IAAOC,IAAV,4GAGX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOa,SAI5BmiJ,GAA0BlnI,IAAOC,IAAV,qHAGvB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5B+hJ,GAAgBnnI,IAAOC,IAAV,uDAIb0tF,GAAa3tF,IAAOC,IAAV,0FAMVytF,GAAS1tF,YAAOurC,KAAPvrC,CAAH,2FAGC,gBAAGy+D,EAAH,EAAGA,YAAH,OACZA,EAAW,UAAMA,EAAN,MAAwB,SAG9B2oE,GAA0BpnI,IAAOC,IAAV,qDAIvBonI,GAAuBrnI,IAAOC,IAAV,iDAIpBwtF,GAA0BztF,IAAOC,IAAV,uIAQvBqnI,GAAiBtnI,IAAOC,IAAV,4EAKdsnI,GAAcvnI,IAAO0nB,KAAV,kDAIXw9G,GAAqBllI,YAAO8kI,GAAP9kI,CAAH,qDAIlBwnI,GAAmBxnI,IAAOC,IAAV,k5BA8FhBwnI,IA9CwBznI,IAAOC,IAAV,45BA8CcD,IAAOC,IAAV,0OAI3B,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,UAOjCujJ,GAAmB1nI,IAAOC,IAAV,2NAOX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIjCwjJ,GAAuB3nI,IAAOC,IAAV,qHAGpB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5BmjJ,GAAwB5nI,IAAOC,IAAV,2FACrBhc,IAAUC,OAAOkB,OAKjByiJ,GAAkB7nI,YAAOgwD,KAAPhwD,CAAH,wFAMf8nI,GAA8B9nI,IAAOC,IAAV,uIAQ3BktE,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,kBAEb44G,qBAAsB,CAClB3gC,eAAgB,2BAEhB5oG,MAAO,iBACP,0BAA2B,CACvBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,mBAIfwpI,0BAA2B,CACvBxpI,MAAO,iBAEP,2BAA4B,CACxBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,mBAGX,2BAA4B,CACxBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,mBAIfypI,mBAAoB,CAChBxpI,OAAQ,kBACRg+D,SAAU,WACVolC,QAAS,OACTsF,cAAe,SACfhhC,KAAM,GAGV+hE,kBAAmB,CACfzpI,OAAQ,mBAGZ0pI,qCAAsC,CAClCC,UAAW,uBAGfC,qCAAsC,CAClCD,UAAW,uBAGfE,gBAAiB,CACb5lI,SAAU,OACVjE,OAAQ,OACR0wB,QAAS,GAGbo5G,gBAAiB,CACbnhC,eAAgB,2BAIXohC,GAAuBzoI,YAAOgwD,KAAPhwD,CAAH,4DAIpB0oI,GAAgC1oI,IAAOC,IAAV,wHAExB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKjCwkJ,GAAgB3oI,YAAOisC,KAAPjsC,CAAH,gEAIb4oI,GAAsB5oI,IAAOC,IAAV,kIAOnBshH,GAAiBvhH,IAAOC,IAAV,kDAId4oI,GAAgB7oI,IAAOC,IAAV,0SACb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAc5BgiJ,GAAuB9oI,YAAO6oI,GAAP7oI,CAAH,6EAKpB+oI,GAA0B/oI,YAAO6oI,GAAP7oI,CAAH,8FAKvBgpI,GAAyBhpI,YAAO6oI,GAAP7oI,CAAH,6EAKtBipI,GAAsBjpI,IAAOC,IAAV,mHAOnBipI,GAAiBlpI,IAAOC,IAAV,uGAMdkpI,GAAanpI,IAAOC,IAAV,2HACjB,SAAAC,GAAK,QAAMA,EAAMkpI,QAAR,yCAGF,SAAAlpI,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5BikJ,GAAcrpI,IAAOC,IAAV,4FAGX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5B6kJ,GAAetpI,IAAOC,IAAV,oDAIZspI,GAAWvpI,IAAOC,IAAV,uFAKR4xD,GAAuB7xD,IAAO0nB,KAAV,+NAOpB,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5BsgJ,GAAkB/kI,IAAOC,IAAV,uEAKfupI,GAAqBxpI,IAAO0nB,KAAV,4FAGlB,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOY,SAG5B2kJ,GAA+BzpI,IAAOC,IAAV,mOAMjB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOoE,2BAKvCq+H,GAAqB3mH,IAAOC,IAAV,8IAQlBypI,GAAe1pI,IAAO0nB,KAAV,6FAGZ,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAG5BukJ,GAAkB3pI,IAAO0nB,KAAV,2FAGf,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAG5BwkJ,GAAoB5pI,YAAO8kI,GAAP9kI,CAAH,qDAIjB6pI,GAA2B7pI,IAAOC,IAAV,2J,SCxcxB6pI,GAAa,SACtB92I,EACA8O,EACAyoB,GAOA,MAAO,CACHt3B,IANQ6O,GAASA,EAAM9O,QAAUA,EAAQ8O,EAAM7O,SAAMlC,EAOrDqT,QANYpU,uBAAY,kBAAMu6B,EAASv3B,KAAkB,CACzDA,EACAu3B,MCRKw/G,GAAsB,kBAC/B/5I,uBAAY,SAACT,GAA8B,IAEnCgnG,EAMAhnG,EANAgnG,WACAyzC,EAKAz6I,EALAy6I,eACAn3I,EAIAtD,EAJAsD,WACAo3I,EAGA16I,EAHA06I,UACAC,EAEA36I,EAFA26I,QACAC,EACA56I,EADA46I,wBAGAC,EAA+B,CAC/BC,gBAAgB,EAChBC,eAAe,EACfC,gBAAgB,EAChBlgH,gBAAgB,EAChBymE,oBAAoB,EACpBC,0BAA0B,EAC1BC,0BAA0B,EAC1BC,4BAA4B,GAG1Bu5C,GAAWj0C,GAAcA,EAAa,EACtCk0C,GAAgB53I,GAAcA,EAAW8f,OAAS,EAClD+3H,GAAaV,GAAkBA,EAAiB,EAChDW,GAAqBV,IAAcC,EAqEzC,OAnEIM,GAAWC,GAAgBC,GAAaC,GACxCP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,GACjCu5C,IAAYC,GAAgBC,GAAaC,GAChDP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,GACjCu5C,GAAWC,GAAgBC,IAAcC,GAChDP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,GACjCu5C,GAAWC,IAAiBC,IAAcC,GACjDP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,GACjCu5C,GAAWC,IAAiBC,GAAaC,GAChDP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,IACjCu5C,GAAYC,GAAkBC,GAAcC,GAUnDP,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,IAhBxCm5C,EAAWC,gBAAiB,EAC5BD,EAAWE,eAAgB,EAC3BF,EAAWG,gBAAiB,EAC5BH,EAAW//G,gBAAiB,EAC5B+/G,EAAWt5C,oBAAqB,EAChCs5C,EAAWr5C,0BAA2B,EACtCq5C,EAAWp5C,0BAA2B,EACtCo5C,EAAWn5C,4BAA6B,GAWxCk5C,IACAC,EAAWC,gBAAiB,GAEzBD,IACR,K,oBCjGMQ,GAAc,SACvBz5I,EACAghB,EACA1W,EACAnG,EACAjG,GAEA,IAAIw7I,EAAS,gBAAO15I,GAepB,OAdA05I,EAAUl4I,OAAS,EACnBk4I,EAAUn4I,MAAQyf,EAEd1W,IACAovI,EAAUpvI,OAASjM,SAASiM,IAE5BnG,IACAu1I,EAAUv1I,aAAe9F,SAAS8F,IAGlCjG,IACAw7I,EAAUx7I,OAASG,SAASH,IAGzBw7I,G,kBCoDL94C,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GAEVC,GA8BR,SAAC,GAmBC,IAAD,UAlBFnjI,EAkBE,EAlBFA,QACAgQ,EAiBE,EAjBFA,QACAroB,EAgBE,EAhBFA,OACAsa,EAeE,EAfFA,YACAm8C,EAcE,EAdFA,KACAglF,EAaE,EAbFA,gBACA5xF,EAYE,EAZFA,kBACA3e,EAWE,EAXFA,QACA7xB,EAUE,EAVFA,eACAqiI,EASE,EATFA,0BACAlnI,EAQE,EARFA,QACAy6C,EAOE,EAPFA,oBACA0sF,EAME,EANFA,yBACAC,EAKE,EALFA,6BACAC,EAIE,EAJFA,qBACAC,EAGE,EAHFA,uBACAt0C,EAEE,EAFFA,cACA4vC,EACE,EADFA,YAEM2E,EAAgB5I,KAChB10D,EAAUb,KAFd,EAIwChqD,mBAAS,IAAIhD,MAJrD,mBAIK+mD,EAJL,KAIoBqkE,EAJpB,OAKoCpoH,oBAAkB,GALtD,mBAKK8mD,EALL,KAKkBuhE,EALlB,OAMkCroH,mBAChC,MAPF,mBAMKsoH,EANL,KAMiBC,EANjB,KAUI30G,EAAoC,CACtClkC,WAAY,GACZE,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/B4iB,SAAUjN,EACVlW,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf8kB,eAAgB,IAGdi0G,GACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,SACfo3I,EAAYz1G,MAAQ8M,KAAanxC,SAAS4G,KACpCkzI,EAAYp3I,OACZwnC,EA1BR,EAqCED,aAAqB60G,GARrBx6I,EA7BF,EA6BEA,aACAg4B,EA9BF,EA8BEA,cACA4O,EA/BF,EA+BEA,WACAE,EAhCF,EAgCEA,YACAS,EAjCF,EAiCEA,UACAC,EAlCF,EAkCEA,UACAI,EAnCF,EAmCEA,oBACA7B,EApCF,EAoCEA,UAEE2mF,GAAwB1C,GAAahqH,GACrCy6I,GAAmBzwB,GAAa1gF,GAAWA,EAAQh7B,IAAI,GAEvDqY,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEAiB,GACFliI,GACAA,EAAYqI,OACZssC,GACAA,EAAoB7rC,OAAS9I,EAAYqI,MAAMS,OAE7C5f,GAAU5B,EAAa4B,QACvBi5I,GAASlC,GAAW,OAAQ/2I,GAASglC,GACrCk0G,GAAYnC,GAAW,UAAW/2I,GAASglC,GAC3Cm0G,GAAYpC,GAAW,yBAA0B/2I,GAASglC,GAC1Do0G,GAAerC,GACjB,yBACA/2I,GACAglC,GAEEq0G,GAActC,GAAW,uBAAwB/2I,GAASglC,GAC1Ds0G,GAAmBvC,GAAW,gBAAiB/2I,GAASglC,GACxD5e,GAAck5B,eAGdo+C,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,GACzColG,YAAuB,OAAX1sF,QAAW,IAAXA,OAAA,EAAAA,EAAaqI,MAAMS,SAAU,IAGvC0zH,GAAoBr2I,uBACtB,SAACyP,GACQA,GAAOumD,KAASA,GAASA,EAAKvmD,KAG/B0Z,GAAYzH,SAASjN,KAAgB+hI,4BAErC5uH,EAAQH,KACJluB,IAAOyD,YAAYK,eAAe3B,qBAAqBiE,QACnD,UACAq2D,EAAKvmD,GAAKumD,EAAKvmD,GAAG7P,WAAa,IACjCD,QAAQ,gBAAiB8P,EAAG7P,YAC9B,CACIm8H,WAAW,MAK3B,CAACn0G,EAASuB,GAAa6sC,IAcrBumF,GAA4Bv8I,uBAC9B,SAAC2a,GACG,IAAMg2H,EACD92H,GACGA,EAAYqI,MAAMjR,KAAI,SAAC46C,GAAD,OAClB9lC,OAAO8lC,EAAIvmD,kBAEnB,GACJ61I,EACIxK,EACAh2H,EACAohI,MAGR,CAACliI,EAAakiI,GAA6BZ,IAYzC7E,GAA+Bt2I,uBACjC,SAACsF,GACO/F,GAAUA,EAAOkM,QACjB2vI,EACIj6I,EACA,CAACmE,GACD/F,EAAOkM,UAInB,CAAC2vI,EAAsB77I,EAAQ4B,IAG7BkmG,GAAkBrnG,uBAAY,WAC5BwuD,GAAuBjvD,GAAUA,EAAOkM,QACxC2vI,EACInhE,EACU2gE,GAAYz5I,EAAD,OAAe0Y,QAAf,IAAeA,OAAf,EAAeA,EAAawvC,OACvCloD,EACT84E,EAAoC,KAAtBzrB,EACfjvD,EAAOkM,UAGhB,CACC+iD,EACAjvD,EACA67I,EACAnhE,EACA94E,EALD,OAMC0Y,QAND,IAMCA,OAND,EAMCA,EAAawvC,QAGjB/1B,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB8oH,qBAChC,CAAC+d,IAEJhoH,qBAAU,WACFu6F,KACA1sH,EAAauB,MAAQo4I,GACrB1xF,EAAkBjoD,MAEvB,CAAC0sH,GAAuB1sH,EAAcioD,IAEzC91B,qBAAU,WACFsoH,IACAh0H,EAAQH,KAAKluB,IAAOwD,SAEzB,CAAC6+I,GAAkBh0H,IAEtB0L,qBAAU,WACF0nH,GAAiBjyG,MACtB,CAACiyG,EAAiBjyG,IAErB,IAAMouC,GAAcn3E,uBAAY,WAC5BmB,EAAauB,MAAQo4I,GACrB1xF,EAAkBjoD,GAClBo6I,EAAiB,IAAIprH,MACrBgrH,EAA6B,IAAI,EAAMY,MACxC,CACC3yF,EACAjoD,EACAg6I,EACAY,KAGJzoH,qBAAU,WACN1a,GAAkBqvB,EAAYrvB,KAC/B,CAACA,EAAgBqvB,IAEpB3U,qBAAU,YAEiB,OAAnBk7B,QAAmB,IAAnBA,OAAA,EAAAA,EAAqB7rC,SACrB6rC,EAAoB7rC,UAApB,OAA+B9I,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAawvC,QAE5CmyF,GAAe,KAEpB,QAAC3hI,QAAD,IAACA,OAAD,EAACA,EAAawvC,MAAOmF,IAExBl7B,qBAAU,WACN,IAAMkpH,EAAsB3iI,EACtBA,EAAYqI,MAAMjR,KAAI,SAAA46C,GAAG,OAAI9lC,OAAO8lC,EAAIvmD,iBACxC,GACAm3I,EAAqB91H,aACvB6nC,EACAguF,GAEAC,GAAsBA,EAAmB95H,OAAS,GAClDw4H,EAA6BsB,GAAoB,KAEtD,CAACjuF,EAAqB30C,EAAashI,IAEtC7nH,qBAAU,WACN,OAAO,kBACH6nH,EAA6B,IAAI,EAAMY,OAE5C,IAEHzoH,qBAAU,WACN6nH,EAA6B,IAAI,EAAMY,MAExC,CAACliI,IAEJyZ,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,EAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,EAAU,KACX,OAGR,CAACmzG,KAEJvoH,qBAAU,WACN1a,GAAkBqvB,EAAYrvB,KAC/B,CAACA,EAAgBqvB,IAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,MACL,CAACg+D,EAAeh+D,IAEnB,IAAM2zG,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBs5H,GAAsB,SAAC56I,GACzB4mC,EAAU,iBAAkB5mC,IAG1B66I,GAAuB,SAAC/G,GAC1B3uG,EAAU,CACNlkC,MAAO,aACP6S,MAAOggI,KAITgH,IACDhjI,GAAgBA,IAAgBA,EAAYqI,MAAMS,OAEjDm6H,GAAmB,UAAG37I,EAAauX,eAAhB,aAAG,EAAsBmM,MAC9C,SAAAzB,GAAI,MAAmB,eAAfA,EAAKpgB,QAAyC,IAAfogB,EAAKvN,SA+B1CknI,KACAvuF,KAAyBA,EAAoB7rC,OAE7Cq6H,IACDnjI,GAAgBA,GAAeA,EAAYqI,MAAMS,OAAS,EA+CzDs6H,GAAuB,SACzB14I,EACAsnD,IAxQ8B,SAACtnD,EAAiB8vD,GAChD4mF,EAA0B5mF,EAAO9vD,GAyQjC24I,CAA0B34I,EAASsnD,EAAIvmD,eAa3C,OATAguB,qBAAU,WAGN,OAFAg3B,aAAcvR,KAAcI,MAAwBg+B,IAE7C,WACHzsB,aAAc3R,KAAcI,MAAwBg+B,OAGzD,IAGC,eAAC,GAAD,CACIhjE,MAAM,OACNynH,KAAM,cAAC,GAAD,CAAqBmY,SAAQ,OAAE/9E,QAAF,IAAEA,OAAF,EAAEA,EAAMvyD,OAC3Co4H,UACI,cAAC,aAAD,CACI1nB,iBAAgB,OAAEn+C,QAAF,IAAEA,OAAF,EAAEA,EAAMmnF,iBACxB/oC,WAAU,OAAEp+C,QAAF,IAAEA,OAAF,EAAEA,EAAMonF,aAClB/oC,iBAAgB,OAAEr+C,QAAF,IAAEA,GAAF,UAAEA,EAAMyI,eAAR,aAAE,EAAe97C,SAGzCm5G,UAAWviI,IAAOyD,YAAYC,cAC9B8+H,aAAY,UAACn0G,EAAQE,SAAShW,aAAlB,aAAC,EAAwBiqH,WACrCzC,SAAQ,OAAEtjE,QAAF,IAAEA,OAAF,EAAEA,EAAMvyD,KAChB66H,cAAa,gBAAWtoE,EAAI,YAAQA,EAAKvyD,MAAS,GAArC,cACbyQ,SAAS,OAdb,UAgBKH,IAAYkmE,GAAe,cAAC,KAAD,IAE5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAE0X,QAAF,IAAEA,OAAF,EAAEA,EAAaqI,MACnBtJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CwqF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,kBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,aAAf,QAAwB,EAClCygB,aAAcgxE,GACd74C,aAAc,aACdC,uBACI/gG,EAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,GAC7B+S,SAAU,eAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBACIowC,KAAgB17I,EAAa0B,WAAW8f,OAC5CzO,SAAU,eAEd23F,8BACKwxC,kBAAc7uF,KACd6uF,kBAAcxjI,GACnBiyF,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEvrB,QAAF,IAAEA,OAAF,EAAEA,EAAqB7rC,OACrCR,WAAU,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,MACzBygB,aAAcgxE,GACdluC,iBAlJK,WACrBuuC,EAA6B,IAAI,EAAMY,IACvCP,GAAe,IAiJCjjH,YA1IA,WAChBgkH,IAA0B,GAC1Bf,GAAe,IAyIC3uC,kBAAmB,CACfj5F,UACK46C,GACAA,IACIA,EAAoB7rC,OAC7B0kF,gBAAiBA,GACjBW,sBAAuB,CACnBvzF,KAAgBgiI,2BAI5BzqC,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIw0G,kBAAmBx8H,GAAkB,GACrC08H,eAAgBqH,GAChB56I,OACIZ,EAAaumC,eAEjB2tG,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,KACtB40G,gBAAiBoH,GACjBnH,QAASqH,MAGjBp9G,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAlBtB,SAoBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcE,GACVzzI,GAEJyS,UACKzS,EAAa0B,WAAW8f,OACrB,GAGM,IAFNiyH,GACIzzI,KAER07I,GAEJ3oI,SAAS,sBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAA0C,KAApB,OAAX8F,QAAW,IAAXA,GAAA,UAAAA,EAAaqI,aAAb,eAAoBS,QACpC+9E,iBAAkB,CACd7sF,KAAMsgI,GACN5pI,KAAM,mBACN2J,SAAU,oBAEdysF,uBAAwB,CACpBh4C,WAAY,YACZz0C,SAAU,sBAEd0sF,uBAAwB,CACpB/sF,KAAMugI,GACN3lI,MAAO,QACPyF,SAAU,0BAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YAhNU,SAAC/wB,GAC3BsyF,GAA0BtyF,EAAM5E,OAAO1qC,SACvC6gI,GAAe,IA+MCtnI,SAAU,4BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,eACP1F,MAAO,MACHouI,GAAc,KAAOb,IAJxB,IAKDpoI,SAAUipI,GACV3oI,SAAU,wBANT,2BASDC,MAAO,UACP1F,MAAO,GACHouI,GAAc,KAAOZ,IAXxB,IAYDroI,SAAUipI,GACV3oI,SAAU,mBAEd,CACIzF,MAAO,GACP0F,MAAO,qBACPipF,8BACIpf,EAAQi6D,0BACZrkI,SAAUipI,GACV3oI,SAAU,4BACVipF,WAAY,CAAC,2BAELhpF,MAAO,eACH0oI,GAAc,KAAOX,IAHrB,IAIJtoI,SAAUipI,GACV3oI,SAAU,qBACVzF,MAAO,OANH,2BASJ0F,MAAO,eACH0oI,GAAc,KAAOV,IAVrB,IAWJvoI,SAAUipI,GACV3oI,SAAU,qBACVzF,MAAO,OAbH,2BAgBJ0F,MAAO,aACH0oI,GAAc,KAAOT,IAjBrB,IAkBJxoI,SAAUipI,GACV3oI,SAAU,mBACVzF,MAAO,SA1Cd,2BA+CD0F,MAAO,gBACP1F,MAAO,MACHouI,GAAc,KAAOR,IAjDxB,IAkDDzoI,SAAUipI,GACV3oI,SAAU,yBAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAhQD,SAAC/zC,GAChBwqF,GAAkBxqF,EAAIvmD,eAgQNw6F,kBA7OM,SAAC71C,EAAY4B,IA9OT,SAACx2B,EAAQw2B,GACnCx2B,EAAEC,kBACIu2B,EAAIvmD,cACN41I,EAAyBrvF,EAAIvmD,cA4OjCi4I,CAAsBtzF,EAAO4B,GAC7B2vF,GAAe,IA4OC37C,aAzPM,SAACh0C,GAAD,QACpB2C,KACA3C,EAAIvmD,cACNkpD,EAAoB9sC,SAASmqC,EAAIvmD,eAuPjBy6F,gBArOS,SAACl0C,GAC1B,OAAO4vF,IAAe5vF,EAAIvmD,cAqOVo5F,kBAAmB,SAAC7yC,GAAD,MAA8B,CAC7CjzC,eAAgBizC,EAAIrqD,QAAU,GAC9Bo7E,kBAAmB,CACfnoE,KAAgB+oI,0BAEpB9gE,cAAe,SAACn4E,GAAD,OACX04I,GAAqB14I,EAASsnD,MAEtC33C,SAAU,mBACVyrF,MAAO,CACH,CACIR,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjBrU,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAKpoD,OACX27F,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SAAClyC,GAAD,OACTA,EAAIpoD,MACRyQ,SAAU,qBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrU,GADiB,OAEfA,EAAIqS,WACVkhC,WAAY,CACRrB,YAAa,SAAClyC,GAAD,OACTA,EAAIqS,WAAa,sBAAM/sD,YAAU,eAAhB,SAA+B,cAAC,GAAD,SAG5D,CACIguF,UAAW,eACXG,wBAAyB,SACrBzzC,GADqB,OAGrB,eAAC2rF,GAAD,CAAkBiG,eAAe,EAAjC,UACI,cAAChF,GAAD,CAAsBhqI,MAAO,GAA7B,UACQ,OAAHo9C,QAAG,IAAHA,OAAA,EAAAA,EAAK6xF,wBACF,sBAAMvsI,YAAU,oBAAhB,gBAEQ06C,QAFR,IAEQA,OAFR,EAEQA,EAAK6xF,yBAIb,cAAC/oF,GAAA,EAAD,MAGR,cAAC8jF,GAAD,CAAsBhqI,MAAO,GAA7B,UACQ,OAAHo9C,QAAG,IAAHA,OAAA,EAAAA,EAAK8xF,2BACF,sBAAMxsI,YAAU,oBAAhB,gBAEQ06C,QAFR,IAEQA,OAFR,EAEQA,EAAK8xF,4BAIb,cAAChpF,GAAA,EAAD,MAGR,cAAC8jF,GAAD,CAAsBhqI,MAAO,GAA7B,UACQ,OAAHo9C,QAAG,IAAHA,OAAA,EAAAA,EAAK+xF,0BACF,sBAAMzsI,YAAU,kBAAhB,gBAEQ06C,QAFR,IAEQA,OAFR,EAEQA,EAAK+xF,2BAIb,cAACjpF,GAAA,EAAD,WAMpB,CACIwqC,UAAW,aACXj/B,oBAAqB,SACjBrU,GADiB,OAEfA,EAAIgyF,cACVz+C,WAAY,CACRrB,YAAa,SAAClyC,GAAD,OACTl6B,aAAWk6B,EAAIgyF,eACnB3pI,SAAU,uBAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACf7yC,GADe,MAEb,CACF17C,KAAMsrI,IAAe5vF,EAAIvmD,aACzBylD,WAAY,WAniBrB,IAAC4wB,KAqiBgB9vB,EAAIvmD,eAliBxCo2I,EADAD,IAAe9/D,EACD,KAEAA,IAkiBc/iE,eAAgBizC,EAAIrqD,OACpB0S,SAAU,uBAEd5F,UAAW0vE,EAAQw6D,kBAG3B,CACIr5C,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrB/yC,GADqB,OAGrB,cAAC,KAAkBoyB,SAAnB,CACIpoE,MAAO,CACHwL,YACI,sBACJC,MAAO,gBAJf,SAOI,cAAC,GAAD,CACIvb,WAAY8lD,EACZwqF,kBACIA,GAEJC,6BACIA,GAEJ1+H,QAASA,EACTo+C,KAAMA,EACNwvD,YACK,OAACh3D,QAAD,IAACA,OAAD,EAACA,EAAqB7rC,wBAwE5Dm7H,GAzDgC,WAC3C,IAAMhsI,EAAQm6G,KACRr0G,EAAU0R,YAAY3R,MACtBiQ,EAAUW,cACVkiB,EAAUnhB,YAAYkhB,MACtBjrC,EAA6B00I,cAC7BjI,EAA4BD,GAC9BxsI,EAAOkM,QAEGsyI,EAAahyB,KAAnB5pH,KAEFX,EAASm5B,eACTsgH,EAA4BpL,KAC5BmL,EnHzqBC1xH,YAAY1U,qBAAWs3G,KmH0qBxBivB,EACFzK,KACEwK,EAA2BrK,KAC3BlzG,EAAwBD,eACxB09G,EvBwSoC,WAC1C,IAAM4C,EAA0BjyI,eAC1B+V,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgiB,EAAkB5c,EAAgCqG,GAAoB,IAAD,UAC5DqyD,EAAa,UAAG97C,EAAGtJ,eAAN,aAAG,EAAY61B,MAC9B,SAAApH,GAAC,MAAgB,eAAZA,EAAEnkC,SAELzD,EAA0C,CAC5C0+D,iBAAgB,UAAEj8C,EAAG0lB,sBAAL,aAAE,EAAmBxkC,KAAK,KAC1Cg7D,aAAwB,OAAbJ,QAAa,IAAbA,OAAA,EAAAA,EAAejoD,aAAe9U,EACzCS,OAAM,UAAEwgB,EAAG6D,gBAAL,aAAE,EAAa3iB,KAAK,KAC1BR,OAAoB,OAAb0C,QAAa,IAAbA,OAAA,EAAAA,EAAeud,aAAS5hB,EAAxB,UAAoCihB,EAAGtf,aAAvC,QAAgD,GACvDC,OAAM,UAAEqf,EAAGrf,cAAL,QAAe,EACrBC,MAAOof,EAAGnf,WACVC,KAAMsE,aAAsB4a,EAAGjf,QAAS,QAAQ,GAChDk7I,MAAK,OAAE74I,QAAF,IAAEA,OAAF,EAAEA,EAAelC,KAAK,MAE/B,OAAO86I,EAAwBz+I,EAAQkM,GAClC6vB,MAAK,SAACn5B,GAEH,OADAgmD,aAAahmD,EAAM,2BACZA,KAEVq5B,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACotI,EAAyBl8H,IuBnUDo8H,GACvBC,EAAcnW,KACdqT,EAAyBl/G,eACzB4qE,EAAgBhkE,eAChB4zG,EAAcrtH,YAAYstH,IAEhC,OACI,cAAC,KAAkB34D,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,uBAFrB,SAKI,cAAC,GAAD,CACIzJ,QAASA,EACTgQ,QAASA,EACTroB,OAAQA,EACRkrC,QAASA,EACT2e,kBAAmB4iF,EACnBnyH,YAAa/H,EAAM3P,KACnB6zD,KAAM+nF,EACNvvF,oBAAqB18C,EAAM08C,oBAC3B51C,eAAgBpX,EAAO6iB,SACvB42H,0BAA2BA,EAC3BD,gBAAiBA,EAAgB74I,KACjC4R,QAASjC,EAAMiC,QACfonI,6BAA8BA,EAC9BD,yBAA0BA,EAC1B91H,eAAgB5jB,EAAO4jB,eACvBuY,sBAAuBA,EACvBy9G,qBAAsBA,EACtB5T,cAAe2W,EACf9C,uBAAwBA,EACxBt0C,cAAeA,EACf4vC,YAAaA,OC/2BdyH,GAlBKhwI,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBAAMS,KAAK,eAAeC,SAAS,UAAUC,EAAE,ioBAAioBojD,SAAS,iB,SCJ5rB0rF,GAAqB,SAACC,GAC/B,OAAKA,EAEDA,EAAK,GACC,QAEA,GAAN,OAAU77H,KAAK87H,MAAOD,EAAK,IAAKhoF,UAAhC,QALY,SASPkoF,GAAwB,SAACF,GAClC,IAAKA,EAAI,MAAO,QAChB,IAAMG,EAAO14H,OAAOu4H,EAAGhoF,WACjB9pB,KAAQiyG,EAAO,MACf/7H,KAAU+7H,EAAO,KAAQ,IACzBC,EAAMD,EAAO,GACfE,EAAU,GAMd,OALInyG,EAAK,IACLmyG,GAAWnyG,EAAK,KAEpBmyG,GAAW,UAAGj8H,EAAM,GAAK,IAAM,IAAOA,EAAM,KAAOg8H,EAAM,GAAK,IAAM,IACpEC,GAAW,GAAKD,GAILE,GApCM,SAACN,GAClB,IAAKA,EAAI,MAAO,QAChB,IAAMG,EAAO14H,OAAOu4H,EAAGhoF,WAEjBooF,EAAMD,EAAO,GACfE,EAAU,GAGd,OAFAA,MAHeF,EAAO,IAGA,KACtBE,GAAgBD,EAAM,KCAb9J,GAA2B,SACpCzzI,GACU,IAAD,MACL0zI,EAAQ,EAmBZ,OAjBA,OAAI1zI,QAAJ,IAAIA,GAAJ,UAAIA,EAAc68D,kCAAlB,aAAI,EAA0Cr7C,UAC1CkyH,GAAgB1zI,EAAa68D,2BAA2Br7C,SAG5D,OAAIxhB,QAAJ,IAAIA,GAAJ,UAAIA,EAAc0kB,gBAAlB,aAAI,EAAwBlD,UACxBkyH,GACY1zI,EAAa0kB,SAAS1C,QAAO,SAAC1T,GAAD,OAAgBA,EAAK,KAAGkT,SAGrE,OACIxhB,QADJ,IACIA,GADJ,UACIA,EAAcuX,eADlB,aACI,EAAuBmM,MACnB,SAAAzB,GAAI,MAAmB,eAAfA,EAAKpgB,QAAyC,IAAfogB,EAAKvN,YAGhDg/H,GAAS,GAGNA,GASEgK,GAA4C,SAAC19I,GAAgC,IAAD,MAW3C,EAVtC0zI,EAAQ,IAEZ,OAAI1zI,QAAJ,IAAIA,GAAJ,UAAIA,EAAcumC,sBAAlB,aAAI,EAA8B/kB,UAC9BkyH,GAAgB1zI,EAAaumC,eAAe/kB,SAGhD,OAAIxhB,QAAJ,IAAIA,GAAJ,UAAIA,EAAc68D,kCAAlB,aAAI,EAA0Cr7C,UAC1CkyH,GAAgB1zI,EAAa68D,2BAA2Br7C,QAG5D,OAAGxhB,QAAH,IAAGA,GAAH,UAAGA,EAAcm9D,uBAAjB,aAAG,EAA+B37C,UAC9BkyH,GAAK,OAAE1zI,QAAF,IAAEA,GAAF,UAAEA,EAAcm9D,uBAAhB,aAAE,EAA+B37C,QAG1C,OAAOkyH,I,SxBnCClC,K,kBAAAA,E,iBAAAA,Q,6DyBNNp8G,GAAYvmB,IAAOC,IAAV,iHAMTkvB,GAAUnvB,IAAOC,IAAV,+IASP8kI,GAAkB/kI,IAAOC,IAAV,gKAQf+kI,GAAahlI,IAAOC,IAAV,qGAMV+gD,GAAUhhD,IAAOC,IAAV,0JASPstC,GAAgBvtC,IAAOC,IAAV,uDAIbglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCygJ,GAAqBllI,YAAO8kI,GAAP9kI,CAAH,qDAIlB8uI,IAAsD,sBACvDj8E,KAAek8E,SAAW,CAAE5qI,MAAO,aADoB,gBAEvD0uD,KAAeuY,WAAa,CAAEjnE,MAAO,gBAFkB,gBAGvD0uD,KAAem8E,QAAU,CAAE7qI,MAAO,YAHqB,IAMtDm3D,IAA4D,sBAC7D/oB,KAAqB5U,QAAU,CAAEx5B,MAAO,gBADqB,gBAE7DouC,KAAqBxD,YAAc,CAAE5qC,MAAO,gBAFiB,gBAG7DouC,KAAqB3lD,UAAY,CAAEuX,MAAO,cAHmB,IAM5D8qI,IAA8C,sBAC/CtM,GAAqBhlG,QAAU,CAAEx5B,MAAO,YADO,gBAE/Cw+H,GAAqBvvI,OAAS,CAAE+Q,MAAO,WAFQ,IAsKrC+qI,GAzJV,SAAC,GAA0H,IAAxH5J,EAAuH,EAAvHA,eAAgBvzI,EAAuG,EAAvGA,OAAQo9I,EAA+F,EAA/FA,mBAAoB5J,EAA2E,EAA3EA,eAAgB6J,EAA2D,EAA3DA,2BAA4B5J,EAA+B,EAA/BA,gBAAiBliG,EAAc,EAAdA,QAAc,EAC3FngB,mBAASpxB,GADkF,mBACpHU,EADoH,KAC1GizI,EAD0G,OAE3FviH,mBAASmgB,GAFkF,mBAEpH+rG,EAFoH,KAE1GC,EAF0G,OAGnEnsH,mBAAcgsH,GAHqD,mBAGpHI,EAHoH,KAG9FC,EAH8F,KAKrHxJ,EAAwBh2I,uBAC1B,SAACi2I,EAAgC5gH,GACzBA,EAAEgwB,OAAO1qC,QACT+6H,EAAY,GAAD,oBAAKjzI,GAAL,CAAewzI,KAE1BP,EAAYjzI,EAAS0gB,QAAO,SAAAC,GAAI,OAAIA,IAAS6yH,QAGrD,CAACP,EAAajzI,IAGZg9I,EAAyBz/I,uBAC3B,SAAC0/I,EAA2BrqH,GACpBA,EAAEgwB,OAAO1qC,QACT2kI,EAAY,GAAD,oBAAKD,GAAL,CAAeK,KAE1BJ,EAAYD,EAASl8H,QAAO,SAAAC,GAAI,OAAIA,IAASs8H,QAGrD,CAACL,EAAUC,IAGTK,EAAoC3/I,uBACtC,SAACi2I,EAAgC5gH,GAEzBA,EAAEgwB,OAAO1qC,QACT6kI,EAAwB,GAAD,oBAAKD,GAAL,CAA2BtJ,KAElDuJ,EAAwBD,EAAqBp8H,QAAO,SAACC,GAAD,OAAeA,IAAS6yH,QAGpF,CAACuJ,EAAyBD,IAGxB97C,EAAiBzjG,uBAAY,WAC/Bs1I,EAAe7yI,GACf28I,EAA2BG,GAC3BhK,IACAC,EAAgB6J,KACjB,CAAC/J,EAAgB7yI,EAAU28I,EAA4BG,EAAsBhK,EAAgBC,EAAiB6J,IAQ3GnJ,EAAuBzzI,EAASkgB,OACtC48H,EAAqB58H,OAAS08H,EAAS18H,OAEvC,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACA,cAAC4hB,GAAA,EAAD,CAAUpwB,MAAO,sBAAuBD,SAAS,oCAAjD,SACQ,cAAC,GAAD,UACMm4B,OAAOtrB,KACLk+H,IACyBhuI,KAAI,SAAAmS,GAAI,OACjC,cAAC,GAAD,CAAYjS,YAAU,qCAAtB,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,QAAS4kI,GAAwBA,EAAqB79H,SAAS0B,GAC/D0S,aAAc,SAAAT,GAAC,OACXsqH,EAAkCv8H,EAAMiS,IAE5C5hB,MAAOwrI,GAAe77H,GAAMjP,MAC5B4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAK+qI,GAAe77H,GAAMjP,MAAMmC,cAAhC,qBATH8M,YAezB,cAACmhB,GAAA,EAAD,CAAUpwB,MAAO,kBAAmBD,SAAS,gCAA7C,SACI,cAAC,GAAD,UACMm4B,OAAOtrB,KACLuqD,IACyBr6D,KAAI,SAAAmS,GAAI,OACjC,cAAC,GAAD,CAAYjS,YAAU,iCAAtB,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,QAASlY,EAASif,SAAS0B,GAC3B0S,aAAc,SAAAT,GAAC,OACX2gH,EAAsB5yH,EAAMiS,IAEhC5hB,MAAO63D,GAAYloD,GAAMjP,MACzB4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAK2oE,oBAAUvR,GAAYloD,GAAMjP,OAAjC,qBATHiP,YAezB,cAACmhB,GAAA,EAAD,CAAUpwB,MAAO,WAAYD,SAAS,yBAAtC,SACI,cAAC,GAAD,UACMm4B,OAAOtrB,KACL+9H,IACmB7tI,KAAI,SAAAmS,GAAI,OAC3B,eAAC,GAAD,WACI,cAAC0Q,GAAA,EAAD,CAEInZ,QAAS0kI,EAAS39H,SAAS0B,GAC3B0S,aAAc,SAAAT,GAAC,OACXoqH,EAAuBr8H,EAAMiS,IAEjC5hB,MAAOqrI,GAAY17H,GAAMjP,MACzB4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAK2oE,oBAAUiiE,GAAY17H,GAAMjP,OAAjC,cATHiP,GAWRA,IAASy/C,KAAem8E,SAAW,sBAAM7tI,YAAU,wBAAhB,SAAwC,cAAC,GAAD,mBAMhG,eAAC,GAAD,WACI,eAAC,GAAD,CAAgBA,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAS,UACTpC,MAAO,QACPhE,OAAQ,kBAxFxBirI,EAAY,IACZ8J,EAAwB,SACxBF,EAAY,KAuFIprI,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,sBAHb,iC,UCnOVqiB,GAAYvmB,IAAOC,IAAV,qGAMT2vI,GAAO5vI,IAAOC,IAAV,+bASI,SAAAC,GAAK,OAAIA,EAAM2vI,eAAiB,MAAQ,UAGpC,SAAA3vI,GAAK,OAAIA,EAAM2vI,eAAiB3vI,EAAMI,MAAMpc,OAAOsC,WAAa0Z,EAAMI,MAAMpc,OAAOS,aAE7E,SAAAub,GAAK,OAAKA,EAAM2vI,eAAiD,cAAhC3vI,EAAMI,MAAMpc,OAAOQ,cAG9D,SAAAwb,GAAK,OACDA,EAAM4vI,UACF/iG,aAAK7sC,EAAM6vI,eAAgB7vI,EAAM2vI,eAAiB,EAAI,KACtD9iG,aAAK7sC,EAAM8C,MAAO9C,EAAM2vI,eAAiB,EAAG,QAOxD,SAAA3vI,GAAK,OACHA,EAAM2F,QAAW3F,EAAM2vI,gBAAvB,4BAEM3vI,EAAM4vI,UAAY5vI,EAAM6vI,eAAiB7vI,EAAM8C,MAFrD,QAIF,SAAA9C,GAAK,OACHA,EAAM8vI,MAAQ9vI,EAAM4vI,UAApB,8KAOF,SAAA5vI,GAAK,OACDA,EAAM8vI,OAAS9vI,EAAM4vI,WAAvB,kBAAgD5vI,EAAM2F,MAAQ3F,EAAM2F,MAAQ,EAA5E,SAEF,SAAA3F,GAAK,OACHA,EAAM2vI,gBAAkC,IAAhB3vI,EAAM2F,OAA9B,4BAINoqI,GAAajwI,IAAOC,IAAV,kOAMH,SAAAC,GAAK,OACVA,EAAM4vI,UAAY5vI,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOO,aAIrD,SAAAyb,GAAK,OAAKA,EAAMgwI,iBAAmB,sCAEnC,SAAAhwI,GAAK,QAAMA,EAAMgwI,iBAAmB,8BAM7BC,GASR,SAAC,GASC,IARHtqI,EAQE,EARFA,MACAtL,EAOE,EAPFA,KACAyI,EAME,EANFA,MACAotI,EAKE,EALFA,YACAC,EAIE,EAJFA,OACAN,EAGE,EAHFA,eACAG,EAEE,EAFFA,gBACAL,EACE,EADFA,eAEA,OACI,cAAC,GAAD,UACI,cAACD,GAAD,CACI/pI,MAAOA,EACP7C,MAAOA,GAAS/e,IAAUC,OAAOG,WACjCyrJ,UAAWM,EACXJ,KAAMK,EACNN,eAAgBA,GAAkB9rJ,IAAUC,OAAOa,MACnD8qJ,eAAgBA,EANpB,SAQI,cAACI,GAAD,CACIjtI,MAAO+sI,GAAkB9rJ,IAAUC,OAAOa,MAC1CmrJ,gBAAiBA,EACjBJ,UAAWM,EAHf,SAKKP,EAAiB,KAAOt1I,IAEnB61I,EAAW,uBACKvqI,EADL,eAERA,EAFQ,aC/GrC,SAASyqI,GAAuBpwI,GAAqC,IAAD,EAC3BA,EAA7B8mD,kBADwD,MAC3C,EAD2C,EACxC9iD,EAAahE,EAAbgE,SAExB,OACI,sBAAK5F,UAAU,qBAAf,UACI,sBAAKA,UAAU,iBAAiB6C,YAAW+C,GAAQ,UAAOA,EAAP,oBAAnD,uBAAiG8iD,EAAjG,OACA,qBAAK1oD,UAAU,mCAAf,SACI,qBACIqF,MAAO,CAAElF,MAAM,GAAD,OAAKuoD,EAAL,MACd1oD,UAAU,eACV6C,YAAW+C,GAAQ,UAAOA,EAAP,eAOxBxD,I,YAAAA,kBAAK4vI,ICZdjJ,GAAuBrnI,IAAOC,IAAV,gDAIpBswI,GAAcvwI,IAAOC,IAAV,6FAGJ,SAAAC,GAAK,OAA+B,MAA3BA,EAAMswI,iBAA4BtwI,EAAMI,MAAMpc,OAAOe,UAAY,UAGjFwrJ,GAAqBzwI,IAAOC,IAAV,kDACZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOe,aAIlCyrJ,GAAW1wI,IAAOC,IAAV,0IACI,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOe,aAyD/B0rJ,GA1CV,SAAC,GAAmD,IAEZ,EAFrCt3F,EAAgD,EAAhDA,MAAO6D,EAAyC,EAAzCA,IAAKnrD,EAAoC,EAApCA,OAAQ6+I,EAA4B,EAA5BA,YAAa1sI,EAAe,EAAfA,SAErC,OAAInS,IAAWugD,KAAiB3U,QACrB,6CAAG29B,KAAYhpB,KAAiB3U,gBAAhC,aAAG,EAAuCx5B,QAGhD+4C,GAAiB,IAAV7D,EAYR,eAAC,GAAD,WACI,eAACk3F,GAAD,CAAaC,iBAAkBn3F,GAAS,EAAGl4C,YAAW+C,EAAtD,UACI,uBAAM/C,YAAW+C,GAAQ,UAAOA,EAAP,UAAzB,UAAmDm1C,GAAS,EAA5D,OACCu3F,GAAe,cAACF,GAAD,IAChB,cAACD,GAAD,UACK3vH,aAAa8vH,QAGtB,cAAC,GAAD,CACIf,gBAAc,EACd7sI,MAAO/e,IAAUC,OAAOK,SACxBwrJ,eAAgB9rJ,IAAUC,OAAOa,MACjC8gB,MAAOwzC,GAAS,EAChBg3F,QAASh3F,GAAS,IAAM6D,EACxBkzF,YACIr+I,IAAWwgD,KAAqB3lD,WAE1BysD,IAAU6D,OA3BxB,eAAC,GAAD,CAAsB/7C,YAAW+C,EAAjC,UACO,cAACqsI,GAAD,UACH,sBAAMpvI,YAAW+C,GAAQ,UAAOA,EAAP,UAAzB,kBAEA,cAAC,GAAD,CAAa2rI,gBAAc,EAAChqI,MAAO,EAAG7C,MAAO/e,IAAUC,OAAOK,eCnB/DssJ,GA9BiBzyI,sBAC5B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BACXS,KAAK,OART,UAUI,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,+HACFF,KAAK,iBAET,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,8DACFF,KAAK,uBCCVyxI,GAxBmB1yI,sBAC9B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BACXS,KAAK,OART,SAUI,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,+ZACFF,KAAK,sBCeV0xI,GAhCiB3yI,sBAC5B,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIE,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BANV,UAQI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,whBACFF,KAAK,iBAET,sBACIE,EAAE,8IACFF,KAAK,iBAET,sBACImwD,YAAU,UACVC,YAAU,UACVlwD,EAAE,oHACFF,KAAK,e,wCCzBZ2xI,GAAsB,sBACtBC,GAA+B,+B,8BCsB/BC,GAA2B,SAACv4F,GACrC,IAAMw4F,EAAuB,WAAOpwH,KAAM,IAAIZ,MAAQgC,OAClD2iE,MADyB,KAIvBssD,EAAmBz4F,EAAWkE,MAAM,KAG1C,IACoB,OAAhBu0F,QAAgB,IAAhBA,OAAA,EAAAA,EAAmB,GAAG1/H,SAAS,SAA/B,OACA0/H,QADA,IACAA,OADA,EACAA,EAAmB,GAAG1/H,SAAS,OACjC,CACE,IAAM2/H,EAAcD,EAAiBE,MACrC,MAAM,GAAN,OAAUH,EAAV,cAAuCE,GAG3C,MAAM,GAAN,OAAUF,EAAV,cAAuCx4F,IA6K9B44F,GAA+B,SAACv2I,GACzC,IAAMw2I,EAnH2B,WACjC,IAAMh0G,EAAiBnmC,eACjBo6I,EAAazzI,eACb8T,EAAcnQ,cAEpB,OAAO3R,sBAAW,yCACd,WACImB,EACAoC,EACAm+I,EACAviE,GAJJ,wBAAAl9D,EAAA,6DAMUk+D,EAAiD,CACnDp+E,OAAQ2rC,KAAWtqC,OACnBilC,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCslC,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC4qC,UAAWvqC,EAAU3D,WACrB8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQxB,EAAawB,OACrBC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,IAflE,SAkBUyqC,EAAe,gBAAK2yC,IACrB7kD,KADC,yCACI,WAAMgT,GAAN,gBAAArsB,EAAA,yDACGmxB,kBAAQ9E,EAASpsB,OADpB,uBAEQy/H,EAAiBrzG,EAASpsB,MAAMjR,KAClC,SAAAmS,GAAI,qBAEIpY,KAAM,SACNsC,aAAc,KACds0I,WAAYx+H,EAAK3T,IACdiyI,MARjB,SAYQD,EAAWE,GACZrmH,KAAK6jD,GACL3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAjBhB,2CADJ,uDAsBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAzClB,2CADc,4DA6Cd,CAAC6xI,EAAYj0G,EAAgB1rB,IAiEC+/H,GAC5BC,EAxKmC,WACzC,IAAMtV,EAA+B7gI,eAC/B81I,EAAazzI,eACb8T,EAAcnQ,cAEpB,OAAO3R,sBAAW,yCACd,WACImB,EACAsK,EACAnG,EACAo8I,EACAviE,GALJ,gBAAAl9D,EAAA,6DAOU8/H,EACF5jF,aAAoCh9D,GAR5C,SAUUqrI,EAA6B/gI,EAAQnG,EAAT,gBAC3By8I,IAEFzmH,KAHC,yCAGI,WAAMgT,GAAN,gBAAArsB,EAAA,yDACGmxB,kBAAQ9E,EAASpsB,OADpB,uBAEQy/H,EAAiBrzG,EAASpsB,MAAMjR,KAClC,SAAAmS,GAAI,qBAEIpY,KAAM,aACNsC,aAAc8V,EAAK3T,GACnBmyI,WAAYx+H,EAAK3a,KAAKgH,IACnBiyI,MARjB,SAYQD,EAAWE,GACZrmH,KAAK6jD,GACL3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAjBhB,2CAHJ,uDAwBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAnClB,2CADc,8DAuCd,CAAC6xI,EAAYjV,EAA8B1qH,IA6H3CkgI,GACEC,EA5D+B,WACrC,IAAMC,EAA2Bz0I,eAC3Bg0I,EAAazzI,eACb8T,EAAcnQ,cAEpB,OAAO3R,sBAAW,yCACd,WACImB,EACAoC,EACAm+I,EACAviE,GAJJ,sBAAAl9D,EAAA,6DAMUD,EAAK,CACPwmB,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCR,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQxB,EAAawB,OACrBC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,aAAa,GAC/D+qC,UAAWvqC,EAAU3D,YAb7B,SAeUsiJ,EAAyBlgI,GAC1BsZ,KADC,yCACI,WAAMgT,GAAN,gBAAArsB,EAAA,yDACGmxB,kBAAQ9E,EAASpsB,OADpB,uBAEQy/H,EAAiBrzG,EAASpsB,MAAMjR,KAClC,SAAAmS,GAAI,qBAEIpY,KAAM,UACNsC,aAAc,KACds0I,WAAYx+H,EAAK3T,IACdiyI,MARjB,SAYQD,EAAWE,GACZrmH,KAAK6jD,GACL3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAjBhB,2CADJ,uDAsBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAtClB,2CADc,4DA0Cd,CAAC6xI,EAAYS,EAA0BpgI,IAaLqgI,GAEtC,OAAOniJ,sBAAW,yCACd,WACImB,EACAihJ,EACAV,EACAviE,GAJJ,wBAAAl9D,EAAA,yDAMiB,WAATjX,EANR,uBAOgBzH,EACJ6+I,EADI7+I,UAPhB,SAUci+I,EACFrgJ,EACAoC,EACAm+I,EACAviE,GAdZ,iCAgBwB,YAATn0E,EAhBf,wBAiBgBzH,EACJ6+I,EADI7+I,UAjBhB,UAoBc0+I,EACF9gJ,EACAoC,EACAm+I,EACAviE,GAxBZ,uCA0BgB1zE,GA1BhB,EA2BY22I,GADI32I,OAAQnG,EA1BxB,EA0BwBA,aA1BxB,UA4Bcw8I,EACF3gJ,EACAsK,EACAnG,EACAo8I,EACAviE,GAjCZ,4CADc,4DAsCd,CAACqiE,EAA2BM,EAAmC92I,EAAMi3I,K,UC7NtE,SAASI,GACZC,EACAC,EACApjE,EACAC,EACAojE,GAEA,IAAMnxI,EAAWO,cACXkQ,EAAcnQ,cACd0tE,EAAkBx2D,eAH1B,EAKoCsK,oBAAkB,GALtD,mBAKSosD,EALT,KAKoBC,EALpB,KAOQijE,EAAYttH,iBAAqC,MAPzD,EAQ4CstH,EAAU1iH,SAAY,GARlE,IAQU4oB,kBARV,MAQuB,GARvB,MAQ2B+5F,gBAR3B,MAQsC,EARtC,EAUQC,EAAsBxtH,iBAAiB,IACvCytH,EAAqBztH,iBAAiB,IAEtC0tH,EAAgB,OAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAqB5iH,QACxC+iH,EAAkBF,EAAmB7iH,QAErCgjH,EACFF,EAAiBlgI,OAASmgI,EAAgBngI,QF3DX,GEwE7BqgI,EAA8B,CAChClqF,WAAY,CACRt3D,OAZY,OAAGqhJ,QAAH,IAAGA,OAAH,EAAGA,EAAkB5xI,KAAI,SAAA1M,GAAO,2CAC5CokD,EAD4C,MAC3B+5F,GAD2B,yBAEhDn+I,GAFgD,MAchDkyD,UAAW,UAGTwsF,EAAgC,CAClCnqF,WAAY,CACRt3D,OAdW,OAAGshJ,QAAH,IAAGA,OAAH,EAAGA,EAAiB7xI,KAAI,SAAA1M,GAAO,2CAC1CokD,EAD0C,MACzB+5F,GADyB,yBAE9Cn+I,GAF8C,MAgB9CkyD,UAAW,UAGTU,EACF,GAEC/jB,kBAAQyvG,IACT1rF,EAAW1vC,KAAK,CACZ2wC,WAAY4oF,GACZ3oF,eAAgBiqF,EAChBhqF,sBAAuB0qF,IAI1B5vG,kBAAQ0vG,IACT3rF,EAAW1vC,KAAK,CACZ2wC,WAAY4oF,GACZ3oF,eAAgBkqF,EAChBjqF,sBAAuB2qF,IAQ/B,IAAMziE,EAAwCxgF,uBAAY,WAClD+iJ,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,oBACZzd,QAASq/C,MAMzBG,GAAa,GACE,OAAfJ,QAAe,IAAfA,SACD,CAAC/tE,EAAUguE,EAAiBD,EAAiB2jE,IAM1CxiE,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACAtxI,YAAW,WACP4tE,MACD,KAGPA,IACAE,GAAaC,GAAa,GAET,OAAjBL,QAAiB,IAAjBA,UAGJr9D,EAAY,0BAA2B,aACxC,CACCzQ,EACAguE,EACAE,EACAJ,EACA4jE,IAGIxrF,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF2rF,EAA8BljJ,uBAAY,WAC5C28B,QAAQo7B,UAAUz8B,MAAK,WACd8X,kBAAQyvG,IACTtrF,GAAa,GAGjBgoB,GAAaC,GAAa,GAC1BH,IAEiB,OAAjBF,QAAiB,IAAjBA,YAEL,CAAC0jE,EAAkBxjE,EAAiBE,EAAWhoB,EAAclmD,IAM1D8xI,EAA+BnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,oBACZkjC,wBACIuiE,EACJljH,QAASq/C,MAMzB9nB,GAAa,GACE,OAAfirF,QAAe,IAAfA,YAEL,CACCnxI,EACA6xI,EACA7jE,EACA9nB,EACAwrF,IAUJ,OAPAzvH,qBAAU,WACFisD,GACA4jE,MAGL,CAAC5jE,IAEGv/E,uBACH,SACImlB,EACA09H,EACAC,GAEAL,EAAU1iH,QAAU5a,EACpBw9H,EAAoB5iH,QAAU8iH,EAC9BD,EAAmB7iH,QAAU+iH,EAE7BtjE,GAAa,KAEjB,IAeD,SAAS4jE,GACZd,EACAC,EACAtoE,EACAopE,EACAlkE,EACAC,GAEA,IAAM/tE,EAAWO,cACXkQ,EAAcnQ,cACd0tE,EAAkBx2D,eAH1B,EAKoCsK,oBAAkB,GALtD,mBAKSosD,EALT,KAKoBC,EALpB,KAOMroB,EAGE,GAEAsrF,EAAYttH,iBAA6C,MAZjE,EAa8CstH,EAAU1iH,SAAY,GAbpE,IAaU4oB,kBAbV,MAauB,GAbvB,MAa2B1jD,iBAb3B,MAauC,GAbvC,EAcQq+I,EAAsBnuH,iBAAe,GAErCwtH,EAAsBxtH,iBAAiB,IACvCytH,EAAqBztH,iBAAiB,IAEtC0tH,EAAgB,OAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAqB5iH,QACxC+iH,EAAkBF,EAAmB7iH,QAErCgjH,EACF9oE,IACEA,IACG4oE,EAAiBlgI,OAASmgI,EAAgBngI,QACvC1d,EAAU0d,QFlRa,GEqR7ByC,EAAiBngB,EAAUgM,KAAI,SAAAyxI,GACjC,OAAOG,EAAiB5xI,KAAI,SAAA1M,GAAO,2CAC3BokD,EAD2B,MACV+5F,GADU,yBAE/Bn+I,GAF+B,QAMjCg/I,EAAgBt+I,EAAUgM,KAAI,SAAAyxI,GAChC,OAAOI,EAAgB7xI,KAAI,SAAA1M,GAAO,2CAC1BokD,EAD0B,MACT+5F,GADS,yBAE9Bn+I,GAF8B,QAMhCy+I,EAA8B,CAChClqF,WAAY,CACRt3D,OAAQm4D,kBAAQv0C,IAEpBqxC,UAAW,UAGTwsF,EAAgC,CAClCnqF,WAAY,CACRt3D,OAAQm4D,kBAAQ4pF,GAChBt+I,UAAW,IAEfwxD,UAAW,UAQT+sF,EAA8BxjJ,sBAAW,yCAC3C,WACIwB,EACAinD,GAFJ,wBAAAxmC,EAAA,yDAIUhd,EAJV,OAIsBwjD,QAJtB,IAIsBA,OAJtB,EAIsBA,EAAYx3C,KAAI,SAAAkU,GAAM,OAAIA,EAAO1V,MAC7Cg0I,EALV,OAK2Bh7F,QAL3B,IAK2BA,GAL3B,UAK2BA,EAAYx3C,KAC/B,SAAAkU,GAAM,OAAIA,EAAO3jB,iBANzB,aAK2B,EAEnB,GAEEkiJ,EAA2BliJ,EAAO2hB,QACpC,SAAA5e,GAAO,OAAKk/I,EAAe/hI,SAASnd,MAGnC6uC,kBAAQnuC,IAAemuC,kBAAQswG,GAbxC,mBAccC,EAA4B1+I,EAAUgM,KAAI,SAAAyxI,GAC5C,OAAOgB,EAAyBzyI,KAAI,SAAA1M,GAAO,2CACnCokD,EADmC,MAClB+5F,GADkB,yBAEvCn+I,GAFuC,QAM1C6uC,kBAAQuwG,GArBrB,gCAsBkBrB,EACF3oF,kBAAQgqF,IACVroH,MACE,kBAAOgoH,EAAoBvjH,SAAW96B,EAAU0d,UAzBhE,2CAD2C,wDA+B3C,CAAC2/H,EAAwB35F,IAQvBi7F,EAAgC5jJ,sBAAW,yCAC7C,WACIwB,EACAinD,GAFJ,wBAAAxmC,EAAA,yDAIUhd,EAJV,OAIsBwjD,QAJtB,IAIsBA,OAJtB,EAIsBA,EAAYx3C,KAAI,SAAAkU,GAAM,OAAIA,EAAO1V,MAC7Cg0I,EALV,OAK2Bh7F,QAL3B,IAK2BA,GAL3B,UAK2BA,EAAYx3C,KAC/B,SAAAkU,GAAM,OAAIA,EAAO3jB,iBANzB,aAK2B,EAEnB,GAEEqiJ,EAA0BriJ,EAAO2hB,QAAO,SAAA5e,GAAO,OACjDk/I,EAAe/hI,SAASnd,MAGvB6uC,kBAAQnuC,IAAemuC,kBAAQywG,GAbxC,mBAccC,EAA2B7+I,EAAUgM,KAAI,SAAAyxI,GAC3C,OAAOmB,EAAwB5yI,KAAI,SAAA1M,GAAO,2CAClCokD,EADkC,MACjB+5F,GADiB,yBAEtCn+I,GAFsC,QAMzC6uC,kBAAQ0wG,GArBrB,gCAsBkBvB,EACF5oF,kBAAQmqF,IACVxoH,MACE,kBAAOgoH,EAAoBvjH,SAAW96B,EAAU0d,UAzBhE,2CAD6C,wDA+B7C,CAAC4/H,EAA2B55F,IAO1Bo7F,EAAkC,WACpC,IAAMC,EAAyB/pE,EACzBqpE,EAAoBvjH,QACpB96B,EAAU0d,OAEVshI,EAA0C,IAA3BD,EAErBliI,EAAY,WAAD,OAEHmiI,EAAe,MAAQ,OAFpB,2BAGYD,EAHZ,gBAIFC,EAAqB,GAAN,KAEpB,YAIR,GAAIhqE,EAAa,CACb,IAAM1hB,EACF,GAEJ,IAAKnlB,kBAAQyvG,GAAmB,CAC5B,IAAMqB,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQqhJ,EACR59I,UAAW,IAEfwxD,UAAW,SACXwC,mBAAoB,aAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY4oF,GACZ3oF,eAAgBmrF,EAChBlrF,sBACI4rF,IAIZ,IAAK9wG,kBAAQ0vG,GAAkB,CAC3B,IAAMqB,EAAuC,CACzCrrF,WAAY,CACRt3D,OAAQshJ,EACR79I,UAAW,IAEfwxD,UAAW,SACXwC,mBAAoB,aAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY4oF,GACZ3oF,eAAgBurF,EAChBtrF,sBACI6rF,IAIZhtF,EAAW1vC,KAAX,6BACO47H,GADP,IAEI9qF,gBAAiBA,UAGhBnlB,kBAAQyvG,IACT1rF,EAAW1vC,KAAK,CACZ2wC,WAAY4oF,GACZ3oF,eAAgBiqF,EAChBhqF,sBAAuB0qF,IAI1B5vG,kBAAQ0vG,IACT3rF,EAAW1vC,KAAK,CACZ2wC,WAAY4oF,GACZ3oF,eAAgBkqF,EAChBjqF,sBAAuB2qF,IASnC,IAAMziE,EAAwCxgF,uBAC1C,SAAC4P,GACOmzI,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,oBACZzd,QAASq/C,MAMzBG,GAAa,GAEbroB,EAAa,GACb4sF,IAEAT,EAAoBvjH,QAAU,EAEf,OAAfq/C,QAAe,IAAfA,SAEJ,CAAC/tE,EAAUguE,EAAiBD,EAAiB2jE,IAO3CxiE,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACAtxI,YAAW,WACP4tE,MACD,KAGPA,IACAE,GAAaC,GAAa,GAE1BroB,EAAa,GAEI,OAAjBgoB,QAAiB,IAAjBA,UAGJ4kE,IAEAT,EAAoBvjH,QAAU,IAC/B,CAACs/C,EAAiBE,EAAWJ,EAAmB4jE,IAE3CxrF,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF2rF,EAA8BljJ,uBAAY,WAC5C28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GAEbgoB,GAAaC,GAAa,GAC1BH,IAEAloB,EAAa,GAEI,OAAjBgoB,QAAiB,IAAjBA,UAGJ4kE,IAEAT,EAAoBvjH,QAAU,IAC/B,CACC8iH,EACAtjE,EACAF,EACAF,EACA5nB,IAOE4rF,EAA+BnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,oBACZkjC,wBACIuiE,EACJljH,QAASq/C,MAMzB9nB,GAAa,QAElB,CACClmD,EACA6xI,EACA7jE,EACA9nB,EACAwrF,IAUJ,OAPAzvH,qBAAU,WACFisD,GACA4jE,MAGL,CAAC5jE,IAEGv/E,uBACH,SACImlB,EACA09H,EACAC,GAEAL,EAAU1iH,QAAU5a,EACpBw9H,EAAoB5iH,QAAU8iH,EAC9BD,EAAmB7iH,QAAU+iH,EAE7BtjE,GAAa,KAEjB,IAiBD,SAAS4kE,GACZp5I,EACAo3I,EACAjhJ,EACA+9E,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXytE,EAAkBx2D,eAClB/G,EAAcnQ,cAEd0yI,EAA4B9C,GAA6Bv2I,GAEzDs5I,EAAgBnvH,iBAA4B,CAC9C7qB,WAAY,GACZC,KAAM,KAGJw4I,EAAmB7jE,EAAkB,GAErCqlE,EAA4BpvH,iBAAe,GAdnD,EAgBoChC,oBAAkB,GAhBtD,mBAgBSosD,EAhBT,KAgBoBC,EAhBpB,KAkBQroB,EAEA,CACF,CACIiB,WFvoBsB,qBEwoBtBC,eAAgBgsF,EAChB/rF,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,GADK,IAERwB,OAAQu8E,IAEZkjE,4BACAV,WAAY4C,EAAcvkH,QAC1Bo/C,kBAAmB,kBACdolE,EAA0BxkH,QACvBwkH,EAA0BxkH,QAAU,IAEhD02B,UAAW,yBASjB+tF,EAAiC,kBAClCD,EAA0BxkH,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACAtxI,YAAW,WACP4tE,MACD,KAGPE,GAAaC,GAAa,GAC1BglE,IAEA1iI,EAAY,kCAAmC,WAC9B,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,cACZzd,QAASq/C,MAMzBmlE,IAEAjlE,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUFktF,EAAwCzkJ,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEHyiI,EAA0BxkH,QAAUq5B,KAFjC,oCAIP,WAGJorF,IAEiB,OAAjBrlE,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhD4iI,EAAyC1kJ,uBAAY,WACvD28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,cACZkjC,wBACI8jE,EACJzkH,QAASq/C,MAMzB9nB,GAAa,QAElB,CACClmD,EACAozI,EACAplE,EACA9nB,IAaJ,OAVAjkC,qBAAU,WACFisD,GACAmlE,MAGL,CAACnlE,IAKGv/E,uBAAY,SAAC0hJ,GAChB4C,EAAcvkH,QAAU2hH,EACxBliE,GAAa,KACd,IC3xBA,IAGMmlE,GAAqB,qBCoE3B,SAASC,GACZn6I,EACAgzC,EACA0hC,EACAC,GACD,IACS/mB,EAA0C5tD,EAA1C4tD,eAAgBC,EAA0B7tD,EAA1B6tD,sBAElBjnD,EAAWO,cACXytE,EAAkBx2D,eAJ1B,EAQMyvC,EADAQ,WAPN,IAOoB+rF,uBAPpB,MAOsC,KAPtC,MAO4Ct+C,WAGpCw8C,GACA8B,SAXR,MAOyD,EAPzD,ID3EoC,ICuF7BA,GAAmBA,EAAgBliI,QDtFL,GC4F7BmiI,EAAyC9kJ,uBAAY,WACnD+iJ,GACAtxI,YAAW,WACP4tE,MACD,KAEPhuE,EAASs1H,MAEQ,OAAjBxnD,QAAiB,IAAjBA,SACD,CAACE,EAAiBF,EAAmB4jE,EAAkB1xI,IAMpDmvE,EAAwCxgF,uBAAY,WAClD+iJ,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,aACAzd,QAASq/C,MAKzBhuE,EAASw1H,MAEM,OAAfznD,QAAe,IAAfA,SACD,CACC/tE,EACAguE,EACA5hC,EACA2hC,EACA2jE,IAGIxrF,EACJL,aACI,CACI,CACIkB,WAAYusF,GACZtsF,iBACAC,0BAGRwsF,EACAtkE,GAVAjpB,aAiBF2rF,EAA8BljJ,uBAAY,WAC5C28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IACAhuE,EtD+KD,CACHrG,KAAMuN,GAAQwsI,0BsD9KO,OAAjB5lE,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAclmD,IAkCtD,MAAO,CACH8xI,6BA7BiCnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,aACAkjC,wBACIuiE,EACJljH,QAASq/C,MAMzB9nB,GAAa,GACblmD,EAASo1H,WAEd,CACCp1H,EACA6xI,EACA7jE,EACA5hC,EACA8Z,EACAwrF,IAKAG,+BAgVR,IAiFa8B,GAAgC,WACzC,IAAMC,EA1BqB,WAC3B,IAAMC,EAAuB74I,cAE7B,OAAOrM,sBAAW,yCACd,WAAOyL,EAAgBo5I,GAAvB,gBAAA5iI,EAAA,6DACU3V,EAAUu4I,EAAgB5zI,KAAI,SAAC5R,GAAD,MAAqB,CACrDA,SACAwN,YAAY,EACZpB,aAJR,SAOUy5I,EAAqB54I,GACtBgvB,MAAK,SAAAma,OACLja,OAAM,SAAC5rB,GACJ,MAAMA,KAVlB,2CADc,wDAcd,CAACs1I,IASuBC,GACtBC,EAnF8B,WACpC,IAAMC,EAAiBh+I,eACjB69I,EAAuB74I,cACvBuL,EAAU0R,YAAY3R,MAE5B,OAAO3X,sBAAW,yCACd,WAAOyL,EAAgBtK,GAAvB,8BAAA8gB,EAAA,gEACSrK,QADT,IACSA,OADT,EACSA,EAASrU,UADlB,wDAEUulI,EAA0C,CAC5C/mI,QACI,UAAAZ,EAAauX,eAAb,eAAsB2O,QAAO,SAAC5kB,EAAU0gB,GAKpC,MAJqB,WAAjBA,EAAOngB,QACPP,EAAWmhE,OAAOzgD,EAAOtN,QAGtBpT,IACR,MANH,UAMairC,KAAWtqC,OANxB,YAMkCsqC,KAAWC,SACjDnsC,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCmlC,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClCslC,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC4qC,UAAS,OAAEl2B,QAAF,IAAEA,GAAF,UAAEA,EAASrU,iBAAX,aAAE,EAAoB3D,WAC/B8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQ,EACRC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,GAC1DgmI,cAAa,UAAE5nI,EAAasK,cAAf,aAAE,EAAqB7L,YAnB5C,SAqBUylJ,EAAevc,GAChBxtG,KADC,yCACI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI3V,EADJ,OACcgiC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAC7B,SAACmS,GAAD,MAA2B,CACvB/jB,OAAM,OAAE+jB,QAAF,IAAEA,OAAF,EAAEA,EAAM3T,GACd5C,YAAY,EACZpB,OAAQA,MAGX2nC,kBAAQ9mC,GARX,gCASQ44I,EAAqB54I,GAASkvB,OAChC,SAAC5rB,GACG,MAAMA,KAXhB,2CADJ,uDAiBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAvClB,2CADc,wDA2Cd,CAACs1I,EAAD,OAAuBttI,QAAvB,IAAuBA,OAAvB,EAAuBA,EAASrU,UAAW8hJ,IAmCVC,GAErC,OAAOtlJ,sBAAW,yCACd,WACIyL,EACAtK,EACA0jJ,GAHJ,UAAA5iI,EAAA,0DAKQ4iI,EALR,gCAMcI,EAAoBx5I,EAAQo5I,GAN1C,6CAQcO,EAA6B35I,EAAQtK,GARnD,2CADc,0DAYd,CAAC8jJ,EAAqBG,KAoEjBG,GAAkC,WAC3C,IAAMC,EA7DgC,WACtC,IAAMC,EAAwBv5I,eACxBw5I,EAAyBn5I,cAE/B,OAAOvM,sBAAW,yCACd,WAAOyL,EAAgBtK,GAAvB,UAAA8gB,EAAA,sEACUwjI,EACFh6I,EACAoyD,aAA8B,6BAAK18D,GAAN,IAAoBwB,OAAQ,MAExD24B,KAJC,yCAII,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI3V,EADJ,OACcgiC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAAI,SAAAmS,GAAI,MAAK,CAC1C/jB,OAAQ+jB,EAAK3a,KAAKgH,GAClBhE,OAAQA,MAGP2nC,kBAAQ9mC,GANX,gCAOQo5I,EAAuBp5I,GAASkvB,OAClC,SAAC5rB,GACG,MAAMA,KAThB,2CAJJ,uDAkBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KApBlB,2CADc,wDAwBd,CAAC81I,EAAwBD,IAiCUE,GACjCC,EA1BuB,WAC7B,IAAMF,EAAyBn5I,cAE/B,OAAOvM,sBAAW,yCACd,WAAOyL,EAAgBo5I,GAAvB,gBAAA5iI,EAAA,6DACU3V,EAAUu4I,EAAgB5zI,KAAI,SAAC5R,GAAD,MAAqB,CACrDA,SACAoM,aAHR,SAMUi6I,EAAuBp5I,GACxBgvB,MAAK,SAAAma,OACLja,OAAM,SAAC5rB,GACJ,MAAMA,KATlB,2CADc,wDAad,CAAC81I,IAUyBG,GAE9B,OAAO7lJ,sBAAW,yCACd,WACIyL,EACAtK,EACA0jJ,GAHJ,UAAA5iI,EAAA,0DAKQ4iI,EALR,gCAMce,EAAsBn6I,EAAQo5I,GAN5C,qCAQQ1jJ,GARR,qCASmBqkJ,EACH/5I,EACAtK,GAXhB,2CADc,0DAgBd,CAACykJ,EAAuBJ,KA4IzB,IAmBDM,GAAyB,WAC3B,IAAMC,EAAcn6I,cAEpB,OAAO5L,sBAAW,yCACd,WAAO6kJ,GAAP,UAAA5iI,EAAA,sEACU8jI,EAAYlB,GACbvpH,MAAK,SAAAma,OACLja,OAAM,SAAC5rB,GACJ,MAAMA,KAJlB,2CADc,sDAQd,CAACm2I,KAQHC,GAA0B,WAC5B,IAAMtb,EAAiBp/H,eACjB26I,EAAsBH,KAE5B,OAAO9lJ,sBAAW,yCACd,WAAOmB,GAAP,UAAA8gB,EAAA,sEACUyoH,EACFlsE,aAAwB,6BAAKr9D,GAAN,IAAoBwB,OAAQ,MAElD24B,KAHC,yCAGI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACIpW,EAAU,GACR,OAARyiC,QAAQ,IAARA,GAAA,UAAAA,EAAUpsB,aAAV,SAAiB0D,SAAQ,SAAAxC,IAChBA,EAAK8iI,WAAa9iI,EAAK3T,IACxB5D,EAAQ4b,KAAKrE,EAAK3T,OAIrB2jC,kBAAQvnC,GARX,gCASQo6I,EAAoBp6I,GAAS2vB,OAC/B,SAAC5rB,GACG,MAAMA,KAXhB,2CAHJ,uDAmBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KArBlB,2CADc,sDAyBd,CAACq2I,EAAqBvb,KAiBvB,SAASyb,GACZ16I,EACAnG,EACAnE,EACA+9E,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXytE,EAAkBx2D,eAClB/G,EAAcnQ,cAEdy0I,ECn6ByC,WAC/C,IAAM5Z,EAA+B7gI,eAC/BsiI,EAAgB//H,eAChB4T,EAAcnQ,cAEpB,OAAO3R,sBAAW,yCACd,WACIyL,EACAnG,EACAnE,EACAg+E,GAJJ,kBAAAl9D,EAAA,6DAMU8/H,EACF5jF,aAAoC,6BAC7Bh9D,GAD4B,IAE/BumC,gBAAgB,UAAAvmC,EAAaumC,sBAAb,eAA6B/kB,QACvCxhB,EAAaumC,eACb,CAAC,UAAW,kBAX9B,SAcU8kG,EAA6B/gI,EAAQnG,EAAT,gBAC3By8I,IAEFzmH,KAHC,yCAGI,WAAMgT,GAAN,gBAAArsB,EAAA,yDACGmxB,kBAAQ9E,EAASpsB,OADpB,uBAEQnV,EAAcuhC,EAASpsB,MAExBiB,QACG,SAAAC,GAAI,OAAIA,EAAK3a,KAAK1G,SAAW2rC,KAAWtqC,UAE3C6N,KACG,SAAAmS,GAAI,MACC,CACG9V,aAAc8V,EAAK3T,GACnBzE,KAAMgpC,SAXxB,SAeQi6F,EAAclhI,GACfuuB,MAAK,WACF6jD,EAAkBpyE,EAAY4V,WAEjC6Y,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAtBhB,2CAHJ,uDA6BD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KA5ClB,2CADc,4DAgDd,CAACq+H,EAAezB,EAA8B1qH,ID+2B9CukI,GAEEtD,EAAmB7jE,EAAkB,GAErConE,EAAmCnxH,iBAAe,GAV1D,EAYoChC,oBAAkB,GAZtD,mBAYSosD,EAZT,KAYoBC,EAZpB,KAcQroB,EACF,CACI,CACIiB,WD97BsB,yBC+7BtBC,eAAgB+tF,EAChB9tF,sBAAuB,CACnBQ,WAAY,CACRrtD,SACAnG,eACAnE,aAAa,6BACNA,GADK,IAERwB,OAAQu8E,IAEZC,kBAAmB,SAAConE,GAAD,OACdD,EAAiCvmH,QAC9BumH,EAAiCvmH,QACjCwmH,IAEZ9vF,UAAW,yBASrB+vF,EAAmC,kBACpCF,EAAiCvmH,QAAU,GAM1CwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACAtxI,YAAW,WACP4tE,MACD,KAGPE,GAAaC,GAAa,GAE1B19D,EAAY,qBAAD,OACcwkI,EAAiCvmH,QAD/C,UAEP,WAGJymH,IACiB,OAAjBrnE,QAAiB,IAAjBA,YAEL,CACCE,EACAE,EACAJ,EACA4jE,EACAjhI,IAOE0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,eACZzd,QAASq/C,MAMzBmnE,IAEAjnE,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CACC/tE,EACAguE,EACAE,EACAH,EACA2jE,IAGIxrF,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUFkvF,EAAyCzmJ,uBAAY,WACvD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,qBAAD,OACcwkI,EAAiCvmH,QAD/C,UAEP,WAGJymH,IAEiB,OAAjBrnE,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhD4kI,EAA0C1mJ,uBAAY,WACxD28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,eACZkjC,wBACI8lE,EACJzmH,QAASq/C,MAMzB9nB,GAAa,QAElB,CACClmD,EACAo1I,EACApnE,EACA9nB,EACAwrF,IAUJ,OAPAzvH,qBAAU,WACFisD,GACAmnE,MAGL,CAACnnE,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IE7lCA,I,UC2BC,SAASmnE,GACZC,EACA1nE,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXi1I,ECrBuC,WAC9C,IAAMr5G,EAAiBnmC,eACjBy/I,EAA0Bh6I,cAE1BgV,EAAcnQ,cAOpB,OAAO3R,sBAAW,yCACd,aAEIm/E,GAFJ,wBAAAl9D,EAAA,6DACMnd,EADN,EACMA,OAAQQ,EADd,EACcA,aAAcguC,EAD5B,EAC4BA,QAAsByzG,EADlD,EACqCh6I,YAG3BxN,EAJV,6BAIwBstI,GAA2B/nI,IAJnD,IAI4DnC,OAAQ,IAJpE,SAKU6qC,EAAejuC,GAChB+7B,KADC,yCACI,WAAOgT,GAAP,gBAAArsB,EAAA,2DACIlV,EAAgCuhC,EAASpsB,MAAMjR,KAAI,SAACmS,GAAU,IAAD,EAC/D,MAAO,CACH/jB,OAAQ+jB,EAAK3T,GACbnK,aAAcA,EACdguC,QAASA,IAAO,UACTyzG,EAAoBx4G,MAAK,SAAAlZ,GAAC,OAAIA,EAAEh2B,SAAW+jB,EAAK3T,aADvC,aACT,EAAqD6jC,UACrD,UAIC3wB,OAXd,gCAYQmkI,EAAwB/5I,GAAayuB,OAAM,SAAA5rB,GAG7C,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAfZ,OAiBEuvE,IAjBF,2CADJ,uDAqBD3jD,OAAM,SAAC5rB,GACJ,MAAMA,KA3BlB,2CADc,wDA+Bd,CAACk3I,EAAyBt5G,EAAgB1rB,IDrBNklI,GACjC3nE,EAAkBx2D,eAClB/G,EAAcnQ,cAEd2tE,EAA4BnqD,iBAAe,GANnD,EAQoChC,oBAAkB,GARtD,mBAQSosD,EART,KAQoBC,EARpB,KAUQroB,EACF,CACI,CACIiB,WD7CuB,2BC8CvBC,eAAgBwuF,EAChBvuF,sBAAuB,CACpBQ,WAAY,CACP33D,aAAa,6BACNylJ,GADK,IAERjkJ,OAAQu8E,IAEZC,kBAAmB,kBACdG,EAA0Bv/C,QACxBu/C,EAA0Bv/C,QAAU,IAE/C02B,UAAW,yBASrB6pB,EAAiC,kBAClChB,EAA0Bv/C,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bc,IAEAx+D,EAAY,+BAAgC,WAC3B,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,eACZzd,QAASq/C,MAKrBiB,IAEAf,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF0vF,EAA+CjnJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEJw9D,EAA0Bv/C,QACzBq5B,KAHG,6BAKP,WAGJknB,IAEiB,OAAjBnB,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDolI,EAA+ClnJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,eACZkjC,wBACIsmE,EACJjnH,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACA41I,EACA5nE,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACA2nE,MAGL,CAAC3nE,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IAcA,SAAS2nE,GACbC,EACAxiJ,EACAyiJ,EACAloE,EACAC,GAEA,IAAM/tE,EAAWO,cACX01I,ECxIoC,WAC1C,IAAMC,EAA2BpgJ,eAC3BqgJ,EAAoBx6I,cAEpB8U,EAAcnQ,cAOpB,OAAO3R,sBAAW,yCACd,aAEIm/E,GAFJ,oBAAAl9D,EAAA,yDACM5iB,EADN,EACMA,OAAQ8B,EADd,EACcA,aAGJ5B,EAASwyC,aAA+B5wC,GAJlD,KAKI9B,GALJ,qCAKoBkoJ,EAAyBloJ,EAAQE,GAC5C+7B,KADW,yCACN,WAAOgT,GAAP,gBAAArsB,EAAA,2DACIhV,GAAkC,OAARqhC,QAAQ,IAARA,OAAA,EAAAA,EAAUpsB,MAAMjR,KAAI,SAACmS,GAAD,OAAUA,EAAK3T,QAAO,IAExDkT,OAHhB,gCAIQ6kI,EAAkBv6I,GAAeuuB,OAAM,SAAA5rB,GAGzC,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAPZ,OASEuvE,IATF,2CADM,uDAaX3jD,OAAM,SAAC5rB,GACJ,MAAMA,KAnBlB,2CADc,wDAuBd,CAAC43I,EAAmBD,EAA0BzlI,IDsGf2lI,GAC7BC,EC/FuC,WAC7C,IAAMH,EAA2B57I,eAC3B67I,EAAoBx6I,cAEpB8U,EAAcnQ,cAOpB,OAAO3R,sBAAW,yCACd,aAEIm/E,GAFJ,sBAAAl9D,EAAA,yDACM9gB,EADN,EACMA,aAGI5B,EAAS4+D,aAAoCh9D,GAC3CsK,EAAyBtK,EAAzBsK,OAAQnG,EAAiBnE,EAAjBmE,aALpB,KAOImG,GAAUnG,GAPd,qCAOoCiiJ,EAC5B97I,EAAO7L,WACP0F,EAAa1F,WACbL,GACE+7B,KAJ0B,yCAIrB,WAAOgT,GAAP,gBAAArsB,EAAA,2DACGhV,GAAkC,OAARqhC,QAAQ,IAARA,OAAA,EAAAA,EAAUpsB,MAAMjR,KAAI,SAACmS,GAAD,OAAUA,EAAK3T,QAAO,IAExDkT,OAHf,gCAIO6kI,EAAkBv6I,GAAeuuB,OAAM,SAAA5rB,GAGzC,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAPX,OASCuvE,IATD,2CAJqB,uDAgB3B3jD,OAAM,SAAC5rB,GACJ,MAAMA,KAxBlB,2CADc,wDA4Bd,CAAC43I,EAAmBD,EAA0BzlI,IDwDX6lI,GACjCtvF,EAAgC,eAAfzzD,EAA8B0iJ,EAA6BI,EAC5EE,EAAmC,eAAfhjJ,EAA8B,eAAiB,QACnEy6E,EAAkBx2D,eAClB/G,EAAcnQ,cAEd2tE,EAA4BnqD,iBAAe,GATnD,EAWoChC,oBAAkB,GAXtD,mBAWSosD,EAXT,KAWoBC,EAXpB,KAaQroB,EACF,CACI,CACIiB,WDpNwB,2BCqNxBC,iBACAC,sBAAuB,CACpBQ,WAAY,CACP33D,aAAa,6BACNimJ,GADK,IAERzkJ,OAAQ0kJ,IAEZloE,kBAAmB,kBACdG,EAA0Bv/C,QACxBu/C,EAA0Bv/C,QAAU,IAE/C02B,UAAW,yBASrB6pB,EAAiC,kBAClChB,EAA0Bv/C,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bc,IAEAx+D,EAAY,OAAD,OAAQ8lI,EAAR,yBAAiD,WAC3C,OAAjBzoE,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,EAAa8lI,IAM1DpnE,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAW,YAAD,OAAcmqG,GACxB5nH,QAASq/C,MAKrBiB,IAEAf,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,EAAiBwoE,IAEnDrwF,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUFswF,EAA+C7nJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEJw9D,EAA0Bv/C,QACzBq5B,KAHG,YAIHwuF,EAJG,yBAKP,WAGJtnE,IAEiB,OAAjBnB,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,EAAa8lI,IAM7DE,EAA+C9nJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAW,YAAD,OAAcmqG,GACxBjnE,wBACAknE,EACA7nH,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAw2I,EACAxoE,EACA9nB,EACAqwF,IAUJ,OAPAt0H,qBAAU,WACFisD,GACAuoE,MAGL,CAACvoE,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IAaA,SAASuoE,GACZC,EACAX,EACAloE,EACAC,GAEA,IAAM/tE,EAAWO,cACXq2I,ECtNmC,WACzC,IAAMV,EAA2B57I,eAC3BonC,EAA2B7lC,cAE3B4U,EAAcnQ,cAOpB,OAAO3R,sBAAW,yCACd,aAEIm/E,GAFJ,0BAAAl9D,EAAA,yDACM9gB,EADN,EACMA,aAAcmyC,EADpB,EACoBA,QAAS3wC,EAD7B,EAC6BA,OAGnBpD,EAAS4+D,aAAoC,6BAAIh9D,GAAL,IAAmBwB,YAC7D8I,EAAyBtK,EAAzBsK,OAAQnG,EAAiBnE,EAAjBmE,aALpB,KAOImG,GAAUnG,GAPd,qCAOoCiiJ,EAC5B97I,EAAO7L,WACP0F,EAAa1F,WACbL,GACE+7B,KAJ0B,yCAIrB,WAAOgT,GAAP,gBAAArsB,EAAA,2DACGlV,GAAgD,OAARuhC,QAAQ,IAARA,OAAA,EAAAA,EAAUpsB,MAAMjR,KAAI,SAACmS,GAAD,MAAW,CAAE9V,aAAc8V,EAAK3T,GAAI6jC,gBAAe,IAErG3wB,OAHb,gCAIOowB,EAAyBhmC,GAAayuB,OAAM,SAAA5rB,GAG9C,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAPX,OASCuvE,IATD,2CAJqB,uDAgB3B3jD,OAAM,SAAC5rB,GACJ,MAAMA,KAxBlB,2CADc,wDA4Bd,CAACmjC,EAA0Bw0G,EAA0BzlI,ID+KtBomI,GAC7B7oE,EAAkBx2D,eAClB/G,EAAcnQ,cACdw2I,EAAahzH,iBAAsB,MAEnCmqD,EAA4BnqD,iBAAe,GAPnD,EASoChC,oBAAkB,GATtD,mBASSosD,EATT,KASoBC,EATpB,KAUQroB,EACF,CACI,CACIiB,WDvXwB,2BCwXxBC,eAAgB4vF,EAChB3vF,sBAAuB,CACpBQ,WAAY,CACP33D,aAAa,6BACN6mJ,GADK,IAER10G,QAAS60G,EAAWpoH,QACpBp9B,OAAQ0kJ,IAEZloE,kBAAmB,kBACdG,EAA0Bv/C,QACxBu/C,EAA0Bv/C,QAAU,IAE/C02B,UAAW,yBASrB6pB,EAAiC,kBAClChB,EAA0Bv/C,QAAU,GAMnCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bc,IAEAx+D,EAAY,uBAAwB,WACnB,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAW,kBACXzd,QAASq/C,MAKrBiB,IAEAf,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF6wF,EAA+CpoJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,uBAER,WAGJw+D,IAEiB,OAAjBnB,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDumI,EAA+CroJ,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAW,kBACXkjC,wBACAynE,EACApoH,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACA+2I,EACA/oE,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACA8oE,MAGL,CAAC9oE,IAEGv/E,uBAAY,SAACszC,GAChB60G,EAAWpoH,QAAUuT,EACrBksC,GAAa,KACd,I,IE5fKjnE,G,SCqHNwpF,GAAKhyE,EAAQ,IAENu4H,GAGR,SAAC,GAAwC,IAAtCzZ,EAAqC,EAArCA,WAAY0Z,EAAyB,EAAzBA,mBAChB,OACK1Z,GACAA,EAAW2Z,WACX3Z,EAAWpmI,MACX8/I,GAKD1Z,EAAW9sI,SAAWwgD,KAAqB5U,QAEvC,cAACypG,GAAD,CAAyBjmI,YAAU,2BAAnC,SACKwgB,aAAWk9G,EAAW2Z,aANxB,cAAC7zF,GAAA,EAAD,KAcTmmF,GAAiB,GAEV2N,GAuCR,SAAC,GAuBC,IAAD,YAtBF7wI,EAsBE,EAtBFA,QACA8wI,EAqBE,EArBFA,uBACA30I,EAoBE,EApBFA,QACAy4H,EAmBE,EAnBFA,6BACAjtI,EAkBE,EAlBFA,OACAqoB,EAiBE,EAjBFA,QACA+gI,EAgBE,EAhBFA,eACAl+G,EAeE,EAfFA,QACA89G,EAcE,EAdFA,mBACAK,EAaE,EAbFA,gBACA7iJ,EAYE,EAZFA,WACA6S,EAWE,EAXFA,eACA82H,EAUE,EAVFA,iBACAmZ,EASE,EATFA,oBACAC,EAQE,EARFA,oBACAC,EAOE,EAPFA,mBACAC,EAME,EANFA,cACAC,EAKE,EALFA,aACAC,EAIE,EAJFA,qBAEAvS,GAEE,EAHFwS,yBAGE,EAFFxS,aACAyS,EACE,EADFA,cAEMprE,EAAUb,KADd,EAGwChqD,mBAAS,IAAIhD,MAHrD,mBAGK+mD,EAHL,KAGoBqkE,EAHpB,OAIoCpoH,oBAAc,GAJlD,mBAIK8mD,EAJL,KAIkBuhE,EAJlB,OAOEroH,mBAAgC,CAC5ByqD,QAAQ,EACRz7E,KAAM,OATZ,mBAMKknJ,EANL,KAM4BC,EAN5B,OAaEn2H,mBAAc,MAbhB,mBAYKo2H,EAZL,KAYgCC,EAZhC,KAeIlO,EAAgB5I,KAChB3/F,GAA2B7lC,cAC3BovG,GAA8BvzF,eAE9Bo3G,GAAcjV,GAAgBzgF,GAE9B1D,GAAoC,CACtClkC,WAAY,GACZE,QAAS,CAAEC,MAAO,0BAA2BC,KAAK,GAClDykC,eAAgB,GAChBhvB,QAAS,GACTslD,2BAA4B,GAC5Bn4C,SAAUjN,EACVlW,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf07C,gBAAiB,IAGfq9E,IACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,UACJ,OAAXo3I,QAAW,IAAXA,OAAA,EAAAA,EAAaz1G,OAAQ8M,KAAavvC,oBAAoBgF,KAChDkzI,EAAYp3I,OACZwnC,GAxCR,GAkDED,aAAqB60G,IAPrBx6I,GA3CF,GA2CEA,aACAg4B,GA5CF,GA4CEA,cACA4O,GA7CF,GA6CEA,WACAW,GA9CF,GA8CEA,UACAT,GA/CF,GA+CEA,YACAc,GAhDF,GAgDEA,oBACAJ,GAjDF,GAiDEA,UAGEozG,GACF2M,GACAA,EAAuBxmI,OACvB4mI,GACAA,EAAoBnmI,OAAS+lI,EAAuBxmI,MAAMS,OAExDmF,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEA3jE,GAAcn3E,uBAAY,WAC5BmB,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBtP,EAA6BrrI,IAC7Bo6I,EAAiB,IAAIprH,MACrBqrH,GAAe,GACf9L,EAAiB,IAAI,EAAMqM,MAC5B,CACC56I,GACA26I,GACAtP,EACAkD,EACAqM,KAwBE0N,GAA6B,SAACpqJ,EAAgBiO,GAChDsa,EAAQH,KAAKluB,IAAOiE,gBACfmC,QACG,UACAN,EAAOO,YAEVD,QACG,gBACA2N,EAAa1N,YAEjB,CAAEm8H,WAAW,KAIf6gB,GAAuB,SAACjpF,GAC1BhrB,GAAU,kBAAmBgrB,IAU3B+1F,GAAyB1pJ,uBAC3B,SAAC2a,GACG,IAAMvV,EACDsjJ,GACGA,EAAuBxmI,MAAMjR,KACzB,SAAC04I,GAAD,OACI5jI,OAAO4jI,EAAsBl6I,QAEzC,GACJigI,EACItqI,EACAuV,EACAohI,MAGR,CAAC2M,EAAwB3M,GAA6BrM,IAUpDka,GAAmC,WACrCJ,EAA6B,OAG3BK,GAAwB7pJ,uBAC1B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KAEd,GAAI8lJ,EAA2B,CAAC,IAAD,EACrBj8I,EAAY,OAAGo7I,QAAH,IAAGA,GAAH,UAAGA,EAAwBxmI,MAAMqsB,MAC/C,SAAAnrB,GAAI,OAAIA,EAAK3a,KAAKgH,KAAO85I,YADX,aAAG,EAElB95I,GAEH,GAAInC,EAQA27I,EACI,CAR6B,CAC7Bj+I,KAAM,aACNsC,eACAs0I,WAAY2H,EACZh/I,OACAD,eAIAs/I,OAKhB,CAACX,EAAD,OAAeP,QAAf,IAAeA,OAAf,EAAeA,EAAwBxmI,MAAOqnI,IAG5CO,GAAqC9pJ,uBAAY,WACnD0vI,EAAiB,IAAI,EAAMqM,MAC5B,CAACrM,EAAkBqM,KAEhBgO,GAA8B3F,GAChC,aACA,CACI34I,OAAQlM,EAAOkM,OACfnG,aAAc/F,EAAO+F,cAEzBnE,GAN8D,iBAO9DunJ,QAP8D,IAO9DA,OAP8D,EAO9DA,EAAwBr/F,aAPsC,QAO7B,EACjC8tB,IAGE6yE,GAA0BhqJ,uBAC5B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KAEd,GAAIw2E,EACA8vE,GAA4B,6BAAK,CAAEx/I,SAAW,CAAED,oBAC7C,CACH,IAAMpC,EAAQ,GASd,GARsB,OAAtBwgJ,QAAsB,IAAtBA,KAAwBxmI,MAAM0D,SAAQ,SAAAulC,GAC9B29F,EAAoBpnI,SAASypC,EAAQ17C,KACrCvH,EAAMuf,KAAK,CACPhY,GAAI07C,EAAQ1iD,KAAKgH,GACjBnC,aAAc69C,EAAQ17C,QAI9Bq5I,EAAqB,CACrB,IAAMmB,EAAiB/hJ,EAAM+I,KACzB,SAAAxI,GAAI,MACC,CACGuC,KAAM,aACNsC,aAAc7E,EAAK6E,aACnBs0I,WAAYn5I,EAAKgH,GACjBlF,OACAD,iBAIZ2+I,EACIgB,EACAH,QAKhB,CACI7vE,EACA8vE,GAFJ,OAGIrB,QAHJ,IAGIA,OAHJ,EAGIA,EAAwBxmI,MACxB4mI,EACAG,EACAa,KAIFhoI,GAAcnQ,cAEdu4I,GAAqBlqJ,uBACvB,SAACwvI,GAES+Y,GACAG,GACAA,EAAuBxmI,OACvBwmI,EAAuBxmI,MAAMS,QAI/B4lI,EAF6B,CAAC/Y,IAEWl0G,MAAK,WAC1CxZ,GAAY,wBAAyB,gBAIjD,CAACymI,EAAoBG,EAAwB5mI,KAG3CqoI,GAAiChE,GACnC5mJ,EAAOkM,OACPlM,EAAO+F,aACPnE,GAHoE,iBAIpEunJ,QAJoE,IAIpEA,OAJoE,EAIpEA,EAAwBr/F,aAJ4C,QAInC,EACjC8tB,IAGEizE,GAAmBpqJ,uBAAY,WAGzB,IAAD,EAFP,GAAIi6E,EACAkwE,UAEA,GACM5B,IACD,OAACO,QAAD,IAACA,OAAD,EAACA,EAAqBnmI,UACtB,OAAC+lI,QAAD,IAACA,GAAD,UAACA,EAAwBxmI,aAAzB,aAAC,EAA+BS,QACnC,CACE,IAAM1V,EAAa,OAAGy7I,QAAH,IAAGA,OAAH,EAAGA,EAAwBxmI,MACzCiB,QACG,SAAA0rH,GAAU,OACNia,EAAoBpnI,SAASmtH,EAAWp/H,KACxCo/H,EAAWpmI,KAAK1G,SAAW2rC,KAAWtqC,SACrCyrI,EAAW9sI,SAAWugD,KAAiB3U,SACpCkhG,EAAW9sI,SAAWugD,KAAiBsb,aAElD3sD,KAAI,SAAA49H,GAAU,OAAIA,EAAWp/H,MAElC84I,EAAmBt7I,GAAequB,MAAK,WACnCxZ,GAAY,uBAAD,OAEHgnI,EAAoBnmI,OAAS,EAAI,QAAU,QAE/C,iBAKjB,CACCs3D,EACAkwE,GACArB,EACAJ,EACAH,EACAzmI,KAGE/e,GAAU5B,GAAa4B,QACvBsnJ,GAAcvQ,GAAW,YAAa/2I,GAASglC,IAC/CuiH,GAAaxQ,GAAW,uBAAwB/2I,GAASglC,IACzDwiH,GAAYzQ,GAAW,wBAAyB/2I,GAASglC,IACzDyiH,GAAY1Q,GAAW,qBAAsB/2I,GAASglC,IACtD0iH,GAAS3Q,GAAW,0BAA2B/2I,GAASglC,IACxD2iH,GAAmB5Q,GACrB,0BACA/2I,GACAglC,IAEE4iH,GAAkB7Q,GACpB,2BACA/2I,GACAglC,IAGE6iH,GAAgB9Q,GAClB,6BACA/2I,GACAglC,IAIE04D,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eAAgB6E,GAA0C19I,IAC1DolG,YAAkC,OAAtBmiD,QAAsB,IAAtBA,OAAA,EAAAA,EAAwBxmI,MAAMS,SAAU,IAOlDkoI,GAA4B7qJ,uBAAY,WAC1C4nB,EAAQH,KAAR,UACOluB,IAAOmF,QAAQE,2BADtB,iBACyDW,EAAOkM,OADhE,uBACqFlM,EAAO+F,iBAC7F,CAACsiB,EAASroB,IAEPo9I,GAAsB,SAAC56I,GACzB4mC,GAAU,iBAAkB5mC,IAG1B+oJ,GAA4B,SAAC17I,GAC/Bu5B,GAAU,6BAA8Bv5B,IAGtCytI,GAAcQ,kBAAa,OAACqL,QAAD,IAACA,OAAD,EAACA,EAAwBxmI,OAEpD6oI,IACDrC,GACAA,GAA0BA,EAAuBxmI,MAAMS,OAAS,EAE/DqoI,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAew5H,KACnC,CAACA,EAAoBC,IAGnBiC,IACDvC,GACDt1G,GAAQs1G,IAC0B,KAAZ,OAAtBA,QAAsB,IAAtBA,OAAA,EAAAA,EAAwBr/F,OAOtB0K,GAAgB,yCAAG,WAAOzmD,GAAP,sBAAA2U,EAAA,sDACfhV,EAAgBK,EAChB,CAACA,IACiB,OAAlBy7I,QAAkB,IAAlBA,OAAA,EAAAA,EAAoB93I,KAAI,SAAAmS,GAAI,OAAQ,OAAJA,QAAI,IAAJA,OAAA,EAAAA,EAAM3T,KAAM,OAAM,GAIpDy7I,EAA0B,GAC1BjxE,EACAixE,EAAoB,CAAC,KAAO,WAAY,QAAW,KAAO,aAASxC,QAAT,IAASA,OAAT,EAASA,EAAwBr/F,OACpFp8C,EAAc0V,OAAS,EAC9BuoI,EAAoB,CAAC,KAAO,WAAY,QAAW,KAAO,MAASj+I,EAAc0V,QACjD,IAAzB1V,EAAc0V,SACf2wB,EAAUo1G,EAAsB,UAAGA,EAAuBxmI,MAAMqsB,MAAK,SAACnrB,GAAD,OAAUA,EAAK3T,KAAOxC,EAAc,aAAzE,aAAG,EAA2EqmC,QAAU,KAC9H43G,EAAoB,CAAC,KAAS,SAAU,QAAW53G,EAAS,MAAS,IAGzEg2G,GAAyB,SAAA34C,GAAI,MAAK,CAC9B/yB,QAAQ,EACRz7E,KAAK,6BACE+oJ,GADH,IAEAj+I,gBACA4nD,mBAAoBvnD,IAAgB,QAtBvB,2CAAH,sDAmChB69I,GAAwB,WAC1B7B,GAAyB,SAAA34C,GAAI,oCAAUA,GAAV,IAAgB/yB,QAAQ,OACrDzG,MAGEi0E,GACFrD,GACI,CACI5mJ,aAAa,6BACNA,IADK,IAERsK,OAAQlM,EAAOkM,OACfnG,cAAe/F,EAAO+F,gBALE,OAQhCojJ,QARgC,IAQhCA,OARgC,EAQhCA,EAAwBr/F,MACxB8hG,IAGFn3F,GAAa,yCAAG,WAAO1gB,GAAP,wBAAArxB,EAAA,kEACconI,QADd,IACcA,OADd,EACcA,EAAuBlnJ,KAA/C8K,EADU,EACVA,cAAejC,EADL,EACKA,KAEjBqgJ,EACO,eAATrgJ,EACM,oBACAsoC,EACA,mBACA,mBAEJvmC,EAAcE,EAAcgE,KAAI,SAAA3D,GAAY,MAAK,CACnDA,eACAgmC,eAGA2mC,EAfc,gBAgBdmxE,GAAyC93G,GAhB3B,uCAkBRP,GAAyBhmC,GAlBjB,OAmBd+U,GAAYupI,EAA6B,WAnB3B,QAsBlBF,KAtBkB,4CAAH,sDAyBnB73H,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB+hI,8BAChC,CAAC8E,IAEJhoH,qBAAU,WACN/zB,EAAO+F,cAAgBsjJ,GAAiBrpJ,EAAO+F,gBAChD,CAACsjJ,EAAiBrpJ,EAAO+F,eAE5BguB,qBAAU,WACNnyB,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtB36I,GAAa0kB,SAAWjN,EACxB4zH,EAA6BrrI,MAE9B,CAACqrI,EAA8BrrI,KAElCmyB,qBAAU,YACF,OAACmX,QAAD,IAACA,OAAD,EAACA,EAASh7B,MAAM,OAAC0wH,SAAD,IAACA,QAAD,EAACA,GAAa1wH,MACvB,OAAPg7B,QAAO,IAAPA,OAAA,EAAAA,EAASh7B,OAAT,OAAgB0wH,SAAhB,IAAgBA,QAAhB,EAAgBA,GAAa1wH,KAC7BmY,EAAQH,KAAKluB,IAAOyD,YAAYH,YAErC,CAAC4tC,EAAS01F,GAAav4G,IAE1B0L,qBAAU,WACFq1H,GAAkBA,EAAehmI,OAAS,GAC1ComB,OAEL,CAAC4/G,EAAgB5/G,KAEpBzV,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAER,CAACozG,GAAeD,GAAWnzG,KAI9BpV,qBAAU,WACFw1H,GAAuBA,EAAoBnmI,QAC3C+sH,EAAiBoZ,GAAqB,GAAO,KAGlD,IAEHx1H,qBAAU,WACN,OAAO,kBAAMo8G,EAAiB,IAAI,EAAMqM,OAEzC,IAEHzoH,qBAAU,WACNo8G,EAAiB,IAAI,EAAMqM,MAE5B,CAAC2M,IAEJp1H,qBAAU,WACN,IAAMg4H,EAAiC5C,EACjCA,EAAuBxmI,MAAMjR,KAAI,SAAA49H,GAAU,OACvC9oH,OAAO8oH,EAAWp/H,OAEtB,GACA87I,EAAqB5kI,aACvBmiI,EACAwC,GAEAC,GAAsBA,EAAmB5oI,OAAS,GAClD+sH,EAAiB6b,GAAoB,KAE1C,CAACzC,EAAqBJ,EAAwBhZ,IAEjD,IAAM8b,GACFrE,GACI,CACIhmJ,aAAa,6BACNA,IADK,IAERsK,OAAQlM,EAAOkM,OACfnG,cAAe/F,EAAO+F,gBAG9B,OARgC,OAShCojJ,QATgC,IAShCA,OATgC,EAShCA,EAAwBr/F,MACxB8tB,IAoBFs0E,GAAiB,SAACpoI,GACpBi5F,GAA4B,CACxB7+D,WAAY,gBACZ/E,YACIowG,EAAoBnmI,OAAS,EACvB,6CACA,4CACVk7B,UAAW,kBAnBQ6tG,EAmBgBroI,OAlBvC42D,IACsB,OAAtByuE,QAAsB,IAAtBA,OAAA,EAAAA,EAAwBr/F,SAAUqiG,EAAwB/oI,OACpD6oI,KACAtC,EAAqBwC,EAAyBv0E,KAJ9B,IAACu0E,MAqFrB3O,KACA+L,KAAyBA,EAAoBnmI,OAE7Cq6H,GAA2B+N,GAmDjC,OAlBAz3H,qBAAU,WAGN,OAFAg3B,aAAcvR,KAAcI,MAAwBg+B,IAE7C,WACHzsB,aAAc3R,KAAcI,MAAwBg+B,OAGzD,IAEH7jD,qBAAU,YAEoB,OAAtBo1H,QAAsB,IAAtBA,OAAA,EAAAA,EAAwBxmI,MAAMS,SAC9BmmI,EAAoBnmI,UAApB,OAA+B+lI,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAwBr/F,QAEvDmyF,GAAe,KAEpB,QAACkN,QAAD,IAACA,OAAD,EAACA,EAAwBr/F,MAAzB,OAAgCq/F,QAAhC,IAAgCA,OAAhC,EAAgCA,EAAwBxmI,MAAMS,OAAQmmI,EAAoBnmI,SAGzF,qCACI,eAAC,GAAD,CACIxO,MAAM,sBACN2nH,UAAWviI,IAAOyD,YAAYK,eAAe5B,aAAakE,QACtD,UACAJ,GAAUA,EAAOkM,OAASlM,EAAOkM,OAAO7L,WAAa,IAEzD05H,SAAQ,iBAAEvzH,QAAF,IAAEA,OAAF,EAAEA,EAAYtC,YAAd,QAAsB,GAC9Bs4H,UAAS,OAAEqtB,QAAF,IAAEA,OAAF,EAAEA,EAAertB,UAC1BuC,cAAa,8BACTv4H,EAAU,mBAAQA,QAAR,IAAQA,OAAR,EAAQA,EAAYtC,MAAS,GAD9B,cAGbyQ,SAAS,mBAXb,YAaOq1I,GACC,cAAC/rG,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACIG,eACIjjE,GAAcA,EAAWtC,KACnBsC,EAAWtC,KACX,GAEVslE,SACMnxD,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVi6B,OAAQ+gF,GACR7pH,QAAS,kBAAMwpH,EAA6B,WAIvDz1I,IAAYkmE,GACT,cAAC,KAAD,IAGJ,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEumJ,QAAF,IAAEA,OAAF,EAAEA,EAAwBxmI,MAC9BtJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CwqF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,qBACVkjE,QAAS,CACL,CACI3zE,KAAM,eACNoQ,KAAM,cAAC,GAAD,IACNkjE,QA1pBF,WACtBvuD,YACIZ,EACAruB,IAAOyD,YAAYK,eAAe1B,mBAAmBgE,QACjD,UACAJ,EAAOkM,OAAO7L,YAChBD,QAAQ,gBAAiBJ,EAAO+F,aAAa1F,cAqpB3BupB,YAAa,CACT1U,KAAgB2rC,mBAEpBlsC,SAAU,gBAEd,CACIzQ,KAAM,kBACNoQ,KAAM,cAAC,GAAD,IACNkjE,QAAS8zE,GACT1hI,YACI,CACI1U,KAAgBqoD,gCACf,EACTlpD,SAAUq3I,GACV/2I,SAAU,iBAEd,CACIzQ,KAAM,mBACNoQ,KAAM,cAAC,GAAD,IACNkjE,QApqBC,WACpBx3E,EAAO+F,cAAiB/F,EAAOkM,QACpC+c,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QACvC,gBACAJ,EAAO+F,aAAa1F,cA+pBJupB,YAAa,CACT1U,KAAgByrC,oBAEpBhsC,SAAU,sBAItB84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEumI,QAAF,IAAEA,OAAF,EAAEA,EAAwBr/F,aAA1B,QAAmC,EAC7CygB,aAAcgxE,GACd74C,aApLC,SAACt/F,GACtB+lC,GAAU/lC,IAoLUu/F,uBACI/gG,GAAa0B,WAAW8f,SAAxB,UACAxhB,GAAa0kB,gBADb,aACA,EAAuBlD,QAC3BzO,SAAU,mBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBAAuBowC,IAAeQ,kBAAcl8I,GAAa0B,YACjEqR,SAAU,mBAEd23F,8BACKwxC,kBAAc0L,KACd1L,kBAAcqL,GACnB58C,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEgvE,QAAF,IAAEA,OAAF,EAAEA,EAAoBpmI,OACpCR,WAAU,OAAEumI,QAAF,IAAEA,OAAF,EAAEA,EAAwBr/F,MACpCygB,aAAcgxE,GACdluC,iBAhMC,WACrB8iC,EAAiB,IAAI,EAAMqM,IAC3BP,GAAe,IA+LKjjH,YAxLJ,WAChB,IAAMnzB,EACDsjJ,GACGA,EAAuBxmI,MAAMjR,KACzB,SAAC04I,GAAD,OACI5jI,OAAO4jI,EAAsBl6I,QAEzC,GACJigI,EAAiBtqI,GAAe,EAAM22I,IACtCP,GAAe,IAgLK3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNioE,gBAA0B,OAAVjjE,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GACpColG,WAAY,cACZtB,kBAAkB,EAClBP,yBACIgjD,GACJjiD,qBACIijD,GAAYp7H,oBACR0sC,KAAgBgB,YAEd,CAAC7oD,KAAgBgoD,YACjB,GACV+qC,oBACIwjD,GAAYrwG,qBACR2hB,KAAgBgB,YAExBsrC,qBACIoiD,GAAYp7H,oBACR0sC,KAAgBiB,iBAEd,CAAC9oD,KAAgB0a,mBACjB,GACVw5E,eAAgByhD,GAChBthD,eACIkiD,GAAYrwG,qBACR2hB,KAAgBiB,iBAExB0rC,gBAAiB,iBACjBG,sBACI4hD,GAAYp7H,oBACR0sC,KAAgBmB,eAEd,CAAChpD,KAAgBuoD,qBACjB,GACVqsC,oBAnQO,WAC/B,GAAKq/C,GAA2BI,EAAhC,CACA,IAIM6C,EAJmBjD,EAAuBxmI,MAAMiB,QAClD,SAAAC,GAAI,OAAIA,EAAK3T,IAAMq5I,EAAoBpnI,SAAS0B,EAAK3T,OAGJwB,KAAI,SAAAkU,GAAM,OAC3DA,GAASA,EAAO1V,IAAU,KAG9Bg8I,GAAeE,KA0PS5iD,oBACIiiD,GAAYrwG,qBACR2hB,KAAgBmB,eAExB6qC,oBACI0iD,GAAYp7H,oBACR0sC,KAAgBoB,aAEd,CAACjpD,KAAgBkoD,cACjB,GACV0rC,mBACI2iD,GAAYrwG,qBACR2hB,KAAgBoB,aAExBuc,YAAaA,EACb93D,WAAU,OAAEumI,QAAF,IAAEA,OAAF,EAAEA,EAAwBr/F,MACpC++C,uBAAwBr0C,KAGhCi4C,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI00G,eAAgBqH,GAChB56I,OACIZ,GAAaumC,eAEjB6tG,eAAgB,kBAAM30G,KACtBu+G,mBACIh+I,GAAa68D,4BACb,GAEJohF,2BACI0L,GAEJtV,gBACIoH,GAEJtpG,QACInyC,GAAam9D,mBAIzBl/B,QAAS,sBACTS,iBAAkB,IAxBtB,SA0BK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcmK,GACV19I,IAEJyS,SACIzS,GAAa0B,WAAW8f,OAAS,GACjCk6H,GAEJ3oI,SAAS,0BAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GACyC,KAApB,OAAtB20I,QAAsB,IAAtBA,GAAA,UAAAA,EAAwBxmI,aAAxB,eAA+BS,QACnC+9E,iBAAkB,CACd7sF,KAAMuqI,GACN7zI,KAAM,eACN2J,SAAU,uBAEdysF,uBAAwB,CACpBh4C,WAAY,6CACZz0C,SAAU,6BAEd0sF,uBAAwB,CACpB1sF,SAAU,iCAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QACImhI,KAAgC9hE,EACpCe,YAxSM,SAAC/wB,GAC3By/F,GAAuBz/F,EAAM5E,OAAO1qC,SACpC6gI,GAAe,IAuSKtnI,SAAU,4BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJ47I,IAJF,IAKDz2I,SAAUm3I,GACV72I,SAAU,8BANT,2BASDC,MAAO,WACP1F,MAAO,IACJ+7I,IAXF,IAYD52I,SAAUm3I,GACV72I,SAAU,6BAbT,2BAgBDC,MAAO,WACP1F,MAAO,IACJk8I,IAlBF,IAmBD/2I,SAAUm3I,GACV9pF,aAAa,EACbC,YACI,+DACJhtD,SAAU,6BAvBT,2BA0BDC,MAAO,WACP1F,MAAO,IACJm8I,IA5BF,IA6BDh3I,SAAUm3I,GACV9pF,aAAa,EACbC,YACI,iEACJhtD,SAAU,6BAjCT,2BAoCDC,MAAO,gBACP1F,MAAO,IACJg8I,IAtCF,IAuCD72I,SAAUm3I,GACV9pF,aAAa,EACbC,YACI,oDACJhtD,SAAU,yBA3CT,2BA8CDC,MAAO,WACP1F,MAAO,IACJ67I,IAhDF,IAiDD12I,SAAUm3I,GACV72I,SAAU,uBAlDT,2BAqDDC,MAAO,UACP1F,MAAO,IACJ87I,IAvDF,IAwDD32I,SAAUm3I,GACV72I,SAAU,sBAzDT,2BA4DDC,MAAO,gBACP1F,MAAO,IACJi8I,IA9DF,IA+DD92I,SAAUm3I,GACV72I,SAAU,yBAEd,CACIzF,MAAO,IAIfixF,UAAW,CACPE,WApWL,SAAC/iF,GAChB4sI,GAA2B5sI,EAAQpU,KAAKgH,GAAIoN,EAAQpN,KAoWhCqwF,kBAjVE,SAAC71C,EAAYptC,IA3gBX,SAACwY,EAAQxY,GACjCwY,EAAEC,kBACIzY,EAAQpN,IACVo5I,EAAoBhsI,EAAQpN,IAygBhCm8I,CAAoB3hG,EAAOptC,GAC3B2+H,GAAe,IAgVK37C,aA7VE,SAAChjF,GAAD,QACpBisI,KACAjsI,EAAQpN,IACVq5I,EAAoBpnI,SAAS7E,EAAQpN,KA2VjByE,SAAU,gBAEVyrF,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvBz4C,wBAAyB,SACrBziF,GADqB,OAGrB,cAAC4gF,GAAD,UACI,eAACE,GAAD,WACI,cAACD,GAAD,CACI9lF,QAAO,6BACAiF,EAAQpU,MADR,IAEHyzC,QACIr/B,EAAQpU,KACH+zC,WAEbnoC,KAAK,KACLo6D,YAAa,GACbv6D,SAAS,8BAEb,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KACJoN,EAAQpU,KAAKgH,GAErByE,SAAS,0BANb,mBAOK2I,EAAQpU,KAAKkmC,UAPlB,YAO+B9xB,EAAQpU,KAAKomC,mBAK5D,CACIswD,UAAW,aACXj/B,oBAAqB,SACjBrjD,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAASy2B,UACf8rD,WAAY,CACRrB,YAAa,SACTlhF,GADS,OAGF,OAAPA,QAAO,IAAPA,OAAA,EAAAA,EAASy2B,SACL,eAACgkG,GAAD,WACI,sBAAMnmI,YAAU,yBAAhB,SACK4gB,aAAsB,OACnBlV,QADmB,IACnBA,OADmB,EACnBA,EAASy2B,WAGhBz2B,EAAQg5H,YACL,cAAC0B,GAAD,CAAapmI,YAAU,8BAAvB,SACI,cAAC,GAAD,SAKZ,MAIhB,CACIguF,UAAW,eACXG,wBAAyB,SACrBziF,GADqB,OAGrB,cAACw6H,GAAD,UACI,cAAC,GAAD,CACIhuF,MAAO5mC,KAAK87H,MACY,KAAb,OAAP1hI,QAAO,IAAPA,OAAA,EAAAA,EAASiyH,WAEb5hF,IAAK,IACL0zF,YAAW,OACP/jI,QADO,IACPA,OADO,EACPA,EAAS+jI,YAEb7+I,OAAQ8a,EAAQ9a,OAChBmS,SAAS,+BAKzB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrjD,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAASgvI,kBACfzsD,WAAY,CACRrB,YAAa,SACTlhF,GADS,gBAGN4F,KAAKqpI,MACuB,KAApB,OAAPjvI,QAAO,IAAPA,OAAA,EAAAA,EAASgvI,kBAJJ,MAMb33I,SAAU,2BAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrjD,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAASkvI,eACf3sD,WAAY,CACRrB,YAAa,SACTlhF,GADS,OAGTwhI,GACIxhI,EAASkvI,eAEjB73I,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrjD,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAASmvI,YACf5sD,WAAY,CACRrB,YAAa,SACTlhF,GADS,OAER8U,aAAU,OAAC9U,QAAD,IAACA,OAAD,EAACA,EAASmvI,YACzB93I,SAAU,8BAGlB,CACIirF,UAAW,eACXG,wBAAyB,SACrBziF,GADqB,OAGrB,cAAC,GAAD,CACI0rI,mBACIA,EAEJ1Z,WAAYhyH,MAIxB,CACIsiF,UAAW,aACXj/B,oBAAqB,SACjBrjD,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAASovI,iBAEf7sD,WAAY,CACRrB,YAAa,SACTlhF,GADS,OAGT8U,aAAU,OAAC9U,QAAD,IAACA,OAAD,EAACA,EAASovI,iBACxB/3I,SAAU,4BAGlB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrB/hF,GADqB,OAGrB,eAAC,GAAD,CACIioG,YAAa,IACbU,YACK,OAACujC,QAAD,IAACA,OAAD,EAACA,EAAoBpmI,QAE1BzO,SAAS,qBALb,UAOK80I,EAAc/rF,2BACX,cAAC,GAAD,CACI7oD,QAAS,SAAAihB,GACLA,EAAEC,kBACFm0H,GACI5sI,EAAQpU,KAAKgH,GACboN,EAAQpN,KAGhByE,SAAS,sCARb,qCAaH80I,EAAc7rF,kBACX,cAAC,GAAD,CACI/oD,QAAS,SAAAihB,GA1iCnC,IAACh2B,EA2iC6Bg2B,EAAEC,kBA3iC/Bj2B,EA6iCiCwd,EAAQpU,KAAKgH,GA5iCrEmY,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QAAQ,UAAWN,EAAOO,YAClD,CAAEm8H,WAAW,KA6iC+B7nH,SAAS,2BAPb,0BAaH80I,EAActsF,oBACX,cAAC,GAAD,CACItoD,QAAS,kBACL2/C,GAAgB,OACZl3C,QADY,IACZA,OADY,EACZA,EAASpN,KAGjByE,SAAS,uBANb,sBAYH80I,EAAcxsF,aACX3/C,EAAQpU,OAER,cAAC,GAAD,CACI2L,QAAS,SAAAihB,GACLA,EAAEC,kBACFk0H,EACI3sI,EAAQpU,KAAKgH,KAGrByE,SAAS,yBAPb,wBAaH80I,EAAcpsF,iBACX//C,IAEA,cAAC,GAAD,CACIzI,QAAS,SAAAihB,GACL60H,GACIrtI,EAAQpN,KAGhByE,SAAS,8BANb,6BAWH80I,EAAcjsF,mBACX,cAAC,GAAD,CACIuU,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFzY,GACI4uI,GAAe,CACX5uI,EAAQpN,MAGpByE,SAAS,4BATb,yCAuBvCm1I,EAAsBzrE,SAAtB,OAAgCyrE,QAAhC,IAAgCA,OAAhC,EAAgCA,EAAuBlnJ,OACpD,cAACyyD,GAAA,EAAD,CACIzyD,KAAI,OAAEknJ,QAAF,IAAEA,OAAF,EAAEA,EAAuBlnJ,KAC7B27C,SA51Be,WAC3BwrG,GAAyB,SAAA34C,GAAI,MAAK,CAAE/yB,QAAQ,EAAOz7E,KAAM,UA41B7C2yD,QAASd,SA2Edk4F,GApE6B,WACxC,IAAMp6I,ExInwCCwX,YAAY1U,qBAAWu3G,KwIowCxBv0G,EAAU0R,YAAY3R,MACtBw0I,EAAmBlgC,KACnBrkG,EAAUW,cACVhpB,EAAmD00I,cACnDxpG,EAAUnhB,YAAYkhB,MACtBgiG,EAA+BD,GACjChtI,EAAOkM,OACPlM,EAAO+F,cAEL8mJ,EAAwC9mG,aAC1CknF,GAEE6f,EAAmBre,KACnBT,EAAgBD,KAChBgf,EAAyB1e,KACzBpsI,EAASm5B,eACT+0G,EAAmBJ,KACnBuZ,EAAsBlZ,KACtB8R,EAAanR,KACbic,E5C1akC,WACxC,IAAMp6G,EAAwBnlC,cACxB8U,EAAcnQ,cAEpB,OAAO3R,uBACH,SAACiN,EAAyB6/B,GACtB,OAAOqF,EAAsBllC,GACxBquB,MAAK,WACFxZ,EAAY,GAAD,OAEH7U,EAAc0V,OAAS,EAAI,aAAe,WAFvC,qBAIP,WAEW,OAAfmqB,QAAe,IAAfA,UAEHtR,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACuhC,EAAuBrwB,I4CsZD0qI,GACrBrD,E5CnXiC,WACvC,IAAMsD,EAA0BzgJ,eAC1B8V,EAAcnQ,cACpB,OAAO3R,uBACH,SACIiN,EACA3H,EACAR,EACA2G,GAEA,IAAMlM,EAAM,6BACL4+D,aAAoCr5D,IAD/B,IAERiI,YAAW,OAAEE,QAAF,IAAEA,OAAF,EAAEA,EAAe/J,KAAK,KACjCR,WAAO3B,EACP4B,YAAQ5B,IAEZ,OAAO0rJ,EAAwBltJ,EAAQkM,EAAQnG,GAC1Cg2B,MAAK,SAACn5B,GAEH,OADAgmD,aAAahmD,EAAM,eACZA,KAEVq5B,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAAC67I,EAAyB3qI,I4C0VG4qI,GAC3B1D,EAAgBzsF,eAEhBwsF,EAAqB96H,mBACvB,kBxIzxCD,SAAkCnc,EAAwBg3I,GAAmE,IAAD,EAC/H,OAAOtyG,aAAsCsyG,EAAtB,OAA2Ch3I,QAA3C,IAA2CA,GAA3C,UAA2CA,EAAO3P,YAAlD,aAA2C,EAAa+f,OwIwxCrEyqI,CAAyB76I,EAAOq6I,EAAiBxxI,WACvD,CAACwxI,EAAiBxxI,QAAS7I,IAEzB6kI,EAAcrtH,YAAYotH,IAE1B0S,EAAqBxhI,EAAQE,SAAShW,MAS5C,OAPAwhB,qBAAU,WACN,OAAO,WACHg5H,OAGL,IAGC,cAAC,GAAD,CACI1kI,QAASA,EACThQ,QAASA,EACTrY,OAAQA,EACRkrC,QAASA,EACT+hG,6BAA8B4f,EAC9B1D,uBAAwB52I,EAAM3P,KAC9BwmJ,eAAgB72I,EAAM86I,OACtB74I,QAASjC,EAAMiC,QACfhO,WAAY+L,EAAM/L,WAClBwiJ,mBAAoB8D,EACpBzD,gBAAiBrb,EACjB30H,eAAgBpX,EAAO6iB,SACvBqrH,iBAAkBA,EAClBmZ,oBAAqBA,EACrBC,oBAAqBqD,EAAiBxxI,QACtCouI,mBAAoBA,EACpBC,cAAeA,EACfC,aAAcxH,EACdyH,qBAAsBqD,EACtBpD,yBAA0BA,EAC1BC,cAAeA,EACfzS,YAAaA,KCn+CVkW,GA/Ba,WAAO,IACzB7kI,EAAiBL,cAAjBK,aACAJ,EAAUW,cAChB,OACI,cAAC,IAAMukI,SAAP,UACI,eAAC,IAAD,CAAQhlI,SAAUE,EAAlB,UACI,cAAC,IAAD,CACIxC,KAAMjsB,IAAOyD,YAAYH,SACzB2jI,OAAK,EACL/jF,GAAI,CACA4P,SAAU9yD,IAAOyD,YAAYK,eAAe5B,aAC5CqW,MAAO8V,EAAQE,SAAShW,SAGhC,cAAC,GAAD,CACIpS,KAAMnG,IAAOyD,YAAYK,eAAe5B,aACxC+kI,OAAK,EACLjhC,UAAWu+C,KAEf,cAAC,GAAD,CACIp+I,KACInG,IAAOyD,YAAYK,eAAe3B,qBAEtC8kI,OAAK,EACLjhC,UAAW2sD,W,4BFhCnB3zI,K,4CAAAA,E,6CAAAA,Q,KGkCZ,I,gVAAMy5F,GAAOjiF,EAAQ,KAuPRg9H,GAAwC,WACjD,IAAM17I,EAAWO,cACXo7I,EAAiCnkJ,cACjCiZ,EAAcnQ,cACpB,OAAO3R,uBACH,SACIsI,EACAQ,GAGA,OADAuI,EAASgyC,gBACF2pG,EAA+B1kJ,EAAWQ,GAC5CwyB,MAAK,SAAAn5B,GAQF,OAPI2G,EAAcjE,UACdwM,EHhSb,CACHrG,KAAMuN,GAAQ00I,uBGiSE57I,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,kBAGzC7vG,KAEVq5B,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,SACpBhB,OAGnB,CAACyB,EAAU27I,EAAgClrI,K,SC7S7C3P,GAAS,CACXiW,WAAYn0B,IAAUC,OAAOC,MAC7BkvC,kBAAmBpvC,IAAUC,OAAOC,MACpCmvC,aAAcrvC,IAAUC,OAAOC,MAC/BovC,YAAatvC,IAAUC,OAAOyB,WAC9Bie,SAAU,CACNwU,WAAYn0B,IAAUC,OAAOO,UAC7B4uC,kBAAmBpvC,IAAUC,OAAOyB,WACpC2tC,aAAcrvC,IAAUC,OAAOC,QAIjCqvC,GAAgBxzB,IAAOyD,MAAV,qIAGb,SAAAvD,GAAK,OAAIA,EAAM0D,UAAY,0BAK3B6vB,GAAczzB,IAAOC,IAAV,0IAKA,SAAAC,GAAK,OAAOA,EAAMmE,KAAOnE,EAAMmE,KAAO,MAG1C,SAAAnE,GAAK,OACVA,EAAM8C,MACA9C,EAAM8C,MACN9C,EAAM0D,SACF3f,IAAUC,OAAOO,UACjBR,IAAUC,OAAOkB,SAI7B83J,GAAoBl9I,IAAO+zB,MAAV,gFAKjBopH,GAAoBn9I,IAAOC,IAAV,oTAUT,SAAAC,GAAK,OAAIA,EAAMmE,QAChB,SAAAnE,GAAK,OAAIA,EAAMmE,QACd,SAAAnE,GAAK,OACLA,EAAMyK,SAAazK,EAAM+0G,YAAc/0G,EAAM+0G,YAAc,KAE/D,SAAA/0G,GAAK,OACHA,EAAMyK,QACAzK,EAAM0D,UAEF1D,EAAM0K,QADN3mB,IAAUC,OAAOQ,WAGbT,IAAUC,OAAOI,YACzBL,IAAUC,OAAOQ,cACjB,SAAAwb,GAAK,OAAIA,EAAMkY,cASpBglI,GAeR,SAAC,GAcC,IAbHzyI,EAaE,EAbFA,QACAC,EAYE,EAZFA,QACAhH,EAWE,EAXFA,SACAkiB,EAUE,EAVFA,aACAriB,EASE,EATFA,MACA2U,EAQE,EARFA,WACA/T,EAOE,EAPFA,KACA2vB,EAME,EANFA,UACArxB,EAKE,EALFA,SACArE,EAIE,EAJFA,UACA41B,EAGE,EAHFA,YACAb,EAEE,EAFFA,kBACAnvB,EACE,EADFA,SAEA,OACI,eAACsvB,GAAD,CAAel1B,UAAWA,EAAWsF,SAAUA,EAA/C,UACI,cAACs5I,GAAD,CACIliJ,KAAK,WACLuvB,SAAU,SAAAlF,GACNS,EAAaT,IAEjBlkB,YACI+C,GAAQ,UACFA,GADE,OACS0G,EAAU,qBAAwBD,EAAU,WAAa,MAGlF,cAACwyI,GAAD,CACI94I,KAAMA,GAvHE,GAwHRsG,QAASA,EACT/G,SAAUA,EACVgH,QAASA,EACTwN,WACIzN,EACQ0oB,GAEElxB,GAAOkxB,kBACXjb,GAAcjW,GAAOiW,WAE/B68F,YAAa5wG,EAAOA,EAAO,EAAI,EAC/BlD,YAAW+C,GAAQ,UAAOA,EAAP,WAEtBT,GACG,cAAC,GAAD,CACIT,MAAOgxB,EACP3vB,KAAM1B,EACNgB,MAAOuwB,EACP/yB,YAAW+C,GAAQ,UAAOA,EAAP,UACnBN,SAAUA,EALd,SAOKH,QAON25I,MC1ITz8F,GAAmB3gD,IAAOC,IAAV,qTAWR,qBAAG2D,SAA2B,UAAY,aAE1C,SAAA1D,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAC3C,SAAAwB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAExB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKvC24J,GAAqBr9I,IAAOC,IAAV,8JAQlB+zF,GAAkBh0F,YAAO86C,KAAP96C,CAAH,uDAIfs9I,GAAct9I,IAAOC,IAAV,wQAOJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKnC64J,GAAqBv9I,IAAOC,IAAV,gIAOlBmhE,GAAcphE,IAAOC,IAAV,mTAQJ,SAAAC,GAAK,OACVA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOQ,cAMjD84J,GAAiBx9I,YAAO8sC,KAAO7sC,IAAdD,CAAH,wSAGF,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAUxCs5J,GAAkBz9I,IAAOC,IAAV,4BAEfy9I,GAA0B19I,IAAOC,IAAV,4BAEvB09I,GAAkB39I,IAAOC,IAAV,wHAQf29I,GAAmB,QAEZC,GAKR,SAAC,GAA2D,IAAzDj6I,EAAwD,EAAxDA,SAAUk6I,EAA8C,EAA9CA,aAAcC,EAAgC,EAAhCA,gBAAiB75I,EAAe,EAAfA,SAAe,EACpCif,oBAAS,GAD2B,mBACrDC,EADqD,KAC/CC,EAD+C,KAEtDlK,EAAck5B,eACd4vE,EAAYpB,KACZxoF,EAAQwnB,aACVoiE,EAAUjkE,KACV7kC,GAEE6kI,EAAmBh+F,aAAoB89F,EAAc77B,EAAUjkE,MAE/DigG,EAAoB,SAACp4I,GACvBwd,GAAQ,GACR06H,EAAgBl4I,IAGpB,OACI,cAACsoE,GAAA,EAAD,CAAmBngC,YAAa,kBAAM3qB,GAAQ,IAA9C,SACI,eAACs9B,GAAD,CACI/8C,SAAUA,EACVmiB,OAAQ3C,KAAU06H,EAFtB,UAII,eAACT,GAAD,CACIj5I,QAAS,kBAAMif,GAASD,IACxBjiB,YAAW+C,EAFf,UAIK85I,GACG,cAACV,GAAD,UAAcM,KAElB,cAACL,GAAD,UACI,cAAC,GAAD,CACIv6I,OACKg7I,GAAoBp6I,EACf3f,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOkB,MAJ/B,SAOK44J,GAAoBJ,UAIjC,cAAC5pD,GAAD,CAAiB7zF,KAAMijB,IAASxf,EAAhC,SACI,cAAC45I,GAAD,CACIhvG,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GAHnB,SAKI,cAACgvG,GAAD,UACI,cAACC,GAAD,UACKrlH,IACIA,GAAS,IAAIp3B,KAAI,SAAAjN,GAAI,OAClB,cAAC2pJ,GAAD,CAEIv5I,QAAS,kBACL65I,EAAkBjqJ,EAAK6R,QAH/B,SAMI,cAAC,GAAD,CACI8E,QACImzI,IAAiB9pJ,EAAK6R,MAE1BxB,KAAM,GACNyhB,aAAc,kBACVm4H,EACIjqJ,EAAK6R,QAGbpC,MAAOzP,EAAKP,KACZyQ,SAAQ,UAAK2oE,oBAAU74E,EAAKP,KAAK6S,eAAzB,kBAhBPtS,EAAKP,uBC9JhD8yB,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6JACA,qBAAEi+I,WAA0B,QAAa,WAIhD,qBAAEA,YAA0B,8BAI5Bt9F,GAAkB5gD,IAAOC,IAAV,yHAOf+gD,GAAUhhD,IAAOC,IAAV,wLACA,qBAAEi+I,WAA0B,QAAa,WAMhD,qBAAEA,YAA0B,qBAGrBC,GAIR,SAAC,GAAoD,IAAlD9Y,EAAiD,EAAjDA,eAAgBE,EAAiC,EAAjCA,eAAgB2Y,EAAiB,EAAjBA,WAC9BvY,EAAapyH,eACb/hB,EAASm5B,eAFsC,EAIrBxH,mBAAmB3xB,EAAO6iB,UAJL,mBAI9C4Z,EAJ8C,KAIpCmwH,EAJoC,OAKXj7H,oBAAS,GALE,mBAK9CmwE,EAL8C,KAK/BC,EAL+B,KAO/C8qD,EAAuBruJ,uBACzB,SAACqjB,GACG+qI,EAAY/qI,GACZkgF,GAAiB,KAErB,CAAC6qD,IAGC3qD,EAAiBzjG,uBAAY,WACjB,OAAdq1I,QAAc,IAAdA,KAAiBp3G,GACjB03G,IACAJ,MACD,CAACF,EAAgBp3G,EAAUs3G,EAAgBI,IAE9C,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CAASuY,WAAYA,EAArB,SACI,cAAC3pH,GAAA,EAAD,CACIF,eAAgB6pH,EAChB/5I,MAAO+5I,EAAa,SAAW,GAC/Bh6I,SAAS,uBAHb,SAKI,cAAC,GAAD,UACI,cAAC,KAAD,CACIwkB,cAAe21H,EACfv1H,UAAU,EACVF,mBAAiB,EACjBC,YAAU,UAK1B,eAAC,GAAD,CAASq1H,WAAYA,EAArB,UACI,cAAC,IAAD,CACIz/I,MAAOy/I,EAAa,QAAU,OAC9BzjJ,OAAQ8qI,EACR1kI,QAAQ,UACRqD,SAAS,gBAJb,oBAQA,cAAC,IAAD,CACIzF,MAAOy/I,EAAa,QAAU,OAC9BzjJ,OAAQg5F,EACR7vF,SAAU0vF,EACVpvF,SAAS,eAJb,0BC5EVqiB,GAAYvmB,IAAOC,IAAV,0EAKTq+I,GAAat+I,IAAOC,IAAV,gLACF,qBAAG2D,SAA0B,UAAY,aAQjD05I,GAAct9I,IAAOC,IAAV,wQAOJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKnC64J,GAAqBv9I,IAAOC,IAAV,gIAOlBmhE,GAAcphE,IAAOC,IAAV,mTAQJ,SAAAC,GAAK,OACVA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOoD,cAAgB4Y,EAAM8C,SAQrDu7I,GAIR,SAAC,GAAkD,IAAhD31I,EAA+C,EAA/CA,eAAgB41I,EAA+B,EAA/BA,eAAgBt6I,EAAe,EAAfA,SAC5BupG,EAAU9iF,eAAV8iF,MACAt7G,EAAS+gB,eAAT/gB,KACFwzI,EAAapyH,eACbqyH,EAAepyH,eACfirI,EAAczqI,eAEpBsP,qBAAU,WACNsiH,EAAah9H,GACb+8H,MAED,CAACC,EAAcD,IAElBriH,qBAAU,WACN,OAAO,WACHm7H,OAEL,CAACA,IAEJn7H,qBAAU,WACNk7H,EAAe/wC,KAChB,CAAC+wC,EAAgB/wC,IAEpB,IAAMixC,GAAkBvsJ,GAAQA,EAAK+f,MAAMS,OAAS,EAC9CgsI,EAA0B/1I,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,OAEpE,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,QAIZf,iBAAkB,GARtB,SAUK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAR,OACG,sBAAMxyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,sBACPmpC,OAAQ,WACRhpC,UAAW86I,EACXx6I,SAAQ,UAAKA,EAAL,cAJZ,SAMI,eAACo6I,GAAD,CACIl6I,QAAS,kBAAOs6I,GAAkB7tH,KAClCjtB,SAAU86I,EACVv9I,YAAW+C,EAHf,YAKOy6I,GACC,cAAC,GAAD,qBAEJ,cAAC,GAAD,UACI,cAAC,GAAD,CACI37I,MACI27I,EAA0B,EACpB16J,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOkB,MAE3Bwe,SAAU86I,EANd,SAQKC,EAA0B,EACrB,SADL,UAEQA,EAFR,YAGSA,EAA0B,EACpB,SACA,0B,mBClIlDp4H,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQPytE,GAAuB1tE,IAAOC,IAAV,yHAOpB+gD,GAAUhhD,IAAOC,IAAV,4KASPstC,GAAgBvtC,IAAOC,IAAV,uDAIN2+I,GAER,SAAC,GAAwB,IAAtBrZ,EAAqB,EAArBA,eACEsZ,EAAkBtlG,eADC,EAEIp2B,mBAAkC,IAAtD27H,EAFgB,sBAGiB37H,oBAAS,GAH1B,mBAGlBmwE,EAHkB,KAGHC,EAHG,KAKnBwrD,EAAsB/uJ,uBACxB,SAACqjB,GACGyrI,EAAiBzrI,GACjBkgF,GAAiB,KAErB,CAACurD,IAICrrD,EAAiBzjG,uBAAY,WAC/B6uJ,IACAtZ,MACD,CAACA,EAAgBsZ,IAEpB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAACtqH,GAAA,EAAD,CAAUF,eAAa,EAAvB,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACIvL,UAAU,EACVF,mBAAiB,EACjBC,YAAU,EACVH,cAAeq2H,UAK/B,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACItgJ,MAAM,OACNhE,OAAQ,kBAAM8qI,KACd1kI,QAAS,UACTqD,SAAS,gBAJb,sBASJ,cAAC,IAAD,CACIzF,MAAM,OACNmF,SAAU0vF,EACV74F,OAAQ,kBAAMg5F,KACdvvF,SAAS,eAJb,0B,6BCtEVqiB,GAAYvmB,IAAOC,IAAV,0EAKTq+I,GAAat+I,IAAOC,IAAV,gLACF,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAQ/C05I,GAAct9I,IAAOC,IAAV,wQAOJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKnCs6J,GAAsBh/I,IAAOC,IAAV,gIAOnBmhE,GAAcphE,IAAOC,IAAV,mTAQJ,SAAAC,GAAK,OACVA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOoD,cAAgB4Y,EAAM8C,SA4FnDi8I,GAlFV,SAAC,GAA4D,IAA1DzgG,EAAyD,EAAzDA,oBAAqB0gG,EAAoC,EAApCA,oBAAqBh7I,EAAe,EAAfA,SACtCupG,EAAU3nD,eAAV2nD,MACAt7G,EAAS4zD,eAAT5zD,KACF0sJ,EAAkBtlG,eAClB4lG,EAA4B3lG,eAC5B4lG,EAAmBtlG,eAEzBx2B,qBAAU,WACN67H,EAA0B3gG,GAC1BqgG,MAED,CAACM,IAEJ77H,qBAAU,WACN,OAAO,WACH87H,OAEL,CAACA,IAEJ97H,qBAAU,WACN47H,EAAoBzxC,KACrB,CAACyxC,EAAqBzxC,IAEzB,IAAM4xC,GAAuBltJ,GAAQA,EAAK+f,MAAMiB,QAAO,SAAAC,GAAI,OAAIA,EAAKrhB,SAAW+2C,KAAmB11C,UAAQuf,OAAS,EAEnH,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,QAJhB,SASK,SAACvyB,EAAD,OAAQwyB,EAAR,EAAQA,YAAR,OACG,sBAAMxyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,4BACPmpC,OAAQ,aACRhpC,UAAWy7I,EACXn7I,SAAQ,UAAKA,EAAL,cAJZ,SAMI,eAAC,GAAD,CACIE,QAAS,kBACJi7I,GAAuBxuH,KAE5BjtB,SAAUy7I,EACVl+I,YAAW+C,EALf,UAOKs6C,KACKA,EAAoB7rC,QAClB,cAAC,GAAD,2BAER,cAACqsI,GAAD,UACI,cAAC,GAAD,CACIh8I,MACIw7C,EAAoB7rC,OAAS,EACvB1uB,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOkB,MAE3Bwe,SAAUy7I,EANd,SAQK7gG,EAAoB7rC,OAAS,EACxB,eADL,UAEQ6rC,EAAoB7rC,OAF5B,YAGS6rC,EAAoB7rC,OAAS,EACvB,eACA,gC,SCjI3C2sI,GAAmB36I,wBAAqC,CACjE0M,YAAa,gBACbC,MAAO88F,KCREmxC,GAAsB,WAC/B,IAAMjlF,EAAU11D,qBAAW06I,IAE3B,IAAKhlF,EACD,MAAM,IAAI96D,MACN,wHAGR,OAAO86D,G,UCJEnpD,GAA0B,WAAO,IAAD,EACnC9P,EAAWO,cADwB,EAEV29I,KAAvBluI,EAFiC,EAEjCA,YAAaC,EAFoB,EAEpBA,MAErB,QAAoBvgB,IAAhBsgB,EACA,MAAM,IAAI7R,MACN,yFAIR,IAAM+R,EAAeD,GAAS88F,GAC9B,GACI78F,IAAgB68F,MAChB,UAACC,GAAgBh9F,UAAjB,aAAC,EAA8BK,SAASH,IAExC,MAAM,IAAI/R,MAAJ,qBACY+R,EADZ,gFAC+FF,EAD/F,cAKV,OAAOrhB,uBACH,SAAuByK,GACnBA,EAAOkX,OAASJ,EAChBlQ,EAASuQ,aAAkB,GAAD,OAAIP,EAAJ,WAA0B5W,MAGxD,CAAC4G,KCVIm5H,GAAwB,WACjC,IAAMn5H,EAAWO,cACXkQ,EAAcnQ,cACd69I,ECpBuB,WAC7B,IAAM1vJ,EAAOC,eACb,OAAOC,uBACH,SAACgiB,GAAD,OACIliB,EAAKG,KAAK,qBAAsB+hB,KACpC,CAACliB,IDeewL,GAEpB,OAAOtL,uBACH,SAACgiB,GAGG,OAFA3Q,EEL4D,CACpErG,KAAM,qBFMSwkJ,EAAYxtI,GACdsZ,MAAK,SAAAn5B,GAEF,OADAkP,EEDd,CACFrG,KAAM,qBACNkE,OFD6C/M,IACtBA,KAEVq5B,OAAM,SAAC5rB,GACJyB,EEE0C,CAC1DrG,KAAM,qBACN4F,QFJ6ChB,EAAMgB,WAC9B,OAALhB,QAAK,IAALA,OAAA,EAAAA,EAAOgB,WAAYiS,MACnBf,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUyQ,EAAa0tI,KAYnBC,GAAe,WACxB,IAAMp+I,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EEmBkD,CACtDrG,KAAM,gBFnBH,CAACqG,KAaKq+I,GAAyB,WAClC,IAAMr+I,EAAW8P,KACjB,OAAOnhB,uBACH,SAACqjB,GACGhS,EEV6B,SACrCgS,GADqC,MAEoB,CACzDrY,KAAM,sBACNqY,OFMiBssI,CAA0BtsI,MAEvC,CAAChS,KAeIu+I,GAAsB,WAC/B,IAAMv+I,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EE9CgE,CACpErG,KAAM,uBF8CH,CAACqG,KAWKw+I,GAAgB,WACzB,IAAMx+I,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EEhCoD,CACxDrG,KAAM,iBFgCH,CAACqG,KG9GKk6G,GAAgB,WAAmB,IAAD,MACZgkC,KAAvBluI,EADmC,EACnCA,YAAaC,EADsB,EACtBA,MACfkjB,EAAWlb,aAAY,SAAAxX,GAAK,OAAIA,KAEtC,QAAoB/Q,IAAhBsgB,EACA,MAAM,IAAI7R,MACN,yFAIR,IAAMi1B,EAAmC,UAOrCD,EAASnjB,UAP4B,iBAOrC,EAAuBk9F,cAPc,aAOrC,EAAgCj9F,GAASE,MAC7C,IAAKijB,EACD,MAAM,IAAIj1B,MAAJ,4BACmB6R,EADnB,gCAKV,OAAOojB,G,UCpBLqrH,GAAkB9/I,IAAOC,IAAV,sEAKf4iD,GAAc7iD,IAAO0nB,KAAV,4BAEXo7B,GAAc9iD,IAAO0nB,KAAV,4BAEXq4H,GAAmB//I,IAAOC,IAAV,iGAMhBstF,GAA+BvtF,IAAOC,IAAV,uJAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmE,qBAG9CmlG,GAAwBxtF,IAAOC,IAAV,yGAId,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGnC67J,GAAYhgJ,IAAOC,IAAV,+WACF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAC3B,SAAA8a,GAAK,OAAIA,EAAM0D,SAAN,uBAML,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAKpBq8I,GAMR,SAAC,GAAmE,IAAjEznH,EAAgE,EAAhEA,MAAO0nH,EAAyD,EAAzDA,cAAeC,EAA0C,EAA1CA,mBAAoBC,EAAsB,EAAtBA,eACxCj8F,EAAYn0D,uBACd,SAACq0D,GACG,QAAS67F,KAAmB77F,GAAS67F,EAAcxuI,SAAS2yC,KAEhE,CAAC67F,IAGC57F,EAAqBt0D,uBACvB,SAACyL,GACG,QACMykJ,KACAzkJ,GACFykJ,EAAcxuI,UAAUqE,OAAOta,MAGvC,CAACykJ,IAGC37F,EAAgB,SAAC9oD,GACfA,GAAU2kJ,GACVA,EAAehgG,aAA0B8/F,EAAezkJ,KAIhE,IAAK+8B,GAAUA,GAA0B,IAAjBA,EAAM7lB,OAAe,OAAO,KAEpD,IAAM0tI,EAAe7nH,EAAMrlB,QACvB,SAAA6yC,GAAI,OAAIA,EAAKkwF,WAAclwF,EAAKvmD,IAAMygJ,EAAcj/I,KAAI,SAAAxB,GAAE,OAAIgT,KAAKqX,IAAIrqB,MAAKiS,SAASs0C,EAAKvmD,OAGxF6gJ,EAAkB9nH,EAAMrlB,QAC1B,SAAA6yC,GAAI,OAAKA,EAAKkwF,WAAalwF,EAAKvmD,KAAOygJ,EAAcj/I,KAAI,SAAAxB,GAAE,OAAIgT,KAAKqX,IAAIrqB,MAAKiS,SAASs0C,EAAKvmD,OAGzF8gJ,EAAwBJ,EAAqBE,EAAaltI,QAAO,SAAA6yC,GAAI,OAAKA,EAAKkwF,aAAamK,EAElG,OACI,eAACP,GAAD,WACKO,EAAa1tI,OAAS,GACnB,eAACkwC,GAAD,WACKs9F,GACGE,EACKltI,QAAO,SAAA6yC,GAAI,OAAIA,EAAKkwF,aACpBj1I,KAAI,SAAA+kD,GAAI,OACL,eAAC+5F,GAAD,CAEI5+I,YAAU,wBAFd,UAII,cAAC,KAAD,CACIsC,MAAM,+BACNmpC,OAAO,gBAFX,SAII,cAAC2gD,GAAD,CAA8BpsF,YAAU,mBAAxC,SACI,cAACqsF,GAAD,UACI,cAAC3F,GAAA,EAAD,CAAMrpF,QAAQ,qBAI1B,cAACwhJ,GAAD,CACIp8I,UAAQ,EACRzC,YAAU,mBAFd,SAIK6kD,EAAKvyD,SAjBLuyD,EAAKvmD,OAqBzB8gJ,EAAsBt/I,KAAI,SAAA+kD,GACvB,OACI,eAAC+5F,GAAD,CAEI5+I,YAAU,sBAFd,UAII,cAAC2iB,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU6B,EAAKvmD,KACf6kD,EAAmB0B,EAAKvmD,IAE5BmL,QAAS05C,EAAmB0B,EAAKvmD,IACjCqmB,aAAc,kBAAMy+B,EAAcyB,EAAKvmD,KACvCyE,SAAS,uBAEb,cAAC87I,GAAD,CACI57I,QAAS,kBAAMmgD,EAAcyB,EAAKvmD,KAClC0B,YAAU,kBAFd,SAIK6kD,EAAKvyD,SAjBLuyD,EAAKvmD,OAsBrB4gJ,EAAa1tI,OAAS6lB,EAAM7lB,QAAU,cAAC,KAAD,CAAclU,MAAM,WAGnE,cAACqkD,GAAD,UACKw9F,EAAgBr/I,KAAI,SAAA+kD,GACjB,OACI,eAAC+5F,GAAD,CAEI5+I,YAAU,sBAFd,UAII,cAAC2iB,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU6B,EAAKvmD,KACf6kD,EAAmB0B,EAAKvmD,IAE5BmL,QAAS05C,EAAmB0B,EAAKvmD,IACjCqmB,aAAc,kBAAMy+B,EAAcyB,EAAKvmD,KACvCyE,SAAS,uBAEb,cAAC87I,GAAD,CACI57I,QAAS,kBAAMmgD,EAAcyB,EAAKvmD,KAClC0B,YAAU,kBAFd,SAIK6kD,EAAKvyD,SAjBLuyD,EAAKvmD,a,mBC7JhCslD,GAAoB/kD,IAAOC,IAAV,kLASjB8mB,GAA2B/mB,IAAOC,IAAV,kIAOxBG,GAAcJ,IAAOC,IAAV,6GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInC+hC,GAAezmB,IAAOC,IAAV,wPACC,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cA6B1B87J,GA1BkD,SAAC,GAG3D,IAFHz8I,EAEE,EAFFA,QACAq/B,EACE,EADFA,QAEA,OAAIr/B,EAEI,cAAC,GAAD,UACI,cAAC,KAAD,MAMR,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAa5C,YAAU,oCAAvB,SACKiiC,EAAU,cAAC+hB,GAAA,EAAD,IAAe,cAACj+B,GAAA,EAAD,MAE9B,cAACT,GAAD,CAActlB,YAAU,qCAAxB,SACKiiC,EAAU,eAAiB,yB,UC3B1Cq9G,GAAoBzgJ,IAAOC,IAAV,uIAQjBygJ,GAAkB1gJ,IAAOC,IAAV,oHAOfonB,GAAgBrnB,IAAOC,IAAV,wMAUbqnB,GAAmBtnB,IAAOC,IAAV,+HAOhBsnB,GAAgBvnB,IAAOC,IAAV,2LAWbwnB,GAAcznB,IAAO0nB,KAAV,+OASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,mHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,0EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,GAAkB9nB,IAAO0nB,KAAV,+CACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCsjC,GAAc/nB,IAAOgoB,EAAV,4GAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInC6iC,GAAgBjoB,IAAOC,IAAV,wDAIbunB,GAA4BxnB,IAAOC,IAAV,wDAKzB0gJ,GAAwC,SAAC,GAexC,IAAD,EAdFnoH,EAcE,EAdFA,MACA5kB,EAaE,EAbFA,aACAhQ,EAYE,EAZFA,SACAG,EAWE,EAXFA,QACAqkB,EAUE,EAVFA,OACAC,EASE,EATFA,gBACAC,EAQE,EARFA,cACAC,EAOE,EAPFA,YACAG,EAME,EANFA,cACAC,EAKE,EALFA,aACAC,EAIE,EAJFA,kBACAC,EAGE,EAHFA,WACAs3H,EAEE,EAFFA,mBAEE,IADFr3H,gBACE,SACIE,EAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCyiC,EAAeh6B,uBAAY,WACd,OAAfq4B,QAAe,IAAfA,SACD,CAACA,IAvBF,EAyBwDlF,mBAExD,IA3BA,mBAyBKmG,EAzBL,KAyB4BC,EAzB5B,OA6BkCpG,wBAA6BpyB,GA7B/D,mBA6BK8B,EA7BL,KA6BiBs2B,EA7BjB,OA+ByBhG,oBAAkB,GAApCy9H,EA/BP,oBAgCIC,EAAW,OAAGroH,QAAH,IAAGA,OAAH,EAAGA,EAAOtmB,MAAMqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK8iI,aAC7ChsE,IAAkB22E,EAElBC,EAAiB7iI,mBAAQ,WAC3B,IAAI/e,GAAc,OAALs5B,QAAK,IAALA,OAAA,EAAAA,EAAOtmB,QAAS,GAS7B,GARMrf,IACFqM,EAASA,EAAOiU,QACZ,SAAAC,GAAI,OAG4C,IAF5CA,EAAK3f,KACA6S,cACAkR,QAAQ3kB,EAAWyT,mBAGhCpH,EAAOyT,OAAS,EAAG,CAEnB,IAAMiX,GADN1qB,EAAS6hJ,iBAAO7hJ,GAAQ,SAAAi9C,GAAC,aAAIA,EAAE+5F,UAAY,GAAd,UAAmB/5F,EAAE1oD,YAArB,aAAmB,EAAQ6S,kBACxBrF,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAEjD8pB,EACI3V,EAAaT,QAAO,SAAAC,GAAI,OACpBwW,EAAiBlY,SAASe,KAAKqX,IAAI1W,QAI/C,OAAOlU,IACR,QAACs5B,QAAD,IAACA,OAAD,EAACA,EAAOtmB,MAAOrf,EAAY+gB,IAExBmW,EAAgB9L,mBAClB,wBACIrK,EAAajB,UAAb,OAAwB6lB,QAAxB,IAAwBA,GAAxB,UAAwBA,EAAOtmB,aAA/B,aAAwB,EAAcS,WACZ,KAAnB,OAAL6lB,QAAK,IAALA,OAAA,EAAAA,EAAOtmB,MAAMS,SAAgBu3D,KACnC,CAACt2D,EAAajB,OAAd,OAAsB6lB,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAOtmB,MAAMS,OAAQu3D,IAKzCvkB,EAAmB31D,uBAAY,WAC7B+5B,GAAiBzB,GACjBA,IACAs4H,GAAe,IACRr4H,IACPq4H,GAAe,GACfr4H,EAAYu4H,EAAe7/I,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,UAEjD,CAAC6oB,EAAeC,EAAawB,EAAe+2H,IAE/Cx9H,qBAAU,WAEAzwB,IACFy2B,EAAsB3W,OAAWiB,EAAajB,UAInD,CAAC9f,EAAYy2B,EAAuB1V,EAAcktI,IAErD,IAAM32H,IAAc,OAACqO,QAAD,IAACA,OAAD,EAACA,EAAOrmB,YACtBkY,GAAkBy2H,EAAenuI,QAAU5O,EAC3Ci9I,EAAmB,OAAGptI,QAAH,IAAGA,GAAH,UAAGA,EAAcT,QACtC,SAAA1T,GAAE,OAAIA,EAAK,GAAKA,KAAE,OAAKohJ,QAAL,IAAKA,OAAL,EAAKA,EAAaphJ,cADf,aAAG,EACiBkT,OAE7C,OACI,cAAC8tI,GAAD,UACI,eAACC,GAAD,WACK/3H,GACG,cAAC,GAAD,UACI,cAAC,GAAD,UAAcA,MAGrBE,GACG,cAACZ,GAAD,CAAe9mB,YAAU,0BAAzB,SACI,cAAC,KAAD,CACIopB,SAxEF,SAAC1kB,GAAD,OAAmBsjB,EAActjB,IAyE/BjC,SAAUumB,EACVjmB,SAAS,4BAIpB0kB,IAAsBuB,GACnB,eAAC5C,GAAD,WACI,8BACI,cAACO,GAAD,CAAiB3mB,YAAU,yBAA3B,SACK6/I,EAAsB,EAAtB,UACQA,EADR,YAESA,EAAsB,EAChB,kBACA,kBAEV,wBAGd,cAACx5H,GAAD,UACKuC,EACG,cAACtC,GAAD,CACI7jB,SAC4B,IAAxBgQ,EAAajB,QACb0X,GACCy2H,EAAenuI,OAAS,GACrBu3D,EAERlnE,MAAOgmB,EAAaC,MAAMjmB,MAC1B6kB,YAAamB,EAAaC,MAAMpB,YAChCD,WAAYoB,EAAaC,MAAMrB,WAC/BxjB,QAAS4lB,EACT7oB,YAAU,4BAXd,0BAgBA,cAACsmB,GAAD,CACI7jB,SACIymB,GAC2B,IAA1By2H,EAAenuI,QACZu3D,IACCr3E,EAETmQ,MAAOgmB,EAAaE,OAAOlmB,MAC3B6kB,YACImB,EAAaE,OAAOrB,YAExBD,WAAYoB,EAAaE,OAAOtB,WAChCxjB,QAASuhD,EACTxkD,YAAU,0BAbd,6BAqBfkpB,EACG,cAAC,GAAD,CACItmB,QAASA,EACTq/B,UAAS,OAAC5K,QAAD,IAACA,OAAD,EAACA,EAAOrmB,cAGrB,qCACI,cAAC,GAAD,CACIguI,mBAAoBA,EACpB3nH,MAAOsoH,EACPZ,cAAetsI,EACfhQ,SAAUA,EACVw8I,eAAgB13H,IAEnBN,GAAUU,GACP,cAACxB,GAAD,UACI,cAAC,IAAD,CACItsB,KAAM,SACNyI,MAAO,OACPhJ,OAAQ,kBAAM2tB,KACd1pB,OAAQ,OACRD,MAAO,qBCvT9B+I,GAAe,CACxBrV,KAAM,CACF+f,MAAO,GACPxf,MAAO,EACPC,OAAQ,EACRigB,cAAe,EACfT,WAAY,EACZyc,iBAAa79B,GAEjBgT,SAAS,GAGAk9I,GAAwB,WAEjC,OADiB3nI,aAAY,SAAAxX,GAAK,OAAIA,KACtBo/I,eCIPC,GAAoC,SAAC,GAO3C,IANHz4H,EAME,EANFA,cACAw3H,EAKE,EALFA,cAKE,IAJFkB,oBAIE,aAHF32H,8BAGE,SAFF01H,EAEE,EAFFA,mBACGz1H,EACD,+GACI51B,EAAS0lI,KACPnmH,EAAaknG,KAAblnG,SAFN,EAGwB4sI,KAAlB9uJ,EAHN,EAGMA,KAAM4R,EAHZ,EAGYA,QACRimB,ERQmB,WACzB,IAAM3oB,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EEuBoD,CACxDrG,KAAM,iBFvBH,CAACqG,IQbiBggJ,GACfr2H,EAAcy0H,KACdv2H,EAASw2H,KACT7qJ,ERyCuB,WAC7B,IAAMwM,EAAW8P,KAEjB,OAAOnhB,uBACH,SAAC8wJ,GACGz/I,EEzCiD,CACzDrG,KAAM,iBACN0zG,SFuCiCoyC,MAE7B,CAACz/I,IQhDaigJ,GACZr2H,EAAc20H,KACd10H,ER0D2B,WACjC,IAAM7pB,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EElDoE,CACxErG,KAAM,yBFkDH,CAACqG,IQ/DkBkgJ,GAsBtB,OApBAj+H,qBAAU,WAKN,OAJI89H,GACAtsJ,IAGG,WACC21B,GACAS,OAIT,IAEH5H,qBAAU,WACF48H,GACArrJ,EAAUqrJ,KAGf,IAGC,cAAC,GAAD,cACI1nH,MAAOrmC,EACPyhB,aAAcS,EACdtQ,QAASA,EACTskB,gBAAiB,WACbK,GAAiBA,EAAc,IAC/BsB,KAEJ5B,OAAQ4C,EACRtC,cAAe,SAACs9B,GACZt9B,GAAiBA,EAAcs9B,GAC/B98B,EAAO88B,IAEXm6F,mBAAoBA,EACpB53H,YAAa,SAACiQ,GACV9P,GAAiBA,EAAc8P,GAC/B3jC,EAAU2jC,IAEdlQ,cAAe2C,GACXP,KC7EH82H,GAAqC,SAAAthJ,GAAU,IAChDggJ,EAA6DhgJ,EAA7DggJ,cAAeC,EAA8CjgJ,EAA9CigJ,mBAAoBsB,EAA0BvhJ,EAA1BuhJ,sBADY,EAE7BR,KAAlB9uJ,EAF+C,EAE/CA,KAAM4R,EAFyC,EAEzCA,QAER29I,EAAkB1xJ,uBACpB,kBAAMyxJ,EAAqB,OAACtvJ,QAAD,IAACA,OAAD,EAACA,EAAM+f,MAAMjR,KAAI,SAAAk7C,GAAC,OAAIA,EAAE18C,SACnD,QAACtN,QAAD,IAACA,OAAD,EAACA,EAAM+f,MAAOuvI,IAGZE,EAAoB3xJ,uBACtB,kBAAMyxJ,EAAsB,MAC5B,CAACA,IAGL,OACI,cAAC,GAAD,CACItB,mBAAoBA,EACpB3nH,MAAOrmC,EACPyhB,aAAcssI,EACdn8I,QAASA,EACT+kB,UAAU,EACVF,mBAAmB,EACnBC,YAAY,EACZH,cAAe+4H,EACfl5H,YAAam5H,EACbr5H,gBAAiBs5H,KCrBvBp7H,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2hJ,GAAiB5hJ,IAAOC,IAAV,yHAOd+gD,GAAUhhD,IAAOC,IAAV,0KASA4hJ,GAIR,SAAC,GAAiD,IAA/Ctc,EAA8C,EAA9CA,eAAgBz3F,EAA8B,EAA9BA,SAAUoyG,EAAoB,EAApBA,cACxB3wJ,EAAc00I,cAEdzrG,EAAQ+iF,KACRumC,EAAYrC,KACZsC,EAAsBrC,KACdsC,EAAiBf,KAAvB9uJ,KAN0C,EAO3BgxB,mBAAmBqV,EAAMnkB,UAAvC4tI,EAPyC,sBAQR9+H,oBAAS,GARD,mBAQ3CmwE,EAR2C,KAQ5BC,EAR4B,KAU5CrpB,EAAgB83E,EAAa9vI,MAAM2C,MAAK,SAAAzB,GAAI,OAAIA,EAAK8iI,aAErDziD,EAAiBzjG,uBAAY,WAC/B+xJ,EAAoBvpH,EAAMnkB,UACtB9kB,EAAO6I,SACP0pJ,IAEJvc,EAAe/sG,EAAMnkB,YACtB,CACCkxH,EACAh2I,EAAO6I,QACP0pJ,EACAC,EACAvpH,EAAMnkB,WAGJ6tI,EAAsBlyJ,uBACxB,SAACqjB,GACM2uI,EAAa7vI,WAAa,GAAK+3D,IAClC+3E,EAAW5uI,GACXkgF,GAAiB,MAGrB,CAACrpB,EAAe83E,EAAa7vI,aAKjC,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAACoiB,GAAA,EAAD,CAAUF,eAAa,EAAvB,SACI,cAACutH,GAAD,UACI,cAAC,GAAD,CACI94H,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,EACVq3H,cAAeA,EACfx3H,cAAew5H,EACf/B,oBAAoB,UAKpC,eAAC,GAAD,WACI,cAAC,IAAD,CACI1hJ,MAAO,OACPhE,OAAQ,kBAAMqzC,KACdjtC,QAAS,UACTqD,SAAS,gBAJb,oBAQA,cAAC,IAAD,CACIN,SAAU0vF,EACV3vF,MAAO,CAAEiwB,WAAY,IACrBn1B,MAAO,OACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,eALb,0BCjGVqiB,GAAYvmB,IAAOC,IAAV,0EAKTq+I,GAAat+I,IAAOC,IAAV,gLACF,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAQ/C05I,GAAct9I,IAAOC,IAAV,wQAOJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKnCs6J,GAAsBh/I,IAAOC,IAAV,gIAOnBmhE,GAAcphE,IAAOC,IAAV,mTAQJ,SAAAC,GAAK,OACVA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOoD,cAAgB4Y,EAAM8C,SA6FnDm/I,GAlFV,SAAC,GAAgD,IAA9CjC,EAA6C,EAA7CA,cAAekC,EAA8B,EAA9BA,cAAel+I,EAAe,EAAfA,SAC1BupG,EAAU8N,KAAV9N,MACAt7G,EAAS8uJ,KAAT9uJ,KACF2vJ,EAAYrC,KACZsC,EAAsBrC,KACtB2C,EAAaxC,KAEnBv8H,qBAAU,WACNy+H,EAAoB7B,GACpB4B,MAED,CAACA,EAAWC,IAEfz+H,qBAAU,WACN,OAAO,WACH++H,OAEL,CAACA,IAEJ/+H,qBAAU,WACN8+H,EAAc30C,KACf,CAAC20C,EAAe30C,IAEnB,IAAM60C,GAAiBnwJ,GAAQA,EAAK+f,MAAMS,OAAS,EAEnD,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,KAEJkd,SAAU,WACNld,KAEJsvH,cAAeA,KAT3B,SAaK,SAAC7hJ,EAAD,OAAQwyB,EAAR,EAAQA,YAAR,EAAqBL,MAArB,OACG,sBAAMnyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,qBACPmpC,OAAQ,aACRhpC,UAAW0+I,EAHf,SAKI,eAAC,GAAD,CACIl+I,QAAS,kBAAOk+I,GAAiBzxH,KACjCjtB,SAAU0+I,EACVnhJ,YAAW+C,EAHf,UAKKg8I,KAAmBA,EAAcvtI,QAC9B,cAAC,GAAD,oBAEJ,cAAC,GAAD,UACI,cAAC,GAAD,CACI3P,MACIk9I,EAAcvtI,OAAS,EACjB1uB,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOkB,MAE3Bwe,SAAU0+I,EANd,SAQKpC,EAAcvtI,OAAS,EAClB,QADL,UAEQutI,EAAcvtI,OAFtB,YAGSutI,EAAcvtI,OAAS,EACjB,QACA,yBCnHlD4vI,GAAqBviJ,IAAOC,IAAV,iGACN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxCq+J,GAAYxiJ,IAAOC,IAAV,uRAWS,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAC9C,SAAAsb,GAAK,OACHA,EAAMuiJ,eAAN,4BACqBviJ,EAAMI,MAAMpc,OAAOI,YADxC,QAEF,SAAA4b,GAAK,OACHA,EAAMwiJ,iBAAN,wBACiBxiJ,EAAMI,MAAMpc,OAAOU,SADpC,QAEF,SAAAsb,GAAK,OACHA,EAAMyiJ,eAAN,wBACiBziJ,EAAMI,MAAMpc,OAAOyD,aADpC,QAEF,SAAAuY,GAAK,OAAIA,EAAM0iJ,UAAN,wBAAmC1iJ,EAAMI,MAAMpc,OAAOW,OAAtD,QAES,SAAAqb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAG9Cg6G,GAAcn+F,IAAOC,IAAV,uEACL,SAAAC,GAAK,OAAIA,EAAMkmE,QAIrBy8E,GAAc7iJ,IAAOC,IAAV,gGAMX6iJ,GAA6B9iJ,IAAOoD,OAAV,4TASR,SAAAlD,GAAK,OACnBA,EAAM0D,SACF1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOI,eAC3B,SAAA4b,GAAK,QAAMA,EAAM0D,UAAY,2BAM7Bm/I,GAA0B/iJ,IAAOC,IAAV,wJAIhB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMnC6+J,GAAkBhjJ,IAAOC,IAAV,iJAKQ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAGnDq+J,GAA0BjjJ,IAAOC,IAAV,mHAOvBijJ,GAAiBljJ,IAAOC,IAAV,iEAEP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCy+J,GAAanjJ,IAAOC,IAAV,kTACG,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UA+B5Bu+J,GAAkC,SAAC,GAmBzC,IAlBHC,EAkBE,EAlBFA,kBACAvF,EAiBE,EAjBFA,aACAwF,EAgBE,EAhBFA,kBACAV,EAeE,EAfFA,SACAW,EAcE,EAdFA,sBACAC,EAaE,EAbFA,mBACAC,EAYE,EAZFA,2BACAC,EAWE,EAXFA,wBACAC,EAUE,EAVFA,kBACAC,EASE,EATFA,qBACA1rJ,EAQE,EARFA,MACA2rJ,EAOE,EAPFA,iBACAC,EAME,EANFA,cACAC,EAKE,EALFA,yBACAC,EAIE,EAJFA,wBACAC,EAGE,EAHFA,aACAC,EAEE,EAFFA,eACAhgJ,EACE,EADFA,SAEMi5G,EAAcnpG,eACdmwI,EAAmBrqG,eACnBsqG,EAAavE,KAenB,OAbAv8H,qBAAU,WAMN,OALI2gI,IACA9mC,IACAgnC,IACAC,KAEG,WACHjnC,IACAgnC,IACAC,OAEL,CAACjnC,EAAagnC,EAAkBC,EAAYH,IAG3C,eAAC1B,GAAD,WACI,eAACC,GAAD,CACIC,eAAgBuB,EAChBtB,kBAAmBxqJ,EAAMya,SAAWoxI,EACpCpB,gBAAiBoB,EACjBnB,WAAYA,EACZzhJ,YAAA,UAAc+C,EAAd,QALJ,UAOI,cAAC++I,GAAD,UACI,cAACC,GAAD,UACI,cAAC,GAAD,QAGR,cAAC/kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,IAAD,CACI1gD,UAAW,IACXqmC,WAAYg4F,EACZ/oJ,KAAK,OACLu0F,UAAWpkC,IACX13D,KAAK,YACLgQ,MAAM,cACNgiB,WAAW,WACX/mB,OAAO,OACPgoF,cAAc,OACdZ,uBAAuB,EACvBr6B,aAAa,sBACb4N,gBAAiB,IACjB7N,kBAAmB,OACnBM,WAAS,EACThmC,aAAc,SAACT,GAAD,OACVg+H,EAAkBh+H,EAAG,cAEzBnhB,SAAQ,UAAKA,EAAL,mBAGhB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,IAAD,CACI1gD,UAAW,IACX1qB,KAAK,OACLu0F,UAAWpkC,IACX13D,KAAK,WACLgQ,MAAM,aACNgiB,WAAW,WACX/mB,OAAO,OACPgoF,cAAc,OACdZ,uBAAuB,EACvBr6B,aAAa,sBACb4N,gBAAiB,IACjB7N,kBAAmB,OACnBM,WAAW,EACXhmC,aAAc,SAACT,GAAD,OACVg+H,EAAkBh+H,EAAG,aAEzBnhB,SAAQ,UAAKA,EAAL,kBAGhB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,IAAD,CACIprE,KAAK,OACLu0F,UAAWpkC,IACX13D,KAAK,QACLgQ,MAAM,SACNgiB,WAAW,WACXihE,cAAc,OACdZ,uBAAuB,EACvBpnF,OAAO,OACP+sD,aAAa,sBACb4N,gBAAiB,IACjB7N,kBAAmB,OACnBM,WAAW,EACXhmC,aAAc,SAACT,GAAD,OAAYg+H,EAAkBh+H,EAAG,UAC/CnhB,SAAQ,UAAKA,EAAL,cAGhB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,KAAD,CACIjtD,YAAa,CAAC1U,KAAgB4/I,wBADlC,SAGI,cAAC,GAAD,CACIzgJ,SAAUsgJ,EACVpG,aAAcA,EACdC,gBAAiB,SAAC/pJ,GAAD,OACbsvJ,EAAkBtvJ,IAEtBkQ,SAAQ,UAAKA,EAAL,eAIpB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,KAAD,CACIjtD,YAAa,CACT1U,KAAgB6/I,+BAFxB,SAKI,cAACC,GAAD,CACIrE,cAAeyD,EACfvB,cAAewB,EACf1/I,SAAQ,UAAKA,EAAL,gBAIpB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,KAAD,CACIjtD,YAAa,CACT1U,KAAgB6/I,+BAFxB,SAKI,cAACE,GAAD,CACIhmG,oBAAqBklG,EACrBxE,oBAAqBuE,EACrBv/I,SAAQ,UAAKA,EAAL,uBAIpB,cAAC8+I,GAAD,IACA,cAAC7kD,GAAD,CAAa/3B,KAAM,GAAnB,SACI,cAAC,KAAD,CACIjtD,YAAa,CAAC1U,KAAgBwa,yBADlC,SAGI,cAAC,GAAD,CACIrW,eAAgB46I,EAChBhF,eAAgB+E,EAChBr/I,SAAQ,UAAKA,EAAL,iBAIpB,cAAC2+I,GAAD,UACI,cAACC,GAAD,CACIl/I,SACIqgJ,IAAiBnG,GAAgB+F,EAErC1iJ,YAAA,UAAc+C,EAAd,QAJJ,SAMI,cAAC6+I,GAAD,UACI,cAAC,GAAD,eAKbH,MACIkB,EAAcvzJ,SACXuzJ,EAAcnlH,aACdmlH,EAAcjlH,WAChB,cAACskH,GAAD,CAAYhiJ,YAAA,UAAc+C,EAAd,UAAZ,SACK4/I,EAAcvzJ,OACXuzJ,EAAcnlH,WACdmlH,EAAcjlH,eAO7B4lH,GAA2C,SAAAvkJ,GACpD,OACI,cAAC,KAAkB+tE,SAAnB,CACIpoE,MAAO,CAAEwL,YAAa,YAAaC,MAAO,cAD9C,SAGI,cAAC,KAAuB28D,SAAxB,CACIpoE,MAAO,CAAEwL,YAAa,YAAaC,MAAO,cAD9C,SAGI,cAACguI,GAAiBrxE,SAAlB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,cAHf,SAMI,cAAC,GAAD,gBAAgBpR,W,qBCpWvBwkJ,GAAmC,WAC5C,OAAO10J,uBAAY,SAACklB,EAAyBC,GACzC,IADyD,EACrDogD,EAAwB,GACtBC,EAAmBrgD,EAAOhC,QAAO,SAAAylC,GACnC,OAAO1jC,EAAcxD,SAASknC,EAAWn5C,OAHY,eAKtC+1D,GALsC,IAKzD,2BAAqC,CAAC,IAA7BrgD,EAA4B,QAC5BogD,EAAY7jD,SAASyD,EAAO2kB,SAC7By7B,EAAY99C,KAAKtC,EAAO2kB,SAPyB,8BAWzD,OAAOy7B,IACR,KCVDhvC,GAAYvmB,IAAOC,IAAV,gDAiDA0kJ,GAxCV,SAAC,GAA+D,IAA7DzsJ,EAA4D,EAA5DA,MAAO22G,EAAqD,EAArDA,cAAe+1C,EAAsC,EAAtCA,cAAeC,EAAuB,EAAvBA,iBACnC1rI,EAAck5B,eACd4vE,EAAYpB,KACZxoF,EAAQwnB,aACVoiE,EAAUjkE,KACV7kC,GAEE2rI,EAAgCJ,KActC,OAZAphI,qBAAU,WACN,GAAIprB,GAASA,EAAMga,OAAS28F,EAAe,CACvC,IAAMk2C,EAAuBD,EACzBj2C,EACA32G,EAAMga,OAGV2yI,EAAiBE,MAGtB,CAACD,EAA+Bj2C,EAAe32G,IAG9C,cAAC,GAAD,UACKmgC,EAAMp3B,KAAI,SAAAmS,GACP,OACI,cAAC,GAAD,CAEI0S,aAAc,kBAAM++H,EAAiB,CAACzxI,EAAKvN,SAC3C8E,QAASi6I,EAAclzI,SAAS0B,EAAKvN,OACrC+E,QAASg6I,EAAcjyI,OAAS,EAChCtO,KAAM,GACNZ,MAAO2P,EAAK3f,KACZyQ,SAAQ,UAAK2oE,oBAAUz5D,EAAK3f,KAAK6S,eAAzB,gBANH8M,EAAKvN,aC/BrBm/I,GAGR,SAAC,GAA8B,IAA5B9sJ,EAA2B,EAA3BA,MAAO22G,EAAoB,EAApBA,cACLp6E,EAAc9J,eACds6H,EAA6BhwI,eAC7BwlB,EAAUnhB,YAAYkhB,MACtBtR,EAAS1V,eACT0X,EAAgBnX,eAChB63H,EAAmBzwB,GAAa1gF,GAEhCyqH,EAAuBl1J,uBAAY,WACrC,OAAS,OAALkI,QAAK,IAALA,OAAA,EAAAA,EAAOga,QAAS28F,EACco2C,EAC1Bp2C,EACA32G,GAFIqd,kBAOL,OACR,CAACs5F,EAAe32G,EAAO+sJ,IAEpBE,EAAkBn1J,uBAAY,WAChC,IAAMo1J,EAAoBF,IAEA,OAAtBE,GACAl8H,EAAOk8H,KAEZ,CAACl8H,EAAQg8H,IA8BZ,OA5BA5hI,qBAAU,WACN6hI,MACD,CAACjtJ,EAAO22G,EAAes2C,IAE1B7hI,qBAAU,WACN6hI,MACD,CAACA,IAEJ7hI,qBAAU,WACN,GAAIsoH,EAAkB,CAClB1gH,IACAi6H,IAEA,IAAMC,EAAoBF,IAEA,OAAtBE,GACAl8H,EAAOk8H,MAGhB,CACCF,EACAtZ,EACAn3G,EAAYpgB,SACZ6U,EACAgC,EACAi6H,IAIA,cAAC,KAAD,CACIv8H,mBAAiB,EACjBE,UAAU,EACVD,YAAU,K,UC7BPw8H,GAtCV,SAAC,GAAqD,IAAnDntJ,EAAkD,EAAlDA,MAAO22G,EAA2C,EAA3CA,cAAer9B,EAA4B,EAA5BA,sBACpBF,EAAiB93B,eACjB8rG,EAAkCjwF,eAClCkwF,EAAwB9vF,eAyB9B,OAvBAnyC,qBAAU,WACN,GAAIprB,GAASA,EAAMga,OAAS28F,GAAiBr9B,EAAuB,CAChE,IAAMg0E,EAAyBF,EAC3Bz2C,EACA32G,EAAMga,OAEVs/D,EAAsBg0E,GAGtBl0E,EACIk0E,EAAuBvkJ,KAAI,SAAAxB,GAAE,MAAK,CAC9BnK,aAAcmK,EACd6jC,QAASiiH,EACL12C,EACA32G,EAAMga,MACNzS,WAMjB,CAACvH,EAAO22G,EAAey2C,IAGtB,cAAC,KAAD,CACIx8H,UAAU,EACVF,mBAAmB,EACnBC,YAAY,EACZ4B,wBAAwB,KCTvBg7H,GAA2B,WACpC,OAAOz1J,uBAAY,SAAC01J,EAAe1D,GAC/B,IADgD,EAC1C2D,EAAyB,GADiB,eAG/B3D,GAH+B,IAGhD,2BAA+B,CAAC,IAAvBh8F,EAAsB,QAEtB0/F,EAAch0I,SAASs0C,IACvB0/F,EAAch0I,UAAUs0C,IAEzB2/F,EAAaluI,KAAKuuC,EAAO,GAAKA,EAAOA,IARG,8BAYhD,OAAO2/F,IACR,KCVQC,GA3BV,SAAC,GAAmE,IAAjE1tJ,EAAgE,EAAhEA,MAAO22G,EAAyD,EAAzDA,cAAesxC,EAA0C,EAA1CA,mBAAoB0F,EAAsB,EAAtBA,gBACxCC,EAAWpG,KACXqG,EDLC/1J,uBAAY,SAACklB,EAAyBC,GACzC,IADyD,EACrDmgD,EAA6C,GAC7CC,EAAwB,GAEtBC,EAAmBrgD,EAAOhC,QAAO,SAAAylC,GACnC,OAAO1jC,EAAcxD,SAASknC,EAAWn5C,OALY,eAOtC+1D,GAPsC,IAOzD,2BAAqC,CAAC,IAAD,EAA5BrgD,EAA4B,uBACdA,EAAO6wI,SADO,IACjC,2BAAmC,CAAC,IAA3BvqJ,EAA0B,QAC/B65D,EAAmB75D,GACf65D,EAAmB75D,GAAU,GAAK,GAHT,gCAPoB,8BAczD,IAAK,IAAMy1B,KAAOokC,EACVA,EAAmBpkC,KAAShc,EAAcvC,OAC1C4iD,EAAY99C,KAAK1B,OAAOmb,IAExBqkC,EAAY99C,MAAM1B,OAAOmb,IAIjC,OAAOqkC,IACR,ICLH,OAXAjyC,qBAAU,WACN,GAAIprB,GAASA,EAAMga,OAAS28F,GAAiBg3C,EAAiB,CAC1D,IAAMI,EAAmBF,EACrBl3C,EACA32G,EAAMga,OAEV2zI,EAAgBI,GAChBH,EAASG,MAEd,CAAC/tJ,EAAO22G,EAAek3C,EAA2BF,EAAiBC,IAGlE,cAAC,GAAD,CACIh9H,UAAU,EACVF,mBAAmB,EACnBw4H,cAAc,EACdv4H,YAAY,EACZ4B,wBAAwB,EACxB01H,mBAAoBA,KCjB1B55H,GAAYvmB,IAAOC,IAAV,gIAOTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2gD,GAAkB5gD,IAAOC,IAAV,iJAQfu9I,GAAiBx9I,IAAOC,IAAV,iJAQd2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQdytE,GAAuB1tE,IAAOC,IAAV,iJAQpB+gD,GAAUhhD,IAAOC,IAAV,0JASPwtE,GAAkBztE,IAAOC,IAAV,uDAIRimJ,GAgBR,SAAC,GAQC,IAPHhuJ,EAOE,EAPFA,MACA22G,EAME,EANFA,cACA/1G,EAKE,EALFA,cACA8rJ,EAIE,EAJFA,cACAC,EAGE,EAHFA,iBACAtf,EAEE,EAFFA,eACA2e,EACE,EADFA,eACE,EAC0B/gI,oBAAS,GADnC,mBACKgjI,EADL,KACaC,EADb,KAGgBx9I,EAAmB+hB,eAA7BtW,SACUmqC,EAAwBsH,eAAlCzxC,SACU6rI,EAAkB3kC,KAA5BlnG,SACFgyI,EAAmB/vI,eACnBgwI,EAAwBtwF,eACxBuwF,EAAkBd,KARtB,EASkDtiI,mBAAmB,IATrE,mBASK8yC,EATL,KASyBub,EATzB,OAUsCruD,mBAAmB,IAVzD,mBAUK6+H,EAVL,KAUmB6D,EAVnB,KAyCF,OACI,eAAC,GAAD,WACI,eAAC,GAAD,YACM3B,GACE,cAAC3vH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIhM,MAAOA,EACP22G,cAAeA,EACf+1C,cAAeA,EACfC,iBAAkBA,QAKlC,cAACtwH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIi8I,oBAAoB,EACpBjoJ,MAAOA,EACP22G,cAAeA,EACfg3C,gBAAiBA,QAI7B,cAACtxH,GAAA,EAAD,CAAUpwB,MAAO,eAAgBD,SAAS,6BAA1C,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIhM,MAAOA,EACP22G,cAAeA,EACfr9B,sBAAuBA,QAInC,cAACj9C,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIhM,MAAOA,EACP22G,cAAeA,WAK/B,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIprG,MAAO,SACP5C,QAAS,UACTpG,OAAQ,kBAAM8qI,GAAe,IAC7B9mI,MAAO,QACPmF,SAAUuiJ,MAGlB,cAAC,IAAD,CACI1iJ,MAAO,QACPhJ,OApFW,WACvB,IAAM2a,EAAiBxM,EAAeuK,QAAO,SAAAtU,GAAC,OAAIA,EAAI,KAChD00I,EAAgB8S,EAAiBz9I,GACjCiS,EAAsB2jC,EAAoBrrC,QAAO,SAAAtU,GAAC,OAAIA,EAAEvJ,aAAe,KACvE4gE,EAAqBowF,EACvB9nG,EAAoBv9C,KAAI,SAAAmS,GAAI,OAAIA,EAAK9d,gBACrC2gE,GAGEyvF,EAAgBxF,EAAc/sI,QAAO,SAAAtU,GAAC,OAAIA,EAAI,KAC9C8mJ,EAAeY,EAAgBrG,EAAe8B,GAEpDoE,GAAU,GACVttJ,EACIsc,EACAm+H,EACA14H,EACAq7C,EACAwvF,EACAC,EACAf,EAAcjyI,OAAS,EAAI,KAAOiyI,EAAc,IAClDt5H,MAAK,SAAAk7H,GACCA,GACAjhB,IAEJ6gB,GAAU,OA4DF3nJ,MAAO,QACPsF,QAASoiJ,W,gDC5IdM,GAxDWroJ,sBACtB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,mzBACF4zB,UAAU,mCCxChC5M,GAAYvmB,IAAOC,IAAV,iKAQTymJ,GAAkB1mJ,IAAOC,IAAV,uDA2DN0mJ,GAlDV,SAAC,GAA+D,IAA7DzuJ,EAA4D,EAA5DA,MAAO22G,EAAqD,EAArDA,cAAe+1C,EAAsC,EAAtCA,cAAeC,EAAuB,EAAvBA,iBACnC5iC,EAAYpB,KACZxoF,EAAQ0nB,aAAgBkiE,EAAUjkE,MAClC8mG,EAAgCJ,KAEtCphI,qBAAU,WACN,GAAIprB,GAASA,EAAMga,OAAS28F,EAAe,CACvC,IAAMk2C,EAAuBD,EACzBj2C,EACA32G,EAAMga,OAGV2yI,EAAiBE,MAGtB,CAAC7sJ,EAAO22G,EAAei2C,IAY1B,OACI,cAAC,GAAD,UACKzsH,EAAMp3B,KAAI,SAAAmS,GACP,OACI,cAACszI,GAAD,UACI,cAAC5iI,GAAA,EAAD,CAEIgC,aAAc,kBAjBb,SAACjgB,GACtB,GAAI++I,EAAclzI,SAAS7L,GACvBg/I,EAAiBD,EAAczxI,QAAO,SAAA2mB,GAAM,OAAIA,IAAWj0B,UACxD,CACH,IAAM+gJ,EAAY,aAAOhC,GACzBgC,EAAanvI,KAAK5R,GAClBg/I,EAAiB+B,IAWmBC,CAAiBzzI,EAAKvN,QAC1C8E,QAASi6I,EAAclzI,SAAS0B,EAAKvN,OACrCxB,KAAM,GACNZ,MAAO2P,EAAK3f,KACZkP,SAAU,GACVqxB,UAAW/vC,IAAUC,OAAOkB,MAC5B6uC,WAAY,MACZ/vB,SAAQ,UAAKkP,EAAK3f,KAAK6S,cAAf,mBARH8M,EAAKvN,QAFIuN,EAAKvN,aC1CzC0gB,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2gD,GAAkB5gD,IAAOC,IAAV,iJAQfu9I,GAAiBx9I,IAAOC,IAAV,iJAQd2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQdytE,GAAuB1tE,IAAOC,IAAV,iJAQpB+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCgpF,GAAkBztE,IAAO0nB,KAAV,uDAIRo/H,GAYR,SAAC,GAOC,IANHC,EAME,EANFA,aACAnC,EAKE,EALFA,cACAC,EAIE,EAJFA,iBACAtf,EAGE,EAHFA,eACA2e,EAEE,EAFFA,eACA5gG,EACE,EADFA,aAEkB16C,EAAmB+hB,eAA7BtW,SACU6rI,EAAkB3kC,KAA5BlnG,SACUmqC,EAAwBsH,eAAlCzxC,SACFsxH,EAAapyH,eACbuuI,EAAYrC,KACZZ,EAAkBtlG,eAgBlBytG,EACFp+I,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,OACpC6rC,EAAoB7rC,OACpButI,EAAcvtI,OACdiyI,EAAcjyI,OAElB,OACI,eAAC,GAAD,WACI,eAAC,GAAD,YACMuxI,GACE,cAAC3vH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI0gJ,cAAeA,EACfC,iBAAkBA,QAKlC,cAACtwH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI4kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,eAAgBD,SAAS,6BAA1C,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,EACVy6B,aAAcA,QAI1B,cAAC/uB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,cAAC,GAAD,oBACQm+H,EADR,YAEQA,EAAuB,EAAI,UAAY,SAF/C,eAKA,cAAC,GAAD,UACI,cAAC,IAAD,CACIvjJ,MAAO,SACP5C,QAAS,UACTpG,OAAQ,kBAAM8qI,KACd9mI,MAAO,YAGf,cAAC,IAAD,CAAQA,MAAO,QAAShE,OAAQ,WA5ExCssJ,EACIn+I,EACA41C,EACA0hG,EACA0E,GACFt5H,MAAK,WACHi6G,IACAuc,IACAnc,IACAkZ,QAmEI,iCChKDoI,GAzBa7oJ,sBACxB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACID,KAAK,eACL4zB,OAAO,eACPkyC,YAAY,KACZ5lE,EAAE,y7BCQX2nJ,GAzBO9oJ,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACID,KAAK,eACL4zB,OAAO,eACPkyC,YAAY,KACZ5lE,EAAE,2rBCRpB4nJ,GAA4B,CAAC,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QCOzF,SAASC,GAA6BC,GACzC,OACIA,EACK13J,QAAQ,gBAAiB,OACzBA,QAAQ,iCAAkC,UAC1CA,QAAQ,KAAM,IAAM,KAU1B,SAAS23J,GAAoBzhJ,GAChC,OAAQA,GAAiC,IAAxBA,EAAMyzB,OAAO3mB,OCClC,I,8NAAMqvF,GAAOjiF,EAAQ,KAEfwnI,GAAyBvnJ,IAAOC,IAAV,mIAId,qBAAGunJ,kBAA6C,aAAe,YAGvEC,GAA2BznJ,IAAOC,IAAV,kDAIxBynJ,GAAoB1nJ,IAAOC,IAAV,uSASV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACvB,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAMxCgjK,GAAyB3nJ,IAAOC,IAAV,iHAMtB2nJ,GAA0B5nJ,IAAOC,IAAV,mGAMvB4nJ,GAAsB7nJ,IAAOC,IAAV,uDAInB6nJ,GAAkB9nJ,IAAOC,IAAV,+CAIfG,GAAcJ,IAAOC,IAAV,qUAOJ,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAEnB,qBAAGmf,SAA2B,UAAY,aAIrC,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,IAAM,SAI9CmkJ,GAAkB/nJ,IAAOC,IAAV,mEAKf+nJ,GAAqBhoJ,IAAOC,IAAV,mEAKlBgoJ,GAAuBjoJ,IAAOC,IAAV,mEAKpBioJ,GAAkBloJ,IAAOC,IAAV,oFAGR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAGnCsjK,GAAcnoJ,IAAOC,IAAV,4FAaXqkI,GAAqBtkI,IAAOC,IAAV,wPAKV,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAExC,SAAA1D,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aACnB,SAAAyb,GAAK,OAAKA,EAAMC,KAAO,EAAI,KAC/B,SAAAD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAIhCk9D,GAAa5hD,IAAOC,IAAV,kPAUH,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAG3B08E,GAAQnhE,IAAOC,IAAV,kPAUE,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAQ3B2jK,GAA6BpoJ,IAAOC,IAAV,0PACb,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAOjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5B4jK,GAwCR,SAAC,GAyBC,IAAD,IACMr9C,EAzBR9yG,EAwBE,EAxBFA,MACAowJ,EAuBE,EAvBFA,WACAz5C,EAsBE,EAtBFA,cACA05C,EAqBE,EArBFA,gBACAC,EAoBE,EApBFA,gBACAC,EAmBE,EAnBFA,cACAC,EAkBE,EAlBFA,sBACAre,EAiBE,EAjBFA,eACAC,EAgBE,EAhBFA,cACAnhH,EAeE,EAfFA,cACArwB,EAcE,EAdFA,cACAiuJ,EAaE,EAbFA,aACAnC,EAYE,EAZFA,cACAC,EAWE,EAXFA,iBACA8D,EAUE,EAVFA,YACAC,EASE,EATFA,eACAlkB,EAQE,EARFA,aACAwf,EAOE,EAPFA,eACA2E,EAME,EANFA,oBAEA59I,GAIE,EALF69I,cAKE,EAJF79I,eACAg/D,EAGE,EAHFA,YACA8+E,EAEE,EAFFA,gBACA7kJ,EACE,EADFA,SAGU4N,EAAcnQ,cACdsgH,EAAYpB,KACZj5G,EAAU0R,YAAY3R,MAEtBqhJ,EAAyBh5J,uBAAY,WAAO,IAAD,EACvCi5J,EAAmB9iJ,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAErDktC,OAAOxgC,KACH8oJ,EAzFZ,2FAFA,2FA4FY,YAEL,CAACrhJ,IAEEshJ,EAAYl5J,uBAAa,SAACuuB,GAC5B,OAAO0hC,aAAoB1hC,EAAU0jG,EAAUjkE,QAChD,CAACikE,EAAUjkE,OAMRmrG,EAA6Bn5J,uBAAY,kBAC3C8hB,EAAY,wBAAyB,WACvC,CAACA,IAQGs3I,EAAwBp5J,uBAC1B,SAACmC,GACG,IAAMk3J,EAAgBl3J,EACjBghB,QAAO,SAAC1a,GAAD,QACF6uJ,GAAoB7uJ,EAAK,gBACpB6uJ,GAAoB7uJ,EAAK,eACzB6uJ,GAAoB7uJ,EAAI,QACxB6uJ,GAAoB7uJ,EAAI,UACjCwI,KAAI,SAACxI,GACH,MAAO,CACHgH,GAAIuiG,KACJrjE,UAAWlmC,EAAK,cAChBomC,SAAUpmC,EAAK,aACflI,MAAOkI,EAAI,MACXqhC,OAAQovH,EAAYzwJ,EAAI,KAAWA,EAAI,KAAW,IAClD0/B,cAAe,GACftiB,SAAU,GACVhM,YAAa,GACby/I,gBAAgB,EAChBtD,QAAS,OAIjBqD,EAAc12I,OAAS,EACvB61I,EAAgBa,GAEhBF,MAGR,CAACA,EAA4BX,EAAiBU,IAQ5CK,EAAoBv5J,uBACtB,SAACq1B,GACG,IAAMs9E,EAAyBt9E,EAAEgwB,OAAOstD,MACpCA,GAASA,EAAMhwF,OAAS,IFnUjB,SAAC62I,GACxB,IAAMC,EAfsB,SAACD,GAC7B,IAAKA,EACD,MAAO,GACX,IAAME,EAAkBF,EAAS3sG,MAAM,KACvC,OAAO6sG,EAAM/2I,OAAS,EAAK+2I,EAAMpY,MAAmB,GAWtBqY,CAAiBH,GAAUljJ,cACzD,QAASmjJ,GAAiBtC,GAAgBz1I,SAAS+3I,GEkU/BG,CAAYjnD,EAAM,GAAGlvG,MCrVjB,SAACysE,EAAWj6B,GACpC,IAAM4jH,EAAS,IAAIC,WACfC,EAAwB,GAE5BF,EAAOG,OAAS,SAAA3kI,GACZ,IAAM4kI,EAAO5kI,EAAEgwB,OAAQn2C,OACjBgrJ,EAAKC,KAAKC,KAAKH,EAAM,CACvBjvJ,KAAM,SACNqvJ,SAAS,IAYb,OATAH,EAAGI,WAAW10I,SAAQ,SAAS20I,GAC3B,IAAMC,EAAgBL,KAAKM,MAAMC,cAC7BR,EAAGS,OAAOJ,IAERK,EAAcj5H,KAAKG,UAAU04H,GAC/BK,EAAel5H,KAAKC,MAAMg5H,GAC9Bb,EAAgB,uBAAOA,GAAP,aAA4Bc,OAEhD5kH,GAAaA,EAAU8jH,GAChBA,GAEXF,EAAOiB,mBAAmB5qF,GDgUN6qF,CAAapoD,EAAM,GAAIymD,GAEvBD,KAIR9jI,EAAEgwB,OAAOxvC,MAAQ,OAErB,CAACujJ,EAAuBD,IAG5B7lI,qBAAU,WACN,OAAO,kBAAMrY,OAEd,IAEH,IAAM0qG,EAAa9G,EAAcl8F,OAAS,EAEpC0mC,GAAUjW,kBAAO,OAACklH,QAAD,IAACA,OAAD,EAACA,EAAYp2I,QAChCo2I,EAAWp2I,MAAMiB,QACb,SAACC,GAAD,OAAgBA,EAAKk2I,kBACvB32I,OAEAq4I,EACF3xG,EAAK,UACAA,EADA,YAEDA,EAAQ,EAAI,QAAU,QAExB,UAEN,OACI,qCACKjW,kBAAQyrE,IAAkB,cAAC,KAAD,IAC3B,eAAC04C,GAAD,CAAwBC,mBAAoBpkH,kBAAQyrE,GAApD,UACK32G,GAAS22G,GACN,cAAC/kC,GAAA,EAAD,CACIG,YAAaA,EACbF,eAAgB8kC,EAAcl8F,OAC9BR,WACIja,EAAMia,aACK,OAAVm2I,QAAU,IAAVA,GAAA,UAAAA,EAAYp2I,aAAZ,eAAmBS,UAAnB,OACG21I,QADH,IACGA,GADH,UACGA,EAAYp2I,aADf,aACG,EAAmBiB,QACf,SAACC,GAAD,OAAgBA,EAAKk2I,kBACvB32I,QAEVmnD,aAAc,GACdkQ,gBAAiB,WACb/+D,IACA49I,GAAoB,GACpBE,GAAgB,IAEpBxgI,YAAa,WACTsgI,GAAoB,GACpBE,GAAgB,IAEpBplJ,MAAO,CACH+4D,SAAU,WACVj+D,MAAO,QAEXyF,SAAUA,EAxBd,SA0BI,eAACyjJ,GAAD,WACI,cAAC,KAAkB15E,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,iBAHf,SAMI,cAAC,KAAuB28D,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,iBAHf,SAMI,cAAC+e,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,kBACZ30G,KAEJ14B,MAAOA,EACP22G,cACIA,EAEJ/1G,cACIA,EAEJ8rJ,cACIA,EAEJC,iBACIA,EAEJX,eACIA,KAIZx0H,aAAc,CACVO,SAAU,SACVC,WAAY,QAEhBP,gBAAiB,CACbM,SAAU,MACVC,WAAY,QA9BpB,SAiCK,SAAC7xB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,eAAC,GAAD,CACInyB,IAAKA,EACL+F,QAAS,kBACJuxG,GACD9kF,KAEJ1wB,KAAMqwB,EACN5sB,SAAU+xG,EACVx0G,YAAA,UAAc+C,EAAd,oBARJ,UAUI,cAAC,GAAD,CACIN,SAAU+xG,EADd,uBAKA,cAAC,GAAD,CACI/xG,SAAU+xG,EADd,SAGKnlF,EACG,cAACivB,GAAA,EAAD,IAEA,cAACD,GAAA,EAAD,gBAQ5B,cAACsoG,GAAD,UACI,cAAC,KAAD,CACI3uI,YAAa,CACT1U,KAAgBwmJ,0BAFxB,SAKI,cAAC,KAAD,CACIxnJ,MAAO,yBACPmpC,OAAQ,cACRhpC,UAAW+xG,EAHf,SAKI,cAAC,GAAD,CACIvxG,QAAS,YACJuxG,GACG8yC,KAER7kJ,SAAU+xG,EACVx0G,YAAA,UAAc+C,EAAd,oBANJ,SAQI,cAAC6jJ,GAAD,UACI,cAAC7iF,GAAA,EAAD,cAMnBqjF,EAAgB51I,OAAS,GACtB,cAAC,KAAD,CACIwG,YAAa,CACT1U,KAAgBwmJ,0BAFxB,SAKI,cAAC,KAAD,CACIr+G,OAAQ,cACRnpC,MAAO,4BACPS,SAAS,gCAHb,SAKI,cAAC,GAAD,CACIE,QAASskJ,EACTvnJ,YAAA,UAAc+C,EAAd,oBAFJ,SAII,cAACgkJ,GAAD,UACI,cAAC,GAAD,iBAU/B9kH,kBAAQyrE,IACL,eAAC44C,GAAD,WACI,cAACU,GAAD,UACI,cAAC,KAAD,CACI59H,SAAUpB,EACVvlB,SAAU0mI,MAIlB,cAACj6G,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,kBAAM30G,KACtBm2H,aAAcA,EACdnC,cAAe+D,EACf9D,iBAAkB+D,EAClB1E,eAAgBA,EAChB5gG,cAAc,KAGtB3zB,gBAAiB,CACbO,WAAY,IACZD,SAAU,GAblB,SAgBK,SAAC5xB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,SAAUymI,EACVtvF,WAAYlqB,EACZ6zG,aAAcA,EACdxgI,SAAQ,UAAKA,EAAL,iBAIpB,cAAC2jJ,GAAD,UACI,cAACD,GAAD,UACI,cAAC,KAAD,CACInkJ,MAAO,oBACPmpC,OAAQ,cACR1oC,SAAS,4BAHb,SAKI,cAACwjJ,GAAD,CACItjJ,QAAS,kBACL4kJ,KAEJ7nJ,YAAA,UAAc+C,EAAd,sBAJJ,SAMI,cAAC+jJ,GAAD,UACI,cAAC,GAAD,cAMpB,cAACJ,GAAD,UACI,cAACD,GAAD,UACI,cAAC,KAAD,CACInkJ,MAAO,kBACPmpC,OAAQ,cACR1oC,SAAS,0BAHb,SAKK,SAAAgnJ,GAAU,OACP,qCACI,uBACIzrJ,GAAG,UACHzE,KAAK,OACLqD,IAAK,SAAAA,GAAG,OAAK2sG,EAAS3sG,GACtBsF,MAAO,CAAEm+F,QAAS,QAClBv3E,SAAU,SAAAlF,GAAC,OACPkkI,EAAkBlkI,MAG1B,cAACqiI,GAAD,CACIrpJ,IAAK6sJ,EACL9mJ,QAAS,kBACL4mG,EAAO1pE,SAEXngC,YAAA,UAAc+C,EAAd,oBALJ,SAOI,cAAC8jJ,GAAD,UACI,cAAC,GAAD,wBAUlC,OAAC9vJ,QAAD,IAACA,OAAD,EAACA,EAAOga,MAAMS,SAAUywB,kBAAQyrE,IAC9B,cAACu5C,GAAD,CAA4BjnJ,YAAA,UAAc+C,EAAd,YAA5B,SACK8mJ,OAIZ5nH,kBAAQyrE,IAAkB,cAAC,KAAD,Q,UEvmBrCluD,GAAmB3gD,IAAOC,IAAV,yHAOhBo9I,GAAqBr9I,IAAOC,IAAV,8LAOV,qBAAG2D,SAA2B,UAAY,aAGlDowF,GAAkBh0F,YAAO86C,KAAP96C,CAAH,uDAIfohE,GAAcphE,IAAOC,IAAV,qEAEJ,SAAAC,GAAK,OAAKA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOkB,SAGhEw8D,GAAa5hD,IAAOC,IAAV,kNAQH,gBAAGK,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOkB,SAGpDo4J,GAAiBx9I,YAAO8sC,KAAO7sC,IAAdD,CAAH,wSAGF,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAUxCs5J,GAAkBz9I,IAAOC,IAAV,4BAEfy9I,GAA0B19I,IAAOC,IAAV,4BAEvB09I,GAAkB39I,IAAOC,IAAV,wHAOfk9I,GAAoBn9I,YAAOo9I,GAAPp9I,CAAH,qDAMVmrJ,GAOR,SAAC,GAAkF,IAAhFvnJ,EAA+E,EAA/EA,SAAUk6I,EAAqE,EAArEA,aAAcC,EAAuD,EAAvDA,gBAAiBx5H,EAAsC,EAAtCA,SAAU6mI,EAA4B,EAA5BA,YAAalnJ,EAAe,EAAfA,SAAe,EAC3Dif,oBAAS,GADkD,mBAC5EhjB,EAD4E,KACtE+lB,EADsE,KAE7E/M,EAAck5B,eACd4vE,EAAYpB,KACZxoF,EAAQwnB,aACVoiE,EAAUjkE,KACV7kC,GAEE6kI,EAAmBh+F,aAAoB89F,EAAc77B,EAAUjkE,MAE/DigG,EAAoB,SAACp4I,GACvBqgB,GAAQ,GACR63H,EAAgBl4I,IAGpB,OACI,cAACsoE,GAAA,EAAD,CAAmBngC,YAAa,kBAAM9nB,GAAQ,IAA9C,SACI,eAAC,GAAD,WACI,eAAC,GAAD,CACI9hB,QAAS,WACAmgB,GACD6mI,GAAY,GAEhBllI,GAAS/lB,IAEbyD,SAAUA,EACVzC,YAAW+C,EARf,UAUI,cAAC,GAAD,CACIlB,OACKg7I,GAAoBp6I,EACf3f,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOkB,MAJ/B,SAOK44J,IAEL,cAAC,GAAD,CAAYp6I,SAAUA,EAAtB,UACMA,GAAYzD,EAAO,cAACs/C,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,SAG3C,cAAC,GAAD,CAAiBr/C,KAAMA,IAASyD,EAAhC,SACI,cAAC,GAAD,CACI4qC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GAHnB,SAKI,cAAC,GAAD,UACI,cAAC,GAAD,UACKpW,IACIA,GAAS,IAAIp3B,KAAI,SAAAjN,GAAI,OAClB,cAAC,GAAD,CAEIoQ,QAAS,WACL65I,EAAkBjqJ,EAAK6R,QAE3B1E,YAAA,eAAmBnN,EAAKP,KAAK6S,eALjC,SAOI,cAAC,GAAD,CACIqE,QACImzI,IAAiB9pJ,EAAK6R,MAE1BxB,KAAM,GACNyhB,aAAc,kBACVm4H,EACIjqJ,EAAK6R,QAGbpC,MAAOzP,EAAKP,QAhBXO,EAAK6R,wBC9HhD0gB,GAAYvmB,IAAOC,IAAV,4FAMTs9I,GAAqBv9I,IAAOC,IAAV,8LAOV,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG/Cw9D,GAAcphE,IAAOC,IAAV,qEAEJ,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SAG3Bw8D,GAAa5hD,IAAOC,IAAV,kNAQH,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SAqFlBimK,GA5EV,SAAC,GAAmF,IAAjF7sG,EAAgF,EAAhFA,oBAAqB0gG,EAA2D,EAA3DA,oBAAqB36H,EAAsC,EAAtCA,SAAU6mI,EAA4B,EAA5BA,YAAalnJ,EAAe,EAAfA,SAC7DupG,EAAU3nD,eAAV2nD,MACAt7G,EAAS4zD,eAAT5zD,KACF0sJ,EAAkBtlG,eAClB4lG,EAA4B3lG,eAC5B4lG,EAAmBtlG,eAEzBx2B,qBAAU,WACN67H,EAA0B3gG,GAC1BqgG,MAED,CAACM,EAA2BN,IAE/Bv7H,qBAAU,WACN,OAAO,WACH87H,OAEL,CAACA,IAEJ97H,qBAAU,WACN47H,EAAoBzxC,KACrB,CAACyxC,EAAqBzxC,IAEzB,IAAM4xC,GAAuBltJ,GAAQA,EAAK+f,MAAMiB,QAAO,SAAAC,GAAI,OAAIA,EAAKrhB,SAAW+2C,KAAmB11C,UAAQuf,OAAS,EAEnH,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,QAJhB,SASK,SAACvyB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,sBAAMnyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,4BACPmpC,OAAQ,WACRhpC,UAAWy7I,EAHf,SAKI,cAAC,GAAD,CACIj7I,QAAS,WACAmgB,GAAa86H,GACd+L,GAAY,IAEf/L,GAAuBxuH,KAE5BjtB,SAAUy7I,EACVl+I,YAAW+C,EARf,SAUI,qCACI,cAAC,GAAD,CAAaN,SAAUy7I,EAAvB,SACK5xC,EAAM96F,OAAS,EACV,eADL,UAEQ86F,EAAM96F,OAFd,YAGS86F,EAAM96F,OAAS,EACT,eACA,iBAGpB,cAAC,GAAD,CAAY/O,SAAUy7I,EAAtB,SACK7uH,EAAQ,cAACivB,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,qBC9GzDj5B,GAAYvmB,IAAOC,IAAV,4FAMTs9I,GAAqBv9I,IAAOC,IAAV,8LAOV,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG/Cw9D,GAAcphE,IAAOC,IAAV,qEAEJ,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SAG3Bw8D,GAAa5hD,IAAOC,IAAV,kNAQH,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SA0FlBkmK,GAhFV,SAAC,GAAuE,IAArEpL,EAAoE,EAApEA,cAAekC,EAAqD,EAArDA,cAAe79H,EAAsC,EAAtCA,SAAU6mI,EAA4B,EAA5BA,YAAalnJ,EAAe,EAAfA,SACjDupG,EAAU8N,KAAV9N,MACAt7G,EAAS8uJ,KAAT9uJ,KACF2vJ,EAAYrC,KACZsC,EAAsBrC,KACtB2C,EAAaxC,KAEnBv8H,qBAAU,WACNy+H,EAAoB7B,GACpB4B,MAED,CAACA,EAAWC,IAEfz+H,qBAAU,WACN,OAAO,WACH++H,OAEL,CAACA,IAEJ/+H,qBAAU,WACN8+H,EAAc30C,KACf,CAAC20C,EAAe30C,IAEnB,IAAM89C,GAAiBp5J,GAAQA,EAAK+f,MAAMS,OAAS,EAEnD,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,KAEJkd,SAAU,WACNld,KAEJsvH,cAAeA,KAT3B,SAaK,SAAC7hJ,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,sBAAMnyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,qBACPmpC,OAAQ,WACRhpC,UAAW2nJ,EAHf,SAKI,cAAC,GAAD,CACInnJ,QAAS,WACAmgB,GAAagnI,GACdH,GAAY,IAEfG,GAAiB16H,KAEtBjtB,SAAU2nJ,EACVpqJ,YAAW+C,EARf,SAUI,qCACI,cAAC,GAAD,CAAaN,SAAU2nJ,EAAvB,SACK99C,EAAM96F,OAAS,EACV,QADL,UAEQ86F,EAAM96F,OAFd,YAGS86F,EAAM96F,OAAS,EACT,QACA,UAGpB,cAAC,GAAD,CAAY/O,SAAU2nJ,EAAtB,SACK/6H,EAAQ,cAACivB,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,qBChHzDj5B,GAAYvmB,IAAOC,IAAV,4FAMTs9I,GAAqBv9I,IAAOC,IAAV,8LAOV,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAG/Cw9D,GAAcphE,IAAOC,IAAV,qEAEJ,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SAG3Bw8D,GAAa5hD,IAAOC,IAAV,kNAQH,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOoD,cACnB4Y,EAAMI,MAAMpc,OAAOkB,SAsFlBomK,GA7EV,SAAC,GAAyE,IAAvE5iJ,EAAsE,EAAtEA,eAAgB41I,EAAsD,EAAtDA,eAAgBj6H,EAAsC,EAAtCA,SAAU6mI,EAA4B,EAA5BA,YAAalnJ,EAAe,EAAfA,SACnDupG,EAAU9iF,eAAV8iF,MACAt7G,EAAS+gB,eAAT/gB,KACFwzI,EAAapyH,eACbqyH,EAAepyH,eACfirI,EAAczqI,eAEpBsP,qBAAU,WACNsiH,EAAah9H,GACb+8H,MAED,CAACC,EAAcD,IAElBriH,qBAAU,WACN,OAAO,WACHm7H,OAEL,CAACA,IAEJn7H,qBAAU,WACNk7H,EAAe/wC,KAChB,CAAC+wC,EAAgB/wC,IAEpB,IAAMixC,GAAkBvsJ,GAAQA,EAAK+f,MAAMS,OAAS,EAC9CgsI,EAA0B/1I,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,OAEpE,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,WACZ30G,QAJhB,SASK,SAACvyB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,sBAAMnyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,sBACPmpC,OAAQ,WACRhpC,UAAW86I,EAHf,SAKI,cAAC,GAAD,CACIt6I,QAAS,WACAmgB,GAAam6H,GACd0M,GAAY,IAEf1M,GAAkB7tH,KAEvBjtB,SAAU86I,EACVv9I,YAAW+C,EARf,SAUI,qCACI,cAAC,GAAD,CAAaN,SAAU86I,EAAvB,SACKC,EAA0B,EACrB,SADL,UAEQA,EAFR,YAGSA,EAA0B,EACpB,SACA,WAGpB,cAAC,GAAD,CAAY/6I,SAAU86I,EAAtB,SACKluH,EAAQ,cAACivB,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,qBC5FhDisG,GA9ByB,SAAC,GAAmB,IAAjBntJ,EAAgB,EAAhBA,UACvC,OACI,qBACIG,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BANf,SAQI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,4BACI,8BACI,sBACIC,EAAE,gBACF4zB,UAAU,8CAEd,mBAAGF,OAAO,eAAeC,cAAc,QAAvC,SACI,sBACI3zB,EAAE,uBACF4zB,UAAU,iFCU3Bu4H,GA9ByB,SAAC,GAAmB,IAAjBptJ,EAAgB,EAAhBA,UACvC,OACI,qBACIG,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BANf,SAQI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,4BACI,8BACI,sBACIC,EAAE,gBACF4zB,UAAU,8CAEd,sBACIF,OAAO,eACPC,cAAc,QACd3zB,EAAE,oCACF4zB,UAAU,wDCFhC0jC,GAAW72D,IAAO42D,GAAV,iFAMRrwC,GAAYvmB,IAAOC,IAAV,2NAST+gD,GAAUhhD,IAAOC,IAAV,4MAUPo1G,GAAer1G,IAAOC,IAAV,+QAOA,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aACjC,SAAAub,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aACnB,SAAAyb,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAM/C+nJ,GAAa3rJ,IAAOC,IAAV,4GAOV2rJ,GAAc5rJ,IAAOC,IAAV,mNAKC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAOxCknK,GAAe7rJ,IAAOC,IAAV,yIAKL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAGnCu/B,GAAQpkB,IAAO+zB,MAAV,2RACQ,SAAA7zB,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAGjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOjB,SAAA8a,GAAK,OAAKA,EAAM0iJ,SAAW,MAAQ,SAAU,SAAA1iJ,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAiPlFinK,GA3NV,SAAC,GAeC,IAdHrzJ,EAcE,EAdFA,KACAszJ,EAaE,EAbFA,QACAC,EAYE,EAZFA,yBACA3I,EAWE,EAXFA,kBACAvF,EAUE,EAVFA,aACAwF,EASE,EATFA,kBACAC,EAQE,EARFA,sBACAC,EAOE,EAPFA,mBACAC,EAME,EANFA,2BACAC,EAKE,EALFA,wBACAE,EAIE,EAJFA,qBACAD,EAGE,EAHFA,kBACAO,EAEE,EAFFA,eACAhgJ,EACE,EADFA,SAEM0hI,EAAepyH,eACfy4I,EAAsBl4I,eAF1B,EAG8BoP,oBAAS,GAHvC,mBAGKoB,EAHL,KAGe6mI,EAHf,OAIoCjoI,oBAAS,GAJ7C,mBAIK+oI,EAJL,KAIkBC,EAJlB,KAMF7oI,qBAAU,WACNsiH,EAAantI,EAAKod,YACnB,CAAC+vH,EAAcntI,IAElB,IAAM2zJ,EAAoB,WACtBL,EAAQ,CACJtsJ,GAAI,GACJlP,MAAO,GACPouC,UAAW,GACXE,SAAU,GACVhpB,SAAU,GACVsiB,cAAe,GACf6tH,QAAS,GACTlsH,OAAQ,OAEZmyH,KAGEnmI,EAAe,SACjBT,EACAryB,GAEKuxB,GACD6mI,GAAY,GAEhB/H,EAAkBh+H,EAAGryB,IAQnBq5J,GAAsB5zJ,EAAKkmC,WAAalmC,EAAKkmC,UAAUhsB,OAAS,EAChE25I,GAAqB7zJ,EAAKomC,UAAYpmC,EAAKomC,SAASlsB,OAAS,EAC7D45I,GAAkBC,YAAwB/zJ,EAAKlI,MAAM+oC,QAGrDmzH,EACFJ,GACAC,GACAC,IALmBzO,EAQvB,OACI,cAACjnF,GAAD,CAAU11D,YAAA,UAAc+C,EAAd,QAAV,SACI,oBAAI+rD,QAAS,EAAb,SACI,cAACnV,GAAA,EAAD,CACI36C,MAAM,EACN46C,WAAY,WACHx2B,GACD6nI,KAJZ,SAQI,eAAC,GAAD,WACI,cAACR,GAAD,UACI,cAACxnI,GAAD,CACIve,MAAOpN,EAAKkmC,UACZpU,SAAU,SAAAlF,GACNS,EAAaT,EAAG,cAEpB0mC,WAAW,EACX5qD,YAAA,UAAc+C,EAAd,mBAGR,cAAC0nJ,GAAD,UACI,cAACxnI,GAAD,CACIve,MAAOpN,EAAKomC,SACZtU,SAAU,SAAAlF,GACNS,EAAaT,EAAG,aAEpBlkB,YAAA,UAAc+C,EAAd,kBAGR,eAAC0nJ,GAAD,WACI,cAACxnI,GAAD,CACIve,MAAOpN,EAAKlI,MACZg6B,SAAU,SAAAlF,GACNS,EAAaT,EAAG,UAEpBu9H,SAAU2J,EACVprJ,YAAA,UAAc+C,EAAd,YAEHqoJ,GACG,cAACV,GAAD,6CAKR,cAACD,GAAD,UACI,cAAC,KAAD,CACIzyI,YAAa,CACT1U,KAAgB4/I,wBAFxB,SAKI,cAAC,GAAD,CACIzgJ,SAAUsgJ,EACVpG,aAAcA,EACdC,gBAAiB,SAAC/pJ,GACdsvJ,EAAkBtvJ,IAEtBuwB,SAAUA,EACV6mI,YAAaA,EACblnJ,SAAQ,UAAKA,EAAL,gBAIpB,cAAC0nJ,GAAD,UACI,cAAC,KAAD,CACIzyI,YAAa,CACT1U,KAAgB6/I,+BAFxB,SAKI,cAAChF,GAAiBrxE,SAAlB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,YAHf,SAMI,cAAC,GAAD,CACI4uI,cAAeyD,EACfvB,cAAewB,EACfr/H,SAAUA,EACV6mI,YAAaA,EACblnJ,SAAQ,UAAKA,EAAL,kBAKxB,cAAC0nJ,GAAD,UACI,cAAC,KAAD,CACIzyI,YAAa,CACT1U,KAAgB6/I,+BAFxB,SAKI,cAAC,KAAuBr2E,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,YAHf,SAMI,cAAC,GAAD,CACIktC,oBACIklG,EAEJxE,oBACIuE,EAEJl/H,SAAUA,EACV6mI,YAAaA,EACblnJ,SAAQ,UAAKA,EAAL,yBAKxB,cAAC0nJ,GAAD,UACI,cAAC,KAAD,CACIzyI,YAAa,CACT1U,KAAgBwa,yBAFxB,SAKI,cAAC,GAAD,CACIrW,eAAgB46I,EAChBhF,eAAgB+E,EAChBh/H,SAAUA,EACV6mI,YAAaA,EACblnJ,SAAQ,UAAKA,EAAL,kBAIlBgoJ,GACE,eAAC,GAAD,WACI,cAAC,GAAD,CAAc9nJ,QAASgoJ,EAAmBjrJ,YAAA,UAAc+C,EAAd,WAA1C,SACI,cAACynJ,GAAD,UACI,cAAC,GAAD,QAGR,cAAC,GAAD,CACIvnJ,QAAS,YACJqoJ,IAvJjCN,GAAe,GACfH,MAwJ4BpoJ,SAAU6oJ,EACVtrJ,YAAA,UAAc+C,EAAd,SALJ,SAOI,cAACynJ,GAAD,UACI,cAAC,GAAD,qB,UCvUlC9jB,ICCoB7nI,IAAOC,IAAV,iMAUAD,YAAO8jB,KAAP9jB,CAAH,+JDXIA,YAAOgwD,KAAPhwD,CAAH,kFAEU,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,aAG9CgoG,GAAsE,SAAC,GAI7E,IAHHlpF,EAGE,EAHFA,SACAjF,EAEE,EAFFA,MACAyF,EACE,EADFA,SAEA,OAAO,cAAC,GAAD,CAAiBzF,MAAOA,EAAOyF,SAAUA,EAAzC,SAAoDR,KEVzDmkI,GAAkB7nI,YAAOgwD,KAAPhwD,CAAH,+CAIRstF,GAA4C,SAAC,GAGnD,IAFH5pF,EAEE,EAFFA,SACAjF,EACE,EADFA,MAEA,OAAO,cAAC,GAAD,CAAiBA,MAAOA,EAAxB,SAAgCiF,K,8BC+C5BgpJ,GAzDYtuJ,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIC,QAAQ,WACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BANf,YAQOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,yEACF4zB,UAAU,0D,UC7CpCk5D,GAAkBrsF,IAAOC,IAAV,iRACf,SAAAC,GAAK,OAAIA,EAAMosF,aAAN,yBACT,SAAApsF,GAAK,OAAIA,EAAMosF,aAAN,uBAKO,SAAApsF,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAK5B,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAI5C+lG,GAAavsF,IAAOwsF,MAAV,2XAOC7tB,KAAMC,WAGD,SAAA1+D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAK5B,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAI5CimG,GAAYzsF,IAAOC,IAAV,2HAGG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIjCwoK,GAMRjsJ,gBACD,YAA4D,IAAzD4rF,EAAwD,EAAxDA,YAAa5oF,EAA2C,EAA3CA,SAAUpF,EAAiC,EAAjCA,UAAWsuJ,EAAsB,EAAtBA,gBACjC,OACI,cAACngE,GAAD,CAAW9oF,MAAOipJ,EAAlB,SACI,cAACvgE,GAAD,CAAiBC,YAAaA,EAA9B,SACI,cAACC,GAAD,CAAYjuF,UAAWA,EAAvB,SAAmCoF,WCvDjDmpJ,GAAQ7sJ,IAAO8sJ,MAAV,4BAEEC,GACT,SAAC,GAAD,IAAGrpJ,EAAH,EAAGA,SAAUQ,EAAb,EAAaA,SAAb,OAA4B,cAAC2oJ,GAAD,CAAO1rJ,YAAW+C,EAAlB,SAA6BR,KCFvDkmD,ICCO5pD,IAAOC,IAAV,wJACO0+D,KAAMC,WCFV5+D,IAAOC,IAAV,6KAIehc,IAAU2E,YAAYO,kBCLlC6W,IAAOC,IAAV,kDHCGD,IAAOC,IAAV,iOAIehc,IAAU2E,YAAYO,mBAOlC6pG,GAERtyF,gBAAK,gBAAGgD,EAAH,EAAGA,SAAUpF,EAAb,EAAaA,UAAb,OACN,cAAC,GAAD,CAAMA,UAAWA,EAAjB,SAA6BoF,OIUlBspJ,GAzBW5uJ,sBACtB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,eAAeC,SAAS,UAAhC,SACI,mBAAGD,KAAK,gBAAR,SACI,sBACIE,EAAE,8WACF4zB,UAAU,mCCdhC0jC,GAAW72D,IAAO42D,GAAV,yDAIRq2F,GAAkBjtJ,YAAOokF,KAAPpkF,CAAH,kFAMRktJ,GAA4B,SAAC,GAAD,IAAGxpJ,EAAH,EAAGA,SAAH,OACrC,cAACupJ,GAAD,UACI,cAAC,GAAD,UACI,oBAAIh9F,QAAS,IAAb,SAAmBvsD,SChBlBirD,GAAkB3uD,IAAOC,IAAV,6JAQf2uD,GAAyB5uD,IAAOC,IAAV,yJAQtB4uD,GAAiB7uD,IAAOC,IAAV,iQACR,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cACnC,SAAAwb,GAAK,QAAMA,EAAMzB,OAAR,iBAA2ByB,EAAMzB,MAAjC,QAGFqwD,GAAgB9uD,IAAOC,IAAV,8GAGb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cCzB5ByoK,GAMR,SAAC,GAAD,IAASrsJ,EAAT,EAAG+C,KAAYpF,EAAf,EAAeA,MAAOyF,EAAtB,EAAsBA,SAAUR,EAAhC,EAAgCA,SAAhC,OACD,cAACirD,GAAD,UACI,eAACC,GAAD,WACK9tD,GACG,cAACguD,GAAD,CAAe3tD,YAAW+C,GAAQ,UAAOA,EAAP,SAAlC,SACI,cAACpD,EAAD,MAGR,cAAC+tD,GAAD,CACIpwD,MAAOA,EACP0C,YAAW+C,GAAQ,UAAOA,EAAP,SAFvB,SAIKR,UCUX0pJ,GAAuBptJ,YAAOqtJ,KAAPrtJ,CAAH,qDAIpB6nI,GAAkB7nI,YAAOgwD,KAAPhwD,CAAH,+CAIf2sF,GAAc3sF,IAAOwsF,MAAV,kJAQXygE,GAAkBjtJ,YAAOokF,KAAPpkF,CAAH,gGAOfstJ,GAAwBttJ,YAAO65D,KAAP75D,CAAH,gDAIrButJ,GAA2BvtJ,IAAOC,IAAV,qIAQxButJ,GAAsBxtJ,IAAO0nB,KAAV,+CACZ,SAAAxnB,GAAK,OAAKA,EAAM0iJ,SAAW1iJ,EAAMI,MAAMpc,OAAOW,OAAS,WAG9D4oK,GAAiBztJ,IAAOC,IAAV,iKAQd2hD,GAAa5hD,IAAOC,IAAV,0GAIH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCipK,GAAiB1tJ,YAAO62D,KAAP72D,CAAH,2FACd,SAAAE,GAAK,QACDA,EAAMytJ,SAAR,oCAEkBztJ,EAAMI,MAAMpc,OAAOqC,SAFrC,6WAeMknK,IAKRG,GAAmB5tJ,IAAOC,IAAV,qEAKhB4tJ,GAAiB7tJ,IAAOC,IAAV,kZAED,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAYtB,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAG9C2pK,GAAqB9tJ,IAAOC,IAAV,uDAIlB8tJ,GAA2B/tJ,IAAOC,IAAV,kcAKN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAC5B,SAAAqb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,SAKtCgpK,GAQAD,IAKRI,GAAwBhuJ,IAAOC,IAAV,gEAEd,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGnC8pK,GAAuBjuJ,IAAOC,IAAV,+DAKpBghE,GAAiBjhE,IAAOC,IAAV,mEAKdihE,GAAuBlhE,IAAOC,IAAV,kJAER,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAOjC+pK,GAKR,SAAC,GAAwD,IACtDvtJ,EADAlI,EAAqD,EAArDA,KAAMo2G,EAA+C,EAA/CA,cAAes/C,EAAgC,EAAhCA,gBAAiBjqJ,EAAe,EAAfA,SA2D1C,OAhCIvD,EAxBClI,EAAKkmC,WACLlmC,EAAKomC,UACLpmC,EAAKlI,QACNkI,EAAK6wJ,eAoBE7wJ,EAAK21J,oBAER,cAAC,KAAD,CACI3qJ,MACI,sBAAMtC,YAAA,UAAc+C,EAAd,iBAAN,SACKg8C,KAAsBkuG,sBAG/B1xF,SAAS,aANb,SAQI,cAACoxF,GAAD,CAAoB3sJ,YAAA,UAAc+C,EAAd,YAApB,SACI,cAAC6pJ,GAAD,UACI,cAACC,GAAD,UACI,cAAC,GAAD,YAQhB,cAAC,KAAD,CACIrjJ,UACMkkG,KACAp2G,EAAKgH,IACPovG,EAAcn9F,SAASjZ,EAAKgH,IAEhCurE,YAAa,kBAAMmjF,EAAgB11J,EAAKgH,KACxCyE,SAAUA,IA7Cd,cAAC,KAAD,CACIT,MACI,sBAAMtC,YAAA,UAAc+C,EAAd,iBAAN,SACKg8C,KAAsBopG,iBAG/B5sF,SAAS,aANb,SAQI,cAACoxF,GAAD,CAAoB3sJ,YAAA,UAAc+C,EAAd,YAApB,SACI,cAAC6pJ,GAAD,UACI,cAACC,GAAD,UACI,cAAC,GAAD,YAuCjB,cAAC,GAAD,CAAmBvvJ,MAAO,EAA1B,SAA8BkC,KAG5B0tJ,GAoCR,SAAC,GAgCC,IA/BHC,EA+BE,EA/BFA,SACAp/E,EA8BE,EA9BFA,gBACA2/B,EA6BE,EA7BFA,cACAs/C,EA4BE,EA5BFA,gBACApF,EA2BE,EA3BFA,gBACAF,EA0BE,EA1BFA,oBACA0F,EAyBE,EAzBFA,WACAC,EAwBE,EAxBFA,aACAC,EAuBE,EAvBFA,aACAt9J,EAsBE,EAtBFA,aACAuB,EAqBE,EArBFA,MACA+lC,EAoBE,EApBFA,SACA1lC,EAmBE,EAnBFA,QACAglC,EAkBE,EAlBFA,WACAr0B,EAiBE,EAjBFA,SACAgrJ,EAgBE,EAhBFA,aACAC,EAeE,EAfFA,gBACA3C,EAcE,EAdFA,yBACA3I,EAaE,EAbFA,kBACAvF,EAYE,EAZFA,aACAwF,EAWE,EAXFA,kBACAC,EAUE,EAVFA,sBACAC,EASE,EATFA,mBACAC,EAQE,EARFA,2BACAC,EAOE,EAPFA,wBACAE,EAME,EANFA,qBACAD,EAKE,EALFA,kBACA5yD,EAIE,EAJFA,yBACAC,EAGE,EAHFA,yBACAkzD,EAEE,EAFFA,eACAhgJ,EACE,EADFA,SAEM81D,EAAgB70C,iBAAuB,MACvC88F,EAAYpB,KAFhB,EAI0C19F,mBAE1CmrI,GANA,mBAIKM,EAJL,KAIqBC,EAJrB,KAQI9iB,EACF6iB,GACA//C,GACAA,EAAcl8F,OAASi8I,EAAej8I,OAEpCkrG,EAAwB1C,GAAahqH,GAE3CmyB,qBAAU,WACFgrI,IACIG,EACAI,EAAkBP,GAElBQ,EAAmB39J,MAI5B,CAACm9J,EAAU57J,EAAOmrH,IAGrB,IAAMixC,EAAqB,SAAC39J,GACxB,IAAM49J,EAAoBT,EAAQ,aAAOA,GAAY,GACrD,GAAIn9J,EAAa4B,SAAW5B,EAAa4B,QAAQC,MAAO,CACpD,IAAMA,EAAQ7B,EAAa4B,QAAQC,MAC7B42C,EAAUz4C,EAAa4B,QAAQE,IAAM,GAAK,EAClC,eAAVD,EACA+7J,EAAaj8J,MAAK,SAACmf,EAAQ8E,GACvB,IAAMi4I,EAAa/8I,EAAC,SACdg9I,EAAcl4I,EAAC,SACrB,SAAKi4I,IAAeC,IAEhBrlH,GACColH,EAAWr8I,OAASs8I,EAAYt8I,QAC1B,EACDq8I,EAAWr8I,OAASs8I,EAAYt8I,OAChC,EACA,MAGG,oBAAV3f,EACP+7J,EAAaj8J,MAAK,SAACmf,EAAQ8E,GACvB,IAAMi4I,EAAa/8I,EAAC,cACdg9I,EAAcl4I,EAAC,cACrB,SAAKi4I,IAAeC,IAEhBrlH,GACColH,EAAWr8I,OAASs8I,EAAYt8I,QAC1B,EACDq8I,EAAWr8I,OAASs8I,EAAYt8I,OAChC,EACA,MAGG,WAAV3f,EACP+7J,EAAaj8J,MAAK,SAACmf,EAAQ8E,GACvB,IAAMi4I,EAAaE,EAAYj9I,EAAEjf,IAC3Bi8J,EAAcC,EAAYn4I,EAAE/jB,IAClC,SAAKg8J,IAAeC,KAEM,kBAAfD,GACgB,kBAAhBC,GAIPrlH,GACColH,EAAW1oJ,cAAgB2oJ,EAAY3oJ,eACjC,EACD0oJ,EAAW1oJ,cACX2oJ,EAAY3oJ,cACZ,EACA,OAIdyoJ,EAAaj8J,MAAK,SAACmf,EAAQ8E,GACvB,IAAMi4I,EAAa/8I,EAAEjf,GACfi8J,EAAcl4I,EAAE/jB,GACtB,SAAKg8J,IAAeC,KAEM,kBAAfD,GACgB,kBAAhBC,GAIPrlH,GACColH,EAAW1oJ,cAAgB2oJ,EAAY3oJ,eACjC,EACD0oJ,EAAW1oJ,cACX2oJ,EAAY3oJ,cACZ,EACA,OAIlBuoJ,EAAkBE,KAIpBG,EAAc,SAACp1H,GACjB,OAAKA,GAEQkmB,aAAoBlmB,EAAQmoF,EAAUjkE,OAF/B,IAMlBmxG,EAAkBrlB,GAAW,YAAa/2I,EAASglC,GACnDq3H,EAAiBtlB,GAAW,WAAY/2I,EAASglC,GACjDs3H,EAAcvlB,GAAW,QAAS/2I,EAASglC,GAC3Cu3H,EAAaxlB,GAAW,SAAU/2I,EAASglC,GAC3Cw3H,EAAgBzlB,GAAW,kBAAmB/2I,EAASglC,GACvDy3H,EAAU1lB,GAAW,aAAc/2I,EAASglC,GAC5C03H,EAAW3lB,GAAW,aAAc/2I,EAASglC,GAE7C+vC,GAAmBwmF,GAAYA,EAAS37I,OAAS,EAEvD,OACI,cAACs7I,GAAD,UACI,cAAChtF,GAAD,UACI,eAACC,GAAD,WACI,cAACyrF,GAAD,CAAO+C,YAAY,EAAnB,SACI,cAAC,GAAD,CAAWxrJ,SAAQ,UAAKA,EAAL,SAAnB,SACI,eAAC,KAAD,WACI,cAAC,GAAD,CAAyBzF,MAAO,EAAGyF,SAAQ,UAAKA,EAAL,kBAA3C,SACI,cAAC,KAAD,CACIyG,UACMkkG,KACAA,EAAcl8F,OAEpB/O,SAAUkkE,EACVl9D,QAASmhI,EACT/gE,YAAa,SAAC/wB,GACV4uG,EACI5uG,EAAM5E,OAAO1qC,SAGjBo+I,EACI9uG,EAAM5E,OAAO1qC,UAGrBzG,SAAQ,UAAKA,EAAL,4BAGhB,cAACkpJ,GAAD,2BACI3uJ,MAAO,IACH0wJ,GAFR,IAGIvrJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,oBAJZ,yBAQA,cAAC,KAAD,2BACIzF,MAAO,IACH2wJ,GAFR,IAGIxrJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,mBAJZ,wBAQA,cAAC,KAAD,2BACIzF,MAAO,IACH4wJ,GAFR,IAGIzrJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,eAJZ,yBAQA,cAAC,KAAD,2BACIzF,MAAO,IACH6wJ,GAFR,IAGI1rJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,cAJZ,mBAQA,cAAC,KAAD,2BACIzF,MAAO,IACH+wJ,GAFR,IAGI5rJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,eAJZ,oBAQA,cAAC,KAAD,2BACIzF,MAAO,IACH8wJ,GAFR,IAGI3rJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,sBAJZ,2BAQA,cAAC,KAAD,2BACIzF,MAAO,IACHgxJ,GAFR,IAGI7rJ,SAAUkkE,EACV5jE,SAAQ,UAAKA,EAAL,gBAJZ,qBAQA,cAAC,KAAD,CAAiBzF,MAAO,WAInCiF,EACD,cAAC6pJ,GAAD,CAA0BlvJ,IAAK27D,EAA/B,SACI,cAACszF,GAAD,CACIxzF,aApfL,GAqfKC,UAAWu0F,EAAWA,EAAS37I,OAAS,EACxCR,WACIs8I,EACMv/E,EACAo/E,GAAYA,EAAS37I,OAE/BunD,cAAezhC,EACfuhC,cAAeA,EATnB,SAWI,eAAC2yB,GAAD,WACI,cAAC,GAAD,UACKiiE,GACGA,EAAe3tJ,KACX,SAACxI,GAAqB,IAAD,MACjB,OACIA,EAAKgH,KAAOivJ,EAAajvJ,GAGrB,cAAC,GAAD,CAEIhH,KAAMi2J,EACN3C,QACI4C,EAEJ3C,yBACIA,EAEJ3I,kBACIA,EAEJvF,aACIA,EAEJwF,kBACIA,EAEJC,sBACIA,EAEJC,mBACIA,EAEJC,2BACIA,EAEJC,wBACIA,EAEJE,qBACIA,EAEJD,kBACIA,EAEJO,eACIA,EAEJhgJ,SAAQ,UAAKA,EAAL,UAtCHzL,EAAKgH,IA2ClB,eAACiuJ,GAAD,CAEIC,QACIl1J,EAAKgH,KACLivJ,EAAajvJ,GAEjByE,SAAQ,UAAKA,EAAL,QANZ,UAQI,cAAC,GAAD,CACIzL,KAAMA,EACNo2G,cACIA,EAEJs/C,gBACIA,EAEJjqJ,SAAQ,UAAKA,EAAL,mBAEZ,cAAC,GAAD,CACIzF,MAAO,GADX,SAGKhG,EAAKkmC,WACF,cAAC6uH,GAAD,CACI5K,SACInqJ,EAAK6wJ,gBACL7wJ,EAAK21J,sBACJ31J,EAAKkmC,YACLlmC,EAAKomC,WACLpmC,EAAKlI,QACLkI,EAAKqhC,OAEV34B,YAAA,UAAc+C,EAAd,mBATJ,SAYQzL,EAAKkmC,cAKrB,cAAC,KAAD,CAAWlgC,MAAO,GAAlB,SACKhG,EAAKomC,UACF,cAAC2uH,GAAD,CACI5K,SACInqJ,EAAK6wJ,gBACL7wJ,EAAK21J,sBACJ31J,EAAKkmC,YACLlmC,EAAKomC,WACLpmC,EAAKlI,QACLkI,EAAKqhC,OAEV34B,YAAA,UAAc+C,EAAd,kBATJ,SAYQzL,EAAKomC,aAKrB,cAAC,KAAD,CAAWpgC,MAAO,GAAlB,SACKhG,EAAKlI,OACF,cAACi9J,GAAD,CACI5K,SACInqJ,EAAK6wJ,gBACL7wJ,EAAK21J,sBACJ31J,EAAKkmC,YACLlmC,EAAKomC,WACLpmC,EAAKlI,QACLkI,EAAKqhC,OAEV34B,YAAA,UAAc+C,EAAd,cATJ,SAYQzL,EAAKlI,UAKrB,cAAC,KAAD,CAAWkO,MAAO,GAAlB,SACI,sBAAM0C,YAAA,UAAc+C,EAAd,aAAN,WACOzL,EAAKqhC,QACJo1H,EACIz2J,EAAKqhC,YAIrB,cAAC,KAAD,CACIo2B,sBAAqB,UAACz3D,EAAKutJ,eAAN,aAAC,EAAcrzI,QACpClU,MAAO,GAFX,SAGQ,sBAAM0C,YAAA,UAAc+C,EAAd,cAAN,SACKzL,EAAKutJ,WACJvtJ,EAAKutJ,QACFrzI,QAFJ,UAIGla,EAAKutJ,QACArzI,OALR,YAOGla,EAAKutJ,QACArzI,OACL,EACM,QACA,YAItB,cAAC,KAAD,CACIu9C,sBAAqB,UAACz3D,EAAK0/B,qBAAN,aAAC,EAAoBxlB,QAC1ClU,MAAO,GAFX,SAGQ,sBAAM0C,YAAA,UAAc+C,EAAd,qBAAN,SACKzL,EAAK0/B,eACF1/B,EACK0/B,cACAxlB,QAHR,UAKOla,EACK0/B,cACAxlB,OAPZ,YASOla,EACK0/B,cACAxlB,OACL,EACM,eACA,mBAI1B,cAAC,KAAD,CACIu9C,sBAAqB,UAACz3D,EAAKod,gBAAN,aAAC,EAAelD,QACrClU,MAAO,GAFX,SAGQ,sBAAM0C,YAAA,UAAc+C,EAAd,eAAN,SACKzL,EAAKod,UACFpd,EAAKod,SACAlD,QAFR,UAIOla,EACKod,SACAlD,OANZ,YAQOla,EACKod,SACAlD,OACL,EACM,SACA,aAI1B,eAAC,KAAD,CAAWlU,MAAO,EAAlB,UACI,cAACmvJ,GAAD,IACA,eAACH,GAAD,WACI,cAAC,GAAD,CACIrpJ,QAAS,kBACL3L,GACA81J,EACI91J,IAGR0I,YAAA,UAAc+C,EAAd,aAPJ,SASI,cAAC,GAAD,MAEJ,cAAC,GAAD,CACIE,QAAS,kBACL3L,EAAKgH,IACL+uJ,EACI/1J,EAAKgH,KAGb0B,YAAA,UAAc+C,EAAd,eAPJ,SASI,cAACghE,GAAA,EAAD,cAzKPzsE,EAAKgH,SAkLjCmvJ,GAA4C,IAA1BA,EAAej8I,QAC9B,cAAC,GAAD,UACKo+E,EACG,cAAC,GAAD,CACIltF,KAAMqjB,KACNyoI,cAAc,QACdzrJ,SAAS,iBAHb,4BAOA8sF,EACA,cAAC,GAAD,CACIntF,KAAMugI,GACN3lI,MAAM,QACNyF,SAAS,oBAHb,kDAQA,sBC/wBtCgpC,GAAcltC,IAAOC,IAAV,6FAMXihD,GAAgBlhD,IAAOC,IAAV,uIAObmtC,GAAoBptC,IAAOC,IAAV,2JAEV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAOnC+8D,GAAiBxhD,IAAOC,IAAV,iDAIdotC,GAAgBrtC,IAAOC,IAAV,4JAQbwhD,GAAczhD,YAAOokB,KAAPpkB,CAAH,oHACE,SAAAE,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAEtB,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAC9C,SAAA2Z,GAAK,QACDA,EAAM0iJ,UAAR,4BAAyC1iJ,EAAMI,MAAMpc,OAAOW,WAG9D68D,GAAuB1hD,IAAOC,IAAV,uDAIpB2vJ,GAAqB5vJ,IAAOC,IAAV,yQACL,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAOjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAK5BgrK,GAKR,SAAC,GAA+C,IAA7CC,EAA4C,EAA5CA,SAAUz5D,EAAkC,EAAlCA,UAAWjvC,EAAuB,EAAvBA,QAASp3B,EAAc,EAAdA,QAAc,EACtB7M,mBAAS,IADa,mBACzChf,EADyC,KAClC4rJ,EADkC,OAEtB5sI,mBAAS,IAFa,mBAEzCvjB,EAFyC,KAElCowJ,EAFkC,OAGN7sI,oBAAS,GAHH,mBAGzC8sI,EAHyC,KAG1BC,EAH0B,KAI1CC,E7D0DiC,WACvC,IAAM9uJ,EAAWO,cACXwuJ,EAAmBn4J,cACzB,OAAOjI,uBACH,SAACyD,EAAcyE,GAEX,OADAmJ,EAASgyC,gBACF+8G,EAAiB38J,EAAMyE,GACzBozB,MAAK,SAACma,GAIH,OAHApkC,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,kBAErCv8D,KAEVja,OAAM,SAAC5rB,GAEJ,OADAyB,EAASwiC,aAAwBjkC,EAAMgB,UAChChB,OAGnB,CAACyB,EAAU+uJ,I6D5EkBC,GAC3Bz4I,EAAUW,cAOVsmF,EAAe7uG,uBAAY,YACxB8/J,GAAaA,IAAaA,EAASn9I,SAExCu9I,GAAiB,GACjBC,EACIhsJ,EACA2rJ,EAAS7uJ,KAAI,SAAAxI,GAAI,YAAK,CAClBkmC,UAAWlmC,EAAKkmC,UAAYlmC,EAAKkmC,UAAU/uC,WAAa,GACxDivC,SAAUpmC,EAAKomC,SAAWpmC,EAAKomC,SAASjvC,WAAa,GACrDW,MAAOkI,EAAKlI,MAAQkI,EAAKlI,MAAQ,GACjCupC,OAAQrhC,EAAKqhC,OAASrhC,EAAKqhC,OAAS,KACpCjkB,SAAUpd,EAAKod,SACfsiB,cAAa,UAAE1/B,EAAK0/B,qBAAP,QAAwB,GACrC6tH,QAASvtJ,EAAKutJ,aAEpB16H,MAAK,SAACn5B,GACAA,GAAQA,EAAKwyC,WAAgC,MAAnBxyC,EAAKwyC,WAC/BqrH,EAAS,gCACTE,GAAiB,IACV/9J,EAAKsN,IACZuwJ,EAAS,IACT35D,IACA79E,YACIZ,EACAruB,IAAO8B,aAAaC,SAASqE,QAAQ,WAAYwC,EAAKsN,OAG1DuwJ,EAAS,IACT5oG,EAAQ,+BACR8oG,GAAiB,UAG1B,CACCJ,EACAK,EACAhsJ,EACAkyF,EACAz+E,EACAwvC,IAGJ,OACI,eAAC5Z,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aACtClrB,SAAS,gBAFb,UAII,cAAC,GAAD,CAAa/C,YAAU,sBAAvB,2BAGA,eAAC,GAAD,WACI,cAAC,GAAD,CAAmBA,YAAU,4BAA7B,uFAIA,cAACqgD,GAAD,UACI,cAACE,GAAD,UACI,cAAC,GAAD,CACI1mD,KAAK,OACLvH,KAAK,QACLg4D,aAAa,YACb5lD,MAAO1B,EACP8lD,YAAY,cACZuB,kBAAkB,OAClB6N,gBAAiB,IACjB3zC,UAAW,IACXhnB,OAAO,OACPonB,aAAc,SAACT,GAxEb,IAACxf,KAyEmBwf,EAAEgwB,OAAOxvC,OAxEzC8M,OAAS,KACnBo9I,EAASlqJ,GACTmqJ,EAAS,MAwEWpN,WAAYhjJ,EACZsE,SAAS,4BAIpBtE,GACG,cAACgwJ,GAAD,CAAoBzuJ,YAAU,4BAA9B,SACKvB,IAGT,eAAC,GAAD,WACI,cAAC,IAAD,CACInB,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRnvB,QAAQ,UACRqD,SAAS,uBALb,oBASA,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQokG,EACRj7F,UAAWO,EACXZ,oBAAqBtf,IAAUC,OAAOQ,WACtCqf,QAASksJ,EACT/rJ,SAAS,qBAPb,4BCzJPosJ,GAAgC59H,IAAM/tB,eAC/C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS+wJ,KACZ,OAAOj3I,YAAY1U,qBAAW0rJ,K,qCCAnB3lD,GA5BQvsG,sBACnB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,eAAeC,SAAS,UAAhC,SACI,mBAAGD,KAAK,gBAAR,SACI,4BACI,sBACIC,SAAS,UACTC,EAAE,yuBACF4zB,UAAU,uDCa3Bq9H,GA/BYpyJ,sBACvB,WAAgBC,GAAQ,EAArBC,UACC,OACI,qBACID,IAAKA,EACLM,MAAM,6BACNF,MAAM,KACNC,OAAO,KACPF,QAAQ,YALZ,SAOI,mBAAGa,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,UAAR,SACI,8BACI,sBACIC,SAAS,UACTC,EAAE,uGACF4zB,UAAU,+CAEd,sBACIF,OAAO,UACP1zB,EAAE,uCACF4zB,UAAU,gFClBpCs6H,GAAiBztJ,IAAOC,IAAV,iKASdwwJ,GAAiBzwJ,IAAOC,IAAV,gIAGP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAInCosK,GAAoB1wJ,IAAOC,IAAV,4EAKjB0wJ,GAAiB3wJ,IAAOC,IAAV,oFAGP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAGnCssK,GAAkB5wJ,IAAOC,IAAV,+OACR,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAO3B,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAsB1BusK,GAlB+B,SAAC,GAAkB,IAAhB3sJ,EAAe,EAAfA,SAC7C,OACI,eAAC,GAAD,WACI,cAACusJ,GAAD,UACI,cAAC,GAAD,MAEJ,eAACC,GAAD,WACI,cAACC,GAAD,UACI,cAAC,GAAD,MAEJ,cAACC,GAAD,CAAiBzvJ,YAAW+C,EAA5B,2ECrDD,SAAS4sJ,GAAY5/H,EAAaz2B,GAC7C6oB,qBAAU,WACN,SAASytI,EAAQ1rI,GACTA,EAAE6L,MAAQA,GAAKz2B,GAAUA,IAGjC,OADAkmC,OAAO6Z,iBAAiB,QAASu2G,GAC1B,kBAAMpwH,OAAOga,oBAAoB,QAASo2G,MAClD,CAACt2J,EAAQy2B,I,yCCKV8/H,GAAahxJ,IAAOC,IAAV,wMAOE,SAAAC,GAAK,OAAI6sC,aAAK7sC,EAAMI,MAAMpc,OAAOgB,KAAM,OAKnD+rK,GAAQjxJ,YAAO8sC,KAAO7sC,IAAdD,CAAH,gaAEE,SAAAE,GAAK,OAAOA,EAAMzB,MAAQyB,EAAMzB,MAAQ,SAInC,SAAAyB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAKrB,SAAA2Z,GAAK,OAAIA,EAAMI,MAAM1X,YAAYM,gBAO7CgoK,GAIR,SAAC,GAA6C,IAA3CxtJ,EAA0C,EAA1CA,SAAUssB,EAAgC,EAAhCA,QAAS1xB,EAAuB,EAAvBA,UAAWG,EAAY,EAAZA,MAC5B0yJ,EAAenhK,uBAAY,SAACq1B,GAC9BA,EAAEC,oBACH,IAEG8rI,EAAiBphK,uBAAY,WAC3BggC,GAASA,MACd,CAACA,IACEsqC,EAAUr8C,mBAAQ,iBAAO,CAAEmzI,oBAAmB,CAACA,IAErD,OACI,cAACJ,GAAD,CAAY5sJ,QAASgtJ,EAAgBjwJ,YAAU,mBAA/C,SACI,cAAC8vJ,GAAD,CAAO7sJ,QAAS+sJ,EAAc7yJ,UAAWA,EAAWG,MAAOA,EAA3D,SACI,cAAC4yJ,GAAiBpjF,SAAlB,CAA2BpoE,MAAOy0D,EAAlC,SACK52D,SAiBR4tJ,GAAkD,SAAC,GASzD,IARHC,EAQE,EARFA,UACAC,EAOE,EAPFA,eACAC,EAME,EANFA,gBACAC,EAKE,EALFA,sBACAhuJ,EAIE,EAJFA,SACApF,EAGE,EAHFA,UACAqzJ,EAEE,EAFFA,kBACAlzJ,EACE,EADFA,MAEMmZ,EAAUW,cACVrW,EAAclS,uBAAY,WACxByhK,EACAC,GAAyBA,IAErBF,EAAgB55I,EAAQq0G,SACvBr0G,EAAQjoB,QAAQ4hK,KAE1B,CACC35I,EACA45I,EACAD,EACAE,EACAC,IAGJ,OACI,cAAC,GAAD,CACI1hI,QAAS2hI,GAAqBzvJ,EAC9B5D,UAAWA,EACXG,MAAOA,EAHX,SAKKiF,KAKA2tJ,GAAmB1sJ,wBAA2C,IAM5D2sJ,I,iCAAAA,MCxHR,IAAM/kC,GAAkBvsH,IAAOC,IAAV,0PAWfi2H,GAAel2H,IAAOC,IAAV,qPAWZ2xJ,GAAqB5xJ,IAAOC,IAAV,sDAIlB4xJ,GAAe7xJ,IAAOC,IAAV,oJAQZ6xJ,GAAsB9xJ,IAAOC,IAAV,4EAKnB8xJ,GAAoB/xJ,IAAOC,IAAV,mPAYjBihD,GAAgBlhD,IAAOC,IAAV,6KAQb+xJ,GAAoBhyJ,IAAOC,IAAV,8EAKjBs8B,GAAUv8B,IAAOw8B,GAAV,mKASPy1H,GAA6BjyJ,IAAOC,IAAV,yQACpB,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAWjC83D,GAAwBphD,IAAOC,IAAV,uDCvErBiyJ,GAA2Cx/H,IAAM/tB,eAE5D,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS2yJ,KACZ,OAAO74I,YAAY1U,qBAAWstJ,KAa3B,IAAME,GAAoC1/H,IAAM/tB,eAErD,WACE,MAAM,IAAInF,MAAM,sBAiBb,IAAM6yJ,GAAuC3/H,IAAM/tB,eAExD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS8yJ,KACZ,OAAOh5I,YAAY1U,qBAAWytJ,KC5D3B,I,2BAAME,GAAQn0J,sBACjB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBAAM6wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yzCAAyzCF,KAAK,sBCXj3CmzJ,GAAkBxyJ,YAAO8sC,KAAO7sC,IAAdD,CAAH,qQAQb,SAAAE,GAAK,OAAIA,EAAM+rF,QAAU,SACtBl/C,aAAK,UAAW,KAOrB0lH,GAAiBzyJ,YAAO8sC,KAAO7sC,IAAdD,CAAH,kQAGd,SAAAE,GAAK,OAAIA,EAAMzB,OAAS,SAUxBi0J,GAAc1yJ,IAAOC,IAAV,sMASX0yJ,GAAa3yJ,IAAOC,IAAV,8IAOV2yJ,GAAiB5yJ,IAAOC,IAAV,6LCGZ4yJ,GAvCqC,SAAA3yJ,GAAU,IAEtDiE,EASAjE,EATAiE,MACA2uJ,EAQA5yJ,EARA4yJ,WACAC,EAOA7yJ,EAPA6yJ,aACAt0J,EAMAyB,EANAzB,MACAuxB,EAKA9vB,EALA8vB,QACAtsB,EAIAxD,EAJAwD,SACAQ,EAGAhE,EAHAgE,SACA+nF,EAEA/rF,EAFA+rF,OACA+mE,EACA9yJ,EADA8yJ,UAEE9kH,EAAYlN,SAASmN,cAAc,QAEzC,OAAOI,uBACH,cAACikH,GAAD,CAAiBvmE,OAAQA,EAAzB,SACI,eAACwmE,GAAD,CACIjkH,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBhwC,MAAOA,EACP0C,YAAW+C,EAJf,WAMM8uJ,GAAa,eAACN,GAAD,WACVvuJ,EACG,cAACwuJ,GAAD,CAAYhvJ,MAAOmvJ,EAAY3xJ,YAAW+C,GAAQ,UAAOA,EAAP,UAAlD,SACKC,IAEL4uJ,EACJ,cAACH,GAAD,CAAgBxuJ,QAAS4rB,EAAS7uB,YAAW+C,GAAQ,UAAOA,EAAP,UAArD,SACI,cAACquJ,GAAD,SAGP7uJ,OAGTwqC,IC9CK3nB,GAAYvmB,IAAOC,IAAV,uDAITylG,GAAc1lG,IAAOC,IAAV,8GAMXgzJ,GAAWjzJ,IAAOC,IAAV,qIAORu0C,GAASx0C,IAAOC,IAAV,yICqCJizJ,OA9Cf,YAQoC,IAPhC/uJ,EAO+B,EAP/BA,MACAukC,EAM+B,EAN/BA,YACAyqH,EAK+B,EAL/BA,SACA10J,EAI+B,EAJ/BA,MACAuxB,EAG+B,EAH/BA,QACAojI,EAE+B,EAF/BA,oBACAC,EAC+B,EAD/BA,qBAEA,OACI,cAAC,GAAD,CACIlvJ,MAAOA,EACP1F,MAAOA,EACPq0J,WAAY,CAAC1jI,QAAS,YAAazsB,SAAU,QAC7CqtB,QAASA,EACT9rB,SAAS,gBALb,SAOI,eAAC,GAAD,WACI,cAAC,GAAD,CAAa/C,YAAU,4BAAvB,SAAoDunC,IACpD,eAACuqH,GAAD,WACI,sBAAM9xJ,YAAU,iBAAhB,0BADJ,OAEI,mBAAGA,YAAU,kBAAb,wBAFJ,OAGI,sBAAMA,YAAU,iBAAhB,SAAkCgyJ,OAEtC,eAAC,GAAD,WACI,cAAC,IAAD,CACI14J,OAAQ24J,EACR3vJ,MAAM,qBACNhF,MAAM,QACNC,OAAO,OACPmC,QAAQ,UACRqD,SAAS,8BAEb,cAAC,IAAD,CACIzJ,OAAQ44J,EACR5vJ,MAAM,uBACNhF,MAAM,QACNC,OAAO,OACPwF,SAAS,yCCPlBovJ,OA/Bf,YAEgC,IAD5BnvJ,EAC2B,EAD3BA,MAAOukC,EACoB,EADpBA,YAAayqH,EACO,EADPA,SAAU10J,EACH,EADGA,MAAOuxB,EACV,EADUA,QAE/BpY,EAAUW,cACV3Q,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MAEtB+4H,EAA0BvjK,uBAAY,WACxC4nB,EAAQH,KAAKluB,IAAOsE,eACrB,CAAC+pB,IAEE47I,EAA2BxjK,uBAAY,WACpC4X,GAAY6yB,GACjB0nF,GAAU,4CAAD,OACuCv6G,EAAQ+2B,UAD/C,YAC4D/2B,EAAQi3B,SADpE,eACmFpE,EAAQhnC,SAErG,CAACgnC,EAAS7yB,IAEb,OACI,cAAC,GAAD,CACIzD,MAAOA,EACPukC,YAAaA,EACbyqH,SAAUA,EACV10J,MAAOA,EACPuxB,QAASA,EACTojI,oBAAqBG,EACrBF,qBAAsBG,KCbnBC,OAnBf,YAE+B,IAD3BzjI,EAC0B,EAD1BA,QAEM0jI,EAAYpB,KAA2BngK,KAE7C,OAAKuhK,EAGD,cAAC,GAAD,CACIvvJ,MAAM,6BACNukC,YAAa,8FAAwD,mBAAGvnC,YAAU,mBAAb,SAAiCuyJ,EAAUhhK,QAAnG,mGAA6M,uBAA7M,yEAEbygK,SAAS,gGACT10J,MAAO,IACPuxB,QAASA,IATM,8BCeZ2jI,I,MAAAA,GApBf,YAEqC,IADjC3jI,EACgC,EADhCA,QAEM0jI,EAAYpB,KAA2BngK,KAE7C,OAAKuhK,EAGD,cAAC,GAAD,CACIvvJ,MAAM,4CACNukC,YAAa,wKAAkI,8BAAG,sBAAMvnC,YAAU,mBAAhB,SAAoCuyJ,EAAUhhK,QAAjD,qBAAlI,uBAAuO,mBAAGyO,YAAU,uBAAb,SAAqCuyJ,EAAU7uB,QAAtR,IAAiS,uBAAjS,4IACgH,uBADhH,yEAGbsuB,SAAS,gGACT10J,MAAO,IACPuxB,QAASA,IAVM,8BCmBZ4jI,GAzBKx1J,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,mBAAG2wD,YAAU,mBAAb,SACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,ixEAAixEF,KAAK,mBAE10E,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BClB/BixD,GAAOxwD,IAAOC,IAAV,0KASJ4zJ,GAAa7zJ,IAAOC,IAAV,+IC0BR6zJ,OAjCf,YAMmC,IAL/BJ,EAK8B,EAL9BA,UACAK,EAI8B,EAJ9BA,cACAC,EAG8B,EAH9BA,mBACArwJ,EAE8B,EAF9BA,MACAswJ,EAC8B,EAD9BA,gBAEA,OACI,cAACzjG,GAAD,CAAM7sD,MAAOA,EAAb,UACc,OAAT+vJ,QAAS,IAATA,OAAA,EAAAA,EAAWhhK,OACR,qCACA,uBAAMyO,YAAU,kBAAhB,UACI,sBAAMA,YAAU,mBAAhB,SAAoCuyJ,EAAU7uB,QADlD,aAGI,sBAAM1jI,YAAU,mBAAhB,SAAoCuyJ,EAAUhhK,QAHlD,uCAMCshK,GACG,cAACH,GAAD,CACIzvJ,QAAS6vJ,EACT9yJ,YAAU,6BAFd,SAII,cAAC,GAAD,SAIP4yJ,GACD,sBAAM5yJ,YAAU,kBAAhB,yCCWD+yJ,ICvCH3rJ,GDuCG2rJ,GAlCf,YAK+B,IAJ3B3gK,EAI0B,EAJ1BA,UACAwgK,EAG0B,EAH1BA,cACAC,EAE0B,EAF1BA,mBACArwJ,EAC0B,EAD1BA,MAEMwwJ,EAAiB7B,KACjB8B,EAAsB70C,KACtB3nG,EAAUW,cAOV87I,EAAqBrkK,uBAAY,WACnCwoB,YAAUZ,EAASruB,IAAOyB,iBAAiBG,cAC5C,CAACysB,IAMJ,OAJA0L,qBAAU,WACN8wI,EAAoB7gK,KACrB,CAACA,EAAW6gK,IAGX,cAAC,GAAD,CACIV,UAAWS,EAAehiK,KAC1B4hK,cAAeA,EACfC,mBAAoBA,EACpBrwJ,MAAOA,EACPswJ,gBAAiBI,KE0DvB/0D,GAAmBriD,WAAaqhD,MAAiB,CACnD/tG,MAAOguG,IAAWhuG,MAAM+oC,OACxBqF,UAAW4/D,IAAW5/D,UACtBE,SAAU0/D,IAAW1/D,WAMnBumF,GAqCD,SAAC,GAmBC,IAAD,UAlBFltH,EAkBE,EAlBFA,MACA02B,EAiBE,EAjBFA,YACA7qB,EAgBE,EAhBFA,QACAxU,EAeE,EAfFA,OACAkrC,EAcE,EAdFA,QACA65H,EAaE,EAbFA,sBACAC,EAYE,EAZFA,iBACAC,EAWE,EAXFA,iBACAC,EAUE,EAVFA,kCACAC,EASE,EATFA,gBACAC,EAQE,EARFA,eACAC,EAOE,EAPFA,wBACAC,EAME,EANFA,kBACAC,EAKE,EALFA,kBACAC,EAIE,EAJFA,kBACAC,EAGE,EAHFA,4BACAC,EAEE,EAFFA,eACAb,EACE,EADFA,oBAEMtiJ,EAAcnQ,cACdiW,EAAUW,cAChB+wB,YAAiB,2BAEjB,IACM4rH,EADsB/vI,iBAAiB,IACA4K,QAC/BiyH,EAAiBf,KAAvB9uJ,KACFgjK,EAAa,OAAGnT,QAAH,IAAGA,GAAH,UAAGA,EAAc9vI,aAAjB,iBAAG,EAAqBqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK8iI,oBAA1C,aAAG,EAAmDz2I,GARvE,EAUsD0jB,oBAAS,GAV/D,mBAUKiyI,EAVL,KAU2BC,EAV3B,OAWkElyI,oBAAS,GAX3E,mBAWKmyI,EAXL,KAWiCC,EAXjC,KAaI52D,EAAejsE,IAAMywG,YAbzB,EAcgDhgH,oBAAS,GAdzD,mBAcKqyI,EAdL,KAcwBC,GAdxB,QAekDtyI,oBAAS,GAf3D,qBAeKuyI,GAfL,MAeyBC,GAfzB,SAgBsCxyI,oBAAS,GAhB/C,qBAgBK8gI,GAhBL,MAgBmB2R,GAhBnB,SAiBsCzyI,mBAAsB,MAjB5D,qBAiBK0yI,GAjBL,MAiBmBC,GAjBnB,SAmBE3yI,mBAAsB,MAnBxB,qBAkBK4yI,GAlBL,MAkB4BC,GAlB5B,MAqBIvH,GA/EW,QA+EIl/J,EAAO6I,QACtBwP,GAAU0R,YAAY3R,MACtBu8I,GAAiB/9I,aAAY,OAACyB,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,MAE7CwiK,GAA4B,CAC9Bx2J,GAAI,GACJlP,MAAO,GACPouC,UAAW,GACXE,SAAU,GACVhpB,SAAU,GACVsiB,cAAe,GACf6tH,QAAS,GACTlsH,OAAQ,MAINo8H,GADYr1C,KACW7iE,KAAK7qC,QAC9B,SAAAnf,GAAI,OAAIA,EAAKP,OAAS4R,KAAWE,QACnC,GAvCA,GA0C4B4d,mBAAoB8yI,IA1ChD,qBA0CKE,GA1CL,MA0CcC,GA1Cd,SA4CoCjzI,mBAAwB,MA5C5D,qBA4CKkzI,GA5CL,MA4CkBC,GA5ClB,SA6CkDnzI,mBAElD,IA/CA,qBA6CKozI,GA7CL,MA6CyBC,GA7CzB,SAgDsCrzI,mBAAmB,IAhDzD,qBAgDKszI,GAhDL,MAgDmBC,GAhDnB,SAiDwCvzI,mBAAmB,IAjD3D,qBAiDKwzI,GAjDL,MAiDoBC,GAjDpB,SAkDoCzzI,oBAAS,GAlD7C,qBAkDK8mD,GAlDL,MAkDkBuhE,GAlDlB,MAoDIqrB,GAAyB,SAAC5oI,GAC5B2oI,GAAiB3oI,IAGf6oI,GAA0B9mK,uBAC5B,SAACgE,GACGsiK,GAAetiK,KAEnB,CAACsiK,KAGCS,GAA8B,SAChC3hK,GAEAohK,GAAsBphK,IAGpB4hK,GAAwB,SAACn7J,GAC3B66J,GAAgB76J,IAtElB,GA0EsCsnB,mBAAoB8yI,IA1E1D,qBA0EKvH,GA1EL,MA0EmBC,GA1EnB,SA2E8CxrI,mBAC5C,MA5EF,qBA2EK8zI,GA3EL,MA2EuBC,GA3EvB,SA8E4D/zI,mBAE5D,IAhFA,qBA8EKugI,GA9EL,MA8E8BD,GA9E9B,SAiFgDtgI,mBAAmB,IAjFnE,qBAiFKwgI,GAjFL,MAiFwBC,GAjFxB,SAkFkDzgI,mBAAmB,IAlFrE,qBAkFKqgI,GAlFL,MAkFyBD,GAlFzB,MAuFI4T,GAA+BnnK,uBACjC,SAACgE,GACGkjK,GAAoBljK,KAExB,CAACkjK,KAaCr6J,GAAasJ,aAAY,OAACyB,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,MAC/C6vB,qBAAU,YACQ,OAAV4yI,SAAU,IAAVA,QAAA,EAAAA,GAAYz2J,KAAM5C,KAClBy5J,GAAeJ,GAAWz2J,IAC1By3J,GAAoBhB,GAAWz2J,OAEpC,CAACy2J,GAAYr5J,KA9Gd,OAiH0CsmB,mBAAmB,IAjH7D,qBAiHKi0I,GAjHL,MAiHqBC,GAjHrB,SAmH8Cl0I,mBAAmB,IAnHjE,qBAmHKm0I,GAnHL,MAmHuBC,GAnHvB,MAyHIC,GAAiC,yCAAG,WACtCpiJ,EACAm+H,EACA14H,EACAq7C,EACAwvF,EACAC,EACA7rH,GAPsC,kBAAA7nB,EAAA,0DASlCw8I,GATkC,uBAU5B/7J,EAAQu3E,GAAW,OAAG/xE,QAAH,IAAGA,OAAH,EAAGA,EAAOia,WAAV,OAAuBhhB,SAAvB,IAAuBA,QAAvB,EAAuBA,GAAcuB,MAV5B,kBAY3BsiK,EAA4BzlK,EAAO6I,QAAS,CAC/Cq/J,QAASL,GACTvhJ,SAAUT,EACV0kB,OAAQoqH,GAAiB,KAAOpqH,EAChC4J,gBAAiB6vG,EACjBp7G,cAAetd,EACf68I,qBAAsBxhG,EACtB8vF,QAASN,EACTviH,eAAgBwiH,EAChB9wJ,UAAWo1E,GACXn1E,OAAO,6BAAM3D,IAAP,IAAqBuB,YAE1B44B,MAAK,WACFqsI,KACA,IAAMt+G,GACD4wB,GAAW,OACN/xE,QADM,IACNA,OADM,EACNA,EAAOia,WACPilJ,GAAezkJ,SAAW,EAUpC,OARAb,EAAY,YAAD,OAEHunC,EAAQ,EAAI,OAAS,MAFlB,2BAGYA,EAHZ,YAIHA,EAAQ,EAAI,QAAU,QAE1B,YAEG,KAEV7tB,OAAM,WACH,OAAO,MA1CmB,cA6C9BosI,EAAgB9O,GAAa,aAAOA,IAAiB,GAErD1zI,EAAezC,OAAS,IACxBilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMo4J,EAAoB,IAAIviJ,IAAJ,uBACnB7c,EAAKod,UADc,aAEnBT,KAEP,OAAO,6BACA3c,GADP,IAEIod,SAAU9U,MAAMyU,KAAKqiJ,KAGzB,OAAOp/J,MAKf86I,EAAc5gI,OAAS,IACvBilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMo4J,EAAoBp/J,EAAKod,SAAS1C,QACpC,SAAA1T,GAAE,OAAK8zI,EAAc7hI,SAASjS,MAElC,OAAO,6BACAhH,GADP,IAEIod,SAAUgiJ,IAGd,OAAOp/J,MAKfoiB,EAAoBlI,OAAS,IAC7BilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMq4J,EAAyBC,KAAO,GAAD,oBAC7Bl9I,GAD6B,aACLpiB,EAAK0/B,iBACjC,SAAApiC,GAAU,OAAIA,EAAWT,gBAG7B,OAAO,6BACAmD,GADP,IAEI0/B,cAAe2/H,EACfjuJ,YAAaiuJ,IAGjB,OAAOr/J,MAKfy9D,EAAmBvjD,OAAS,IAC5BilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMq4J,EACFr/J,EAAK0/B,cAAchlB,QACf,SAAA1T,GAAE,OACGy2D,EAAmBxkD,SAChBjS,EAAGnK,iBAGnB,OAAO,6BACAmD,GADP,IAEI0/B,cAAe2/H,IAGnB,OAAOr/J,MAKfitJ,EAAc/yI,OAAS,IACvBilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMu4J,EAAmB,IAAI1iJ,IAAJ,uBAClB7c,EAAKutJ,SADa,aAElBN,KAEP,OAAO,6BACAjtJ,GADP,IAEIutJ,QAASjlJ,MAAMyU,KAAKwiJ,KAGxB,OAAOv/J,MAKfktJ,EAAahzI,OAAS,IACtBilJ,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,GAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IAAK,CAClC,IAAMu4J,EAAmBv/J,EAAKutJ,QAAQ7yI,QAClC,SAAA1T,GAAE,OAAKkmJ,EAAaj0I,SAASjS,MAEjC,OAAO,6BACAhH,GADP,IAEIutJ,QAASgS,IAGb,OAAOv/J,MAKfqhC,IAAWoqH,KACX0T,EAAgBA,EAAc32J,KAAI,SAAAxI,GAC9B,OAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IACtB,6BACAhH,GADP,IAEIqhC,OAAQA,IAGLrhC,MAInBqZ,EAAY,YAAD,OAEHslJ,GAAezkJ,OAAS,EAAI,OAAS,MAFlC,2BAGYykJ,GAAezkJ,OAH3B,YAIHykJ,GAAezkJ,OAAS,EAAI,QAAU,QAE1C,WAEJ6hJ,EAAiB,6BACVt8J,GADS,IAEZga,MAAO0lJ,KA9KuB,mBAgL3B,GAhL2B,4CAAH,kEAzHrC,GA8SoCz0I,mBAAmB,IA9SvD,qBA8SKwlI,GA9SL,MA8SkBC,GA9SlB,SA8TgDzlI,mBAR9C,CACAtwB,WAAY,GACZgjB,SAAU,GACVsiB,cAAe,GACfG,QAAS,GACT0tH,QAAS,KA3TX,qBA8TKiS,GA9TL,MA8TwBC,GA9TxB,SAiUsC/0I,mBAAiB,GAjUvD,qBAiUKuhH,GAjUL,MAiUmByzB,GAjUnB,MAmUIC,GAA6Bj9C,GAAa88C,IAC1CI,GAAiBl9C,GAAajjH,GApUlC,GAqUkCirB,mBAElCjrB,GAASA,GAvUT,qBAqUKowJ,GArUL,MAqUiBgQ,GArUjB,MAyUFh1I,qBAAU,WACFprB,GACAogK,GAAcpgK,KAEnB,CAACA,IAEJorB,qBAAU,WACN,IAAK80I,IAA8BC,MAAoB5J,GAAc,CACjE,IAAI8J,EACArgK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,GAsCzC,GArCI+lJ,GAAkB3/H,QAAQ3lB,OAAS,IACnC4lJ,EAAeA,EAAaplJ,QAAO,SAAA1a,GAC/B,OACIA,EAAKqhC,QACLm+H,GAAkB3/H,QAAQ5mB,SAASjZ,EAAKqhC,YAKhDm+H,GAAkBpiJ,SAASlD,OAAS,IACpC4lJ,EAAeA,EAAaplJ,QAAO,SAAA1a,GAC/B,OAAOw/J,GAAkBpiJ,SAAShB,MAC9B,SAAApV,GAAE,OAAIhH,EAAKod,SAAS2B,QAAQ/X,IAAO,SAK3Cw4J,GAAkB9/H,cAAcxlB,OAAS,IACzC4lJ,EAAeA,EAAaplJ,QAAO,SAAA1a,GAC/B,OAAOw/J,GAAkB9/H,cAActjB,MAEnC,SAAApV,GAAE,OACEhH,EAAK0/B,cAActjB,MACf,SAAAhW,GAAC,OAAIA,EAAEvJ,eAAiBmK,YAMxCw4J,GAAkBjS,QAAQrzI,OAAS,IACnC4lJ,EAAeA,EAAaplJ,QAAO,SAAA1a,GAC/B,OAAOw/J,GAAkBjS,QAAQnxI,MAC7B,SAAApV,GAAE,OAAIhH,EAAKutJ,QAAQxuI,QAAQ/X,IAAO,SAK1Cw4J,GAAkBplK,WAAW8f,OAAS,EAAG,CACzC,IAAM6lJ,EAAoBn/H,aACtB4+H,GAAkBplK,YACpByT,cACImyJ,EAAgB,IAAIr/H,OAAOo/H,GAE3BE,EAAuB,IAAIt/H,OAC7BC,aACI4+H,GAAkBplK,WAAWymC,QAC/BhzB,eAGNiyJ,EAAeA,EAAaplJ,QAAO,SAAA1a,GAAS,IAAD,EACvC,OACKA,EAAKkmC,WACF85H,EAAcl/H,KAAK9gC,EAAKkmC,UAAUr4B,gBACrC7N,EAAKkmC,WACFlmC,EAAKomC,UACL65H,EAAqBn/H,KACjB,UAAG9gC,EAAKkmC,UAAR,YAAqBlmC,EAAKomC,UACrBvF,OACAhzB,gBAEZ7N,EAAKomC,UACF45H,EAAcl/H,KAAK9gC,EAAKomC,SAASv4B,gBACpC7N,EAAKlI,OACFkoK,EAAcl/H,KAAd,UAAmB9gC,EAAKlI,aAAxB,aAAmB,EAAY+V,kBAK/CgyJ,IAAc,SAAAp0G,GACV,GAAIA,EACA,OAAO,6BACAA,GADP,IAEIhyC,MAAOqmJ,UAKxB,CACCH,GACA3J,GACA4J,GACAJ,GACAzD,EACAt8J,IAGJ,IAAM4wJ,GAAiB2F,GAEjBv2J,GAASA,EAAMga,MADfo2I,IAAcA,GAAWp2I,MAYzBymJ,GAAgC,yCAAG,WACrC9iJ,EACAsiB,EACA6tH,EACA1tH,GAJqC,UAAArmB,EAAA,6DAMrCkmJ,GACItiJ,EAASlD,OACLqzI,EAAQrzI,OACRwlB,EAAcxlB,OACd2lB,EAAQ3lB,QAGZ87I,IACAx2H,GAAYpiB,GAEZqiB,GAAiBC,EAAcl3B,KAAI,SAAApC,GAAC,OAAIA,EAAEvJ,iBAC1CijC,GAAWytH,GACN9B,IACD9rH,GAAWE,IAGf4/H,IAAqB,SAACh0G,GAClB,OAAO,6BACAA,GADP,IAEI8hG,QAASA,EACTnwI,SAAUA,EACVsiB,cAAeA,EAAcl3B,KAAI,SAAApC,GAAC,OAAIA,EAAEvJ,gBACxCgjC,QAAS4rH,GAAiB,GAAK5rH,OA5BN,mBAgC9B,GAhC8B,2CAAH,4DAmChCvB,GAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,CAAEC,MAAO,yBAA0BC,KAAK,GACjDP,MAxhBe,GAyhBfC,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAhejB,GA4eEkkB,aAAqBC,IARrB5lC,GApeF,GAoeEA,aACAg4B,GAreF,GAqeEA,cACA4O,GAteF,GAseEA,WACAE,GAveF,GAueEA,YACAC,GAxeF,GAweEA,iBACAE,GAzeF,GAyeEA,WACAG,GA1eF,GA0eEA,WACAE,GA3eF,GA2eEA,SAEEolF,GAAwB1C,GAAahqH,IACrCynK,GAAmBz9C,GAAa5rH,EAAO6I,SAEvCu/J,GAA4B3nK,sBAAW,wBAAC,uBAAAiiB,EAAA,+EACnCsiJ,EAAiBhlK,EAAO6I,QAASjH,IAAcm6B,MAClD,SAAAutI,GAGI,OAFA/C,GAAgB,IAAI31I,MACpB61I,GAAyB,MAClB6C,MAL2B,2CAQ3C,CAACtE,EAAkBhlK,EAAO6I,QAASjH,KAEtCmyB,qBAAU,YACDu6F,IAAyB+6C,KAAqBnK,IAC/C8F,EAAiBhlK,EAAO6I,QAASjH,IAAcq6B,MAAM6F,QAAQzxB,SAElE,CACCrQ,EAAO6I,QACPm8J,EACApjK,GACA0sH,GACA+6C,GACAnK,KAGJnrI,qBAAU,WACN,GAAIwlI,GAAe,CACf,IAAMgQ,EAA4BhQ,GAAc7nJ,KAC5C,SAAAxI,GAAI,OAAIA,EAAKgH,MAEbs5J,EAAwB3B,GAAejkJ,QAAO,SAAA9jB,GAAM,OACpDypK,EAAgBpnJ,SAASriB,MAE7BgoK,GACKptF,GAAsC6uF,EAAxBC,MAIxB,CAACjQ,KAEJ,IAAMkQ,GAAqB,WACvB5C,GAAWzkI,KAAKC,MAAMD,KAAKG,UAAUmkI,MAChC/R,IACDoS,GAAe,MAEnBE,GAAsB,IACtBE,GAAgB,IAChBE,GAAiB,KAGfqC,GAAyB,WAC3BtK,GAAgBh9H,KAAKC,MAAMD,KAAKG,UAAUmkI,MACrC/R,IACDgT,GAAoB,MAExBtT,GAAqB,IACrBH,GAA2B,IAC3BF,GAAsB,KA6K1B2V,GAAY,SARa,WACjBv6D,EAAQ5uE,SACJsmI,IACA13D,EAAQ5uE,QAAQ8uE,kBAO5B,IA2HMgqD,GAAsB,SAACl+I,GACzB,IAAMwuJ,EACFjhK,GAASA,EAAMga,MACTha,EAAMga,MAAMiB,QACR,SAAAC,GAAI,OAAKA,EAAKk2I,iBAAmBl2I,EAAKg7I,uBAE1C,GAEViJ,GAAkB1sJ,EAAUwuJ,EAAUl4J,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAAM,IAC7D+rI,IAAe,IAGbud,GAAkB,SAACp+I,GACrB6gI,GAAe7gI,IA91BjB,GAw4B4CwY,mBAAc,IAx4B1D,qBAw4BKolI,GAx4BL,MAw4BsB6Q,GAx4BtB,MA04BF91I,qBAAU,WACN,GAAIprB,GAASA,EAAMga,MAAO,CACtB,IACImnJ,GADcnhK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,IACzBiB,QAC1B,SAAA1a,GAAI,OAAIA,EAAK21J,uBAEjBgL,GAAmBC,EAAcp4J,KAAI,SAAAxI,GAAI,OAAIA,EAAKgH,UAEvD,CAACvH,IAEJ,IA4CMohK,GAA+BtpK,uBAAY,WAAO,IAAD,OAGxC,OAAP4nB,QAAO,IAAPA,GAAA,UAAAA,EAASE,gBAAT,mBAAmBhW,aAAnB,mBAA0BsW,kBAA1B,eAAsCikC,YACtC9yD,IAAOsE,aAEPksD,aAAehR,KAAcK,OAGjCt3B,EAAY,8BAA+B,WAC3CwiJ,MACD,CAAC18I,EAAS08I,EAAuBxiJ,IAM9BynJ,GAA0BvpK,uBAC5B,SAACwpK,GACG,IAD+C,EACzCC,EAA2D,GADlB,eAG5BD,GAH4B,IAG/C,2BAAiC,CAAC,IAAD,EAAtB/gK,EAAsB,QACxBy8J,EAAiBxjJ,SAAjB,UAA0BjZ,EAAKlI,aAA/B,aAA0B,EAAY+V,gBACvCmzJ,EAAwBhiJ,KAAKhf,IALU,8BAQ/C,IAAMihK,EAAkB,OAAGxhK,QAAH,IAAGA,OAAH,EAAGA,EAAOga,MAC7BiB,QACG,SAAA1a,GAAI,OACCghK,EAAwB5kJ,MACrB,SAAAzB,GAAI,OAAIA,EAAK7iB,QAAUkI,EAAKlI,YAGvC0Q,KAAI,SAAAxI,GAAI,aACLy8J,EAAiBxjJ,SAAjB,UAA0BjZ,EAAKlI,aAA/B,aAA0B,EAAY+V,eAAtC,6BACW7N,GADX,IACiB21J,qBAAqB,IAChC31J,KAGT2qC,kBAAQs2H,GAiBTJ,MAhBAG,EAAwB9mJ,OAAS,IAC5B8mJ,EAAwB9mJ,OAAS,EAC5Bb,EAAY,GAAD,cACJ2nJ,QADI,IACJA,OADI,EACJA,EAAyB9mJ,OADrB,4BAEP,WAEJb,EAAY,GAAD,cACJ2nJ,QADI,IACJA,OADI,EACJA,EAAyB9mJ,OADrB,0BAEP,YAGd6hJ,EAAiB,6BACVt8J,GADS,IAEZga,MAAOwnJ,QAMnB,CACIxE,EACAoE,GACA9E,EACA1iJ,EACA5Z,IAUFyhK,GAA+B3pK,uBACjC,SAACwpK,GAA4D,IAAD,IACxD,SACMp2H,kBAAQ8xH,IACLA,EAAiBviJ,SAAW6mJ,EAAa7mJ,QACd,IAAxB6mJ,EAAa7mJ,WAFrB,OAGAza,QAHA,IAGAA,GAHA,UAGAA,EAAOga,aAHP,aAGA,EAAc2C,MAAK,SAAAzB,GAAI,OAAIA,EAAKg7I,2BAHhC,OAIAl2J,QAJA,IAIAA,GAJA,UAIAA,EAAOga,aAJP,aAIA,EAAc2C,MAAK,SAAAzB,GAAI,OAAIA,EAAKk2I,sBAQxC,CAAC4L,EAAD,OAAmBh9J,QAAnB,IAAmBA,OAAnB,EAAmBA,EAAOga,QA0ExB0nJ,GCxtCH,SACHzqF,EACAC,GAEA,IAAMjoB,EAAahiC,iBAEjB,IACI00I,EAAe10I,iBAA+C,MAJtE,EAMoChC,oBAAkB,GANtD,mBAMSosD,EANT,KAMoBC,EANpB,KAQQnuE,EAAWO,cACXytE,EAAkBx2D,eAElBihJ,EAAcj8J,eACdk8J,EAAsB/gK,cACtBghK,EAA2Bl9J,cAC3Bo4I,EAAuB74I,cAMvBm0E,EAAwCxgF,uBAC1C,SAAC4P,GACG2vE,GAAaC,GAAa,GAE1BroB,EAAWp3B,QAAU,GAEN,OAAfq/C,QAAe,IAAfA,KAAkBxvE,KAEtB,CAAC2vE,EAAWH,IAOVmB,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WAAO,IAAD,EACzB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAE1BroB,EAAWp3B,QAAU,GACJ,OAAjBo/C,QAAiB,IAAjBA,KAAiB,iBAAG0qF,QAAH,IAAGA,OAAH,EAAGA,EAAc9pI,eAAjB,QAA4B,SAElD,CAACs/C,EAAiBE,EAAWJ,IAExB5nB,EAAiBL,aACrBC,EAAWp3B,QACXwgD,EACAC,GACA,GAJIjpB,aAWF0yG,EAAyCjqK,uBAAY,WACvD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IAEAG,GAAa,GACbroB,EAAWp3B,QAAU,QAE1B,CAACs/C,EAAiB9nB,IAOf2yG,EAAyBlqK,uBAAY,WACvC28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,iBACZkjC,wBACIspF,EACJjqI,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACA44J,EACA5qF,EACA9nB,IASE4yG,EAA6BnqK,sBAAW,yCAC1C,WAAOkI,EAAwBkiK,GAA/B,oBAAAnoJ,EAAA,yDACSmxB,kBAAQlrC,IAAWkrC,kBAAQg3H,GADpC,mBAEc/qK,EAFd,UAEuB6I,EAAM,UAF7B,aAEuB,EAAUuH,GAEnB46J,EAAuBD,EAAcn5J,KACvC,SAAA1M,GAAO,MACF,CACGlF,SACAkF,cARpB,MAYS6uC,kBAAQi3H,IAZjB,qCAamBN,EAAoBM,GAbvC,2CAD0C,wDAiB1C,CAACN,IASCO,EAAkCtqK,sBAAW,yCAC/C,WACIkI,EACAqiK,GAFJ,oBAAAtoJ,EAAA,yDAISmxB,kBAAQlrC,IAAWkrC,kBAAQm3H,GAJpC,mBAKclrK,EALd,UAKuB6I,EAAM,UAL7B,aAKuB,EAAUuH,GAEnB+6J,EAA2BD,EAAiBt5J,KAC9C,SAAAlL,GAAU,qBAEF1G,UACG0G,MAXvB,MAeSqtC,kBAAQo3H,IAfjB,qCAgBmBR,EAAyBQ,GAhB5C,2CAD+C,wDAoB/C,CAACR,IASCS,EAA4BzqK,sBAAW,yCACzC,WAAOkI,EAAwBwiK,GAA/B,oBAAAzoJ,EAAA,yDACSmxB,kBAAQlrC,IAAWkrC,kBAAQs3H,GADpC,mBAEcrrK,EAFd,UAEuB6I,EAAM,UAF7B,aAEuB,EAAUuH,GAEnBk7J,EAAsBD,EAAaz5J,KACrC,SAAAxF,GAAM,MACD,CACGpM,SACAoM,aARpB,MAYS2nC,kBAAQu3H,IAZjB,qCAamBzlB,EAAqBylB,GAbxC,2CADyC,wDAiBzC,CAACzlB,IASC0lB,EAAqB5qK,uBACvB,SAACkI,GACG,OAAO4hK,EAAY5hK,GAAOozB,MAAK,SAACgT,GAC5B,IAAK8E,kBAAQ9E,GACT,OAAOA,OAInB,CAACw7H,IAOCe,EAA0C7qK,uBAAY,WACxD,GAAI6pK,EAAa9pI,QAAS,CAAC,IAAD,EAChB+qI,EAAqB,CACvBhyG,WAAY,CACR5wD,MAAK,OAAE2hK,QAAF,IAAEA,GAAF,UAAEA,EAAc9pI,eAAhB,aAAE,EAAuB9uB,KAAI,SAAAxI,GAAI,MAAK,CACvCkmC,UAAWlmC,EAAKkmC,UAChBE,SAAUpmC,EAAKomC,SACftuC,MAAOkI,EAAKlI,MACZupC,OAAQrhC,EAAKqhC,OACbvmC,UAAWkF,EAAKlF,eAGxBkzD,UAAW,SAGTs0G,EAAoB,CACtB3yG,WCpQmB,sBDqQnBC,eAAgBuyG,EAChBtyG,sBAAuBwyG,EACvBp0G,aCxQgC,EDyQhC6B,gBAAiB,CACb,CACIH,WCzQqB,gCD0QrBC,eAAgB8xG,EAChB7xG,sBAAuB,CACnBQ,WAAY,CACR5wD,MAAO,GACP+1B,SAAU4rI,EAAa9pI,QAAQ9uB,KAC3B,SAAAxI,GAAI,OAAIA,EAAKw1B,aAGrBw4B,UAAW,WACXwC,mBAAoB,SAExBvC,aAAc0C,MAElB,CACIf,eAAgBoyG,EAChBnyG,sBAAuB,CACnBQ,WAAY,CACR5wD,MAAO,GACP2D,QAASg+J,EAAa9pI,QAAQ9uB,KAC1B,SAAAxI,GAAI,OAAIA,EAAKuiK,aAGrBv0G,UAAW,UACXwC,mBAAoB,SAExBvC,aAAc0C,MAElB,CACIf,eAAgBiyG,EAChBhyG,sBAAuB,CACnBQ,WAAY,CACR5wD,MAAO,GACP2R,YAAagwJ,EAAa9pI,QAAQ9uB,KAC9B,SAAAxI,GAAI,OAAIA,EAAKoR,gBAGrB48C,UAAW,cACXwC,mBAAoB,SAExBvC,aAAc0C,QAK1BjC,EAAWp3B,QAAQtY,KAAKsjJ,IAEvB33H,kBAAQ+jB,EAAWp3B,UAAYmqI,OAErC,CACCC,EACAG,EACAG,EACAP,EACAU,IAgBJ,OAbAt3I,qBAAU,WACFisD,GACAsrF,MAGL,CAACtrF,IAQGv/E,uBAAY,SAACirK,GAChBpB,EAAa9pI,QAAUkrI,EAEvBzrF,GAAa,KACd,ID86BkC0rF,CAnEAlrK,uBACjC,SAACwpK,GACOG,GAA6BH,GAC7BD,GAAwBC,GAGpBvvF,IACAuvF,EAAa7mJ,UAAb,OAAwBza,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAOga,MAAMS,SACb,KAAnB,OAALza,QAAK,IAALA,OAAA,EAAAA,EAAOga,MAAMS,QAEb2mJ,MAEAE,EAAa7mJ,OAAS,IACjB6mJ,EAAa7mJ,OAAS,EACjBb,EAAY,GAAD,cACJ0nJ,QADI,IACJA,OADI,EACJA,EAAc7mJ,OADV,4BAEP,WAEJb,EAAY,GAAD,cACJ0nJ,QADI,IACJA,OADI,EACJA,EAAc7mJ,OADV,0BAEP,YAEd6hJ,EAAiB,6BACVt8J,GADS,IAEZga,MAAK,OAAEha,QAAF,IAAEA,OAAF,EAAEA,EAAOga,MAAMiB,QAChB,SAAA1a,GAAI,OACC+gK,EAAa3kJ,MACV,SAAAsmJ,GAAW,eACP,UAAAA,EAAY5qK,aAAZ,eAAmB+V,kBAAnB,UACA7N,EAAKlI,aADL,aACA,EAAY+V,yBAOxCqmB,QAAQo7B,UAAUz8B,MAAK,WACnB+rI,GAAkB,IAClB7rB,IAAe,GACfiqB,IAAqB,GACrBP,EAAiBviJ,OAAS,EAC1ByhJ,EAAoB35H,EAAQh7B,SAGpC,CAACk6J,GAA8BJ,GAAyBtvF,GAAa/xE,EAAOohK,GAA8BxnJ,EAAa0iJ,EAAkBU,EAAkBd,EAAqB35H,EAAQh7B,KAQxJzP,uBAChC,SAAC4P,GACG,UAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAOgB,QAAS,CAAC,IAAD,EACVw6J,EAAY,UACdx7J,EAAMgB,Q/C/uCRw3D,MAAM,8D+C8uCU,aAAG,EAEjB,GAEAgjG,GACAlG,EAAiBz9I,KAAK2jJ,MAIlC,CAAClG,KAsMCmG,GAAuBrrK,uBAAY,WACrC8lK,GAAgB,IAAI31I,MACpB61I,GAAyB,IAAI71I,MAC7Bw1I,IAAsB,GACtBV,GAAe,GACfnjJ,EAAY,kCAAmC,aAChD,CAACA,EAAamjJ,IAEXqG,GAAoBtrK,uBACtB,SAAC4P,GACG+1J,IAAsB,GACtB7jJ,EAAYlS,EAAO,WAEvB,CAACkS,IAGCiyI,KACAoS,GAAQx3H,aACRw3H,GAAQt3H,YACRs3H,GAAQ5lK,SACR4lK,GAAQr8H,UACRu8H,MACAM,GAAchkJ,UACd4jJ,GAAmB5jJ,OAEnBqxI,KACC8E,IAAiBA,GAAcn2I,OAAS,GAC3C+xH,GAAe,GACfvzI,GAAa0B,WAAW8f,OAAS,GACjCslJ,GAAkBplK,WAAW8f,OAAS,GACtCoxI,IACAhgJ,EAGE0sF,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,YAAcolK,GAAkBplK,WACzDm3I,eAAgBtF,GAChBnuC,WAAU,OAAEuyD,SAAF,IAAEA,QAAF,EAAEA,GAAen2I,SAGzB4oJ,GAAkBxF,GAAqB,gBAC9Bp0I,aAAWo0I,KACpBF,GAAY,8BACWl0I,aAAWk0I,KAClCpH,IACA7/H,EAAW,uBACSjN,aAAWiN,IAE/B,YASN,OAPAtL,qBAAU,WAEN,OADAoxI,IACO,WACHA,OAEL,CAACA,IAGA,eAAC,GAAD,WACKgB,IACG,cAAC,GAAD,CACI5F,SAAU53J,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,GAC/C8d,QAAS,kBAAM2lI,IAAsB,IACrCt/D,UAAWglE,GACXj0G,QAASk0G,KAGhBlG,GACG,cAAC,GAAD,CACIplI,QAAS,kBAAMqlI,GAAwB,MAG9CC,GACG,cAAC,GAAD,CACItlI,QAAS,kBAAMulI,GAA8B,MAGrD,cAAC,GAAD,UACI,gCACI,cAACxD,GAAD,CAAmB5wJ,YAAU,0BAA7B,qCAGCs5B,EAAQh7B,IACL,cAACmyJ,GAAD,UACI,cAAC,GAAD,CACIr+J,UAAWknC,EAAQh7B,GACnBu0J,mBAAoB9tJ,aAAW,OAAC0B,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,eAMnE,cAAC,GAAD,CACIyE,MAAOA,EACPowJ,WAAYA,GACZz5C,cAAeuoD,GACf7O,gBAAiBA,GACjBC,gBAjrBY,SAACgT,GACrB,GAAI/M,GAAc,CACd,IAAMgN,EAAoBD,EAAcv6J,KAAI,SAAAxI,GACxC,MAAO,CACHkmC,UAAWlmC,EAAKkmC,UAAYlmC,EAAKkmC,UAAY,GAC7CE,SAAUpmC,EAAKomC,SAAWpmC,EAAKomC,SAAW,GAC1CtuC,MAAOkI,EAAKlI,MAAQkI,EAAKlI,MAAM+oC,OAAS,GACxCQ,OAAQrhC,EAAKqhC,OAASrhC,EAAKqhC,OAAS,KACpC3B,cAAe,GACf6tH,QAAS,GACTnwI,SAAU,OAIlB++I,EAAwBrlK,EAAO6I,QAASqjK,GAAmBnwI,MACvD,WACIqsI,KAA4BnsI,MAAM6F,QAAQzxB,cAG/C,CACH,IAAM87J,EAAe5S,GAAa,aAAOA,IAAiB,GAMpD6S,EALuB,uBACtBD,EAAavoJ,QAAO,SAAC1a,GAAD,QAAiBA,EAAKlI,UADpB,aAEtBirK,IAG6Cv6J,KAAI,SAAAmS,GAAS,IAAD,EAC5D,OAAO,6BACAA,GADP,IAEI7iB,MAAK,UAAE6iB,EAAK7iB,aAAP,aAAE,EAAY+oC,YAI3Bk7H,EAAiB,6BACVt8J,GADS,IAEZga,MAAOypJ,OA+oBPlT,cAniBkB,WAC1B,IAAM0Q,EAAYjhK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,GACjD0pJ,EAAqBxE,GAAezkJ,OAE1C,GAAI87I,GACAqG,EAAkBvlK,EAAO6I,QAASg/J,IAAgB9rI,MAAK,WACnDqsI,KAA4BnsI,MAAM6F,QAAQzxB,OAE1CkS,EAAY,GAAD,OACJ8pJ,EADI,YAEHA,EAAqB,EAAI,aAAe,WAFrC,iBAIP,WAGJvE,GAAkB,WAEnB,CACH,IAAMwE,EAAc1C,EAAUhmJ,QAC1B,SAAA1a,GAAI,OAAK2+J,GAAe1lJ,SAASjZ,EAAKgH,OAE1CqS,EAAY,GAAD,OACJ8pJ,EADI,YAEHA,EAAqB,EAAI,aAAe,WAFrC,iBAIP,WAEJpH,EAAiB,6BACVt8J,GADS,IAEZga,MAAO2pJ,KAEXxE,GAAkB,MAqgBd3O,sBArfkB,WAC1B,IAAMyQ,EAAYjhK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,GACvD,KAAIq2I,GAAgB51I,OAAS,GAE7B,GAAI87I,GACAqG,EAAkBvlK,EAAO6I,QAASmwJ,IAAiBj9H,MAAK,WACpDqsI,KAA4BnsI,MAAM6F,QAAQzxB,OAC1CkS,EAAY,GAAD,OACJy2I,GAAgB51I,OADZ,qBAEH41I,GAAgB51I,OAAS,EAAI,aAAe,WAFzC,iBAIP,WAEJ0kJ,GAAkB,WAEnB,CACH,IAAMwE,EAAc1C,EAAUhmJ,QAC1B,SAAA1a,GAAI,OAAK8vJ,GAAgB72I,SAASjZ,EAAKgH,OAE3CqS,EAAY,GAAD,OACJy2I,GAAgB51I,OADZ,qBAEH41I,GAAgB51I,OAAS,EAAI,aAAe,WAFzC,iBAIP,WAEJ6hJ,EAAiB,6BACVt8J,GADS,IAEZga,MAAO2pJ,KAEXxE,GAAkB,MAydd/sB,cAAe75C,GAAY65C,cAC3BD,eAAgB55C,GAAY45C,eAC5BlhH,cACIslI,GAAetlI,GAh+BJ,SAACtjB,GACxBqyJ,IAAqB,SAAAh0G,GACjB,OAAO,6BACAA,GADP,IAEIrxD,WAAYgT,QA89BZ/M,cAAe0+J,GACf5S,cAAe0S,GACfzS,iBA5xCwB,SAACiX,GACjCvE,GAAoBuE,IA4xCZnT,YAAaA,GACbC,eAAgBA,GAChB7B,aAAc4R,GACdj0B,aAAcA,GACdwf,eAAgBA,GAChB2E,oBAAqBA,GACrB59I,cAvjBU,WAClBosJ,GAAkB,KAujBVvO,cAAeA,GACf7+E,YAAaA,GACb8+E,gBAAiBA,GACjB7kJ,SAAS,iBAEb,cAAC,GAAD,UACI,cAAC,GAAD,CACIoqJ,SAAUxF,GACV55E,gBAAiBh3E,GAASA,EAAMia,WAChC08F,cAAeuoD,GACfvO,oBAAqBA,GACrBE,gBAAiBA,GACjBoF,gBAjmBQ,SAAC1uJ,GACrB,GAAKA,EAAL,CACA,IAAMs8J,EAAY3E,GAAe74H,MAAK,SAACnrB,GAAD,OAAeA,IAAS3T,KAC9D43J,IAAkB,SAACnzG,GAAD,OACd63G,EACM73G,EAAU/wC,QAAO,SAACC,GAAD,OAAeA,IAAS3T,KADtC,uBAECykD,GAFD,CAEYzkD,OAErBs8J,GACAvwB,IAAe,KAylBP+iB,WAxqBG,SAAC91J,GACXA,IACLk2J,GAAgB,6BACTl2J,GADQ,IAEXlI,MAAOkI,EAAKlI,OAAS,MAGzB2mK,GAAoBz+J,EAAKqhC,QACzBypH,GAAsB9qJ,EAAKod,UAAY,IAGnC4tI,GADAgL,GAC2Bh2J,EAAKoR,aAAe,GAEpBpR,EAAK0/B,eAAiB,IAGrDyrH,GAAqBnrJ,EAAKutJ,SAAW,MAypBzBwI,aAtpBK,SAACn/J,GAClB,IACMwsK,GADY3jK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,IACzBiB,QAAO,SAAA1a,GAAI,OAAIA,EAAKgH,KAAOpQ,KACnD2sK,EAAcH,EAAY56J,KAAI,SAACmS,EAAMlS,GAAP,oBAAC,gBAC9BkS,GAD6B,IAEhCk2I,iBACMl2I,EAAK7iB,OACP2Q,EAAQ26J,EAAYlpJ,OAAS,GAC7BkpJ,EACKt6I,MAAMrgB,EAAQ,GACdiS,QAAO,SAAA1a,GAAI,OAAIA,EAAKlI,QAAU6iB,EAAK7iB,SAAOoiB,OAAS,OAG5D87I,GACAqG,EAAkBvlK,EAAO6I,QAAS,CAAC2d,OAAO1mB,KAAUi8B,MAAK,WACrDqsI,KAA4BnsI,MAAM6F,QAAQzxB,OAC1CkS,EAAY,0BAA2B,WACnCslJ,GAAe1lJ,SAASriB,IACxBgoK,GAAkB,QAI1B7C,EAAiB,6BACVt8J,GADS,IAEZga,MAAO8pJ,KAEXlqJ,EAAY,0BAA2B,WACnCslJ,GAAe1lJ,SAASriB,IACxBgoK,GAAkB,KAI1BA,GAAkB,KAunBN5I,aAAcA,GACdt9J,aAAcA,GACduB,MAAOvB,GAAauB,MACpB+lC,SAAUA,GACV1lC,QAAS5B,GAAa4B,QACtBglC,WAAYA,GACZ22H,aAAcA,GACdC,gBAAiBA,GACjB3C,yBAt4BiB,WAC7B,IAAMiQ,EAAuB,6BACtBvN,IADsB,IAEzBn+J,MAAOm+J,GAAan+J,MAAM+oC,OAC1B75B,GAAIivJ,GAAajvJ,GACjBq6B,OAAQm9H,GACRphJ,SAAU2tI,GAAmBrwI,QAAO,SAAA5e,GAAO,OAAIA,EAAU,MAAM,GAC/D4jC,cAAeurH,IAA2B,GAC1C75I,YAAa65I,IAA2B,GACxCsC,QAASrC,IAAqB,GAC9ByK,qBAAqB,IAGrB8N,EAAmBhkK,EAAK,aAAOA,EAAMga,OAAS,GAC5CiqJ,EACFD,EAAiB/oJ,QAAO,SAAA1a,GAAI,OAAIA,EAAKgH,KAAOw8J,EAAax8J,MACpDkT,OAAS,EAEdwpJ,EACAD,EAAmBA,EAAiBj7J,KAAI,SAAAxI,GACpC,OAAIA,EAAKgH,KAAOw8J,EAAax8J,GAClBw8J,EAEAxjK,KAIfyjK,EAAiBh5E,QAAQ+4E,GAG7B,IAWoB,EAeT,IA1BL1D,EAAe2D,EAAiBj7J,KAAI,SAACmS,EAAMlS,GAAP,oBAAC,gBACpCkS,GADmC,IAEtCk2I,iBACMl2I,EAAK7iB,OACP2Q,EAAQg7J,EAAiBvpJ,OAAS,GAClCupJ,EACK36I,MAAMrgB,EAAQ,GACdiS,QAAO,SAAA1a,GAAI,OAAIA,EAAKlI,QAAU6iB,EAAK7iB,SAAOoiB,OAAS,OAG5D87I,GACI0N,EACAtH,EAAkBtlK,EAAO6I,QAAS6jK,EAAax8J,GAAI,CAC/Ck/B,UAAWs9H,EAAat9H,UACxBE,SAAUo9H,EAAap9H,SACvBtuC,MAAO0rK,EAAa1rK,MACpBupC,OAAQmiI,EAAaniI,OACrBjkB,SAAUomJ,EAAapmJ,SACjBomJ,EAAapmJ,SACb,GACNsiB,cAAa,UAAE8jI,EAAa9jI,qBAAf,QAAgC,GAC7C6tH,QAASiW,EAAajW,UACvB16H,MAAK,WACJ2tI,KACAtB,KAA4BnsI,MAAM6F,QAAQzxB,UAG9C+0J,EAAeplK,EAAO6I,QAAS,CAC3BumC,UAAWs9H,EAAat9H,UACxBE,SAAUo9H,EAAap9H,SACvBtuC,MAAO0rK,EAAa1rK,MACpBupC,OAAQmiI,EAAaniI,OACrBjkB,SAAUomJ,EAAapmJ,SACjBomJ,EAAapmJ,SACb,GACNsiB,cAAa,UAAE8jI,EAAa9jI,qBAAf,QAAgC,GAC7CtuB,YAAW,UAAEoyJ,EAAapyJ,mBAAf,QAA8B,GACzCm8I,QAASiW,EAAajW,UACvB16H,MAAK,WACJ2tI,KACAtB,KAA4BnsI,MAAM6F,QAAQzxB,WAIlD40J,EAAiB,6BACVt8J,GADS,IAEZga,MAAOqmJ,KAEXU,OAyzBQnb,aAAcmZ,GACd3T,kBAAmB6T,GACnB3T,mBAAoBA,GACpBD,sBAh2CoB,SAACt1H,GACjCs1H,GAAsBt1H,IAg2CVy1H,wBAAyBA,GACzBD,2BAx1CyB,SACrCruJ,GAEAquJ,GAA2BruJ,IAw1CfuuJ,kBAAmBA,GACnBC,qBAt1CmB,SAAC/nJ,GAChC+nJ,GAAqB/nJ,IAs1CTwnJ,kBAAmB,SACfh+H,EACAryB,GAEIqyB,EAAEgwB,OAAOxvC,MAAM8M,OAAS,KA3oBrB,SAAC9M,EAAe7S,GACnC6S,EAAM8M,OAAS,KACnBg8I,IAAgB,SAAAzqG,GAAS,oCAClBA,GADkB,mBAEpBlxD,EAAQ6S,OAwoBGu2J,CAAmB/2I,EAAEgwB,OAAOxvC,MAAO7S,IAEvC+9F,yBACI5/F,GAAa0B,WAAW8f,OAAS,GACjCslJ,GAAkBplK,WAAW8f,OAAS,EAE1Cq+E,yBACIP,GAAYO,yBAEhBkzD,eAAgBA,GAChBhgJ,SAAS,qBA3Cb,UA6CMusF,GAAYO,2BACT7/F,GAAa0B,WAAW8f,SACxBslJ,GAAkBplK,WAAW8f,QAC1B,eAACq/I,GAAD,YACMhO,IACE,cAAC,GAAD,CAAe9/I,SAAS,8BAE5B,cAAC,IAAD,CACI7F,IAAKsgG,EACLQ,cAAeg3D,GACf92D,SAAU,SAAAjgG,GACNA,EAAO7O,MAAQ6O,EAAO7O,MAAM+oC,OAC5Bs8H,IAAgB,GAEhBn0J,YAAW,WACPm0J,IAAgB,KACjB,KAh2BX,SAACn9J,GACzB,IAAMwjK,EAAuB,6BACtBxjK,GADsB,IAEzBgH,GAAI0gB,KAAKk8I,MACTviI,OAAQu8H,GACRxgJ,SAAU8gJ,GAAcxjJ,QAAO,SAAA5e,GAAO,OAAIA,EAAU,MAAM,GAC1D4jC,cAAeo+H,IAAsB,GACrC1sJ,YAAa0sJ,IAAsB,GACnCvQ,QAASyQ,IAAgB,GACzB6F,WAAW,GAAD,QAAM7F,IAAgB,IAAI9jJ,UAGpCupJ,EAAmBhkK,EAAK,aAAOA,EAAMga,OAAS,GAC5CiqJ,EACFD,EAAiB/oJ,QAAO,SAAA1a,GAAI,OAAIA,EAAKgH,KAAOw8J,EAAax8J,MACpDkT,OAAS,EAEdwpJ,EACAD,EAAmBA,EAAiBj7J,KAAI,SAAAxI,GACpC,OAAIA,EAAKgH,KAAOw8J,EAAax8J,GAClBw8J,EAEAxjK,KAIfyjK,EAAiBh5E,QAAQ+4E,GAG7B,IAWoB,EAeT,EA1BL1D,EAAe2D,EAAiBj7J,KAAI,SAACmS,EAAMlS,GAAP,oBAAC,gBACpCkS,GADmC,IAEtCk2I,iBACMl2I,EAAK7iB,OACP2Q,EAAQg7J,EAAiBvpJ,OAAS,GAClCupJ,EACK36I,MAAMrgB,EAAQ,GACdiS,QAAO,SAAA1a,GAAI,OAAIA,EAAKlI,QAAU6iB,EAAK7iB,SAAOoiB,OAAS,OAG5D87I,GACI0N,EACAtH,EAAkBtlK,EAAO6I,QAAS6jK,EAAax8J,GAAI,CAC/Ck/B,UAAWs9H,EAAat9H,UACxBE,SAAUo9H,EAAap9H,SACvBtuC,MAAO0rK,EAAa1rK,MACpBupC,OAAQmiI,EAAaniI,OACrBjkB,SAAUomJ,EAAapmJ,SACjBomJ,EAAapmJ,SACb,GACNsiB,cAAa,UAAE8jI,EAAa9jI,qBAAf,QAAgC,GAC7C6tH,QAASiW,EAAajW,UACvB16H,MAAK,WACJ0tI,KACArB,KAA4BnsI,MAAM6F,QAAQzxB,UAG9C+0J,EAAeplK,EAAO6I,QAAS,CAC3BumC,UAAWs9H,EAAat9H,UACxBE,SAAUo9H,EAAap9H,SACvBtuC,MAAO0rK,EAAa1rK,MACpBupC,OAAQmiI,EAAaniI,OACrBjkB,SAAUomJ,EAAapmJ,SACjBomJ,EAAapmJ,SACb,GACNsiB,cAAa,UAAE8jI,EAAa9jI,qBAAf,QAAgC,GAC7C6tH,QAASiW,EAAajW,UACvB16H,MAAK,WACJ0tI,KACArB,KAA4BnsI,MAAM6F,QAAQzxB,WAIlD40J,EAAiB,6BACVt8J,GADS,IAEZga,MAAOqmJ,KAEXS,MAqxB4BuD,CAAoBn9J,IAExBkgG,iBAAkBA,GAClBF,oBAAoB,EAbxB,SAeK,gBACGhgG,EADH,EACGA,OACA0mB,EAFH,EAEGA,aACAomC,EAHH,EAGGA,OACAswG,EAJH,EAIGA,YAJH,OAMG,cAAC,IAAD,CACIvvF,UAAW,SAAA5nD,GACHA,EAAE6L,KAFd,SAOI,cAAC,IAAD,CACIz9B,KAAK,QACLsgG,OAAQ,kBACJ,cAAC,GAAD,CACI77F,MACI4wJ,IAEM,GAEV7E,aACIA,GAEJF,yBACIA,GAEJC,wBACIA,GAEJpB,YACO12F,EAAO37D,SACJ27D,EAAOvtB,aACPutB,EAAOrtB,WACb29H,EAAc,EAElB1Y,cAAe53F,EACf23F,kBACKzkJ,EAAOu/B,YACPv/B,EAAOy/B,WACPz/B,EAAO7O,QACP8lK,GAELvY,aACIuY,GAEJ/S,kBACIwT,GAEJpT,wBACI6S,GAEJ9S,2BACIsT,GAEJpT,kBACI8S,GAEJ7S,qBACIoT,GAEJxT,mBACImT,GAEJpT,sBACIsT,GAEJxT,kBAAmB,SACfh+H,EACAryB,GAGIqyB,EAAEgwB,OAAOxvC,MACJ8M,OACL,OAjvBtC,SAAC9M,EAAe7S,GAC9B6S,EAAM8M,OAAS,KACnByjJ,IAAW,SAAAlyG,GAAS,oCACbA,GADa,mBAEflxD,EAAQ6S,OAgvBuC42J,CACIp3I,EAAEgwB,OAAOxvC,MACT7S,GAEJ8yB,EAAaT,KAEjB6+H,eACIA,GAEJhgJ,SAAS,oCAWrD,cAAC,GAAD,IACA,cAAC2tJ,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,UACI,cAACG,GAAD,CAA4B9wJ,YAAU,2BAAtC,SACKo6J,QAGP9M,IACE,cAAC,KAAD,CACIt1I,YAAa,CAAC1U,KAAgB0hH,gBADlC,SAGI,cAAC,GAAD,UACI,cAAC,IAAD,CACI1rH,OAlTN,WACjBg0J,IACDkH,IAAsB,IAiTElyJ,MAAM,gBACN5C,QAAQ,UACRpC,MAAM,QACNC,OAAO,OACPwE,WAAY,GACZU,SACIw/B,kBAAO,OAAClrC,QAAD,IAACA,OAAD,EAACA,EAAOga,QACfsjJ,EAEJtxJ,SAAS,mCAKzB,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB0hH,gBADlC,SAGI,cAAC,IAAD,CACI1rH,OA7fM,WAC1Bg7J,IAAqB,GAErBrB,EAAoB35H,EAAQh7B,IAAK,SAACi0J,GAC9B,IAAMyF,EAAYjhK,GAASA,EAAMga,MAAQha,EAAMga,MAAQ,GACjDwqJ,GAnLL,OAALxkK,QAAK,IAALA,OAAA,EAAAA,EAAOia,cAAeilJ,GAAezkJ,QAmLuBs3D,GAElD0yF,EAAkBD,EAAqB,GAAKtF,GAElD,GAAI1D,EAAWhhK,OAASghK,EAAWhhK,OAASghK,EAAW7uB,MAGnD,OAFA4wB,IAAqB,QACrBJ,GAAwB,GAI5B,GAAI5G,GAAc,CACd,IAAM/7J,EAAQgqK,EACRxkK,EAAOia,WACPhhB,GAAauB,MAEbklK,EAAgBuB,EAAUhmJ,QAAO,SAAA1a,GAAI,OACvC2+J,GAAe1lJ,SAASjZ,EAAKgH,OAGjC,GACIi0J,EAAWhhK,OACRghK,EAAWhhK,MAAQghK,EAAW7uB,OAAS63B,EAAqBxkK,EAAOia,WAAaylJ,EAAcjlJ,QAIjG,OAFA8iJ,IAAqB,QACrBF,GAA8B,KAKjB,OAAbqC,QAAa,IAAbA,OAAA,EAAAA,EAAejlJ,QnFvwCG,ImFwwClB+pJ,KAEA5qJ,EAAY,iBAAD,QAEU,OAAb8lJ,QAAa,IAAbA,OAAA,EAAAA,EAAejlJ,SAAU,MAFtB,0CAIP,WAEJ2hJ,KAGJS,EACIxlK,EAAO6I,QACPukK,EACAD,EAHa,aAAC,gBAITvrK,IAJQ,IAIMuB,WAElB44B,MAAK,SAAAsxI,GACF,IAAMC,EAAsB1D,EAAUl4J,KAAI,SAAAxI,GACtC,OAAI2+J,GAAe1lJ,SAASjZ,EAAKgH,IACtB,6BACAhH,GADP,IAEI21J,oBACIwO,GACAA,EAAkBnkK,EAAKgH,KACvBm9J,EAAkBnkK,EAAKgH,IAAIG,QAG5BnH,KAGTqkK,EAAuBD,EAAoB1pJ,QAC7C,SAAA1a,GAAI,OACC2+J,GAAe1lJ,SAASjZ,EAAKgH,KAC1Bm9J,GACAA,EAAkBnkK,EAAKgH,MACtBm9J,EAAkBnkK,EAAKgH,IAAIA,KAC/B23J,GAAe1lJ,SAASjZ,EAAKgH,OAEtCg2J,IAAqB,GAErB,IAAMsH,EAAuBF,EAAoB1pJ,QAC7C,SAAA1a,GAAI,OAAIA,EAAK21J,uBACfz7I,OAEIqqJ,EACF5F,GAAezkJ,OAASoqJ,EAE5BtI,EAAkC,6BAC3Bv8J,GAD0B,IAE7Bga,MAAO2qJ,KAEXxF,GAAkB,IACbqF,IACGI,EAAqBnqJ,OAAS,GAC9Bb,EACI,8BACA,WAEJwiJ,KAGI0I,EAAoB,GACpBD,EAAuB,GAEvBjrJ,EAAY,GAAD,OACJkrJ,EADI,YAEHA,EAAoB,EACd,aACA,WAJH,6BAKcD,EALd,aAMHA,EAAuB,EACjB,QACA,OARH,gCAUP,SAEJpF,MAEAqF,EAAoB,GACpBD,EAAuB,GAEvBjrJ,EAAY,GAAD,OACJkrJ,EADI,YAEHA,EAAoB,EACd,aACA,WAJH,kBAMP,WAEJrF,MAEAoF,EAAuB,GACvBC,EAAoB,GAEpBlrJ,EAAY,GAAD,OACJirJ,EADI,aAEHA,EAAuB,EACjB,QACA,OAJH,gCAMP,UAKhB3I,EAAoB35H,EAAQh7B,OAE/B+rB,OAAM,WACHiqI,IAAqB,UAE1B,CACH,IAAMmC,EAAgBuB,EAAUhmJ,QAC5B,SAAA1a,GAAI,OACA2+J,GAAe1lJ,SAASjZ,EAAKgH,MAC5BhH,EAAK6wJ,iBACL7wJ,EAAK21J,uBAGd,GACIsF,EAAWhhK,OACRghK,EAAWhhK,MAAQghK,EAAW7uB,MAAQ+yB,EAAcjlJ,OAIvD,OAFA8iJ,IAAqB,QACrBF,GAA8B,GAIlC,IAAM0H,EAAgBrF,EAAc32J,KAChC,SAAAxI,GAAI,YACC,CACGkmC,UAAWlmC,EAAKkmC,UAAU/uC,WAC1BivC,SAAUpmC,EAAKomC,SAASjvC,WACxBW,MAAOkI,EAAKlI,MACZupC,OAAQrhC,EAAKqhC,OACbvmC,UAAWknC,EAAQh7B,GACnBwuB,SAAUx1B,EAAKod,SACfhM,YAAapR,EAAKoR,YAClBmxJ,SAAQ,UAAEviK,EAAKutJ,eAAP,aAAE,EAAc7yI,QACpB,SAAA1X,GAAM,OAAIA,IAAW05J,SAKrCyE,GAA6BqD,QA2UjBx5J,MAAM,wBACNhF,MAAM,QACNC,OAAO,OACPwE,WAAY,GACZU,UACKwzJ,GAAezkJ,SACfza,KACEA,IAAUA,EAAMga,MAAMS,OAE7B5O,QAASyxJ,EACTvxJ,aAAa,QACbC,SAAS,qCG/wDtBg5J,GHwxD8C,SAAC,GAGvD,IAFH3L,EAEE,EAFFA,UACAC,EACE,EADFA,eAEMjiK,EAAc00I,cACdrsH,EAAUW,cACVzW,EAAQyuJ,KACR91H,EAAUnhB,YAAYkhB,MACtB+5H,EnF9qDkC,WACxC,IAAMlzJ,EAAWO,cACXu7J,EAAwBhlK,eACxB2Z,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoI,EAAiB4Z,GAEd,OADA3Q,EAASoxC,gBACF0qH,EAAsB/kK,EAAS4Z,GACjCsZ,MAAK,SAAAn5B,GAEF,OADAkP,EAASsxC,aAAwBxgD,IAC1BA,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EAASwxC,aAAwBjzC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,SACrBhB,OAGlB,CAACyB,EAAU87J,EAAuBrrJ,ImF4pDbsrJ,GACnB5I,EnF3+CgC,WACtC,IAAMnzJ,EAAWO,cACjB,OAAO5R,uBACH,SAACkI,GACGmJ,EAAS0xC,aAAuB76C,MAEpC,CAACmJ,ImFq+CoBg8J,GACnB5I,EnFl+CiD,WACvD,IAAMpzJ,EAAWO,cACjB,OAAO5R,uBACH,SAACkI,GACGmJ,EAAS4xC,aAAwC/6C,MAErD,CAACmJ,ImF69CDi8J,GACE5I,EnF19C+B,WACrC,IAAMrzJ,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EAAS8xC,kBACV,CAAC9xC,ImFs9CoBk8J,GAClB5I,EnFvoD8B,WACpC,IAAMtzJ,EAAWO,cACX47J,EAAqBnlK,cACrByZ,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsI,EAAmBG,GAEhB,OADA4I,EAASgyC,gBACFmqH,EAAmBllK,EAAW,CAACG,IACjC6yB,MAAK,WAIF,OAHAjqB,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,mBAErC,KAEVx2E,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,UACpB,OAGnB,CAACS,EAAUm8J,EAAoB1rJ,ImFmnDZ2rJ,GACjB7I,EnFhnDuC,WAC7C,IAAMvzJ,EAAWO,cACX47J,EAAqBnlK,cACrByZ,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsI,EAAmBG,GAEhB,OADA4I,EAASgyC,gBACFmqH,EAAmBllK,EAAWG,GAChC6yB,MAAK,WAIF,OAHAjqB,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,mBAErC,KAEVx2E,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,UACpB,OAGnB,CAACS,EAAUm8J,EAAoB1rJ,ImF4lDH4rJ,GAC1B7I,EnFzlDiC,WACvC,IAAMxzJ,EAAWO,cACX+7J,EAAwBplK,eACxBuZ,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsI,EAAmBE,EAAuBC,GAEvC,OADA4I,EAASgyC,gBACFsqH,EAAsBrlK,EAAWE,EAAeC,GAClD6yB,MAAK,WAIF,OAHAjqB,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,mBAErC,KAEVx2E,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,UACpB,OAGnB,CAACS,EAAUs8J,EAAuB7rJ,ImFqkDZ8rJ,GACpB9I,EnFlkDiC,WACvC,IAAMzzJ,EAAWO,cACXi8J,EAAwBnlK,cACxBoZ,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsI,EAAmBK,GAEhB,OADA0I,EAASgyC,gBACFwqH,EAAsBvlK,EAAWK,GACnC2yB,MAAK,WAIF,OAHAjqB,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,mBAErC,KAEVx2E,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,UACpB,OAGnB,CAACS,EAAUw8J,EAAuB/rJ,ImF8iDZgsJ,GACpB/I,EnF3iDiC,WACvC,IAAM1zJ,EAAWO,cACXm8J,EAAwBnlK,eACxBkZ,EAAcnQ,cACpB,OAAO3R,uBACH,SAACsI,EAAmBK,EAA0B9D,EAAoBC,GAE9D,OADAuM,EAASgyC,gBACF0qH,EAAsBzlK,EAAWK,EAAgB9D,EAAWC,GAC9Dw2B,MAAK,SAAAn5B,GAKF,OAJAkP,EACIkyC,aAAwB,CAAE9zC,GAAIuiG,MAAU,iBAGrC7vG,KAEVq5B,OAAM,SAAC5rB,GAGJ,MAFAyB,EAASwiC,aAAwBjkC,EAAMgB,UACvCkR,EAAY,uBAAwB,SAC9BlS,OAGlB,CAACyB,EAAU08J,EAAuBjsJ,ImFshDZksJ,GACpBhJ,EAA8BjY,KAC9B3jG,EAAoBpD,eACpBs2D,EAA8BvzF,eAC9Bq7I,EAAsB70C,KAE5Bj8F,qBAAU,WACN81B,EAAkB,CACdvmD,WAAY,GACZ6V,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO,CAAC8oC,KAAmBv7C,UACxDL,QAAS,CACLC,MAAO,aACPC,KAAK,GAETN,OAAQ,EACRwf,WAAY,EACZS,cAAe,MAEpB,CAACwmC,IAEJ,IAAMq1G,EAztDW,QAytDIl/J,EAAO6I,QAlC1B,EAmCoC+qB,oBAAS,GAnC7C,mBAmCK86I,EAnCL,KAmCkBhJ,EAnClB,KAqCIhpC,EAASj8H,uBAAY,WACnBiuK,EACArmJ,EAAQsmJ,IAAI,GAEZtmJ,EAAQq0G,WAEb,CAACr0G,EAASqmJ,IA4Bb,OACI,cAAC,KAAkBhwF,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,aAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,aAAjD,SACI,cAAC,KAAuB48D,SAAxB,CACIpoE,MAAO,CAAEwL,YAAa,aAD1B,SAGI,cAAC,GAAD,CACIkgJ,UAAWA,EACXC,eAAgBA,EAChBC,iBAAiB,EACjBC,sBApCO,YAElBjD,GACD3sJ,GACAA,EAAM3P,MACN2P,EAAM3P,KAAK+f,OACXpQ,EAAM3P,KAAK+f,MAAMS,OAEjB25F,EAA4B,CACxB7+D,WAAY,mBACZ/E,YACI,oEACJkF,iBAAkB,UAClBD,kBAAmB,sBACnBI,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aACtCye,UAAWo+E,IAGfA,KAcQ,SAMI,cAAC,GAAD,CACI18H,OAAQA,EACR2I,MAAO4J,GAASA,EAAM3P,KACtBy8B,YACI9sB,GAASA,EAAM3P,MAAQ2P,EAAM3P,KAAKy8B,YAEtC7qB,QAASjC,EAAMiC,QACf02B,QAASA,EACT65H,sBAxBM,WAC1B18I,EAAQjoB,QAAQpG,IAAOsE,cAwBH2mK,iBAAkBA,EAClBC,kCACIA,EAEJC,gBAAiBA,EACjBH,iBAAkBA,EAClBI,eAAgBA,EAChBC,wBAAyBA,EACzBC,kBAAmBA,EACnBC,kBAAmBA,EACnBC,kBAAmBA,EACnBC,4BACIA,EAEJC,eAAgBA,EAChBb,oBAAqBA,a,8BD/1D1C,SAAS+J,GAAuBhsK,GACnC,MAAO,CACH6I,KAAMuN,GAAQ61J,mBACdjsK,S,SAzCIoW,K,wDAAAA,E,4DAAAA,E,4DAAAA,E,0DAAAA,E,8DAAAA,E,8DAAAA,E,wCAAAA,E,wCAAAA,E,wCAAAA,E,wCAAAA,E,wCAAAA,E,gCAAAA,E,0CAAAA,E,4CAAAA,E,gDAAAA,E,gDAAAA,E,0DAAAA,E,oDAAAA,E,wDAAAA,E,kCAAAA,E,6CAAAA,Q,SKDA81J,G,SC8CCC,GAA0C,CACnD72J,KAAM,CACFtD,MAAO,GACPukC,YAAa,GACbqV,aAAc,GACdhsD,OAAQ++C,KAAiBjC,MACzB0vH,OAAQ,CACJC,cAAe,KACfnoK,WAAY,KACZ9C,UAAW,KACXtB,MAAO,KAGf8R,SAAS,EACT06J,KAAM,OACNvyG,OAAQ,IAwQCwyG,GAAmB,SAAC58J,GAAD,OAAqBA,EAAM+uC,UCrUrD8tH,GAAc,CAAC,SAAU,SAAU,SAAU,UAGVh1G,kBACrCi1G,gBAAM,EAAGC,IAAgB59J,KAAI,SAAA69J,GAAC,OAC1BH,GAAY19J,KAAI,SAAA89J,GAAC,sBAAaD,EAAb,YAAkBC,EAAlB,eC2BlB,SAASC,KACZ,IAAMlvK,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAY96J,EAAd,EAAcA,MAAd,OACIrU,EAAKG,KAAL,oBAAuBgvK,EAAvB,UAA2C,CAAC96J,UAAQ,KACxD,CAACrU,IAqBF,SAASovK,KACZ,IAAMpvK,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OAAkBnvK,EAAKgB,IAAL,oBAAsBmuK,QAAcluK,OAAWA,GAAW,KAC5E,CAACjB,IAqBF,SAASqvK,KACZ,IAAMrvK,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OAAkBnvK,EAAKgB,IAAL,oBAAsBmuK,EAAtB,iBAA4CluK,OAAWA,GAAW,KACpF,CAACjB,IAQF,SAASsvK,KACZ,IAAMtvK,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAY1kK,EAAd,EAAcA,KAAd,OACIzK,EAAKG,KAAL,oBAAuBgvK,EAAvB,YAA6C,CAAC1kK,SAAO,KACzD,CAACzK,K,SHpGGuuK,K,oBAAAA,E,WAAAA,Q,KIsCL,ICxCKgB,GDwCCC,GAA6B,WACtC,IAAMj+J,EAAWO,cACjB,OAAO5R,uBACH,SAACmC,GACGkP,ETVL,SAAgClP,GACnC,MAAO,CACH6I,KAAMuN,GAAQg3J,mBACdptK,QSOaqtK,CAAuBrtK,MAEpC,CAACkP,KAIIo+J,GAA6B,WACtC,IAAMp+J,EAAWO,cACjB,OAAO5R,uBACH,SAAC0vK,GTMF,IAAgCvtK,ESL3BkP,GTK2BlP,ESLKutK,ETMjC,CACH1kK,KAAMuN,GAAQo3J,mBACdxtK,YSNA,CAACkP,KAIIu+J,GAA6B,WACtC,IAAMv+J,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAe65J,GACZr+J,EThBL,SACHwE,EACA65J,GAEA,MAAO,CACH1kK,KAAMuN,GAAQs3J,mBACdH,OAAQA,EACR75J,SSSai6J,CAAuBj6J,EAAO65J,MAE3C,CAACr+J,KAoBI0+J,GAA6B,WACtC,IAAM1+J,EAAWO,cACjB,OAAO5R,uBACH,WACIqR,ETvBD,CACHrG,KAAMuN,GAAQy3J,uBSwBd,CAAC3+J,KAII4+J,GAAwB,WACjC,IAAM5+J,EAAWO,cACXs+J,EAAiB5pK,eACjBwb,EAAcnQ,cACpB,OAAO3R,uBACH,SAACqG,GACGgL,ET6BD,CACHrG,KAAMuN,GAAQ43J,uBS7BVD,EAAe7pK,GACVi1B,MAAK,SAAAn5B,GACFkP,ET+Bb,SAA8BlP,GACjC,MAAO,CACH6I,KAAMuN,GAAQ63J,uBACdjuK,QSlCqBkuK,CAAqBluK,OAEjCq5B,OAAM,SAAC5rB,GACJyB,ETmCb,SAA8BzB,GACjC,MAAO,CACH5E,KAAMuN,GAAQ+3J,uBACd1gK,SStCqB2gK,CAAqB3gK,EAAMgB,UACpCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU6+J,EAAgBpuJ,KAqCtB0uJ,GAAgC,WACzC,IAAMn/J,EAAWO,cACX6+J,EAAgBvuK,cAChB4f,EAAcnQ,cACpB,OAAO3R,uBACH,SAACkwE,EAAWwgG,EAAqClX,GAC7CnoJ,ET9DD,CACHrG,KAAMuN,GAAQo4J,8BS8DV,IAAMC,EAAqB,IAAIC,SAW/B,OAVAD,EAAS/kH,IAAI,OAAQqkB,GACrB0gG,EAAS/kH,IAAI,OAAQ,SACrB+kH,EAAS/kH,IAAI,uBAAwB,QAChC6kH,EAAmB9wK,WAAW8hB,SAAS,UACxCkvJ,EAAS/kH,IACL,qBACA6kH,EAAmB9wK,YAEvB45J,GAAUoX,EAAS/kH,IAAI,WAAY2tG,GAEhCiX,EAAcG,GAChBt1I,MAAK,SAAAn5B,GTtEf,IACH2uK,EACAxiI,ESwEgB,OAHAj9B,GTtEhBy/J,ESuE+CJ,ETtE/CpiI,ESsEmEnsC,ETpE5D,CACH6I,KAAMuN,GAAQw4J,8BACd5uK,KAAM,CACF2uK,eACAxiI,eSkEe,aAEV9S,OAAM,SAAC5rB,GAGJ,OAFAyB,EThEb,SAAoCzB,GACvC,MAAO,CACH5E,KAAMuN,GAAQy4J,8BACdphK,SS6DqBqhK,CAA2BrhK,EAAMgB,UAC1CkR,EAAYlS,EAAMgB,QAAS,SACpB,aAGnB,CAACS,EAAUo/J,EAAe3uJ,KAWrBovJ,GAA2B,WACpC,IAAM7/J,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAY7S,EAAuBmuK,GAChC9/J,ET7CL,SACHlP,EACAa,EACAmuK,GAEA,MAAO,CACHnmK,KAAMuN,GAAQ64J,gBACdpuK,MAAOA,EACPb,KAAMA,EACNgvK,OAAQA,GSoCKE,CAAqBx7J,EAAO7S,EAAOmuK,MAEhD,CAAC9/J,KAIIigK,GAA0B,WACnC,IAAMjgK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ETrFG,CACHrG,KAAMuN,GAAQg5J,mBSqFf,CAAClgK,KAUKmgK,GAAkC,WAC3C,IAAMngK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ET/CG,CACHrG,KAAMuN,GAAQk5J,6BS+Cf,CAACpgK,KAGKqgK,GAA0C,WACnD,IAAMrgK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EThDG,CACHrG,KAAMuN,GAAQo5J,+BSgDf,CAACtgK,KAaKugK,GAAiC,WAC1C,IAAMvgK,EAAWO,cACjB,OAAO5R,uBACH,SAAC6xK,EAAsBnC,GACnBr+J,ET7DL,SACHwgK,EACAnC,GAEA,MAAO,CACH1kK,KAAMuN,GAAQu5J,4BACdD,WACAnC,USsDaqC,CAAyBF,EAAUnC,MAEhD,CAACr+J,KAII2gK,GAA4B,WACrC,IAAMC,EDrGH,WACH,IAAMnyK,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAYiD,EAAd,EAAcA,UAAd,OAA6BpyK,EAAKgB,IAAL,oBAAsBmuK,EAAtB,oBAA4CiD,QAAanxK,OAAWA,GAAW,KAC5G,CAACjB,ICiG6BqyK,GAC5BC,EAAiBlD,KAEvB,OAAOlvK,sBAAW,yCACd,WAAOivK,EAAoBiD,GAA3B,UAAAjwJ,EAAA,+EACWgwJ,EAA0B,CAAChD,aAAYiD,cAAY52I,KAAnD,yCAAwD,sCAAArZ,EAAA,6DAAQowJ,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,QAC3EC,EAAUF,EAAaphK,KAAI,YAC7B,MAAO,CACH1G,KAF2C,EAAhBA,KAG3BioK,QAAkB,aAHyB,EAAVxuK,KAGFqqK,GAAkBoE,SAAWpE,GAAkBqE,QAJ3B,SAOrCN,EAAe,CAACnD,eAPqB,uBAOpD96J,EAPoD,EAOpDA,MAPoD,kBASpD,CAACo+J,UAASp+J,QAAOukC,YAAa45H,IATsB,2CAAxD,wDADX,2CADc,wDAcd,CAACL,EAA2BG,M,SC3QxB/C,K,YAAAA,E,aAAAA,Q,oCCEA92J,G,UCINyiD,GAAoBhrD,IAAOC,IAAV,uCACjB,SAAAC,GAAK,QAAMA,EAAMu+D,aAAR,wBAAwCv+D,EAAMu+D,YAA9C,QAGTkkG,GAA0B3iK,IAAOC,IAAV,sLAUvB,SAAAC,GAAK,OAAOA,EAAMzB,MAAR,qBAA8ByB,EAAMzB,OAAU,MAG/C,SAAAyB,GAAK,OAAIA,EAAMkvB,SAAW,eACvB,SAAAlvB,GAAK,OACbA,EAAMkY,WACFlY,EAAMkY,WACNlY,EAAM0D,SACN3f,IAAUC,OAAOqC,SACjB2Z,EAAM8C,SACI,SAAA9C,GAAK,OACrBA,EAAM0iJ,SACA,qBACE1iJ,EAAMkY,WACJlY,EAAMkY,WACNlY,EAAM0D,SACN3f,IAAUC,OAAOqC,SACjB2Z,EAAM8C,SACL,SAAA9C,GAAK,OAAIA,EAAMmoI,WAAa,UAGzC50G,GAAczzB,IAAOC,IAAV,qHAOJ,SAAAC,GAAK,OACRA,EAAM0iK,eACF1iK,EAAM0iK,eACN1iK,EAAMI,MAAMpc,OAAOO,aACd,SAAAyb,GAAK,OACdA,EAAM2iK,gBAAkB3iK,EAAM2iK,gBAAkB,YAGpDh9F,GAAgB7lE,IAAOC,IAAV,sHACF,SAAAC,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAGlD,SAAAzC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCo+K,GAAiB9iK,IAAOC,IAAV,0GACH,SAAAC,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAyGhDogK,GAvEV,SAAA7iK,GAAU,IAAD,IACoBijB,oBAAS,GAD7B,mBACH6/I,EADG,KACMC,EADN,KAEJrjK,EAAQM,EAAMmrD,MAAQnrD,EAAMlN,MAAQi5D,YAAM/rD,EAAMmrD,KAAKa,OAAQhsD,EAAMlN,MAAMS,WAAQ1C,EACjFq7D,EAAUlsD,EAAMmrD,MAAQnrD,EAAMlN,MAAQi5D,YAAM/rD,EAAMmrD,KAAKe,QAASlsD,EAAMlN,MAAMS,WAAQ1C,EAWpFmyK,EAAiB,CACnB98F,KAAM,EACNzjE,SAAS,GAAD,OAAOzC,EAAMyC,SAAWzC,EAAMyC,SAAW,QACjDw+C,UAAU,GAAD,OAAOjhD,EAAMihD,UAAYjhD,EAAMihD,UAAY,MAGxD,OACI,eAAC6J,GAAD,CAAmByT,YAAav+D,EAAMu+D,YAAtC,UACI,eAACkkG,GAAD,CACIlkK,MAAOyB,EAAMzB,MACbmF,SAAU1D,EAAM0D,SAChBZ,MAAO9C,EAAM8C,MAAQ9C,EAAM8C,MAAQ/e,IAAUC,OAAOC,MACpDi0B,WAAYlY,EAAMkY,WAClBgX,QAASlvB,EAAMkvB,QACfi5G,UAAWnoI,EAAMmoI,UACjBua,WAAYhjJ,KAAWwsD,EAP3B,UASI,cAAC,GAAD,CACI42G,QAASA,EACTJ,eAAgB1iK,EAAM0iK,eACtBC,gBAAiB3iK,EAAM2iK,gBAH3B,SAKK3iK,EAAMuD,QAEX,cAACmiE,GAAA,EAAD,wCACI//D,MAAO3F,EAAM2F,MACbm1C,OAAQkoH,GACJhjK,GACAA,EAAMlN,OAJd,IAKIyQ,MAAOvD,EAAMuD,MACbwmD,YAAa/pD,EAAM+pD,YACnB/M,IAAKh9C,EAAMg9C,IACX3yB,SAAQ,UAAErqB,EAAMqqB,gBAAR,QAAoBrqB,EAAMlN,MAAMu3B,SACxCy7C,QA1CA,WACZi9F,GAAW,IA0CCh9F,OAvCD,WACXg9F,GAAW,GACP/iK,EAAM+lE,QAAQ/lE,EAAM+lE,UAsCZriE,SAAU1D,EAAM0D,SAChBmoD,UAAW7rD,EAAM6rD,UACjBpmC,SAAUzlB,EAAMylB,SAChB2zC,QAASp5D,EAAMo5D,QACf32D,SAAUzC,EAAMyC,SAChBuB,SAAUhE,EAAMgE,YAEnBhE,EAAMg9C,MAAQh9C,EAAMijK,aACjB,eAAC,GAAD,CAAexgK,SAAUzC,EAAMkjK,gBAAiBjiK,YAAA,UAAcjB,EAAMgE,SAApB,YAAhD,UACKhE,EAAM2F,MAAQ3F,EAAM2F,MAAM8M,OAAS,IADxC,IAC8CzS,EAAMg9C,UAI3Dt9C,GAASwsD,GACN,cAAC02G,GAAD,CAAgB3hK,YAAA,UAAcjB,EAAMgE,SAApB,UAAhB,SACKtE,QCvJfyjK,GAAqBrjK,IAAOC,IAAV,6FAMlBqjK,GAA4BtjK,IAAOC,IAAV,uDAIzBwnG,GAAkBznG,IAAOC,IAAV,4BAEfsjK,GAID,SAAC,GAAkC,IAAhC1yH,EAA+B,EAA/BA,SAAU2yH,EAAqB,EAArBA,eACRC,EAAO7+J,qBAAW8+J,IAExB,OACI,cAACL,GAAD,UACI,cAACC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIlrJ,WAAYn0B,IAAUC,OAAOS,UAC7BkhB,MAAOgrC,GAAYA,EAASnI,YAC5Bne,SAAU,SAAClF,GAAD,OACNm+I,EAAen+I,EAAEgwB,OAAOxvC,MAAO,gBAEnCpS,KAAK,cACLw2D,YAAY,cACZ/M,IAAK,IACLoc,QAAS,IACTlqC,QAAQ,YACRzJ,SAAU89I,EAAKr+J,OAASi6J,GAAesE,KACvCz/J,SAAS,gCAwBlB0/J,GAdV,SAAC,GAAkB,IAAhB/yH,EAAe,EAAfA,SACEtsB,EAAWjL,YAAYolJ,IAAkBD,KAEzC+E,EAAiBtC,KAEvB,OACI,cAAC,GAAD,CACIrwH,SAAUA,EACVtsB,SAAUA,EACVi/I,eAAgBA,KC5DtBK,GAA6B7jK,IAAOC,IAAV,sIAsBjB6jK,GAbV,SAAC,GAAmB,IAAjBC,EAAgB,EAAhBA,UACJ,OACI,eAACF,GAAD,WACI,cAAC,GAAD,CAAUz/J,QAAS,kBAAM2/J,EAAU1F,GAAkBoE,WAAWv+J,SAAS,6BAAzE,mCAGA,cAAC,GAAD,CAAUE,QAAS,kBAAM2/J,EAAU1F,GAAkBqE,MAAMx+J,SAAS,wBAApE,mC,SHlBAqE,K,gDAAAA,E,oDAAAA,E,oDAAAA,E,iDAAAA,Q,KIFL,IAAMy7J,GAAgB,+BCKhBC,GAA2B,yCAAG,0CAAAhyJ,EAAA,6DAAQ1X,EAAR,EAAQA,KAAM2pK,EAAd,EAAcA,UAAWC,EAAzB,EAAyBA,QAASC,EAAlC,EAAkCA,gBAAiBzgK,EAAnD,EAAmDA,MACpFmxD,EAASxwB,eADwB,SAGrBg+D,MAAM0hE,GAAa,0BAAsBG,GAAW,wBAA0B,CAC5F9/H,OAAQ,OACRG,QAAS,CACL,eAAgB,mBAChB,aAAcswB,EAAOuvG,gBACrB,OAAU,cAEdjjI,KAAMzP,KAAKG,UAAU,CACjBv3B,OACA,eAAkB,CACd,UAAa2pK,EACb,iBAAoBE,EACpB,MAASzgK,OAfkB,WAGjC8hC,EAHiC,QAoB9B6+H,GApB8B,yCAqB5B33I,QAAQC,OAAO,CAClBrzB,KAAMksC,EAAI1zC,OACVA,OAAQ0zC,EAAI8+H,cAvBmB,uBA2B1B9+H,EAAI+6B,OA3BsB,oFAAH,sDA8B3BgkG,GAAmB,yCAAG,+BAAAvyJ,EAAA,6DACzB6iD,EAASxwB,eADgB,SAGbg+D,MAAM0hE,GAAa,UAAc,CAC/C3/H,OAAQ,MACRG,QAAS,CACL,eAAgB,mBAChB,aAAcswB,EAAOuvG,gBACrB,OAAU,gBARa,cAGzB5+H,EAHyB,gBAYlBA,EAAIg/H,OAZc,mFAAH,qDCtBnBC,GAAyB,WAClC,IAAM5yJ,EAAcnQ,cACdN,EAAWO,cACjB,OAAO5R,uBACH,SACIuK,EACArG,EACA3E,GNXL,IAA8Bo1K,EAAiBh5F,EMc1C,OADAtqE,GNbyBsjK,EMaKp1K,EAAOo1K,QNbKh5F,EMaIp8E,EAAOo8E,ONZtD,CACH3wE,KAAMuN,GAAQq8J,uBACdj5F,SACAg5F,aMUWV,GAA4B,CAC/B1pK,OACA4pK,QAASjwK,EAASiwK,QAClBD,UAAWhwK,EAASgwK,UACpBE,gBAAiBlwK,EAASkwK,kBAEzB94I,MAAK,SAAAn5B,GAEF,OADAkP,ENbb,SACHsjK,EACAh5F,EACAk5F,GAEA,MAAO,CACH7pK,KAAMuN,GAAQu8J,yBACdH,UACAh5F,SACAk5F,SMIqBE,CAAuBx1K,EAAOo1K,QAASp1K,EAAOo8E,OAAQx5E,IACxDA,KAEVq5B,OAAM,SAAC5rB,GACJ,IAAM+jG,EAA8B,MAAf/jG,EAAMrG,KACrB,4FACA,8CAKN,MAJAuY,EAAY6xF,EAAc,SAC1BtiG,ENRb,SACHsjK,EACAh5F,EACA/rE,GAEA,MAAO,CACH5E,KAAMuN,GAAQy8J,yBACdL,UACAh5F,SACA/rE,SMAgBqlK,CAAuB11K,EAAOo1K,QAASp1K,EAAOo8E,OAAQ/rE,IAEpDA,OAGlB,CAACyB,EAAUyQ,KAINozJ,GAAuB,WAChC,IAAM7jK,EAAWO,cACjB,OAAO5R,uBACH,SAACm1K,GNRF,IAA8BR,EAAiBh5F,EMS1CtqE,GNTyBsjK,EMSKQ,EAAER,QNTUh5F,EMSDw5F,EAAEx5F,ONR5C,CACH3wE,KAAMuN,GAAQ68J,uBACdT,UACAh5F,cMOA,CAACtqE,KCrCIgkK,GAAiC3yI,IAAM/tB,eAElD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS8lK,KACZ,OAAOhsJ,YAAY1U,qBAAWygK,KCxBlC,ICAY98J,GDANg9J,GAAIxlJ,EAAQ,KAELylJ,GAAa,SAACnlH,EAAY5lD,GAAb,OAA6B8qK,GAAEE,OAAOhrK,EAAQ4lD,IAC3DjkB,GAAa,SAACikB,EAAmB5lD,EAAazH,GAAjC,OACtBqtD,EAAMltC,QAAO,SAACC,GAAD,OACTpgB,EAAQogB,EAAKpgB,KAAWyH,EAAOzH,GAASogB,EAAK3T,KAAOhF,EAAOgF,OAGtDimK,GAAW,SAACrlH,EAAYrtD,EAAe6S,GAChD,OAAKw6C,EACEklH,GAAEhnI,KAAKgnI,GAAEI,OAAO3yK,EAAO6S,GAAvB0/J,CAA+BllH,GADnB,MAIVulH,GAAkB,SAC3BvlH,EACAn/C,EACAlO,EACA6S,GAEA,IAEmBggK,EAFFpmK,EAGXqmK,GAHWrmK,EAGgByB,EADd2kK,EADfN,GAAE35F,UAAU25F,GAAEI,OAAO,KAAMlmK,GAAK4gD,GACDklH,GAAEQ,SAAS,CAACF,EAAK7yK,KAEpD,OAAOuyK,GAAES,KAAKF,GAAQ,SAAC1yJ,GAAD,OAAevN,IAAOw6C,K,SCvBpC93C,K,8CAAAA,E,wBAAAA,E,wBAAAA,E,gCAAAA,E,8CAAAA,E,4CAAAA,E,mBAAAA,Q,KCqBZ,IAAM09J,GAAoC,CACtCC,SAAU,GACVC,WAAW,EACXp0K,OAAQ,MACRg+B,QAAS,KACT0kG,KAAM,MAuEG2xC,GAAgB,SAACtkK,GAAD,OAAqBA,EAAMukK,QCrF3CC,GAA2B,WACpC,IAAMjlK,EAAWO,cACjB,OAAO5R,uBACH,SAACmC,GACGkP,EFNL,SAA8BlP,GACjC,MAAO,CACH6I,KAAMuN,GAAQg+J,sBACdp0K,QEGaq0K,CAAqBr0K,MAElC,CAACkP,KAIIolK,GAAsB,WAC/B,IAAMplK,EAAWO,cACjB,OAAO5R,uBACH,SAAC8wK,GACGz/J,EFTL,SAAyBy/J,GAC5B,MAAO,CACH9lK,KAAMuN,GAAQm+J,WACd5F,gBEMa6F,CAAgB7F,MAE7B,CAACz/J,KAIIulK,GAAsB,WAC/B,IAAMvlK,EAAWO,cACjB,OAAO5R,uBACH,SAAC8wK,GACGz/J,EFZL,SAAyBy/J,GAC5B,MAAO,CACH9lK,KAAMuN,GAAQs+J,WACd/F,gBESagG,CAAgBhG,MAE7B,CAACz/J,KAII0lK,GAAuB,WAChC,IAAM1lK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EFbG,CACHrG,KAAMuN,GAAQy+J,mBEaf,CAAC3lK,KAGK4lK,GAAgC,WACzC,IAAM5lK,EAAWO,cACjB,OAAO5R,uBACH,SAAC8wK,GACGz/J,EFhBL,SAAmCy/J,GACtC,MAAO,CACH9lK,KAAMuN,GAAQ2+J,sBACdpG,gBEaaqG,CAA0BrG,MAEvC,CAACz/J,KAII+lK,GAA+B,WACxC,IAAM/lK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EFjBG,CACHrG,KAAMuN,GAAQ8+J,yBEiBf,CAAChmK,KAGKimK,GAAmB,WAC5B,IAAMjmK,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EFlBG,CACHrG,KAAMuN,GAAQg/J,YEkBf,CAAClmK,KCpEKmmK,GAAuC,WAChD,OAAOx3K,uBAAY,SAACmrD,GAChB,IAIIssH,EACAC,EALAt/E,EAAQ,EACRC,EAAM,EACJs/E,EAAMxsH,EAAQysH,eAAiBzsH,EAAQna,SACvC6mI,EAAMF,EAAIG,aAAeH,EAAII,aAGnC,GAAgC,qBAArBF,EAAIG,cAEX,IADAP,EAAMI,EAAIG,gBACFC,WAAa,EAAG,CACpB,IAAMrJ,EAAQiJ,EAAIG,eAAeE,WAAW,GAC5CR,EAAgB9I,EAAMzzE,wBACtB,IAAMg9E,EAAgBvJ,EAAMwJ,aAC5BD,EAAcE,mBAAmBltH,GACjCgtH,EAAcG,OAAO1J,EAAM2J,eAAgB3J,EAAM4J,aACjDpgF,EAAQ+/E,EAAcv4K,WAAW+iB,OACjCw1J,EAAcG,OAAO1J,EAAM6J,aAAc7J,EAAM8J,WAC/CrgF,EAAM8/E,EAAcv4K,WAAW+iB,aAEhC,GAAI80J,GAAOA,IAAQE,EAAIgB,WAA0B,YAAblB,EAAIzsK,KAAoB,CAC/D,IAAM4tK,EAAYnB,EAAIoB,cAChBC,EAAoBnB,EAAIvmI,KAAK2nI,kBACnCD,EAAkBE,kBAAkB7tH,GACpC2tH,EAAkBG,YAAY,aAAcL,GAC5CxgF,EAAQ0gF,EAAkBvuK,KAAKoY,OAC/Bm2J,EAAkBG,YAAY,WAAYL,GAC1CvgF,EAAMygF,EAAkBvuK,KAAKoY,OAEjC,MAAO,CAAEy1E,MAAOA,EAAOC,IAAKA,EAAKq/E,cAAeA,KACjD,KC7BA,I,8HAwDQwB,GAxDY9qK,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,oZACF4zB,UAAU,oCC9ChCg2I,GAAgBnpK,IAAOC,IAAV,irBAER,SAAAC,GAAK,OAAIA,EAAMsmE,OACd,SAAAtmE,GAAK,OAAIA,EAAM4gD,QACT,SAAA5gD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAKjC,SAAA+a,GAAK,OAAKA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOC,SAwBhE0jK,GAAsB7nJ,IAAOC,IAAV,2FA8BVysC,GAjBV,SAAC,GAA8C,IAA5C85B,EAA2C,EAA3CA,IAAK1lB,EAAsC,EAAtCA,KAAMr9C,EAAgC,EAAhCA,MAAOW,EAAyB,EAAzBA,QAASglK,EAAgB,EAAhBA,UAC/B,OACI,eAACD,GAAD,CACI3iG,IAAKA,GAAY,EACjB1lB,KAAMA,GAAc,EACpB18C,QAASA,EACTpB,MAAOomK,EAJX,UAMI,cAAC,GAAD,UACI,cAACC,GAAD,MAGH5lK,GAAgB,cCjDvB6lK,GAAwBtpK,IAAOC,IAAV,8uBAKV,SAAAC,GAAK,OAAIA,EAAMyC,YAOnB,SAAAzC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOgB,OAlBV,cAqBN,SAAAgb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOE,YAgB5B,SAAA8b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAG5B,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAMhC6kL,GAYR,SAAC,GAYC,IAXH1jK,EAWE,EAXFA,MACA0kB,EAUE,EAVFA,SACA0iD,EASE,EATFA,UACAD,EAQE,EARFA,UACAhH,EAOE,EAPFA,QACA5hE,EAME,EANFA,QACAzB,EAKE,EALFA,SACAsnD,EAIE,EAJFA,YACArmD,EAGE,EAHFA,SACAkzD,EAEE,EAFFA,SACA5yD,EACE,EADFA,SAQA,OACI,cAAColK,GAAD,CACIjrK,IAAKy4D,EACLn0D,SAAUA,GAAsB,OAChC6mK,iBAAkB5lK,EAClB6lK,QAXY,SAACxvH,GACb1vB,GACAA,EAAS0vB,EAAM5E,OAAOq0H,YAUtBC,wBAAyB,CAAEC,OAAQ/jK,GACnConE,UAAWA,EACXD,UAAWA,EACX/iB,YAAaA,EACb+b,QAASA,EACT5hE,QAASA,EACTR,SAAUA,EACVzC,YAAW+C,KC3FjB2lK,GAAiB,aAEjBt9C,GAAkBvsH,IAAOC,IAAV,+DA+MN6pK,GAvLV,SAAC,GAeC,IAdHjkK,EAcE,EAdFA,MACAigB,EAaE,EAbFA,aACAmkC,EAYE,EAZFA,YACA8/G,EAWE,EAXFA,WACAh+G,EAUE,EAVFA,UACA6lC,EASE,EATFA,SACAo4E,EAQE,EARFA,iBACAC,EAOE,EAPFA,iBACAC,EAME,EANFA,qBACA/D,EAKE,EALFA,UACArF,EAIE,EAJFA,aAEA9zF,GAEE,EAHF1uE,UAGE,EAFF0uE,WACA9oE,EACE,EADFA,SAEMimK,EAAchlJ,iBAAY,MAD9B,EAEkChC,mBAAStd,GAF3C,mBAEKukK,EAFL,KAEiBC,EAFjB,OAGyClnJ,mBAAwB,MAHjE,mBAGKmnJ,EAHL,KAGoBC,EAHpB,KAIIC,EJUCx6K,uBAAY,SAACmrD,EAAexoD,GAM/B,IALA,IAAMisK,EAAa59H,SAAS6nI,cACtBpB,EAAW9mI,OAAOqnI,eACpByC,EAAc,KACdC,EAAoB,KACpBC,EAAqB,KAChBx2J,EAAI,EAAGA,EAAIgnC,EAAQyvH,WAAWj4J,OAAQwB,IAAK,CAOhD,IANAw2J,EAAqBD,EACrBD,EAActvH,EAAQyvH,WAAWz2J,GACjCu2J,GACIvvH,EAAQyvH,WAAWz2J,GAAGu1J,WACtBvuH,EAAQyvH,WAAWz2J,GAAG02J,aACxBl4J,OACK83J,EAAYG,WAAWj4J,OAAS,GACnC83J,EAAcA,EAAYG,WAAW,GAQzC,GAJID,IACAh4K,GAAUg4K,GAGVh4K,GAAU+3K,EACV,MAIW,MAAfD,IACI93K,EAAS83K,EAAY93J,SACrBhgB,EAAS83K,EAAY93J,QAEzBisJ,EAAMkM,SAASL,EAAa93K,GAC5BisK,EAAMmM,UAAS,GACftD,EAAIuD,kBACJvD,EAAIwD,SAASrM,MAElB,II5CGsM,EAAoC1D,KACpC2D,EAAahmJ,iBAAY,MACzBimJ,EAAejmJ,iBAAY,MAEjC7B,qBAAU,WACN+mJ,EAAcxkK,KACf,CAACA,IAEJ,IAoHuB1T,EAvDjBk5K,EAAiBtB,EACjBA,EAAW9oK,KAAI,SAAC0nK,GACZ,MAAO,CAACA,EAAUvgF,MAAOugF,EAAUtgF,IAAKsgF,EAAUlpK,OAEtD,GAqEN,OAnEA6jB,qBAAU,WACFyoC,GACAo+G,EAAYp6I,QAAQs8B,UAEzB,CAACN,IAEJzoC,qBAAU,WACN,IAAMgoJ,EAAqB,SAACjmJ,GACxBA,EAAEkmJ,iBACFlmJ,EAAEC,kBACF,IAAMoiJ,EAAgBriJ,EAAEgwB,OAAO81C,wBAC/B6+E,GAAoBA,EAAiB,CAAEwB,SAAS,IAChDvB,GACIA,EAAiB,CACbuB,SAAS,EACThlG,IAAKkhG,EAAclhG,IAAM,GACzB1lB,KAAM4mH,EAAc5mH,KAA6B,GAAtB4mH,EAAcjpK,MAAc,KAE3DyrK,GACAA,EAAqB7kJ,EAAEgwB,OAAOo2H,QAAQhsK,KAIxCoiK,EAAW7gI,SAAS0qI,uBAAT,UACV7B,GADU,YACQ/I,IAEzB,GAAIlvE,EACA,cAAoB7wF,MAAMyU,KAAKqsJ,GAA/B,eAA0C,CAA1B,KACJlnH,oBAAoB,QAAS2wH,QAGzC,cAAoBvqK,MAAMyU,KAAKqsJ,GAA/B,eAA0C,CAA1B,KACJrnH,iBAAiB,QAAS8wH,GAG1C,OAAO,WACH,cAAoBvqK,MAAMyU,KAAKqsJ,GAA/B,eAA0C,CAA1B,KACJlnH,oBAAoB,QAAS2wH,OAG9C,CACCtB,EACAE,EACAD,EACAr4E,EACAm4E,EACAjJ,IAeJx9I,qBAAU,WACFgnJ,GAAiBH,EAAYp6I,SAC7By6I,EAAiBL,EAAYp6I,QAASu6I,KAE3C,CAACA,EAAeE,IAGf,cAAC,GAAD,UACI,cAAC,GAAD,CACIv9F,UA9FW,SAAChzB,GAKpB,GAJkB,UAAdA,EAAM/oB,MACN8P,SAAS0pC,YAAY,mBACrBzwB,EAAMsxH,kBAGY,KAAlBtxH,EAAM0xH,SACY,KAAlB1xH,EAAM0xH,SACY,KAAlB1xH,EAAM0xH,SACY,KAAlB1xH,EAAM0xH,QACR,CACE,IAAMhD,EAAYuC,EACdf,EAAYp6I,SAEhBq7I,EAAar7I,QAAU44I,EAAUtgF,MAiF7BvxB,SAAUqzG,EACVvmK,SAAUguF,EACV/rF,OAxBW1T,EAwBUi4K,EAvBtBiB,EACFh0J,QAAO,SAACu0J,EAAD,GAAsC,IAAD,mBAAzBxjF,EAAyB,KAAlBC,EAAkB,KAAb5oF,EAAa,KAKzC,OAJAmsK,EACIxjF,GADJ,uBAEoByhF,GAFpB,YAEsCA,GAFtC,YAEwD/I,EAFxD,sBAEkFrhK,EAFlF,aAEyFmsK,EAAIxjF,IAC7FwjF,EAAIvjF,GAAJ,UAAcujF,EAAIvjF,GAAlB,WACOujF,IACRz5K,EAAK0qD,MAAM,KACb3pD,KAAK,KAgBFyP,SAAUwjK,EAAY,OAAS,OAC/B57I,SA9Ia,SAAC1kB,GACK,OAAvBslK,EAAWp7I,SACXvM,aAAa2nJ,EAAWp7I,SAExBk6I,GACAA,EAAiB,CACbuB,SAAS,IAGbxB,GACAA,EAAiB,CACbwB,SAAS,IAIjB,IAAM7C,EAAYuC,EACdf,EAAYp6I,SAEhBw6I,EAAkB5B,EAAUtgF,KAE5B+iF,EAAar7I,QAAUq7I,EAAar7I,QAC9B44I,EAAUtgF,IAAM+iF,EAAar7I,QACzB44I,EAAUtgF,IACV+iF,EAAar7I,QACjB44I,EAAUtgF,IAChB8iF,EAAWp7I,QAAUtuB,YAAW,WAC5B4oK,EAAcxkK,GACVigB,GACAA,EAAajgB,EAAOulK,EAAar7I,SAErCy6I,EAAiBL,EAAYp6I,QAAS44I,EAAUtgF,KAChD8iF,EAAWp7I,QAAU,KACrBq7I,EAAar7I,QAAU44I,EAAUtgF,MAClC,MA8GKp+B,YAAaA,EACb+iB,UAAS,8GAAE,kBACPA,IAAc4kB,GAAY5kB,EAAUm9F,MAExC/lK,QA/GY,WACpB,IAAMukK,EAAYuC,EACdf,EAAYp6I,SAEhBq7I,EAAar7I,QAAU44I,EAAUtgF,KA4GzBnkF,SAAUA,OCzMpBqoH,GAAkBvsH,IAAOC,IAAV,yFAMf4rK,GAA2B7rK,IAAOC,IAAV,iDA0Qf6rK,GA5PV,SAAC,GAUC,IATHjmK,EASE,EATFA,MACAkmK,EAQE,EARFA,kBACAn6E,EAOE,EAPFA,SACA7lC,EAME,EANFA,UACA9B,EAKE,EALFA,YACA+hH,EAIE,EAJFA,mBACAlL,EAGE,EAHFA,aACAqF,EAEE,EAFFA,UACAjiK,EACE,EADFA,SAEMgnK,EAAoC1D,KADxC,EAGwCrkJ,mBAIvC,CACCqoJ,SAAS,EACThlG,IAAK,EACL1lB,KAAM,IAVR,mBAGKmrH,EAHL,KAGoBjC,EAHpB,OAawC7mJ,mBAIvC,CACCqoJ,SAAS,EACThlG,IAAK,EACL1lB,KAAM,IApBR,mBAaKorH,EAbL,KAaoBjC,EAbpB,OAuB8B9mJ,mBAAS,CAAEilE,MAAO,EAAGC,IAAK,IAvBxD,mBAuBKw5E,EAvBL,KAuBesK,EAvBf,OAwBoChpJ,oBAAS,GAxB7C,mBAwBKipJ,EAxBL,KAwBkBC,EAxBlB,OAyBwClpJ,oBAAS,GAzBjD,mBAyBKmpJ,EAzBL,KAyBoBC,EAzBpB,OA0BgDppJ,mBAAS,IA1BzD,mBA0BKqpJ,EA1BL,KA0BwBtC,EA1BxB,OA2BkC/mJ,mBAChC6oJ,GAA0C,IA5B5C,mBA2BKjC,EA3BL,KA2BiB0C,EA3BjB,KA+BFnpJ,qBAAU,WACF0oJ,GACAS,EAAcT,KAEnB,CAACA,EAAoBS,IAExB,IAiBMC,EAAiB,WACnB,IAAM/E,EAAW3mI,SACX6mI,EAAWlnI,OACbgnI,EAAIgB,UACJhB,EAAIgB,UAAUgE,QACPhsI,OAAOqnI,gBACdH,EAAIG,eAAegD,mBA4DrB4B,EAAsB58K,uBACxB,SAACyP,GACGgtK,EACI1C,EAAW52J,QAAO,SAACw1J,GACf,OAAOA,EAAUlpK,KAAOA,QAIpC,CAACsqK,IAIC8C,EAAsB,SAACzkF,EAAeC,GAClB0hF,EAAW52J,QAC7B,SAACw1J,GAAD,OAAoBA,EAAUlpK,KAAV,UAAoB2oF,EAApB,YAA6BC,MAEnC,GACdukF,EAAoB,GAAD,OAAIxkF,EAAJ,YAAaC,IA5Cf,SAAC5oF,EAAY2oF,EAAeC,GACjD,IAAIykF,EAAyB,aAAO/C,GAChCgD,EAAa3kF,EACb4kF,EAAW3kF,EACT4kF,EAAoBlD,EAAW52J,QAAO,SAACw1J,GACzC,OACKvgF,GAASugF,EAAUvgF,OAASA,GAASugF,EAAUtgF,KAC/CA,GAAOsgF,EAAUvgF,OAASC,GAAOsgF,EAAUtgF,KAC3CsgF,EAAUtgF,KAAOA,GAAOsgF,EAAUvgF,OAASA,KAIpD,GAAI6kF,EAAkBt6J,OAAS,EAAG,CAAC,IAAD,iBACTs6J,GADS,yBACrBC,EADqB,QAE1BH,EAAat6J,KAAKC,IAAIq6J,EAAYG,EAAS9kF,OAC3C4kF,EAAWv6J,KAAKyqC,IAAI8vH,EAAUE,EAAS7kF,KACvCykF,EAAgBA,EAAc35J,QAC1B,SAAAw1J,GAAS,OAAIA,EAAUlpK,KAAOytK,EAASztK,OAJ/C,2BAAyC,IADX,+BAUlCqtK,EAAcr1J,KAAK,CAAE2wE,MAAO2kF,EAAY1kF,IAAK2kF,EAAUvtK,GAAIA,IAC3DgtK,EAAcK,GACdK,GAAkB,GAsBdC,CAAiB,GAAD,OAAIhlF,EAAJ,YAAaC,GAAOD,EAAOC,IAInD/kE,qBAAU,WACF8oJ,IACAS,EAAoBhL,EAASz5E,MAAOy5E,EAASx5E,KAC7CgkF,GAAe,MAEpB,CAACxK,EAAUuK,EAAarC,EAAY8C,IAEvCvpJ,qBAAU,WACFgpJ,IACAM,EAAoBJ,GACpBW,GAAkB,GAClBZ,GAAiB,MAEtB,CAACC,EAAmBF,EAAevC,EAAY6C,IAGlDtpJ,qBAAU,WACN,IAAMwpJ,EAAgB,aAAI/C,GAAY52J,QAAO,SAACw1J,GAC1C,OAAOA,EAAUtgF,KAAOxiF,EAAM8M,UAE9Bm6J,EAAcn6J,SAAWo3J,EAAWp3J,SACpC85J,EAAcK,GACdK,GAAkB,MAEvB,CAACtnK,EAAOkkK,EAAY0C,IAEvB,IAAMY,EAAsBzL,KAzK1B,EA0K0Cz+I,oBAAS,GA1KnD,mBA0KKmqJ,EA1KL,KA0KqBH,EA1KrB,KAyLF,OAbA7pJ,qBAAU,WACFgqJ,IACAD,EAAoBtD,EAAYjJ,GAChCqM,GAAkB,MAEvB,CACCpD,EACAsD,EACAvM,EACAwM,EACAH,IAIA,cAACh/F,GAAA,EAAD,CACIngC,YAAa,WACTg8H,EAAiB,CAAEwB,SAAS,IAC5BvB,EAAiB,CAAEuB,SAAS,KAHpC,SAMI,eAAC,GAAD,WACKS,EAAcT,SACX,cAAC,GAAD,CACIhlG,IAAKylG,EAAczlG,IACnB1lB,KAAMmrH,EAAcnrH,KACpB18C,QAAS,WACL4lK,EAAiB,CAAEwB,SAAS,IAC5Ba,GAAe,GACfK,OAIXR,EAAcV,SACX,cAAC,GAAD,CACIhlG,IAAK0lG,EAAc1lG,IACnB1lB,KAAMorH,EAAcprH,KACpB18C,QAAS,WACL6lK,EAAiB,CAAEuB,SAAS,IAC5Be,GAAiB,GACjBG,KAEJtD,UAAWnlL,IAAUC,OAAOE,WAGpC,cAACynL,GAAD,UACI,cAAC,GAAD,CACIhmK,MAAOA,EACPkkK,WAAYA,EACZ0C,cAAeA,EACf3mJ,aAAc,SAACvrB,EAAM+vK,GAAP,OA7JT,SAAC/vK,EAAc+vK,GACpC,GAAI14E,EACA,OAAO,EAEX,IAAM27E,EAAchzK,EAAKoY,OACnB66J,EAAYjzK,EAAKoY,OAAS9M,EAAM8M,OACtCo5J,EAAkBxxK,GAClB,IAAIkzK,EAAiB,aAAO1D,GAU5B0D,GANAA,GAHAA,EAAoBA,EAAkBt6J,QAAO,SAAAw1J,GACzC,OAAOA,EAAUtgF,IAAMklF,MAEWp6J,QAAO,SAAAw1J,GACzC,OACI2B,EAAgB3B,EAAUvgF,OAASkiF,EAAgB3B,EAAUtgF,QAI/BpnF,KAAI,SAAA0nK,GACtC,GAAIA,EAAUvgF,OAASkiF,EAAe,CAClC,IAAMliF,EAAQugF,EAAUvgF,MAAQolF,EAC1BnlF,EAAMsgF,EAAUtgF,IAAMmlF,EAC5B,MAAO,CAAEplF,MAAOA,EAAOC,IAAKA,EAAK5oF,GAAG,GAAD,OAAK2oF,EAAL,YAAcC,IAEjD,OAAOsgF,KAGf8D,EAAcgB,GAoIMC,CAAiBnzK,EAAM+vK,IAE3B14E,SAAUA,EACV+7E,cAAef,EACf7gH,UAAWA,EACXi+G,iBAAkBA,EAClBC,iBAAkBA,EAClBC,qBAAsBA,EACtBjgH,YAAaA,EACbk8G,UAAWA,EACXrF,aAAcA,EACd9zF,UApMI,SAAC4gG,GACrB,IAAMjF,EAAYuC,EAAkC0C,EAAK79I,SACrD44I,EAAUvgF,QAAUugF,EAAUtgF,MAGlC4hF,EAAiB,CAAEuB,SAAS,IAC5BxB,EAAiB,CACbwB,SAAS,EACThlG,IAAKmiG,EAAUjB,cAAclhG,IAAM,GACnC1lB,KACI6nH,EAAUjB,cAAc5mH,KACQ,GAAhC6nH,EAAUjB,cAAcjpK,MACxB,KAER0tK,EAAY,CAAE/jF,MAAOugF,EAAUvgF,MAAOC,IAAKsgF,EAAUtgF,IAAM,MAuL3CnkF,SAAUA,YChR5B2pK,GAAe7tK,IAAOC,IAAV,0FAGI,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,cAAgB,SAGnDkkI,GAAiBnpK,wBAI3B,CACCilC,SAAS,EACThmC,UAAU,IAERmqK,GAAkBD,GAAe7/F,SAE1B+/F,GAKR,SAAC,GAA4D,IAA1DtqK,EAAyD,EAAzDA,SAAUpF,EAA+C,EAA/CA,UAAWsrC,EAAoC,EAApCA,QAAShmC,EAA2B,EAA3BA,SAAUwU,EAAiB,EAAjBA,WAC5C,OACI,cAACy1J,GAAD,CAAcvvK,UAAWA,EAAWsrC,QAASA,EAA7C,SACI,cAACmkI,GAAD,CACIloK,MAAO,CACH+jC,QAASA,EACThmC,SAAUA,EACVwU,WAAYA,GAJpB,SAOK1U,OC7BXsyH,GAAOh2H,IAAOC,IAAV,+ZAGQ,SAAAC,GAAK,OAAIA,EAAMkY,cACF,SAAAlY,GAAK,OAAKA,EAAM0pC,QAAU,IAAM,SACjC,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,MAAQ,OAC9B,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,OAAS,SACpC,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,MAAQ,UAE3C,SAAA1pC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAO9CqpL,GAAUjuK,IAAOC,IAAV,wIASAiuK,GAA0C,SAAC,GAGjD,IAFHxqK,EAEE,EAFFA,SACApF,EACE,EADFA,UAEM/O,EAASqV,qBAAWkpK,IAE1B,OACI,eAAC,GAAD,CACIlkI,QAASr6C,EAAOq6C,QAChBxxB,WACI7oB,EAAO6oB,WAAa7oB,EAAO6oB,WAAan0B,IAAUC,OAAOC,MAE7Dma,UAAWA,EALf,UAOK/O,EAAOqU,UAAY,cAACqqK,GAAD,IACnBvqK,MC1CPs9C,GAAUhhD,IAAOC,IAAV,oFAKAkuK,GAER,SAAC,GAAD,IAAGzqK,EAAH,EAAGA,SAAUpF,EAAb,EAAaA,UAAb,OACD,cAAC,GAAD,CAASA,UAAWA,EAApB,SAAgCoF,KCR9B4wB,GAAQt0B,IAAOC,IAAV,qHAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5BgpL,GAGR,SAAC,GAAD,IAAG1qK,EAAH,EAAGA,SAAUpF,EAAb,EAAaA,UAAW4F,EAAxB,EAAwBA,SAAxB,OACD,cAAC,GAAD,CAAO5F,UAAWA,EAAW6C,YAAW+C,EAAxC,SAAmDR,KCRjDgiG,ICFS1lG,IAAOC,IAAV,0GAGG,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,GAAM,KAI5B5D,IAAOi0C,IAAV,sFAGF,SAAA/zC,GAAK,OAAKA,EAAM0D,SAAW,GAAM,KDR5B5D,IAAOC,IAAV,0JAWXouK,GAAmBruK,IAAOC,IAAV,iSAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO+C,YAgB5BqnL,GAKR,SAAC,GAAsD,IAApD5qK,EAAmD,EAAnDA,SAAU6qK,EAAyC,EAAzCA,SAAUC,EAA+B,EAA/BA,eAAgBtqK,EAAe,EAAfA,SAClC3U,EAASqV,qBAAWkpK,IAE1B,OACI,eAAC,GAAD,CAAalkI,SAAUr6C,EAAOq6C,QAAShmC,SAAUrU,EAAOqU,SAAxD,WACM4qK,GACE,cAACH,GAAD,CAAkBjqK,QAASmqK,EAAUptK,YAAW+C,EAAhD,oBAEHR,MEWE+qK,GAxDKrwK,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,sBACID,KAAK,UACL4zB,OAAO,UACPkyC,YAAY,KACZ5lE,EAAE,gJ,UC/CbmvK,GAAiC1uK,IAAOC,IAAV,oLAS9B0uK,GAA2B3uK,IAAOC,IAAV,yKAEnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAOjCge,GAAenD,IAAOC,IAAV,0KAUZ2wD,GAAgB5wD,IAAOC,IAAV,4GAGb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAI5BsiF,GAAa5mE,IAAOC,IAAV,4FACV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAK5BsqL,GAA0B5uK,IAAOC,IAAV,8GAIlB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAGjC0pL,GAAiB7uK,YAAO8uK,KAAP9uK,CAAH,mEC2BZ+uK,GA9D+B,SAAC,GAQxC,IAPHC,EAOE,EAPFA,OACAhhI,EAME,EANFA,YACA5lB,EAKE,EALFA,OACA6mJ,EAIE,EAJFA,OACAC,EAGE,EAHFA,OACApvK,EAEE,EAFFA,gBACAqvK,EACE,EADFA,YAEMr9J,EAAcnQ,cAkBpB,OAXAoyD,UAAUq7G,aAAaC,aAAa,CAAEC,OAAO,EAAMC,OAAO,IAASjkJ,MAC/D,SAAAkkJ,GACIA,EAAOC,YAAY75J,SAAQ,SAAUgvF,GACjCA,EAAM8qE,aAGd,WAVAT,EAAO,MACPn9J,EAAY,wCAAyC,YAerD,cAACq8D,GAAA,EAAD,CAAmBngC,YAAaA,EAAhC,SACI,eAAC0gI,GAAD,WACI,cAACE,GAAD,UACI,cAACC,GAAD,CACIG,OAAQA,EACR1wK,UAAU,aACV2wK,OAAQA,EACRC,OAAQA,EACR78K,SAAU,YACV88K,YACIA,GAEMlrL,IAAUC,OAAOE,SAE3B0b,gBACIA,GAEM7b,IAAUC,OAAOiB,YAInC,cAACwpL,GAAD,UACI,eAACxrK,GAAD,CAAciB,QAASgkB,EAAvB,UACI,cAAC,GAAD,UACI,cAAC,GAAD,MAEJ,cAACw+C,GAAD,8BCjDT+oG,GAnBYvxK,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,wBAAQ09D,GAAG,IAAIC,GAAG,IAAI9iD,EAAE,MAAMyZ,OAAO,YACrC,sBAAM1zB,EAAE,gHAAgHF,KAAK,kBCM9HswK,GAnBYvxK,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,wBAAQ09D,GAAG,IAAIC,GAAG,IAAI9iD,EAAE,MAAMyZ,OAAO,YACrC,sBAAM1zB,EAAE,gBAAgB0zB,OAAO,UAAU+vF,iBAAe,gBCMzD4sD,GAnBWxxK,sBACtB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,wBAAQ09D,GAAG,IAAIC,GAAG,IAAI9iD,EAAE,MAAMyZ,OAAO,YACrC,sBAAMp0B,EAAE,IAAIC,EAAE,IAAIL,MAAM,IAAIC,OAAO,IAAImxK,GAAG,IAAIxwK,KAAK,kBCdtDywK,GAAoB9vK,IAAOC,IAAV,2HAOjBwxH,GAAoBzxH,IAAOC,IAAV,wJAQjB8vK,GAAsB/vK,IAAOC,IAAV,kDAInBkD,GAAenD,IAAOC,IAAV,iJAUZ+vK,GAAgBhwK,IAAOC,IAAV,qEACb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5BwrL,GAAqBjwK,IAAOC,IAAV,qGAMlBiwK,GAAkBlwK,IAAOC,IAAV,6LAIJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAClC,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAKjCwrL,GAAanwK,IAAOC,IAAV,6MACV,SAAAC,GAAK,OAAKA,EAAMo1G,OAAN,UAAkBp1G,EAAMo1G,OAAxB,KAAoC,KAMnC,SAAAp1G,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAClC,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOM,wBCzCjC4rL,GAAb,+MACItuK,MAAQ,CACJ8hH,SAAU,EAAK1jH,MAAM0jH,SACrB7zF,QAAS,KACTsgJ,UAAU,GAJlB,EAOIC,YAAa,EAPjB,EAQIhB,WARJ,IASIiB,yBATJ,IAUIC,YAVJ,IAWIC,yBAXJ,IAaIC,WAAa,WACT,EAAKpB,MAAMqB,QAdnB,EAiBIC,YAAc,WACV,EAAKtB,MAAMuB,SAlBnB,EAqBIC,WAAa,WACJ,EAAKR,aACV,EAAKhB,MAAMyB,YAAc,EACzB,EAAKP,OAAO3qK,MAAQ,EACpB,EAAKmrK,SAAS,CACVjhJ,QAAS,IAEb,EAAKu/I,MAAMuB,QACP,EAAK3wK,MAAM+uK,QACX,EAAK/uK,MAAM+uK,WA9BvB,EAkCIgC,aAAe,SAACxiC,GACPA,IACL,EAAK6gC,MAAMyB,YAActiC,EACzB,EAAK6gC,MAAMqB,SArCnB,EAwCIO,6BAA+B,SAAC7rJ,GAC5B,GAAK,EAAKiqJ,MAAV,CACA,IAEM6B,IAFgB9rJ,EAAE+rJ,QAAU,EAAKC,yBACpB,EAAKC,uBAC2BhrH,QAAQ,GAE3D,OAAO,EAAKxkD,MAAM8hH,SAAW7tG,OAAOo7J,KA9C5C,EAiDIE,sBAAwB,WACpB,OAAO,EAAKd,oBAAoBplF,wBAAwBrqC,MAlDhE,EAqDIwwH,oBAAsB,WAClB,OAAO,EAAKf,oBAAoBplF,wBAAwB1sF,OAtDhE,EAyDI8yK,kBAAoB,WAChB,EAAKjB,YAAa,EAElB,EAAKE,OAAO3qK,MAAQ,EACpB,EAAK4qK,oBAAsB,KACvB,EAAKvwK,MAAMsxK,UACX,EAAKlC,MAAMqB,OAEf,EAAKrB,MAAMmC,OAAS,WAChB,EAAKhB,oBAAsBiB,aAAY,WAC/B,EAAKpC,QACL,EAAKkB,OAAO3qK,MAAQ,EAAKypK,MAAMyB,YAC/B,EAAKC,SAAS,CACVjhJ,QAC8B,IAAzB,EAAKu/I,MAAMyB,YACZ,EAAKjvK,MAAM8hH,cAGxB,KACH,EAAKotD,SAAS,CAAEX,UAAU,KAG9B,EAAKf,MAAMqC,QAAU,WACZ,EAAKrB,aACV,EAAKU,SAAS,CAAEX,UAAU,IAC1Br7C,cAAc,EAAKy7C,uBAGvB,EAAKnB,MAAMsC,QAAU,WACjB,EAAKZ,SAAS,CACVjhJ,QAAS,IACTsgJ,UAAU,IAEV,EAAKnwK,MAAM60H,QACX,EAAK70H,MAAM60H,SAEfC,cAAc,EAAKy7C,sBAGvB,EAAKD,OAAOqB,SAAW,SAACxsJ,GACpB2vG,cAAc,EAAKy7C,qBACnB,EAAKnB,MAAMyB,YAAc1rJ,EAAEgwB,OAAOxvC,QAlG9C,2DAsGI,WACIs2B,KAAKm0I,YAAa,IAvG1B,oBA0GI,WAAU,IAAD,OACChsK,EAAM63B,KAAKj8B,MAAMovK,MAEvB,OACI,eAACQ,GAAD,CACI9sK,MACIm5B,KAAKj8B,MAAM8C,MACLm5B,KAAKj8B,MAAM8C,MACX/e,IAAUC,OAAOE,SAJ/B,UAOI,uBACIia,IAAK,SAAAixK,GACD,EAAKA,MAAQA,GAEjBhrK,IAAKA,IAET,cAAC2rK,GAAD,UACI,cAACC,GAAD,CACI7xK,IAAK,SAAAyzK,GACD,EAAKvB,oBAAsBuB,GAE/B1tK,QAAS,SAAAihB,GAAC,OACN,EAAK4rJ,aACD,EAAKC,6BAA6B7rJ,KAN9C,SAUI,cAAC8qJ,GAAD,CACI9xK,IAAK,SAAAmyK,GACD,EAAKA,OAASA,GAElBl7D,OAAQn5E,KAAKr6B,MAAMiuB,cAI/B,eAAC,GAAD,WACI,eAACggJ,GAAD,WAEQ5zI,KAAKr6B,MAAMuuK,SACL,cAAC,GAAD,CAAcjsK,QAAS+3B,KAAKu0I,WAA5B,SAAwC,cAACqB,GAAD,MACxC,cAAC,GAAD,CAAc3tK,QAAS+3B,KAAKy0I,YAA5B,SAAyC,cAAC,GAAD,MAEnD,cAAC,GAAD,CAAcxsK,QAAS+3B,KAAK20I,WAA5B,SAAwC,cAAC,GAAD,SAE5C,cAACd,GAAD,UACKxhC,GACGryG,KAAKmzI,OAASnzI,KAAKmzI,MAAMyB,yBAzJrD,GAAiCr+I,IAAM63E,WCmCxBynE,GAnDS5zK,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,UASKL,GACG,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,eAAeC,SAAS,UAAhC,SACI,sBAAMC,EAAE,oLCYb0yK,GAxDO7zK,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,wBACII,KAAK,eACLC,SAAS,UACT+8D,GAAG,KACHC,GAAG,MACH9iD,EAAE,IACF2Z,UAAU,8BCEf++I,GAnDK9zK,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,WACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,eAAeC,SAAS,UAAhC,SACI,sBAAMC,EAAE,uWC/Cf4yK,GAA4B,uBAI5BC,GAAuB,uBCMvBC,GAAmC,SAACn+K,GAAoE,IAAD,IAahH,MAAO,CAAEo+K,SAZK,iBAAGp+K,QAAH,IAAGA,OAAH,EAAGA,EAAUqqC,MAAK,SAAAnrB,GAAI,MAAkB,aAAdA,EAAKpf,eAA/B,QAAuD,CACjEA,KAAM,WACNmwK,QAASgO,GACTjO,UDbwC,GCcxCE,gBDbyC,KCqB1BmO,eANC,iBAAGr+K,QAAH,IAAGA,OAAH,EAAGA,EAAUqqC,MAAK,SAAAnrB,GAAI,MAAkB,mBAAdA,EAAKpf,eAA/B,QAA6D,CAC7EA,KAAM,iBACNmwK,QAASiO,GACTlO,UDfmC,GCgBnCE,gBDfoC,OEgDtCoO,GAAmBxyK,IAAOC,IAAV,gDAIhBkD,GAAenD,YAAOwD,IAAPxD,CAAH,mGAMZyyK,GAAqBzyK,IAAOC,IAAV,mIAOlByyK,GAAqB1yK,IAAOC,IAAV,wEAKlB0lE,GAAiB3lE,YAAO8rK,GAAP9rK,CAAH,+CACP,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOyC,YAGnCgsL,GAAe3yK,IAAOC,IAAV,0HAOZ2yK,GAyBD,SAAC,GAcC,IAbHrU,EAaE,EAbFA,OACAsU,EAYE,EAZFA,uBACAC,EAWE,EAXFA,uBACAC,EAUE,EAVFA,kBACAhnE,EASE,EATFA,SACAs6D,EAQE,EARFA,OACA2M,EAOE,EAPFA,gBACAC,EAME,EANFA,gBACAC,EAKE,EALFA,aACAC,EAIE,EAJFA,oBACAC,EAGE,EAHFA,qBACAC,EAEE,EAFFA,oBACAj4I,EACE,EADFA,cAEMk4I,EAAe5O,KACfp4D,EAA8BvzF,eAE9Bw6J,EAAarO,KACbL,EAAQS,KAA0B7pJ,UAClC+3J,EAAkB3O,GAASA,EAAM4O,WACjCC,KACF7O,GACAA,EAAM1yK,MACNuzK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,KAEhCk0K,EACF9O,GACAA,EAAM1yK,MACNuzK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,KAClCimK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,IAAIolK,MAhBxC,EAkB0B1hJ,mBAAS,CAAErhB,OAAO,EAAO3B,MAAM,IAlBzD,mBAkBK6uK,EAlBL,KAkBa4E,EAlBb,OAmBsBzwJ,oBAAS,GAnB/B,mBAmBK0wJ,EAnBL,KAmBWC,EAnBX,OAoBwB3wJ,mBAAc,IApBtC,mBAoBKmsJ,EApBL,KAoBYyE,EApBZ,KAqBInwK,IACCyiK,EAAOF,WAAaE,EAAOF,YAAc5H,EAAO9+J,IACnD+zK,EACEQ,EAAezV,EAAOiE,UAAYnE,GAAkBqE,IAE1Dp/I,qBAAU,WACN,OAAO,WACH2wJ,OAGL,IAEH3wJ,qBAAU,WACFuwJ,GACIvE,GACAyD,EAAkBzD,EAAO/Q,EAAO9+J,IAAI6rB,MAChC,SAACpsB,GACOs0K,GACAD,EAAW,CACP5O,QAAS,YACTh5F,OAAQ4yF,EAAO9+J,UAQxC,CAAC6vK,IAwBJhsJ,qBAAU,WACFqwJ,IACAG,GAAQ,GACRC,EAASJ,MAEd,CAACA,IAEJ,IAKMM,EAAkB,WACpBH,GAAQ,GACRF,EAAU,6BAAK5E,GAAN,IAAcltK,OAAO,MAc5BoyK,EAAQ/uJ,iBAAY,MAYpBgvJ,EAAmBnkL,uBAAY,WACjCs8G,EAA4B,CACxB7+D,WAAY,gBACZ/E,YAAa,4CACbmF,UAAW,kBAAMglI,EAAuBtU,EAAO9+J,SAEpD,CAACozK,EAAwBtU,EAAO9+J,GAAI6sG,IAEvC,OACI,mCACA,cAACkmE,GAAD,CAAkBn0K,IAAK61K,EAAvB,SACI,cAAC,GAAD,CACItqI,QAASoqI,EACTpwK,SAAUA,GAAY4vK,EAF1B,SAII,eAAC,GAAD,WACI,eAAC,GAAD,CACIhF,gBAAiBziE,EACjBwiE,SAAU4F,EACVjwK,SACI8vK,EACM,2BACA,gCANd,YASOjoE,GAAYnoG,IAAa,cAAC+uK,GAAD,IAC5B,cAAC,GAAD,UACKqB,EAAe,MAAQ,aAE5B,cAACruG,GAAD,CACIomG,kBAAmB,SAAClmK,GAAD,OACfitK,EAAuBjtK,EAAO04J,EAAO9+J,KAEzCqhK,aAAcvC,EAAO9+J,GACrBusK,mBAAoBzN,EAAOsD,SAC3Bh8J,MAAO04J,EAAOhkK,KACdwxD,WAAYwyG,EAAOhkK,KACnBq3F,UAAWma,GAAYnoG,EACvBuiK,YACME,EAAOF,WACTE,EAAOF,YAAc5H,EAAO9+J,GAEhCwqD,YACI+pH,EACM,wCACA,kCAEV9vK,SACI8vK,EACM,0BACA,oCAIlB,eAAC,GAAD,YACMhF,EAAO7uK,MAAQkmK,EAAOt2I,UAAYwuI,EAAO9+J,IACvC,cAACgzK,GAAD,UACI,eAACC,GAAD,WACK3mE,GACG,cAAC,GAAD,CACItoG,MAAM,eACNhJ,OA3HjB,WACnB04K,IACA1xK,YAAW,WACP2xK,EAAqB7U,EAAO9+J,IAC5Bm0K,EAAU,CAAEzzK,MAAM,EAAM2B,OAAO,MAChC,MAuHiCgC,WAAY,cAAC,GAAD,IACZd,MAAM,UACNnC,QAAQ,cACRqC,WAAY,GACZzE,MAAO,OACPyF,SACI8vK,EACM,iCACA,wCAIjBjoE,GAAYwyD,EAAOhkK,KAAKoY,OAAS,GAC9B,cAAC,GAAD,CACIlP,MAAM,iBACNK,WAAY,cAAC,GAAD,IACZrJ,OApIlB,WAClB,IAAM25K,EAAoB/B,GAAiCj3I,GACrDlnC,EAAWqqK,EAAOiE,UAAYnE,GAAkBoE,SAChD2R,EAAkB9B,SAClB8B,EAAkB7B,eAExBY,IACAG,EACI/U,EAAOhkK,KACPrG,EACA,CAAEywK,QAAS,YAAah5F,OAAQ4yF,EAAO9+J,MA2HPoB,QAAQ,cACRkD,QAAS2vK,EACTxwK,WAAY,GACZgB,SACI8vK,EACM,mCACA,0CAIjBzV,EAAO8V,UACJ,cAAC,GAAD,CACI5wK,MAAM,OACNK,WAAY,cAAC,GAAD,IACZrJ,OA9Gd,WACtB04K,IACAH,EAAgBzU,EAAO9+J,KA6GaoB,QAAQ,cACRqC,WAAY,GACZzE,MAAO,OACPyF,SACI8vK,EACM,yBACA,qCAO7BhF,EAAO7uK,MACJ,cAAC,GAAD,CACI6uK,OAAQA,EAAOltK,MACfksC,YAAaimI,EACbhF,OAtIT,SAACK,GAChByE,EAASzE,EAAM9uG,MACf6yG,IACAO,EAAU,CAAE9xK,OAAO,EAAO3B,MAAM,KAoIRioB,OAjJN,WAClB0rJ,GAAQ,GACRF,EAAU,6BAAK5E,GAAN,IAAcltK,OAAO,QAkJbukK,EAAOt2I,UAAYwuI,EAAO9+J,IACvB,cAAC,GAAD,CACI6vK,MAAO/Q,EAAO8V,SACdzwD,SACI26C,EAAO36C,SAAW26C,EAAO36C,SAAW,GAExCqrD,OAAQ,kBAAMgE,EAAgB1U,EAAO9+J,KACrC+xK,UAAU,EACVz8C,OArIL,WACG,aAAlBsxC,EAAOt0K,QAAyBmiL,EAAMnkJ,UACtCmkJ,EAAMnkJ,QAAQyrB,eAAe,CACzB84H,SAAU,SACVC,MAAO,UAEXrB,qBAyLGsB,GA3CV,SAAC,GAAoC,IAAlCjW,EAAiC,EAAjCA,OAAQ36J,EAAyB,EAAzBA,SAAUmoG,EAAe,EAAfA,SAChB1qG,EAAWO,cAEXgG,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtB6rI,EAAS/sJ,YAAY8sJ,IAErBqO,EAAgB1N,KAChBhyC,EAASuyC,KACToN,EAAYjO,KACZkO,EAAY/N,KACZgO,EAAiB3N,KACjB4N,EAAgBzN,KAEhB0N,EAAmBrV,KACnBsV,EAAmBnV,KAEnBoV,EAAsBxU,KACtBplI,EAAgB+2H,KAEtB,OACI,cAAC,GAAD,CACIoM,OAAQA,EACRsU,uBAAwBiC,EACxBhC,uBAAwBiC,EACxBhC,kBAAmBiC,EACnBptK,QAASA,EACT6yB,QAASA,EACT4rI,OAAQA,EACR2M,gBAAiB0B,EACjBzB,gBAAiB0B,EACjBvB,qBAAsBwB,EACtBvB,oBAAqBwB,EACrB3B,aAAcn+C,EACdo+C,oBAAqBsB,EACrBr5I,cAAeA,EAAcjpC,KAC7ByR,SAAUA,EACVmoG,SAAUA,EACV1qG,SAAUA,K,UC5VP4zK,GAhEK72K,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAR,SACI,8BACI,oBAAG8zB,UAAU,2DAAb,UACI,wBAAQkpC,GAAG,MAAMC,GAAG,MAAM9iD,EAAE,QAC5B,wBAAQ6iD,GAAG,MAAMC,GAAG,IAAI9iD,EAAE,QAC1B,wBAAQ6iD,GAAG,MAAMC,GAAG,OAAO9iD,EAAE,WAEjC,oBAAG2Z,UAAU,4CAAb,UACI,wBAAQkpC,GAAG,MAAMC,GAAG,MAAM9iD,EAAE,QAC5B,wBAAQ6iD,GAAG,MAAMC,GAAG,IAAI9iD,EAAE,QAC1B,wBAAQ6iD,GAAG,MAAMC,GAAG,OAAO9iD,EAAE,wBC9BvD07J,GAA0Bl1K,IAAOC,IAAV,+EAKvBk1K,GAA2Bn1K,IAAOC,IAAV,4BAExBm1K,GAAqBp1K,IAAOC,IAAV,oOAOL,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,GAAK,KAC9B,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,EAAI,MAChC,SAAA1pC,GAAK,OAAKA,EAAMkzH,OAAS,SAAW,aAGhDiiD,GAAsBr1K,IAAOC,IAAV,sGAEH,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,MAAQ,iBAIlD0rI,GAID,SAAC,GAAgD,IAA9C/W,EAA6C,EAA7CA,OAAQ8H,EAAqC,EAArCA,OAAQkP,EAA6B,EAA7BA,uBAA6B,EACXpyJ,mBAASo7I,GADE,mBAC1CiX,EAD0C,KAC7BC,EAD6B,KAE3Ch7G,EAAY71D,qBAAW8wK,IACvBjS,EAAO7+J,qBAAW8+J,IAExBpgJ,qBAAU,WACNm3C,GAAaA,EAAU1qC,QAAQgiG,SAAS,EAAG,KAC5C,CAACt3D,IAEJn3C,qBAAU,WACNmyJ,EAAelX,KAChB,CAACA,EAAQkX,IAiBZ,OACI,cAACP,GAAD,UACI,cAAC,KAAD,CAAiBS,UATP,SAACz2K,GACVA,EAAO02K,aATA,SAAC7I,EAAoBC,GACjC,IAAM9tK,EAAS6B,MAAMyU,KAAKggK,GAD4B,EAEpCt2K,EAAOgwG,OAAO69D,EAAY,GAArC8I,EAF+C,oBAGtD32K,EAAOgwG,OAAO89D,EAAU,EAAG6I,GAC3BJ,EAAev2K,GACfq2K,EAAuBr2K,GAOvB42K,CAAQ52K,EAAO62K,OAAO70K,MAAOhC,EAAO02K,YAAY10K,QAK5C,SACI,cAAC,KAAD,CAAW80K,YAAW,qBAAtB,SACK,SAACC,EAAeC,GAAhB,OACG,eAACf,GAAD,CACI92K,IAAK43K,EAASn/G,SACdq/G,eAAgBD,EAASC,eAF7B,UAIKX,EAAYv0K,KAAI,SAACmS,EAAkBlS,GAChC,IAAI0C,GAAW,EAQf,OANIyiK,GACAA,EAAOF,WACPE,EAAOF,YAAc/yJ,EAAK3T,KAE1BmE,GAAW,GAGX,cAAC,KAAD,CAEIwyK,YAAahjK,EAAK3T,GAAG7P,WACrBsR,MAAOA,EAHX,SAKK,SAAC+0K,EAAUC,GAAX,OACG,eAACb,GAAD,2BACIh3K,IAAK43K,EAASn/G,UACVm/G,EAASI,gBAFjB,IAGIzsI,QACIx2B,EAAKovJ,UACLnE,GAAkBqE,IAL1B,UAQI,cAAC0S,GAAD,2BACI92K,UAAU,SACVsrC,QACIx2B,EAAKovJ,UACLnE,GAAkBqE,IAEtBtvC,OACIqwC,EAAKr+J,OACLi6J,GAAesE,MAEfsS,EAASK,iBAVjB,IAWIn1K,YACIiS,EAAKovJ,UAAYnE,GAAkBqE,IAC7B,gCACA,qCAdd,SAiBI,cAAC,GAAD,OAEJ,cAAC,GAAD,CAEInE,OAAQnrJ,EACRxP,SAAUA,EACVmoG,SACI03D,EAAKr+J,OACLi6J,GAAekX,MALdnjK,EAAK3T,UAlC1B,yBAC2B2T,EAAK3T,QA8CvCw2K,EAAShsH,uBAwBvBusH,GAbV,SAAC,GAAgB,IAAdjY,EAAa,EAAbA,OACE8H,EAAS/sJ,YAAY8sJ,IACrBqQ,EzC7FgC,WACtC,IAAMp1K,EAAWO,cACjB,OAAO5R,uBACH,SAACwlL,GACGn0K,EAAS88J,GAAuBqX,MAEpC,CAACn0K,IyCuFoBq1K,GAEzB,OACI,cAAC,GAAD,CACInY,OAAQA,EACR8H,OAAQA,EACRkP,uBAAwBkB,KC9GrBE,GAxDKv4K,sBAChB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,aACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,oBAAGI,KAAK,OAAOC,SAAS,UAAxB,UACI,sBAAMC,EAAE,kBACR,sBACIF,KAAK,eACLC,SAAS,UACTC,EAAE,wJCnBXq3K,GA7BMx4K,sBACjB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,sBACIC,EAAE,2WACF4zB,UAAU,6ECAvC,SAAS0jJ,GACZ5kL,EACA6kL,EACA7wI,EACAmhB,GAEA,IAAM/lD,EAAWO,cACXw5B,EAAgB+2H,KAA+BhgK,KAC/C4kL,ECnBkC,WACxC,IAAMzD,EAAe5O,KAUrB,OAAO10K,uBAAY,SACfiC,EACAiP,EACA41K,EACA5iL,GACE,IAAD,EACK8iL,EAAO/kL,EAAMiP,GACnB,KAAI,OAAC81K,QAAD,IAACA,GAAD,UAACA,EAAMz8K,YAAP,aAAC,EAAYoY,QAAQ,OAAOga,QAAQo7B,UAExC,IAAMkvH,EAAeD,EAAKxU,UAAYnE,GAAkBoE,SAClDvuK,EAASo+K,SACTp+K,EAASq+K,eACf,OAAOe,EACH0D,EAAKz8K,KACL08K,EACA,CAAEtS,QAASmS,EAAanrG,OAAQqrG,EAAKv3K,OAE1C,CAAC6zK,IDT8B4D,GAC5B7nG,EAAkBx2D,eAJ1B,EAMoCsK,oBAAkB,GANtD,mBAMSosD,EANT,KAMoBC,EANpB,KAQQroB,EACF,CACI,CACIiB,WAAY,wBACZC,eAAgB0uH,EAChBzuH,sBAAuB,CACnBQ,WAAY,CACR72D,QACAiP,MAAOjP,EAAM0gB,OACbmkK,cACA5iL,SAAUm+K,GAAiCj3I,IAE/CqrB,UAAW,SAEfC,aAAc,IAQpBywH,EAAgBnnL,uBAAY,WAC9B28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAEjB,OAATvpC,QAAS,IAATA,YAEL,CAACopC,EAAiBE,EAAWtpC,IAM1BmxI,EAAepnL,uBAAY,WAC7B28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,sBACZzd,QAASq/C,MAKrBE,GAAaC,GAAa,GAEnB,OAAPpoB,QAAO,IAAPA,YAEL,CAAC/lD,EAAUguE,EAAiBE,EAAWnoB,IAElCG,EAAiBL,aACrBC,EACAgwH,EACAC,GAHI7vH,aAUFupH,EAAa9gL,uBAAY,WAC3B28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IACS,OAATppC,QAAS,IAATA,YAEL,CAACopC,EAAiBppC,EAAWshB,IAM1B8vH,EAAcrnL,uBAAY,WAC5B28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,sBACZkjC,wBACImgG,EACJ9gJ,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAyvK,EACAzhG,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACA8nG,MAGL,CAAC9nG,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IErHP,I,gMAAM8nG,GAA4Bt3K,IAAOC,IAAV,6GAMzBkD,GAAenD,YAAOwD,IAAPxD,CAAH,+DAEZ,SAAAE,GAAK,OAAOA,EAAMzB,MAAR,iBAA0ByB,EAAMzB,OAAU,MAGpD84K,GAOD,SAAC,GAOC,IANHlR,EAME,EANFA,OACAmR,EAKE,EALFA,aACA3mI,EAIE,EAJFA,SACA4iI,EAGE,EAHFA,WACAiB,EAEE,EAFFA,UACApB,EACE,EADFA,aAEM7P,EAAO7+J,qBAAW8+J,IAClB9rJ,EAAUW,cAahB,OACI,mCACI,eAAC++J,GAAD,WACI,cAAC,GAAD,CACI7zK,MAAM,mBACNK,WAAY,cAAC,GAAD,IACZF,WACOitC,EAAS0tH,SAGK,IAFZ1tH,EAAS0tH,OAAOtsK,MAAMkhB,QACnB,SAAC6jK,GAAD,OAAsBA,EAAKz8K,QAC7BoY,QACoB,QAAlB0zJ,EAAOt0K,UACLs0K,EAAOF,WACTsN,IACRhQ,EAAKr+J,OAASi6J,GAAesE,KAEjCllK,MAAO,QACPC,OAAO,OACPjE,OAAQ64K,EACRpvK,SAAS,8BAEM,aAAlBmiK,EAAOt0K,OACJ,cAAC,GAAD,CACI0R,MAAM,WACNK,WAAY,cAAC,GAAD,IACZF,WACMitC,EAAS0tH,SAGE,IAFZ1tH,EAAS0tH,OAAOtsK,MAAMkhB,QACnB,SAAC6jK,GAAD,OAAsBA,EAAK3C,YAC7B1hK,UACI0zJ,EAAOF,WACTsN,GAERh5K,OAAQi6K,EACRh2K,OAAO,OACPwF,SAAS,sBAGb,cAAC,GAAD,CACIT,MAAM,OACNK,WAAY,cAAC,GAAD,IACZd,MAAM,UACNvI,OAAQ+8K,EACR94K,OAAO,OACPwF,SAAS,mBAGfiwD,gBACE,cAAC,GAAD,CACI1wD,MAAM,UACNK,WAAY,cAAC,GAAD,IACZF,SAAUitC,EAAS9+C,SAAW++C,KAAiB19C,OAC/CsL,OAAO,OACPjE,OAhEU,WACtBo2C,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBG,SAAS8C,QAC9B,cACAkhD,EAASpxC,GAAG7P,cA4DRsU,SAAS,2BAiClBuzK,GAxBV,WACD,IAAMpR,EAAS/sJ,YAAY8sJ,IACrBv1H,EAAWv3B,YAAYolJ,IAAkBj3J,KACzCgtK,EAAgB1N,KAChBlC,EAAQS,KAA0B7pJ,UAClCg4J,EAAa5O,GAASA,EAAM4O,WAC5BiB,EAAY9vK,qBAAW8yK,IACvBC,EAAyBd,GAC3BhmI,EAAS0tH,OAAOtsK,MAChB,aAGJ,OACI,cAAC,GAAD,CACIo0K,OAAQA,EACRmR,aAAc/C,EACd5jI,SAAUA,EACV4iI,WAAYA,EACZiB,UAAWA,EACXpB,aAAcqE,KC7IpBC,GAA6B53K,IAAOC,IAAV,iIAO1B43K,GAAiB73K,IAAOC,IAAV,8IAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAKxC4yL,GAAiB93K,IAAOC,IAAV,2NAIF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAMxC4yL,GAAa/3K,IAAOC,IAAV,uDAIV+3K,GAAkBh4K,IAAOC,IAAV,uPAWf+oF,GAAchpF,IAAOC,IAAV,6GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCipD,GAAoBptC,IAAOC,IAAV,qHAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCuzL,GAID,SAAC,GAAwD,IAAtDzZ,EAAqD,EAArDA,cAAe0Z,EAAsC,EAAtCA,kBAAmBC,EAAmB,EAAnBA,aACtC,OACI,eAACP,GAAD,WACI,eAACC,GAAD,WACI,eAACC,GAAD,WACI,eAACC,GAAD,WACI,cAAC,GAAD,CAAmB52K,YAAU,+BAA7B,4BACA,cAAC6nF,GAAD,CAAa7nF,YAAU,gCAAvB,SAAwD+2K,OAE5D,eAACH,GAAD,WACI,cAAC,GAAD,CAAmB52K,YAAU,0BAA7B,uBACA,cAAC6nF,GAAD,CAAa7nF,YAAU,2BAAvB,SAAmDg3K,UAG3D,eAAC,GAAD,WACI,cAAC,GAAD,CAAmBh3K,YAAU,+BAA7B,4BACA,cAAC6nF,GAAD,CAAa7nF,YAAU,gCAAvB,SAAwDytI,GAAa4vB,WAG7E,cAAC,GAAD,QA6BG4Z,GArBV,SAAC,GAAoC,IAAlC5Z,EAAiC,EAAjCA,cAAegX,EAAkB,EAAlBA,YACb0C,EACF1C,GACAA,EAAYriK,QACR,SAAC6jK,GAAD,OAAsBA,EAAKxU,UAAYnE,GAAkBoE,YAC3D9vJ,OACAwlK,EACF3C,GACAA,EAAYriK,QACR,SAAC6jK,GAAD,OAAsBA,EAAKxU,UAAYnE,GAAkBqE,OAC3D/vJ,OAEN,OACI,cAAC,GAAD,CACI6rJ,cAAeA,EACf0Z,kBAAmBA,EACnBC,aAAcA,KCtDXE,GArDSj6K,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,kiBC3BhB+4K,GAAuBt4K,IAAOC,IAAV,oHAOpBs4K,GAAkBv4K,IAAOC,IAAV,iHAMfu4K,GAAiBx4K,IAAOC,IAAV,sGAGE,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,cAAgB,SAG1D6uI,GAAiBz4K,IAAOC,IAAV,iPAKF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACtB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAM9CkmH,GAAc9qG,IAAOi0C,IAAV,mEAKXykI,GAAsB14K,YAAOq4K,GAAPr4K,CAAH,mEAKnBO,GAAaP,IAAOgoB,EAAV,gHAGH,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCuzL,GAAc34K,IAAOC,IAAV,4BAEX24K,GAAqB54K,IAAOC,IAAV,wKASlB44K,GAAkB,SAAC,GAIG,IAEpBtsI,EALJsE,EAGuB,EAHvBA,SACAioI,EAEuB,EAFvBA,iBACAr+I,EACuB,EADvBA,QAEMgpI,EAAO7+J,qBAAW8+J,IAcxB,OAZA,OAAIjpI,QAAJ,IAAIA,OAAJ,EAAIA,EAAS6R,SACTC,EAAO,cAAC,GAAD,CAAajoC,IAAKm2B,EAAQ6R,QAAS/nC,IAAI,UAAUpD,YAAU,sBAC3Ds5B,IACP8R,EACI,cAAChB,GAAA,EAAD,CACI3jC,QAAS6yB,EACTp2B,KAAM,KACNunC,cAAegtI,GACf10K,SAAS,uBAKjB,eAACo0K,GAAD,WACI,cAAC,GAAD,CACI9Z,cACI3tH,GAAYA,EAAS0tH,QAAU1tH,EAAS0tH,OAAOC,cAEnDgX,YAAa3kI,EAAS0tH,QAAU1tH,EAAS0tH,OAAOtsK,QAEpD,eAAC0mL,GAAD,WACI,eAACJ,GAAD,WACI,eAACC,GAAD,WACI,cAACC,GAAD,CAAgBt3K,YAAU,2BAA1B,SACI,cAACu3K,GAAD,MAEJ,cAACn4K,GAAD,CAAYY,YAAU,0BAAtB,yBAEJ,eAACq3K,GAAD,CAAgB5uI,SAAO,EAAvB,UACI,cAAC6uI,GAAD,UAAiBlsI,IACjB,cAAChsC,GAAD,CAAYY,YAAU,qBAAtB,uBAGP0vC,EAAS0tH,QACN,cAAC,GAAD,CAAmBA,OAAQ1tH,EAAS0tH,OAAOtsK,QAE9CwxK,EAAKr+J,OAASi6J,GAAekX,MAC1B,cAAC,GAAD,CAAcxS,UAAW+U,WA8B9BC,GApBV,SAAC,GAAoC,IAAlCloI,EAAiC,EAAjCA,SAAUioI,EAAuB,EAAvBA,iBACRlxK,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtBinF,EAAatC,KAQnB,OANA77F,qBAAU,aACF,OAACmX,QAAD,IAACA,OAAD,EAACA,EAASh7B,MAAV,OAAgBmI,QAAhB,IAAgBA,OAAhB,EAAgBA,EAASrU,YACzBkuH,EAAW75G,EAAQrU,aAExB,QAACknC,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAIgiH,EAAd,OAA0B75G,QAA1B,IAA0BA,OAA1B,EAA0BA,EAASrU,YAGlC,cAAC,GAAD,CACIs9C,SAAUA,EACVioI,iBAAkBA,EAClBr+I,QAASA,KC3Ifu+I,GAA6Bh5K,IAAOC,IAAV,kDAI1Bg5K,GAAsBj5K,IAAOC,IAAV,sFAoBVi5K,GAdI,SAAC,GAAyD,IAAvDroI,EAAsD,EAAtDA,SAAUioI,EAA4C,EAA5CA,iBAC5B,OACI,cAACE,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAcnoI,SAAUA,IACxB,cAAC,GAAD,CACIA,SAAUA,EACVioI,iBAAkBA,U,UCpBhC5rI,GAAcltC,IAAOC,IAAV,gIAOXihD,GAAgBlhD,IAAOC,IAAV,uIAObmtC,GAAoBptC,IAAOC,IAAV,2GAEV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACnC,SAAAyb,GAAK,QAAMA,EAAMihD,WAAR,sBAAoCjhD,EAAMihD,UAA1C,QAIT9T,GAAgBrtC,IAAOC,IAAV,2HAObmhD,GAAwBphD,IAAOC,IAAV,sDAIrBk5K,GAA0Bn5K,IAAOC,IAAV,yJAQvBm5K,GAAsBp5K,IAAOC,IAAV,oHAIZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5B40L,GASR,SAAC,GAUC,IATHvrI,EASE,EATFA,SACAD,EAQE,EARFA,UACA1pC,EAOE,EAPFA,MACAwpC,EAME,EANFA,kBAEAjqC,GAIE,EALFkqC,iBAKE,EAJFlqC,UACA41K,EAGE,EAHFA,gBACAC,EAEE,EAFFA,eAEE,KADFC,OAE8Br2J,oBAAS,IADrC,mBACKs2J,EADL,KACcC,EADd,KAEIjoJ,EAAegsC,eAEfk8G,EAAgB,WACdF,GACAhoJ,EAAaoqB,IAAb,UACO09H,GAAkC,UADzC,cAEI,QAGR1rI,KAGJ,OACIpc,EAAa3gC,IAAb,UACOyoL,GAAkC,UADzC,gBAIA1rI,IACO,MAIP,eAACL,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aAD1C,UAGI,cAAC,GAAD,CAAajuB,YAAU,2BAAvB,SACKgD,GAAS,kBAEd,eAAC,GAAD,WACI,cAAC,GAAD,CACIg9C,UAAU,OACVhgD,YAAU,iCAFd,SAIKuC,IAEJ41K,GACG,eAACH,GAAD,WACI,cAACr1J,GAAA,EAAD,CACIzf,KAAM,GACNsG,QAAS8uK,EACT1zJ,OAAQ9hC,IAAUC,OAAO4C,MACzBusC,kBAAmBpvC,IAAUC,OAAO4C,MACpCg/B,aAAc,kBAAM4zJ,GAAYD,IAChCv1K,SAAS,gCAEb,cAACk1K,GAAD,CAAqBj4K,YAAU,oCAA/B,mDAKR,eAAC,GAAD,WACI,cAAC,IAAD,CACI1C,MAAM,QACNC,OAAO,OACPjE,OAAQqzC,EACR9qC,MAAM,UACNnC,QAAQ,UACRqD,SAAS,4BANb,qBAUA,cAAC,GAAD,UACI,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPsE,MAAM,UACNvI,OAAQ,mBAAQk/K,GAAiBA,KACjCz1K,SAAS,6BALb,SAOKypC,GAAqB,wBC/IrCisI,GAAiB,SAC1BjhI,EACA4gE,EACAtnD,GACI,OAAOA,EAAK,kBACKtZ,GACX4gE,IAAa8lD,GAAekX,KAA5B,eACY59H,GADZ,eAEYA,I,SCkBpBkhI,GAAsB75K,IAAOC,IAAV,4BAEnB65K,GAAqB95K,IAAOC,IAAV,+IAQlB8xJ,GAAoB/xJ,IAAOC,IAAV,4FAMjButE,GAAcxtE,IAAOC,IAAV,4FAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC20L,GAAsB/5K,IAAOC,IAAV,wHAOnB+5K,GAAiCh6K,IAAOC,IAAV,kDAI9B2nJ,GAA0B5nJ,IAAOC,IAAV,sDAIvBg6K,GAAgBj6K,IAAOC,IAAV,qHAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInCw1L,GACE,wBADFA,GAEO,0CAFPA,GAGU,UAHVA,GAIgB,UAJhBA,GAKK,gBALLA,IAMO,EANPA,IAOM,EAGNC,GACE,+BADFA,GAEO,kCAFPA,GAGU,UAHVA,GAIgB,KAJhBA,GAKK,mBALLA,IAMO,EANPA,IAOM,EAGNC,GAAa,CACf/mL,QAAS,CACLuN,QAAS,mCACTy5K,WAAY,cACZl2K,MAAO,kBACPs1K,SAAS,EACTD,QAAQ,GAEZ3qI,MAAO,CACHjuC,QAAS,oCACTy5K,WAAY,eACZl2K,MAAO,mBACPs1K,SAAS,EACTD,QAAQ,GAEZ1qI,SAAU,CACNluC,QACI,6LACJy5K,WAAY,eACZl2K,MAAO,mBACPs1K,SAAS,EACTD,QAAQ,GAEZpmL,OAAQ,CACJwN,QAAS,oCACTy5K,WAAY,eACZl2K,MAAO,mBACPs1K,SAAS,EACTD,QAAQ,IAIVc,GAAmB,CAACxpI,KAAiB19C,QAErCmnL,GAkBD,SAAC,GASC,IARH1pI,EAQE,EARFA,SAEA2pI,GAME,EAPFhX,eAOE,EANFgX,sBACAnU,EAKE,EALFA,OACAoU,EAIE,EAJFA,kBACAC,EAGE,EAHFA,wBACAn2J,EAEE,EAFFA,SACAo2J,EACE,EADFA,WAEMC,ECJsC,WAC5C,IAAMv5K,EAAWO,cACX4hK,EAAiBtC,KACjB2Z,EAAuBhkL,eAE7B,OAAO7G,uBACH,SAACqG,GACGwkL,EAAqB,QAAS,CAACxkL,IAAai1B,MACxC,SAACgT,GACGj9B,EAAS0a,aAA6BuiB,EAAU,WAChDklI,EAAe1yH,KAAiBjC,MAAO,UAAU,QAI7D,CAACxtC,EAAUmiK,EAAgBqX,IDVOC,GAChCjW,EAAQS,KAA0B7pJ,UAClCg4J,EAAa5O,GAASA,EAAM4O,WAHhC,EAIsCtwJ,oBAAS,GAJ/C,mBAIK43J,EAJL,KAImBC,EAJnB,OAKgC73J,oBAAS,GALzC,mBAKK83J,EALL,KAKgBC,EALhB,OAM4C/3J,oBAAS,GANrD,mBAMKg4J,EANL,KAMsBC,EANtB,OAOgCj4J,mBAAiB2tB,KAAiB19C,QAPlE,mBAOKioL,EAPL,KAOgBC,EAPhB,KAcIC,EAAc32K,qBAAW42K,IACzB/X,EAAO7+J,qBAAW8+J,IAWxB,OACI,eAACmW,GAAD,WACKkB,GACG,cAAC,GAAD,CACIjtI,SAAU,WACNktI,GAAgB,IAEpBntI,UAAW,WACPmtI,GAAgB,GAChBR,EAAqB,KAAMa,IAE/Bl3K,MAAOi2K,GAAWiB,GAAWl3K,MAC7BwpC,kBAAmBysI,GAAWiB,GAAWhB,WACzCf,gBAAiBc,GAAWiB,GAAW5B,QACvCD,OAAQY,GAAWiB,GAAW7B,OAXlC,SAaKY,GAAWiB,GAAWz6K,UAG9Bq6K,GACG,cAAC,GAAD,CACIntI,SAAU,WACNotI,GAAa,IAEjBrtI,UAAW,WACPqtI,GAAa,GACbT,IACAhX,EAAKhpK,OAAO4kK,GAAekX,OAE/BpyK,MAAO+1K,GACPvsI,kBAAmBusI,GACnBtsI,iBAAkBssI,GAClBZ,gBAAiBY,GACjBX,eAAgBW,GAChBV,OAAQU,GAdZ,SAgBKA,KAGRiB,GACG,cAAC,GAAD,CACIrtI,SAAU,WACNstI,GAAmB,IAEvBvtI,UAAW,WACPutI,GAAmB,GACnBV,IACAjX,EAAKhpK,OAAO4kK,GAAesE,OAE/Bx/J,MAAOg2K,GACPxsI,kBAAmBwsI,GACnBvsI,iBAAkBusI,GAClBb,gBAAiBa,GACjBZ,eAAgBY,GAChBX,OAAQW,GAdZ,SAgBKA,KAGT,eAACL,GAAD,WACI,cAAC,GAAD,UACI,cAACtsG,GAAD,CAAarsE,YAAU,sBAAvB,SACKy4K,GAAe,WAAYnW,EAAKr+J,MAAyByrC,EAASpxC,QAG3E,eAACs6K,GAAD,WACI,cAAC,GAAD,UACI,eAACE,GAAD,WACKppI,EAAS9+C,SAAW++C,KAAiB19C,QAClCqwK,EAAKr+J,OAASi6J,GAAesE,MACzB,uBAAMxiK,YAAU,wBAAhB,sBACc,IACTwgB,aAAWkvB,EAAS4qI,WAAW,MAG3C5qI,EAAS9+C,SAAW++C,KAAiBhC,UAClC20H,EAAKr+J,OAASi6J,GAAesE,MACzB,uBAAMxiK,YAAU,wBAAhB,qBACa,IACRwgB,aAAWkvB,EAAS4qI,WAAW,MAG3C5qI,EAAS9+C,SAAW++C,KAAiBjC,OAClC,sBAAM1tC,YAAU,6BAAhB,oCAMXm5K,GAAiB5oK,SAASm/B,EAAS9+C,QAChC0xK,EAAKr+J,OAASi6J,GAAesE,KACzB,eAACqW,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIv7K,MAAM,QACNC,OAAO,OACPkF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBAlHT1I,EAoHS++C,KAAiBhC,SAnHzDwsI,EAAavpL,QACbipL,GAAgB,GAFc,IAACjpL,GAuHC8O,QAAQ,UACRqD,SAAS,mBAVb,uBAeJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBAAMygL,GAAa,IAC3Bh3K,SAAS,gBALb,uBAYR,eAAC81K,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIt7K,OAAO,OACPD,MAAM,QACNmF,SAAU23K,EACV9gL,OAAQ,WAvIpC8pB,EACA62J,GAAmB,IAEnBV,IACAjX,EAAKhpK,OAAO4kK,GAAesE,QAoIC9iK,QAAQ,UACRqD,SAAS,cANb,sBAWJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,EACV9gL,OAAQ,kBACJ+/K,EAAqB,OAEzBt2K,SAAS,wBAPb,uBAcZ2sC,EAAS9+C,SAAW++C,KAAiBhC,SACrC,cAACkrI,GAAD,UACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIt7K,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBACJmgL,EACI/pI,EAASpxC,KAGjByE,SAAS,mBATb,yBAgBR,eAAC81K,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIt7K,OAAO,OACPD,MAAM,QACNmF,SACsB,QAAlByiK,EAAOt0K,UACLs0K,EAAOF,WACTsN,GACA8H,GACAZ,EAEJlgL,OAAQ,kBACJ+/K,EACI,KACA1pI,KAAiBjC,QAGzBhuC,QAAQ,UACRqD,SAAS,yBAjBb,6BAsBJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SACsB,QAAlByiK,EAAOt0K,UACLs0K,EAAOF,WACTsN,GACA8H,GACAZ,EAEJlgL,OAAQ,kBACJ+/K,EACI,KACA1pI,KAAiB19C,SAGzB8Q,SAAS,mBAhBb,gCAyBpB,cAAC,KAAD,QAoCGw3K,GAtBV,SAAC,GAA8D,IAA5DlB,EAA2D,EAA3DA,qBAAsB3pI,EAAqC,EAArCA,SAAUtsB,EAA2B,EAA3BA,SAAUo2J,EAAiB,EAAjBA,WACxCtU,EAAS/sJ,YAAY8sJ,IACrB5C,EAAiBtC,KACjBuT,EAAgB1N,KAChB0T,EAAoBjZ,KACpBkZ,EAA0BhZ,KAEhC,OACI,cAAC,GAAD,CACI8Y,qBAAsBA,EACtB3pI,SAAUA,EACVw1H,OAAQA,EACR9hJ,SAAUA,EACVi/I,eAAgBA,EAChBiX,kBAAmBA,EACnBC,wBAAyBA,EACzBlD,aAAc/C,EACdkG,WAAYA,KEvaXh6H,GAAmB3gD,IAAOC,IAAV,gUAaf,SAAAC,GAAK,OACXA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAuCwB,EAAMy7K,QAAU,OAAS,UAEtD,SAAAz7K,GAAK,OACbA,EAAMy7K,QACFz7K,EAAMI,MAAMpc,OAAOC,MACnB+b,EAAMI,MAAMpc,OAAOS,aACpB,SAAAub,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACnC,SAAA8a,GAAK,OACFA,EAAMy7K,SAAP,4CAE0Bz7K,EAAMN,MAAQ,MAAQ,OAFhD,yBAGMM,EAAMI,MAAMpc,OAAO4C,MAHzB,sBAIEoZ,EAAM6lB,QAAN,4BAAqC7lB,EAAMI,MAAMpc,OAAOQ,YAJ1D,iDASS,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAKhCsvG,GAAkBh0F,YAAO86C,KAAP96C,CAAH,yEAKf4hD,GAAa5hD,IAAOC,IAAV,kPAYV,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAGpB28D,GAAwBphD,IAAOC,IAAV,qDAIrB2gD,GAAkB5gD,YAAO8sC,KAAO7sC,IAAdD,CAAH,yTASV,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAElC,SAAA+b,GAAK,OACTA,EAAM2gD,YAAc,OAAW3gD,EAAM4gD,KAAO5gD,EAAM4gD,KAAO,OACpD,SAAA5gD,GAAK,OAAKA,EAAM2gD,YAAc,OAAS,OAC9C,SAAA3gD,GAAK,OACDA,EAAMy7K,QACF,gBADN,eAEcz7K,EAAM2gD,YAAN,WAAwB3gD,EAAM6gD,UAA9B,MAA8C,UAOvD36B,GAAmBpmB,IAAOC,IAAV,4BAEhBomB,GAA2BrmB,IAAOC,IAAV,oGAMxB6wD,GAAiB9wD,IAAOC,IAAV,mLASd27K,GAAgB57K,IAAOC,IAAV,6JAQb28G,GAAsB58G,IAAOC,IAAV,4FAGnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5Bo4H,GAAsB78G,IAAOC,IAAV,0OAKnB,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOI,eAEhB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAEvC,SAAA2Y,GAAK,OAAIA,EAAM0D,UAAY,0BAGpB6f,GAA+BzjB,IAAOC,IAAV,+EAK5ByjB,GAAuB1jB,IAAOC,IAAV,wEAGlB,SAAAC,GAAK,OAAKA,EAAMyjB,SAAW,QAAU,UAIvCC,GAAmB5jB,IAAOC,IAAV,yIAQhB47K,GAA6B77K,IAAOC,IAAV,2HAO1B67K,GAAqB97K,IAAOyD,MAAV,4LAUlBugB,GAAiBhkB,IAAOC,IAAV,2IASdgkB,GAAgBjkB,IAAOC,IAAV,oEAKb87K,GAAuB/7K,IAAOC,IAAV,iNAU3B,SAAAC,GAAK,OAAIA,EAAM0D,UAAY,0BAGpB0gB,GAAsBtkB,IAAOC,IAAV,qWAInB,SAAAC,GAAK,OACVA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAOkB,MACnB8a,EAAMI,MAAMpc,OAAOO,YAM3Bm/B,GAGAI,GAAkB+3J,IACP,SAAA77K,GAAK,OACVA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAOkB,MACnB8a,EAAMI,MAAMpc,OAAOO,YAGxBu/B,GAAkB+3J,IACT,SAAA77K,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YACjC,SAAA2Z,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAIhC2/D,GAAoB/kD,IAAOC,IAAV,gIAOjB8mB,GAA2B/mB,IAAOC,IAAV,yJAQxB+kD,GAAehlD,IAAOC,IAAV,8GAGZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI5BoiC,GAAgB9mB,IAAOC,IAAV,sHAGb,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAI5Bu2H,GAAsBj7G,IAAOC,IAAV,uHAEnB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cC/O5Bs3L,GAUR,SAAC,GASC,IARHv4K,EAQE,EARFA,MACAmhB,EAOE,EAPFA,oBACAq3J,EAME,EANFA,uBACAv3J,EAKE,EALFA,YACA9b,EAIE,EAJFA,eACA+kB,EAGE,EAHFA,sBACA9Z,EAEE,EAFFA,UACA3P,EACE,EADFA,SAEM6gB,EAAkBnc,EAAe8I,SAASjO,EAAMhE,IAChDulB,EAA2Bpc,EAAe8I,UAAUjO,EAAMhE,IAE1D4kB,EAAc,SAAC5gB,GACjB,OAAOA,GAASA,EAAMC,UAAYD,EAAMC,SAASiP,OAAS,GAGxDyS,EAAqBjP,eAS3B,OACI,qCACI,cAAC,GAAD,CAA8BhV,YAAW+C,EAAzC,SACI,eAAC,GAAD,CACImQ,SAAU0Q,GAAmBC,EADjC,UAGI,eAAC+2J,GAAD,CACI33K,QAAS,kBAAM63K,EAAuBx4K,EAAMhE,KAC5CmE,UAAWygB,EAAY5gB,GAF3B,UAII,cAAC,GAAD,UACK4gB,EAAY5gB,IACT,cAAC,GAAD,UACKmhB,EAAoBlT,SAASjO,EAAMhE,IAChC,cAAC8lB,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,QAKhB,cAACq2J,GAAD,UACI,cAACC,GAAD,CAAoB36K,YAAW+C,GAAQ,UAAOA,EAAP,SAAvC,SACKT,EAAMhQ,YAInB,cAAC,GAAD,CAAkBoyB,SAAUnB,EAA5B,SACI,cAACZ,GAAA,EAAD,CACInZ,QACIoa,GAAmBC,EAEvBpa,QAASoa,EACTc,aAxCK,WACzB,IAAMxR,EAAa0B,aAAWnC,GAC9B8Z,EACIvI,EAAmB3hB,EAAOmF,EAAgB0L,KAsC1BjQ,KAAM,GACN0hB,OAAQ9hC,IAAUC,OAAOQ,WACzBwf,SAAUA,GAAQ,UAAOA,EAAP,sBAKjCmgB,EAAY5gB,IACT,cAAC,GAAD,CACIkgB,SAAUiB,EAAoBlT,SAASjO,EAAMhE,IADjD,SAGKgE,EAAMC,SAAUzC,KAAI,SAAA+kB,GAAU,OAC3B,cAAC,GAAD,CAEIviB,MAAOuiB,EACP9hB,SAAUA,GAFL8hB,EAAWvmB,aAWtCy8K,GAGD,SAAC,GAAyB,IAAvBz4K,EAAsB,EAAtBA,MAAOS,EAAe,EAAfA,SAAe,EACFif,oBAAS,GADP,mBACnBhjB,EADmB,KACb+lB,EADa,KAEpByH,EAAwBD,eACxBlF,EAAmB2E,eACnB37B,EAASm5B,eACThX,EAAaT,eAEnB,OACI,cAAC,GAAD,CACIzP,MAAOA,EACPihB,YAAavkB,EACbgmB,kBAAmBD,EACnBtd,eAAgBpX,EAAO4jB,eACvBvB,UAAWF,EAAWxhB,KAAK+f,MAC3B0S,oBAAqBpzB,EAAOkiG,qBAC5BuoF,uBAAwBzzJ,EACxBmF,sBAAuBA,EACvBzpB,SAAUA,KAKPg4K,MCtHAC,GAhBW,WACtB,OACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAACx1J,GAAA,EAAD,MAEJ,cAAC,GAAD,wBACA,cAAC,GAAD,gD,UCUHy1J,GAkBR,SAAC,GAiBC,IAhBH5qL,EAgBE,EAhBFA,OACAoS,EAeE,EAfFA,SACAuvF,EAcE,EAdFA,qBACAhvF,EAaE,EAbFA,MACAwtD,EAYE,EAZFA,SACA6pC,EAWE,EAXFA,oBACA7tE,EAUE,EAVFA,sBACA0uJ,EASE,EATFA,kBACAC,EAQE,EARFA,YACAh+K,EAOE,EAPFA,UACA80F,EAME,EANFA,sBACA10F,EAKE,EALFA,OACAkB,EAIE,EAJFA,MACA+7K,EAGE,EAHFA,QACAv5G,EAEE,EAFFA,WACAl+D,EACE,EADFA,SACE,EACsBif,oBAAS,GAD/B,mBACKC,EADL,KACWC,EADX,KAGIk5J,EACF34K,IAAapS,KAAaA,IAAWA,EAAO0gB,MAAMS,OAEtD,OACI,cAACw7D,GAAA,EAAD,CAAmBngC,YAAa,kBAAM3qB,GAAQ,IAA9C,SACI,eAAC,GAAD,CACIzf,SAAU24K,EACVx2J,OAAQ3C,EACRuuC,SAAUA,EACVrzD,UAAW,CACPA,EACAi+K,EAAqB,mBAAgBxrL,GACvCmC,KAAK,KACPwL,OAAQA,EACRkB,MAAOA,EACP+7K,QAASA,EAVb,UAYI,cAAC,KAAD,CACIl4K,MAAOU,GAAS,gBAChBnB,MACO24K,IAAYngF,GACf+gF,EACMt4L,IAAUC,OAAOQ,WACf09E,GAEFn+E,IAAUC,OAAOO,UAE3Byf,SAAUA,GAAQ,UAAOA,EAAP,YAEtB,cAAC,GAAD,CAAYN,SAAUA,EAAtB,SACKwf,IAASxf,EAAW,cAAC67C,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,MAEvC,cAAC,KAAD,CAAa0iB,aAAc,kBAAM7+C,GAASD,IAAOlf,SAAUA,GAAQ,UAAOA,EAAP,aACnE,cAAC,GAAD,CAAiB/D,KAAMijB,IAASxf,EAAhC,SACI,cAAC,GAAD,CACI4qC,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfsS,UAAW,EACXD,KAAMsyC,EACNuoF,QAASA,EANb,SAQKnqL,GAAUA,EAAO0gB,MAAMS,OAAS,EAC7B,cAAC,GAAD,IAEA,eAAC,GAAD,aACO0pK,GACC,qCACI,cAAC,GAAD,4BAGA,eAACT,GAAD,WACI,cAAC,GAAD,UACKpgF,GACDA,EAAsB,EADrB,UAEQA,EAFR,YAGSA,EACA,EACM,mBACA,mBAEV,sBAEV,cAAC,GAAD,CACIp3F,QAAS,WACLupB,GACIA,EACI,KAGZ/pB,WAEQ43F,GACAA,EAAsB,GAVlC,yBAmBZ,cAAC,GAAD,UACKhqG,GACGwkB,aAAWxkB,EAAO0gB,OAAS,IAAIjR,KAC3B,SAAAwC,GACI,OACI,cAAC,GAAD,CAEIA,MAAOA,EACPS,SAAQ,UAAKA,EAAL,UAFHT,EAAMhE,SAQnC,cAAC,GAAD,UACI,cAAC,IAAD,CACIhB,MAAM,QACNC,OAAO,OACPjE,OAAQ,WACJ4oB,GAAQ,GACR8vE,GACIA,KAERjvF,SAAQ,UAAKA,EAAL,iBARZ,SAUKo4K,GAAe,gCCnHzCE,GAxDYp+K,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,sBACIC,EAAE,mpBACF4zB,UAAU,wDCnChC5M,GAAYvmB,IAAOC,IAAV,wEAKTw8K,GAAqBz8K,IAAOC,IAAV,4CAIlB2gD,GAAkB5gD,IAAOC,IAAV,wEAKfy8K,GAAoB18K,IAAOC,IAAV,qRAQL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAChC,SAAAub,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAElC,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,IAAM,SAI9C+4K,GAAe38K,IAAOC,IAAV,wGAIL,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAG3Bm4L,GAAiB58K,YAAOokB,KAAPpkB,CAAH,uGAsEL68K,GAhEsD,SAAC,GAA8B,IAA5BhsI,EAA2B,EAA3BA,SAAUisI,EAAiB,EAAjBA,WACxEtZ,EAAiBtC,KACjBuC,EAAO7+J,qBAAW8+J,IAClBlyK,EAASm5B,eACThX,EAAaT,eAAyB/gB,KACtC2f,EAAcnQ,cACdo7K,EAAmB9kI,eACnB+kI,GAAmBnsI,EAASpxC,GAElC6jB,qBAAU,cAAU,IAYpB,OACI,eAAC,GAAD,WACI,cAACm5J,GAAD,UACI,cAACG,GAAD,CACI3yH,YAAY,iBACZvrD,OAAQ,OACRgnB,UAAW,IACXI,aAAc,SAACm0B,GAAD,OACVupH,EAAevpH,EAAM5E,OAAOxvC,MAAO,UAEvCA,MAAOgrC,EAAS1sC,MAChBwhB,SAAU89I,EAAKr+J,OAASi6J,GAAesE,KACvC/jK,MAAOk9K,EACP54K,SAAS,qBAGjB,cAAC,GAAD,UACI,cAAC,GAAD,CACIC,MAAO,SACP3S,OAAQmiB,EACR/P,SAAU6/J,EAAKr+J,OAASi6J,GAAesE,KACvCxwE,qBA/BiB,WAC7BqwE,EAAehyK,EAAO4jB,eAAgB,iBACtCtD,EAAY,wCAAyC,YA8BzCshF,sBAAuB,QACvBlvF,SAAS,sBAGjB,cAAC,KAAD,CAAST,MAAO,kBAAmBmpC,OAAQ,cAA3C,SACI,cAAC8vI,GAAD,CACI94K,SAAUo5K,EACV54K,QAAS,WAlCG,IAAC3E,KAmCWoxC,EAASpxC,KAjC7Cs9K,EAAiBt9K,IAmCL0B,YAAU,2BALd,SAOI,cAACw7K,GAAD,CAAc/4K,SAAUo5K,EAAxB,SACI,cAAC,GAAD,c,SC7BjB,SAASC,KACZ,IAAMC,EAAyBvnL,cACzBwnL,EAAuB3mL,cACvB4mL,EAAwB7rL,cAQ9B,OAAOvB,sBAAW,yCACd,WACIwB,EACAinD,EACAE,GAHJ,sBAAA1mC,EAAA,yDAKUorK,EAAiC,CACnCtnL,WAAYmnL,EACZrsI,SAAUssI,EACVxrI,UAAWyrI,KAGT1qC,EAXV,OAWqBj6F,QAXrB,IAWqBA,OAXrB,EAWqBA,EAAYh5C,IAXjC,mBAcck0I,EAA4BniJ,EAAOyP,KAAI,SAAA1M,GAAO,2CAC5CokD,EAD4C,MAC3B+5F,GAD2B,yBAEhDn+I,GAFgD,KAK/C6uC,kBAAQuwG,GAnBrB,uBAoBkB2pC,EACFD,EAA+B1kI,GArB/C,gBAuByB2kI,QAvBzB,IAuByBA,OAvBzB,EAuByBA,EACT3pC,GAxBhB,mFADc,0DA8Bd,CAACypC,EAAuBF,EAAwBC,IASjD,I,SAAMI,GAAgC,WACzC,IAAMC,EAAyBxnL,eACzB6kL,EAAuBhkL,eACvB4mL,EAAwB3rL,eAO9B,OAAO9B,sBAAW,yCACd,WACIyoD,EACAE,EACA+kI,GAHJ,oBAAAzrK,EAAA,yDAKU0rK,EAAgC,CAClC5nL,WAAYynL,EACZ3sI,SAAUgqI,EACVlpI,UAAW8rI,KAGTG,EAXV,OAWgCnlI,QAXhC,IAWgCA,OAXhC,EAWgCA,EAAYh5C,IAX5C,uBAcco+K,EACFF,EAA8BhlI,GAf1C,gBAiBqBklI,QAjBrB,IAiBqBA,OAjBrB,EAiBqBA,EAAyB,OAClCH,QADkC,IAClCA,OADkC,EAClCA,EAAep3K,cACf,CAACs3K,IAnBb,mFADc,0DAwBd,CAACJ,EAAwB3C,EAAsB4C,KA2pBhD,SAASK,KACZ,IAAMC,EAAoBrnL,cACpBsnL,EAAsBf,KACtBgB,EAAwBrnL,cACxBsnL,EAA8BX,KAQ9BY,EAA6BnuL,uBAC/B,SACI0tL,EACAn1H,GAEA,IAAM61H,EAAqC,CACvCt1H,WAAY,CACRrQ,WAAY,GACZE,WAAY,WACZ+kI,gBACAh3H,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAYngB,KACZogB,eAAgB61H,EAChB51H,sBACI81H,MAGZ,CAACF,IASCG,EAA+BruL,uBACjC,SACIi+B,EACAs6B,GAEA,IAAM2rF,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQumK,iBAAO9pI,GAAU,SAAAxuB,GAAE,OAAIA,KAC/BizI,SAAU,GACV/5F,WAAY,YAEhB8N,UAAW,SACXwC,mBAAoB,YAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAYpgB,KACZqgB,eAAgB21H,EAChB11H,sBACI4rF,MAGZ,CAAC8pC,IASCM,EAAqCtuL,sBAAW,yCAClD,WAAOyoD,EAA4B8lI,GAAnC,kBAAAtsK,EAAA,2DACUusK,EADV,OAC8B/lI,QAD9B,IAC8BA,OAD9B,EAC8BA,EAAYh5C,IAD1C,uBAIcg/K,EAJd,OAIqCF,QAJrC,IAIqCA,OAJrC,EAIqCA,EAAct9K,KAAI,SAAA+1K,GAAS,IAAD,EAQ/CA,GAAQ,GARuC,IAE/C0H,eAF+C,MAErC,EAFqC,MAG/C96D,gBAH+C,MAGpC,EAHoC,MAI/ClnD,gBAJ+C,MAIpC,KAJoC,MAK/CniE,YAL+C,MAKxC,GALwC,MAM/CioK,eAN+C,MAMrC,GANqC,MAO/CX,SAGJ,MAAO,CACH6c,UACA96D,WACAlnD,WACAniE,OACAioK,UACAX,cAhB+C,MAOpC,GAPoC,MAJ/D,SAwBcoc,EACFO,EACAC,GA1BZ,2CADkD,wDA+BlD,CAACR,IAQCU,EAA8B3uL,uBAChC,SACIuuL,EACAh2H,GAEA,IAAMq2H,EAA+B,CACjC91H,WAAY,CACRrQ,WAAY,GACZ8lI,gBAEJ93H,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAYpgB,KACZqgB,eAAgBi2H,EAChBh2H,sBAAuBs2H,EACvBl4H,aAAc,QAGtB,CAAC43H,IAOL,OAAOtuL,uBACH,SAAC6uL,GAA4C,IACjC16K,EACJ06K,EADI16K,MAAOukC,EACXm2I,EADWn2I,YAAaza,EACxB4wJ,EADwB5wJ,SAAUh8B,EAClC4sL,EADkC5sL,MAAOF,EACzC8sL,EADyC9sL,OAGzCo1D,EAA+C,CAC/CiB,WAAYxgB,KACZygB,eAAgB01H,EAChBr3H,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACRnyD,aAAc,CAAEwN,QAAOukC,eACvBge,aAAc,GAElBD,UAAW,iBAIb8B,EAAsD,GAgB5D,OAdKnlB,kBAAQnV,IACTowJ,EAA6BpwJ,EAAUs6B,GAGtCnlB,kBAAQnxC,IACT0sL,EAA4B1sL,EAAOs2D,GAGnCx2D,GAAUA,IAAW++C,KAAiBjC,OACtCsvI,EAA2BpsL,EAAQw2D,GAGvCpB,EAAU,6BAAQA,GAAe,CAAEoB,sBAIvC,CACIw1H,EACAM,EACAM,EACAR,IAmRL,SAASW,KACZ,IAAMC,EAAqBrtL,cACrBssL,EAAsBf,KACtB+B,EAAyBhtL,cACzBitL,EAA+B1B,KAQ/B2B,EAA8BlvL,uBAChC,SACI0tL,EACAn1H,GAEA,IAAM42H,EAAsC,CACxCr2H,WAAY,CACRrQ,WAAY,GACZE,WAAY,YACZ+kI,gBACAh3H,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY5f,KACZ6f,eAAgB42H,EAChB32H,sBACI62H,MAGZ,CAACF,IASCG,EAAgCpvL,uBAClC,SACIi+B,EACAs6B,GAEA,IAAM2rF,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQumK,iBAAO9pI,GAAU,SAAAxuB,GAAE,OAAIA,KAC/BizI,SAAU,GACV/5F,WAAY,aAEhB8N,UAAW,SACXwC,mBAAoB,YAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY/f,KACZggB,eAAgB21H,EAChB11H,sBACI4rF,MAGZ,CAAC8pC,IASCqB,EAAsCrvL,sBAAW,yCACnD,WAAOyoD,EAA4B8lI,GAAnC,kBAAAtsK,EAAA,2DACUqtK,EADV,OAC+B7mI,QAD/B,IAC+BA,OAD/B,EAC+BA,EAAYh5C,IAD3C,uBAIc8/K,EAJd,OAIsChB,QAJtC,IAIsCA,OAJtC,EAIsCA,EAAct9K,KAAI,SAAA+1K,GAAS,IAAD,EAQhDA,GAAQ,GARwC,IAEhD0H,eAFgD,MAEtC,EAFsC,MAGhD96D,gBAHgD,MAGrC,EAHqC,MAIhDlnD,gBAJgD,MAIrC,KAJqC,MAKhDniE,YALgD,MAKzC,GALyC,MAMhDioK,eANgD,MAMtC,GANsC,MAOhDX,SAGJ,MAAO,CACH6c,UACA96D,WACAlnD,WACAniE,OACAioK,UACAX,cAhBgD,MAOrC,GAPqC,MAJhE,SAwBcmd,EACFM,EACAC,GA1BZ,2CADmD,wDA+BnD,CAACP,IAQCQ,EAA+BxvL,uBACjC,SACIuuL,EACAh2H,GAEA,IAAMk3H,EAAgC,CAClC32H,WAAY,CACRrQ,WAAY,GACZ8lI,eACA73H,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY7f,KACZ8f,eAAgBg3H,EAChB/2H,sBAAuBm3H,EACvB/4H,aAAc,QAGtB,CAAC24H,IAOL,OAAOrvL,uBACH,SAAC0vL,GAA8C,IAEvCv7K,EAOAu7K,EAPAv7K,MACAukC,EAMAg3I,EANAh3I,YACAC,EAKA+2I,EALA/2I,iBACA12C,EAIAytL,EAJAztL,MACAg8B,EAGAyxJ,EAHAzxJ,SACAl8B,EAEA2tL,EAFA3tL,OACA62C,EACA82I,EADA92I,SAGAue,EAA+C,CAC/CiB,WAAYjgB,KACZkgB,eAAgB02H,EAChBr4H,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACRn3D,cAAe,CAAEwS,QAAOukC,cAAaC,mBAAkBC,YACvD8d,aAAc,GAElBD,UAAW,iBAIb8B,EAAsD,GAgB5D,OAdKnlB,kBAAQnV,IACTmxJ,EAA8BnxJ,EAAUs6B,GAGvCnlB,kBAAQnxC,IACTutL,EAA6BvtL,EAAOs2D,GAGpCx2D,GAAUA,IAAW6/C,KAAkB/C,OACvCqwI,EAA4BntL,EAAQw2D,GAGxCpB,EAAU,6BAAQA,GAAe,CAAEoB,sBAIvC,CACIw2H,EACAK,EACAI,EACAN,ICl6CL,SAASS,GACZruK,EACAsuK,EACAzwG,EACAC,GAKA,IAAMjoB,EAAahiC,iBAA2C,IADhE,EAGoChC,oBAAkB,GAHtD,mBAGSosD,EAHT,KAGoBC,EAHpB,KAKQnuE,EAAWO,cACXytE,EAAkBx2D,eAClB/G,EAAcnQ,cAEdoxI,GAAoB3vG,kBAAQ+jB,EAAWp3B,SAQvCygD,EAAwCxgF,uBAC1C,SAAC4P,EAAqBigL,GAClB,IAAMC,EAA4B,OAC9BlgL,QAD8B,IAC9BA,OAD8B,EAC9BA,EAAOgB,QAAQ8Q,SAAS,kBAuB5B,GArBIqhI,IACI+sC,EACAzwG,IAEAhuE,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAW,GAAD,OAAKsyI,qBACXzuK,GADM,YAELsuK,GACL5vJ,QAASq/C,OAO7BloB,EAAWp3B,QAAU,GACrBw/C,GAAaC,GAAa,GAE1B,OAAI5vE,QAAJ,IAAIA,OAAJ,EAAIA,EAAOgB,QAAS,CAChB,IAAMA,EAAUk/K,EACVv+K,KACIwxD,MAEJnzD,EAAMgB,QAEZkR,EAAYlR,EAAS,SAGV,OAAfwuE,QAAe,IAAfA,KAAkBxvE,EAAOigL,KAE7B,CACIx+K,EACAu+K,EACAvwG,EACAE,EACAH,EACA99D,EACAyhI,EACAjhI,IASFy+D,EAA+BvgF,uBACjC,SAAC0nD,GACG/qB,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHloB,EAAWp3B,QAAU,GACrBw/C,GAAaC,GAAa,GAC1B19D,EAAY,GAAD,OACJ8tK,EADI,qBACoBx4B,GACvB91I,IAEJ,WAGa,OAAjB69D,QAAiB,IAAjBA,KAAoBz3B,QAG5B,CACIkoI,EACAvwG,EACAE,EACAJ,EACA79D,EACAQ,IAIAy1C,EAAiBL,aACrBC,EAAWp3B,QACXwgD,EACAC,GAHIjpB,aAUFy4H,EAA8ChwL,uBAAY,WAC5D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IACAE,GAAaC,GAAa,GAC1BroB,EAAWp3B,QAAU,GAEJ,OAAjBo/C,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmB5nB,IAM7C4rF,EAA+BnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAW,GAAD,OAAKsyI,qBAAWzuK,GAAhB,YAA0BsuK,GACpCjvG,wBACIqvG,EACJhwJ,QAASq/C,MAMzB9nB,GAAa,QAElB,CACCwrF,EACAxrF,EACAlmD,EACAiQ,EACAsuK,EACAI,EACA3wG,IAgBJ,OAbA/rD,qBAAU,WACFisD,GACA4jE,MAGL,CAAC5jE,IAQGv/E,uBACH,SAACiwL,GACG94H,EAAWp3B,QAAUkwJ,EAErBzwG,GAAa,KAEjB,IC/IR,IC1EYjnE,G,SCDA23K,GF2ENl+E,GAAOjiF,EAAQ,KACfgyE,GAAKhyE,EAAQ,IAENwsG,GAAkBvsH,IAAOC,IAAV,8MAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKjCg8L,GAAyBngL,IAAOC,IAAV,+FAM7BmgL,GAAmBpgL,IAAOC,IAAV,gGAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5B47L,GAKR,CACG,CACIx6K,MAAO,QACPpS,KAAM,QACNmN,QAAS,0BACT0/K,SAAS,GAEb,CACIz6K,MAAO,SACPpS,KAAM,SACNmN,QAAS,qBACT0/K,SAAS,GAEb,CACIz6K,MAAO,WACPpS,KAAM,WACNmN,QAAS,oBACT0/K,SAAS,GAEb,CACIz6K,MAAO,UACPpS,KAAM,UACNmN,QAAS,mBACT0/K,SAAS,IAIR9E,GAAqB72K,yBAAc,GACnC+wK,GAA2B/wK,wBAAmB,MAC9C+yK,GAAmB/yK,wBAAmB,MACtC++J,GAAkB/+J,wBAG5B,CACCS,KAAM,OACN3K,OAAQ,eA6BN8lL,GAAwC,SAAC,GAkBxC,IAAD,YAjBF3oK,EAiBE,EAjBFA,QACAhQ,EAgBE,EAhBFA,QACAipC,EAeE,EAfFA,SACAx6C,EAcE,EAdFA,WACA0N,EAaE,EAbFA,QACAkuD,EAYE,EAZFA,MACAuuH,EAWE,EAXFA,aACAhvB,EAUE,EAVFA,eACAivB,EASE,EATFA,uBACAC,EAQE,EARFA,oBACAC,EAOE,EAPFA,oBACAxN,EAME,EANFA,oBACAyN,EAKE,EALFA,qBACAC,EAIE,EAJFA,wBACAtvB,EAGE,EAHFA,UACAz/I,EAEE,EAFFA,YAGMgvK,GADJ,EADFC,iBTpKgD,WAChD,IAAM1/K,EAAWO,cACXgW,EAAUW,cACVzG,EAAcnQ,cAEpB,OAAO3R,uBACH,SACIgxL,EACAtpI,GAIA,GAFAspI,GAAe,IAEV59I,kBAAQsU,GAAY,CACrB,IAAMupI,EAAyBvpI,EAC3B9P,MAGEs5I,EAAuBxpI,EACzB7P,MAGEs5I,EAAyBzpI,EAC3BzP,MAEJ,GAAIg5I,EAAwB,CACxB5/K,EACI0a,aACIklK,EACA,WAIR,IAAMvD,EAAiBt6I,kBAAQ+9I,GAEzBrwI,KAAiBjC,MADjBiC,KAAiB19C,OAGjBguL,EAAgBf,GAAYltK,QAC9B,SAACC,GAAD,OAAeA,EAAKvN,QAAU63K,KAElC5rK,EAAYsvK,EAAc,GAAGxgL,QAAS,gBAC/BsgL,GACP7/K,EACI0a,aACImlK,EACA,WAMhBtpK,EAAQH,KAAKluB,IAAO6C,iBAAiBC,UAAUN,OAEnD,CAACsV,EAAUuW,EAAS9F,ISmHpBuvK,IACEC,ETzGyC,WAC/C,IAAM9d,EAAiBtC,KACjBpvJ,EAAcnQ,cAEpB,OAAO3R,uBACH,SACIgxL,EACAphL,EACAigL,GAEA,IAAKz8I,kBAAQy8I,GAAqB,CAC9B,IAAMoB,EAAyBpB,EAC3Bj4I,MAGE42I,EAAiB,OAAGyC,QAAH,IAAGA,OAAH,EAAGA,EAAwBxhL,GAM9C++K,GACAhb,EAAegb,EAAmB,OAIrC,OAAL5+K,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWkR,EAAYlS,EAAMgB,QAAS,SAC7CogL,GAAe,KAEnB,CAACxd,EAAgB1xJ,IS6EjByvK,GACEC,ETtE8B,WACpC,IAAMngL,EAAWO,cACXgW,EAAUW,cACVsiK,EAAuBhkL,eAE7B,OAAO7G,uBACH,SAACqG,GACGwkL,EAAqB,UAAW,CAACxkL,IAAai1B,MAAK,SAAAgT,GAC/Cj9B,EAAS0a,aAA6BuiB,EAAU,WAEhD1mB,EAAQq0G,cAGhB,CAAC5qH,EAAUuW,EAASijK,ISyDM4G,GACxBC,EAAyB1f,KACzBlqJ,EAAWF,EAAQE,SAPvB,EAS8BqL,mBAC5Bk8I,GAAesE,MAVjB,mBASKpqD,EATL,KASeooE,EATf,OAYoCx+J,oBAAS,GAZ7C,mBAYKo4J,EAZL,KAYkByF,EAZlB,KAaIvmH,EAAYt1C,iBAAO,MACnBhM,EAAck5B,eACdx1C,EAAasJ,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAf7C,EAgBkC0vB,oBAAS,GAhB3C,mBAgBK25J,EAhBL,KAgBiB8E,EAhBjB,KAiBI3iB,EAAU,UAAGltE,GAAGngE,MAAM9Z,EAAShjB,eAArB,aAAG,EAA2BmqK,WACxCiD,GAAS,UAAGnwE,GAAGngE,MAAM9Z,EAAShjB,eAArB,aAAG,EAA2BotK,UACvCsB,GAAiBtC,KAEvB53H,YACIswI,GAAe,WAAYrgE,EAAUtnD,GACrC,CAACphB,EAAS1sC,QAGd,IAAM09K,KAAahxI,EAASpxC,GAEtBqiL,GAAW9xL,uBACb,SAACq1B,GACGA,EAAEkmJ,iBAEmB,aAAjBiV,GACArnK,EAAYzH,SAASjN,KAAgB2sC,mBAErC/rB,EAAE08J,aAAc,KAGxB,CAACvB,EAAcrnK,IAGnBmK,qBAAU,WACNq+J,GACKE,KAAY5vH,GAAUphB,EAAS9+C,SAAW++C,KAAiBjC,OAAUhyC,EAEhEwiK,GAAesE,KADftE,GAAekX,QAG1B,CAACsL,GAAU5vH,EAAOphB,EAAS9+C,OAAQ4vL,EAAa9kL,IAEnDymB,qBAAU,WAAO,IAAD,EACPnd,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAC7BotL,MAEL,CAACA,EAAD,OAA0Bj5K,QAA1B,IAA0BA,GAA1B,UAA0BA,EAAS5T,YAAnC,aAA0B,EAAeP,OAE5C6vB,qBAAU,WAON,MANmB,QAAfjtB,EACAsqL,EAAoB5qK,OAAO1f,KAE3BqqL,IACAvN,KAEG,WACHuN,IACAvN,OAEL,CACCuN,EACAC,EACAxN,EACA98K,IAGJitB,qBAAU,WAEN,OADAqd,OAAO6Z,iBAAiB,eAAgBsnI,IACjC,WACHnhJ,OAAOga,oBAAoB,eAAgBmnI,OAEhD,CAACA,KAEJ,IAAMhJ,GAAmB,SAACtW,EAA4BjoK,GAClD,IAAMiyG,EAAa,CACf/sG,GAAG,QAAD,OAAUuiG,MACZznG,KAAI,OAAEA,QAAF,IAAEA,IAAQ,GACdioK,QAASA,EACT9lG,SAAU7rB,EAAS0tH,OAAS1tH,EAAS0tH,OAAOtsK,MAAM0gB,OAAS,EAAI,EAC/DqvK,SAAUnxI,EAASmxI,SACnBngB,SAAU,IAGd4e,EAAuBj0E,IAgBrBh7G,GAASm5B,eACThX,GAAaT,eAAyB/gB,KACtCw7B,GAAwBD,eACxBu0J,GACFl1J,eACEk4H,GACF/uI,eAEEgsK,GACFpE,KAEEqE,GFgtBH,WACH,IAAMC,EAAqB7rL,eACrB8rL,EAAyB7rL,cACzB8hD,EAA2B7hD,cAC3BwnL,EAAwBrnL,cACxBsnL,EAA8BrnL,eAS9BsnL,EAA6BnuL,uBAC/B,SACIqG,EACAqnL,EACAv2H,GAEA,IAAMi3H,EAAqC,CACvCt1H,WAAY,CACR40H,cAAa,OAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAep3K,cAC9BnQ,YAAa,CAACE,GACdqwD,aAAc,GAElBD,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYngB,KACZogB,eAAgB61H,EAChB51H,sBACI81H,MAGZ,CAACF,IAWCG,EAA+BruL,uBACjC,SACIqG,EACAisL,EACAxvC,EACA3rF,GAEA,IAAK/jB,kBAAQk/I,GAAgB,CACzB,IAQMC,EAAuC,CACzCz5H,WAAY,CACRt3D,OAVY8wL,EAAcrhL,KAC9B,SAAA1M,GAAO,MACF,CACG8B,aACA9B,eAQRkyD,UAAW,UAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYtgB,KACZugB,eAAgBg6H,EAChB/5H,sBACIi6H,IAIZ,IAAKn/I,kBAAQ0vG,GAAkB,CAC3B,IAQM0vC,EAAyC,CAC3C15H,WAAY,CACRt3D,OAVcshJ,EAAgB7xI,KAClC,SAAA1M,GAAO,MACF,CACG8B,aACA9B,eAQRkyD,UAAW,UAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYrgB,KACZsgB,eAAgB/P,EAChBgQ,sBACIk6H,OAIhB,CAACH,EAAwB/pI,IASvBgmI,EAAqCtuL,sBAAW,yCAClD,WAAOqG,EAAoBkoL,GAA3B,gBAAAtsK,EAAA,0DACQ5b,EADR,uBAEcooL,EAFd,OAEqCF,QAFrC,IAEqCA,OAFrC,EAEqCA,EAAct9K,KAAI,SAAA+1K,GAAS,IAAD,EAQ/CA,GAAQ,GARuC,IAE/C0H,eAF+C,MAErC,EAFqC,MAG/C96D,gBAH+C,MAGpC,EAHoC,MAI/ClnD,gBAJ+C,MAIpC,KAJoC,MAK/CniE,YAL+C,MAKxC,GALwC,MAM/CioK,eAN+C,MAMrC,GANqC,MAO/CX,SAGJ,MAAO,CACH6c,UACA96D,WACAlnD,WACAniE,OACAioK,UACAX,cAhB+C,MAOpC,GAPoC,MAF/D,SAsBcoc,EAAsB5nL,EAAYooL,GAtBhD,2CADkD,wDA0BlD,CAACR,IAQCU,EAA8B3uL,uBAChC,SACIqG,EACAkoL,EACAp3H,GAEA,IAAMy3H,EAA+B,CACjC91H,WAAY,CACRzyD,aACAkoL,gBAEJ93H,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYpgB,KACZqgB,eAAgBi2H,EAChBh2H,sBAAuBs2H,EACvBl4H,aAAc,QAGtB,CAAC43H,IAQCmE,EAA4BzyL,uBAC9B,SACIqG,EACA8wD,GAEA,IAAMy3H,EAA+B,CACjC91H,WAAY,CACRzyD,aACAkoL,aAAc,GACd73H,aAAc,GAElBD,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYlgB,KACZmgB,eAAgBi2H,EAChBh2H,sBAAuBs2H,MAG/B,CAACN,IAOL,OAAOtuL,uBACH,SAAC6uL,GAAuC,IAEhCxoL,EAOAwoL,EAPAxoL,WACA8N,EAMA06K,EANA16K,MACAukC,EAKAm2I,EALAn2I,YACA45I,EAIAzD,EAJAyD,cACAxvC,EAGA+rC,EAHA/rC,gBACA7gJ,EAEA4sL,EAFA5sL,MACAF,EACA8sL,EADA9sL,OAGAo1D,EAAiD,CACjD,CACIiB,WAAYvgB,KACZwgB,eAAgB+5H,EAChB17H,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACRzyD,aACAM,aAAc,CAAEwN,QAAOukC,eACvBge,aAAc,GAElBD,UAAW,kBAwBvB,OAnBKrjB,kBAAQk/I,IAAmBl/I,kBAAQ0vG,IACpCurC,EACIhoL,EACAisL,EACAxvC,EACA3rF,GAIH/jB,kBAAQnxC,GAEFF,IAAW++C,KAAiBjC,OACnC4zI,EAA0BpsL,EAAY8wD,GAFtCw3H,EAA4BtoL,EAAYpE,EAAOk1D,GAK/Cp1D,GAAUA,IAAW++C,KAAiBjC,OACtCsvI,EAA2B9nL,EAAYtE,EAAQo1D,GAG5CA,IAEX,CACIk3H,EACAM,EACA8D,EACAtE,EACAiE,IE/8B+BM,GAEjCC,GACFhD,GACI1tH,EAAQ,SAAW,SACnB,YACA,SAAAva,GAAS,OACLopI,EAAkCE,EAAgBtpI,MACtD,SAAC93C,EAAOigL,GAAR,OACIyB,EACIN,EACAphL,EACAigL,MAIVrF,GAAuB,SACzBoI,EACA7wL,GACE,IAAD,cACDivL,GAAe,GACf,IAAM1iJ,EGxUmB,SAACuS,EAAoB9+C,GAAoB,IAAD,IAC/D8wL,EAAS,CACXC,OAAO,EACPliL,QAAS,GACTnN,KAAM,IAGV,OAAQ1B,GACJ,IAAK,UACD8wL,EAAOC,OAAQ,EACf,MACJ,IAAK,UACG,UAACjyI,EAAS1sC,aAAV,aAAC,EAAgBm1B,QAITuX,EAAS0tH,OAAOtsK,MAAM0gB,OAGtBk+B,EAAS0tH,OAAOtsK,MAAMssC,MAAK,SAAAy4I,GAAI,OAAIA,EAAKxU,UAAYnE,GAAkBqE,SAI7E7xH,EAAS0tH,OAAOC,eACjB3tH,EAAS0tH,OAAOC,cAAgB,MAEhCqkB,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,2BAPjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,uBAJjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,2CALjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,iBACjBiiL,EAAOpvL,KAAO,QAclBo9C,EAAS0tH,OAAOtsK,MAAMgP,KAAI,SAAC+1K,GAQvB,OAPKA,EAAK3C,SAGC2C,EAAK3C,UAAiC,IAArB2C,EAAKz8K,KAAKoY,SAClCkwK,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,qBAJjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,0BAKdiiL,KAEX,MACJ,IAAK,SACG,UAAChyI,EAAS1sC,aAAV,aAAC,EAAgBm1B,QAIVuX,EAAS0tH,OAAOtsK,MAAM4iB,MAAK,SAAAmiK,GAAI,OAAKA,EAAK0H,aAChDmE,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,2BALjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,iBACjBiiL,EAAOpvL,KAAO,QAKlB,MACJ,IAAK,WACL,QACQo9C,EAAS1sC,MAAMwO,OAAS,IACxBkwK,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,kBAG7B,OAAOiiL,EH+QcE,CACblyI,EACA9+C,GAAkB8+C,EAAS9+C,QAG/B,IAAKusC,EAASwkJ,MAUV,OATAF,GAAaA,EAAU90I,WACvBh8B,EAAYwsB,EAAS19B,QAAS,SAC9BogL,GAAe,QAEO,SAAlB1iJ,EAAS7qC,KACTmuL,GAAc,GAEdA,GAAc,IAIlBA,GAAc,GAGlB,IAAM/C,EAAyC,CAC3C16K,MAAO0sC,EAAS1sC,MAChBukC,YAAamI,EAASnI,YACtBza,SAAUvX,aACNllB,GAAO4jB,eADsB,UAE7B5jB,GAAOwxL,gCAFsB,QAEM,IAEvC/wL,OAAO,UAAA4+C,EAAS0tH,cAAT,eAAiBtsK,OAAjB,UAAyB4+C,EAAS0tH,cAAlC,aAAyB,EAAiBtsK,MAAMgP,KAAI,SAAC+1K,EAAM91K,GAAP,oBAAC,gBAAsB81K,GAAvB,IAA6Bt6G,SAAUx7D,EAAQ,OAAQ,GAClHnP,OAAM,OAAEA,QAAF,IAAEA,IAAU8+C,EAAS9+C,QAGzBkxL,EAAqC,CACvC5sL,WAAU,UAAEw6C,EAASpxC,UAAX,QAAiB,EAC3B0E,MAAO0sC,EAAS1sC,MAChBukC,YAAamI,EAASnI,YACtB45I,cAAe5rK,aACXllB,GAAO4jB,eAD2B,UAElC5jB,GAAOwxL,gCAF2B,QAEC,IAEvClwC,gBAAiBv8H,aACb/kB,GAAO4jB,eAD4B,UAEnC5jB,GAAOwxL,gCAF4B,QAEA,IAEvC/wL,MAAK,UAAE4sL,EAAgB5sL,aAAlB,QAA2B,GAChCF,OAAM,OAAEA,QAAF,IAAEA,IAAU8+C,EAAS9+C,QAGzBmxL,EACFhB,GAAiCrD,GAE/BsE,EACFhB,GAA+Bc,GAE/BlxL,IAAW++C,KAAiBhC,SACvB+B,EAASpxC,GAGVkjL,GAA+BQ,GAF/BR,GAA+B,CAACO,KAK5B,OAARryI,QAAQ,IAARA,OAAA,EAAAA,EAAUpxC,KAAM+hL,EAAsB3wI,EAASpxC,KAIvD6jB,qBAAU,WACN,GAAIutB,EAASr/C,QAAUq/C,EAASr/C,OAAOmhB,OAAS,EAAG,CAC/C,IAAM6D,EAAmBq6B,EAASr/C,OAC5B+jB,EAAoB0vI,GACtBzuI,EACA7C,IAEJga,GAAsBpY,QAEtBoY,GAAsB,IAE1B,OAAO,WACHA,GAAsB,OAE3B,CACCkjB,EAASr/C,OACTmiB,GACAsxI,GACAt3H,KAIJrK,qBAAU,WACN,GAAK8f,kBAAQyN,EAASr/C,QAQlBywL,GAAkC,QARP,CAAC,IAAD,EACrBzrK,EAAgB,UAAGq6B,EAASr/C,cAAZ,QAAsB,GACtC+jB,EAAoB0vI,GACtBzuI,EACA7C,IAEJsuK,GAAkC1sK,GAItC,OAAO,WACH0sK,GAAkC,OAGvC,CAACpxI,EAASr/C,SAEb8xB,qBAAU,WACF27I,GAAciD,IACdwf,EAAuBziB,EAAYiD,IAAW52I,MAAK,YAAsC,IAAnCi3I,EAAkC,EAAlCA,QAASp+J,EAAyB,EAAzBA,MAAOukC,EAAkB,EAAlBA,YAClE65H,EAAQ3sJ,SAAQ,SAAAohK,GAAI,OAAI8B,GAAiB9B,EAAKxU,QAASwU,EAAKz8K,SAE5DipK,GAAer/J,GAAS,GAAI,SAC5Bq/J,GAAe96H,GAAe,GAAI,oBAI3C,CAACu2H,EAAYiD,GAAWwf,IAE3B,IAAM0B,IAAgBnxH,GAA0B,SAAjBuuH,KAA2B,OAAC3vI,QAAD,IAACA,OAAD,EAACA,EAAUpxC,IAErE,OADwBsE,GAAWq/K,GAG3B,cAAC,GAAD,CACI7xB,UAAWA,EACXC,eAAgBA,EAFpB,SAII,cAAC2uB,GAAD,UACKp8K,GAAW,cAAC,KAAD,QAKxB,cAAC,GAAD,CACIwtJ,UAAWA,EACXC,eAAgBA,EAFpB,SAII,eAAC,GAAD,CAAiBnzJ,IAAKo8D,EAAtB,UACI,eAACipG,GAAgBz1F,SAAjB,CACIpoE,MAAO,CAAET,KAAMm0G,EAAU9+G,OAAQknL,GADrC,UAGI,cAACnG,GAAmBvtG,SAApB,CAA6BpoE,MAAO01K,EAApC,SACI,cAAC,GAAD,CACI1qI,SAAUA,EACV2pI,qBAAsBA,GACtBj2J,SAA2B,aAAjBi8J,EACV7F,WAAY99K,MAGpB,cAAC,GAAD,CAAag0C,SAAUA,EAAUisI,WAAYA,IAC5CjsI,EAASwyI,SACN,eAACjD,GAAD,CAAkBj/K,YAAU,sBAA5B,kCACgB0vC,EAASwyI,eADzB,aACgB,EAAkB1kJ,UAAW,IAD7C,UAEKkS,EAASwyI,eAFd,aAEK,EAAkBxkJ,YAG3B,cAAC,KAAD,IACA,cAAC62I,GAAyBznG,SAA1B,CAAmCpoE,MAAO40D,EAA1C,SACI,cAACi9G,GAAiBzpG,SAAlB,CAA2BpoE,MAvM1B,WACjBstK,IACA,IAGMmQ,EAHczyI,EAAS0tH,OAAOtsK,MAAMkhB,QACtC,SAACorJ,GAAD,OAAwBA,EAAO8V,YAEDpzK,KAC9B,SAACs9J,GAAD,OAAwBA,EAAO9+J,MAEnCgC,YAAW,WACPm/K,EAAqB0C,KACtB,MA6La,SACI,cAAC,GAAD,CACIxK,iBAAkBA,GAClBjoI,SAAUA,WAK1B,cAAC,KAAD,CACI13B,YAAa,CAAC1U,KAAgB2sC,iBADlC,SAGI,cAAC,KAAD,CAAkBmyI,KAAuB,aAAjB/C,EAAxB,SACK,gBAAG3yI,EAAH,EAAGA,UAAWC,EAAd,EAAcA,SAAd,OACG,cAACN,GAAA,EAAD,CACIC,WAAW,mBACX/E,YACI,0CAEJkF,iBAAkB,UAClBD,kBAAmB,OACnBG,SAAUD,EACVA,UAAW,WACP2sI,GAAqB,CACjB3sI,UAAWA,EACXC,SAAUA,KAGlB5pC,SAAS,kCAmE1B4tH,gBApDoD,SAAC,GAK7D,IAJHy/B,EAIE,EAJFA,UACAC,EAGE,EAHFA,eACA15I,EAEE,EAFFA,SACAsgD,EACE,EADFA,MAEMxgD,EAAUW,cACV3Q,EAAU0R,YAAY3R,MACtBsqD,EAAoC,QAA5BmG,EAAM7oE,OAAO8G,WAErBw6C,EAAWv3B,YAAYolJ,IAAkBj3J,KACzC1D,EAAUuV,YAAYolJ,IAAkB36J,QACxCy8K,EAAelnK,YAAYolJ,IAAkBD,KAE7C+kB,EAAcvjB,KACd6Y,EAAmBxZ,KACnByhB,EAAmBhhB,KACnB0jB,EAAgBniB,KAChBoiB,EAAuBpd,KACvBmO,EAAgB1N,KAChBj1J,EAAcnQ,cACdgiL,EAAoBtkE,KACpBwhE,EAA0B7wL,uBAC5B,kBAAa,OAAP4X,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAaowL,EAAiB,OAAC/7K,QAAD,IAACA,OAAD,EAACA,EAASrU,aACvD,CAACowL,EAAD,OAAoB/7K,QAApB,IAAoBA,OAApB,EAAoBA,EAASrU,YAGjC,OACI,cAAC,GAAD,CACIukB,SAAUA,EACVF,QAASA,EACThQ,QAASA,EACTwwD,MAAOA,EACPo5F,eAAgBA,EAChBD,UAAWA,EACX1gH,SAAUA,EACVx6C,WAAY+hE,EAAM7oE,OAAO8G,WACzB47D,MAAOA,EACPluD,QAASA,EACTy8K,aAAcA,EACdG,oBAAqB6C,EACrB/C,uBAAwB3H,EACxB8H,qBAAsB8C,EACtBvQ,oBAAqBsB,EACrBiM,oBAAqB+C,EACrB5C,wBAAyBA,EACzB/uK,YAAaA,EACbivK,iBAAkBA,OCpcvB,SAAS6C,GAA2BzxL,GACvC,MAAO,CACH6I,KAAMuN,GAAQs7K,+BACd1xL,S,SAtHIoW,K,4DAAAA,E,gEAAAA,E,gEAAAA,E,gEAAAA,E,oEAAAA,E,oEAAAA,E,0EAAAA,E,kEAAAA,E,sEAAAA,E,sEAAAA,E,4EAAAA,E,wCAAAA,E,gDAAAA,E,wEAAAA,E,wEAAAA,E,0DAAAA,E,8DAAAA,E,yCAAAA,Q,cCDA23K,K,sBAAAA,E,qBAAAA,Q,KAKZ,IAAM4D,IAAyB,sBAC1B5D,GAAsBx5K,UAAsB,aADlB,gBAE1Bw5K,GAAsBz5K,SAAqB,YAFjB,IAKxB,SAASs9K,GAAyB/oL,GACrC,OAAQA,GAAQ8oL,GAA0B9oL,IAAUA,GAAQ,GAGhE,IAAMgpL,IAA0B,sBAC3B9D,GAAsBx5K,UAAsBziB,IAAUC,OAAO4C,OADlC,gBAE3Bo5L,GAAsBz5K,SAAqBxiB,IAAUC,OAAOE,UAFjC,IAWhC,IAAM6/L,IAAqB,sBACtBn7I,KAAmB11C,OAAmB,UADhB,gBAEtB01C,KAAmBgG,SAAqB,YAFlB,gBAGtBhG,KAAmB+F,MAAkB,SAHf,gBAItB/F,KAAmBz1C,QAAoB,WAJjB,IAOpB,SAAS6wL,GAAqBnyL,GACjC,OAAQA,GAAUkyL,GAAsBlyL,IAAYA,GAAU,GAG3D,SAASoyL,GAAiChyL,GAC7C,IAAMiyL,EAAejyL,EAChBghB,QACG,SAACxS,GAAD,eACIA,EAAQ3F,OAASklL,GAAsBz5K,WAAvC,UACA9F,EAAQkwC,gBADR,iBACA,EAAkB0tH,cADlB,aACA,EAA0BC,kBAEjCv9J,KAAI,SAACN,GAAgC,IAAD,IAG1B,IAFP,OAAW,OAAPA,QAAO,IAAPA,GAAA,UAAAA,EAASkwC,gBAAT,mBAAmB0tH,cAAnB,eAA2BC,gBAAiB79J,EAAQ0jL,aAC7C1jL,EAAQkwC,SAAS0tH,OAAOC,cAAe79J,EAAQ0jL,aAEtD,UAAO1jL,EAAQkwC,gBAAf,iBAAO,EAAkB0tH,cAAzB,aAAO,EAA0BC,iBAI7C,OAAO4lB,EAAazxK,OAAS,EACvByxK,EAAa/sK,QAAO,SAACpF,EAAW8E,GAAZ,OAA0B9E,EAAK8E,KACnD,EEFH,I,kWCzDKutK,GDyDCC,GAA+C72E,GACxD,CACIjmG,KAAM,CACFhU,KAAM,GACNi1C,YAAa,GACb87I,cAAe,EACfC,eAAgB,EAChBC,SAAU,KACV3yL,OAAQ+2C,KAAmB+F,MAC3BluC,QAAS,GACT69J,cAAe,MAEnB/iJ,UAAW,GACXkpK,oBAAgB5zL,EAChB6rB,WAAY,GACZgoK,qBAAiB7zL,EACjB2W,WAAW,EACXm9K,oBAAoB,EACpBC,qBAAqB,EACrBrmB,KAAM,OACNvyG,OAAQ,IAEZ,cAqOS64H,GAAoBp7J,mBAE/BkkF,GAAkB,CAAEx8F,YAAa,eAFFsY,EA7MI,WAGV,IAFvB7nB,EAEsB,uDAFdyiL,GACR9pL,EACsB,uCACtB,OAAQA,EAAOO,MACX,KAAKuN,GAAQy8K,6BACT,OAAO,6BACAljL,GADP,IAEI4F,WAAW,IAEnB,KAAKa,GAAQs7K,+BACT,OAAO,6BACA/hL,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MACNhN,EAAOtI,MAEduV,WAAW,EACX+2J,KAAM,UACNvyG,OAAQ,KAEhB,KAAK3jD,GAAQ08K,+BACT,OAAO,6BACAnjL,GADP,IAEI4F,WAAW,EACX+2J,KAAM,QACNvyG,OAAQzxD,EAAOmF,QAEvB,KAAK2I,GAAQ28K,mBACT,IAAMC,EAAuB,gBAAQrjL,EAAM2F,MAE3C,OADA09K,EAAmB1qL,EAAOzH,OAASyH,EAAOtI,KACnC,6BACA2P,GADP,IAEI2F,KAAK,gBACE09K,GAEP1mB,KAAMhkK,EAAO0mK,OAASr/J,EAAM28J,KAAO,aAE3C,KAAKl2J,GAAQ68K,+BACT,OAAO,6BACAtjL,GADP,IAEI+iL,oBAAoB,IAE5B,KAAKt8K,GAAQ88K,iCACT,OAAO,6BACAvjL,GADP,IAEI2Z,UAAU,aACHhhB,EAAOtI,KAAK8O,KAAI,SAAC4vC,GAGhB,OAFAA,EAAS71C,KAAO,WAChB61C,EAASwzI,aAAe,EACjBxzI,MAGfg0I,oBAAoB,EACpB34H,OAAQ,KAEhB,KAAK3jD,GAAQ+8K,iCACT,OAAO,6BACAxjL,GADP,IAEI28J,KAAM,QACNomB,oBAAoB,EACpB34H,OAAQzxD,EAAOmF,QAEvB,KAAK2I,GAAQg9K,gCACT,OAAO,6BACAzjL,GADP,IAEIgjL,qBAAqB,IAE7B,KAAKv8K,GAAQi9K,kCACT,OAAO,6BACA1jL,GADP,IAEI8a,WAAW,aACJniB,EAAOtI,KAAK8O,KAAI,SAAC0wC,GAEhB,OADAA,EAAU32C,KAAO,YACV22C,MAGfmzI,qBAAqB,EACrB54H,OAAQ,KAEhB,KAAK3jD,GAAQk9K,kCACT,OAAO,6BACA3jL,GADP,IAEI28J,KAAM,QACNqmB,qBAAqB,EACrB54H,OAAQzxD,EAAOmF,QAEvB,KAAK2I,GAAQm9K,oCACT,OAAO,6BACA5jL,GADP,IAEIoqD,OAAQ,GACRy4H,gBAAiBlqL,EAAO4+C,QAEhC,KAAK9wC,GAAQo9K,qCACT,OAAO,6BACA7jL,GADP,IAEIoqD,OAAQ,GACR04H,iBAAkBnqL,EAAO4+C,QAEjC,KAAK9wC,GAAQq9K,uBACT,OAAO,6BACA9jL,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA+2J,cAAe2lB,GACX1pL,EAAOtI,MAEXwO,QAAQ,aAAKlG,EAAOtI,QAExBssK,KAAM,aAEd,KAAKl2J,GAAQs9K,mCACT,IAAMC,EAAahkL,EAAM2F,KAAK9G,QAAQM,KAClC,SAACN,GACG,IAAMolL,EACFplL,EAAQ3F,OAASklL,GAAsBz5K,SAM3C,OAJkBs/K,EACZplL,EAAQkwC,SAAUpxC,GAClBkB,EAAQgxC,UAAWlyC,MAEPhF,EAAOkxE,QAAUo6G,EACxB,6BACAplL,GADP,IAEI0jL,aACI1jL,EAAQ0jL,cACR1jL,EAAQ0jL,aAAe,IAGxB1jL,KAInB,OAAO,6BACAmB,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA+2J,cAAe2lB,GAAiC2B,GAChDnlL,QAASmlL,IAEbrnB,KAAM,aAGd,KAAKl2J,GAAQy9K,mCACT,IAAMF,EAAahkL,EAAM2F,KAAK9G,QAAQM,KAClC,SAACN,GACG,IAAMolL,EACFplL,EAAQ3F,OAASklL,GAAsBz5K,SAK3C,OAHkBs/K,EACZplL,EAAQkwC,SAAUpxC,GAClBkB,EAAQgxC,UAAWlyC,MACPhF,EAAOkxE,QAAUo6G,EACxB,6BACAplL,GADP,IAEI0jL,aAAc1jL,EAAQ0jL,aACS,IAAzB1jL,EAAQ0jL,aACJ,EACA1jL,EAAQ0jL,aAAe,EAC3B,IAGH1jL,KAInB,OAAO,6BACAmB,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA+2J,cAAe2lB,GAAiC2B,GAChDnlL,QAASmlL,IAEbrnB,KAAM,aAGd,KAAKwnB,KAAgBxrK,mCACjB,OAAO,6BACA3Y,GADP,IAEI28J,KAAM,YAEd,KAAKl2J,GAAQ29K,4BACT,OAAO,6BACApkL,GADP,IAEIqkL,UAAWx0J,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAM2F,SAEnD,KAAKc,GAAQ69K,8BACT,OAAO,6BACAtkL,GADP,IAEI2F,KAAMkqB,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAMqkL,YACtC1nB,KAAM,SAEd,KAAKl2J,GAAQ89K,mBACT,OAAO,6BACA9B,IADP,IAEI98K,KAAK,6BACE88K,GAAwB98K,MAD3B,IAEA9G,QAAS,OAGrB,QACI,OAAOmB,MAQNwkL,GAAqB,SAACxkL,GAAD,OAAqBA,EAAM/L,YEnRhDwwL,GAA4B,WACrC,IAAMllL,EAAWO,cACX80C,EAAqBzgD,eACrB6b,EAAcnQ,cACpB,OAAO3R,uBACH,SAACmB,GACG,IAAMwlD,EACFvH,aAA0Bj+C,GAE9BkQ,ELVD,CACHrG,KAAMuN,GAAQ68K,iCKUV1uI,EAAmBC,GACdrrB,MAAK,SAAAn5B,GAAS,IAAD,ELOiBknD,EKN3Bh4C,ELRb,SAAuClP,GAC1C,MAAO,CACH6I,KAAMuN,GAAQ88K,iCACdlzL,QKKqBq0L,CAA8Br0L,EAAK+f,SAExC,OAAC/gB,QAAD,IAACA,OAAD,EAACA,EAAc0B,cACf,OAAC1B,QAAD,IAACA,GAAD,UAACA,EAAc0kB,gBAAf,aAAC,EAAwBlD,SAEzBtR,GLCuBg4C,EKDiBlnD,EAAKknD,MLE1D,CACHr+C,KAAMuN,GAAQm9K,oCACdrsI,cKDS7tB,OAAM,SAAC5rB,GACJyB,ELVb,SAAuCzB,GAC1C,MAAO,CACH5E,KAAMuN,GAAQ+8K,iCACd1lL,SKOqB6mL,CAA8B7mL,EAAMgB,UAC7CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUq1C,EAAoB5kC,KAI1B40K,GAA6B,WACtC,IAAMrlL,EAAWO,cACXs1C,EAAsBhmD,eACtB4gB,EAAcnQ,cACpB,OAAO3R,uBACH,SAACmB,GACG,IAAMgmD,EACF/H,aAA0Bj+C,GAC9BkQ,ELXD,CACHrG,KAAMuN,GAAQg9K,kCKWVruI,EAAoBC,GACf7rB,MAAK,SAAAn5B,GAAS,IAAD,ELMmBknD,EKL7Bh4C,ELTb,SAAwClP,GAC3C,MAAO,CACH6I,KAAMuN,GAAQi9K,kCACdrzL,QKMqBw0L,CAA+Bx0L,EAAK+f,SAEzC,OAAC/gB,QAAD,IAACA,OAAD,EAACA,EAAc0B,cACf,OAAC1B,QAAD,IAACA,GAAD,UAACA,EAAc0kB,gBAAf,aAAC,EAAwBlD,SAEzBtR,GLAyBg4C,EKAiBlnD,EAAKknD,MLC5D,CACHr+C,KAAMuN,GAAQo9K,qCACdtsI,cKAS7tB,OAAM,SAAC5rB,GACJyB,ELXb,SAAwCzB,GAC3C,MAAO,CACH5E,KAAMuN,GAAQk9K,kCACd7lL,SKQqBgnL,CAA+BhnL,EAAMgB,UAC9CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU61C,EAAqBplC,KAI3B+0K,GAAgC,WACzC,IAAMxlL,EAAWO,cACXklL,EAAmBzxL,eACnB0xL,EAAuBxxL,eACvBuc,EAAcnQ,cACpB,OAAO3R,uBACH,SAACg3L,GACG3lL,ELgBD,CACHrG,KAAMuN,GAAQy8K,+BKhBV8B,EAAiBE,GACZ17J,MAAK,SAAAn5B,GACF40L,EAAqBC,GAChB17J,MAAK,SAAA71B,GACF,IAAMwxL,EAAc,6BACb90L,GADa,IAEhBwO,QAASlL,IAEb4L,EACIuiL,GAA2BqD,OAGlCz7J,OAAM,WACHo4J,GAA2BzxL,SAGtCq5B,OAAM,SAAC5rB,GACJyB,ELUb,SAAoCzB,GACvC,MAAO,CACH5E,KAAMuN,GAAQ08K,+BACdrlL,SKbqBsnL,CAA2BtnL,EAAMgB,UAC1CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUylL,EAAkBC,EAAsBj1K,KAI9Cq1K,GAAiC,WAC1C,IAAM9lL,EAAWO,cACjB,OAAO5R,uBACH,SAACmC,GACGkP,EL1CL,SAAoClP,GACvC,MAAO,CACH6I,KAAMuN,GAAQq9K,uBACdzzL,QKuCai1L,CAA2Bj1L,MAExC,CAACkP,KAIIgmL,GAAoC,WAC7C,IAAMhmL,EAAWO,cACjB,OAAO5R,uBACH,SAAC27E,GACGtqE,EL7CL,SAAwCsqE,GAC3C,MAAO,CACH3wE,KAAMuN,GAAQs9K,mCACdl6G,UK0Ca27G,CAA+B37G,MAE5C,CAACtqE,KAIIkmL,GAAoC,WAC7C,IAAMlmL,EAAWO,cACjB,OAAO5R,uBACH,SAAC27E,GACGtqE,ELhDL,SAAwCsqE,GAC3C,MAAO,CACH3wE,KAAMuN,GAAQy9K,mCACdr6G,UK6Ca67G,CAA+B77G,MAE5C,CAACtqE,KAIIomL,GAA4B,WACrC,IAAMpmL,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ELjDG,CACHrG,KAAMuN,GAAQ89K,uBKiDf,CAAChlL,KAGKqmL,GAAoC,WAC7C,IAAMrmL,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ELjBG,CACHrG,KAAMuN,GAAQ29K,gCKiBf,CAAC7kL,KAGKsmL,GAA4C,WACrD,IAAMtmL,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ELlBG,CACHrG,KAAMuN,GAAQ69K,kCKkBf,CAAC/kL,KAGKumL,GAA6B,WACtC,IAAMvmL,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAY7S,EAA0BmuK,GACnC9/J,EL9CL,SACHlP,EACAa,EACAmuK,GAEA,MAAO,CACHnmK,KAAMuN,GAAQ28K,mBACdlyL,MAAOA,EACPb,KAAMA,EACNgvK,OAAQA,GKqCK0mB,CAAuBhiL,EAAO7S,EAAOmuK,MAElD,CAAC9/J,KCrLIymL,GAAc1pL,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIE,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BANV,SAQI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,24BACFF,KAAK,sBAOVyoL,MCDTjO,GAAsB75K,IAAOC,IAAV,4BAEnB65K,GAAqB95K,IAAOC,IAAV,8IAQlB8xJ,GAAoB/xJ,IAAOC,IAAV,4FAMjButE,GAAcxtE,IAAOC,IAAV,4FAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC60L,GAAgBj6K,IAAOC,IAAV,4FAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCmjK,GAA0B5nJ,IAAOC,IAAV,sDAIvB8nL,GAAuC/nL,IAAOC,IAAV,6GAMpC+5K,GAAiCh6K,IAAOC,IAAV,kDAI9B85K,GAAsB/5K,IAAOC,IAAV,wHAOnBi6K,GACE,2BADFA,GAGE,8IAHFA,GAIU,UAJVA,GAKgB,UALhBA,GAMK,gBANLA,IAOO,EAPPA,IAQM,EAGNC,GACE,kCADFA,GAEO,kCAFPA,GAGU,UAHVA,GAIgB,KAJhBA,GAKK,mBALLA,IAMO,EANPA,IAOM,EAGN6N,GAAkBhoL,IAAO0nB,KAAV,kHAGG,qBAAGpnB,MAAkBpc,OAAOU,YAI9C6hF,GAAazmE,IAAOC,IAAV,yFAMV2mE,GAAa5mE,IAAO0nB,KAAV,6EAKVugK,GAAyBjoL,IAAOoD,OAAV,qcAMT,SAAAlD,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAEjC,gBAAGgX,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOI,eAEpC,qBAAGsf,SAA2B,OAAS,SAG5C,qBAAGtD,MAAkBpc,OAAOsD,aAG5B,qBAAG8Y,MAAkBpc,OAAOyiF,aAG/BF,IACG,qBAAGnmE,MAAkBpc,OAAOsD,YAE9Bi/E,IACE,qBAAGnmE,MAAkBpc,OAAOyiF,cAMvCyzG,GAAa,SAAC8N,GAChB,MAAO,CACH70L,QAAS,CACLoM,GAAI,6BACJmB,QAAS,mCACTy5K,WAAY,cACZl2K,MAAO,qBACPs1K,SAAS,EACTD,QAAQ,GAEZ3qI,MAAO,CACHpvC,GAAI,4BACJmB,QAAS,GACTy5K,WAAY,UACZl2K,MAAO,gBACPs1K,SAAS,EACTD,QAAQ,GAEZ1qI,SAAU,CACNrvC,GAAI,8BACJmB,QAAS,oCACTy5K,WAAY,eACZl2K,MAAO,sBACPs1K,SAAS,EACTD,QAAQ,GAEZpmL,OAAQ,CACJqM,GAAI,6BACJmB,QAAQ,qDAAD,OACHsnL,GAAkB,YADf,kIAGP7N,WAAY,UACZl2K,MAAO,sBACPs1K,SAAS,EACTD,QAAQ,KAKdc,GAAmB,CAACxxI,KAAmB11C,QAEvCmnL,GAiBD,SAAC,GASC,IAAD,QARFxkL,EAQE,EARFA,WACAwuB,EAOE,EAPFA,SAEA4jK,GAKE,EANFC,iBAME,EALFD,wBACA5hD,EAIE,EAJFA,sBACA8hD,EAGE,EAHFA,oBACAC,EAEE,EAFFA,0BACA3N,EACE,EADFA,WACE,EACsCx3J,oBAAS,GAD/C,mBACK43J,EADL,KACmBC,EADnB,OAEgC73J,oBAAS,GAFzC,mBAEK83J,EAFL,KAEgBC,EAFhB,OAG4C/3J,oBAAS,GAHrD,mBAGKg4J,EAHL,KAGsBC,EAHtB,OAIgCj4J,mBAC9B2lB,KAAmB11C,QALrB,mBAIKioL,EAJL,KAIgBC,EAJhB,KAQIiN,ECzCwC,WAC9C,IAAMlnL,EAAWO,cACX47K,EAAyBxnL,eACzBoyL,EAAmBR,KAEzB,OAAO53L,uBACH,SAACsF,GACOA,GACAkoL,EAAuB,QAAS,CAACloL,IAAeg2B,MAC5C,SAACgT,GACGj9B,EACIkZ,aAA+B+jB,EAAU,WAE7C8pJ,EACIt/I,KAAmB+F,MACnB,UACA,QAMpB,CAACxtC,EAAU+mL,EAAkB5K,IDoB7BgL,GAEEC,EAA4B,SAAC12L,GAC/BupL,EAAavpL,GACbipL,GAAgB,IAGdO,EAAc32K,qBAAW42K,IACzB/X,EAAO7+J,qBAAW8+J,IAWxB,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACKqX,GACG,cAAC,GAAD,CACIjtI,SAAU,WACNktI,GAAgB,IAEpBntI,UAAW,WACPmtI,GAAgB,GAChBmN,EAAuB,KAAM9M,IAEjCl3K,MAAOi2K,KAAaiB,GAAWl3K,MAC/BwpC,kBAAmBysI,KAAaiB,GAAWhB,WAC3Cf,gBAAiBc,KAAaiB,GAAW5B,QACzCF,eAAgBa,KAAaiB,GAAW57K,GACxC+5K,OAAQY,KAAaiB,GAAW7B,OAZpC,mBAeQY,GAAU,OACNrkL,QADM,IACNA,GADM,UACNA,EAAYmyL,cADN,iBACN,EAAoBltL,YADd,aACN,EAA0BsL,sBAhBtC,iBAeQ,EAEI+0K,UAjBZ,aAeQ,EAEgBz6K,UAI3Bq6K,GACG,cAAC,GAAD,CACIntI,SAAU,WACNotI,GAAa,IAEjBrtI,UAAW,WACPqtI,GAAa,GACbmN,IACA5kB,EAAKhpK,OAAO4kK,GAAekX,OAE/BpyK,MAAO+1K,GACPvsI,kBAAmBusI,GACnBtsI,iBAAkBssI,GAClBZ,gBAAiBY,GACjBX,eAAgBW,GAChBV,OAAQU,GAdZ,SAgBKA,KAGRiB,GACG,cAAC,GAAD,CACIrtI,SAAU,WACNstI,GAAmB,IAEvBvtI,UAAW,WACPutI,GAAmB,GACnBkN,IACA7kB,EAAKhpK,OAAO4kK,GAAesE,OAE/Bx/J,MAAOg2K,GACPxsI,kBAAmBwsI,GACnBvsI,iBACIusI,GAEJb,gBAAiBa,GACjBZ,eAAgBY,GAChBX,OAAQW,GAhBZ,SAkBKA,KAGT,cAAC,GAAD,UACI,cAAC,GAAD,CAAah5K,YAAU,yBAAvB,SACKy4K,GAAe,cAAenW,EAAKr+J,MAAyBrP,EAAW0J,QAGhF,cAAC,GAAD,UACK66K,GAAiB5oK,SAAS3b,EAAWhE,QAClC0xK,EAAKr+J,OAASi6J,GAAesE,KACzB,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIllK,MAAM,QACNC,OAAO,OACPkF,SAAU23K,EACV9gL,OAAQ,yBACJ8rI,QADI,IACJA,OADI,EACJA,EAAqB,OACjBxwI,QADiB,IACjBA,OADiB,EACjBA,EAAY0J,KAGpBoB,QAAQ,UACRqD,SAAS,2BAVb,4BAeJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBAAMygL,GAAa,IAC3Bh3K,SAAS,mBALb,uBAYR,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,EACV9gL,OAAQ,WAvHpC8pB,EACA62J,GAAmB,IAEnBkN,IACA7kB,EAAKhpK,OAAO4kK,GAAesE,QAoHC9iK,QAAQ,UACRqD,SAAS,qBANb,sBAWJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBACJ0tL,EAAuB,OAE3BjkL,SAAS,mBAPb,uBAcZnO,EAAWhE,SAAW+2C,KAAmBgG,SACzC,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIpwC,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBACJ8tL,EACIxyL,EAAW0J,KAGnByE,SAAS,sBATb,yBAgBR,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBACJ0tL,EACI,KACAr/I,KAAmB+F,QAG3BhuC,QAAQ,UACRqD,SAAS,4BAXb,6BAgBJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBACJguL,EACI3/I,KAAmB11C,SAG3B8Q,SAAS,sBATb,+BAmBpB,eAAC6jL,GAAD,WACI,eAAC,GAAD,WACKhyL,EAAWhE,SAAW+2C,KAAmB11C,QACtCqwK,EAAKr+J,OAASi6J,GAAesE,MACzB,uBAAMxiK,YAAU,2BAAhB,sBACc,IACTwgB,aAAW5rB,EAAW0lL,WAAW,MAG7C1lL,EAAWhE,SAAW+2C,KAAmBgG,UACtC20H,EAAKr+J,OAASi6J,GAAesE,MACzB,uBAAMxiK,YAAU,2BAAhB,qBACa,IACRwgB,aAAW5rB,EAAW0lL,WAAW,MAG7C1lL,EAAWhE,SAAW+2C,KAAmB+F,OACtC,sBAAM1tC,YAAU,gCAAhB,kCAKPpL,EAAWhE,SAAW+2C,KAAmB11C,QACtC,qCACKqwK,EAAKr+J,OAASi6J,GAAesE,MAC1B,cAACqkB,GAAD,IAGJ,eAACC,GAAD,CACI7jL,QAAS,kBACLqkL,EACI3/I,KAAmBgG,WAG3BlrC,SAAU23K,GAAeZ,EACzBx5K,YAAU,sBAPd,UASI,cAACslE,GAAD,UACI,cAAC,GAAD,MAEJ,cAAC,GAAD,+BAMhB,cAAC,KAAD,QAkCGi1G,GArBV,SAAC,GAAmE,IAAjEyM,EAAgE,EAAhEA,uBAAwB5hD,EAAwC,EAAxCA,sBAAuBo0C,EAAiB,EAAjBA,WAC7C5kL,EAAaujB,YAAYgtK,IACzB8B,EAAmBR,KACnBS,EAAsBX,KACtBY,EACFX,KAEJ,OACI,cAAC,GAAD,CACI5xL,WAAYA,EAAW0R,KACvB8c,SAA8B,aAApBxuB,EAAW0oK,KACrB0pB,uBAAwBA,EACxB5hD,sBAAuBA,EACvB6hD,iBAAkBA,EAClBC,oBAAqBA,EACrBC,0BAA2BA,EAC3B3N,WAAYA,KEleX+N,GAAgC,SACzCC,EACAC,EACAxjL,GACW,IAAD,EAUV,OARiB,iBACbujL,QADa,IACbA,OADa,EACbA,EAAoB1nL,KAChB,SAAAmS,GAAI,OACAA,EAAKy9B,SAAL,6BACWz9B,EAAKy9B,UADhB,IAC0B71C,KAAMklL,GAAsBz5K,WADtD,6BAEW2M,EAAKu+B,WAFhB,IAE2B32C,KAAMklL,GAAsBx5K,sBALlD,QAMR,IAGOyM,QACR,SAAAxS,GAAO,OACHA,EAAQlB,KAAOmpL,EAAenpL,IAC9BkB,EAAQ3F,OAAS4tL,EAAe5tL,QACtC2X,OAAS,GA5BE,SAACvN,GAAD,OAA2BA,IAASi6J,GAAesE,KA4BhDklB,CAAazjL,IC5B/B0jL,GAAoB9oL,IAAOC,IAAV,6OAKL,SAAAC,GAAK,OACbA,EAAMkY,WACFlY,EAAMkY,WACNlY,EAAM0D,SACN3f,IAAUC,OAAOuB,YACjBxB,IAAUC,OAAOC,SACV,SAAA+b,GAAK,OAAKA,EAAM6oL,WAAa,OAAS,SAOrC,SAAA7oL,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAI5CyiM,GAA0BhpL,IAAOC,IAAV,yLAKhB,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAO0B,SACnBsa,EAAMI,MAAMpc,OAAOkB,SAC3B,SAAA8a,GAAK,OACFA,EAAM0D,UAAP,+BAKI,SAAA1D,GAAK,OAAIA,EAAMkmE,QAMrB6iH,GAAqBjpL,IAAOC,IAAV,0GAKX,SAAAC,GAAK,OACVA,EAAM0D,SACA,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0B,UAC5Bsa,EAAMI,MAAMpc,OAAOkB,SAC3B,SAAA8a,GAAK,OACFA,EAAM0D,UAAP,+BAKI,SAAA1D,GAAK,OAAIA,EAAMkmE,QAGd8iH,GAOR,SAAC,GAOM,IANRvoL,EAMO,EANPA,QACAwoL,EAKO,EALPA,kBACA/jL,EAIO,EAJPA,KACAgT,EAGO,EAHPA,WACAgxK,EAEO,EAFPA,aACAllL,EACO,EADPA,SAEA,OAAOvD,EAAQM,KAAI,SAACmS,EAA4BlS,GAAmB,IAAD,EACxDy0G,EAAU,UACZ+yE,GAA8BS,EAAmB/1K,EAAMhO,UAD3C,SAKhB,OACI,cAAC,KAAD,CAEIgxK,YAAW,UAAKiT,GAAL,YAAiCj2K,EAAK3T,IACjDyB,MAAOA,EACPooL,eAAgB3zE,EAJpB,SAMK,SAACsgE,EAAeC,GACb,OACI,eAAC4S,GAAD,wCACI7S,SAAUA,EACV53K,IAAK43K,EAASn/G,UACVm/G,EAASI,gBACTJ,EAASK,iBAJjB,IAKI1yK,SAAU+xG,EACVozE,WAAY7S,EAAS6S,WACrB3wK,WAAYA,EACZmxK,cAAe,kBACV5zE,GACDyzE,GACAA,EAAah2K,EAAK3T,KAEtB0B,YAAW+C,EAbf,UAeI,cAAC8kL,GAAD,CACIplL,SAAU+xG,EACVozE,WAAY7S,EAAS6S,WACrB3iH,KAAM,GACNjlE,YAAW+C,GAAQ,UAAOA,EAAP,UAJvB,SAMKkP,EAAKjP,QAEV,cAAC8kL,GAAD,CACIrlL,SAAU+xG,EACVozE,WAAY7S,EAAS6S,WACrB3iH,KAAM,GACNjlE,YAAW+C,GAAQ,UAAOA,EAAP,aAJvB,SAMKkP,EAAKmrJ,OAAOC,cACP5vB,GAAax7H,EAAKmrJ,OAAOC,eACzB,YAtCjBprJ,EAAK3T,QC5FpBmjI,GAAgC5iI,IAAOC,IAAV,4VAYX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAEvC,SAAAsb,GAAK,OACVA,EAAMs0G,SACAt0G,EAAMI,MAAMpc,OAAOkB,MACnB8a,EAAMI,MAAMpc,OAAOO,aACf,SAAAyb,GAAK,OACfA,EAAMs0G,SAAW,QAAUt0G,EAAMI,MAAMpc,OAAOS,aAIhD6kM,GAAkBxpL,IAAOC,IAAV,yNAKH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAEjB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAC3B,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAiB3CyqI,GATV,SAAC,GAAyC,IAAvClrH,EAAsC,EAAtCA,MAAO1J,EAA+B,EAA/BA,OAAQ66G,EAAuB,EAAvBA,OAAQpxG,EAAe,EAAfA,SAC3B,OACI,eAAC,GAAD,CAA+BE,QAAS3J,EAAQ+5G,WAAYc,EAAQn0G,YAAW+C,EAA/E,UACKC,EACAmxG,GAAU,cAACk0E,GAAD,QCnCjB/lD,GAA4BzjI,IAAOC,IAAV,kDAIzBwpL,GAASzpL,IAAOC,IAAV,kEA6BGyjI,GAnBV,SAAC,GAA2C,IACzCrf,EADAsf,EAAwC,EAAxCA,KAAMruB,EAAkC,EAAlCA,OAAQsuB,EAA0B,EAA1BA,UAAW1/H,EAAe,EAAfA,SAgB7B,OAdAmgH,EAAYsf,EAAK1iI,KAAI,SAAC0iI,GAClB,OACI,eAAC,IAAMmZ,SAAP,WACI,cAAC,GAAD,CACI34I,MAAOw/H,EAAKx/H,MACZ1J,OAAQ,kBAAMmpI,GAAaA,EAAUD,EAAKzyG,MAC1CokF,OAAQA,IAAWquB,EAAKzyG,IACxBhtB,SAAQ,UAAKA,EAAL,YAAiBy/H,EAAKzyG,OAEjCyyG,EAAK+lD,OAAS,cAACD,GAAD,MAPE9lD,EAAKzyG,QAY3B,cAAC,GAAD,UAA4BmzF,KCnCjCslE,GAAmC3pL,IAAOC,IAAV,4BAEhC2pL,GAOD,SAAC,GAOC,IANHC,EAME,EANFA,eACAC,EAKE,EALFA,sBACAC,EAIE,EAJFA,uBACAC,EAGE,EAHFA,gBACA33F,EAEE,EAFFA,KACA43F,EACE,EADFA,QAEMxuK,OACwB1qB,IAA1B+4L,EACMA,EACAD,GAEA,IAEJjtK,OACyB7rB,IAA3Bg5L,EACMA,EACAC,GAEA,IAEV,OACI,cAACL,GAAD,UACI,cAAC,GAAD,CACIhmD,KAAM,CACF,CACIzyG,IAAK,YACL/sB,MAAM,cAAD,OAAgBsX,EAAhB,KACLiuK,OAAO,GAEX,CACIx4J,IAAK,aACL/sB,MAAM,eAAD,OAAiByY,EAAjB,OAGb04F,OAAQjjB,EACRuxC,UAAWqmD,EACX/lL,SAAS,uBA2BVgmL,GAhBV,SAAC,GAAsE,IAApE73F,EAAmE,EAAnEA,KAAM43F,EAA6D,EAA7DA,QAASH,EAAoD,EAApDA,sBAAuBC,EAA6B,EAA7BA,uBACpCtuK,EAAYnC,YAAYgtK,IAAoB3B,eAC5C/nK,EAAatD,YAAYgtK,IAAoB1B,gBAEnD,OACI,cAAC,GAAD,CACIiF,eAAgBpuK,EAChBquK,sBAAuBA,EACvBC,uBAAwBA,EACxBC,gBAAiBptK,EACjBy1E,KAAMA,EACN43F,QAASA,KCxERE,GAAQ/rL,sBACjB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,stBACF4T,OAAU5U,EAAS,eAAYxN,UAOpCo5L,MCjDT5jK,GAAYvmB,IAAOC,IAAV,iHAMTkvB,GAAUnvB,IAAOC,IAAV,+IASP2gD,GAAkB5gD,IAAOC,IAAV,2HAQf+gD,GAAUhhD,IAAOC,IAAV,wJAQPstC,GAAgBvtC,IAAOC,IAAV,uDAINmqL,GAGR,SAAC,GAAwC,IAAtC/kD,EAAqC,EAArCA,eAAgBE,EAAqB,EAArBA,eAAqB,EACTpiH,mBAAmB,IADV,mBAClC8K,EADkC,KACxBmwH,EADwB,KAEnCzY,EAAapyH,eACb4yH,EAAiBryH,eACjBtiB,EAASm5B,eAET0zH,EAAuBruJ,uBACzB,SAACqjB,GAAD,OAAmB+qI,EAAY/qI,KAC/B,CAAC+qI,IAGC3qD,EAAiBzjG,uBAAY,WAC/Bq1I,EAAep3G,GACf03G,IACAJ,MACD,CAACF,EAAgBp3G,EAAUs3G,EAAgBI,IAExC0kD,EAAiBr6L,uBAAY,WAC/Bm2I,MACD,CAACA,IAEJ,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC5xG,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACIwkB,cAAe21H,EACfv1H,UAAU,EACVF,mBAAiB,EACjBC,YAAU,UAK1B,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CAAQjlB,UAAWpS,EAAO6iB,SAAS1B,OAAQ9R,QAAQ,UAAUpC,MAAO,QAAShE,OAAQ,kBAAM4vL,KAA3F,qBAIJ,cAAC,IAAD,CAAQ5rL,MAAO,QAAShE,OAAQ,kBAAMg5F,KAAtC,iC,UCrEVltE,GAAYvmB,IAAOC,IAAV,oDAIT27F,GAAa57F,IAAOC,IAAV,mGAMVojE,GAAoBrjE,IAAOC,IAAV,kIAOjBqqL,GAAkBtqL,IAAOC,IAAV,4CAIf2gD,GAAkB5gD,IAAOC,IAAV,2FA2ENsqL,GAhEV,SAAC,GAA0D,IAAxDphK,EAAuD,EAAvDA,cAAe8O,EAAwC,EAAxCA,YAAa0iJ,EAA2B,EAA3BA,WAAYz2K,EAAe,EAAfA,SACtC1S,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eAEnB+P,qBAAU,WACN2U,EAAYzmC,EAAOi8G,SACpB,CAACj8G,EAAOi8G,MAAOx1E,IAElB,IAAM3jB,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OACxCkT,EAAqBjP,eAO3B,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAACm0K,GAAD,UACI,cAAC,KAAD,CACI//J,SAAUpB,EACVvlB,SAAU+2K,EACVz2K,SAAUA,GAAQ,UAAOA,EAAP,qBAG1B,cAAC,GAAD,UACI,cAACmsB,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIy0G,eAAgBptG,EAChBstG,eAAgB,kBAAM30G,QAJlC,SAQK,SAACvyB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,SAAU+2K,EACV5/H,WAAYlqB,EACZ6zG,aAAclzI,EAAOi8G,MAAM96F,OAC3BzO,SAAUA,GAAQ,UAAOA,EAAP,sBAMrC1S,EAAOi8G,SAAWj8G,EAAOi8G,MAAM96F,QAC5B,eAAC0wD,GAAD,WACI,cAAC,KAAD,IACA,cAAC,KAAD,CACIz6D,eAAgBpX,EAAOi8G,MACvBnpC,cA1CE,SAAC7gE,GACnB+mL,EAAgBplK,EAAmB3hB,EAAOjS,EAAOi8G,MAAOn5F,IACxDqxH,UA4CI,cAAC,KAAD,Q,UC9EN8kD,GAAqBzqL,IAAOC,IAAV,oHAOlB0sF,GAAc3sF,IAAOwsF,MAAV,kHAOXk+F,GAAuB1qL,YAAO62D,KAAP72D,CAAH,6IAQpB2qL,GAAoB3qL,IAAOC,IAAV,wOAGC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAO9CgmM,GAAa5qL,IAAOC,IAAV,8NACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxC8pK,GAAuBjuJ,YAAOihE,KAAPjhE,CAAH,kGAMpB6qL,GAAsB7qL,IAAOC,IAAV,6RAMH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAS5C0oK,GAAwBttJ,YAAO65D,KAAP75D,CAAH,gDAIrB8qL,GAAwB9qL,YAAOqtJ,KAAPrtJ,CAAH,6DAIrBokF,GAAYpkF,IAAOC,IAAV,0IAQF8qL,GAUR,SAAC,GAUC,IAAD,EATFnjL,EASE,EATFA,QACAojL,EAQE,EARFA,qBACAvvK,EAOE,EAPFA,UACA0tK,EAME,EANFA,kBACApyJ,EAKE,EALFA,oBACAs7D,EAIE,EAJFA,KACA43F,EAGE,EAHFA,QACAb,EAEE,EAFFA,aACA1hL,EACE,EADFA,UAEMizK,EAAax0K,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MACzCkxL,EAAiBrrK,YAAYgtK,IAAoB3B,eAFrD,EAUE7tJ,aAAqBC,GALrB5lC,EALF,EAKEA,aACAg4B,EANF,EAMEA,cACA4O,EAPF,EAOEA,WACAU,EARF,EAQEA,SACAR,EATF,EASEA,YAGEwrI,EAAO7+J,qBAAW8+J,IAClB1pG,EAAgB70C,iBAAuB,MAE7C7B,qBAAU,WACFnyB,IAAiB4lC,GACjBi0J,EAAqB75L,KAE1B,CAACA,EAAc4lC,EAAqBi0J,IAEvC,IAAMj4L,EAAU5B,EAAa4B,QACvBk4L,EAAWnhD,GAAW,QAAS/2I,EAASglC,GACxCmzJ,EAAephD,GACjB,iBACA/2I,EACAglC,GAGJ,OACI,eAAC0yJ,GAAD,WACI,cAAC,GAAD,CACIp4F,KAAMA,EACN43F,QAASA,EACTH,sBAAuBnF,IAE3B,eAACgG,GAAD,WACI,cAAC,GAAD,CACIxhK,cAAeA,EACf8O,YAAaA,EACb0iJ,WAAYA,EACZz2K,SAAS,0BAEb,cAAC0mL,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,eAACF,GAAD,WACI,cAACI,GAAD,2BACIrsL,MAAO,IACHwsL,GAFR,IAGI/mL,SAAS,+BAHb,wBAOA,cAAC4mL,GAAD,2BACIrsL,MAAO,IACHysL,GAFR,IAGIhnL,SAAS,wCAHb,+BAUVwD,GAAa+T,EAAU9I,OAAS,EAC9B,cAAC,GAAD,CAAe9O,KAAMsnL,GAArB,SACKh6L,EAAa0B,WAAW8f,OAAS,EAC5B,0BACA,iBAGV,cAACyxE,GAAD,CAAW/lF,IAAK27D,EAAhB,SACI,cAAC,GAAD,CACIF,aA/Kb,GAgLaC,UAAWt+C,EAAYA,EAAU9I,OAAS,EAC1CR,WAAYwyK,EACZzqH,cAAezhC,EACfuhC,cAAeA,EACfK,YACI5+C,EAAU9I,OArL3B,GA8KS,SAUI,cAAC,KAAD,CACIqjK,YACIoV,GAFR,SAKK,SAACnV,GACE,OACI,eAAC4U,GAAD,6BACQ5U,EAASoV,gBADjB,IAEIhtL,IAAK43K,EAASn/G,SAFlB,UAKQ,cAAC,GAAD,CACIn2D,QAAS8a,EACTrW,KAAMq+J,EAAKr+J,KACX+jL,kBACIA,EAEJ/wK,WACIn0B,IAAUC,OACLC,MAETilM,aACIA,EAEJllL,SAAS,8BAGhB+xK,EAAShsH,mCClNxDqhI,GAAsBtrL,IAAOC,IAAV,oHAOnB0sF,GAAc3sF,IAAOwsF,MAAV,kHAOXk+F,GAAuB1qL,YAAO62D,KAAP72D,CAAH,6IAQpB2qL,GAAoB3qL,IAAOC,IAAV,4NAGC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAO9CgmM,GAAa5qL,IAAOC,IAAV,wMASVguJ,GAAuBjuJ,YAAOihE,KAAPjhE,CAAH,kGAMpB6qL,GAAsB7qL,IAAOC,IAAV,6RAMH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAS5C0oK,GAAwBttJ,YAAO65D,KAAP75D,CAAH,gDAIrB8qL,GAAwB9qL,YAAOqtJ,KAAPrtJ,CAAH,6DAIrBokF,GAAYpkF,IAAOC,IAAV,0IAQFsrL,GAUR,SAAC,GAUC,IAAD,EATF3jL,EASE,EATFA,QACAojL,EAQE,EARFA,qBACApuK,EAOE,EAPFA,WACAusK,EAME,EANFA,kBACApyJ,EAKE,EALFA,oBACAs7D,EAIE,EAJFA,KACA43F,EAGE,EAHFA,QACAb,EAEE,EAFFA,aACA1hL,EACE,EADFA,UAEMizK,EAAax0K,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAD7C,EASEqjC,aAAqBC,GALrB5lC,EAJF,EAIEA,aACAg4B,EALF,EAKEA,cACA4O,EANF,EAMEA,WACAU,EAPF,EAOEA,SACAR,EARF,EAQEA,YAEEwrI,EAAO7+J,qBAAW8+J,IAClB1pG,EAAgB70C,iBAAuB,MACvCy/J,EAAkBtrK,YAAYgtK,IAAoB1B,gBAExDthK,qBAAU,WACFnyB,IAAiB4lC,GACjBi0J,EAAqB75L,KAE1B,CAACA,EAAc4lC,EAAqBi0J,IAEvC,IAAMj4L,EAAU5B,EAAa4B,QACvBk4L,EAAWnhD,GAAW,QAAS/2I,EAASglC,GACxCmzJ,EAAephD,GACjB,iBACA/2I,EACAglC,GAGJ,OACI,eAACuzJ,GAAD,WACI,cAAC,GAAD,CACIj5F,KAAMA,EACN43F,QAASA,EACTF,uBAAwBnF,IAE5B,eAAC,GAAD,WACI,cAAC,GAAD,CACIz7J,cAAeA,EACf8O,YAAaA,EACb0iJ,WAAYA,EACZz2K,SAAS,2BAEb,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,2BACIzF,MAAO,IACHwsL,GAFR,IAGI/mL,SAAS,gCAHb,yBAOA,cAAC,GAAD,2BACIzF,MAAO,IACHysL,GAFR,IAGIhnL,SAAS,yCAHb,+BAUVwD,GAAakV,EAAWjK,OAAS,EAC/B,cAAC,GAAD,CAAe9O,KAAMsnL,GAArB,SACKh6L,EAAa0B,WAAW8f,OAAS,EAC5B,2BACA,kBAGV,cAAC,GAAD,CAAWtU,IAAK27D,EAAhB,SACI,cAAC,GAAD,CACIF,aA7Kb,GA8KaC,UACIn9C,EAAaA,EAAWjK,OAAS,EAErCR,WAAYyyK,EACZ1qH,cAAezhC,EACfuhC,cAAeA,EACfK,aACc,OAAVz9C,QAAU,IAAVA,OAAA,EAAAA,EAAYjK,QArL7B,GA4KS,SAYI,cAAC,KAAD,CACIqjK,YACIwV,GAFR,SAKK,SAACvV,GACE,OACI,eAAC,GAAD,6BACQA,EAASoV,gBADjB,IAEIhtL,IAAK43K,EAASn/G,SAFlB,UAKQ,cAAC,GAAD,CACIn2D,QAASic,EACTxX,KAAMq+J,EAAKr+J,KACX+jL,kBACIA,EAEJ/wK,WACIn0B,IAAUC,OACLC,MAETilM,aACIA,EAEJllL,SAAS,+BAGhB+xK,EAAShsH,mCCrNxDwhI,GAAoBzrL,IAAOC,IAAV,8IAQjByrL,GAA+B1rL,IAAOC,IAAV,oLAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAI9C6iH,GAAkBznG,IAAOC,IAAV,4BAEf0rL,GAYD,SAAC,GAYC,IAXH51L,EAWE,EAXFA,WACAozL,EAUE,EAVFA,kBACAvhL,EASE,EATFA,QACA6T,EAQE,EARFA,UACAmwK,EAOE,EAPFA,aACAhvK,EAME,EANFA,WACAioK,EAKE,EALFA,mBACAC,EAIE,EAJFA,oBACA+G,EAGE,EAHFA,cACAC,EAEE,EAFFA,qBACAC,EACE,EADFA,sBACE,EACsB5oK,mBAAiB,IADvC,mBACKkvE,EADL,KACW43F,EADX,KAEIxmB,EAAO7+J,qBAAW8+J,IAClB0kB,EAAmBR,KACnBp2L,EAASm5B,eAEToM,EAAoC9Y,mBACtC,iBAAO,CACHprB,WAAY,GACZ6V,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO,CAAC8oC,KAAmBv7C,UACxDL,QAAS,CACLC,MAAO,aACPC,KAAK,GAET4iB,SAAUrkB,EAAOi8G,MACjB96G,OAAQ,EACRD,MA5DW,GA6DXyf,WAAY,EACZS,cAAe,EACfrf,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,aAExB,CAAC/B,EAAOi8G,MAAR,OAAe7lG,QAAf,IAAeA,OAAf,EAAeA,EAASrU,YAGtBuyB,EAAe91B,uBAAY,SAACiqD,GAC9BmuI,EAAiBnuI,EAAM5E,OAAOxvC,MAAO,iBACtC,CAACuiL,IAWJ,OATA9kK,qBAAU,WACD+uE,GAAiB,cAATA,GACTu5F,EAAa70J,GAEZs7D,GAAiB,eAATA,GACTw5F,EAAc90J,KAEnB,CAACs7D,EAAMu5F,EAAcC,EAAe90J,IAGnC,eAAC00J,GAAD,WACI,cAACC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,GAAD,CACItzK,WAAYn0B,IAAUC,OAAOS,UAC7BkhB,MAAO9P,GAAcA,EAAW2yC,YAChCne,SAAUzE,EACVryB,KAAK,cACLw2D,YAAY,cACZ/M,IAAK,IACLoc,QAAS,EACTlqC,QAAQ,WACRzJ,SAAU89I,EAAKr+J,OAASi6J,GAAesE,KACvCz/J,SAAS,gCAInBmuF,GAAiB,cAATA,EAaN,cAAC,GAAD,CACIzqF,QAASA,EACTmvB,oBAAqBA,EACrBna,WAAYA,EACZouK,qBAAsBa,EACtB1C,kBAAmBA,EACnBC,aAAc2C,EACd15F,KAAMA,EACN43F,QAASA,EACTviL,UAAWo9K,IArBf,cAAC,GAAD,CACIl9K,QAASA,EACTmvB,oBAAqBA,EACrBtb,UAAWA,EACXuvK,qBAAsBY,EACtBzC,kBAAmBA,EACnBC,aAAc0C,EACdz5F,KAAMA,GAAQ,YACd43F,QAASA,EACTviL,UAAWm9K,QA+DhBmH,GAxCV,SAAC,GAAwE,IAAtE7C,EAAqE,EAArEA,kBAAmB2C,EAAkD,EAAlDA,qBAAsBC,EAA4B,EAA5BA,sBACvCh2L,EAAaujB,YAAYgtK,IAAoB7+K,KAC7CG,EAAU0R,YAAY3R,MACtB8T,EAAYnC,YAAYgtK,IAAoB7qK,UAC5CopK,EAAqBvrK,YAAYgtK,IAAoBzB,mBACrDC,EAAsBxrK,YAAYgtK,IAAoBxB,oBACtDmH,EAAyB1F,KACzB2F,EAAkC52I,aACpC22I,GAEErvK,EAAatD,YAAYgtK,IAAoB1pK,WAC7CuvK,EAA0BzF,KAC1B0F,EAAmC92I,aACrC62I,GAGJ,OACI,cAAC,KAAkBl+G,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,aACbC,MAAO,eAHf,SAMI,cAAC,GAAD,CACIvb,WAAYA,EACZozL,kBAAmBA,EACnBvhL,QAASA,EACT6T,UAAWA,EACXopK,mBAAoBA,EACpBC,oBAAqBA,EACrB8G,aAAcM,EACdtvK,WAAYA,EACZivK,cAAeO,EACfN,qBAAsBA,EACtBC,sBAAuBA,OCxLjCM,GAAuBrsL,IAAOC,IAAV,2KAER,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAOxCkoD,GAAoBptC,IAAOC,IAAV,qHAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCskG,GAAchpF,IAAOC,IAAV,+HAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAE3B,SAAA+b,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aA8BtC0oL,GA3BS,WACpB,IAAM1kL,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtBinF,EAAatC,KAEnB77F,qBAAU,aACF,OAACmX,QAAD,IAACA,OAAD,EAACA,EAASh7B,MAAV,OAAgBmI,QAAhB,IAAgBA,OAAhB,EAAgBA,EAASrU,YACzBkuH,EAAW75G,EAAQrU,aAExB,QAACknC,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAV,OAAcmI,QAAd,IAAcA,OAAd,EAAcA,EAASrU,UAAWkuH,IAErC,IAAM8qE,GAAyB,OAAP9xJ,QAAO,IAAPA,OAAA,EAAAA,EAAS+xJ,mBAAoB,GAErD,OACI,eAACH,GAAD,WACI,cAAC,GAAD,CAAmBlrL,YAAU,oCAA7B,8BAGA,eAAC,GAAD,CACIyC,UAAU,EACVzC,YAAU,qCAFd,UAGSorL,EAHT,WC9CNE,GAAwBzsL,IAAOC,IAAV,qJAQrB+oF,GAAchpF,IAAOC,IAAV,6GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCipD,GAAoBptC,IAAOC,IAAV,qHAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAgB1BszL,GAb2C,SAAC,GAAkB,IAAhBp0D,EAAe,EAAfA,SACzD,OACI,eAAC6oE,GAAD,WACI,cAAC,GAAD,CAAmBtrL,YAAU,kCAA7B,4BAGA,cAAC,GAAD,CAAaA,YAAU,mCAAvB,SACKytI,GAAahrB,S,UCjBxB8oE,GAAuB1sL,IAAOC,IAAV,sdAOF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAClC,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMlC,SAAA+b,GAAK,OAAIA,EAAM4gD,QAChB,SAAA5gD,GAAK,OAAKA,EAAMsrF,OAAS,QAAf,UAA4BtrF,EAAMsmE,IAAlC,SACP,SAAAtmE,GAAK,OAAKA,EAAMsrF,OAAN,UAAkBtrF,EAAMsrF,OAAxB,MAAqC,WAUvDa,GAAkBrsF,IAAOC,IAAV,sIAQf0sL,GAAgB3sL,IAAOC,IAAV,6EAKb2wD,GAAgB5wD,IAAOC,IAAV,6MAON,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAMnC2rE,GAAUvwD,IAAOC,IAAV,iEAKP2sL,GAAO5sL,IAAOC,IAAV,2EAKJ4sL,GAAgB7sL,YAAO4sL,GAAP5sL,CAAH,+CACN,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAGnCgmM,GAAe9sL,YAAO4sL,GAAP5sL,CAAH,+CACL,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAGnCgwC,GAAQt0B,IAAOC,IAAV,sHAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCsgH,GAAc1lG,IAAOC,IAAV,+FAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC2nM,GAAiB/sL,IAAOC,IAAV,wLAII,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAI9CooM,GAAYhtL,IAAOC,IAAV,oGAMTgtL,GAAkBjtL,IAAOC,IAAV,+FAGR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC8nM,GAAoBltL,YAAOgtL,GAAPhtL,CAAH,+CACV,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC0oM,GAAentL,YAAOgtL,GAAPhtL,CAAH,+CACL,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eA2G1B8oM,GApGV,SAAC,GAAqC,IAAD,IAAlCh6K,EAAkC,EAAlCA,KAAMspD,EAA4B,EAA5BA,SAAUx6D,EAAkB,EAAlBA,YACd2oD,EAAmB9V,eACnBs4I,EAAUloK,iBAAY,MAFU,EAGIhC,mBAIvC,CACCqjD,IAAK9J,EAAS59D,EAAI,IAClBgiD,KAAM4b,EAAS79D,EAAI,IACnB2sF,YAAQz6F,IAV0B,mBAG/Bu8L,EAH+B,KAGhBC,EAHgB,KAahCxH,EAAa3yK,EAAKpY,OAASklL,GAAsBz5K,SACjD9F,EAAUolL,EAAa3yK,EAAKy9B,SAAWz9B,EAAKu+B,UAE5C67I,EAAYx9L,uBAAY,SAACgnL,GAC3B,OAAKA,EAAKnV,SAASlvJ,QAAWozK,EAIvB/O,EAAKnV,SACPxqJ,QAAO,SAACu0J,EAAU6hB,GAKf,OAJA7hB,EACI6hB,EAAQrlG,OADZ,qCAEkCwjF,EAAI6hB,EAAQrlG,QAC9CwjF,EAAI6hB,EAAQplG,KAAZ,UAAsBujF,EAAI6hB,EAAQplG,KAAlC,WACOujF,IACRoL,EAAKz8K,KAAKsiD,MAAM,KAClB3pD,KAAK,IAXC8jL,EAAKz8K,OAYjB,CAACwrL,IAoBJ,OAlBAziK,qBAAU,WACN,GAAI+pK,EAAQt9J,QAAS,CACjB,IAAM29J,EAAeL,EAAQt9J,QAAQo7D,wBAC/BK,EACF9uB,EAAS59D,EAAI4uL,EAAahvL,OAASmsD,EAAiBnsD,OAC9C,SACA3N,EACJy1E,EAAM9J,EAAS59D,EAAI,IACnBgiD,EAAO4b,EAAS79D,EAAI,IAE1B0uL,EAAiB,CACb/mH,IAAKA,EACL1lB,KAAMA,EACN0qC,OAAQA,OAGjB,CAAC9uB,EAAS79D,EAAG69D,EAAS59D,EAAG+rD,EAAiBnsD,SAExC4uL,EAAc9mH,KAAQ8mH,EAAcxsI,KAIrC,cAAC4rI,GAAD,CACIlmH,IAAK8mH,EAAc9mH,IACnB1lB,KAAMwsI,EAAcxsI,KACpB0qC,OAAQ8hG,EAAc9hG,OACtBntF,IAAKgvL,EAJT,SAMI,eAAC,GAAD,WACI,cAAC,GAAD,CAAejpL,QAASlC,EAAxB,SACI,cAACmyD,GAAA,EAAD,MAEJ,eAACs4H,GAAD,WACM5G,EAKE,cAAC+G,GAAD,UACK/I,GAAyB3wK,EAAKpY,QALnC,cAAC6xL,GAAD,UACK9I,GAAyB3wK,EAAKpY,QAOvC,cAAC,GAAD,iBAAQ2F,QAAR,IAAQA,OAAR,EAAQA,EAASwD,QACjB,cAAC,GAAD,iBAAcxD,QAAd,IAAcA,OAAd,EAAcA,EAAS+nC,iBAE3B,cAAC,GAAD,iBACK/nC,QADL,IACKA,GADL,UACKA,EAAS49J,cADd,iBACK,EAAiBtsK,aADtB,aACK,EAAwBgP,KAAI,SAAC+1K,GAC1B,OACI,eAAC+V,GAAD,WACK/V,EAAKxU,UAAYnE,GAAkBoE,SAChC,cAACyqB,GAAD,uBAIA,cAACC,GAAD,kBAEJ,cAACF,GAAD,CACItjB,wBAAyB,CAAEC,OAAQ4jB,EAAUxW,QAThCA,EAAKv3K,cA7BvC,yBClKTkuL,GAAwB3tL,IAAOC,IAAV,0OAIT,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMtB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAG9CgpM,GAAsB5tL,IAAOC,IAAV,qIAOnBouK,GAAmBruK,IAAOC,IAAV,iJACT,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAGnB,SAAAyb,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAEpC,SAAA1D,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAO8C,WAI/B6mM,GAAc7tL,IAAOC,IAAV,iEAKX6tL,GAAa9tL,IAAOC,IAAV,4FAGH,SAAAC,GAAK,OAAIA,EAAM8C,SAGtB+qL,GAAkB/tL,IAAOC,IAAV,kJAGR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnC4oM,GAAoBhuL,IAAOC,IAAV,kDAIjBguL,GAAqBjuL,IAAOC,IAAV,uHAGX,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAInCypM,GAAgBluL,IAAOC,IAAV,yMAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAGxB,SAAA4b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsD,aAG5B,SAAA0Y,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqD,eAIvC4mM,GAAiBnuL,IAAOC,IAAV,0FAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAGxCwpM,GAAcpuL,IAAOC,IAAV,kIAOXouL,GAAYruL,IAAOC,IAAV,qHAGF,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAI3B6pM,GAActuL,IAAOC,IAAV,kIAOXsuL,GAAYvuL,IAAOC,IAAV,6FAGF,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAG3BopM,GAAoBxuL,IAAOC,IAAV,sSAKV,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aAInB,SAAAyb,GAAK,OAAKA,EAAM0D,SAAW,OAAS,aAG/B,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,EAAI,MAoKnC6qL,GAvJV,SAAC,GASC,IAAD,QARFr7K,EAQE,EARFA,KACA6iK,EAOE,EAPFA,SACAC,EAME,EANFA,SACAwY,EAKE,EALFA,SACA9qL,EAIE,EAJFA,SACA+qL,EAGE,EAHFA,YACAC,EAEE,EAFFA,eACA1qL,EACE,EADFA,SAEM2qL,EAA6BxH,KAC7ByH,EAA6BvH,KAC7BxB,EAAa3yK,EAAKpY,OAASklL,GAAsBz5K,SACjDklE,EAASo6G,EAAa3yK,EAAKy9B,SAAUpxC,GAAK2T,EAAKu+B,UAAWlyC,GAC1DkB,EAAUolL,EAAa3yK,EAAKy9B,SAAWz9B,EAAKu+B,UAC5Co9I,EAAU5pK,iBAAY,MAN1B,EAO8BhC,mBAAS,CAAErkB,EAAG,EAAGD,EAAG,IAPlD,mBAOK69D,EAPL,KAOegvB,EAPf,KASFpoE,qBAAU,WACN,GAAIyrK,GAAWA,EAAQh/J,QAAS,CAC5B,IAAMi/J,EAAgBD,EAAQh/J,QAAQo7D,wBACtCO,EAAY,CAAE5sF,EAAGkwL,EAAclwL,EAAGD,EAAGmwL,EAAcnwL,OAExD,CAAC6sF,EAAawqF,EAAS6S,aAE1B,ItBtKsC/tL,EsBsKhCi0L,GAA0BlJ,KACzB3yK,EAAKixK,cAAgBjxK,EAAKixK,aAAe,GAE1C6K,EAAc,UAAMhrL,EAAN,sBAAkBkP,EAAKpY,YAAvB,aAAkB,EAAWsL,eAEjD,OACI,eAACqnL,GAAD,wCACI1X,SAAUA,EACV53K,IAAK43K,EAASn/G,UACVm/G,EAASI,gBACTJ,EAASK,iBAJjB,IAKI1yK,SAAUA,EACVmlL,WAAY7S,EAAS6S,WACrBoG,YAAa,WACTP,EAAe,OARvB,UAWI,eAACf,GAAD,CACIxvL,IAAK0wL,EACLxF,cAAe,kBACV3lL,GAAY8qL,EAAQ,OAACt7K,QAAD,IAACA,OAAD,EAACA,EAAMg8K,SAAWh8K,EAAKpY,OAHpD,UAMI,cAAC8yL,GAAD,CACI9qL,OtB9LsBhI,EsB8LWoY,EAAKpY,KtB5LjDA,GAAQgpL,GAA2BhpL,IAAU/W,IAAUC,OAAOE,UsB6LnD+c,YAAA,UAAc+tL,EAAd,UAFJ,SAIKnL,GAAyB3wK,EAAKpY,QAEnC,cAAC+yL,GAAD,CAAiB5sL,YAAA,UAAc+tL,EAAd,UAAjB,gBACKvuL,QADL,IACKA,OADL,EACKA,EAASwD,QAEd,eAAC6pL,GAAD,WACKjI,GACG,cAACkI,GAAD,CACI9sL,YAAA,UAAc+tL,EAAd,aADJ,UAGK,UAAA97K,EAAKy9B,gBAAL,mBAAe0tH,cAAf,eAAuBC,eAClB5vB,GAAY,OACVjuI,QADU,IACVA,GADU,UACVA,EAAS49J,cADC,aACV,EAAiBC,eAEnB,MAGd,cAAC0vB,GAAD,CACI9pL,QAAS,SAAAihB,GACLA,EAAEC,kBACFD,EAAEkmJ,iBACFqjB,EAAejjH,IAEnBxqE,YAAA,UAAc+tL,EAAd,YANJ,2BAYPnJ,GACG,qCACI,cAACoI,GAAD,IACA,eAACC,GAAD,WACI,cAACC,GAAD,CACIzqL,SAAUA,EACVzC,YAAA,UAAc+tL,EAAd,mBAFJ,0BAMA,eAACZ,GAAD,WACI,cAACE,GAAD,CACI5qL,SAAUqrL,GAA2BrrL,EACrCQ,QAAS,kBACLunE,IACCsjH,IACArrL,GACDkrL,EAA2BnjH,IAE/BxqE,YAAA,UAAc+tL,EAAd,mBARJ,eAYA,cAACX,GAAD,CACI3qL,SAAUA,EACVzC,YAAA,UAAc+tL,EAAd,mBAFJ,SAIK97K,EAAKixK,eAEV,cAACmK,GAAD,CACI5qL,SAAUA,EACVQ,QAAS,kBACLunE,IACC/nE,GACDirL,EAA2BljH,IAE/BxqE,YAAA,UAAc+tL,EAAd,kBAPJ,wBAehB,cAACf,GAAD,IACA,cAACP,GAAD,UACI,cAAC,GAAD,CACIxpL,QAAS,YACJR,GAAY8qL,EAAQ,OAACt7K,QAAD,IAACA,OAAD,EAACA,EAAMg8K,SAAWh8K,EAAKpY,OAEhD4I,SAAUA,EACVzC,YAAA,UAAc+tL,EAAd,WALJ,SAOI,cAAChqH,GAAA,EAAD,QAGR,cAACpqB,GAAA,EAAD,CACI36C,KAAMwuL,IAAgBhjH,EACtB5wB,WAAY6zI,EAFhB,SAII,cAAC,GAAD,CACIx7K,KAAMA,EACNspD,SAAUA,EACVx6D,YAAa,kBAAM0sL,EAAe,gBCnThDnC,GAAwBzsL,IAAOC,IAAV,qJAQrB+oF,GAAchpF,IAAOC,IAAV,6GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCipD,GAAoBptC,IAAOC,IAAV,qHAIV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAgB1B2qM,GAboC,SAAC,GAAc,IAAZC,EAAW,EAAXA,KAClD,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAmBnuL,YAAU,8BAA7B,8BAGA,cAAC,GAAD,CAAaA,YAAU,+BAAvB,SACKmuL,GAAc,QCPhBC,GAtBUnxL,sBACrB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIU,SAAS,UACTD,KAAK,eACLE,EAAE,g3BCIhBiwL,GAAuBxvL,IAAOC,IAAV,sKASpBwvL,GAAiBzvL,IAAOC,IAAV,yHAOd43K,GAAiB73K,IAAOC,IAAV,0LAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAOxCuqM,GAAc1vL,IAAOC,IAAV,uFAMXguJ,GAAuBjuJ,YAAOihE,KAAPjhE,CAAH,wTAQJ,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAS5C+qM,GAAwB3vL,IAAOC,IAAV,+DAKrB2vL,GAAoB5vL,IAAOC,IAAV,qMAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO0B,YAKnCiqM,GAAe7vL,IAAOC,IAAV,8GAIL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCorM,GAAiB9vL,IAAOC,IAAV,iHAIP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCqrM,GAAe/vL,IAAOC,IAAV,yIAKL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCsrM,GAA2BhwL,IAAOC,IAAV,4BAuBxBipL,IArByBlpL,YAAO,QAAPA,CAAH,qDA4BvB,SAAC,GAAqD,IAAnDW,EAAkD,EAAlDA,QAASsvL,EAAyC,EAAzCA,oBAAqBrsL,EAAoB,EAApBA,SAAoB,EAChBuf,mBAAc,MADE,mBAC/CwrK,EAD+C,KAClCC,EADkC,KAGtD,OAAOjuL,EAAQM,KAAI,SAACmS,EAAyBlS,GAA1B,OACf,cAAC,KAAD,CAEIk1K,YAAW,UAAK8Z,GAAL,mBAAoC98K,QAApC,IAAoCA,OAApC,EAAoCA,EAAMg8K,UACrDluL,MAAOA,EACPooL,eAAgB1lL,EAJpB,SAMK,SAACqyK,EAAeC,GACb,OACI,cAAC,GAAD,CACI9iK,KAAMA,EACN6iK,SAAUA,EACVC,SAAUA,EACVtyK,SAAUA,EACV8qL,SAAUuB,EACVtB,YAAaA,EACbC,eAAgBA,EAChB1qL,SAAS,0BAhBzB,OACSkP,QADT,IACSA,OADT,EACSA,EAAMg8K,eAuBjBe,GAAsD,SAAC,GAKtD,IAJHhH,EAIE,EAJFA,kBACApzL,EAGE,EAHFA,WACAk6L,EAEE,EAFFA,oBAGMxsB,GADJ,EADF2kB,iBAEaxjL,qBAAW8+J,KAGlB0sB,EAAgBr6L,EAAW4K,QAC5BwS,QACG,SAACC,GAAD,OACIA,EAAKpY,OAASklL,GAAsBz5K,YAE3C4Q,QAAO,SAACspF,EAAW0vF,GAChB,OAAO1vF,EAAO0vF,EAAIhM,eACnB,GAEP,OACI,cAACmL,GAAD,UACI,eAACC,GAAD,WACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAiB7rE,SAAU7tH,EAAWyoK,gBACtC,cAAC,GAAD,CAAc8wB,KAAMc,IACpB,cAAC,GAAD,OAIJ,cAACV,GAAD,UACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI1Z,YACImT,GACAA,EAAkBx2K,OAAS,EACrB,aACAu9K,GALd,SAQK,SAACja,GACE,OACIkT,GACAA,EAAkBx2K,OAAS,EAGvB,eAACg9K,GAAD,2BACItxL,IAAK43K,EAASn/G,UACVm/G,EAASoV,gBAFjB,cAII,cAAC2E,GAAD,UACI,eAACJ,GAAD,WACI,cAACC,GAAD,CAAc1uL,YAAU,6BAAxB,SACI,cAAC,GAAD,MAEJ,cAAC2uL,GAAD,CAAgB3uL,YAAU,6BAA1B,wBAGA,cAAC4uL,GAAD,CAAc5uL,YAAU,oCAAxB,+FAQP80K,EAAShsH,gBAKlB,eAAC0lI,GAAD,6BACQ1Z,EAASoV,gBADjB,IAEIhtL,IAAK43K,EAASn/G,SAFlB,UAII,cAAC,GAAD,CACIn2D,QAASwoL,EACTvlL,SACI6/J,EAAKr+J,OACLi6J,GAAesE,KAEnBssB,oBACIA,IAGPha,EAAShsH,6BA+BnCqmI,GAbV,SAAC,GAAgD,IAA9CnH,EAA6C,EAA7CA,kBAAmB8G,EAA0B,EAA1BA,oBACjBl6L,EAAaujB,YAAYgtK,IAAoB7+K,KAC7C2gL,EAAmBR,KACzB,OACI,cAAC,GAAD,CACIqI,oBAAqBA,EACrB9G,kBAAmBA,EACnBpzL,WAAYA,EACZqyL,iBAAkBA,KCpQjB8H,GAA8B,8BAC9B9E,GACT,oCACSI,GACT,sCACSnC,GAA2B,2BAElC94H,GAKD,SAAC,GAKC,IAJHggI,EAIE,EAJFA,aACAC,EAGE,EAHFA,cACArH,EAEE,EAFFA,kBACAsH,EACE,EADFA,2BACE,EAEEttK,mBAA8BgmK,GAFhC,mBACKxoL,EADL,KACc+vL,EADd,KAIIC,EAAcxrK,iBAAO,GAE3B7B,qBAAU,WACNotK,EAAWvH,KACZ,CAACA,IAEJ,IAAMyH,EAAmB5gM,uBAAY,SAACkP,GAClC,IAAM2xL,EAAkB3xL,EAAO+B,KAAI,SAACmS,EAAMlS,GAAP,oBAAC,gBAC7BkS,GAD4B,IAE/BspD,SAAUx7D,OAEdwvL,EAAWG,GACXJ,EAA2BI,KAC5B,CAACJ,IAEEK,EAAiB9gM,uBAAY,SAAC+8K,EAAoBC,GACpD,IAAM9tK,EAAS6B,MAAMyU,KAAK7U,GAD+C,EAEvDzB,EAAOgwG,OAAO69D,EAAY,GAArC8I,EAFkE,oBAGzE32K,EAAOgwG,OAAO89D,EAAU,EAAG6I,GAC3B+a,EAAiB1xL,KAClB,CAAC0xL,EAAkBjwL,IAEhBowL,EAA0B/gM,uBAAY,SAAC+8K,EAAoBC,GAAsB,IAAD,IAC5EgkB,EAAgBT,EAAaxjB,GAE/B4jB,EAAY5gK,UAAYi9I,GACxB2jB,EAAY5gK,UAGhB,IAAMkhK,EAAe,CACjBxxL,GAAE,iBAAEuxL,QAAF,IAAEA,OAAF,EAAEA,EAAevxL,UAAjB,QAAuB,EACzB2vL,SAAQ,iBAAE4B,QAAF,IAAEA,OAAF,EAAEA,EAAe5B,gBAAjB,QAA6B,GACrCp0L,KAAMklL,GAAsBz5K,SAC5Bi2D,SAAUswG,EACVqX,aAAc,EACdxzI,SAAUmgJ,GAGR9xL,EAAS6B,MAAMyU,KAAK7U,GAE1BzB,EAAOgwG,OAAO89D,EAAU,EAAGikB,GAC3BL,EAAiB1xL,KAClB,CAACqxL,EAAc5vL,EAASiwL,IAErBM,EAAgClhM,uBAAY,SAC9CqG,GACE,IAAD,IAED,GAAKA,EAAL,CACA,IAAM6I,EAAS6B,MAAMyU,KAAK7U,GAEpBqwL,EAAgBT,EAAap9K,QAC/B,SAAAC,GAAI,OAAIA,EAAK3T,KAAOpJ,KACtB,GAEI46L,EAAe,CACjBxxL,GAAE,iBAAEuxL,QAAF,IAAEA,OAAF,EAAEA,EAAevxL,UAAjB,QAAuB,EACzB2vL,SAAQ,iBAAE4B,QAAF,IAAEA,OAAF,EAAEA,EAAe5B,gBAAjB,QAA6B,GACrCp0L,KAAMklL,GAAsBz5K,SAC5B49K,aAAc,EACdxzI,SAAUmgJ,EACVt0H,SAAUi0H,EAAY5gK,SAG1B4gK,EAAY5gK,UACZ7wB,EAAOgwG,OAAOvuG,EAAQgS,OAAQ,EAAGs+K,GACjCL,EAAiB1xL,MAClB,CAACqxL,EAAc5vL,EAASiwL,IAErBO,EAAiCnhM,uBAAY,SAC/CiB,GACE,IAAD,IACD,GAAKA,EAAL,CAEA,IAAMmgM,EAAiBZ,EAAcr9K,QACjC,SAAAC,GAAI,OAAIA,EAAK3T,KAAOxO,KACtB,GAEIggM,EAAe,CACjBxxL,GAAE,iBAAE2xL,QAAF,IAAEA,OAAF,EAAEA,EAAgB3xL,UAAlB,QAAwB,EAC1B2vL,SAAQ,iBAAEgC,QAAF,IAAEA,OAAF,EAAEA,EAAgBhC,gBAAlB,QAA8B,GACtCp0L,KAAMklL,GAAsBx5K,UAC5B29K,aAAc,EACd1yI,UAAWy/I,EACX10H,SAAUi0H,EAAY5gK,SAG1B4gK,EAAY5gK,UACZ,IAAM7wB,EAAS6B,MAAMyU,KAAK7U,GAC1BzB,EAAOgwG,OAAOvuG,EAAQgS,OAAQ,EAAGs+K,GACjCL,EAAiB1xL,MAClB,CAACsxL,EAAe7vL,EAASiwL,IAEtBS,EAA2BrhM,uBAAY,SAAC+8K,EAAoBC,GAAsB,IAAD,IAC/E2jB,EAAY5gK,UAAYi9I,GACxB2jB,EAAY5gK,UAGhB,IAAM7wB,EAAS6B,MAAMyU,KAAK7U,GACpBywL,EAAiBZ,EAAczjB,GAC/BkkB,EAAe,CACjBxxL,GAAE,iBAAE2xL,QAAF,IAAEA,OAAF,EAAEA,EAAgB3xL,UAAlB,QAAwB,EAC1B2vL,SAAQ,iBAAEgC,QAAF,IAAEA,OAAF,EAAEA,EAAgBhC,gBAAlB,QAA8B,GACtCp0L,KAAMklL,GAAsBx5K,UAC5B29K,aAAc,EACd1yI,UAAWy/I,EACX10H,SAAUswG,GAGd9tK,EAAOgwG,OAAO89D,EAAU,EAAGikB,GAC3BL,EAAiB1xL,KAClB,CAACsxL,EAAe7vL,EAASiwL,IAEtBU,EAAuBthM,uBAAY,SAAC+8K,GACtC,IAAM7tK,EAAS6B,MAAMyU,KAAK7U,GAC1BzB,EAAOgwG,OAAOhwG,EAAOsY,QAAQtY,EAAO6tK,IAAc,GAClD6jB,EAAiB1xL,KAClB,CAACyB,EAASiwL,IAEPW,EAAyBvhM,uBAAY,SACvCo/L,EACAp0L,GAEA,IAAMkE,EAAS6B,MAAMyU,KAAK7U,GAASwS,QAAO,SAAAxS,GACtC,QAASA,EAAQyuL,WAAaA,GAAYzuL,EAAQ3F,OAASA,MAE/D41L,EAAiB1xL,KAClB,CAACyB,EAASiwL,IAEPjb,EAAY3lL,uBAAY,SAACkP,GACtBA,EAAO02K,cAKR12K,EAAO02K,YAAYI,cAAgBka,IACnChxL,EAAO62K,OAAOC,cAAgB92K,EAAO02K,YAAYI,aAEjD8a,EAAe5xL,EAAO62K,OAAO70K,MAAOhC,EAAO02K,YAAY10K,OAItDhC,EAAO02K,YAAYI,cAAgBka,IACG,eAAnChxL,EAAO02K,YAAYI,aACvB92K,EAAO62K,OAAOC,cAAgBoV,IAE9B2F,EACI7xL,EAAO62K,OAAO70K,MACdhC,EAAO02K,YAAY10K,OAKvBhC,EAAO02K,YAAYI,cACfoV,IACJlsL,EAAO62K,OAAOC,cAAgB92K,EAAO02K,YAAYI,aAEjDsb,EAAqBpyL,EAAO62K,OAAO70K,OAIlChC,EAAO02K,YAAYI,cAAgBka,IACG,eAAnChxL,EAAO02K,YAAYI,aACvB92K,EAAO62K,OAAOC,cAAgBwV,IAE9B6F,EACInyL,EAAO62K,OAAO70K,MACdhC,EAAO02K,YAAY10K,OAKvBhC,EAAO02K,YAAYI,cACfwV,IACJtsL,EAAO62K,OAAOC,cAAgB92K,EAAO02K,YAAYI,aAEjDsb,EAAqBpyL,EAAO62K,OAAO70K,UAExC,CAACmwL,EAA0BN,EAAyBD,EAAgBQ,IAEvE,OACI,eAAC,KAAD,CAAiB3b,UAAWA,EAA5B,UACI,cAAC,GAAD,CACIwT,kBAAmBxoL,EACnBmrL,qBAAsBoF,EACtBnF,sBAAuBoF,IAE3B,cAAC,GAAD,CACIhI,kBAAmBxoL,EACnBsvL,oBAAqBsB,QA0BtBC,GApBqB,WAChC,IAAMrI,EAAoB7vK,YAAYgtK,IAAoB7+K,KAAK9G,QACzD4vL,EAAej3K,YAAYgtK,IAAoB7qK,UAC/C+0K,EAAgBl3K,YAAYgtK,IAAoB1pK,WAChD60K,EAAuBtK,KACvBnlF,EAAOjiF,EAAQ,KAErB,OACI,cAAC,GAAD,CACIopK,kBAAmBA,EAAkBloL,KAAI,SAAAmS,GAAI,oCACtCA,GADsC,IAEzCg8K,SAAUptF,SAEduuF,aAAcA,EACdC,cAAeA,EACfC,2BAA4BgB,KChPlCzY,GAA6Bh5K,IAAOC,IAAV,4IAQ1ByxL,GAAgB1xL,IAAOC,IAAV,uFAgBJg5K,GAViB,WAC5B,OACI,cAAC,GAAD,UACI,cAACyY,GAAD,UACI,cAAC,GAAD,SCrBVvwH,GAAQnhE,IAAOC,IAAV,0TAEA,SAAAC,GAAK,OAAKA,EAAM8iK,QAAU,QAAU,OAG9B,SAAA9iK,GAAK,OAAKA,EAAM8iK,QAAU,OAAS,UAMvC,SAAA9iK,GAAK,OACVA,EAAM8C,MAAQ9C,EAAM8C,MAAQ9C,EAAMI,MAAMpc,OAAOO,aAI1C28E,GAOR,SAAC,GAA8D,IAA5D19D,EAA2D,EAA3DA,SAAUD,EAAiD,EAAjDA,MAAOu/J,EAA0C,EAA1CA,QAAShgK,EAAiC,EAAjCA,MAAO1E,EAA0B,EAA1BA,UAAW4F,EAAe,EAAfA,SAChD,OACI,cAAC,GAAD,CAAO8+J,QAASA,EAAShgK,MAAOA,EAAO1E,UAAWA,EAAW6C,YAAW+C,EAAxE,SACKR,GAAYD,KCzBnB49D,GAAWrhE,YAAO8sC,KAAO7sC,IAAdD,CAAH,8TAKI,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAElC,SAAA+b,GAAK,MAA2B,SAAtBA,EAAM2gD,YAAyB,OAAS,OACjD,SAAA3gD,GAAK,MAA2B,SAAtBA,EAAM2gD,YAAyB,OAAS,OACnD,SAAA3gD,GAAK,MAA2B,QAAtBA,EAAM2gD,YAAwB,QAAU,SAC/C,SAAA3gD,GAAK,MAA2B,QAAtBA,EAAM2gD,YAAwB,OAAS,WAO1D+gB,GAAc5hE,IAAOC,IAAV,iGAQJ4hE,GAGR,SAAC,GAA+B,IAA7Bn+D,EAA4B,EAA5BA,SAAUm9C,EAAkB,EAAlBA,YACd,OACI,cAAC,GAAD,CACIrS,QAAS,CAAEC,MAAO,IAClBC,QAAS,CAAED,MAAO,GAClBqzB,KAAM,CAAErzB,MAAO,GACfoS,YAAaA,EAJjB,SAMI,cAAC,GAAD,CAAaviD,UAAU,eAAvB,SAAuCoF,OCrC7C29D,GAAWrhE,IAAOC,IAAV,yXAED,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SASvB,SAAA8a,GAAK,OACfA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAOqC,SACnB2Z,EAAMI,MAAMpc,OAAOC,SAEX,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAOrCg7E,GAUR,SAAC,GAUC,IATH79D,EASE,EATFA,SACAU,EAQE,EARFA,QACAyB,EAOE,EAPFA,MACApS,EAME,EANFA,KACA+tE,EAKE,EALFA,WACAntD,EAIE,EAJFA,SACAotD,EAGE,EAHFA,aACAC,EAEE,EAFFA,YACAx9D,EACE,EADFA,SAOA,OACI,cAAC,GAAD,CACIE,QAPiB,WACrBA,EAAQ,CAAEixC,OAAQ,CAAExvC,MAAOA,EAAOpS,KAAMA,KACnCiuE,GAAaF,KAMdntD,SAAUA,EACVhW,IAAKojE,EACLnjE,UAAW+V,EAAW,qBAAkBtjB,EACxCoQ,YAAW+C,EALf,SAOKR,KCzDPq+D,GAAe/hE,IAAOC,IAAV,qQAOH,SAAAC,GAAK,OACVA,EAAMkvB,QACFlvB,EAAMkvB,QADZ,UAESlvB,EAAMxB,OAASwB,EAAMxB,OAAS,EAAI,EAAI,GAF/C,kCAKS,SAAAwB,GAAK,OAAOA,EAAMyC,SAAWzC,EAAMyC,SAAW,UAQzDq/D,GAAoBhiE,IAAOC,IAAV,6HAKV,SAAAC,GAAK,aAAIA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOQ,WAApC,UAAkDwb,EAAM8C,aAAxD,QAAiE9C,EAAMI,MAAMpc,OAAOO,aAK7Fw9E,GAYR,SAAC,GAA8F,IAA5Fp8D,EAA2F,EAA3FA,MAAOq8D,EAAoF,EAApFA,aAAcxjE,EAAsE,EAAtEA,OAAQ0wB,EAA8D,EAA9DA,QAASzsB,EAAqD,EAArDA,SAAUiB,EAA2C,EAA3CA,SAAUZ,EAAiC,EAAjCA,MAAO1E,EAA0B,EAA1BA,UAAW4F,EAAe,EAAfA,SAChF,OACI,cAAC69D,GAAD,CACIrjE,OAAQA,EACR0F,QAAS89D,EACT9yC,QAASA,EACTzsB,SAAUA,EACVrE,UAAWA,EACX6C,YAAW+C,EANf,SAQI,cAAC89D,GAAD,CAAmBh/D,MAAOA,EAAOY,SAAUA,EAA3C,SAAsDiC,OC7C5D1D,GAAc,CAChBE,MAAO,CACH+V,WAAYn0B,IAAUC,OAAOS,UAC7Bqe,MAAO/e,IAAUC,OAAOkB,OAE5BF,KAAM,CACFkzB,WAAYn0B,IAAUC,OAAOiB,QAC7B6d,MAAO/e,IAAUC,OAAOqC,UAE5Bic,KAAM,CACF4V,WAAYn0B,IAAUC,OAAOqC,SAC7Byc,MAAO/e,IAAUC,OAAOkB,OAE5BC,YAAa,CACT+yB,WAAYn0B,IAAUC,OAAOmB,YAC7B2d,MAAO/e,IAAUC,OAAOkB,QAI1Bu7D,GAAmB3gD,IAAOC,IAAV,4WAUD,SAAAC,GAAK,OAAKA,EAAM2C,aAAe3C,EAAM2C,aAAe,KAC3D,SAAA3C,GAAK,OAAKA,EAAM6lB,OAAS,EAAI,KACjC,SAAA7lB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGxB,SAAAwb,GAAK,OAAKA,EAAMxB,OAAN,UAAkBwB,EAAMxB,OAAxB,MAAqC,UAE3C,SAAAwB,GAAK,OAAIiC,GAAOjC,EAAMW,SAASuX,cACpC,SAAAlY,GAAK,OAAIiC,GAAOjC,EAAMW,SAASmC,SACd,SAAA9C,GAAK,OAAKA,EAAMN,MAAQ,MAAQ,UACpD,SAAAM,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SAGhC,gBAAG8c,EAAH,EAAGA,SAAUtD,EAAb,EAAaA,MAAb,OAAyBsD,GAAY+jB,YAAJ,gFACtBrnB,EAAMpc,OAAOQ,eAKxB6hC,GAAYvmB,YAAO86C,KAAP96C,CAAH,uDAIT4hD,GAAa5hD,IAAOC,IAAV,4KASH,SAAAC,GAAK,OAAIA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOQ,WAAawb,EAAMI,MAAMpc,OAAOO,aA+J3EktM,GAtIV,SAAC,GAmBC,IAlBHluL,EAkBE,EAlBFA,MACAwmD,EAiBE,EAjBFA,YACAmY,EAgBE,EAhBFA,WACAlwD,EAeE,EAfFA,MACArM,EAcE,EAdFA,MACA0kB,EAaE,EAbFA,SACA92B,EAYE,EAZFA,KACAgyB,EAWE,EAXFA,WACAmsK,EAUE,EAVFA,WACAjwH,EASE,EATFA,aACAjjE,EAQE,EARFA,OACAiE,EAOE,EAPFA,SACAiB,EAME,EANFA,SACAtF,EAKE,EALFA,UACAsB,EAIE,EAJFA,MACAiD,EAGE,EAHFA,aACAgvL,EAEE,EAFFA,eACA3tL,EACE,EADFA,SACE,EACsBif,oBAAS,GAD/B,mBACKC,EADL,KACWC,EADX,KAEIk/C,EAAcp9C,iBAAO,MACrBu8C,EAAc3gE,MAAMC,QAAQ6E,GAyB5B28D,EAvBkB,WACpB,GAAItwD,EAAO,CACP,IAAIgD,EAAgBhD,EAAMiB,QAAO,SAAAC,GAAI,OACjCrS,MAAMC,QAAQ6E,GACRA,EAAM6L,SAAS0B,EAAKvN,OACpBuN,EAAKvN,QAAUA,KAGzB,OAAIqP,EAAcvC,OAAS,EAChBuC,EAAc,IAAMA,EAAc,GAAGzhB,KAGxCyhB,GACAA,EACKjU,KAAI,SAAAmS,GACD,OAAOA,EAAK3f,QAEfP,KAAK,OAMLuvE,GAErB,OACI,eAAC,GAAD,CACI5hE,QAAS4kB,GAA0B,QACnC7lB,MAAOA,EACPlB,OAAQA,EACRJ,UAAWA,GAAS,UAAOA,EAAP,YAAoB8kB,EAAI,UAAM9kB,EAAN,SAAyB,IACrEuE,aAAcA,EACdkjB,QAAS3C,KAAUvd,KAAWjC,EAC9BA,SAAUA,EAPd,UASKH,GACG,cAAC,GAAD,CACIu/J,QAASjiK,MAAMC,QAAQ6E,GAASA,EAAM8M,OAAS,IAAM9M,EACrDpC,MAAOA,EACPT,MAAOo/D,EACP9jE,UAAWA,GAAS,UAAOA,EAAP,UACpB4F,SAAUA,GAAQ,UAAOA,EAAP,YAGzB+lD,IAAgBpkD,GACb,cAAC,GAAD,CACIpC,MAAOwmD,EACPjnD,MAAOo/D,EACP9jE,UAAWA,GAAS,UAAOA,EAAP,UACpB4F,SAAUA,GAAQ,UAAOA,EAAP,YAG1B,cAAC,GAAD,CACIN,SAAUA,EACVtF,UAAWA,GAAS,UAAOA,EAAP,UACpB8F,QAAS,kBAAOR,GAAYyf,GAASD,IAHzC,SAKKA,EAAO,cAACq8B,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,MAE1B,cAAC,GAAD,CACI35C,OAAqB,OAAdgsL,QAAc,IAAdA,OAAA,EAAAA,EAAiB,CAACp+L,KAAM+uE,EAAc38D,MAAOA,MAAqB28D,EACzEN,aAAc,kBAAOt+D,GAAYyf,GAASD,IAC1C1kB,OAAQA,EACRiE,SAAUA,EACVysB,QAAU3rB,OAAqB1S,EAAb,WAClB6S,SAAUA,EACVZ,MAAO4uL,EACPtzL,UAAWA,GAAS,UAAOA,EAAP,UACpB4F,SAAUA,GAAQ,UAAOA,EAAP,qBAEtB,cAAC,GAAD,CAAW/D,KAAMijB,EAAM23B,WAAY13B,EAAnC,SACI,cAAC,GAAD,CACIw9B,YAAa8gB,EADjB,SAGKzvD,GACGA,EAAMjR,KAAI,SAACmS,GAAD,OACN,cAAC,GAAD,CACIquD,cAEQ1gE,MAAMC,QAAQ6E,GACRA,EAAM6L,SACF0B,EAAKvN,OAETuN,EAAKvN,QAAUA,GAEnB08D,EACA,KAGV18D,MAAOuN,EAAKvN,MACZpS,KAAMA,EACN+tE,WAAY,kBAAMn+C,GAAQ,IAC1Bjf,QAASmmB,EACTlW,SACItT,MAAMC,QAAQ6E,GACRA,EAAM6L,SAAS0B,EAAKvN,OACpBuN,EAAKvN,QAAUA,EAEzB67D,YAAaA,EACbx9D,SAAUA,GAAQ,UAAOA,EAAP,gBAvBtB,UAyBmB,OAAd2tL,QAAc,IAAdA,OAAA,EAAAA,EAAiBz+K,KAAUA,EAAK3f,MAb5B2f,EAAKvN,mB,S7BjN9By+K,K,wBAAAA,E,aAAAA,Q,KAKZ,I8BFY/7K,G9BENupL,IAAe,sBAChBxN,GAAWyN,WAAuB,cADlB,gBAEhBzN,GAAW0N,KAAiB,aAFZ,IAKd,SAASC,GAAej3L,GAC3B,OAAQA,GAAQ82L,GAAgB92L,IAAUA,GAAQ,I,S8BR1CuN,K,4CAAAA,E,gDAAAA,E,iDAAAA,Q,KCOZ,I,gDAAM2pL,GAAoC,GAmC7BC,GAAkB,SAACrwL,GAAD,OAAqBA,EAAMswL,SCjC7CC,GAA0B,WACnC,IAAMhxL,EAAWO,cACX0wL,EAAmBt7L,eACnB8a,EAAcnQ,cACpB,OAAO3R,uBACH,SAACg4B,GACG3mB,EFRD,CACHrG,KAAMuN,GAAQgqL,uBEQVD,EAAiBtqK,GACZsD,MAAK,SAAAn5B,GFLf,IAA8BigM,EEMjB/wL,GFNiB+wL,EEMajgM,EFLvC,CACH6I,KAAMuN,GAAQiqL,uBACdJ,gBEKS5mK,OAAM,SAAC5rB,GACJyB,EFFb,SAA8BzB,GACjC,MAAO,CACH5E,KAAMuN,GAAQkqL,uBACd7yL,SEDqB8yL,CAAqB9yL,EAAMgB,UACpCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUixL,EAAkBxgL,KCV/ByU,GAAYvmB,IAAOC,IAAV,wEAKTw8K,GAAqBz8K,IAAOC,IAAV,4CAIlB2gD,GAAkB5gD,IAAOC,IAAV,yEAKf28K,GAAiB58K,YAAOokB,KAAPpkB,CAAH,uGAiGL68K,GAvFV,SAAC,GAA8C,IAAD,MAA3C9mL,EAA2C,EAA3CA,WAAY+mL,EAA+B,EAA/BA,WAAY32K,EAAmB,EAAnBA,aACtBiiL,EAAmBR,KACnBnkB,EAAO7+J,qBAAW8+J,IAClBlyK,EAASm5B,eACThX,EAAaT,eAAyB/gB,KACtC2f,EAAcnQ,cACdywL,EAAU94K,YAAY64K,IAAiBhgM,KACvCwgM,EAAgBN,KAChBO,EAAsBt9I,aAAmBq9I,GAE/CrvK,qBAAU,cAAU,IAOpBA,qBAAU,WACNsvK,MACD,CAACA,IAEJtvK,qBAAU,WAAO,IAAD,EACZ,KAAI,UAACvtB,EAAWmyL,cAAZ,aAAC,EAAmBzoL,KAAM2yL,EAAS,CACnC,IAAM1N,EACF0N,EAAQlgL,OAASkgL,EAAQlgL,MAAM,IAAMkgL,EAAQlgL,MAAM,GAAGzS,GAE1D2oL,EAAiB,CAAE3oL,GAAIilL,GAAY,UAAU,MAElD,CAAC3uL,EAAYq8L,EAAShK,IAEzB,IAAMyK,EACFT,GACAA,EAAQlgL,MAAMjR,KAAI,SAAAinL,GACd,MAAO,CAAEriL,MAAOqiL,EAAOzoL,GAAIhM,KAAMw+L,GAAe/J,EAAOltL,UAQ/D,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIivD,YAAY,oBACZvrD,OAAQ,OACRgnB,UAAW,GACXI,aAAc,SAACm0B,GAAD,OACVmuI,EAAiBnuI,EAAM5E,OAAOxvC,MAAO,SAEzCA,MAAO9P,EAAWtC,KAClBkyB,SAAU89I,EAAKr+J,OAASi6J,GAAesE,MAAQx9J,EAC/CvG,MAAOk9K,EACP54K,SAAS,wBAGjB,cAAC,GAAD,UACI,cAAC,GAAD,CACIC,MAAO,SACP3S,OAAQmiB,EACR/P,SAAU6/J,EAAKr+J,OAASi6J,GAAesE,MAAQx9J,EAC/CgtF,qBAlDmB,WAC/Bi1F,EAAiB52L,EAAO4jB,eAAgB,iBACxCtD,EAAY,2CAA4C,YAiD5CshF,sBAAuB,QACvBlvF,SAAS,yBAGjB,cAAC,GAAD,UACI,cAAC,GAAD,CACIgO,MAAO2gL,EACPhtL,MAAK,oBAAE9P,EAAWmyL,cAAb,aAAE,EAAmBzoL,UAArB,QAA2B,GAChChM,KAC8B,KAA1B,UAAAsC,EAAWmyL,cAAX,eAAmBzoL,IACbwyL,GAAe3N,GAAW0N,MAC1BC,GAAe3N,GAAWyN,YAEpC9nI,YAAa,UACbvrD,OAAQ,GACR6rB,SA1CW,SAAClF,GACxB,IAAMytK,EAAY,CAAErzL,GAAI4lB,EAAEgwB,OAAOxvC,MAAO7K,KAAMqqB,EAAEgwB,OAAO5hD,MACvD20L,EAAiB0K,EAAW,WAyChBlvL,SAAU6/J,EAAKr+J,OAASi6J,GAAesE,MAAQx9J,EAC/CjC,SAAS,6BCxHhBqoH,GAAkBvsH,IAAOC,IAAV,qNAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKjCg8L,GAAyBngL,IAAOC,IAAV,+FAMtBmgL,GAAmBpgL,IAAOC,IAAV,gGAEhB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aC+F5B+2L,IAzBE1yI,KAAmB+F,MACpBq1I,GAAqBp7I,KAAmB+F,OAKvC/F,KAAmB11C,OACpB8wL,GAAqBp7I,KAAmB11C,QAKvC01C,KAAmBgG,SACpBo1I,GAAqBp7I,KAAmBgG,UAKvChG,KAAmBz1C,QACpB6wL,GAAqBp7I,KAAmBz1C,SAMpBsR,yBAAc,IACnC++J,GAAkB/+J,wBAG5B,CACCS,KAAM,OACN3K,OAAQ,eAGNs4L,GAAiD,SAAC,GAajD,IAAD,MAZFn7K,EAYE,EAZFA,QACAhQ,EAWE,EAXFA,QACA7R,EAUE,EAVFA,WACAgO,EASE,EATFA,QACAkuD,EAQE,EARFA,MACA1tC,EAOE,EAPFA,SACAitI,EAME,EANFA,eACAl8J,EAKE,EALFA,aACAi8J,EAIE,EAJFA,UACAlwJ,EAGE,EAHFA,SACA2xL,EAEE,EAFFA,sBACAC,EACE,EADFA,sBACE,EAC8B9vK,mBAC5Bk8I,GAAesE,MAFjB,mBACKpqD,EADL,KACeooE,EADf,KAIIuR,E/BjH4C,WAClD,IAAM7xL,EAAWO,cACXgW,EAAUW,cACVzG,EAAcnQ,cAEpB,OAAO3R,uBACH,SACIgxL,EACAmS,EACAz7I,GAEA,IAAI07I,EAAiC,KAIrC,GAFApS,GAAe,IAEV59I,kBAAQsU,GAAY,CAAC,IAAD,EAaS,EAZxB27I,EAA2B37I,EAC7BhQ,MAGE4rJ,EAAyB57I,EAC3B/P,MAGE4rJ,EAAiC77I,EACnCjQ,MAGA4rJ,IACAhyL,EACIkZ,aACI84K,EACA,WAIRD,EAAe,iBAAGC,QAAH,IAAGA,OAAH,EAAGA,EAA0B5zL,UAA7B,QAAmC,MAGlD6zL,GACAjyL,EACIkZ,aACI+4K,EACA,WAKZ,IAIME,EAAaL,GAHe,OAA9BI,QAA8B,IAA9BA,GAAA,UAAAA,EAAiC,UAAjC,eAAqCxhM,UACrC+2C,KAAmB11C,QASnBwkB,EAAQH,KAAKluB,IAAO6C,iBAAiBE,YAAYP,KAC7CqnM,GACA56K,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYC,iBAAiBoD,QACjD,gBACAyjM,EAAgBxjM,cAI3B4jM,GACG1hL,EAAY,wBAAyB,cAfxC0hL,GACG1hL,EAAY,6BAA8B,WAC9C8F,EAAQq0G,aAiBpB,CAAC5qH,EAAUuW,EAAS9F,I+BwCpB2hL,GACEC,E/B7B2C,WACjD,IAAMtL,EAAmBR,KAEzB,OAAO53L,uBACH,SACIgxL,EACAY,EACAhiL,EACAigL,GACE,IAAD,EACD,IAAKz8I,kBAAQy8I,GAAqB,CAC9B,IAAMwT,EAA2BxT,EAC7Bn4I,MAGEk2I,EAAmB,OAAGyV,QAAH,IAAGA,OAAH,EAAGA,EAA0B5zL,GAMlDm+K,GACAwK,EAAiBxK,EAAqB,MAI9CoD,GAAe,IAEf,OAAIphL,QAAJ,IAAIA,GAAJ,UAAIA,EAAOgB,eAAX,aAAI,EAAgB8Q,SAAS,oBACzBkwK,GAAc,KAGtB,CAACwG,I+BFDuL,GAEJrqJ,YACIswI,GAAe,cAAergE,EAAUtnD,GACxC,CAACl8D,EAAWtC,OAGhB,IAAMmgM,E/BGgC,WACtC,IAAMvyL,EAAWO,cACXgW,EAAUW,cACVilK,EAAyBxnL,eAE/B,OAAOhG,uBACH,SAACsF,GACGkoL,EAAuB,UAAW,CAACloL,IAAeg2B,MAAK,SAAAgT,GACnDj9B,EAASkZ,aAA+B+jB,EAAU,WAElD1mB,EAAQq0G,cAGhB,CAAC5qH,EAAUuW,EAAS4lK,I+BhBQqW,GAd9B,EAeoC1wK,oBAAS,GAf7C,mBAeKo4J,EAfL,KAekByF,EAflB,OAgBkC79J,oBAAS,GAhB3C,mBAgBK25J,EAhBL,KAgBiB8E,EAhBjB,KAiBI/kL,EAAasJ,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MACzCouL,IAAa9rL,EAAW0J,GACxB0Z,EAAck5B,eACdyvI,EAAW9xL,uBACb,SAACq1B,GACGA,EAAEkmJ,iBAEe,aAAbhnJ,GACApL,EAAYzH,SAASjN,KAAgByrC,sBAErC7qB,EAAE08J,aAAc,KAGxB,CAACx9J,EAAUpL,IAGfmK,qBAAU,WAEN,OADAqd,OAAO6Z,iBAAiB,eAAgBsnI,GACjC,WACHnhJ,OAAOga,oBAAoB,eAAgBmnI,MAEhD,CAACA,IAEJx+J,qBAAU,WACNq+J,GACKE,IAAY5vH,GAAUl8D,EAAWhE,SAAW+2C,KAAmB+F,OAAUhyC,EAEpEwiK,GAAesE,KADftE,GAAekX,QAI1B,CAACsL,EAAU5vH,EAAOl8D,EAAWhE,OAAQ4vL,IAExCr+J,qBAAU,WAMN,MALqB,QAAjBhuB,EACA09L,GAAuB19L,GAEvB29L,IAEG,WACHA,OAEL,CAACA,EAAuBD,EAAuB19L,IAElD,IAAM9D,EAASm5B,eACThX,EAAaT,eAAyB/gB,KACtCw7B,EAAwBD,eACxBomK,EACF/mK,eACEk4H,EACF/uI,eAEJoN,qBAAU,WACN,GAAK8f,kBAAQrtC,EAAWvE,QAQpBm8B,EAAsB,QARO,CAAC,IAAD,EACvBomK,EAAkB,UAAGh+L,EAAWvE,cAAd,QAAwB,GAC1C+jB,EAAoB0vI,EACtB8uC,EACApgL,GAEJga,EAAsBpY,GAI1B,OAAO,WACHoY,EAAsB,OAE3B,CACC53B,EAAWvE,OACXmiB,EACAsxI,EACAt3H,IAIJrK,qBAAU,WACN,GAAK8f,kBAAQrtC,EAAWvE,QAWpBsiM,EAAgC,QAXH,CAC7B,IAAMC,EAAqBh+L,EAAWvE,OAEtC,GAAIuiM,EAAoB,CACpB,IAAMx+K,EAAoB0vI,EACtB8uC,EACApgL,GAEJmgL,EAAgCv+K,IAMxC,OAAO,WACHu+K,EAAgC,OAGrC,CAAC/9L,EAAWvE,SAOf,IAAM+0I,EAAwBv2I,uBAC1B,SAACsF,GACQA,GAELkjB,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYE,aAAamD,QAC7C,gBACA2F,EAAa1F,eAIzB,CAACgoB,IAGCo8K,E1CxFH,WACH,IAAMC,EAAsBn+L,cACtBkoL,EAAsBf,KACtBiX,EAA0B1+L,cAC1B2+L,EAAgC5W,KAOhC6W,EAAgCpkM,sBAAW,yCAC7C,WACIqkM,EACA57I,GAFJ,oBAAAxmC,EAAA,4DAMqCwmC,GAAc,IAAvCh5C,GAAInK,OANhB,MAM+B,EAN/B,EAQS8tC,kBAAQixJ,GARjB,uBASclL,EATd,OASkCkL,QATlC,IASkCA,OATlC,EASkCA,EAAoBpzL,KAAI,SAAAmS,GAAI,sBAAK,CACvDitD,YAAajtD,EAAKpY,KAClB3E,WAAU,oBAAE+c,EAAKy9B,gBAAP,aAAE,EAAepxC,UAAjB,QAAuB,KACjCxO,YAAW,oBAAEmiB,EAAKu+B,iBAAP,aAAE,EAAgBlyC,UAAlB,QAAwB,KACnC4kL,aACkB,cAAdjxK,EAAKpY,KACC,KADN,UAEMoY,EAAKixK,oBAFX,QAE2B,KAC/B3nH,SAAQ,UAAEtpD,EAAKspD,gBAAP,QAAmB,MAjBvC,SAoBqBw3H,EACT5+L,EACA6zL,GAtBZ,mFAD6C,wDA2B7C,CAAC+K,IASCI,EAAiCtkM,uBACnC,SACIi+B,EACAs6B,GAEA,IAAM2rF,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQumK,iBAAO9pI,GAAU,SAAAxuB,GAAE,OAAIA,KAC/BizI,SAAU,GACV/5F,WAAY,cAEhB8N,UAAW,SACXwC,mBAAoB,YAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY/gB,KACZghB,eAAgB21H,EAChB11H,sBACI4rF,MAGZ,CAAC8pC,IAQCuW,EAAkCvkM,uBACpC,SACIqkM,EACA9rI,GAEA,IAAMisI,EAAiC,CACnC1rI,WAAY,CACRurI,qBACA57I,WAAY,IAEhBgO,UAAW,qBACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY5gB,KACZ6gB,eAAgB+rI,EAChB9rI,sBAAuBksI,EACvB9tI,aAAc,QAGtB,CAAC0tI,IASCK,EAA+BzkM,uBACjC,SACI0tL,EACAn1H,GAEA,IAAMmsI,EAAuC,CACzC5rI,WAAY,CACRrQ,WAAY,GACZE,WAAY,aACZ+kI,gBACAh3H,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY3gB,KACZ4gB,eAAgB8rI,EAChB7rI,sBACIosI,MAGZ,CAACP,IAOL,OAAOnkM,uBACH,SAAC2kM,GAA6C,IAEtClhM,EAMAkhM,EANAlhM,KACAi1C,EAKAisJ,EALAjsJ,YACAg8I,EAIAiQ,EAJAjQ,SACAz2J,EAGA0mK,EAHA1mK,SACAl8B,EAEA4iM,EAFA5iM,OACAsiM,EACAM,EADAN,mBAGAltI,EAA+C,CAC/CiB,WAAY1gB,KACZ2gB,eAAgB4rI,EAChBvtI,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR/yD,WAAY,CAAEtC,OAAMi1C,cAAag8I,YACjCh+H,aAAc,GAElBD,UAAW,iBAIb8B,EAAsD,GAmB5D,OAjBKnlB,kBAAQnV,IACTqmK,EAA+BrmK,EAAUs6B,GAGxCnlB,kBAAQixJ,IACTE,EACIF,EACA9rI,GAIJx2D,GAAUA,IAAW+2C,KAAmB+F,OACxC4lJ,EAA6B1iM,EAAQw2D,GAG/B,6BAAQpB,GAAe,CAAEoB,sBAIvC,CACI0rI,EACAM,EACAD,EACAG,I0CjGJG,GACEC,E1C0GH,WACH,IAAMC,EAAuBp/L,eACvBw+L,EAA0B1+L,cAC1Bu/L,EAA2Bp/L,cAC3B0iD,EAA6BxiD,cAC7Bs+L,EAAgCn+L,eAQhCg/L,EAA6BhlM,sBAAW,yCAC1C,WACIsF,EACA2/L,EACA9tI,GAHJ,gBAAAl1C,EAAA,sDAKUijL,EAAoC,CACtCpsI,WAAY,CACRxzD,eACAnD,KAAM8iM,EACNvuI,aAAc,GAElBD,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAYzgB,KACZ0gB,eAAgBysI,EAChBxsI,sBAAuB4sI,IAjB/B,2CAD0C,0DAqB1C,CAACJ,IASCV,EAAgCpkM,sBAAW,yCAC7C,WACIsF,EACA++L,EACAltI,GAHJ,gBAAAl1C,EAAA,sDAKSmxB,kBAAQixJ,KACH5+L,EADwB,OACA4+L,QADA,IACAA,OADA,EACAA,EAAoBpzL,KAAI,SAAAmS,GAAI,sBAAK,CAC3DitD,YAAajtD,EAAKpY,KAClB3E,WAAU,oBAAE+c,EAAKy9B,gBAAP,aAAE,EAAepxC,UAAjB,QAAuB,KACjCxO,YAAW,oBAAEmiB,EAAKu+B,iBAAP,aAAE,EAAgBlyC,UAAlB,QAAwB,KACnC4kL,aACkB,cAAdjxK,EAAKpY,KACC,KADN,UAEMoY,EAAKixK,oBAFX,QAE2B,KAC/B3nH,SAAQ,UAAEtpD,EAAKspD,gBAAP,QAAmB,MAG1Bt5B,kBAAQ3tC,IACT0xD,EAAW1vC,KAAK,CACZ2wC,WAAY5gB,KACZ6gB,eAAgB6rI,EAChB5rI,sBAAuB,CACnBQ,WAAY,CACRxzD,eACAG,yBAEJgxD,UAAW,yBAEfC,aAAc,OA5B9B,2CAD6C,0DAkC7C,CAACwtI,IAUCiB,EAA+BnlM,uBACjC,SACIsyL,EACAxvC,EACAx9I,EACA6xD,GAEA,IAAK/jB,kBAAQk/I,GAAgB,CACzB,IAQM8S,EAAyC,CAC3CtsI,WAAY,CACRusI,sBAVY/S,EAAcrhL,KAC9B,SAAA1M,GAAO,MACF,CACGA,UACAe,oBAQRmxD,UAAW,yBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY/gB,KACZghB,eAAgB0sI,EAChBzsI,sBACI8sI,IAIZ,IAAKhyJ,kBAAQ0vG,GAAkB,CAC3B,IAQMwiD,EAA2C,CAC7CxsI,WAAY,CACRysI,wBAVcziD,EAAgB7xI,KAClC,SAAA1M,GAAO,MACF,CACGA,UACAe,oBAQRmxD,UAAW,2BAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY9gB,KACZ+gB,eAAgBhQ,EAChBiQ,sBACIgtI,OAIhB,CAACP,EAA0B18I,IAUzBo8I,EAA+BzkM,uBACjC,SACIsF,EACAvD,EACAo1D,GAEA,IAAMutI,EAAuC,CACzC5rI,WAAY,CACR/2D,SACAqD,cAAe,CAACE,GAChBoxD,aAAc,GAElBD,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY3gB,KACZ4gB,eAAgB8rI,EAChB7rI,sBACIosI,MAGZ,CAACP,IAOL,OAAOnkM,uBACH,SAAC2kM,GAA2C,IAEpCr/L,EAQAq/L,EARAr/L,aACA7B,EAOAkhM,EAPAlhM,KACAi1C,EAMAisJ,EANAjsJ,YACAg8I,EAKAiQ,EALAjQ,SACApC,EAIAqS,EAJArS,cACAxvC,EAGA6hD,EAHA7hD,gBACAuhD,EAEAM,EAFAN,mBACAtiM,EACA4iM,EADA5iM,OAGAo1D,EAAiD,GAuCrD,OArCK/jB,kBAAQ3vC,IAAU2vC,kBAAQsF,IAAiBtF,kBAAQshJ,IACpDsQ,EACI1/L,EACA,CACI7B,OACAi1C,cACAg8I,YAEJv9H,GAIH/jB,kBAAQk/I,IAAmBl/I,kBAAQ0vG,IACpCqiD,EACI7S,EACAxvC,EACAx9I,EACA6xD,GAIH/jB,kBAAQixJ,IACTD,EACI9+L,EACA++L,EACAltI,GAIJp1D,GAAUA,IAAW+2C,KAAmB+F,OACxC4lJ,EACIn/L,EACAvD,EAAQuU,cACR6gD,GAIDA,IAEX,CACIitI,EACAY,EACAG,EACAV,I0CxVJe,GAEEC,EACF9V,GACI1tH,EAAQ,SAAW,SACnB,eACA,SAAAva,GAAS,OACLw7I,EACIlS,EACAjrL,EAAW0J,GACXi4C,MAER,SAAC93C,EAAOigL,GAAR,OACI6T,EACI1S,EACAY,EACAhiL,EACAigL,MAIVsI,GAAyB,SAC3BvF,EACA7wL,GACE,IAAD,oBAGD,GAFAivL,GAAe,IAEV0U,GAAe3jM,GAAkBgE,EAAWhE,QAG7C,OAFAivL,GAAe,QACN,OAAT4B,QAAS,IAATA,KAAW90I,YAIf,IAAM6mJ,EAA0C,CAC5ClhM,KAAMsC,EAAWtC,KACjBi1C,YAAa3yC,EAAW2yC,YACxBg8I,SAAQ,oBAAE3uL,EAAWmyL,cAAb,aAAE,EAAmBzoL,UAArB,QAA2B,EACnCwuB,SAAUvX,aACNllB,EAAO4jB,eADsB,UAE7B5jB,EAAOwxL,gCAFsB,QAEM,IAEvCqR,mBAAkB,UAAEt+L,EAAW4K,eAAb,QAAwB,GAC1C5O,OAAQA,GAGN4jM,EAA2C,CAC7CrgM,aAAY,UAAES,EAAW0J,UAAb,QAAmB,EAC/BhM,KAAMsC,EAAWtC,KACjBi1C,YAAa3yC,EAAW2yC,YACxBg8I,SAAQ,oBAAE3uL,EAAWmyL,cAAb,aAAE,EAAmBzoL,UAArB,QAA2B,EACnC6iL,cAAe5rK,aACXllB,EAAO4jB,eAD2B,UAElC5jB,EAAOwxL,gCAF2B,QAEC,IAEvClwC,gBAAiBv8H,aACb/kB,EAAO4jB,eAD4B,UAEnC5jB,EAAOwxL,gCAF4B,QAEA,IAEvCqR,mBAAkB,UAAEt+L,EAAW4K,eAAb,QAAwB,GAC1C5O,OAAQA,GAGN6jM,EACF5B,EAAmCW,GAEjCkB,EACFhB,EAAiCc,GAEjC5jM,IAAW+2C,KAAmBgG,SACzB/4C,EAAW0J,GAGZg2L,EAA4BI,GAF5BJ,EAA4B,CAACG,KAKvB,OAAV7/L,QAAU,IAAVA,OAAA,EAAAA,EAAY0J,KAAMm0L,EAAwB79L,EAAW0J,KAIvDi2L,GAAiB1lM,uBACnB,SAAC+B,GAA6B,IAAD,EACzB,GACIgE,GACAA,EAAW4K,SACX5K,EAAW4K,QAAQgS,OAAS,GAO5B,OALAvR,YACIC,EACA,mEACA,UAEG,EAGX,IAAIwhL,GAAS,EACb,OAAQ9wL,GACJ,KAAK+2C,KAAmBz1C,QACpBwvL,GAAS,EACT,MACJ,KAAK/5I,KAAmB11C,QAChB,UAAC2C,EAAWtC,YAAZ,aAAC,EAAiB6lC,QAIXvjC,EAAW4K,QAAQgS,OAAS,GACnCvR,YACIC,EACA,uDACA,SAEJwhL,GAAS,EACTjB,GAAc,IAEdA,GAAc,IAZdxgL,YAAcC,EAAU,iBAAkB,SAC1CugL,GAAc,GACdiB,GAAS,GAYb,MACJ,KAAK/5I,KAAmB+F,MACxB,KAAK/F,KAAmBgG,SACxB,QACQ/4C,EAAWtC,KAAKkf,OAAS,GACzBvR,YAAcC,EAAU,iBAAkB,SAC1CwhL,GAAS,EACTjB,GAAc,IAEdA,GAAc,GAG1B,OAAOiB,IAEX,CAACxhL,EAAUtL,IAGf,OACKk8D,IACAluD,KAAY,OAAChO,QAAD,IAACA,OAAD,EAACA,EAAY0J,KAAmB,UAAb8kB,GAehC,cAAC,GAAD,CAAoBgtI,UAAWA,EAAWC,gBAAgB,EAA1D,SACI,eAAC,GAAD,WACI,eAAC,GAAgBvjF,SAAjB,CACIpoE,MAAO,CAAET,KAAMm0G,EAAU9+G,OAAQknL,GADrC,UAGI,cAAC,GAAmB1zG,SAApB,CAA6BpoE,MAAO01K,EAApC,SACI,cAAC,GAAD,CACI4M,uBAAwBA,GACxB5hD,sBAAuBA,EACvBo0C,WAAY99K,MAGpB,cAAC,GAAD,CACI9G,WAAYA,EACZ+mL,WAAYA,EACZ32K,aAActJ,IAEjB9G,EAAWstL,SACR,eAAC,GAAD,CAAkBliL,YAAU,yBAA5B,kCACgBpL,EAAWstL,eAD3B,aACgB,EAAoB1kJ,UAAW,IAD/C,UAEK5oC,EAAWstL,eAFhB,aAEK,EAAoBxkJ,YAG7B,cAAC,KAAD,IACA,cAAC,GAAD,OAEJ,cAAC,KAAD,CACI1lB,YAAa,CAAC1U,KAAgByrC,oBADlC,SAGI,cAAC,KAAD,CAAkBqzI,KAAmB,aAAbh/J,EAAxB,SACK,gBAAGspB,EAAH,EAAGA,UAAWC,EAAd,EAAcA,SAAd,OACG,cAACN,GAAA,EAAD,CACIC,WAAW,mBACX/E,YACI,0CAEJkF,iBAAkB,UAClBD,kBAAmB,OACnBG,SAAUD,EACVA,UAAW,WACPs6I,GAAuB,CACnBt6I,UAAWA,EACXC,SAAUA,KAGlB5pC,SAAS,iCAzD7B,cAAC,GAAD,CACIqtJ,UAAWA,EACXC,eAAgBA,EAFpB,SAII,cAAC,GAAD,UACI,cAAC,KAAD,SAoGL1/B,gBA9BX,SAAC,GAAmD,IAAjDl6G,EAAgD,EAAhDA,QAASwgD,EAAuC,EAAvCA,MAAOm5F,EAAgC,EAAhCA,UAAWC,EAAqB,EAArBA,eACxBnwJ,EAAWO,cACXgG,EAAU0R,YAAY3R,MACtBsqD,EAAsC,QAA9BmG,EAAM7oE,OAAO+F,aAHwB,EAQ/CgkB,YAAYgtK,IAHNvwL,EALyC,EAK/C0R,KACM8c,EANyC,EAM/Ck6I,KACW16J,EAPoC,EAO/C2D,UAEE61H,EAAgBspD,KAChBiP,EAAkBrO,KAExB,OACI,cAAC,GAAD,CACI7vK,QAASA,EACThQ,QAASA,EACT7R,WAAYA,EACZT,aAAc8iE,EAAM7oE,OAAO+F,aAC3B28D,MAAOA,EACP1tC,SAAUA,EACVxgB,QAASA,EACTivL,sBAAuBz1D,EACvB01D,sBAAuB6C,EACvBz0L,SAAUA,EACVkwJ,UAAWA,EACXC,eAAgBA,OCvftBm4B,GAAmC3pL,IAAOC,IAAV,4BAEhC81L,GAAoB,WACtB,OACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIpyD,KAAM,CACF,CACIzyG,IAAK,cACL/sB,MAAM,eACNu8B,IAAKn3C,IAAO6C,iBAAiBE,YAAYP,KAE7C,CACImlC,IAAK,YACL/sB,MAAM,YACNu8B,IAAKn3C,IAAO6C,iBAAiBC,UAAUN,KAE3C,CACImlC,IAAK,aACL/sB,MAAM,aACNu8B,IAAKn3C,IAAO6C,iBAAiBF,WAAWH,MAGhDmY,SAAS,mBAUV8xL,GAJ2B,WACtC,OAAO,cAAC,GAAD,KCnBLzvK,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2gD,GAAkB5gD,IAAOC,IAAV,iJAQf+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCsgJ,GAAkB/kI,IAAOC,IAAV,gKAQfymJ,GAAkB1mJ,IAAOC,IAAV,uDAIfstC,GAAgBvtC,IAAOC,IAAV,uDAINg2L,GAQR,SAAC,GAQC,IAPHC,EAOE,EAPFA,iBACAC,EAME,EANFA,cACAC,EAKE,EALFA,mBACAC,EAIE,EAJFA,iBACAjxD,EAGE,EAHFA,kBACAC,EAEE,EAFFA,eACAE,EACE,EADFA,eAGAjiH,qBAAU,WACN8yK,EAAmBD,KAEpB,CAACA,IAEJ,IAAM3kM,EAASm5B,eACTi7G,EAAepyH,eACfmyH,EAAapyH,eACbwyH,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAGJ,IAAM0wD,EAAwBtmM,uBAC1B,SAAC+B,GACGqkM,EAAmBvtL,aAAkBqtL,EAAkBnkM,MAE3D,CAACqkM,EAAoBF,IAGnBziG,EAAiBzjG,uBAAY,WAC/Bq1I,EAAe7zI,EAAO6iB,UACtBgiL,EAAiBH,GACjBvwD,IACAJ,MACD,CACCF,EACA7zI,EAAO6iB,SACPgiL,EACAH,EACAvwD,EACAJ,IAGE8kD,EAAiBr6L,uBAAY,WAC/BomM,EAAmB,IACnBxwD,EAAa,MACd,CAACwwD,EAAoBxwD,IAElBM,EACFgwD,EAAiBvjL,OACjBnhB,EAAO6iB,SAASlB,QAAO,SAAC1T,GAAD,OAAaA,EAAK,KAAGkT,OAEhD,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAAC4hB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,+BAApC,SACI,cAAC,GAAD,UACKirC,KAAqBluC,KAAI,SAAAmS,GACtB,OACI,cAAC,GAAD,CAAkCjS,YAAU,wBAA5C,SACI,cAAC2iB,GAAA,EAAD,CAEIgC,aAAc,WACVwwK,EAAsBljL,EAAKvN,QAE/B8E,QAASurL,EAAiBxkL,SACtB0B,EAAKvN,OAETxB,KAAM,GACNZ,MAAO2P,EAAK3f,KACZkP,SAAU,GACVqxB,UAAW/vC,IAAUC,OAAOkB,MAC5B6uC,WAAY,MACZ/vB,SAAQ,kBAAakP,EAAK3f,KAAK6S,cAAvB,cAZH8M,EAAKvN,QAFIuN,EAAKvN,cAqB3C,cAAC0uB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAAC,GAAD,CAAgB1nB,YAAU,mCAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACIznI,MAAO,QACPoC,QAAS,UACTpG,OAAQ,kBAAM4vL,KACdzmL,SAAUsiI,EAAuB,EACjChiI,SAAS,wBALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,wBAHb,iCC4BDqyL,GArLV,SAAC,GAaC,IAAD,EAZF1lJ,EAYE,EAZFA,SACAmoG,EAWE,EAXFA,cACAw9C,EAUE,EAVFA,gBACAC,EASE,EATFA,eACAC,EAQE,EARFA,mBACAC,EAOE,EAPFA,wBACAC,EAME,EANFA,qBACAC,EAKE,EALFA,oBACAC,EAIE,EAJFA,oBACAC,EAGE,EAHFA,gBACAC,EAEE,EAFFA,sBACAxhF,EACE,EADFA,SAEMhkH,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EACF/uI,eACEtO,EAAU0R,YAAY3R,MAP1B,EA0BwDwb,mBAExD,MA5BA,mBA0BK8zK,EA1BL,KA0B4BC,EA1B5B,KA8BI5nK,EAAanK,iBAAO,MAE1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CACIwlF,YAAa,IACbU,SAAUA,EACVtxG,SAAS,8BAHb,UAKK80I,EAAc/oG,QAAQY,IACnB,cAAC,GAAD,CACIzsC,QAAS,SAAAihB,GACLA,EAAEC,kBACFmxK,EAAe5lJ,IAEnB3sC,SAAS,uBALb,kBAUH80I,EAAczpG,gBAAgBsB,MACzBl9B,EAAWxhB,KAAK+f,MAAMS,QACpB,cAAC,GAAD,CACIvO,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyBrmJ,EAASpxC,IA/C/B,WAC/B,IAAM+W,GAA2B,OAARq6B,QAAQ,IAARA,OAAA,EAAAA,EAAUr/C,SAAU,GACvC+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBowH,IAyC4BwxD,IAEJjzL,SAAS,gCANb,2BAWPiC,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OACzB,cAAC,GAAD,CACI2Q,QAAS,SAAAihB,GACLA,EAAEC,kBACFoxK,EAAmB7lJ,IAEvB3sC,SAAS,uBALb,kBAUH80I,EAAcvpG,aAAaoB,IACxB,cAAC,GAAD,CACIzsC,QAAS,SAAAihB,GACLwxK,EAAoBhmJ,IAExB3sC,SAAS,4BAJb,uBASH80I,EAAc3nG,qBAAqBR,IAChC,cAAC,GAAD,CACIzsC,QAAS,SAAAihB,GACLA,EAAEC,kBACFqxK,EAAwB9lJ,IAE5B3sC,SAAS,4BALb,gCAUH80I,EAAcnpG,WAAWgB,IACtB,cAAC,GAAD,CACIzsC,QAAS,SAAAihB,GACLA,EAAEC,kBACFkxK,EAAgB,CAAC3lJ,EAASpxC,KAAM,IAEpCyE,SAAS,0BALb,qBAUH80I,EAAcjpG,UAAUc,IACrB,cAAC,GAAD,CACIywB,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,mBACM,OAARurB,QAAQ,IAARA,OAAA,EAAAA,EAAUpxC,KACNm3L,EAAqB/lJ,EAASpxC,KAEtCyE,SAAS,yBAPb,oBAYH80I,EAAcznG,eAAeV,IAC1B,cAAC,GAAD,CACIzsC,QAAS,SAAAihB,GACLA,EAAEC,kBACFwxK,EAAoBjmJ,EAASpxC,KAEjCyE,SAAS,+BALb,6BAUH80I,EAAcrpG,WAAWkB,IACtB,cAAC,KAAD,CACI13B,YAAa,CAAC1U,KAAgBwsC,kBADlC,SAGI,cAAC,GAAD,CACIqwB,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFyxK,EAAgB,CAAClmJ,EAASpxC,KAAM,IAEpCyE,SAAS,0BANb,4BAchB,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0BpmJ,EAASpxC,GACzC8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eA1IiB,SAACxvH,GAC9B,IAAMysK,EAAgB5rK,aAAwBb,EAAUrkB,EAAOi8G,OACzDqlC,EAAkBv8H,aAAuBV,EAAUrkB,EAAOi8G,OAEhEupF,EAAsB1U,EAAexvC,IAuIzBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,UCnNzB,SAASk5C,KACZ,IAAMxvL,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MAE5B,OAAOvc,mBACH,kBAAO,OAACrW,QAAD,IAACA,OAAD,EAACA,EAASnI,OAAQ,OAACg7B,QAAD,IAACA,OAAD,EAACA,EAASh7B,MAAO,OAACmI,QAAD,IAACA,OAAD,EAACA,EAASrU,YAA9C,UACGqU,EAAQnI,GADX,aACwB,OAAPg7B,QAAO,IAAPA,OAAA,EAAAA,EAASh7B,KAAMmI,EAAQrU,WACxC,KACN,QAACqU,QAAD,IAACA,OAAD,EAACA,EAASnI,GAAV,OAAcmI,QAAd,IAAcA,OAAd,EAAcA,EAASrU,UAAvB,OAAkCknC,QAAlC,IAAkCA,OAAlC,EAAkCA,EAASh7B,KAI5C,SAAS43L,GAAiBC,GAAuC,IAAnBC,EAAkB,uDAAJ,GACzDC,EAAUJ,KAEhB9zK,qBAAU,WACFk0K,GACAF,MAFC,CAKLE,GALK,oBAKOD,KCvBb,IAAM3yD,GAA2B,SAACzzI,GAAgC,IAAD,EAChE0zI,EAAQ,EA4BZ,OA1BI1zI,GAAgBA,EAAa0K,SAAW1K,EAAa0K,QAAQ8W,SAC7DkyH,GAAgB1zI,EAAa0K,QAAQ8W,QAGrCxhB,GAAgBA,EAAa0kB,UAAY1kB,EAAa0kB,SAASlD,SAC/DkyH,GAAgB1zI,EAAa0kB,SAAS1C,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,QAG3DxhB,GAAgBA,EAAamnC,SAAWnnC,EAAamnC,QAAQ3lB,SAC7DkyH,GAAgB1zI,EAAamnC,QAAQ3lB,QAIrCxhB,GACAA,EAAau9D,aACbv9D,EAAau9D,YAAY/7C,SAEzBkyH,GAAgB1zI,EAAau9D,YAAY/7C,SAG7C,OACIxhB,QADJ,IACIA,GADJ,UACIA,EAAc0sC,mBADlB,aACI,EAA2BlrB,UAE3BkyH,GAAgB1zI,EAAa0sC,YAAYlrB,QAGtCkyH,GC7BE13D,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,sBCoCV,SAASqoK,GACZzkM,EACA0kM,GAUA,OALiB1nM,uBACb,SAAC6V,GAAD,OACI6xL,EAAe,CAAE1kM,QAAO6S,YAC5B,CAAC7S,EAAO0kM,I,0HC0CV3lG,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GACjB6sD,GAAuB,CAAC1oJ,KAAe77C,OAAQ67C,KAAeJ,OAE9D+oJ,GA2BD,SAAC,GAoBC,IAAD,MAnBFn8K,EAmBE,EAnBFA,UACAo8K,EAkBE,EAlBFA,iBACAjgL,EAiBE,EAjBFA,QACAkgL,EAgBE,EAhBFA,kBACAC,EAeE,EAfFA,kBACAC,EAcE,EAdFA,kBACAC,EAaE,EAbFA,gBACArvL,EAYE,EAZFA,eACA2T,EAWE,EAXFA,oBACAwiC,EAUE,EAVFA,kBACAi6F,EASE,EATFA,cACArrH,EAQE,EARFA,sBACAvY,EAOE,EAPFA,eACA8iL,EAME,EANFA,+BACAC,EAKE,EALFA,mCACAphG,EAIE,EAJFA,cACAhzF,EAGE,EAHFA,QACAg5K,EAEE,EAFFA,iBACA1xC,EACE,EADFA,uBAEMr9D,EAAUb,KACVirH,EAAsBj/I,eACtBmzD,EAA8BvzF,eAHlC,EAKwCoK,mBAAS,IAAIhD,MALrD,mBAKK+mD,EALL,KAKoBqkE,EALpB,OAMoCpoH,oBAAkB,GANtD,mBAMK8mD,EANL,KAMkBuhE,EANlB,OAQkCroH,mBAChC,MATF,mBAQKsoH,EARL,KAQiBC,EARjB,KAWI2sD,EAAwBjgJ,eACxBkgJ,EAA0B9hM,cAC1B+hM,EAA4B9hM,cAbhC,EAe8C0sB,mBAAmB,CAC/D,SACA,UAjBF,mBAeK+yK,EAfL,KAeuBsC,EAfvB,QAmBwCr1K,mBAAmB,CACzD,SACA,UArBF,qBAmBKgzK,GAnBL,MAmBoBsC,GAnBpB,MAwBIntD,GAAgB5I,KAEhB5qH,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEA/zG,GAAoC,CACtClkC,WAAY,GACZ6V,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO8xL,KACpC9hL,SAAUjN,EACV7V,QAAS,CACLC,MAAO,aACPC,KAAK,GAETP,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GA7CjB,GAwDEkkB,aAAqBC,IAPrB5lC,GAjDF,GAiDEA,aACAg4B,GAlDF,GAkDEA,cACA4O,GAnDF,GAmDEA,WACAE,GApDF,GAoDEA,YACAS,GArDF,GAqDEA,UACAK,GAtDF,GAsDEA,oBACA7B,GAvDF,GAuDEA,UAGEiwC,GAAcn3E,uBAAY,WAC5BmB,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBmsD,EAAgB9mM,IAChBo6I,EAAiB,IAAIprH,MACrBqrH,GAAe,GACf0sD,EAA+B,IAAI,GAAO,KAC3C,CACC/mM,GACA26I,GACAmsD,EACAC,IAGJ50K,qBAAU,WACN40K,EAA+B,IAAI,GAAO,GAC1C1sD,GAAe,KAChB,CAAC1zH,GAASukC,SAAU67I,IAEvB50K,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAGR,CAACmzG,KAEJwrD,IAAiB,WACblmM,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBmsD,EAAgB9mM,MACjB,CAAC8mM,EAAiB9mM,KAErBmyB,qBAAU,WACFu0K,GAAkB9+J,OACvB,CAAC8+J,EAAkB9+J,KAEtBzV,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,YAEe,OAAjBy7B,QAAiB,IAAjBA,OAAA,EAAAA,EAAmBpsC,UAAnB,OACA8I,QADA,IACAA,OADA,EACAA,EAAW49B,QACX0F,EAAkBpsC,UAAY8I,EAAU49B,OAExCmyF,GAAe,KAEpB,QAAC/vH,QAAD,IAACA,OAAD,EAACA,EAAW49B,MAAO0F,IAEtB,IAAM03I,GAAiB,SAACh7K,GACpBy8K,EAA+B,IAAI,GAAO,GAC1C1/K,YACIZ,EACAruB,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QACrC,cACA8rB,EAAUhc,GAAI7P,cAQpB8oM,GjD1CH,SACHvpH,EACAC,GAKA,IAAMupH,EAAwBxzK,iBAC1BsjB,MAFN,EAMMkwJ,EAAsB5oK,QADlB5rB,EALV,EAKUA,MAAOukC,EALjB,EAKiBA,YAAaC,EAL9B,EAK8BA,iBAAkB12C,EALhD,EAKgDA,MAAOg8B,EALvD,EAKuDA,SAAU2a,EALjE,EAKiEA,SALjE,EAQoCzlB,oBAAkB,GARtD,mBAQSosD,EART,KAQoBC,EARpB,KAUQuvG,EAAqBrtL,cACrBssL,EAAsBf,KACtB+B,EAAyBhtL,cAEzBqP,EAAWO,cACXytE,EAAkBx2D,eAClB/G,EAAcnQ,cAEhBwlD,EAA+C,CAC/CiB,WAAYjgB,KACZkgB,eAAgB02H,EAChBz2H,sBAAuB,CACnBQ,WAAY,CACRn3D,cAAe,CACXwS,QACAukC,cACAC,mBACAC,YAEJ8d,aAAc,GAElBD,UAAW,iBAIb8B,EAAsD,GAQtD82H,EAAsCrvL,sBAAW,yCACnD,WAAOyoD,EAA4B8lI,GAAnC,kBAAAtsK,EAAA,2DACUqtK,EADV,OAC+B7mI,QAD/B,IAC+BA,OAD/B,EAC+BA,EAAYh5C,IAD3C,uBAIc8/K,EAJd,OAIsChB,QAJtC,IAIsCA,OAJtC,EAIsCA,EAAct9K,KAAI,SAAA+1K,GAAS,IAAD,EAQhDA,GAAQ,GARwC,IAEhD0H,eAFgD,MAEtC,EAFsC,MAGhD96D,gBAHgD,MAGrC,EAHqC,MAIhDlnD,gBAJgD,MAIrC,KAJqC,MAKhDniE,YALgD,MAKzC,GALyC,MAMhDioK,eANgD,MAMtC,GANsC,MAOhDX,SAGJ,MAAO,CACH6c,UACA96D,WACAlnD,WACAniE,OACAioK,UACAX,cAhBgD,MAOrC,GAPqC,MAJhE,SAwBcmd,EACFM,EACAC,GA1BZ,2CADmD,wDA+BnD,CAACP,IAQCQ,EAA+BxvL,uBACjC,SACIuuL,EACAh2H,GAEA,IAAMk3H,EAAgC,CAClC32H,WAAY,CACRrQ,WAAY,GACZ8lI,eACA73H,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY7f,KACZ8f,eAAgBg3H,EAChB/2H,sBAAuBm3H,MAG/B,CAACJ,IASCD,EAAgCpvL,uBAClC,SACIi+B,EACAs6B,GAEA,IAAM2rF,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQumK,iBAAO9pI,GAAU,SAAAxuB,GAAE,OAAIA,KAC/BizI,SAAU,GACV/5F,WAAY,aAEhB8N,UAAW,SACXwC,mBAAoB,YAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY/f,KACZggB,eAAgB21H,EAChB11H,sBACI4rF,MAGZ,CAAC8pC,IAGA56I,kBAAQnxC,IACTutL,EAA6BvtL,EAAOs2D,GAGnCnlB,kBAAQnV,IACTmxJ,EAA8BnxJ,EAAUs6B,GAGvCnlB,kBAAQmlB,KACTpB,EAAU,6BAAQA,GAAe,CAAEoB,qBAGvC,IAAMwqF,GAAoB3vG,kBAAQu1J,EAAsB5oK,SAQlDygD,EAAwCxgF,uBAC1C,SAAC4P,EAAqBigL,GACd9sC,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAW,uBACXzd,QAASq/C,MAMzBspH,EAAsB5oK,QAAU0Y,KAChC8mC,GAAaC,GAAa,IACrB,OAAL5vE,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWkR,EAAYlS,EAAMgB,QAAS,SAE9B,OAAfwuE,QAAe,IAAfA,KAAkBxvE,EAAOigL,KAE7B,CACIx+K,EACAguE,EACAE,EACAH,EACA2jE,EACAjhI,IASFy+D,EAA+BvgF,uBACjC,SAAC0nD,GACG/qB,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHspH,EAAsB5oK,QAAU0Y,KAEhC8mC,GAAaC,GAAa,GAET,OAAjBL,QAAiB,IAAjBA,KAAoBz3B,QAG5B,CAAC23B,EAAiBE,EAAWJ,IAGzB5nB,EAAiBL,aACrB,CAACC,GACDopB,EACAC,GAHIjpB,aAUFy4H,EAA8ChwL,uBAAY,WAC5D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IACAE,GAAaC,GAAa,GAC1BmpH,EAAsB5oK,QAAU0Y,KAEf,OAAjB0mC,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmB5nB,IAM7C4rF,EAA+BnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAW,uBACXkjC,wBACIqvG,EACJhwJ,QAASq/C,MAMzB9nB,GAAa,QAElB,CACCwrF,EACAxrF,EACAlmD,EACA2+K,EACA3wG,IAgBJ,OAbA/rD,qBAAU,WACFisD,GACA4jE,MAGL,CAAC5jE,IAQGv/E,uBAAY,SAACmC,GAChBwmM,EAAsB5oK,QAAU59B,EAEhCq9E,GAAa,KACd,IiDjP8BopH,CAF7BnhJ,gBAMEk/I,GAA0B,SAAC9lJ,GAAiC,IAAD,IAC7D,GAAKA,EAASpxC,GAAd,CAIA,IAAMk5L,EAA+C,CACjDx0L,MAAM,eAAD,OAAiB0sC,EAAS1sC,OAC/BukC,YAAamI,EAASnI,YACtBC,iBAAkBkI,EAASpxC,GAC3BwuB,SAAQ,UAAG4iB,EAASr/C,cAAZ,QAAmC,GAC3CS,MAAK,UAAE4+C,EAAS0tH,OAAOtsK,aAAlB,QAA2B,GAChC22C,SAAUC,MAGd6vJ,GAAyBC,KAGvB7B,GAAsB,SAACr3L,GACpBA,GACLs9K,EAAiBt9K,IAGfssI,GACFtwH,GACAA,EAAUvJ,OACV6sC,GACAA,EAAkBpsC,OAAS8I,EAAUvJ,MAAMS,OAEzCkmL,GAA0B7oM,uBAC5B,SAAC2a,GACG,IAAM0I,EACDoI,GACGA,EAAUvJ,MAAMjR,KACZ,SAACmS,GAAD,OAA6BA,EAAK3T,OAEzC,GACLy4L,EACI7kL,EACA1I,EACAohI,MAGR,CAACtwH,EAAWswH,GAA6BmsD,IAUvC7xC,GAAmB/vI,eAEnBwiL,GACF1lD,GACIklD,EACAC,EACAtuH,EACA,CACI7hB,WAAY6oF,GACZ5oF,eAAgB4vI,EAChBvxI,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAO,EACPC,OAAM,UAAEojB,OAAM,OAAC0F,QAAD,IAACA,OAAD,EAACA,EAAW49B,cAApB,QAA8B,IAExC5b,gBAAgB,GAEpBgpB,UAAW,wBAGnB0gB,IAGF4xH,GAAY,yCAAG,qCAAA9mL,EAAA,0DACbmD,IAAkBmH,EADL,gCAEuBy8K,GAChCz8K,EACAxV,KAAqBE,yBACrBT,KAAqBC,SAH+B,aAAC,gBAIhDtV,IAJ+C,IAIjC4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GACJ,OAAO8yJ,GACH1oI,EACAd,EACAtpB,MAZK,gBAELojB,EAFK,EAELA,kBAcFg+H,EAAgB8S,GAAiBjxI,GAEjC6jL,EAAwB1lD,EAAcpgI,QACxC,SAAAtU,GAAC,OACG0W,EAAkB7D,SAAS7S,IAC3B0W,EAAkB7D,UAAU7S,MAE9Bq6L,EAAyB9jL,EAAejC,QAC1C,SAAAtU,GAAC,OAAIA,EAAI,IAAM0W,EAAkB7D,SAAS7S,MAG9Ci6L,GACI,CACIngJ,WAAY,WACZ1jD,UAAWsnB,GAEf28K,EACAD,GAjCS,2CAAH,qDAsCZD,GAAuBhkM,cAEvBiwJ,GAA6BhwI,eAE7BliB,GAAU5B,GAAa4B,QACvBi5I,GAASlC,GAAW,QAAS/2I,GAASglC,IACtCohK,GAAWrvD,GAAW,SAAU/2I,GAASglC,IACzCqhK,GAAatvD,GAAW,iBAAkB/2I,GAASglC,IACnDshK,GAAcvvD,GAAW,aAAc/2I,GAASglC,IAChDuhK,GAAoB7B,GAAU,SAAUvgK,IAWxCw1G,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBkmL,GAAiB,SAACxnM,GACpBymM,EAAoBzmM,IAElBynM,GAAe,SAACznM,GAClB0mM,GAAiB1mM,IAIf0+F,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eACIpF,GAAyBzzI,MACX,OAAbglM,SAAa,IAAbA,QAAA,EAAAA,GAAexjL,SAAU,GAC9B4jF,YAAqB,OAAT96E,QAAS,IAATA,OAAA,EAAAA,EAAWvJ,MAAMS,SAAU,IAGrCqoI,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAew/B,KACnC,CAACA,EAAmBi6F,IAOlBygD,GAAgCzpM,uBAAY,WAC9CooM,IACAr/J,OACD,CAACq/J,EAAqBr/J,KAOnB2gK,GAA0B1pM,uBAC5B,SAAC2pM,GACG7B,EACI,CAAC6B,GACDF,MAGR,CAAC3B,EAAmB2B,KAQlB7C,GAAuB5mM,uBACzB,SAACyP,GACG6sG,EAA4B,CACxB7+D,WAAY,gBACZ/E,YACI,uEACJmF,UAAW,kBAAM6rJ,GAAwBj6L,QAGjD,CAACi6L,GAAyBptF,IA2B9BhpF,qBAAU,WACN,IAAMs0I,EAAgBn8I,EAChBA,EAAUvJ,MAAMjR,KAAI,SAAA4vC,GAAQ,OAAI96B,OAAO86B,EAASpxC,OAChD,GACAm6L,EAAejjL,aACjB4F,EACAq7I,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtCulL,EAA+B0B,GAAc,KAElD,CAACr9K,EAAqBd,EAAWy8K,IAEpC50K,qBAAU,WACN,OAAO,kBAAM40K,EAA+B,IAAI,GAAO,MAExD,IAEH50K,qBAAU,WACN40K,EAA+B,IAAI,GAAO,KAE3C,CAACz8K,IAEJ6H,qBAAU,WACNg2K,GAAkBnD,MACnB,CAACA,GAAemD,KAEnBh2K,qBAAU,WACNgoH,GAAc,CAAC7mI,KAAgBkpH,kBAChC,CAAC2d,KAQJ,IAsCMyB,MAA2B,OAACxwH,QAAD,IAACA,OAAD,EAACA,EAAqB5J,QAEjDq6H,IACDvxH,GAAcA,GAAaA,EAAUvJ,MAAMS,OAAS,EAsCnDs6H,GAAuBj9I,uBACzB,SAACuE,EAAiBs8C,GACd,IAAMgpJ,EAAW,OAAGp+K,QAAH,IAAGA,OAAH,EAAGA,EAAWvJ,MAAMqsB,MACjC,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOoxC,EAASpxC,MAG5B2jC,kBAAQy2J,IACTxB,EACI9jM,EACA,CACIqkD,WAAYihJ,EACZlhJ,WAAY,YAEhBwuB,MAIZ,CAACkxH,EAAuBlxH,GAAa1rD,IAGnCq+K,GAAgCznD,GAClCimD,EACAC,EACApxH,IAyBE4yH,GACFjc,KAEEkc,GACFra,GACI,YACA,WACAx4G,IAQF8yH,GAA0BjqM,uBAC5B,SAAC6gD,GAAiC,IAAD,MACvBqpJ,EAAqC,CACvC/1L,MAAO+sI,GAAyBrgG,EAAS1sC,OACzCukC,YAAamI,EAASnI,YACtBza,SAAQ,iBAAE4iB,QAAF,IAAEA,OAAF,EAAEA,EAAUr/C,cAAZ,QAAsB,GAC9BS,MAAK,iBAAE4+C,QAAF,IAAEA,GAAF,UAAEA,EAAU0tH,cAAZ,aAAE,EAAkBtsK,aAApB,QAA6B,IAGhCkoM,EACFJ,GAAoCG,IAEvC92J,kBAAQ+2J,IACLH,GAAkC,CAC9BG,MAGZ,CAACH,GAAmCD,KAGxC,OACI,eAAC,GAAD,CACIzwE,SAAS,UACTsC,KAAM,cAAC,GAAD,IACNwuE,eAAc,OAACr7I,QAAD,IAACA,OAAD,EAACA,EAAmBpsC,QAClC27G,cAAc,oBACdpqH,SAAS,UALb,UAOKH,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEspB,QAAF,IAAEA,OAAF,EAAEA,EAAWvJ,MACjB+qF,SAAUr0F,KAAoBA,EAAe+J,OAC7C/J,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,qBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEsJ,QAAF,IAAEA,OAAF,EAAEA,EAAW49B,aAAb,QAAsB,EAChCygB,aAAcgxE,GACd74C,aAzLK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IAyLMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,kBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,wBAEd23F,8BACKz4D,kBAAQ2b,KAAuB3b,kBAAQ3nB,GAC5CqgF,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEhrB,QAAF,IAAEA,OAAF,EAAEA,EAAmBpsC,OACnCR,WAAU,OAAEsJ,QAAF,IAAEA,OAAF,EAAEA,EAAW49B,MACvBygB,aAAcgxE,GACdluC,iBApMK,WACrBs7F,EAA+B,IAAI,GAAO,GAC1C1sD,GAAe,IAmMCjjH,YA5LA,WAChB,IAAMlV,EACDoI,GACGA,EAAUvJ,MAAMjR,KACZ,SAACmS,GAAD,OAA6BA,EAAK3T,OAEzC,GACLy4L,EAA+B7kL,GAAK,EAAM04H,IAC1CP,GAAe,IAqLC3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACN+mG,wBACIkjD,GAAYp7H,oBACR+wB,KAAgBN,eAEd,CAAC5rC,KAAgBssC,uBACjB,GACVwoD,uBACIyhD,GAAYrwG,qBACRgG,KAAgBN,eAExB8mD,wBAtRQ,WACxB17E,GAAaA,EAAUvJ,OAASqK,GAChCy8K,GACIz8K,EACAxV,KAAqBE,yBACrBT,KAAqBC,SAHL,aAAC,gBAIZtV,IAJW,IAIG4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GAAe,IACXojB,EAAsB0vI,GAC1B1oI,EACAd,EACAtpB,GAHIojB,kBAMRoY,EAAsBpY,OAwQV49E,qBAAsB4lG,GACtB9uH,YAAaA,EACb93D,WAAU,OAAEsJ,QAAF,IAAEA,OAAF,EAAEA,EAAW49B,QAG/B2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIslK,iBACIz6K,EAAYy6K,EAAmB,GAEnCC,cAAeA,GACfC,mBAAoBmD,GACpBlD,iBAAkBmD,GAClBp0D,kBAAmBx8H,GAAkB,GACrCy8H,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAlBtB,SAoBK,SAACxxB,EAAD,SAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aACIjpH,EACM06K,GAAcxjL,SACb,UAAAxhB,GAAa0kB,gBAAb,eACKlD,SAAU,GAChB,EAEV/O,SAAU6sF,GAAY45C,eACtBnmI,SAAS,yBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAwC,KAApB,OAAT0X,QAAS,IAATA,GAAA,UAAAA,EAAWvJ,aAAX,eAAkBS,QAClC+9E,iBAAkB,CACd7sF,KAAMwhH,GACN9qH,KAAM,mBACN2J,SAAU,wBAEdysF,uBAAwB,CACpBh4C,WAAY,YACZz0C,SAAU,8BAEd0sF,uBAAwB,CACpB1sF,SAAU,kCAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YAjQU,SAAC/wB,GAC3B4+I,GAAwB5+I,EAAM5E,OAAO1qC,SACrC6gI,GAAe,IAgQCtnI,SAAU,qCAGd+oF,QAAS,CAAC,2BAEF9oF,MAAO,YACP1F,MAAO,IACJutI,IAJF,IAKDpoI,SAAU6sF,GAAY85C,eACtBrmI,SAAU,mCANT,2BASDC,MAAO,SACP1F,MAAO,IACJ06L,IAXF,IAYDv1L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,oCAbT,2BAgBDC,MAAO,WACP1F,MAAO,IACJ26L,IAlBF,IAmBDx1L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,sCApBT,2BAuBDC,MAAO,gBACP1F,MAAO,IACJ46L,IAzBF,IA0BDz1L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,kCAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAAY6mG,GACZ3mG,kBAjRM,SAAC71C,EAAYpJ,GArRX,IAASwpJ,EAsRjC7uD,GAAe,GAtRkB6uD,EAuRNxpJ,EAAPoJ,EAtRlB30B,kBACI+0K,EAAG56L,IACL04L,EAAmCkC,EAAG56L,KAoiB1BowF,aA7RM,SAACh/C,GAAD,QACpBt0B,KACAs0B,EAASpxC,IACX8c,EAAoB7K,SAASm/B,EAASpxC,KA2RtBswF,gBAzQS,SAACl/C,GAC1B,OAAO46F,KAAU,OAAK56F,QAAL,IAAKA,OAAL,EAAKA,EAAQ,KAyQd69C,kBAAmB,SAAC79C,GAAD,MAAkC,CACjDjoC,gBAAwB,OAARioC,QAAQ,IAARA,OAAA,EAAAA,EAAUr/C,SAAU,GACpCo7E,kBAAmB,CACfnoE,KAAgB61L,wBAGpB5tH,cAAe,SAACn4E,GAAD,OACX04I,GAAqB14I,EAASs8C,MAEtC3sC,SAAU,yBACVyrF,MAAO,CACH,CACIR,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB34C,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACTl9C,GADS,OAERA,EAAS1sC,OACdD,SAAU,iCAGlB,CACIirF,UAAW,cACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjBrf,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAU9+C,SAChBq9F,WAAY,CACRb,mBAAoB,SAChB19C,GADgB,MAEd,CACF9+C,OAAM,OAAE8+C,QAAF,IAAEA,OAAF,EAAEA,EAAU9+C,OAClBuM,UAAW0vE,EAAQ+5D,qBACnB7jI,SACI,kCAER6pF,YAAa,SACTl9C,GADS,OAGT7B,aAAsB,OAClB6B,QADkB,IAClBA,OADkB,EAClBA,EAAU9+C,WAI1B,CACIo9F,UAAW,aACXj/B,oBAAqB,SACjBrf,GADiB,cAEhB,OAACA,QAAD,IAACA,GAAD,UAACA,EAAU0tH,cAAX,aAAC,EAAkBC,gBACxBpvE,WAAY,CACRrB,YAAa,SACTl9C,GADS,aAGT+9F,GAAY,OACR/9F,QADQ,IACRA,GADQ,UACRA,EAAU0tH,cADF,aACR,EAAkBC,gBAE1Bt6J,SAAU,oCAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrf,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAU4qI,YAChBrsF,WAAY,CACRrB,YAAa,SACTl9C,GADS,OAERlvB,aAAU,OAACkvB,QAAD,IAACA,OAAD,EAACA,EAAU4qI,YAC1Bv3K,SAAU,gCAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACf79C,GADe,YAEb,CACF1wC,KAAMsrI,IAAe56F,EAASpxC,GAC9Bs7C,WAAY,WAtiBrB,IAAC4wB,KAwiBgB51D,OAAO86B,EAASpxC,MAriBpDisI,EADAD,IAAe9/D,EACD,KAEAA,IAqiBc/iE,eAAc,iBAAEioC,QAAF,IAAEA,OAAF,EAAEA,EAAUr/C,cAAZ,QAAsB,GACpC0S,SACI,oCAIhB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrB/9C,GADqB,OAGrB,cAAC,GAAD,CACIA,SAAUA,EACVmoG,cAAeA,EACfw9C,gBAAiBwB,EACjBvB,eAAgBA,GAChBC,mBAAoBD,GACpBE,wBACIA,GAEJC,qBACIA,GAEJC,oBACIoD,GAEJnD,oBACIA,GAEJC,gBAAiBgB,EACjBf,sBAAuB,SACnB1U,EACAxvC,GAFmB,aAjV3B,SAChCwvC,EACAxvC,EACAz8I,GAEAyjM,GACI,CACInhJ,WAAY,WACZ+5F,SAAUr8I,GAEdisL,EACAxvC,GA0UoCynD,CACIjY,EACAxvC,EAFuB,iBAGvBjiG,QAHuB,IAGvBA,OAHuB,EAGvBA,EAAUpxC,UAHa,QAGP,IAGxB+1G,YACK,OAACz2D,QAAD,IAACA,OAAD,EAACA,EAAmBpsC,sBAqEtD6nL,GAvDuB,WAClC,IAAM14L,EAAQ+8C,eACRjnC,EAAUW,cACVkiL,EAAkB7jJ,eAClBmgJ,EAAkBjgJ,eAClB0/I,EAAkBx/I,eAClBihJ,EAAkBxhJ,eAClBohJ,EAAmB54I,eACnBy7I,EAA2BplJ,aAAmB2iJ,GAC9CzmM,EAASm5B,eACTgD,EAAwBD,eACxBwqK,EACFtgJ,eACEugJ,EACFtgJ,eACEk/C,EAAgBhkE,eAChBgqJ,EAAmB9kI,eACnBozF,EAAyBl/G,eACzB6sH,EAAgBpoG,eAEhBmO,EAAoB9gC,mBACtB,kBAAM6gC,aAAwBh9C,KAC9B,CAACA,IAGL,OACI,cAAC,KAAkBmsE,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,oBAAlD,SACI,cAAC,GAAD,CACIymL,kBAAmB2C,EACnB1C,kBAAmBhB,EACnBiB,kBAAmBxB,EACnB5+K,QAASA,EACTqgL,gBAAiByC,EACjBj/K,UAAW3Z,EAAM3P,KACjB4R,QAASjC,EAAMiC,QACfwY,oBAAqBza,EAAMi9C,kBAC3BA,kBAAmBA,EACnBi6F,cAAeA,EACf6+C,iBAAkBA,EAAiB1lM,KACnCyW,eAAgBpX,EAAO6iB,SACvBsZ,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvB8iL,+BAAgCA,EAChCC,mCACIA,EAEJphG,cAAeA,EACfgmF,iBAAkBA,EAClB1xC,uBAAwBA,OCjhCzBsvD,GAtBIv8L,sBACf,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBACIU,SAAS,UACTD,KAAK,eACLE,EAAE,ilBCuMPq7L,GA1KV,SAAC,GAaC,IAAD,EAZF7kM,EAYE,EAZFA,WACAijJ,EAWE,EAXFA,cACA6hD,EAUE,EAVFA,oBACApE,EASE,EATFA,eACAqE,EAQE,EARFA,qBACAv0D,EAOE,EAPFA,sBAEAw0D,GAKE,EANFC,6BAME,EALFD,wBACAE,EAIE,EAJFA,sBACAC,EAGE,EAHFA,oBACAlE,EAEE,EAFFA,sBACAxhF,EACE,EADFA,SAEMhkH,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EACF/uI,eACEtO,EAAU0R,YAAY3R,MACtBgmB,EAAwBD,eAR5B,EA4BwDvK,mBAExD,MA9BA,mBA4BK8zK,EA5BL,KA4B4BC,EA5B5B,KAgCI5nK,EAAanK,iBAAO,MAE1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CACIwlF,YAAa,IACbU,SAAUA,EACVtxG,SAAS,iCAHb,UAKK80I,EAAc/oG,QAAQl6C,IACnB,cAAC,GAAD,CACIqO,QAAS,SAAAihB,GACLA,EAAEC,kBACFmxK,EAAe1gM,IAEnBmO,SAAS,0BALb,kBAUHiC,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OACzB,cAAC,GAAD,CACI2Q,QAAS,SAAAihB,GACLA,EAAEC,kBACFw1K,EAAqB/kM,IAEzBmO,SAAS,0BALb,kBAUH80I,EAAc7oG,eAAep6C,IAC1B,cAAC,GAAD,CACIqO,QAAS,SAAAihB,GACLA,EAAEC,mBACF,OAAIvvB,QAAJ,IAAIA,OAAJ,EAAIA,EAAY0J,KACZ8mI,EAAqB,OAACxwI,QAAD,IAACA,OAAD,EAACA,EAAY0J,KAG1CyE,SAAS,kCAPb,0BAYH80I,EAAczpG,gBAAgBx5C,MACzB4d,EAAWxhB,KAAK+f,MAAMS,QACpB,cAAC,GAAD,CACIvO,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyBnhM,EAAW0J,IAxEjC,WAC/B,IAAM+W,EAAmBzgB,EAAWvE,QAAU,GACxC+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBoY,EAAsBpY,GACtBowH,IAiE4BwxD,IAEJjzL,SAAS,mCANb,2BAWP80I,EAAcvpG,aAAa15C,IACxB,cAAC,GAAD,CACIqO,QAAS,SAAAihB,GACL41K,EAAsBllM,IAE1BmO,SAAS,+BAJb,uBASH80I,EAAcrpG,WAAW55C,IACtB,cAAC,GAAD,CACIurE,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACF41K,EAAoB,CAACnlM,EAAW0J,MAEpCyE,SAAS,6BANb,qBAWH80I,EAAcnpG,WAAW95C,IACtB,cAAC,GAAD,CACIqO,QAAS,SAAAihB,GACLA,EAAEC,kBACFu1K,EAAoB,CAAC9kM,EAAW0J,MAEpCyE,SAAS,6BALb,qBAUH80I,EAAcjpG,UAAUh6C,IACrB,cAAC,GAAD,CACIurE,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,mBACQ,OAAVvvB,QAAU,IAAVA,OAAA,EAAAA,EAAY0J,KACRs7L,EAAuBhlM,EAAW0J,KAE1CyE,SAAS,4BAPb,yBAcZ,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0BlhM,EAAW0J,GAC3C8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eA7HiB,SAACxvH,GAC9B,IAAMysK,EAAgB5rK,aAAwBb,EAAUrkB,EAAOi8G,OACzDqlC,EAAkBv8H,aAAuBV,EAAUrkB,EAAOi8G,OAEhEupF,EAAsB1U,EAAexvC,IA0HzBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,U,UC/MnBi9C,GAAgBn7L,IAAO0nB,KAAV,sKAER,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOjC+nF,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,sBC0EX2iE,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GACjB6sD,GAAuB,CAAC1oJ,KAAe77C,OAAQ67C,KAAeJ,OAE9DusJ,GA0BD,SAAC,GAmBC,IAAD,MAlBFvxL,EAkBE,EAlBFA,YACAuvC,EAiBE,EAjBFA,kBACAxhC,EAgBE,EAhBFA,QACAyjL,EAeE,EAfFA,oBACAH,EAcE,EAdFA,oBACAL,EAaE,EAbFA,oBACAS,EAYE,EAZFA,mBACA1yL,EAWE,EAXFA,eACA8B,EAUE,EAVFA,sBACA8zC,EASE,EATFA,oBACAw6F,EAQE,EARFA,cACArrH,EAOE,EAPFA,sBACAvY,EAME,EANFA,eACA3K,EAKE,EALFA,iCACA8wL,EAIE,EAJFA,qCACAxkG,EAGE,EAHFA,cACAhzF,EAEE,EAFFA,QACAsnI,EACE,EADFA,uBAEMvzH,EAAWF,EAAQE,SACnBk2D,EAAUb,KACV0+D,EAAYr8I,SAASuiG,GAAGngE,MAAM9Z,EAAShjB,QAAQu9F,MAC/Cy5C,EAAgBD,EACF,IAAdA,EACI,GACCA,EAAY,GAAKf,GACtB,EAEAx+B,EAA8BvzF,eAVlC,EAYwCoK,mBAAS,IAAIhD,MAZrD,mBAYK+mD,EAZL,KAYoBqkE,EAZpB,OAaoCpoH,oBAAkB,GAbtD,mBAaK8mD,EAbL,KAakBuhE,EAblB,KAcI6sD,EAAwBjgJ,eACxB28I,EAA2Bp/L,cAC3B0iD,EAA6BxiD,cAhBjC,EAkBkCstB,mBAChC,MAnBF,mBAkBKsoH,EAlBL,KAkBiBC,EAlBjB,OAuBEvoH,mBAAmBw0K,IAvBrB,mBAsBKzB,EAtBL,KAsBuBsC,EAtBvB,OAyBEr1K,mBAAmBw0K,IAzBrB,oBAwBKxB,GAxBL,MAwBoBsC,GAxBpB,MA2BIntD,GAAgB5I,KAEhB3rG,GAAoC,CACtClkC,WAAY,GACZ6V,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO8xL,KACpC9hL,SAAUjN,EACV7V,QAAS,CACLC,MAAO,aACPC,KAAK,GAETP,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAxCjB,GAmDEkkB,aAAqBC,IAPrB5lC,GA5CF,GA4CEA,aACAg4B,GA7CF,GA6CEA,cACA4O,GA9CF,GA8CEA,WACAE,GA/CF,GA+CEA,YACAS,GAhDF,GAgDEA,UACAK,GAjDF,GAiDEA,oBACA7B,GAlDF,GAkDEA,UAGEiwC,GAAcn3E,uBAAY,WAC5BmB,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,EACtB1yF,EAAkBjoD,IAClBo6I,EAAiB,IAAIprH,MACrB1V,EAAiC,IAAI,GAAO,GAC5C+gI,GAAe,KAChB,CACCr6I,GACA26I,EACA1yF,EACA3uC,IAGEgsL,GAAiB,SAAC1gM,GACpB0U,EAAiC,IAAI,GAAO,GAC5C+N,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QACvC,gBACAoG,EAAW0J,GAAI7P,cAKrBorM,GAA+B,SAACjlM,GAClC6hB,EAAQH,KACJluB,IAAOiC,eAAeE,qBAAqBiE,QACvC,gBACAoG,EAAW0J,GAAI7P,cAUrB4rM,GAA4BxrM,uBAC9B,SAACyrM,GACGJ,EACI,CAACI,GACD1iK,MAGR,CAACsiK,EAAqBtiK,KAOpBgiK,GAAyB/qM,uBAAY,SAACyP,GACxC6sG,EAA4B,CACxB7+D,WAAY,gBACZ/E,YACI,uEACJmF,UAAW,kBAAM2tJ,GAA0B/7L,QAEhD,CAAC+7L,GAA2BlvF,IAEzBy/B,GACFliI,GACAA,EAAYqI,OACZssC,GACAA,EAAoB7rC,OAAS9I,EAAYqI,MAAMS,OAE7C45H,GAA4Bv8I,uBAC9B,SAAC2a,GACG,IAAM0I,EACDxJ,GACGA,EAAYqI,MAAMjR,KACd,SAACmS,GAAD,OAAgCA,EAAK3T,OAE5C,GACLgL,EACI4I,EACA1I,EACAohI,MAGR,CACIliI,EACAkiI,GACAthI,IAWF47I,GAAmB/vI,eAEnBolL,GACFtoD,GACI2hD,EACA18I,EACA4xB,EACA,CACI7hB,WAAY6oF,GACZ5oF,eAAgBjP,EAChBsN,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAO,EACPC,OAAM,iBAAEkX,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,aAAf,QAAwB,IAElC5b,gBAAgB,GAEpBgpB,UAAW,wBAGnB0gB,IAGF4xH,GAAY,yCAAG,qCAAA9mL,EAAA,0DACbmD,IAAkB1K,EADL,gCAEuBsuL,GAChCtuL,EACA3D,KAAqBC,4BACrBR,KAAqBK,YAH+B,aAAC,gBAIhD1V,IAJ+C,IAIjC4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GACJ,OAAO8yJ,GACHv6I,EACAb,EACA1X,MAZK,gBAELojB,EAFK,EAELA,kBAcFg+H,EAAgB8S,GAAiBjxI,GAEjC6jL,EAAwB1lD,EAAcpgI,QACxC,SAAAtU,GAAC,OACG0W,EAAkB7D,SAAS7S,IAC3B0W,EAAkB7D,UAAU7S,MAE9Bq6L,EAAyB9jL,EAAejC,QAC1C,SAAAtU,GAAC,OAAIA,EAAI,IAAM0W,EAAkB7D,SAAS7S,MAG9C68L,GACI,CACI/iJ,WAAY,aACZ1jD,UAAWyV,GAEfwuL,EACAD,GAjCS,2CAAH,qDAsCZlmM,GAAU5B,GAAa4B,QACvBi5I,GAASlC,GAAW,OAAQ/2I,GAASglC,IACrCohK,GAAWrvD,GAAW,SAAU/2I,GAASglC,IACzC4jK,GAAe7xD,GAAW,gBAAiB/2I,GAASglC,IACpD6jK,GAAgB9xD,GAAW,aAAc/2I,GAASglC,IAClDuhK,GAAoB7B,GAAU,SAAUvgK,IAWxCw1G,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBkmL,GAAiB,SAACxnM,GACpBymM,EAAoBzmM,IAElBynM,GAAe,SAACznM,GAClB0mM,GAAiB1mM,IAIf0+F,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eACIpF,GAAyBzzI,MACX,OAAbglM,SAAa,IAAbA,QAAA,EAAAA,GAAexjL,SAAU,GAC9B4jF,YAAuB,OAAX1sF,QAAW,IAAXA,OAAA,EAAAA,EAAaqI,MAAMS,SAAU,IAGvCqoI,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAei/B,KACnC,CAACA,EAAqBw6F,IAQpBzS,GAAwBv2I,uBAC1B,SAACsF,GACQA,GAELkjB,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYE,aAAamD,QAC7C,gBACA2F,EAAa1F,eAIzB,CAACgoB,IAGL0L,qBAAU,WACFuoH,EAAY,GACZpqI,YAAW,WACPi3B,GAAUozG,KACX,OAGR,CAACD,IAEJwrD,IAAiB,WACblmM,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,EACtB1yF,EAAkBjoD,MACnB,CAACioD,EAAmBjoD,KAEvBmyB,qBAAU,WACFg4K,GAAoBviK,OACzB,CAACuiK,EAAoBviK,GAAqBg+D,IAE7CzzE,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,YAEiB,OAAnBk7B,QAAmB,IAAnBA,OAAA,EAAAA,EAAqB7rC,SACrB6rC,EAAoB7rC,UAApB,OAA+B9I,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAawvC,QAE5CmyF,GAAe,KAEpB,QAAC3hI,QAAD,IAACA,OAAD,EAACA,EAAawvC,MAAOmF,IAExBl7B,qBAAU,WACN,IAAMs0I,EAAgB/tJ,EAChBA,EAAYqI,MAAMjR,KAAI,SAAAlL,GAAU,OAAIggB,OAAOhgB,EAAW0J,OACtD,GACAm6L,EAAejjL,aACjBjM,EACAktJ,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtClI,EAAiCmvL,GAAc,KAEpD,CAAClvL,EAAuBb,EAAaY,IAExC,IAAMuuL,GAAuBhkM,cAEvBiwJ,GAA6BhwI,eAE7B6kL,GAAgCznD,GAClC0iD,EACA18I,EACA8uB,IAiDJ7jD,qBAAU,WACN,OAAO,kBAAM7Y,EAAiC,IAAI,GAAO,MAE1D,IAEH6Y,qBAAU,WACN7Y,EAAiC,IAAI,GAAO,KAC7C,CAACZ,EAAaY,IAEjB6Y,qBAAU,WACNg2K,GAAkBnD,MACnB,CAACA,GAAemD,KAEnBh2K,qBAAU,WACNgoH,GAAc,CAAC7mI,KAAgB8oH,qBAChC,CAAC+d,KAEJhoH,qBAAU,WACN7Y,EAAiC,IAAI,GAAO,GAC5C+gI,GAAe,KAChB,CAAC1zH,EAASukC,SAAU5xC,IAQvB,IA0CMsiI,KACAvuF,KAAyBA,EAAoB7rC,OAE7Cq6H,IACDnjI,GAAgBA,GAAeA,EAAYqI,MAAMS,OAAS,EAsCzDs6H,GAAuBj9I,uBACzB,SAACuE,EAAiBsnD,GACd,IAAMggJ,EACFhyL,GACAA,EAAYqI,MAAMqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOo8C,EAAIp8C,MAE9C2jC,kBAAQy4J,IACTxD,EACI9jM,EACA,CACIqkD,WAAYijJ,EACZljJ,WAAY,cAEhBwuB,MAIZ,CAACkxH,EAAuBxuL,EAAas9D,KAGnC20H,GtDzBH,WACH,IAAM7H,EAAsBn+L,cACtBkoL,EAAsBf,KACtB8J,EAAuBxxL,eACvB2+L,EAA0B1+L,cAQ1BumM,EAA6B/rM,sBAAW,yCAC1C,WAAOyoD,EAA4BujJ,GAAnC,kBAAA/pL,EAAA,yDACU2rK,EADV,OACgCnlI,QADhC,IACgCA,OADhC,EACgCA,EAAYh5C,GAEpCw8L,EAA2B,IAK3Bre,EARR,gCAScmJ,EAAqBiV,GAAqB1wK,MAC5C,SAACgT,GACG29J,EAA2B,CACvBt7L,QAAS29B,EACThpC,aAAcsoL,MAblC,gCAmBW,IAAIjxJ,SAAQ,SAAAo7B,GACftmD,YAAW,WACPsmD,EAAQ,CAACk0I,MACV,OAtBX,2CAD0C,wDA0B1C,CAAClV,IAQCqN,EAAgCpkM,sBAAW,yCAC7C,WACIyoD,GADJ,0BAAAxmC,EAAA,4DAMyD,OAAVwmC,QAAU,IAAVA,OAAA,EAAAA,EAAa,KAAM,GANlE,IAMY93C,eANZ,MAMsB,GANtB,MAM0BrL,oBAN1B,MAMyC,EANzC,EAQS8tC,kBAAQziC,GARjB,uBAScwoL,EATd,OASkCxoL,QATlC,IASkCA,OATlC,EASkCA,EAASM,KAAI,SAAAmS,GAAI,sBAAK,CAC5CitD,YAAajtD,EAAKpY,KAClB3E,WAAU,oBAAE+c,EAAKy9B,gBAAP,aAAE,EAAepxC,UAAjB,QAAuB,KACjCxO,YAAW,oBAAEmiB,EAAKu+B,iBAAP,aAAE,EAAgBlyC,UAAlB,QAAwB,KACnC4kL,aACkB,cAAdjxK,EAAKpY,KACC,KADN,UAEMoY,EAAKixK,oBAFX,QAE2B,KAC/B3nH,SAAQ,UAAEtpD,EAAKspD,gBAAP,QAAmB,SAjBvC,kBAoBew3H,EACH5+L,EACA6zL,IAtBZ,2CAD6C,sDA2B7C,CAAC+K,IASCI,EAAiCtkM,uBACnC,SACIi+B,EACAs6B,GAEA,IAAM2rF,EAAqC,CACvCprF,WAAY,CACRt3D,OAAQumK,iBAAO9pI,GAAU,SAAAxuB,GAAE,OAAIA,KAC/BizI,SAAU,GACV/5F,WAAY,cAEhB8N,UAAW,SACXwC,mBAAoB,YAGxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY/gB,KACZghB,eAAgB21H,EAChB11H,sBACI4rF,MAGZ,CAAC8pC,IASCuW,EAAkCvkM,uBACpC,SACIgsM,EACAzzI,GAEA,IAAM2zI,EAA8B,CAChCpzI,WAAY,CACRrQ,WAAY,GACZujJ,sBACAt1I,aAAc,GAElBD,UAAW,eACXwC,mBAAoB,cAWxBV,EAAgB9wC,KAAK,CACjB2wC,WAAY7gB,KACZ8gB,eAAgB0zI,EAChBzzI,sBAAuB4zI,EACvBx1I,aAAc,EACd6B,gBAAiB,CACb,CACIH,WAAY5gB,KACZ6gB,eAAgB+rI,EAChB9rI,sBAjB2B,CACnCQ,WAAY,CACRrQ,WAAY,IAEhBgO,UAAW,aACXwC,mBAAoB,cAaZvC,aAAc,UAK9B,CAAC0tI,EAA+B2H,IAOpC,OAAO/rM,uBACH,SAAC2kM,GAA0C,IAEnCqH,EAOArH,EAPAqH,oBACAvoM,EAMAkhM,EANAlhM,KACAi1C,EAKAisJ,EALAjsJ,YACAg8I,EAIAiQ,EAJAjQ,SACAz2J,EAGA0mK,EAHA1mK,SACAu2J,EAEAmQ,EAFAnQ,cACAC,EACAkQ,EADAlQ,eAGAt9H,EAA+C,CAC/CiB,WAAY1gB,KACZ2gB,eAAgB4rI,EAChBvtI,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR/yD,WAAY,CAAEtC,OAAMi1C,cAAag8I,YACjCh+H,aAAc,GAElBD,UAAW,iBAIb8B,EAAsD,GAe5D,OAbKnlB,kBAAQnV,IACTqmK,EAA+BrmK,EAAUs6B,IAGzCi8H,EAAgB,GAAKC,EAAiB,IACtC8P,EACIyH,EACAzzI,GAIE,6BAAQpB,GAAe,CAAEoB,sBAIvC,CACI0rI,EACAM,EACAD,IsDjLJ6H,GAEEnC,GACFra,GACI,YACA,cACAx4G,IAQFi1H,GAA4BpsM,uBAC9B,SAAC+F,GAAsC,IAAD,QAC5BsmM,EAAmC,CACrCL,oBAAmB,UAAEjmM,EAAW0J,UAAb,QAAmB,EACtChM,KAAMy9I,GAAyBn7I,EAAWtC,MAC1Ci1C,YAAa3yC,EAAW2yC,YACxBg8I,SAAQ,iBAAE3uL,QAAF,IAAEA,GAAF,UAAEA,EAAYmyL,cAAd,aAAE,EAAoBzoL,UAAtB,QAA4B,EACpCwuB,SAAQ,iBAAEl4B,QAAF,IAAEA,OAAF,EAAEA,EAAYvE,cAAd,QAAwB,GAChCgzL,cAAezuL,EAAWyuL,cAC1BC,eAAgB1uL,EAAW0uL,gBAGzB6X,EACFR,GAAsCO,IAEzCj5J,kBAAQk5J,IACLtC,GAAkC,CAC9BsC,MAGZ,CACItC,GACA8B,KAIR,OACI,eAAC,GAAD,CACIxyE,SAAS,UACTsC,KAAM,cAAC,GAAD,IACNwuE,eAAc,OAAC57I,QAAD,IAACA,OAAD,EAACA,EAAqB7rC,QACpC27G,cAAc,oBACdpqH,SAAS,UALb,UAOKH,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAE0X,QAAF,IAAEA,OAAF,EAAEA,EAAaqI,MACnBtJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CwqF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,qBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,aAAf,QAAwB,EAClCygB,aAAcgxE,GACd74C,aAxKK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IAwKMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,kBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,wBAEd23F,8BACKz4D,kBAAQob,KAAyBpb,kBAAQv5B,GAC9CiyF,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEvrB,QAAF,IAAEA,OAAF,EAAEA,EAAqB7rC,OACrCR,WAAU,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,MACzBygB,aAAcgxE,GACdluC,iBAnLK,WACrBnyF,EAAiC,IAAI,GAAO,GAC5C+gI,GAAe,IAkLCjjH,YA3KA,WAChB,IAAMlV,EACDxJ,GACGA,EAAYqI,MAAMjR,KACd,SAACmS,GAAD,OAAgCA,EAAK3T,OAE5C,GACLgL,EACI4I,GACA,EACA04H,IAEJP,GAAe,IAgKC3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNomG,wBAlPQ,WACxBttF,GAAeA,EAAYqI,OAASxH,GACpCsuL,GACItuL,EACA3D,KAAqBC,4BACrBR,KAAqBK,YAHL,aAAC,gBAIZ1V,IAJW,IAIG4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GAAe,IACXojB,EAAsB0vI,GAC1Bv6I,EACAb,EACA1X,GAHIojB,kBAMRoY,EAAsBpY,OAoOVuiF,wBACIkjD,GAAYp7H,oBACRyvB,KAAkBgB,eAEhB,CAAC5rC,KAAgB+qC,0BACjB,GACV+pD,uBACIyhD,GAAYrwG,qBACR0E,KAAkBgB,eAE1B8iD,qBAAsB4lG,GACtB9uH,YAAaA,EACb93D,WAAU,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,QAGjC2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIslK,iBACIrsL,EAAcqsL,EAAmB,GAErCC,cAAeA,GACfC,mBAAoBmD,GACpBlD,iBAAkBmD,GAClBp0D,kBAAmBx8H,GAAkB,GACrCy8H,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAlBtB,SAoBK,SAACxxB,EAAD,SAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aACI76H,EACMssL,GAAcxjL,SACb,UAAAxhB,GAAa0kB,gBAAb,eACKlD,SAAU,GAChB,EAEV/O,SAAU6sF,GAAY45C,eACtBnmI,SAAS,yBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAA0C,KAApB,OAAX8F,QAAW,IAAXA,GAAA,UAAAA,EAAaqI,aAAb,eAAoBS,QACpC+9E,iBAAkB,CACd7sF,KAAM82L,GACNpgM,KAAM,sBACN2J,SAAU,2BAEdysF,uBAAwB,CACpBh4C,WAAY,eACZz0C,SAAU,iCAEd0sF,uBAAwB,CACpB1sF,SAAU,qCAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YA5OU,SAAC/wB,GAC3BsyF,GAA0BtyF,EAAM5E,OAAO1qC,SACvC6gI,GAAe,IA2OCtnI,SAAU,wCAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,eACP1F,MAAO,IACJutI,IAJF,IAKDpoI,SAAU6sF,GAAY85C,eACtBrmI,SAAU,sCANT,2BASDC,MAAO,SACP1F,MAAO,IACJ06L,IAXF,IAYDv1L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,uCAbT,2BAgBDC,MAAO,UACP1F,MAAO,IACJk9L,IAlBF,IAmBD/3L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,wCApBT,2BAuBDC,MAAO,eACP1F,MAAO,IACJm9L,IAzBF,IA0BDh4L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,qCAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAIfixF,UAAW,CACPE,WAAY6mG,GACZ3mG,kBA3PM,SAAC71C,EAAY4B,GACnC2vF,GAAe,GA3UW,SAACnmH,EAAQw2B,GACnCx2B,EAAEC,kBACIu2B,EAAIp8C,IACN87L,EAAqC1/I,EAAIp8C,IAyU7C8tI,CAAsBtzF,EAAO4B,IA0Pbg0C,aAvQM,SAACh0C,GAAD,QACpBnxC,KACAmxC,EAAIp8C,IACNiL,EAAsBgH,SAASmqC,EAAIp8C,KAqQnBswF,gBAnPS,SAACl0C,GAC1B,OAAO4vF,KAAU,OAAK5vF,QAAL,IAAKA,OAAL,EAAKA,EAAG,KAmPT6yC,kBAAmB,SAAC7yC,GAAD,YAAgC,CAC/CjzC,eAAc,iBAAEizC,QAAF,IAAEA,OAAF,EAAEA,EAAKrqD,cAAP,QAAiB,GAC/Bo7E,kBAAmB,CACfnoE,KAAgB+oI,0BAEpB9gE,cAAe,SAACn4E,GAAD,OACX04I,GAAqB14I,EAASsnD,MAEtC33C,SAAU,4BAEVyrF,MAAO,CACH,CACIR,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB34C,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SAAClyC,GAAD,cACTA,QADS,IACTA,OADS,EACTA,EAAKpoD,MACTyQ,SAAU,oCAGlB,CACIirF,UAAW,cACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjBrU,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAK9pD,SACXq9F,WAAY,CACRb,mBAAoB,SAChB1yC,GADgB,MAEd,CACF9pD,OAAM,OAAE8pD,QAAF,IAAEA,OAAF,EAAEA,EAAK9pD,OACbuM,UAAW0vE,EAAQ+5D,qBACnB7jI,SACI,qCAER6pF,YAAa,SAAClyC,GAAD,OACT7M,aAAsB,OAAC6M,QAAD,IAACA,OAAD,EAACA,EAAK9pD,WAIxC,CACIo9F,UAAW,aACXj/B,oBAAqB,SACjBrU,GADiB,QAGjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAK2oI,kBAAiB,OAAC3oI,QAAD,IAACA,OAAD,EAACA,EAAK4oI,iBACjCr1F,WAAY,CACRrB,YAAa,SACTlyC,GADS,OAGT,qCACKA,EAAI2oI,cAAJ,UAES3oI,EAAI2oI,cAFb,YAGSnuI,aACAwF,EAAI2oI,cACJ,WACA,cAEJ,OACH3oI,EAAI2oI,iBACD3oI,EAAI4oI,gBACF,cAAC0W,GAAD,IAEPt/I,EAAI4oI,eAAJ,UAES5oI,EAAI4oI,eAFb,YAGSpuI,aACAwF,EAAI4oI,eACJ,YACA,eAEJ,SAGdvgL,SACI,sCAGZ,CACIirF,UAAW,aACXj/B,oBAAqB,SACjBrU,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAK4/H,YACXrsF,WAAY,CACRrB,YAAa,SAAClyC,GAAD,OACTl6B,aAAU,OAACk6B,QAAD,IAACA,OAAD,EAACA,EAAK4/H,YACpBv3K,SAAU,mCAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACf7yC,GADe,YAEb,CACF17C,KAAMsrI,IAAe5vF,EAAIp8C,GACzBs7C,WAAY,WA5lBrB,IAAC4wB,KA6lB+B9vB,EAAIp8C,KA1lBvDisI,EADAD,IAAe9/D,EACD,KAEAA,IAylBc/iE,eAAc,UAAEizC,EAAIrqD,cAAN,QAAgB,GAC9B0S,SACI,uCAIhB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrB/yC,GADqB,OAGrB,cAAC,GAAD,CACI9lD,WAAY8lD,EACZm9F,cAAeA,EACf6hD,oBACIA,EAEJpE,eAAgBA,GAChBqE,qBACIrE,GAEJuE,6BACIA,GAEJD,uBACIA,GAEJE,sBACImB,GAEJlB,oBACIA,EAEJ30D,sBACIA,GAEJywD,sBAAuB,SACnB1U,EACAxvC,GAFmB,aA1gB1B,SACjCwvC,EACAxvC,EACAx9I,GAEAwkM,GACI,CACInhJ,WAAY,aACZ+5F,SAAUp9I,GAEdgtL,EACAxvC,GAmgBoCqiD,CACI7S,EACAxvC,EAFwB,iBAGxBj3F,QAHwB,IAGxBA,OAHwB,EAGxBA,EAAKp8C,UAHmB,QAGb,IAGnB+1G,YACK,OAACh3D,QAAD,IAACA,OAAD,EAACA,EAAqB7rC,sBAwExD+6D,GA1DyB,WACpC,IAAM5rE,EAAQw8C,eACR1mC,EAAUW,cACVgkL,EAAoBpmJ,eACpBqmJ,EAAoBlmJ,eACpBmmJ,EAAoBjmJ,eACpB4C,EAAoBvD,eACpBylJ,EAAqB38I,eACrBu3C,EAA6B5gD,aAAmB8D,GAEhD5nD,EAASm5B,eACTgD,EAAwBD,eACxBjjB,EACF+3B,eACE+4J,EACFvjJ,eACE++C,EAAgBhkE,eAChBs4G,EAAyBl/G,eACzB6sH,EAAgB1pG,eAEhBkP,EAAsBvgC,mBACxB,kBAAMsgC,aAA0Bz8C,KAChC,CAACA,IAGL,OACI,cAAC,KAAkBmsE,SAAnB,CACIpoE,MAAO,CAAEwL,YAAa,sBAD1B,SAGI,cAAC,GAAD,CACIgqL,oBAAqBkB,EACrBrB,oBAAqBsB,EACrB3B,oBAAqB4B,EACrB7kL,QAASA,EACTwhC,kBAAmB88C,EACnBrsF,YAAa/H,EAAM3P,KACnB4R,QAASjC,EAAMiC,QACf2G,sBAAuB5I,EAAM08C,oBAC7BA,oBAAqBA,EACrBw6F,cAAeA,EACfsiD,mBAAoBA,EAAmBnpM,KACvCyW,eAAgBpX,EAAO6iB,SACvBsZ,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvB3K,iCACIA,EAEJ8wL,qCACIA,EAEJxkG,cAAeA,EACfs0C,uBAAwBA,OCt3BzBqxD,GAzJV,SAAC,GAWC,IAAD,EAVF/qJ,EAUE,EAVFA,UACAqnG,EASE,EATFA,cACA2jD,EAQE,EARFA,iBACAlG,EAOE,EAPFA,eACAmG,EAME,EANFA,oBACAC,EAKE,EALFA,sBACAC,EAIE,EAJFA,qBACAC,EAGE,EAHFA,iBACA/F,EAEE,EAFFA,sBACAxhF,EACE,EADFA,SAEMhkH,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EACF/uI,eACEtO,EAAU0R,YAAY3R,MAP1B,EA0BwDwb,mBAExD,MA5BA,mBA0BK8zK,EA1BL,KA0B4BC,EA1B5B,KA8BI5nK,EAAanK,iBAAO,MAE1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CACIwlF,YAAa,IACbU,SAAUA,EACVtxG,SAAS,+BAHb,UAKK80I,EAAc/oG,QAAQ0B,IACnB,cAAC,GAAD,CACIvtC,QAAS,SAAAihB,GACLA,EAAEC,kBACFmxK,EAAe9kJ,IAEnBztC,SAAS,wBALb,kBAUH80I,EAAczpG,gBAAgBoC,MACzBh+B,EAAWxhB,KAAK+f,MAAMS,QACpB,cAAC,GAAD,CACIvO,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyBvlJ,EAAUlyC,IA/ChC,WAC/B,IAAM+W,GAA4B,OAATm7B,QAAS,IAATA,OAAA,EAAAA,EAAWngD,SAAU,GACxC+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBowH,IAyC4BwxD,IAEJjzL,SAAS,iCANb,2BAWPiC,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OACzB,cAAC,GAAD,CACI2Q,QAAS,SAAAihB,GACLA,EAAEC,kBACFs3K,EAAoBjrJ,IAExBztC,SAAS,wBALb,kBAUH80I,EAAcnpG,WAAW8B,IACtB,cAAC,GAAD,CACIvtC,QAAS,SAAAihB,GACLA,EAAEC,kBACFq3K,EAAiB,CAAChrJ,EAAUlyC,MAEhCyE,SAAS,2BALb,qBAUH80I,EAAcjpG,UAAU4B,IACrB,cAAC,GAAD,CACI2vB,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,mBACO,OAATqsB,QAAS,IAATA,OAAA,EAAAA,EAAWlyC,KACPo9L,EAAsBlrJ,EAAUlyC,KAExCyE,SAAS,0BAPb,oBAYH80I,EAAcvpG,aAAakC,IACxB,cAAC,GAAD,CACIvtC,QAAS,SAAAihB,GACLy3K,EAAqBnrJ,IAEzBztC,SAAS,6BAJb,uBASH80I,EAAcrpG,WAAWgC,IACtB,cAAC,GAAD,CACI2vB,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFy3K,EAAiB,CAACprJ,EAAUlyC,MAEhCyE,SAAS,2BANb,0BAaZ,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0BtlJ,EAAUlyC,GAC1C8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eAhHiB,SAACxvH,GAC9B,IAAMysK,EAAgB5rK,aAAwBb,EAAUrkB,EAAOi8G,OACzDqlC,EAAkBv8H,aAAuBV,EAAUrkB,EAAOi8G,OAEhEupF,EAAsB1U,EAAexvC,IA6GzBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,UCtLnB/wE,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,sBCqFX2iE,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GACjB6sD,GAAuB,CAAC1oJ,KAAe77C,OAAQ67C,KAAeJ,OAE9DmuJ,GA2BD,SAAC,GAoBC,IAAD,MAnBFpgL,EAmBE,EAnBFA,WACAqgL,EAkBE,EAlBFA,kBACArlL,EAiBE,EAjBFA,QACAslL,EAgBE,EAhBFA,mBACAC,EAeE,EAfFA,mBACAC,EAcE,EAdFA,mBACAC,EAaE,EAbFA,iBACAz0L,EAYE,EAZFA,eACA8U,EAWE,EAXFA,qBACA2hC,EAUE,EAVFA,mBACA25F,EASE,EATFA,cACArrH,EAQE,EARFA,sBACAvY,EAOE,EAPFA,eACAqI,EAME,EANFA,gCACA6/K,EAKE,EALFA,oCACAvmG,EAIE,EAJFA,cACAhzF,EAGE,EAHFA,QACAsnI,EAEE,EAFFA,uBACA93I,EACE,EADFA,UAEM+4G,EAA8BvzF,eAC9Bq/K,EAAsBj/I,eACtBokJ,EAA2BhsM,cAC3BisM,EAA6B/rM,cAC7B4mM,EAAwBjgJ,eAL5B,EAO8Cj1B,mBAAmB,CAC/D,SACA,UATF,mBAOK+yK,EAPL,KAOuBsC,EAPvB,OAWwCr1K,mBAAmB,CACzD,SACA,UAbF,mBAWKgzK,EAXL,KAWoBsC,EAXpB,OAgBwCt1K,mBAAS,IAAIhD,MAhBrD,mBAgBK+mD,EAhBL,KAgBoBqkE,EAhBpB,OAiBoCpoH,oBAAkB,GAjBtD,mBAiBK8mD,EAjBL,KAiBkBuhE,EAjBlB,OAmBkCroH,mBAChC,MApBF,mBAmBKsoH,EAnBL,KAmBiBC,GAnBjB,KAuBIJ,GAAgB5I,KAChB10D,GAAUb,KAEVr1D,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEA/zG,GAAoC,CACtClkC,WAAY,GACZ6V,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO8xL,KACpC9hL,SAAUjN,EACV7V,QAAS,CACLC,MAAO,aACPC,KAAK,GAETP,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GA7CjB,GAwDEkkB,aAAqBC,IAPrB5lC,GAjDF,GAiDEA,aACAg4B,GAlDF,GAkDEA,cACA4O,GAnDF,GAmDEA,WACAE,GApDF,GAoDEA,YACAS,GArDF,GAqDEA,UACAK,GAtDF,GAsDEA,oBACA7B,GAvDF,GAuDEA,UAGE60G,GACFnvH,GACAA,EAAW1K,OACXwL,GACAA,EAAqB/K,OAASiK,EAAW1K,MAAMS,OAE7C8qL,GAA2BztM,uBAC7B,SAAC2a,GACG,IAAM0I,EACDuJ,GACGA,EAAW1K,MAAMjR,KAAI,SAACmS,GAAD,OACjB2C,OAAO3C,EAAK3T,QAEnB,GACLge,EACIpK,EACA1I,EACAohI,MAGR,CACInvH,EACAmvH,GACAtuH,IAUF0pD,GAAcn3E,uBAAY,WAC5BmB,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBuxD,EAAiBlsM,IACjBo6I,EAAiB,IAAIprH,MACrBqrH,GAAe,GACf/tH,EAAgC,IAAI,GAAO,KAC5C,CACCquH,GACAuxD,EACAlsM,GACAssB,IAGE4oI,GAAmB/vI,eAEnBonL,GACFtqD,GACImqD,EACAC,EACAvzH,EACA,CACI7hB,WAAY6oF,GACZ5oF,eAAgBg1I,EAChB32I,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAO,EACPC,OAAM,UAAEojB,OAAM,OAAC6G,QAAD,IAACA,OAAD,EAACA,EAAYy8B,cAArB,QAA+B,IAEzC5b,gBAAgB,GAEpBgpB,UAAW,wBAGnB0gB,IAGF4xH,GAAY,yCAAG,qCAAA9mL,EAAA,0DACbmD,IAAkBsI,EADL,gCAEuBs7K,GAChCt7K,EACA3W,KAAqBG,0BACrBV,KAAqBE,UAH+B,aAAC,gBAIhDvV,IAJ+C,IAIjC4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GACJ,OAAO8yJ,GACHvnI,EACAd,EACAzqB,MAZK,gBAELojB,EAFK,EAELA,kBAcFg+H,EAAgB8S,GAAiBjxI,GAEjC6jL,EAAwB1lD,EAAcpgI,QACxC,SAAAtU,GAAC,OACG0W,EAAkB7D,SAAS7S,IAC3B0W,EAAkB7D,UAAU7S,MAE9Bq6L,EAAyB9jL,EAAejC,QAC1C,SAAAtU,GAAC,OAAIA,EAAI,IAAM0W,EAAkB7D,SAAS7S,MAG9C6+L,GACI,CACI/kJ,WAAY,YACZ1jD,UAAWyoB,GAEfw7K,EACAD,GAjCS,2CAAH,qDAsCZlmM,GAAU5B,GAAa4B,QACvB4qM,GAAS7zD,GAAW,QAAS/2I,GAASglC,IACtC6lK,GAAW9zD,GAAW,SAAU/2I,GAASglC,IACzC8lK,GAAc/zD,GAAW,aAAc/2I,GAASglC,IAChDuhK,GAAoB7B,GAAU,SAAUvgK,IAWxCw1G,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBkmL,GAAiB,SAACxnM,GACpBymM,EAAoBzmM,IAElBynM,GAAe,SAACznM,GAClB0mM,EAAiB1mM,IAIf0+F,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eACIpF,GAAyBzzI,MACX,OAAbglM,QAAa,IAAbA,OAAA,EAAAA,EAAexjL,SAAU,GAC9B4jF,YAAsB,OAAV35E,QAAU,IAAVA,OAAA,EAAAA,EAAY1K,MAAMS,SAAU,IAGtCqoI,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAe8/B,KACnC,CAACA,EAAoB25F,IAGzB11H,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAGR,CAACmzG,KAEJwrD,IAAiB,WACblmM,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtB36I,GAAaoC,UAAYA,EACzB8pM,EAAiBlsM,MAClB,CAACksM,EAAkBlsM,KAEtBmyB,qBAAU,WACN7F,EAAgC,IAAI,GAAO,GAC3C+tH,GAAe,KAChB,CAAC1zH,GAASukC,SAAU5+B,IAEvB6F,qBAAU,WACF25K,GAAmBlkK,OACxB,CAACkkK,EAAmBlkK,KAEvBzV,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,WACN,OAAO,kBAAM7F,EAAgC,IAAI,GAAO,MAEzD,IAEH6F,qBAAU,WACN7F,EAAgC,IAAI,GAAO,KAC5C,CAACb,EAAYa,IAEhB6F,qBAAU,YAEgB,OAAlB+7B,QAAkB,IAAlBA,OAAA,EAAAA,EAAoB1sC,UAApB,OACAiK,QADA,IACAA,OADA,EACAA,EAAYy8B,QACZgG,EAAmB1sC,WAAW,OAACiK,QAAD,IAACA,OAAD,EAACA,EAAYy8B,QAE3CmyF,GAAe,KAEpB,QAAC5uH,QAAD,IAACA,OAAD,EAACA,EAAYy8B,MAAOgG,IAEvB,IAAMo3I,GAAiB,SAAC75K,GACpBa,EAAgC,IAAI,GAAO,GAC3CjF,YACIZ,EACAruB,IAAO6C,iBAAiBF,WAAWF,OAAO2D,QACtC,eACAitB,EAAWnd,GAAI7P,cASrBkuM,GAAiC9tM,uBAAY,WAC/CooM,IACAr/J,OACD,CAACq/J,EAAqBr/J,KAOnBglK,GAA2B/tM,uBAC7B,SAACguM,GACGd,EACI,CAACc,GACDF,MAGR,CAACZ,EAAoBY,KAQnBjB,GAAwB7sM,uBAC1B,SAACyP,GACG6sG,EAA4B,CACxB7+D,WAAY,gBACZ/E,YACI,uEACJmF,UAAW,kBAAMkwJ,GAAyBt+L,QAGlD,CAACs+L,GAA0BzxF,IAG/BhpF,qBAAU,WACN,IAAMs0I,EAAgBh7I,EAChBA,EAAW1K,MAAMjR,KAAI,SAAA0wC,GAAS,OAAI57B,OAAO47B,EAAUlyC,OACnD,GACAm6L,EAAejjL,aACjB+G,EACAk6I,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtC8K,EAAgCm8K,GAAc,KAEnD,CAACl8K,EAAsBd,EAAYa,IAEtC,IAAMu7K,GAAuBhkM,cAEvBiwJ,GAA6BhwI,eA0BnCqO,qBAAU,WACNg2K,GAAkBnD,KACnB,CAACA,EAAemD,KAEnBh2K,qBAAU,WACNgoH,GAAc,CAAC7mI,KAAgBmpH,mBAChC,CAAC0d,KAQJ,IAsCMyB,KACArvH,KAA0BA,EAAqB/K,OAE/Cq6H,IACDpwH,GAAeA,GAAcA,EAAW1K,MAAMS,OAAS,EA0DtDmnL,GAAgCznD,GAClCkrD,EACAC,EACAr2H,IAyBE82H,GACFnf,KAEEkb,GACFra,GACI,YACA,YACAx4G,IAQF+2H,GAA2BluM,uBAC7B,SAAC2hD,GAAmC,IAAD,QACzBwsJ,EAAuC,CACzCh6L,MAAO+sI,GAAyBv/F,EAAUxtC,OAC1CukC,YAAaiJ,EAAUjJ,YACvBC,iBAAgB,iBAAEgJ,QAAF,IAAEA,OAAF,EAAEA,EAAWhJ,wBAAb,QAAiC,KACjD12C,MAAK,iBAAE0/C,QAAF,IAAEA,GAAF,UAAEA,EAAW4sH,cAAb,aAAE,EAAmBtsK,aAArB,QAA8B,GACnCg8B,SAAQ,iBAAE0jB,QAAF,IAAEA,OAAF,EAAEA,EAAWngD,cAAb,QAAuB,GAC/Bo3C,SAAU+I,EAAU/I,UAGlBw1J,EACFH,GAAqCE,IAExC/6J,kBAAQg7J,IACLpE,GAAkC,CAC9BoE,MAGZ,CACIpE,GACAiE,KAIR,OACI,eAAC,GAAD,CACI30E,SAAS,UACTsC,KAAM,cAAC,GAAD,IACNwuE,eAAc,OAAC/6I,QAAD,IAACA,OAAD,EAACA,EAAoB1sC,QACnC27G,cAAc,oBACdpqH,SAAS,UALb,UAOKH,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEyqB,QAAF,IAAEA,OAAF,EAAEA,EAAY1K,MAClB+qF,SAAUr0F,KAAoBA,EAAe+J,OAC7C/J,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,qBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEyK,QAAF,IAAEA,OAAF,EAAEA,EAAYy8B,aAAd,QAAuB,EACjCygB,aAAcgxE,GACd74C,aA/LK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IA+LMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,kBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,wBAEd23F,8BACKz4D,kBAAQic,KAAwBjc,kBAAQxmB,GAC7Ck/E,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAE1qB,QAAF,IAAEA,OAAF,EAAEA,EAAoB1sC,OACpCR,WAAU,OAAEyK,QAAF,IAAEA,OAAF,EAAEA,EAAYy8B,MACxBygB,aAAcgxE,GACdluC,iBA1MK,WACrBn/E,EAAgC,IAAI,GAAO,GAC3C+tH,GAAe,IAyMCjjH,YAlMA,WAChB,IAAMlV,EACDuJ,GACGA,EAAW1K,MAAMjR,KAAI,SAACmS,GAAD,OACjB2C,OAAO3C,EAAK3T,QAEnB,GACLge,EAAgCpK,GAAK,EAAM04H,IAC3CP,GAAe,IA2LC3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACN+mG,wBACIkjD,GAAYp7H,oBACR6xB,KAAiBpB,eAEf,CAAC5rC,KAAgBotC,wBACjB,GACV0nD,uBACIyhD,GAAYrwG,qBACR8G,KAAiBpB,eAEzB8mD,wBArQQ,WACxBv6E,GAAcA,EAAW1K,OAASwL,GAClCs7K,GACIt7K,EACA3W,KAAqBG,0BACrBV,KAAqBE,UAHL,aAAC,gBAIZvV,IAJW,IAIG4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GAAe,IACXojB,EAAsB0vI,GAC1BvnI,EACAd,EACAzqB,GAHIojB,kBAMRoY,EAAsBpY,OAuPV49E,qBAAsB4lG,GACtB9uH,YAAaA,EACb93D,WAAU,OAAEyK,QAAF,IAAEA,OAAF,EAAEA,EAAYy8B,QAGhC2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIslK,iBACIt5K,EAAas5K,EAAmB,GAEpCC,cAAeA,EACfC,mBAAoBmD,GACpBlD,iBAAkBmD,GAClBp0D,kBAAmBx8H,GAAkB,GACrCy8H,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAlBtB,SAoBK,SAACxxB,EAAD,SAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aACI9nH,EACMu5K,EAAcxjL,SACb,UAAAxhB,GAAa0kB,gBAAb,eACKlD,SAAU,GAChB,EAEV/O,SAAU6sF,GAAY45C,eACtBnmI,SAAS,yBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAyC,KAApB,OAAV6Y,QAAU,IAAVA,GAAA,UAAAA,EAAY1K,aAAZ,eAAmBS,QACnC+9E,iBAAkB,CACd7sF,KAAMwhH,GACN9qH,KAAM,oBACN2J,SAAU,yBAEdysF,uBAAwB,CACpBh4C,WAAY,aACZz0C,SAAU,+BAEd0sF,uBAAwB,CACpB1sF,SAAU,mCAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YAvQU,SAAC/wB,GAC3BwjJ,GAAyBxjJ,EAAM5E,OAAO1qC,SACtC6gI,GAAe,IAsQCtnI,SAAU,sCAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,aACP1F,MAAO,IACJk/L,IAJF,IAKD/5L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,oCANT,2BASDC,MAAO,SACP1F,MAAO,IACJm/L,IAXF,IAYDh6L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,qCAbT,2BAgBDC,MAAO,eACP1F,MAAO,IACJo/L,IAlBF,IAmBDj6L,SAAU6sF,GAAY85C,eACtBrmI,SAAU,mCAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAAY6mG,GACZ3mG,kBA9QM,SAAC71C,EAAYtI,GACnC65F,GAAe,GA7VU,SAACnmH,EAAQssB,GAClCtsB,EAAEC,kBACIqsB,EAAUlyC,IACZ69L,EAAoCvnL,OAAO47B,EAAUlyC,KA2VzD4+L,CAAqBpkJ,EAAOtI,IA6QZk+C,aA1RM,SAACl+C,GAAD,QACpBj0B,KACAi0B,EAAUlyC,IACZie,EAAqBhM,SAASigC,EAAUlyC,KAwRxBswF,gBAtQS,SAACp+C,GAC1B,OAAO85F,KAAU,OAAK95F,QAAL,IAAKA,OAAL,EAAKA,EAAS,KAsQfztC,SAAU,0BAEVwqF,kBAAmB,SAAC/8C,GAAD,YAAoC,CACnD/oC,eAAc,UAAE+oC,EAAUngD,cAAZ,QAAsB,GACpCo7E,kBAAmB,CACfnoE,KAAgB61L,wBAEpB5tH,cAAe,SAACn4E,GAAD,OApQV,SACzBA,EACAo9C,GAEA,IAAM2sJ,EAAa,OAAG1hL,QAAH,IAAGA,OAAH,EAAGA,EAAY1K,MAAMqsB,MACpC,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOkyC,EAAUlyC,MAG7B2jC,kBAAQk7J,IACTjG,EACI9jM,EACA,CACIqkD,WAAY0lJ,EACZ3lJ,WAAY,aAEhBwuB,IAsPgB8lE,CAAqB14I,EAASo9C,MAGtCg+C,MAAO,CACH,CACIR,UAAW,aACXkB,cAAeriB,GAAQ+5D,qBACvB34C,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACTp8C,GADS,cAERA,QAFQ,IAERA,OAFQ,EAERA,EAAWxtC,OAChBD,SAAU,kCAGlB,CACIirF,UAAW,cACXkB,cAAeriB,GAAQ+5D,qBACvB73E,oBAAqB,SACjBve,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAW5/C,SACjBq9F,WAAY,CACRb,mBAAoB,SAChB58C,GADgB,MAEd,CACF5/C,OAAM,OAAE4/C,QAAF,IAAEA,OAAF,EAAEA,EAAW5/C,OACnBuM,UAAW0vE,GAAQ+5D,qBACnB7jI,SACI,mCAER6pF,YAAa,SACTp8C,GADS,OAGT3C,aAAsB,OAClB2C,QADkB,IAClBA,OADkB,EAClBA,EAAW5/C,WAI3B,CACIo9F,UAAW,aACXj/B,oBAAqB,SACjBve,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAW8pI,YACjBrsF,WAAY,CACRrB,YAAa,SACTp8C,GADS,OAERhwB,aAAWgwB,EAAU8pI,YAC1Bv3K,SAAU,iCAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACf/8C,GADe,YAEb,CACFxxC,KAAMsrI,IAAe95F,EAAUlyC,GAC/Bs7C,WAAY,WAplBrB,IAAC4wB,KAslBgB51D,OAAO47B,EAAUlyC,MAnlBrDisI,GADAD,IAAe9/D,EACD,KAEAA,IAmlBc/iE,eAAc,UAAE+oC,EAAUngD,cAAZ,QAAsB,GACpC0S,SACI,qCAIhB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBj9C,GADqB,OAGrB,cAAC,GAAD,CACIA,UAAWA,EACXqnG,cAAeA,EACf2jD,iBACIS,EAEJ3G,eAAgBA,GAChBmG,oBAAqBnG,GACrBoG,sBACIA,GAEJC,qBACIoB,GAEJnB,iBACII,EAEJnG,sBAAuB,SACnB1U,EACAxvC,GAFmB,aA9T1B,SACjCwvC,EACAxvC,EACA7hJ,GAEA6oM,GACI,CACInhJ,WAAY,YACZ+5F,SAAUzhJ,GAEdqxL,EACAxvC,GAuToCyrD,CACIjc,EACAxvC,EAFwB,iBAGxBnhG,QAHwB,IAGxBA,OAHwB,EAGxBA,EAAWlyC,UAHa,QAGP,IAGzB+1G,YACK,OAACn2D,QAAD,IAACA,OAAD,EAACA,EAAoB1sC,sBA2EvD6rL,GA7DwB,WACnC,IAAM18L,EAAQq9C,eACRvnC,EAAUW,cACVkmL,EAAmBrnJ,eACnB2lJ,EAAmBzlJ,eACnBqlJ,EAAmBnlJ,eACnB6lJ,EAAmBpmJ,eACnBgmJ,EAAoB19I,eACpBm/I,EAA4BppJ,aAAmB+nJ,GAE/C7rM,EAASm5B,eACTgD,EAAwBD,eACxBjQ,EACFq6B,eACEwlJ,EACFvlJ,eACEg/C,EAAgBhkE,eAChBs4G,EAAyBl/G,eACzB6sH,EAAgBtnG,eAChB9pC,EAAU0R,YAAY3R,MAEtB03C,EAAqBphC,mBACvB,kBAAMmhC,aAAyBt9C,KAC/B,CAACA,IAGL,OACI,cAAC,KAAkBmsE,SAAnB,CACIpoE,MAAO,CAAEwL,YAAa,qBAD1B,SAGI,cAAC,GAAD,CACI6rL,mBAAoBuB,EACpBtB,mBAAoBJ,EACpBK,mBAAoBT,EACpB/kL,QAASA,EACTylL,iBAAkBqB,EAClB9hL,WAAY9a,EAAM3P,KAClB4R,QAASjC,EAAMiC,QACf2Z,qBAAsB5b,EAAMu9C,mBAC5BA,mBAAoBA,EACpB25F,cAAeA,EACfikD,kBAAmBA,EAAkB9qM,KACrCyW,eAAgBpX,EAAO6iB,SACvBsZ,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvBqI,gCACIA,EAEJ6/K,oCACIA,EAEJvmG,cAAeA,EACfs0C,uBAAwBA,EACxB93I,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,eCj+BrBorM,GAtBC,kBACZ,eAAC,IAAD,WACI,cAAC,IAAD,CACInpL,KAAMjsB,IAAO4C,QACbqkI,OAAK,EACL/jF,GAAIljD,IAAO6C,iBAAiBE,YAAYP,MAE5C,cAAC,GAAD,CACI2D,KAAMnG,IAAO6C,iBAAiBE,YAAYP,IAC1CwjG,UAAW6rG,KAEf,cAAC,GAAD,CACI1rM,KAAMnG,IAAO6C,iBAAiBC,UAAUN,IACxCwjG,UAAWqoG,KAEf,cAAC,GAAD,CACIloM,KAAMnG,IAAO6C,iBAAiBF,WAAWH,IACzCwjG,UAAWytG,SCpBjB4B,GAAiB5+L,IAAOC,IAAV,qDAId2hE,GAAc5hE,IAAOC,IAAV,4BA4oBF4+L,G,gKAzoBX,WACI,OACI,cAAC,GAAD,UACI,cAACD,GAAD,UACI,eAAC,GAAD,WACI,sDAEA,gEAEA,2GAKA,gEACA,gDACA,2IAKA,kJAMA,6CACA,gFACA,+BACI,+BACI,iDADJ,mHAIM,IACN,+BACI,uDADJ,qLAMM,IACN,+BACI,+CADJ,yQASA,+BACI,6CADJ,4FAIM,IACN,+BACI,6CADJ,wKAMA,+BACI,6CADJ,uLAMM,IACN,+BACI,6CADJ,2CAIA,+BACI,4CADJ,wGAIM,IACN,+BACI,8CADJ,+HAKM,IACN,+BACI,6CADJ,iCAIA,+BACI,0DADJ,8JAOA,+BACI,sEAEU,IAHd,mLASA,+BACI,yCADJ,yLASJ,iDACA,+QAOA,6PAOA,wNAMA,wdAYA,+CACA,wRAOA,6PAOA,8MAMA,wUASA,yCACA,4DACA,oMAMA,uiBAaA,2XAUA,sDACA,8SAQA,4RAQA,+BACI,0EACA,8NAOA,0OAOA,0VASA,8KAMA,gIAIA,4EACA,oEAEJ,gbAWA,8hBAcA,iDACA,6JAKA,iNAMA,gUAQA,4IAMA,kDACA,oEACA,oPAOA,ibAUA,iLAMA,kGAIA,8OAOA,+BACI,yJAKA,0OAOA,iKAKA,oFAIA,6KAKA,wOAQJ,qGAIA,mNAOA,uDACA,iOAMA,4IAKA,2KAMA,qDACA,mYAUA,yDACA,oJAKA,8eAYA,sKAMA,6CACA,2NAMA,6LAOA,yDACA,8WASA,guBAiBA,gUASA,uEACA,0kCAwBA,grBAgBA,6YAWA,+CACA,4PAQA,qDACA,0KAMA,+DACA,6KAMA,gEACA,8WAUA,yDACA,8CACA,gUASA,wCACA,sVASA,4DACA,0IAKA,iHAKA,uEACA,8UAQA,yQAQA,4CACA,gHAKA,6BACI,8E,GAjoBJr0F,aCNlBu0F,GAAmB9+L,IAAOC,IAAV,qDAIhB2hE,GAAc5hE,IAAOC,IAAV,4BA+/BF8+L,G,gKA5/BX,WACI,OACI,cAAC,GAAD,UACI,cAACD,GAAD,UACI,eAAC,GAAD,WACI,gDAEA,gEAEA,mPAQA,+MAOA,gEACA,gDACA,2IAKA,kJAMA,6CACA,yEACA,+BACI,+BACI,8BACI,yCADJ,sLAOA,wLAKK,OAET,+BACI,8BACI,6CADJ,uKAOA,iGAGK,OAET,+BACI,iDADJ,mHAIM,IACN,+BACI,+CADJ,yQASA,+BACI,6CADJ,4FAKA,+BACI,6CADJ,iCAIA,+BACI,6CADJ,2CAIA,+BACI,8BACI,sDADJ,yVAWA,+GAGK,OAET,+BACI,sEAEU,IAHd,kIAQA,+BACI,8BACI,mDADJ,mFAKA,qTAQK,IACL,kPAMK,OAET,+BACI,4CADJ,wGAIM,IACN,+BACI,gDADJ,gLAOA,+BACI,qDADJ,6NAOM,IACN,+BACI,kDADJ,oSASM,IACN,+BACI,8CADJ,6dAaA,+BACI,8CADJ,mXAWA,+BACI,0CADJ,iXAaJ,yEACA,yDAEA,+CACA,4PAOA,+BACI,+CAAuB,IACvB,0DAAkC,IAClC,+CAGJ,4CACA,8FAIA,mUAQA,mZAUA,qLAMA,mFAGA,0JAKA,6BACI,8GAKJ,qQAOA,qPAQA,2DACA,8FAIA,+BACI,+BACI,yEADJ,sDAMA,+BACI,6DADJ,0MAQA,+BACI,wEAEU,IAHd,uLASA,+BACI,qDADJ,sWAWA,+BACI,oDADJ,iPAQA,+BACI,8DADJ,mDAMJ,oGAKA,+BACI,+BACI,6DADJ,gTAUA,+BACI,6DADJ,8NAQA,+BACI,sDADJ,4SAUA,+BACI,6DADJ,sHAMA,+BACI,uDADJ,2gBAgBJ,iEACA,2ZAUA,yVAUA,gEACA,6cAWA,gKAKA,mXAUA,kEACA,uDACA,6PAOA,iDACA,kPAOA,0DACA,uIAIA,+BACI,gEACA,0FAIA,2GAIA,mGAIA,oEAGJ,gEACA,qUASA,8FAIA,iMAOA,2CACA,wHAIA,+BACI,+BACI,4BACI,wDAEJ,8WAWA,2IAGkC,IAC9B,mBAAG59J,KAAK,4CAAR,6DAKR,+BACI,4BACI,gDAEJ,yFAIA,wOAKoC,IAChC,mBAAGA,KAAK,4CAAR,0DAIJ,gHAEuC,IACnC,mBAAGA,KAAK,sDAAR,iEAHJ,OAQA,sJAG6C,IACzC,mBAAGA,KAAK,4CAAR,gEAOZ,iDACA,uWASA,+GAKA,8CACA,qFAGA,6FAKA,+BACI,+BACI,8CADJ,kGAKA,+BACI,gEAA4C,IADhD,8IAMA,+BACI,wDADJ,oHAMA,+BACI,sDADJ,mHAMA,+BACI,uDADJ,+JAOA,+BACI,2DAAuC,IAD3C,mHAOJ,uSASA,4DACA,2JAKA,uHAKA,+BACI,+BACI,2EAEU,IAHd,yXAcA,+BACI,qGAGU,IAJd,yGASA,+BACI,iFAEU,IAHd,sWAaA,+BACI,4EAEU,IAHd,mIAQA,+BACI,iFAEU,IAHd,oUAYA,+BACI,4DADJ,kNASJ,gFACA,oTAQA,wRAQA,8CACA,4DACA,0IAKA,+BACI,+BACI,0DADJ,sJAOA,+BACI,iFAEU,IAHd,oRAWA,+BACI,uFAGU,IAJd,0MAWA,+BACI,8BACI,iFAGU,IAJd,sHASA,+BACI,2EAIA,wFAIA,gHAIA,8FAIA,mGAMR,+BACI,wEAEU,IAHd,2HAQA,+BACI,8BACI,gFAGU,IAJd,oHASA,+BACI,kEACA,kKAMA,oGAIA,iLAUZ,6EACA,+NAMA,sTASA,qEACA,4PAOA,+OAMA,wJAMA,yCACA,kLAKA,+BACI,yEACA,0EACA,iGAIA,2FAKJ,uOAOA,gDACA,uMAMA,+BACI,wHAIA,uEAEJ,oKAMA,yHAIA,sFAIA,yVAUA,oDACA,gfAYA,2PAOA,iPAQA,yDACA,+QAOA,0KAMA,gEACA,sKAKA,sNAMA,4LAOA,4CACA,yGAIA,6BACI,8E,GAp/BFqpE,aCLpBy0F,GAAmBh/L,IAAOC,IAAV,uEAKhB2hE,GAAc5hE,IAAOC,IAAV,sHAOXg/L,GAAcj/L,IAAOiS,EAAV,6IAGJhuB,IAAUC,OAAO8B,YAsBfk5M,G,gKAhBX,WACI,OACI,cAAC,GAAD,UACI,cAACF,GAAD,UACI,eAAC,GAAD,yDAEI,cAACC,GAAD,CAAa/9J,KAAK,+BAAlB,8C,GAPEqpE,a,SCpBpB40F,GAAqCn/L,IAAOC,IAAV,kHAQlCm/L,GAAoC,WACtC,OACI,cAACD,GAAD,UACI,cAAC,GAAD,CACIx8L,SAAS,OACTghI,KAAM,CACF,CACIzyG,IAAK,QACL/sB,MAAO,aACPu8B,IAAKn3C,IAAOkE,MACZ0rB,YAAa,CAAC1U,KAAgBopH,YAElC,CACI38F,IAAK,cACL/sB,MAAO,UACPu8B,IAAKn3C,IAAOsE,YACZsrB,YAAa,CAAC1U,KAAgBqpH,kBAElC,CACI58F,IAAK,SACL/sB,MAAO,SACPu8B,IAAKn3C,IAAOuE,OACZqrB,YAAa,CAAC1U,KAAgB46L,gBAGtCn7L,SAAS,iBAUVo7L,GAJiC,WAC5C,OAAO,cAAC,GAAD,KCxCLC,GAAsBv/L,IAAOC,IAAV,kLASnBu/L,GAA6Bx/L,IAAOC,IAAV,kIAO1B+kD,GAAehlD,IAAOC,IAAV,6GAGL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInC+6M,GAAkBz/L,IAAOC,IAAV,wPACF,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cA6B1Bg7M,GA1BqD,SAAC,GAG9D,IAFH37L,EAEE,EAFFA,QACAq/B,EACE,EADFA,QAEA,OAAIr/B,EAEI,cAACw7L,GAAD,UACI,cAAC,KAAD,MAMR,cAACA,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,CAAcr+L,YAAWiiC,EAAU,mBAAqB,yBAAxD,SACKA,EAAU,cAAC+hB,GAAA,EAAD,IAAe,cAACj+B,GAAA,EAAD,MAE9B,cAACu4K,GAAD,CAAiBt+L,YAAWiiC,EAAU,mBAAqB,yBAA3D,SACKA,EAAU,kBAAoB,4BCnD7Cu8J,GAAqB3/L,IAAOC,IAAV,sEAKlB4iD,GAAc7iD,IAAO0nB,KAAV,4BAEXo7B,GAAc9iD,IAAO0nB,KAAV,4BAEXk4K,GAAqB5/L,IAAOC,IAAV,iGAKlB4/L,GAAa7/L,IAAO0nB,KAAV,qEAEH,qBAAGpnB,MAAkBpc,OAAOO,aAEnCq7M,GAAc9/L,IAAOC,IAAV,mXACJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAKpBm8L,GAKR,SAAC,GAAwD,IAAtDC,EAAqD,EAArDA,SAAUC,EAA2C,EAA3CA,iBAAkBC,EAAyB,EAAzBA,mBAC1B/7I,EAAYn0D,uBACd,SAACq0D,GACG,QACM47I,KACA57I,GACF47I,EAAiBvuL,SAAS2yC,KAGlC,CAAC47I,IAGC37I,EAAqBt0D,uBACvB,SAACmwM,GACG,QACMF,KACAE,GACFF,EAAiBvuL,UAAUqE,OAAOoqL,MAG1C,CAACF,IAGCr4L,EAAU0R,YAAY3R,MAEtB48C,EAAgB,SAAC67I,GACfA,GAAaF,GACbA,EACI9/I,aAA0B6/I,EAAkBG,KAKxD,IAAKJ,GAAaA,GAAgC,IAApBA,EAASrtL,OAAe,OAAO,KAE7D,IAAM0tL,EAAkBL,EAAS7sL,QAC7B,SAAAyrB,GAAO,OAAIA,EAAQn/B,IAAMwgM,EAAiBvuL,SAASktB,EAAQn/B,OAGzD6gM,EAAqBN,EAAS7sL,QAChC,SAAAyrB,GAAO,OAAIA,EAAQn/B,KAAOwgM,EAAiBvuL,SAASktB,EAAQn/B,OAGhE,OACI,eAACkgM,GAAD,WACKU,EAAgB1tL,OAAS,GACtB,eAAC,GAAD,WACK0tL,EAAgBp/L,KAAI,SAAA29B,GACjB,OACI,eAACghK,GAAD,WACI,cAAC97K,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUvlB,EAAQn/B,KAClB6kD,EAAmB1lB,EAAQn/B,IAE/BmL,QAAS05C,EAAmB1lB,EAAQn/B,IACpCqmB,aAAc,kBACVy+B,EAAc3lB,EAAQn/B,KAE1ByE,SAAS,oCAEb,eAAC47L,GAAD,CACI17L,QAAS,kBAAMmgD,EAAc3lB,EAAQn/B,KACrC0B,YAAU,8BAFd,UAIKy9B,EAAQD,UAJb,IAIyBC,EAAQC,cAjBZD,EAAQn/B,OAsBxC4gM,EAAgB1tL,OAASqtL,EAASrtL,QAC/B,cAAC,KAAD,CAAclU,MAAM,WAIhC,cAAC,GAAD,UACK6hM,EAAmBr/L,KAAI,SAAA29B,GACpB,OACI,eAACghK,GAAD,WACI,cAAC97K,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUvlB,EAAQn/B,KAClB6kD,EAAmB1lB,EAAQn/B,IAE/BmL,QAAS05C,EAAmB1lB,EAAQn/B,IACpCqmB,aAAc,kBAAMy+B,EAAc3lB,EAAQn/B,KAC1CyE,SAAS,2BAEb,eAAC47L,GAAD,CACI17L,QAAS,kBAAMmgD,EAAc3lB,EAAQn/B,KACrC0B,YAAU,qBAFd,UAIKy9B,EAAQD,UAJb,IAIyBC,EAAQC,SAC5Bj3B,GAAWA,EAAQnI,KAAOm/B,EAAQn/B,IAC/B,cAACogM,GAAD,yBAjBajhK,EAAQn/B,aCpGnD8gM,GAAuBvgM,IAAOC,IAAV,8JASpBugM,GAAqBxgM,IAAOC,IAAV,oHAOlBonB,GAAgBrnB,IAAOC,IAAV,wMAUbsnB,GAAgBvnB,IAAOC,IAAV,2LAWbwnB,GAAcznB,IAAO0nB,KAAV,+OASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,mHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,0EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,GAAkB9nB,IAAO0nB,KAAV,+CACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCsjC,GAAc/nB,IAAOgoB,EAAV,4GAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInC6iC,GAAgBjoB,IAAOC,IAAV,wDAKbwgM,GAA8C,SAAC,GAW9C,IAVHT,EAUE,EAVFA,SACApsL,EASE,EATFA,aACA7P,EAQE,EARFA,QACA28L,EAOE,EAPFA,iBACAn4K,EAME,EANFA,YACAD,EAKE,EALFA,cACAK,EAIE,EAJFA,aACAC,EAGE,EAHFA,kBACAC,EAEE,EAFFA,WACAjlB,EACE,EADFA,SAEMolB,EAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCwiC,EAAgB9L,mBAClB,kBAAMrK,EAAajB,UAAb,OAAwBqtL,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAU9tL,MAAMS,UAC9C,CAACiB,EAAcosL,IAGbh2K,EAAeh6B,uBAAY,WAChB,OAAbs4B,QAAa,IAAbA,SACD,CAACA,IAEE2B,EAAqBj6B,uBAAY,WAC/B+5B,GAAiBzB,EACjBA,IACOC,GACPA,MAEL,CAACD,EAAeC,EAAawB,IApC9B,EAsCkC5G,mBAAS,IAtC3C,mBAsCKtwB,EAtCL,KAsCiBs2B,EAtCjB,OAwCwDhG,mBAExD,IA1CA,mBAwCKmG,EAxCL,KAwC4BC,EAxC5B,KA4CIo3K,EAAuB1iL,mBAAQ,WACjC,GAAI+hL,EAAU,CACV,IAAM9gM,EAASyqB,oBCtKIvS,EDsK8BvkB,ECtKb,SAC5CmtM,GAEA,OAAK5oL,EAIE4oL,EAAS7sL,QACZ,SAAAC,GAAI,OAAkE,IAA9DA,EAAKurB,UAAUr4B,cAAckR,QAAQJ,EAAK9Q,iBACW,IAA7D8M,EAAKyrB,SAASv4B,cAAckR,QAAQJ,EAAK9Q,iBACyD,IAAlG,UAAG8M,EAAKurB,UAAR,YAAqBvrB,EAAKyrB,UAAWvF,OAAOhzB,cAAckR,QAAQJ,EAAKkiB,OAAOhzB,kBANvE05L,IDkKYr2K,CACXq2K,EAAS9tL,OAGb,GAAIhT,EAAOyT,OAAS,EAAG,CACnB,IAAMiX,EAAmB1qB,EAAO+B,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MACjD8pB,EACI3V,EAAaT,QAAO,SAAAC,GAAI,OAAIwW,EAAiBlY,SAAS0B,OAI9D,OAAOlU,EAEP,MAAO,GCnLW,IAACkY,IDqLxB,CAACvkB,EAAYmtM,EAAUpsL,IAEpBuW,IAAc,OAAC61K,QAAD,IAACA,OAAD,EAACA,EAAU9tL,MAAMS,QAC/B0X,GAAkBs2K,EAAqBhuL,QAAU5O,EACjD68L,EAAyBt3K,EAAsBnW,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAClEkT,OAEL,OACI,cAAC4tL,GAAD,UACI,eAACC,GAAD,WACK73K,GACG,cAAC,GAAD,UACI,cAAC,GAAD,UAAcA,MAGrBE,GACG,cAAC,GAAD,UACI,cAAC,KAAD,CACI0B,SAxCF,SAAC1kB,GAAD,OAAmBsjB,EAActjB,IAyC/BjC,SAAUumB,EACVjmB,SAAS,sBAIpB0kB,IAAsBuB,GACnB,eAAC,GAAD,WACI,8BACI,cAAC,GAAD,CAAiBhpB,YAAU,yBAA3B,SACKy/L,EAAyB,EAAzB,UACQA,EADR,YAESA,EAAyB,EACnB,qBACA,qBAEV,2BAGd,8BACK72K,EACG,cAAC,GAAD,CACInmB,SACqC,IAAjC0lB,EAAsB3W,QACtB0X,EAEJrnB,MAAOgmB,EAAaC,MAAMjmB,MAC1B6kB,YAAamB,EAAaC,MAAMpB,YAChCD,WAAYoB,EAAaC,MAAMrB,WAC/BxjB,QAAS4lB,EACT7oB,YAAU,wBATd,0BAcA,cAAC,GAAD,CACIyC,SAAUymB,EACVrnB,MAAOgmB,EAAaE,OAAOlmB,MAC3B6kB,YACImB,EAAaE,OAAOrB,YAExBD,WAAYoB,EAAaE,OAAOtB,WAChCxjB,QAAS6lB,EACT9oB,YAAU,sBARd,6BAgBfkpB,EACG,cAAC,GAAD,CACItmB,QAASA,EACTq/B,UAAS,OAAC48J,QAAD,IAACA,OAAD,EAACA,EAAU9tL,MAAMS,UAG9B,mCACI,cAAC,GAAD,CACIqtL,SAAUW,EACVV,iBAAkBrsL,EAClBhQ,SAAUA,EACVs8L,mBAAoBQ,YEzMnCG,GAA+B,SACxCxtL,GADwC,MAE6B,CACrErY,KAAM,+BACNqY,QCnBSytL,GAA+B,WACxC,IAAMz/L,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EDuBoF,CACxFrG,KAAM,gCCvBH,CAACqG,KCpDK0/L,GAAe,SAAC7uL,GACzB,OAAOA,EAAMiB,QAAO,SAACC,EAAMlS,EAAOokC,GAAd,OAAuBlyB,GAAQkyB,EAAK9tB,QAAQpE,KAAUlS,MCOxE8/L,GAAsC,CACxC7uM,KAAM,CACF+f,MAAO,IAEX+uL,OAAO,EACPl9L,SAAS,EACTnE,MAAO,GACPyU,SAAU,GACVo5F,MAAO,IA2EEyzF,GAAmB,SAACp/L,GAAD,OAAqBA,EAAMk+L,UCrE9CmB,GAAuC,SAAC,GAI9C,IAAD,IAHF//C,oBAGE,aAFF32H,8BAEE,SADCC,EACD,0DACI02K,EAAgB9nL,YAAY4nL,IAC1B/uM,EAAmCivM,EAAnCjvM,KAAM4R,EAA6Bq9L,EAA7Br9L,QAASsQ,EAAoB+sL,EAApB/sL,SAAU4sL,EAAUG,EAAVH,MAC3BI,EHjB8B,WACpC,IAAMhgM,EAAWO,cACX0/L,EAAoBntM,eACpB2d,EAAcnQ,cAEpB,OAAO3R,uBACH,SAACgiB,GACG3Q,EDIgF,CACxFrG,KAAM,8BCJEsmM,EAAkBtvL,GACbsZ,MAAK,SAAAn5B,GACFkP,EDSd,CACFrG,KAAM,8BACNumM,aCXqDpvM,OAExCq5B,OAAM,SAAC5rB,GACJyB,EDed,CACFrG,KAAM,8BACN4F,QCjBqDhB,EAAMgB,UAC3CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUigM,EAAmBxvL,IGAX0vL,GACjBC,EHIqC,WAC3C,IAAMpgM,EAAWO,cACjB,OAAO5R,uBAAY,SAACqjB,GAChBhS,EAASw/L,GAA6BxtL,MACvC,CAAChS,IGRmBqgM,GACjB7sM,EHUgC,WACtC,IAAMwM,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ED0BgF,CACpFrG,KAAM,8BC1BH,CAACqG,IGdcsgM,GACZ12K,EAAc61K,KAcpB,OAZAx9K,qBAAU,WAIN,OAHK29K,IAAS7/C,GACVigD,IAEG,WACC52K,GACAQ,OAIT,CAACA,EAAag2K,EAAO7/C,EAAcigD,IAGlC,cAAC,GAAD,cACIrB,SAAU7tM,EACVyhB,aAAcS,EACdtQ,QAASA,EACT28L,iBAAkBe,EAClBl5K,YAAa1zB,EACbyzB,cAAe2C,EACfpC,YAAY,EACZD,mBAAmB,GACf8B,KCnCVnE,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2hM,GAAuB5hM,IAAOC,IAAV,iJAQpB+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCo9M,GAAgB7hM,IAAOC,IAAV,gKAQbstC,GAAgBvtC,IAAOC,IAAV,uDAIN6hM,GAOR,SAAC,GAOC,IANH18D,EAME,EANFA,kBACAC,EAKE,EALFA,eACA08D,EAIE,EAJFA,aACAC,EAGE,EAHFA,iBACAz8D,EAEE,EAFFA,eACA08D,EACE,EADFA,iBACE,EACwC9+K,mBAAS8+K,GADjD,mBACKr9C,EADL,KACoBC,EADpB,KAEIrsH,EAAQ+iF,KACR/pH,EAASm5B,eACTq1K,EC7EW1mL,aAAY,SAAAxX,GAAK,OAAIA,KACtBk+L,SD6EVoB,EAAgB9nL,YAAY4nL,IAC5Bt7D,EAAepyH,eACfmyH,EAAapyH,eACbuuI,EAAYrC,KACZyiD,EJzC2B,WACjC,IAAM7gM,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EDmBsE,CAC1ErG,KAAM,yBCnBH,CAACqG,IIoCiB8gM,GACfp8D,EAA6B5qB,GAAaiqB,GAC1Cg9D,EAAyBvB,GACzBwB,EAAsBvB,KAE5Bx9K,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAGJ,IAAMnyC,EAAiBzjG,uBAAY,WAC/Bq1I,EAAe7zI,EAAO6iB,UACtB0tL,EAAan9C,GACbo9C,EAAiBhC,EAAS3rL,UAC1BsxH,IACAmc,IACAogD,IACA38D,MACD,CACCF,EACA7zI,EAAO6iB,SACP0tL,EACAn9C,EACAo9C,EACAhC,EAAS3rL,SACTsxH,EACAmc,EACAogD,EACA38D,IAGEW,EACF1tG,EAAMnkB,SAAS1B,OACfnhB,EAAO6iB,SAASlB,QAAO,SAAC1T,GAAD,OAAaA,EAAK,KAAGkT,OAC5CiyI,EAAcjyI,OACdyuL,EAAc/sL,SAAS1B,OAErB03K,EAAiBr6L,uBAAY,WAC/B60J,EAAiB,IACjBjf,EAAa,IACbw8D,EAAuB,IACvBC,MACD,CAACz8D,EAAcw8D,EAAwBC,IAE1C,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAAC9tK,GAAA,EAAD,CAAUpwB,MAAM,OAAOD,SAAS,sBAAhC,SACI,cAAC29L,GAAD,UACI,cAAC,GAAD,CACIj9C,cAAeA,EACfC,iBAAkBA,QAI9B,cAACtwH,GAAA,EAAD,CAAUpwB,MAAM,aAAaD,SAAS,yBAAtC,SACI,cAAC09L,GAAD,UACI,cAAC,GAAD,CACIxgD,cAAc,EACd14H,cAAe05K,EACf33K,wBAAwB,QAIpC,cAAC8J,GAAA,EAAD,CAAUpwB,MAAM,SAASD,SAAS,uBAAlC,SACI,cAAC09L,GAAD,UACI,cAAC,KAAD,CACI94K,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAAC,GAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACIznI,MAAM,QACNoC,QAAQ,UACRpG,OAAQ4vL,EACRzmL,UAAWsiI,EACXhiI,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAM,QACNhE,OAAQg5F,EACRvvF,SAAS,sBAHb,iCEjDDo+L,GA9GV,SAAC,GASC,IARHh2L,EAQE,EARFA,WACA0sI,EAOE,EAPFA,cACAupD,EAME,EANFA,cACAC,EAKE,EALFA,iBACAC,EAIE,EAJFA,uBACAC,EAGE,EAHFA,mBACAC,EAEE,EAFFA,uBACAntF,EACE,EADFA,SAEM7hG,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EAA6B/uI,eAC7BmwI,EAAmB/vI,eALvB,EAyBwD6M,mBAExD,MA3BA,mBAyBK8zK,EAzBL,KAyB4BC,EAzB5B,KA6BI5nK,EAAanK,iBAAO,MAE1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CAAcwlF,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,iBAA7D,UACI,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB4rH,uBADlC,SAGI,cAAC,GAAD,CAAYjsH,QAAS,kBAAMm+L,EAAcj2L,IAAapI,SAAS,sBAA/D,4BAIH80I,EAAch6H,8BAAgCrL,EAAWxhB,KAAK+f,MAAMS,QACjE,cAAC,GAAD,CACIvO,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyB5qL,EAAW7M,IAvC7B,WAC/B,IAAM+W,EAAmBlK,EAAW9a,QAAU,GACxC+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBowH,IAiCwBwxD,IAEJjzL,SAAS,uBANb,2BAWH80I,EAAc95H,uBACX,cAAC,GAAD,CACI9a,QAAS,WACLu+L,EAAuB,CAACr2L,EAAW7M,MAEvCyE,SAAS,uBAJb,2BASJ,cAAC,GAAD,CAAYE,QAAS,kBAAMo+L,EAAiBl2L,IAAapI,SAAS,0BAAlE,8BAGA,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB6a,mBADlC,SAGI,cAAC,GAAD,CACIgiD,aAAa,EACbl9D,QAAS,WACLq+L,EAAuB,CAACn2L,EAAW7M,MAEvCyE,SAAS,gBALb,2BAYZ,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0B3qL,EAAW7M,GAC3C8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eAzEiB,SAACxvH,GAC9B,IAAMysK,EAAgBzsK,EAAS1C,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAC3CqzI,EAAkBuT,EAAiBxwI,GACpC1C,QAAO,SAAA5e,GAAO,OAAI+X,EAAW9a,OAAOkgB,SAASnd,MAElDmuM,EAAmBpgB,EAAexvC,IAqEtBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,UCrHjB0kD,GAhBQxkM,sBACnB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBAAKF,IAAKA,EAAKC,UAAWA,EAAWG,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAOV,MAAM,6BAAlG,UACI,sBAAMW,SAAS,UAAUqjD,SAAS,UAAUpjD,EAAE,onBAAonBF,KAAK,YACvqB,sBAAME,EAAE,82GAA82GF,KAAK,SAC33G,sBAAMR,EAAE,IAAIC,EAAE,IAAIL,MAAM,KAAKC,OAAO,KAAKmxK,GAAG,IAAI58I,OAAO,UAAUkyC,YAAY,MAC7E,sBAAM5lE,EAAE,+BAA+BF,KAAK,SAC5C,sBAAME,EAAE,6uBAA6uBF,KAAK,YAC1vB,sBAAME,EAAE,kXAAkXF,KAAK,kBCVlY8tE,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CuiM,uBAAwB,CACpBlxI,SAAU,KAGdmxI,2BAA4B,CACxB1zK,QAAS,OCmBT,SAAS2zK,GACZ5xM,EACAoC,EACA27E,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXohM,ECrBuC,WAC9C,IAAMxlK,EAAiBnmC,eACjB4rM,EAAoBxpM,eAEpBqY,EAAcnQ,cAQpB,OAAO3R,sBAAW,yCACd,WACImB,EACAoC,EACA47E,GAHJ,0BAAAl9D,EAAA,6DAKUixL,EAA8C,CAChDnxM,OAAQ2rC,KAAWC,QACnBtF,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpC0qC,UAAS,UAAEzsC,EAAa0sC,mBAAf,aAAE,EAA0B3qC,KAAK,KAC1C4qC,UAAWvqC,EAAU3D,WACrB8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,IAdlE,SAiBUyqC,EAAe,gBAAK0lK,IACrB53K,KADC,yCACI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI1a,EADJ,OACc+mC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAC7B,SAACmS,GAAD,OAA0BA,EAAK3T,MAG9B2jC,kBAAQ7rC,GALX,gCAMQ0rM,EAAkB1rM,GACnB+zB,MAAK,WACF6jD,OAEH3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAbhB,2CADJ,uDAkBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KApClB,2CADc,0DAwCd,CAACqjM,EAAmBzlK,EAAgB1rB,ID/BAqxL,GACjC9zH,EAAkBx2D,eAClB/G,EAAcnQ,cAEdyhM,EAAkCj+K,iBAAe,GANzD,EAQoChC,oBAAkB,GARtD,mBAQSosD,EART,KAQoBC,EARpB,KAUQroB,EACF,CACI,CACGiB,WE9CwB,2BF+CvBC,eAAgB26I,EAChB16I,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,GADK,IAERwB,OAAQu8E,IAEZ37E,YACA47E,kBAAmB,kBACdi0H,EAAgCrzK,QAC7BqzK,EAAgCrzK,QAAU,IAEtD02B,UAAW,yBASrB48I,EAAuC,kBACxCD,EAAgCrzK,QAAU,GAMzCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1B6zH,IAEAvxL,EAAY,gCAAiC,WAC5B,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,qBACZzd,QAASq/C,MAKrBg0H,IAEA9zH,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF+7I,EAA+CtzM,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEHsxL,EAAgCrzK,QAChCq5B,KAHG,8BAKP,WAGJi6I,IAEiB,OAAjBl0H,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDyxL,EAA+CvzM,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,qBACZkjC,wBACI2yH,EACJtzK,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAiiM,EACAj0H,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACAg0H,MAGL,CAACh0H,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IAcD,SAASg0H,GACZryM,EACAoC,EACA27E,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACX6hM,EC/HuC,WAC7C,IAAMjmK,EAAiBnmC,eACjBglJ,EAAmBv+I,eAEnBgU,EAAcnQ,cAQpB,OAAO3R,sBAAW,yCACd,WACImB,EACAoC,EACA47E,GAHJ,0BAAAl9D,EAAA,6DAKUixL,EAA8C,CAChDnxM,OAAQ2rC,KAAWC,QACnBtF,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpC0qC,UAAS,UAAEzsC,EAAa0sC,mBAAf,aAAE,EAA0B3qC,KAAK,KAC1C4qC,UAAWvqC,EAAU3D,WACrB8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,IAdlE,SAiBUyqC,EAAe,gBAAK0lK,IACrB53K,KADC,yCACI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI1a,EADJ,OACc+mC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAC7B,SAACmS,GAAD,OAA0BA,EAAK3T,MAG9B2jC,kBAAQ7rC,GALX,gCAMQ8kJ,EAAiB9kJ,GAClB+zB,MAAK,WACF6jD,OAEH3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAbhB,2CADJ,uDAkBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KApClB,2CADc,0DAwCd,CAACy8I,EAAkB7+G,EAAgB1rB,ID2EA4xL,GACjCr0H,EAAkBx2D,eAClB/G,EAAcnQ,cAEdgiM,EAAkCx+K,iBAAe,GANzD,EAQoChC,oBAAkB,GARtD,mBAQSosD,EART,KAQoBC,EARpB,KAUQroB,EACF,CACI,CACIiB,WEnNwB,2BFoNxBC,eAAgBo7I,EAChBn7I,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,GADK,IAERwB,OAAQu8E,IAEZ37E,YACA47E,kBAAmB,kBACdw0H,EAAgC5zK,QAC7B4zK,EAAgC5zK,QAAU,IAEtD02B,UAAW,yBASrBm9I,EAAuC,kBACxCD,EAAgC5zK,QAAU,GAMzCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1Bo0H,IAEA9xL,EAAY,6BAA8B,WACzB,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,qBACZzd,QAASq/C,MAKrBu0H,IAEAr0H,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUFs8I,EAA2C7zM,uBAAY,WACzD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEH6xL,EAAgC5zK,QAChCq5B,KAHG,2BAKP,WAGJw6I,IAEiB,OAAjBz0H,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDgyL,EAA+C9zM,uBAAY,WAC7D28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,qBACZkjC,wBACIkzH,EACJ7zK,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAwiM,EACAx0H,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACAu0H,MAGL,CAACv0H,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IAeC,SAASu0H,GACb5yM,EACAoC,EACA27E,EACAC,EACAC,GAEA,IAAM/tE,EAAWO,cACXoiM,EC1OkC,WACxC,IAAMxmK,EAAiBnmC,eACjB40G,EAAa30G,cAEbwa,EAAcnQ,cAQpB,OAAO3R,sBAAW,yCACd,WACImB,EACAoC,EACA47E,GAHJ,wBAAAl9D,EAAA,6DAKUk+D,EAAiD,CACnDp+E,OAAQ2rC,KAAWtqC,OACnBilC,MAAK,UAAElnC,EAAamnC,eAAf,aAAE,EAAsBplC,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCslC,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC4qC,UAAWvqC,EAAU3D,WACrB8C,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQ,EACRC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,QAAQ,IAdlE,SAiBUyqC,EAAe,gBAAK2yC,IACrB7kD,KADC,yCACI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI1a,EADJ,OACc+mC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAC7B,SAACmS,GAAD,OAA0BA,EAAK3T,MAG9B2jC,kBAAQ7rC,GALX,gCAMQ00G,EAAW10G,GACZ+zB,MAAK,WACF6jD,OAEH3jD,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAbhB,2CADJ,uDAkBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KApClB,2CADc,0DAwCd,CAACqsG,EAAYzuE,EAAgB1rB,IDsLAmyL,GAC3B50H,EAAkBx2D,eAClB/G,EAAcnQ,cAEduiM,EAAyB/+K,iBAAe,GANhD,EAQoChC,oBAAkB,GARtD,mBAQSosD,EART,KAQoBC,EARpB,KAUQroB,EACF,CACI,CACIiB,WEzXkB,qBF0XlBC,eAAgB27I,EAChB17I,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,GADK,IAERwB,OAAQu8E,IAEZ37E,YACA47E,kBAAmB,kBACd+0H,EAAuBn0K,QACpBm0K,EAAuBn0K,QAAU,IAE7C02B,UAAW,yBASrB09I,EAA8B,kBAC/BD,EAAuBn0K,QAAU,GAMhCwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1B20H,IAEAryL,EAAY,+BAAgC,WAC3B,OAAjBq9D,QAAiB,IAAjBA,YAEL,CAACE,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,mBACZzd,QAASq/C,MAKrB80H,IAEA50H,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUFs8I,EAA2C7zM,uBAAY,WACzD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAv9D,EAAY,GAAD,OAEHoyL,EAAuBn0K,QACvBq5B,KAHG,iCAKP,WAGJ+6I,IAEiB,OAAjBh1H,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDsyL,EAAyCp0M,uBAAY,WACvD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,mBACZkjC,wBACIkzH,EACJ7zK,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAwiM,EACAx0H,EACA9nB,IAUJ,OAPAjkC,qBAAU,WACFisD,GACA60H,MAGL,CAAC70H,IAEGv/E,uBAAY,WACfw/E,GAAa,KACd,IGrYP,I,0CC3HYjnE,GD2HNwpF,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GAEjBu5D,GAoCD,SAAC,GAwBC,IAAD,sBAvBFnsM,EAuBE,EAvBFA,MACAosM,EAsBE,EAtBFA,kBACA32K,EAqBE,EArBFA,sBACA4qH,EAoBE,EApBFA,mBACAgsD,EAmBE,EAnBFA,mBACA/B,EAkBE,EAlBFA,iBACAgC,EAiBE,EAjBFA,mBACA57L,EAgBE,EAhBFA,eACA8mG,EAeE,EAfFA,sBACAjpE,EAcE,EAdFA,oBACAuyG,EAaE,EAbFA,cACA5jI,EAYE,EAZFA,eACAqvL,EAWE,EAXFA,6BACAC,EAUE,EAVFA,yBACAC,EASE,EATFA,gBACA5tG,EAQE,EARFA,cACAhzF,EAOE,EAPFA,QACA6T,EAME,EANFA,QACAyzH,EAKE,EALFA,uBACAt2E,EAIE,EAJFA,UACA4xE,EAGE,EAHFA,YACA/+H,EAEE,EAFFA,QACAwsJ,EACE,EADFA,oBAEMpmF,EAAUb,KADd,EAGwChqD,mBAAS,IAAIhD,MAHrD,mBAGK+mD,EAHL,KAGoBqkE,EAHpB,KAKIq5D,EZhIwB,WAC9B,IAAMvjM,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EDc4E,CAChFrG,KAAM,4BCdH,CAACqG,IY2HwBwjM,GAL1B,EAOoC1hL,oBAAkB,GAPtD,mBAOK8mD,EAPL,KAOkBuhE,EAPlB,OAQkCroH,mBAChC,MATF,oBAQKsoH,GARL,MAQiBC,GARjB,MAWIo5D,GAAgB5pF,GAAe,OAACtzG,QAAD,IAACA,OAAD,EAACA,EAASrU,WAEzC+3I,GAAgB5I,KAChBp2B,GAA8BvzF,eAE9Bge,GAAoC,CACtClkC,WAAY,GACZgjB,SAAUjN,EACVF,QAAS,GACT3V,QAAS,CACLC,MAAO,eACPC,KAAK,GAETP,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGb+4H,IACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,SACfo3I,EAAYz1G,MAAQ8M,KAAaC,cAAcxqC,KACzCkzI,EAAYp3I,OACZwnC,GAnCR,GA8CED,aAAqB60G,IARrBx6I,GAtCF,GAsCEA,aACAg4B,GAvCF,GAuCEA,cACA4O,GAxCF,GAwCEA,WACAE,GAzCF,GAyCEA,YACAS,GA1CF,GA0CEA,UACAK,GA3CF,GA2CEA,oBACAJ,GA5CF,GA4CEA,UACAzB,GA7CF,GA6CEA,UAGEpf,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EACAiB,GACF7zI,GACAA,EAAMga,OACNw9F,GACAA,EAAsB/8F,OAASza,EAAMga,MAAMS,OAEzCb,GAAcnQ,cAId8uF,GAFoBs5C,IAENuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eAAc,UAAE74I,GAAa0kB,gBAAf,aAAE,EAAuBlD,OACvC4jF,YAAiB,OAALr+F,QAAK,IAALA,OAAA,EAAAA,EAAOga,MAAMS,SAAU,IAGjCw0D,GAAcn3E,uBAAY,YACxB,OAAC4X,QAAD,IAACA,OAAD,EAACA,EAASrU,aACdpC,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBw4D,EAAkBnzM,GAAcyW,EAAQrU,WACxCg4I,EAAiB,IAAIprH,MACrBskL,EAA6B,IAAI,EAAM14D,IACvCP,GAAe,MAChB,QACC5jI,QADD,IACCA,OADD,EACCA,EAASrU,UACTu4I,GACAw4D,EACAnzM,GACAszM,EACA14D,KA2CEg5D,GAA6B,SAC/BC,GAEAT,EAAmBS,GAAqB,kBAtCM,SAAC3xL,GAC/C,IAAIzS,EAEJ+rB,QAAQo7B,UAAUz8B,MAAK,WACdugH,IAA2B,IAAdA,GAKd9xF,aAAehR,KAAcM,OAJ7B89B,QASRy9H,IACAxwC,EAAoBxsJ,EAASrU,WAGzBqN,EADgB,KAAb,OAAHyS,QAAG,IAAHA,OAAA,EAAAA,EAAKV,QACK,0BAGNU,EAAIV,OAAS,EAAb,UAEUs3D,EAAW,OAAG/xE,QAAH,IAAGA,OAAH,EAAGA,EAAOmhD,MAAQhmC,EAAIV,OAF3C,8BAIM,4BAEdb,GAAYlR,EAAS,WAYjBqkM,CAA0CD,OAS5CvC,GAAyB,SAACuC,GAC5B14F,GAA4B,CACxB7+D,WAAY,oBACZ/E,YAAY,uCAAD,OACPs8J,EAAoBryL,OAAS,EACvB,8BACA,2BAHC,KAKXi7B,iBAAkB,UAClBD,kBAAmB,cACnBE,UAAW,kBAAMk3J,GAA2BC,IAC5Cj3J,cAAe,CACX3e,QAAS,sBACTif,wBAAyB,MAK/B62J,GAA6Cl1M,uBAAY,WAC3Dm3E,KAEAy9H,MACD,CAACz9H,GAAay9H,IAEXO,GACFpC,GACI5xM,GADgC,iBAEhCyW,QAFgC,IAEhCA,OAFgC,EAEhCA,EAASrU,iBAFuB,QAEV,EAFU,iBAGhC2E,QAHgC,IAGhCA,OAHgC,EAGhCA,EAAOmhD,aAHyB,QAGhB,EAChB6rJ,IAkBFvC,GAAyB3yM,uBAC3B,SACI+N,EACAjJ,EACAm1E,GAEAsuE,EACIx6I,EACyB,IAAzBA,EAAc4U,OACds3D,EACM2gE,GAAYz5I,GAAc+G,EAAOmhD,OACjCloD,GACN84E,KAGR,CAACsuE,EAAoBpnJ,GAAc+G,IAGjCktM,GACF5B,GACIryM,GADgC,iBAEhCyW,QAFgC,IAEhCA,OAFgC,EAEhCA,EAASrU,iBAFuB,QAEV,EAFU,iBAGhC2E,QAHgC,IAGhCA,OAHgC,EAGhCA,EAAOmhD,aAHyB,QAGhB,EAChB8tB,IAuBFk/E,GAAmB/vI,eACnBosL,GAAqB1pM,cACrBqsM,GAAuBpsM,cAEvBqsM,GACFlyD,GACIsvD,GACA2C,GACAp7H,EACA,CACI7hB,WAAY6oF,GACZ5oF,eAAgBi8I,EAChB59I,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAO,EACPC,OAAM,iBAAEuF,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,aAAT,QAAkB,IAE5B9lD,UAAS,iBAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,iBAAX,QAAwB,EACjCkqC,gBAAgB,GAEpBgpB,UAAW,wBAGnB0gB,IAGF4xH,GAAY,yCAAG,qCAAA9mL,EAAA,0DACbmD,IAAkBs6F,EADL,gCAEuBspF,GAChCtpF,EACA3oG,KAAqBK,cACrBZ,KAAqBjB,KAH+B,aAAC,gBAIhDpU,IAJ+C,IAIjC4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GACJ,OAAO8yJ,GACHv1C,EACAx3G,EACA/F,MAZK,gBAELojB,EAFK,EAELA,kBAcFg+H,EAAgB8S,GAAiBjxI,GAEjC6jL,EAAwB1lD,EAAcpgI,QACxC,SAAAtU,GAAC,OACG0W,EAAkB7D,SAAS7S,IAC3B0W,EAAkB7D,UAAU7S,MAE9Bq6L,EAAyB9jL,EAAejC,QAC1C,SAAAtU,GAAC,OAAIA,EAAI,IAAM0W,EAAkB7D,SAAS7S,MAG9CymM,GACI,CACI3sJ,WAAY,OACZ1jD,UAAWy6G,GAEfwpF,EACAD,GAjCS,2CAAH,qDAsCZD,GAAuBhkM,cAEvBiwJ,GAA6BhwI,eAE7B4zI,GAAsB74J,uBACxB,SAAC2a,GACG,IAAMpT,EACDW,GAASA,EAAMga,MAAMjR,KAAI,SAACxI,GAAD,OAAkBsd,OAAOtd,EAAKgH,QACxD,GACJglM,EACIltM,EACAoT,EACAohI,MAGR,CAAC7zI,EAAO6zI,GAA6B04D,IAUnCtrL,GAAck5B,eAEd+9E,GAAoB,SAAC33H,GACvB,IAAI0gB,GAAYzH,SAASjN,KAAgB4rH,uBASrC,OAAO,EARPz4G,EAAQH,KACJluB,IAAOqE,uBAAuB+B,QAC1B,UACA8I,EAAKgH,GAAI7P,YAEb,CAAEm8H,WAAW,KAOnBh5H,GAAU5B,GAAa4B,QACvBwyM,GAAcz7D,GAAW,OAAQ/2I,GAASglC,IAC1CytK,GAAU17D,GAAW,QAAS/2I,GAASglC,IACvC0tK,GAAS37D,GAAW,YAAa/2I,GAASglC,IAC1C2tK,GAAc57D,GAAW,eAAgB/2I,GAASglC,IAClD4tK,GAAc77D,GAAW,aAAc/2I,GAASglC,IAWhD80G,IAAe30I,GAAUA,IAAUA,EAAMga,MAAMS,OAE/CizL,GAAoB,SAAC9pC,GACvBnjI,GAAU,UAAWmjI,IAGnBpvB,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBwyL,GAAwB,SAAChoK,GAC3BlF,GAAU,cAAekF,GACzB3G,GAAU,CAAElkC,MAAO,YAAa6S,MAAOg4B,KAGrCm9G,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAeknB,KACnC,CAACA,EAAqBuyG,IAGpB8sD,GAAuBlhE,GAAyBzzI,IAEhD40M,GAAgBnmD,KAChByiD,GAAsBvB,KACtBh/C,GAAYrC,KA8DlB43C,IAAiB,YACT,OAACzvL,QAAD,IAACA,OAAD,EAACA,EAASrU,aACdpC,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBw4D,EAAkBnzM,GAAcyW,EAAQrU,cACzC,QAACqU,QAAD,IAACA,OAAD,EAACA,EAASrU,UAAW+wM,EAAmBnzM,GAAcymB,IAEzD0L,qBAAU,WAAO,IAAD,GACRkhL,IAAuB,OAACzvI,QAAD,IAACA,GAAD,UAACA,EAAWixI,kBAAZ,aAAC,EAAuBvmM,MAC/Cs5B,OAEL,CAACyrK,EAAoBzrK,GAArB,OAA0Cg8B,QAA1C,IAA0CA,GAA1C,UAA0CA,EAAWixI,kBAArD,aAA0C,EAAuBvmM,KAEpE6jB,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,WACNioH,EAAiB,IAAIprH,QACtB,CAACjoB,IAEJorB,qBAAU,WACN,OAAO,kBACHmhL,EAA6B,IAAI,EAAM14D,OAE5C,IAEHzoH,qBAAU,WACNmhL,EAA6B,IAAI,EAAM14D,MAExC,CAAC7zI,EAAO0f,EAAQE,SAASukC,WAE5B/4B,qBAAU,YAEiB,OAAnBmjB,QAAmB,IAAnBA,OAAA,EAAAA,EAAqB9zB,SACrB8zB,EAAoB9zB,UAApB,OAA+Bza,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAOmhD,QAEtCmyF,GAAe,KAEpB,QAACtzI,QAAD,IAACA,OAAD,EAACA,EAAOmhD,MAAO5S,IA0BlBnjB,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAER,CAACozG,GAAeD,GAAWnzG,KAE9BpV,qBAAU,WACN,IAAMs0I,EAAgB1/J,EAChBA,EAAMga,MAAMjR,KAAI,SAAAxI,GAAI,OAAIsd,OAAOtd,EAAKgH,OACpC,GACAm6L,EAAejjL,aACjB+4F,EACAkoD,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtC8xL,EAA6B7K,GAAc,KAEhD,CAAClqF,EAAuBx3G,EAAOusM,IAElCnhL,qBAAU,WACN,OAAO,WACHyiL,KACAjkD,KACAugD,QAEL,CAAC0D,GAAejkD,GAAWugD,KAE9B/+K,qBAAU,WACNgoH,GAAc,CAAC7mI,KAAgBqpH,oBAChC,CAACwd,KAGJhoH,qBAAU,WAUN,OATAg3B,aAAcvR,KAAcK,OAA6B,YAE1C,OAAPxhC,QAAO,IAAPA,OAAA,EAAAA,EAASrU,aACRo/B,kBAAQmyK,GAAel9L,EAAQrU,YAEhC4zE,QAID,WACHzsB,aACI3R,KAAcK,MACd+9B,OAGT,CAAC29H,GAAel9L,EAASu/D,KAE5B,IAAM2yH,GAAgCznD,GAClCqwD,GACA2C,GACAl+H,IAyBJ,OACI,eAAC,GAAD,CACImiD,SAAS,QACTuC,WAAkB,OAAPjkH,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAChB,cAAC,GAAD,CACIA,UAAWqU,EAAQrU,UACnBygK,mBAAoB9tJ,aAAW,OAAC0B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,QAGvDm4H,KAAM,cAAC,GAAD,IACN0C,cAAc,kBACdpqH,SAAS,QAVb,UAYKH,IAAYkmE,GAAe,cAAC,KAAD,IAE5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAE+F,QAAF,IAAEA,OAAF,EAAEA,EAAOga,MACbtJ,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,mBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,aAAT,QAAkB,EAC5BygB,aAAcgxE,GACd74C,aA5OK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IA4OMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,gBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBACIowC,IAAkD,IAAnC17I,GAAa0B,WAAW8f,QAE/CkpF,8BACKwxC,kBAAc5mG,KACd4mG,kBAAcn1I,GACnB4jG,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEtjC,QAAF,IAAEA,OAAF,EAAEA,EAAqB9zB,OACrCR,WAAU,OAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,MACnBygB,aAAcgxE,GACdluC,iBAAkB,WACd6nG,EACI,IACA,EACA14D,IAEJP,GAAe,IAEnBjjH,YAAa,WACTijH,GAAe,GACfqd,IAAoB,IAExBhsD,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACN+mG,wBACIkjD,GAAYp7H,oBACRd,KAAkBG,yBAEhB,CAACxa,KAAgBwa,yBACjB,GACVs6E,uBACIyhD,GAAYrwG,qBACR7rB,KAAkBG,yBAE1Bk4E,wBAnLQ,YACnB,OAALj/F,QAAK,IAALA,OAAA,EAAAA,EAAOga,SAAUm7H,kBAAc39B,IAC/BspF,GACItpF,EACA3oG,KAAqBK,cACrBZ,KAAqBjB,KAHL,aAAC,gBAIZpU,IAJW,IAIG4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GAAe,IACXojB,EAAsB0vI,GAC1Bv1C,EACAx3G,EACA/F,GAHIojB,kBAMRoY,EAAsBpY,OAqKV49E,qBAAsB4lG,GACtBxgG,yBACIyiD,GAAYp7H,oBACRd,KAAkBK,mBAEhB,CAAC1a,KAAgB0a,mBACjB,GACVw6E,iBAAkBqhD,GAAYrwG,qBAC1B7rB,KAAkBK,mBAEtBu4E,sBAlde,YAE9BgY,GACEA,IAA0BA,EAAsB/8F,SAIvDs3D,EACMm7H,KACAzC,GACIjzF,EACAv+G,GACA84E,KAycUuuB,kBAAmBwiD,GAAYp7H,oBAC3Bd,KAAkBQ,mBAEhB,CAAC7a,KAAgB6a,mBACjB,GACNo6E,kBAAmB97E,aACfhW,EACAnD,KAAgB6a,mBAEpBq4E,eAvgBgB,WACpC+X,IACKzlC,EACKk7H,KACA1C,GAAuB/yF,KAogBbzlC,YAAaA,EACb93D,WAAU,OAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,QAG3B2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIw0G,kBAAmBx8H,GAAkB,GACrCo5L,iBAAkB6D,GAClB9D,aAAc6D,GACd3D,iBACI9wM,GAAamnC,QACPnnC,GAAamnC,QACb,GAEV+sG,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAnBtB,SAqBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcohE,GACdliM,UACKzS,GAAa0B,WAAW8f,OACrB,GACyB,IAAzBmzL,KACJj5D,GAEJ3oI,SAAS,uBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAoC,KAApB,OAAL7L,QAAK,IAALA,GAAA,UAAAA,EAAOga,aAAP,eAAcS,QAC9B+9E,iBAAkB,CACd7sF,KAAM++L,GACNroM,KAAM,uBACN2J,SAAU,cAEdysF,uBAAwB,CACpBh4C,WAAY,QACZz0C,SAAU,oBAEd0sF,uBAAwB,CACpB1sF,SAAU,wBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,WAAU,OAAC+kG,QAAD,IAACA,OAAD,EAACA,EAAuB/8F,QAClC/O,UAAW1L,IAAc,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOga,MAAMS,QAAS,EAC1C/H,QAASmhI,KAAgC9hE,EACzCe,YA7WU,SAAC/wB,GAC3B4uG,GAAoB5uG,EAAM5E,OAAO1qC,SACjC6gI,GAAe,IA4WCtnI,SAAU,mBAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACHouI,GAAc,KAAO04D,IAJxB,IAKD3hM,SAAUipI,GACVvuI,UAAW0vE,EAAQ60H,uBACnB3+L,SAAU,gBAPT,2BAUDC,MAAO,gBACP1F,MAAO,IACHouI,GAAc,KAAO24D,IAZxB,IAaD5hM,SAAUipI,GACVvuI,UAAW0vE,EAAQ60H,uBACnB3+L,SAAU,iBAfT,2BAkBDC,MAAO,OACP1F,MAAO,IACHouI,GAAc,KAAO44D,IApBxB,IAqBD7hM,SAAUipI,GACV3oI,SAAU,gBAtBT,2BAyBDC,MAAO,aACP1F,MAAO,IACHouI,GAAc,KAAO84D,IA3BxB,IA4BD/hM,SAAUipI,GACV3oI,SAAU,mBA7BT,2BAgCDC,MAAO,aACP1F,MAAO,IACHouI,GAAc,KAAO64D,IAlCxB,IAmCD9hM,SAAUipI,GACV3oI,SAAU,2BAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAAYwgC,GACZtgC,kBA1YM,SAAC71C,EAAY6zC,GArGf,IAASr1F,IAsGNq1F,EAAP7zC,EArGd30B,kBACI7sB,EAAKgH,IACPilM,EAAyBjsM,EAAKgH,IAoGlC+rI,GAAe,IAyYC37C,aAtZM,SAAC/B,GAAD,QACpB4hB,KACA5hB,EAAIruF,IACNiwG,EAAsBh+F,SAASo8E,EAAIruF,KAoZnBswF,gBAlYS,SAACjC,GAC1B,OAAO29C,KAAe39C,EAAIruF,IAkYVivF,kBAAmB,SAACj2F,GAAD,MAAmB,CAClCmQ,eAAgBnQ,EAAKjH,OACrBo7E,kBAAmB,CACfnoE,KAAgBwhM,yBAGpBv5H,cAAe,SAACn4E,GAAD,OA/XV,SAACA,EAAiBlF,GAC3Cs1M,EAAgBt1M,EAAQkF,GA+XA04I,CAAqB14I,EAASkE,EAAKgH,OAE3CyE,SAAU,YACVyrF,MAAO,CACH,CACIR,UAAW,eACXC,WAAY,CACRrB,YAAa,SAAC36E,GAAD,gBACNA,EAAKurB,UADC,YACYvrB,EAAKyrB,WAC9BmvD,eAAgB,SAACv1F,GAAD,MAAmB,CAC/B+yC,cAAe,CACX7M,UAAWlmC,EAAKkmC,UAChBE,SAAUpmC,EAAKomC,SACfqN,QAASzzC,EAAK+zC,SACdz6C,OAAQ0G,EAAK1G,QAEjBsS,KAAM,KACN0nC,aAAa,IAEjB7nC,SAAU,OACV5F,UACI0vE,EAAQ80H,6BAGpB,CACI3zG,UAAW,aACXC,WAAY,CACRrB,YAAa,SAAC36E,GAAD,OAAkBA,EAAK7iB,OACpC2T,SAAU,eAGlB,CACIirF,UAAW,aACXC,WAAY,CACRrB,YAAa,SAAC36E,GAAD,uBACTA,EAAKpf,YADI,aACT,EAAWmQ,OACfD,SAAU,cAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SAAC98C,GAAD,OAChBA,EAAKwqB,WACVwxD,WAAY,CACRrB,YAAa,SAAC36E,GAAD,gBACNA,EAAKwqB,UAAWe,UADV,YAELvrB,EAAKwqB,UAAWiB,WAExBmvD,eAAgB,SAACv1F,GAAD,MAAmB,CAC/B+yC,cAAe,CACX7M,UACIlmC,EAAKmlC,UAAWe,UACpBE,SAAUpmC,EAAKmlC,UAAWiB,SAC1BqN,QAASzzC,EAAKmlC,UAAW4O,SACzBz6C,OAAQ0G,EAAKmlC,UAAW7rC,QAE5BsS,KAAM,OAEVH,SAAU,YAGlB,CACIirF,UAAW,aACXC,WAAY,CACRrB,YAAa,SAAC36E,GAAD,OACTuO,aAAWvO,EAAK4oI,YACpB93I,SAAU,oBAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SAACt7E,GAChB,MAAO,CACHjT,KAAMsrI,KAAer4H,EAAK3T,GAC1Bs7C,WAAY,WAtiBzB,IAAC4wB,KAuiBmCv4D,EAAK3T,KApiB5DisI,GADAD,KAAe9/D,EACD,KAEAA,IAmiBkB/iE,eAAgBwK,EAAK5hB,OACrB0S,SAAU,kBAK1B,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAACd,GAAD,OACrB,cAAC,GAAD,CACIxhF,WAAYwhF,EACZkrD,cAAeA,EACfupD,cAAenyE,GACfoyE,iBAAkBA,EAClBC,uBACIA,GAEJC,mBAAoB,SAChBpgB,EACAxvC,GAFgB,OAhV7B,SAC3BwvC,EACAxvC,EACAzjJ,GAEAyqM,GACI,CACInhJ,WAAY,OACZ+5F,SAAUrjJ,GAEdizL,EACAxvC,GAyUoCozD,CACI5jB,EACAxvC,EACAhlD,EAAIruF,KAGZkjM,uBACIA,GAEJntF,YACK,OAAC/uE,QAAD,IAACA,OAAD,EAACA,EAAqB9zB,sBA2FxDwzL,GA7EyB,WACpC,IAAMrkM,EAAQ4kC,eACR0/J,EAA0Bx/J,eAC1BhvB,EAAUW,cACVkiB,EAA4BnhB,YAAYkhB,MACxC6rK,EAAwB9oK,eACxB8+G,EAAmBl+G,eACnBmoK,EAAiB9nK,eACjB+nK,EAAmBjnK,eAEnB9tC,EAASm5B,eACTg6K,EAAkBpjK,cAA0B,GAC5C5T,EAAwBD,eACxB+2K,EACFjlK,eACEklK,EAA2BjlK,eAC3Bs3D,EAAgBhkE,eAChBs4G,EAAyBl/G,eACzB6sH,EAAgBj6H,eAChBg2C,EAAYw7F,KACZ9uC,EAAatC,KACbi1C,EAAsB70C,KAEtB94E,EAAsBxoB,mBACxB,kBAAMsoB,aAA0BzkC,KAChC,CAACA,IAEC6kI,EAAcrtH,YAAYotH,IAC1B9+H,EAAU0R,YAAY3R,KAAiBgrB,WAEvC6zK,EAAuBx2M,uBACzB,SAACsc,GACGg6L,EAAeh6L,EAAYmuB,KAE/B,CAACA,EAAS6rK,IASd,OANAhjL,qBAAU,YACDmX,EAAQh7B,KAAT,OAAemI,QAAf,IAAeA,OAAf,EAAeA,EAASrU,YACxBkuH,EAAW75G,EAAQrU,aAExB,QAACknC,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAV,OAAcmI,QAAd,IAAcA,OAAd,EAAcA,EAASrU,UAAWkuH,IAGjC,cAAC,KAAkBxzC,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,eAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,eAAjD,SACI,cAAC,GAAD,CACIuG,QAASA,EACT0sL,kBAAmB+B,EACnB9tD,mBAAoB8D,EACpBmmD,iBAAkBgE,EAClBjC,mBAAoBgC,EACpBruM,MAAO4J,EAAM3P,KACbu9G,sBAAuB5tG,EAAM2kC,oBAC7BA,oBAAqBA,EACrBuyG,cAAeA,EACfj1I,QAASjC,EAAMiC,QACfygM,mBAAoB4B,EAAwBj0M,KAC5CyW,eAAgBpX,EAAO6iB,SACvBsZ,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvBqvL,6BAA8BA,EAC9BC,yBAA0BA,EAC1BC,gBAAiBA,EACjB5tG,cAAeA,EACfs0C,uBAAwBA,EACxBt2E,UAAWA,EACX4xE,YAAaA,EACb/+H,QAASA,EACTwsJ,oBAAqBA,SElqCnC7tI,GAAYvmB,IAAOC,IAAV,+GAMTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2gD,GAAkB5gD,IAAOC,IAAV,iJAQf2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQd+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCo9M,GAAgB7hM,IAAOC,IAAV,gKAQbstC,GAAgBvtC,IAAOC,IAAV,uDAINwmM,GAOR,SAAC,GAOC,IANHrhE,EAME,EANFA,kBACAC,EAKE,EALFA,eACAqhE,EAIE,EAJFA,cACA3E,EAGE,EAHFA,aACAx8D,EAEE,EAFFA,eACA08D,EACE,EADFA,iBACE,EACwC9+K,mBAAS8+K,GADjD,mBACKr9C,EADL,KACoBC,EADpB,KAEIrsH,EAAQ+iF,KACR/pH,EAASm5B,eACTi7G,EAAepyH,eACfmyH,EAAapyH,eACbuuI,EAAYrC,KACZ1Z,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAGJ,IAAMnyC,EAAiBzjG,uBAAY,WAC/Bq1I,EAAe7zI,EAAO6iB,UACtBqyL,EAAcluK,EAAMnkB,UACpB0tL,EAAan9C,GACbjf,IACAmc,IACAvc,MACD,CACCF,EACA7zI,EAAO6iB,SACPqyL,EACAluK,EAAMnkB,SACN0tL,EACAn9C,EACAjf,EACAmc,EACAvc,IAGEW,EACF1tG,EAAMnkB,SAAS1B,OACfnhB,EAAO6iB,SAASlB,QAAO,SAAC1T,GAAD,OAAaA,EAAK,KAAGkT,OAC5CiyI,EAAcjyI,OAEZwzH,EAAiBryH,eACjBiyL,EAAgBnmD,KAQtB,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAACrrH,GAAA,EAAD,CAAUpwB,MAAO,OAAQD,SAAS,sBAAlC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI0gJ,cAAeA,EACfC,iBAAkBA,QAI9B,cAACtwH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI4kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAAC,GAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAQ,UACRpC,MAAO,QACPhE,OAAQ,kBA7CxBoqJ,EAAiB,IACjB1e,SACA4/D,KA4CgB7hM,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,sBAHb,iC,UC4BDyiM,GAtLV,SAAC,GAWC,IAAD,EAVFluM,EAUE,EAVFA,KACA23H,EASE,EATFA,kBACAw2E,EAQE,EARFA,mBAEAC,GAME,EAPFpQ,eAOE,EANFoQ,4BACAxvG,EAKE,EALFA,gBACAyvG,EAIE,EAJFA,mBACApE,EAGE,EAHFA,mBACAltF,EAEE,EAFFA,SACArkC,EACE,EADFA,gCAEMx9D,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EACF/uI,eACEmwI,EAAmB/vI,eACnBqgF,EAAqB52D,aAAgC,UACvDtnC,EAAKgH,UADkD,aACvD,EAAS7P,YARX,EAYEuzB,oBAAS,GAZX,mBAWKszE,EAXL,KAWkCC,EAXlC,OA+BwDvzE,mBAExD,MAjCA,mBA+BK8zK,EA/BL,KA+B4BC,EA/B5B,KAmCI5nK,EAAanK,iBAAO,MAkB1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CAAcwlF,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,iBAA7D,UACI,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB4rH,uBADlC,SAGI,cAAC,GAAD,CAAYjsH,QAAS,kBAAMgsH,EAAkB33H,IAAOyL,SAAS,sBAA7D,4BAIJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB4rH,uBADlC,SAGI,cAAC,GAAD,CAAYjsH,QAAS,kBAAMwiM,EAAmBnuM,IAAOyL,SAAS,uBAA9D,6BAIJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB2rC,mBADlC,SAGI,cAAC,GAAD,CACIhsC,QAAS,SAAAihB,GACLA,EAAEC,kBAlC1BqxE,GAAmB,kBAAMD,GAA+B,OAqCpCxyF,SAAS,6BALb,qCAUDyP,EAAWxhB,KAAK+f,MAAMS,QACrB,cAAC,KAAD,CACIwG,YAAa,CAAC1U,KAAgBsiM,mBADlC,SAGI,cAAC,GAAD,CACI3iM,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyBz+L,EAAKgH,IA7E3B,WAC/B,IAAM+W,EAAmB/d,EAAKjH,OACxB+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBowH,IAuE4BwxD,IAEJjzL,SAAS,uBANb,6BAYR,cAAC,KAAD,CAAiBiV,YAAa,CAAC1U,KAAgBgoD,YAA/C,SACI,cAAC,GAAD,CACIroD,QAAS,SAAAihB,GACLA,EAAEC,kBACFuhL,EAA2BpuM,EAAKgH,KAEpCyE,SAAS,oBALb,0BAUJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBuiM,kBADlC,SAGI,cAAC,GAAD,CACI5iM,QAAS,SAAAihB,GACLA,EAAEC,kBACF+xE,EAAgB,CAAC5+F,EAAKgH,MAE1ByE,SAAS,uBALb,6BAUJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBwiM,aADlC,SAGI,cAAC,GAAD,CACI3lI,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFwhL,EAAmB,CAACruM,EAAKgH,MAE7ByE,SAAS,qBANb,oCAaZ,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0Bx+L,EAAKgH,GACrC8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eA5HiB,SAACxvH,GAC9B,IAAMysK,EAAgBzsK,EAAS1C,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAC3CqzI,EAAkBuT,EAAiBxwI,GAEzC6sL,EAAmBpgB,EAAexvC,IAyHtBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,MAInBznD,GACG,cAAC,KAAD,CACInnE,WAAYA,EACZs+C,OAAQ6oB,EACRzmE,QA/GyB,WACrC0mE,GAA+B,IA+GnBx+F,MAAO,CAACO,EAAKgH,IACb0xE,gCACIA,QCzMlB5qD,GAAYvmB,IAAOC,IAAV,4FAMTq+I,GAAat+I,IAAOC,IAAV,gLACF,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAQ/Co7I,GAAsBh/I,IAAOC,IAAV,gIAOnBmhE,GAAcphE,IAAOC,IAAV,2RAQJ,SAAAC,GAAK,OACVA,EAAM0D,SAAW1D,EAAMI,MAAMpc,OAAOoD,cAAgB4Y,EAAM8C,SAK5DkkM,GAAuBlnM,IAAOC,IAAV,oIACb,SAAAC,GAAK,OACVA,EAAMinM,OAAS,GAAK,MAMtBvlJ,GAAa5hD,IAAOC,IAAV,mNAOH,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aA8FlB09J,GApFV,SAAC,GAA0D,IAAxDma,EAAuD,EAAvDA,WAAYpc,EAA2C,EAA3CA,cAAeinD,EAA4B,EAA5BA,OAAQ/kD,EAAoB,EAApBA,cAC/BjwJ,EAAS8uJ,KAAT9uJ,KAEFmwJ,GAAiBnwJ,GAAQA,EAAK+f,MAAMS,OAAS,EAEnD,OACI,cAAC,GAAD,UACI,cAAC0d,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,SAAC1pI,GACb+0B,IACAwxH,EAAcvmJ,IAElBiyC,SAAU,WACNld,KAEJsvH,cAAeA,KAV3B,SAcK,SAAC7hJ,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,sBAAMnyB,IAAKA,EAAX,SACI,cAAC,KAAD,CACIoF,MAAO,qBACPmpC,OAAQ,aACRhpC,UAAW0+I,EAHf,SAKI,cAAC,GAAD,CACIl+I,QAAS,SAAAihB,GACLA,EAAEC,mBACDg9H,GAAiBzxH,KAEtBjtB,SAAU0+I,EALd,SAOI,cAAC,GAAD,UACI,eAAC4kD,GAAD,CAAsBC,OAAQA,EAA9B,UACKA,EAAS,cAAC,GAAD,CACNnkM,MACIs5J,EAAa,EACPr4K,IAAUC,OACLQ,WACLT,IAAUC,OAAOkB,MAE3Bwe,SAAU0+I,EACVnhJ,YAAU,cARJ,SAULm7J,IACY,cAAC,GAAD,CACbt5J,MACIs5J,EAAa,EACPr4K,IAAUC,OACLQ,WACLT,IAAUC,OAAOkB,MAE3Bwe,SAAU0+I,EACVnhJ,YAAU,cARG,SAUZm7J,EAAa,EACR,QADL,UAEQA,EAFR,YAGSA,EAAa,EACP,QACA,UAGpB,cAAC,GAAD,CAAY14J,SAAU0+I,EAAtB,SACK9xH,EACG,cAACivB,GAAA,EAAD,IAEA,cAACD,GAAA,EAAD,uBC9InC2tB,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CuiM,uBAAwB,CACpBlxI,SAAU,KAGdo2E,qBAAsB,CAClB34G,QAAS,GAGbg4K,oBAAqB,CACjB3oM,MAAO,QCAF4oM,GAAmB,WAC5B,IAAMz/L,EAAU0R,YAAY3R,MAE5B,OAAO3X,uBACH,SAACyI,GACG,IAAMhF,EAAI,UAAMgF,EAAKkmC,UAAX,YAAwBlmC,EAAKomC,UACvC,OAAc,OAAPj3B,QAAO,IAAPA,OAAA,EAAAA,EAASnI,MAAOhH,EAAKgH,GAArB,UAA6BhM,EAA7B,UAA4CA,IAEvD,CAACmU,KCmFHmqF,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GAEjBw8D,GAmDD,SAAC,GAoBC,IAAD,YAnBFpvM,EAmBE,EAnBFA,MACA0f,EAkBE,EAlBFA,QACA2vL,EAiBE,EAjBFA,YACAC,EAgBE,EAhBFA,mBACA75K,EAeE,EAfFA,sBACA85K,EAcE,EAdFA,aACA7/L,EAaE,EAbFA,QACAgB,EAYE,EAZFA,eACAimG,EAWE,EAXFA,cACAz5F,EAUE,EAVFA,eACAuvL,EASE,EATFA,gBACA+C,EAQE,EARFA,uBACAC,EAOE,EAPFA,mBACA5wG,EAME,EANFA,cACAhzF,EAKE,EALFA,QACA6jM,EAIE,EAJFA,sBACAC,EAGE,EAHFA,gBACAx8D,EAEE,EAFFA,uBACA1E,EACE,EADFA,YAEM34D,EAAUb,KADd,EAGwChqD,mBAAS,IAAIhD,MAHrD,mBAGK+mD,EAHL,KAGoBqkE,EAHpB,OAIoCpoH,oBAAkB,GAJtD,mBAIK8mD,EAJL,KAIkBuhE,EAJlB,KAMIs8D,EAAgBT,KANpB,EASElkL,mBAAc,MAThB,mBAQK4kL,EARL,KAQ8BlB,EAR9B,OAUkC1jL,mBAChC,MAXF,mBAUKsoH,EAVL,KAUiBC,EAVjB,KAcIJ,EAAgB5I,KAChBslE,EAA0BlqL,eAC1BwuF,EAA8BvzF,eAE9Bge,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACTmN,SAAUjN,EACV7V,QAAS,KACTL,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGb+4H,IACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,SACfo3I,EAAYz1G,MAAQ8M,KAAa4B,aAAansC,KACxCkzI,EAAYp3I,OACZwnC,EAlCR,GA4CED,aAAqB60G,IAPrBx6I,GArCF,GAqCEA,aACAg4B,GAtCF,GAsCEA,cACA4O,GAvCF,GAuCEA,WACAE,GAxCF,GAwCEA,YACAS,GAzCF,GAyCEA,UACAK,GA1CF,GA0CEA,oBACAJ,GA3CF,GA2CEA,UAGE7gB,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAE/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEAiB,GACF7zI,GACAA,EAAMga,OACN28F,GACAA,EAAcl8F,OAASza,EAAMga,MAAMS,OAEjCk2I,GAAsB74J,uBACxB,SAAC2a,GACG,IAAMpT,EACDW,GAASA,EAAMga,MAAMjR,KAAI,SAACxI,GAAD,OAAkBA,EAAKgH,OAAQ,GAC7DioM,EACInwM,EACAoT,EACAohI,MAGR,CAAC7zI,EAAO6zI,GAA6B27D,IAGnCvuL,GAAck5B,eAEd+9E,GAAoB,SAAC33H,GAElBA,GACAmP,GACAuR,GAAYzH,SAASjN,KAAgB4rH,wBAI1Cz4G,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QAAQ,UAAW8I,EAAKgH,GAAG7P,YACnD,CAAEm8H,WAAW,KAIf66E,GAAqB,SAACnuM,GAEnBA,GACAmP,GACAuR,GAAYzH,SAASjN,KAAgB2oD,eAI1Cx1C,EAAQH,KAAKluB,IAAOmB,QAAQiF,QAAQ,UAAW8I,EAAKgH,GAAG7P,cAGrD6mM,GAAiB,SAACh+L,GACfA,GACLmf,EAAQH,KAAKluB,IAAOmB,QAAQiF,QAAQ,UAAW8I,EAAKgH,GAAG7P,cAUrDy2J,GAAmB/vI,eACnBosL,GAAqB1pM,cACrBqsM,GAAuBpsM,cAEvBkuE,GAAcn3E,uBAAY,YACxB,OAAC4X,QAAD,IAACA,OAAD,EAACA,EAASrU,aACdpC,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBy7D,EAAYp2M,GAAc,CAACusC,KAAWtqC,QAASwU,EAAQrU,WACvDg4I,EAAiB,IAAIprH,MACrBqrH,GAAe,GACfk8D,EAAuB,IAAI,EAAM37D,OAClC,CACC56I,GACA26I,GACAy7D,EACAG,EACA37D,GALD,OAMCnkI,QAND,IAMCA,OAND,EAMCA,EAASrU,YAGP00M,GAAoClE,GACtC5yM,GADoE,iBAEpEyW,QAFoE,IAEpEA,OAFoE,EAEpEA,EAASrU,iBAF2D,QAE9C,EAF8C,iBAGpE2E,QAHoE,IAGpEA,OAHoE,EAGpEA,EAAOmhD,aAH6D,QAGpD,EAChB8tB,IAGEm+H,GACFlyD,GACIsvD,GACA2C,GACAp7H,EACA,CACI7hB,WAAY6oF,GACZ5oF,eAAgBk/I,EAChB7gJ,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAO,EACPC,OAAQuF,EAAMmhD,QAElB1Z,aAAc,CAACjC,KAAWtqC,QAC1BG,UAAS,iBAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,iBAAX,QAAwB,EACjCkqC,gBAAgB,GAEpBgpB,UAAW,wBAGnB0gB,IAGF4xH,GAAY,yCAAG,qCAAA9mL,EAAA,0DACbmD,IAAkBy5F,EADL,gCAEuBmqF,GAChCnqF,EACA9nG,KAAqBI,aACrBX,KAAqBjB,KAH+B,aAAC,gBAIhDpU,IAJ+C,IAIjC4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GACJ,OAAO8yJ,GAA2Bp2C,EAAe32G,EAAO/F,MAT/C,gBAELojB,EAFK,EAELA,kBAUFg+H,EAAgB8S,GAAiBjxI,GAEjC6jL,EAAwB1lD,EAAcpgI,QACxC,SAAAtU,GAAC,OACG0W,EAAkB7D,SAAS7S,IAC3B0W,EAAkB7D,UAAU7S,MAE9Bq6L,EAAyB9jL,EAAejC,QAC1C,SAAAtU,GAAC,OAAIA,EAAI,IAAM0W,EAAkB7D,SAAS7S,MAG9CymM,GACI,CACI3sJ,WAAY,OACZ1jD,UAAW45G,GAEfqqF,EACAD,GA7BS,2CAAH,qDAkCZiP,GAAoBl4M,uBACtB,SAACyI,EAAcynJ,GAAmB,IAAD,EC5XZioD,EAAwBjkJ,ED6XnCkkJ,GC7XWD,ED6XSjoD,EC7Xeh8F,ED6XhB,UAAgBzrD,EAAK+/B,aAArB,QAA8B,GC5XxD,CACHnkB,SAAU8zL,EACVxzM,QAASuvD,EAAU/wC,QAAO,SAAAtU,GAAC,OAAKspM,EAAaz2L,SAAS7S,QD2XlD2oM,EACI/uM,EAAKgH,GACL2oM,EAAK/zL,SACL+zL,EAAKzzM,SACL,EACAwyE,MAGR,CAACqgI,EAAoBrgI,KAGnB6xH,GAAuBhkM,cAEvBiwJ,GAA6BhwI,eAE7B2kI,GAAmC,WACrCitD,EAA2B,OAGzBhtD,GAAwB7pJ,uBAC1B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KACVs0M,GASAF,EACI,CAT6B,CAC7B7sM,KAAM,SACNsC,aAAc,KACds0I,WAAYm2D,EACZztM,aACAC,SAKAq/I,MAIZ,CAACmuD,EAAyBF,IAGxBQ,GAAsCr4M,uBAAY,WACpD03M,EAAuB,IAAI,EAAM37D,MAClC,CAACA,GAA6B27D,IAE3B3tD,GAA8B3F,GAChC,SACA,CACI7gJ,UAAS,iBAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,iBAAX,QAAwB,GAErCpC,GACA+G,EAAMmhD,MACN8tB,IAGEmhI,GAA2Bt4M,uBAC7B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KAEd,GAAIw2E,EACA8vE,GAA4B,6BAAK,CAAEx/I,SAAW,CAAED,qBAEhD,GAAIu0G,EAAe,CACf,IAAM05F,EAAgB15F,EAAc5tG,KAChC,SAAAxI,GAAI,MACC,CACGuC,KAAM,SACNsC,aAAc,KACds0I,WAAYn5I,EACZ8B,OACAD,iBAIZutM,EACIU,EACAF,OAKhB,CACIp+H,EACA8vE,GACAlrC,EACAg5F,EACAQ,KAIFG,GAAwBx4M,uBAC1B,SAACuH,IACc,OAAPqQ,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAagE,GAAWqwM,GACjCA,EAAsBz2M,GAAcyW,EAAQrU,UAAWgE,KAG/D,QAACqQ,QAAD,IAACA,OAAD,EAACA,EAASrU,UAAWq0M,EAAuBz2M,KAG1CkmG,GAAkBrnG,uBACpB,SAACuH,IACc,OAAPqQ,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAagE,GAAWqwM,GACjCA,EACIz2M,GACAyW,EAAQrU,UACR02E,OAAcl5E,EAAYwG,EAC1B0yE,EAAc/xE,EAAMmhD,WAAQtoD,KAIxC,QACI6W,QADJ,IACIA,OADJ,EACIA,EAASrU,UACTq0M,EACAz2M,GACA84E,EACA/xE,IAIFuwM,IACD55F,GAAkBA,IAAkBA,EAAcl8F,OAEjD5f,GAAU5B,GAAa4B,QACvB21M,GAAa5+D,GAAW,OAAQ/2I,GAASglC,IACzC0tK,GAAS37D,GAAW,YAAa/2I,GAASglC,IAC1C4wK,GAAS7+D,GAAW,cAAe/2I,GAASglC,IAC5C6wK,GAAa9+D,GAAW,cAAe/2I,GAASglC,IAChD8wK,GAAiB/+D,GAAW,aAAc/2I,GAASglC,IACnD+wK,GAAiBh/D,GAAW,kBAAmB/2I,GAASglC,IAWxD6tK,GAAoB,SAAC9pC,GACvBnjI,GAAU,UAAWmjI,IAGnBitC,GAAqB,SAAC11L,GACxBslB,GAAU,UAAWtlB,IAGnBq5H,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAIrBo9E,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,IACzColG,YAAiB,OAALr+F,QAAK,IAALA,OAAA,EAAAA,EAAOga,MAAMS,SAAU,IAGjCozL,GAAgBnmD,KAChBkC,GAAYrC,KAMZupD,GAA+Bh5M,uBAAY,WACxC67I,IAA2B,IAAdA,GAKd9xF,aAAehR,KAAcM,OAJ7B89B,OAML,CAAC0kE,GAAW1kE,KAOT8hI,GAAsBj5M,uBACxB,SAACuH,GACG,IAAM2xM,EAAoC,IAAnB3xM,EAAQob,QAAuBs3D,EACtDw9H,EACIlwM,EACA0yE,EACM2gE,GAAYz5I,GAAc+G,GAASA,EAAMmhD,OACzCloD,GACN+3M,EACAF,MAGR,CACI/+H,EACAw9H,EACAuB,GACA73M,GACA+G,IAIFixM,GAAqCn5M,uBACvC,SAACuH,GACG,IAAM6xM,EAA8B,IAAnB7xM,EAAQob,OAAe,YAAc,cACtD25F,EAA4B,CACxB7+D,WAAW,cAAD,OAAgB27J,EAAhB,KACV1gK,YAAY,4BAAD,OACqB0gK,EADrB,2FACgHA,EADhH,8CAEXx7J,iBAAkB,SAClBD,kBAAmB,aACnBD,WAAY,SACZG,UAAW,kBAAMo7J,GAAoB1xM,QAG7C,CAAC0xM,GAAqB38F,IAOpB+8F,GAAoB,SAACh2L,GACvB42D,EACMg+H,KACAkB,GAAmC91L,IAG7CgkL,IAAiB,YACT,OAACzvL,QAAD,IAACA,OAAD,EAACA,EAASrU,aACdpC,GAAauB,MAAQo4I,GACrB35I,GAAawB,OAASm5I,GACtBy7D,EAAYp2M,GAAc,CAACusC,KAAWtqC,QAASwU,EAAQrU,cACxD,CAACg0M,EAAap2M,GAAd,OAA4ByW,QAA5B,IAA4BA,OAA5B,EAA4BA,EAASrU,YAExC+vB,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,WACN,OAAO,kBACHokL,EAAuB,IAAI,EAAM37D,OAEtC,IAEHzoH,qBAAU,WACNokL,EAAuB,IAAI,EAAM37D,MAElC,CAAC7zI,EAAO0f,EAAQE,SAASukC,WAE5B/4B,qBAAU,YACW,OAAburF,QAAa,IAAbA,OAAA,EAAAA,EAAel8F,SAAUk8F,EAAcl8F,SAAWza,EAAMmhD,OACxDmyF,GAAe,KAEpB,CAACtzI,EAAMmhD,MAAOw1D,IAEjBvrF,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAER,CAACozG,GAAeD,GAAWnzG,KAE9BpV,qBAAU,WACN,IAAMs0I,EAAgB1/J,EAChBA,EAAMga,MAAMjR,KAAI,SAAAxI,GAAI,OAAIsd,OAAOtd,EAAKgH,OACpC,GACAm6L,EAAejjL,aACjBk4F,EACA+oD,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtC+0L,EAAuB9N,GAAc,KAE1C,CAAC/qF,EAAe32G,EAAOwvM,IA0B1BpkL,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgBopH,cAChC,CAACyd,IAEJhoH,qBAAU,WACN,OAAO,WACHyiL,KACAjkD,QAEL,CAACikD,GAAejkD,KAQnB,IAoDMg4C,GAAgCznD,GAClCqwD,GACA2C,GACAl+H,IAyBJ,OACI,eAAC,GAAD,CACImiD,SAAS,QACTuC,WAAkB,OAAPjkH,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAChB,cAAC,GAAD,CACIA,UAAWqU,EAAQrU,UACnBygK,mBAAoB9tJ,aAAW,OAAC0B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,QAGvDm4H,KAAM,cAAC,GAAD,IACN0C,cAAc,kBACdpqH,SAAS,QAVb,YAYO6jM,GACC,cAACv6J,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACIE,SACMnxD,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVi6B,OAAQ+gF,GACR7pH,QAAS,kBAAM62K,EAA2B,WAIrD9iM,IAAYkmE,GAAe,cAAC,KAAD,IAE5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbwM,SAAUr0F,KAAoBA,EAAe+J,OAC7CxgB,KAAI,OAAE+F,QAAF,IAAEA,OAAF,EAAEA,EAAOga,MACbtJ,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,mBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAYja,EAAMmhD,MAClBygB,aAAcgxE,GACd74C,aA/HK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IA+HMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,gBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBAAuBhM,GAAY65C,eAEvCzuC,8BACKytG,kBAAcz6F,KAAmBy6F,kBAAcpxM,GACpD4jG,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAE8kC,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,OAC/BR,WAAYja,EAAMmhD,MAClBygB,aAAcgxE,GACdluC,iBAAkB,WACd8qG,EACI,IACA,EACA37D,IAEJP,GAAe,IAEnBjjH,YAAa,WACTsgI,IAAoB,GACpBrd,GAAe,IAEnB3uC,kBAAmB,CACfj5F,SAAU6kM,GACVt1G,qBAAsB4lG,GACtB9gG,uCAAwC,CACpCxzF,KAAgB2rC,mBAEpB0nD,wBAAyB,CACrBrzF,KAAgBsiM,mBAEpB5vG,wBA3MQ,WACxBj/F,GAASA,EAAMga,OAAS28F,GACxBmqF,GACInqF,EACA9nG,KAAqBI,aACrBX,KAAqBjB,KAHL,aAAC,gBAIZpU,IAJW,IAIG4B,QAAS,KAC5Bk3E,GACF3+C,MAAK,SAACn5B,GAAe,IACXojB,EAAsB0vI,GAC1Bp2C,EACA32G,EACA/F,GAHIojB,kBAMRoY,EAAsBpY,OA6LVwiF,qBAAsB,CAACtzF,KAAgBgoD,YACvC8qC,kBAAkB,EAClBC,oBAAqBixG,GACrBzxG,yBAA0BsxG,GAC1BtwG,sBAAuB,CACnBvzF,KAAgBuiM,kBAEpB1vG,qBAAsBmxG,GACtBpxG,gBAAiB,kBACbA,GACIwX,GAAiBA,EAAcl8F,OACzBk8F,EACA,KAEdzV,sBAAuB,CACnB30F,KAAgBwiM,aAEpBhuG,gBAAiB,mBACjBI,oBAAqB,kBACjBgwG,GACIx6F,GAAiBA,EAAcl8F,OACzBk8F,EACA,KAEd5kC,YAAaA,EACb93D,WAAYja,EAAMmhD,MAClB63B,YAAa,CACTt+E,MAAQ02M,kBAAa,OAACn4M,SAAD,IAACA,QAAD,EAACA,GAAc0B,YAE9B,KADA1B,GAAa0B,WAGnB0B,QAAU+0M,kBAAa,OAACn4M,SAAD,IAACA,QAAD,EAACA,GAAc0kB,UAEhC,KADA1kB,GAAa0kB,SAEnBikB,OAASwvK,kBAAa,OAACn4M,SAAD,IAACA,QAAD,EAACA,GAAcmnC,SAE/B,KADAnnC,GAAamnC,QAEnBvmC,OAASu3M,kBAAa,OAClBn4M,SADkB,IAClBA,QADkB,EAClBA,GAAc68D,4BAGZ,KADA78D,GAAa68D,4BAGvB94C,cAAe25F,EACf19B,gCAAiChK,KAGzC60B,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIw0G,kBAAmBx8H,GAAkB,GACrCm5L,aAAc6D,GACd3D,iBACI9wM,GAAamnC,QACPnnC,GAAamnC,QACb,GAEVouK,cAAeqC,GACf1jE,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAnBtB,SAqBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcE,GACVzzI,IAEJyS,SAGU,IAFNghI,GACIzzI,KAEJs/F,GAAY45C,eAEhBnmI,SAAS,uBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAoC,KAApB,OAAL7L,QAAK,IAALA,GAAA,UAAAA,EAAOga,aAAP,eAAcS,QAC9B+9E,iBAAkB,CACd7sF,KAAMuqI,GACN7zI,KAAM,eACN2J,SAAU,cAEdysF,uBAAwB,CACpBh4C,WAAY,QACZz0C,SAAU,oBAEd0sF,uBAAwB,CACpB1sF,SAAU,wBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,UAAWkkG,KAAmBA,EAAcl8F,OAC5C/O,UAAW1L,GAAUA,GAASA,EAAMga,MAAMS,OAAS,EACnD/H,QAASmhI,KAAgC9hE,EACzCe,YA9QU,SAAC/wB,GAC3B4uG,GAAoB5uG,EAAM5E,OAAO1qC,SACjC6gI,GAAe,IA6QCtnI,SAAU,mBAGd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJiqM,IAJF,IAKD9kM,SAAU6sF,GAAY85C,eACtBjsI,UAAW0vE,EAAQ60H,uBACnB3+L,SAAU,gBAPT,2BAUDC,MAAO,QACP1F,MAAO,GACJkqM,IAZF,IAaD/kM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,iBAdT,2BAiBDC,MAAO,eACP1F,MAAO,GACJmqM,IAnBF,IAoBDhlM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,wBArBT,2BAwBDC,MAAO,OACP1F,MAAO,GACJgnM,IA1BF,IA2BD7hM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,gBA5BT,2BA+BDC,MAAO,gBACP1F,MAAO,GACJqqM,IAjCF,IAkCDllM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,6BAnCT,2BAsCDC,MAAO,aACP1F,MAAO,GACJoqM,IAxCF,IAyCDjlM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,sBAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAIfixF,UAAW,CACPE,WAAYwgC,GACZtgC,kBArTM,SAAC71C,EAAYxhD,GACnC+yI,GAAe,GApcK,SAACnmH,EAAQ5sB,GAC7B4sB,EAAEC,kBACI7sB,EAAKgH,IACPkoM,EAAmBlvM,EAAKgH,IAkc5B0uJ,CAAgBl0G,EAAOxhD,IAoTPo3F,aA/TM,SAACp3F,GAAD,QACpBo2G,KAAmBp2G,EAAKgH,IAAMovG,EAAcn9F,SAASjZ,EAAKgH,KA+T5CswF,gBA7SS,SAACjC,GAC1B,OAAO29C,KAAU,OAAK39C,QAAL,IAAKA,OAAL,EAAKA,EAAG,KA6STY,kBAAmB,SAACj2F,GAAD,MAAmB,CAClCmQ,eAAgBnQ,EAAKjH,OACrBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAGpBu8D,cAAe,SAACn4E,GAAD,OA1SV,SAACA,EAAiBkE,GAC3CksM,EAAgBlsM,EAAKgH,GAAIlL,EAAS4yE,IA0SV8lE,CAAqB14I,EAASkE,MAEtCyL,SAAU,YACVyrF,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvB34C,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTqvM,EAAcrvM,IAClBu1F,eAAgB,SAACv1F,GAAD,MAAmB,CAC/B+yC,cAAe,CACX7M,UAAWlmC,EAAKkmC,UAChBE,SAAUpmC,EAAKomC,SACfqN,QAASzzC,EAAK+zC,SACdz6C,OAAQ0G,EAAK1G,QAEjBsS,KAAM,OAEVH,SAAU,SAGlB,CACIirF,UAAW,eACXkB,cAAeriB,EAAQo5H,oBACvB93G,wBAAyB,SAAC72F,GAAD,eACrB,mCACKuvM,EAAwB9pL,oBACrBzZ,KAAgB8E,aAEhBtD,aAAkB,UACdxN,EAAKzE,YADS,aACd,EAAWP,MAEX,cAACkxD,GAAA,EAAD,IAEA,cAAC,GAAD,CACIwiJ,QAAQ,EACR7qC,WACI7jK,EAAK8wM,YAAc,EAEvBrpD,cAAa,UACTznJ,EAAK+/B,aADI,QACK,GAElB4pH,cAAe,SACXvmJ,GADW,OAGXqsM,GACIzvM,EACAoD,MAMhBmsM,EAAwB7hM,gBACpB,iCAAO1N,EAAK8wM,WAAZ,WAMpB,CACIp6G,UAAW,aACXj/B,oBAAqB,SAACz3D,GAAD,OAChBA,EAAK+wM,kBACVp6G,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTA,EAAK+wM,iBAAiB55M,YAC1BsU,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAACz3D,GAAD,OAChBA,EAAKzE,MACVo7F,WAAY,CACRrB,YAAa,SAACt1F,GAAD,uBACTA,EAAKzE,YADI,aACT,EAAWmQ,OACfD,SAAU,cAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAACz3D,GAAD,OAChBA,EAAKgxM,cACVr6G,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTkpB,aAAWlpB,EAAKgxM,eACpBvlM,SAAU,qBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAACz3D,GAAD,OAChBA,EAAKixM,cACVt6G,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTkpB,aAAWlpB,EAAKixM,eACpBxlM,SAAU,uBAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SAACj2F,GAChB,MAAO,CACH0H,KAAMsrI,KAAU,OAAKhzI,QAAL,IAAKA,OAAL,EAAKA,EAAMgH,IAC3Bs7C,WAAY,WA1oBzB,IAAC4wB,KA2oBkC,OAAClzE,QAAD,IAACA,OAAD,EAACA,EAAMgH,KAxoB7DisI,EADAD,IAAe9/D,EACD,KAEAA,IAuoBkB/iE,eAAgBnQ,EAAKjH,OACrB0S,SAAU,kBAM1B,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAACn2F,GAAD,OACrB,cAAC,GAAD,CACIA,KAAMA,EACN23H,kBACIA,GAEJw2E,mBACIA,GAEJnQ,eAAgBA,GAChBoQ,2BACIA,EAEJxvG,gBACImxG,GAEJ1B,mBACIuC,GAEJ3G,mBAAoB,SAChBpgB,EACAxvC,GAFgB,OApa7B,SAC3BwvC,EACAxvC,EACAzjJ,GAEAyqM,GACI,CACInhJ,WAAY,OACZ+5F,SAAUrjJ,GAEdizL,EACAxvC,GA6ZoCozD,CACI5jB,EACAxvC,EACAr6I,EAAKgH,KAGb+1G,YAAW,OAAC3G,QAAD,IAACA,OAAD,EAACA,EAAel8F,QAC3Bw+D,gCACIhK,iBAsEjCwiI,GAxDmB,WAC9B,IAAM7nM,EAAQqkC,eACRvuB,EAAUW,cACVgvL,EAAc7nK,eACdusE,EAAapsE,eACbj4B,EAAU0R,YAAY3R,MAEtBnW,EAASm5B,eACT68K,EAAqBtnK,eACrBykK,EAAkBpjK,eAClB5T,EAAwBD,eACxBg6K,EAAyB9lK,eACzB+lK,EAAqB9lK,eACrBk1D,EAAgBhkE,eAChB60K,EAAwBpnK,eACxBopK,EAAgBxpK,eAChBirG,EAAyBl/G,eACzBw6G,EAAcrtH,YAAYotH,IAEhC,OACI,cAAC,KAAkBz4D,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,SAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,SAAjD,SACI,cAAC,KAAuB48D,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC,GAAD,CACIuG,QAASA,EACT2vL,YAAaA,EACbE,aAAcx7F,EACdrkG,QAASA,EACT1P,MAAO4J,EAAMk8C,KACb6wD,cAAe/sG,EAAM+sG,cACrB9qG,QAASjC,EAAMiC,QACf6E,eAAgBpX,EAAO6iB,SACvBmzL,mBAAoBA,EACpB75K,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvBuvL,gBAAiBA,EACjB+C,uBAAwBA,EACxBC,mBAAoBA,EACpB5wG,cAAeA,EACf6wG,sBAAuBA,EACvBC,gBAAiB+B,EACjBv+D,uBAAwBA,EACxB1E,YAAaA,Y,SNhvCzBp+H,K,4DAAAA,E,gEAAAA,E,gEAAAA,E,8DAAAA,E,8DAAAA,E,8DAAAA,E,8DAAAA,E,kCAAAA,E,4CAAAA,E,8CAAAA,E,kDAAAA,E,kDAAAA,E,sDAAAA,E,0DAAAA,E,qCAAAA,Q,KQ+BL,I,wBAAMshM,GAAyB,WAClC,IAAMxoM,EAAWO,cACXkoM,EAAkB94M,cAClB8gB,EAAcnQ,cACpB,OAAO3R,uBACH,SAACqG,GACGgL,ER4DD,CACHrG,KAAMuN,GAAQwhM,wBQ5DVD,EAAgBzzM,GACXi1B,MAAK,SAAAn5B,GACFkP,ER8Db,SAA+BlP,GAClC,MAAO,CACH6I,KAAMuN,GAAQyhM,wBACd73M,QQjEqB83M,CAAsB93M,OAElCq5B,OAAM,SAAC5rB,GACJyB,ERkEb,SAA+BzB,GAClC,MAAO,CACH5E,KAAMuN,GAAQ2hM,wBACdtqM,SQrEqBuqM,CAAsBvqM,EAAMgB,UACrCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUyoM,EAAiBh4L,KAIvBs4L,GAAiC,WAC1C,IAAM/oM,EAAWO,cACX6+J,EAAgBvuK,cAChB4f,EAAcnQ,cACpB,OAAO3R,uBACH,SAACkwE,EAAWwgG,EAAqClX,GAC7CnoJ,ERED,CACHrG,KAAMuN,GAAQ8hM,+BQFV,IAAMzpC,EAAqB,IAAIC,SAW/B,OAVAD,EAAS/kH,IAAI,OAAQqkB,GACrB0gG,EAAS/kH,IAAI,OAAQ,SACrB+kH,EAAS/kH,IAAI,uBAAwB,QAChC6kH,EAAmB9wK,WAAW8hB,SAAS,UACxCkvJ,EAAS/kH,IACL,qBACA6kH,EAAmB9wK,YAEvB45J,GAAUoX,EAAS/kH,IAAI,WAAY2tG,GAEhCiX,EAAcG,GAChBt1I,MAAK,SAAAn5B,GRNf,IACH2uK,EACAxiI,EQQgB,OAHAj9B,GRNhBy/J,EQOgDJ,ERNhDpiI,EQMoEnsC,ERJ7D,CACH6I,KAAMuN,GAAQ+hM,+BACdn4M,KAAM,CACF2uK,eACAxiI,eQEe,aAEV9S,OAAM,SAAC5rB,GAGJ,OAFAyB,ERAb,SAAqCzB,GACxC,MAAO,CACH5E,KAAMuN,GAAQgiM,+BACd3qM,SQHqB4qM,CAA4B5qM,EAAMgB,UAC3CkR,EAAYlS,EAAMgB,QAAS,SACpB,aAGnB,CAACS,EAAUo/J,EAAe3uJ,KAIrB24L,GAAsC,WAC/C,IAAMppM,EAAWO,cACjB,OAAO5R,uBACH,SAACmC,EAA2BgvK,GACxB9/J,ERnEL,SAAyClP,EAAWgvK,GACvD,MAAO,CACHnmK,KAAMuN,GAAQmiM,8BACdv4M,OACAgvK,UQ+DawpC,CAAgCx4M,EAAMgvK,MAEnD,CAAC9/J,KAIIupM,GAAsC,WAC/C,IAAMvpM,EAAWO,cACjB,OAAO5R,uBACH,SAAC0vK,GRhDF,IAAyCvtK,EQiDpCkP,GRjDoClP,EQiDKutK,ERhD1C,CACH1kK,KAAMuN,GAAQsiM,8BACd14M,YQgDA,CAACkP,KAIIypM,GAAsC,WAC/C,IAAMzpM,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAY7S,EAAe0sK,GACxBr+J,ERxEL,SACHlP,EACAa,EACA0sK,GAEA,MAAO,CACH1kK,KAAMuN,GAAQwiM,8BACdrrC,OAAQA,EACRvtK,KAAMA,EACNa,MAAOA,GQ+DMg4M,CAAgCnlM,EAAO7S,EAAO0sK,MAE3D,CAACr+J,KAII4pM,GAAsC,WAC/C,IAAM5pM,EAAWO,cACjB,OAAO5R,uBACH,SAACwlL,GRxFF,IAAyCrjL,EQyFpCkP,GRzFoClP,EQyFKqjL,ERxF1C,CACHx6K,KAAMuN,GAAQ2iM,8BACd/4M,YQwFA,CAACkP,KAWI8pM,GAA4B,WACrC,IAAM9pM,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAY7S,EAAwBmuK,GACjC9/J,ERrBL,SACHlP,EACAa,EACAmuK,GAEA,MAAO,CACHnmK,KAAMuN,GAAQ6iM,iBACdp4M,MAAOA,EACPb,KAAMA,EACNgvK,OAAQA,GQYKkqC,CAAsBxlM,EAAO7S,EAAOmuK,MAEjD,CAAC9/J,KAIIiqM,GAA2B,WACpC,IAAMjqM,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ER7DG,CACHrG,KAAMuN,GAAQgjM,oBQ6Df,CAAClqM,KAGKmqM,GAA+B,WACxC,IAAMnqM,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ER9DG,CACHrG,KAAMuN,GAAQkjM,yBQ8Df,CAACpqM,KAGKqqM,GAAmC,WAC5C,IAAMrqM,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ER9BG,CACHrG,KAAMuN,GAAQojM,8BQ8Bf,CAACtqM,KAGKuqM,GAA2C,WACpD,IAAMvqM,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,ER/BG,CACHrG,KAAMuN,GAAQsjM,gCQ+Bf,CAACxqM,KC/IFw4K,GAAsB75K,IAAOC,IAAV,4BAEnB65K,GAAqB95K,IAAOC,IAAV,+IAQlB8xJ,GAAoB/xJ,IAAOC,IAAV,4FAMjButE,GAAcxtE,IAAOC,IAAV,4FAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnC20L,GAAsB/5K,IAAOC,IAAV,wHAOnB+5K,GAAiCh6K,IAAOC,IAAV,kDAI9B2nJ,GAA0B5nJ,IAAOC,IAAV,sDAIvBg6K,GAAgBj6K,IAAOC,IAAV,qHAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInCw1L,GACE,yBADFA,GAEO,2CAFPA,GAGU,UAHVA,GAIgB,UAJhBA,GAKK,gBALLA,IAMO,EANPA,IAOM,EAGNC,GACE,gCADFA,GAEO,kCAFPA,GAGU,UAHVA,GAIgB,KAJhBA,GAKK,mBALLA,IAMO,EANPA,IAOM,EAGNC,GAAa,CACf/mL,QAAS,CACLuN,QAAS,mCACTy5K,WAAY,cACZl2K,MAAO,mBACPs1K,SAAS,EACTD,QAAQ,GAEZ3qI,MAAO,CACHjuC,QAAS,oCACTy5K,WAAY,eACZl2K,MAAO,oBACPs1K,SAAS,EACTD,QAAQ,GAEZ1qI,SAAU,CACNluC,QACI,6LACJy5K,WAAY,eACZl2K,MAAO,gBACPs1K,SAAS,EACTD,QAAQ,GAEZpmL,OAAQ,CACJwN,QAAS,oCACTy5K,WAAY,eACZl2K,MAAO,oBACPs1K,SAAS,EACTD,QAAQ,IAIVc,GAAmB,CAAC1oI,KAAkBx+C,QAEtCk0E,GAaD,SAAC,GAQC,IAPH31B,EAOE,EAPFA,UACAm6J,EAME,EANFA,sBACAzlC,EAKE,EALFA,OACA9hJ,EAIE,EAJFA,SACAwnL,EAGE,EAHFA,mBACAC,EAEE,EAFFA,yBACArxB,EACE,EADFA,WAEMsxB,ECKuC,WAC7C,IAAM5qM,EAAWO,cACXsqM,EAAkBf,KAClB1tB,EAAwB3rL,eAE9B,OAAO9B,uBACH,SAACiB,GACOA,GACAwsL,EAAsB,QAAS,CAACxsL,IAAcq6B,MAC1C,SAACgT,GACGj9B,EACI6b,aAA8BohB,EAAU,WAE5C4tK,EACIt6J,KAAkB/C,MAClB,UACA,QAMpB,CAACxtC,EAAU6qM,EAAiBzuB,ID3BO0uB,GACjCtnC,EAAQS,KAA0B1oJ,WAClC62J,EAAa5O,GAASA,EAAM4O,WAHhC,EAIsCtwJ,oBAAS,GAJ/C,mBAIK43J,EAJL,KAImBC,EAJnB,OAKgC73J,oBAAS,GALzC,mBAKK83J,EALL,KAKgBC,EALhB,OAM4C/3J,oBAAS,GANrD,mBAMKg4J,EANL,KAMsBC,EANtB,OAOgCj4J,mBAC9ByuB,KAAkBx+C,QARpB,mBAOKioL,EAPL,KAOgBC,EAPhB,KAgBIC,EAAc32K,qBAAW42K,IACzB/X,EAAO7+J,qBAAW8+J,IAUlB0oC,EAAiB7wB,GAAeZ,EAEtC,OACI,eAAC,GAAD,WACKI,GACG,cAAC,GAAD,CACIjtI,SAAU,WACNktI,GAAgB,IAEpBntI,UAAW,WACPmtI,GAAgB,GAChB8wB,EAAsB,KAAMzwB,IAEhCl3K,MAAOi2K,GAAWiB,GAAWl3K,MAC7BwpC,kBAAmBysI,GAAWiB,GAAWhB,WACzCf,gBAAiBc,GAAWiB,GAAW5B,QACvCD,OAAQY,GAAWiB,GAAW7B,OAXlC,SAaKY,GAAWiB,GAAWz6K,UAG9Bq6K,GACG,cAAC,GAAD,CACIntI,SAAU,WACNotI,GAAa,IAEjBrtI,UAAW,WACPqtI,GAAa,GACb6wB,IACAtoC,EAAKhpK,OAAO4kK,GAAekX,OAE/BpyK,MAAO+1K,GACPvsI,kBAAmBusI,GACnBtsI,iBAAkBssI,GAClBZ,gBAAiBY,GACjBX,eAAgBW,GAChBV,OAAQU,GAdZ,SAgBKA,KAGRiB,GACG,cAAC,GAAD,CACIrtI,SAAU,WACNstI,GAAmB,IAEvBvtI,UAAW,WACPutI,GAAmB,GACnB4wB,IACAvoC,EAAKhpK,OAAO4kK,GAAesE,OAE/Bx/J,MAAOg2K,GACPxsI,kBAAmBwsI,GACnBvsI,iBAAkBusI,GAClBb,gBAAiBa,GACjBZ,eAAgBY,GAChBX,OAAQW,GAdZ,SAgBKA,KAGT,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,CAAah5K,YAAU,uBAAvB,SACKy4K,GAAe,YAAanW,EAAKr+J,MAAyBusC,EAAUlyC,QAG7E,eAAC,GAAD,WACI,cAAC,GAAD,UACI,eAAC,GAAD,WACKkyC,EAAU5/C,SAAW6/C,KAAkBx+C,QACpCqwK,EAAKr+J,OAASi6J,GAAesE,MACzB,uBAAMxiK,YAAU,yBAAhB,sBACc,IACTwgB,aAAWgwB,EAAU8pI,WAAW,MAG5C9pI,EAAU5/C,SAAW6/C,KAAkB/C,OACpC,sBAAM1tC,YAAU,8BAAhB,oCAMXm5K,GAAiB5oK,SAASigC,EAAU5/C,QACjC0xK,EAAKr+J,OAASi6J,GAAesE,KACzB,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIllK,MAAM,QACNC,OAAO,OACPkF,SAAUwoM,EACV3xM,OAAQ,kBA5GT1I,EA8GS6/C,KAAkB9C,SA7G1DwsI,EAAavpL,QACbipL,GAAgB,GAFc,IAACjpL,GAiHC8O,QAAQ,UACRqD,SAAS,oBAVb,uBAeJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,GAAeZ,EACzBlgL,OAAQ,kBAAMygL,GAAa,IAC3Bh3K,SAAS,iBALb,uBAYR,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,EACV9gL,OAAQ,WAjIpC8pB,EACA62J,GAAmB,IAEnB4wB,IACAvoC,EAAKhpK,OAAO4kK,GAAesE,QA8HC9iK,QAAQ,UACRqD,SAAS,wBANb,sBAWJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SAAU23K,EACV9gL,OAAQ,kBACJqxM,EAAsB,OAE1B5nM,SAAS,iBAPb,uBAcZytC,EAAU5/C,SAAW6/C,KAAkB9C,SACvC,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIpwC,OAAO,OACPD,MAAM,QACNmF,SAAUwoM,EACV3xM,OAAQ,kBACJwxM,EACIt6J,EAAUlyC,KAGlByE,SAAS,oBATb,yBAgBR,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SACsB,QAAlByiK,EAAOt0K,UACLs0K,EAAOF,WACTsN,GACA8H,GACAZ,EAEJlgL,OAAQ,kBACJqxM,EACI,KACAl6J,KAAkB/C,QAG1BhuC,QAAQ,UACRqD,SAAS,0BAjBb,6BAsBJ,cAAC,GAAD,UACI,cAAC,IAAD,CACIxF,OAAO,OACPD,MAAM,QACNmF,SACsB,QAAlByiK,EAAOt0K,UACLs0K,EAAOF,WACTsN,GACA8H,GACAZ,EAEJlgL,OAAQ,kBACJqxM,EACI,KACAl6J,KAAkBx+C,SAG1B8Q,SAAS,oBAhBb,gCAyBpB,cAAC,KAAD,QAkCGsiH,GApBV,SAAC,GAAgE,IAA9D70E,EAA6D,EAA7DA,UAAWm6J,EAAkD,EAAlDA,sBAAuBvnL,EAA2B,EAA3BA,SAAUo2J,EAAiB,EAAjBA,WAC1CtU,EAAS/sJ,YAAY8sJ,IACrBhrI,EAAgB+2H,KAChB45C,EAAqBL,KACrBM,EAA2BJ,KAEjC,OACI,cAAC,GAAD,CACIvlC,OAAQA,EACRylC,sBAAuBA,EACvBvnL,SAAUA,EACVwnL,mBAAoBA,EACpBC,yBAA0BA,EAC1Br6J,UAAWA,EACXvW,cAAeA,EAAcjpC,KAC7BwoL,WAAYA,KEtYX0xB,GAAgC35K,IAAM/tB,eAEjD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAAS8sM,KACZ,OAAOhzL,YAAY1U,qBAAWynM,KC3B3B,IAuDKE,G,mBAAAA,K,YAAAA,E,aAAAA,Q,KC7CZ,I,wHAAMlpC,GAAqBrjK,IAAOC,IAAV,6FAMlBqjK,GAA4BtjK,IAAOC,IAAV,uDAIzBwnG,GAAkBznG,IAAOC,IAAV,4BAEfusM,GAKD,SAAC,GAAoC,IAAlC76J,EAAiC,EAAjCA,UAAWu6J,EAAsB,EAAtBA,gBACTzoC,EAAO7+J,qBAAW8+J,IAExB,OACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,GAAD,CACItrJ,WAAYn0B,IAAUC,OAAOS,UAC7BkhB,MAAO8rC,GAAaA,EAAUjJ,YAC9Bne,SAAU,SAAClF,GAAD,OACN6mL,EAAgB7mL,EAAEgwB,OAAOxvC,MAAO,gBAEpCpS,KAAK,cACLw2D,YAAY,cACZ/M,IAAK,IACLoc,QAAS,IACTlqC,QAAQ,YACRzJ,SAAU89I,EAAKr+J,OAASi6J,GAAesE,KACvCz/J,SAAS,kCA0BlBuoM,GAhBV,SAAC,GAAmB,IAAjB96J,EAAgB,EAAhBA,UACEptB,EAAW+nL,KAAoB7tC,KAE/BytC,EAAkBf,KAClBuB,EAAqBlB,KAE3B,OACI,cAAC,GAAD,CACI75J,UAAWA,EACXptB,SAAUA,EACV2nL,gBAAiBA,EACjBS,cAAeD,KC1DrBl6B,GAAmBxyK,IAAOC,IAAV,wEAKhB0yK,GAAe3yK,IAAOC,IAAV,qJASZ2sM,GAAqB5sM,YAAOouK,GAAPpuK,CAAH,+CACX,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCooN,GAA6B7sM,YAAO8pK,GAAP9pK,CAAH,+CACnB,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCqoN,GAED,SAAC,GAAgB,IAAdvuC,EAAa,EAAbA,OACE2V,EAAQ/uJ,iBAAY,MADT,EAEmBhC,mBAASo7I,EAAOhkK,MAFnC,mBAEV6vK,EAFU,KAEEC,EAFF,KAUjB,OANA/mJ,qBAAU,WACF8mJ,IAAe7L,EAAOhkK,MACtB8vK,EAAc9L,EAAOhkK,QAE1B,CAACgkK,EAAOhkK,KAAM6vK,IAGb,cAAC,GAAD,CAAkB/rK,IAAK61K,EAAvB,SACI,cAAC,GAAD,CACItqI,SAAS,EACThmC,UAAU,EACVwU,WAAYn0B,IAAUC,OAAOS,UAHjC,SAKI,cAAC,GAAD,UACI,eAAC,GAAD,CAAoB6pL,gBAAgB,EAApC,UACI,cAAC,GAAD,IACA,cAACo+B,GAAD,CAAoB1oM,SAAS,2BAA7B,iBACA,cAAC2oM,GAAD,CACIhnM,MAAOukK,EACPngH,YAAa,6BACb2nC,UAAU,EACV1tF,SAAS,iCAetB6oM,GAJV,SAAC,GAAgB,IAAdxuC,EAAa,EAAbA,OACJ,OAAO,cAAC,GAAD,CAAeA,OAAQA,KClE5ByuC,GAA0BhtM,IAAOC,IAAV,sGAEP,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,MAAQ,iBAIlDwrI,GAAqBp1K,IAAOC,IAAV,wPAOL,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,GAAK,KAC9B,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,EAAI,MAChC,SAAA1pC,GAAK,OAAKA,EAAMkzH,OAAS,SAAW,aA2BvC65E,GAlBV,SAAC,GAAyC,IAAvC75L,EAAsC,EAAtCA,KAAMmmG,EAAgC,EAAhCA,SAAU+8D,EAAsB,EAAtBA,gBACpB,OACI,8BACI,eAAC02B,GAAD,WACI,cAAC,GAAD,2BACI1uM,UAAU,SACV80H,OAAQ7Z,IAAa8lD,GAAesE,MAChC2S,GAHR,IAIIn1K,YAAU,iCAJd,SAMI,cAAC,GAAD,OAEJ,cAAC,GAAD,CAAsCo9J,OAAQnrJ,GAAjBA,EAAK3T,UCW5C8sH,GAAkBvsH,IAAOC,IAAV,yFAMfuyK,GAAmBxyK,IAAOC,IAAV,gDAIhBkD,GAAenD,YAAOwD,IAAPxD,CAAH,mGAMZyyK,GAAqBzyK,IAAOC,IAAV,mIAOlByyK,GAAqB1yK,IAAOC,IAAV,wEAKlB0yK,GAAe3yK,IAAOC,IAAV,qJASZitM,GA0BD,SAAC,GAcC,IAbH3uC,EAaE,EAbFA,OACAsU,EAYE,EAZFA,uBACAs6B,EAWE,EAXFA,uBACAp6B,EAUE,EAVFA,kBACAhnE,EASE,EATFA,SACAs6D,EAQE,EARFA,OACA2M,EAOE,EAPFA,gBACAC,EAME,EANFA,gBACAC,EAKE,EALFA,aACAC,EAIE,EAJFA,oBACAC,EAGE,EAHFA,qBACAC,EAEE,EAFFA,oBACAj4I,EACE,EADFA,cAEMk4I,EAAe5O,KACfp4D,EAA8BvzF,eAC9Bw6J,EAAarO,KACbL,EAAQS,KAA0B1oJ,WAClC42J,EAAkB3O,GAASA,EAAM4O,WACjCC,KACF7O,GACAA,EAAM1yK,MACNuzK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,KAEhCk0K,EACF9O,GACAA,EAAM1yK,MACNuzK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,KAClCimK,GAASb,EAAM1yK,KAAM,KAAMosK,EAAO9+J,IAAIolK,MAfxC,EAiB0B1hJ,mBAAS,CAAErhB,OAAO,EAAO3B,MAAM,IAjBzD,mBAiBK6uK,EAjBL,KAiBa4E,EAjBb,OAkBsBzwJ,oBAAS,GAlB/B,mBAkBK0wJ,EAlBL,KAkBWC,EAlBX,OAmBwB3wJ,mBAAc,IAnBtC,mBAmBKmsJ,EAnBL,KAmBYyE,EAnBZ,KAoBInwK,IACCyiK,EAAOF,WAAaE,EAAOF,YAAc5H,EAAO9+J,IACnD+zK,EAEJlwJ,qBAAU,WACN,OAAO,WACH2wJ,OAGL,IAEH3wJ,qBAAU,WACFuwJ,GACIvE,GACAyD,EAAkBzD,EAAO/Q,EAAO9+J,IAAI6rB,MAAK,WACjCkoJ,GACAD,EAAW,CACP5O,QAAS,aACTh5F,OAAQ4yF,EAAO9+J,UAOpC,CAAC6vK,IAEJ,IAQM89B,EAAa,yCAAG,6BAAAn7L,EAAA,sDACZmiK,EAAoB/B,GAAiCj3I,GAE3D+3I,IACAG,EACI/U,EAAOhkK,KACP65K,EAAkB9B,SAClB,CAAE3N,QAAS,aAAch5F,OAAQ4yF,EAAO9+J,KAP1B,2CAAH,qDAWnB6jB,qBAAU,WACFqwJ,IACAG,GAAQ,GACRC,EAASJ,MAEd,CAACA,IAEJ,IAKMM,EAAkB,WACpBH,GAAQ,GACRF,EAAU,6BAAK5E,GAAN,IAAcltK,OAAO,MAc5BoyK,EAAQ/uJ,iBAAY,MAcpBgvJ,EAAmBnkL,uBAAY,WACjCs8G,EAA4B,CACxB7+D,WAAY,gBACZ/E,YAAa,4CACbmF,UAAW,kBAAMglI,EAAuBtU,EAAO9+J,SAEpD,CAACozK,EAAwBtU,EAAO9+J,GAAI6sG,IAlHrC,EAqHkCnpF,mBAASo7I,EAAOhkK,MArHlD,mBAqHK6vK,EArHL,KAqHiBC,EArHjB,KA6HF,OANA/mJ,qBAAU,WACF8mJ,IAAe7L,EAAOhkK,MACtB8vK,EAAc9L,EAAOhkK,QAE1B,CAACgkK,EAAOhkK,KAAM6vK,IAGb,cAAC,GAAD,CAAkB/rK,IAAK61K,EAAvB,SACI,cAAC,GAAD,CACItqI,QAAS20H,EAAOiE,UAAYnE,GAAkBqE,IAC9C9+J,SAAUA,GAAY4vK,EAF1B,SAII,eAAC,GAAD,WACI,eAAC,GAAD,CACIhF,gBAAiBziE,EACjBwiE,SAAU4F,EACVjwK,SAAS,iCAHb,YAKO6nG,GAAYnoG,IAAa,cAAC,GAAD,IAC5B,cAAC,GAAD,CAAcM,SAAS,gCAAvB,sBAGA,cAAC,GAAD,UACI,cAAC,GAAD,CACI2B,MAAOukK,EACPtkJ,aAAc,SAAAjgB,GACVsnM,EACItnM,EACA,OACA04J,EAAO9+J,KAGfwqD,YAAa,kCACb8B,WAAYq+G,EACZjE,YACME,EAAOF,WACTE,EAAOF,YAAc5H,EAAO9+J,GAEhCmyF,UAAWma,GAAYnoG,EACvBM,SAAS,iCAIrB,eAAC,GAAD,YACM8qK,EAAO7uK,MAAQkmK,EAAOt2I,UAAYwuI,EAAO9+J,IACvC,cAAC,GAAD,UACI,eAAC,GAAD,WACKssG,GACG,cAAC,GAAD,CACItoG,MAAM,eACNhJ,OA1HjB,WACnB04K,IACA1xK,YAAW,WACP2xK,EAAqB7U,EAAO9+J,IAC5Bm0K,EAAU,CAAEzzK,MAAM,EAAM2B,OAAO,MAChC,MAsHiCgC,WAAY,cAAC,GAAD,IACZd,MAAM,UACNnC,QAAQ,cACRqC,WAAY,GACZzE,MAAO,OACPyF,SAAS,yCAGhB6nG,GAAYq+D,EAAWz3J,OAAS,GAC7B,cAAC,GAAD,CACIlP,MAAM,iBACNK,WAAY,cAAC,GAAD,IACZrJ,OAAQ2yM,EACRvsM,QAAQ,cACRkD,QAAS2vK,EACTxwK,WAAY,GACZgB,SAAS,2CAGhBq6J,EAAO8V,UACJ,cAAC,GAAD,CACI5wK,MAAM,OACNK,WAAY,cAAC,GAAD,IACZrJ,OAxGd,WACtB04K,IACAH,EAAgBzU,EAAO9+J,KAuGaoB,QAAQ,cACRqC,WAAY,GACZzE,MAAO,OACPyF,SAAS,4CAM5B8qK,EAAO7uK,MACJ,cAAC,GAAD,CACI6uK,OAAQA,EAAOltK,MACfksC,YAAaimI,EACbhF,OA5HT,SAACK,GAChByE,EAASzE,EAAM9uG,MACf6yG,IACAO,EAAU,CAAE9xK,OAAO,EAAO3B,MAAM,KA0HRioB,OAvIN,WAClB0rJ,GAAQ,GACRF,EAAU,6BAAK5E,GAAN,IAAcltK,OAAO,QAwIbukK,EAAOt2I,UAAYwuI,EAAO9+J,IACvB,cAAC,GAAD,CACI6vK,MAAO/Q,EAAO8V,SACdzwD,SACI26C,EAAO36C,SAAW26C,EAAO36C,SAAW,GAExCqrD,OAAQ,kBAAMgE,EAAgB1U,EAAO9+J,KACrC+xK,UAAU,EACVz8C,OA3HL,WACG,aAAlBsxC,EAAOt0K,QAAyBmiL,EAAMnkJ,UACtCmkJ,EAAMnkJ,QAAQyrB,eAAe,CACzB84H,SAAU,SACVC,MAAO,UAEXrB,mBA8KGm6B,GA3CV,SAAC,GAAoC,IAAlC9uC,EAAiC,EAAjCA,OAAQ36J,EAAyB,EAAzBA,SAAUmoG,EAAe,EAAfA,SAChB1qG,EAAWO,cAEXgG,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtB6rI,EAAS/sJ,YAAY8sJ,IAErBqO,EAAgB1N,KAChBhyC,EAASuyC,KACToN,EAAYjO,KACZkO,EAAY/N,KACZgO,EAAiB3N,KACjB4N,EAAgBzN,KAEhB0N,EAAmB81B,KACnB0C,EAAmBxC,KAEnByC,EAAuBnD,KACvBhvK,EAAgB+2H,KAEtB,OACI,cAAC,GAAD,CACIoM,OAAQA,EACRsU,uBAAwBiC,EACxBq4B,uBAAwBG,EACxBv6B,kBAAmBw6B,EACnB3lM,QAASA,EACT6yB,QAASA,EACT4rI,OAAQA,EACR2M,gBAAiB0B,EACjBzB,gBAAiB0B,EACjBvB,qBAAsBwB,EACtBvB,oBAAqBwB,EACrB3B,aAAcn+C,EACdo+C,oBAAqBsB,EACrBr5I,cAAeA,EAAcjpC,KAC7ByR,SAAUA,EACVmoG,SAAUA,EACV1qG,SAAUA,KCxYhBmxK,GAAmBxyK,IAAOC,IAAV,6FAGT,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC+oN,GAAoBxtM,YAAOkuK,GAAPluK,CAAH,kDAyBRytM,GAlBV,SAAC,GAAkB,IAAhB7pM,EAAe,EAAfA,SACJ,OACI,cAAC,GAAD,UACI,cAAC,GAAD,CACIA,SAAUA,EACVgmC,SAAS,EACTxxB,WAAYn0B,IAAUC,OAAOS,UAHjC,SAKI,cAAC6oN,GAAD,UACI,cAAC,GAAD,CAAoBh/B,gBAAgB,EAApC,SACI,sBAAMrtK,YAAU,4BAAhB,6CCzBlB6rM,GAA0BhtM,IAAOC,IAAV,sGAEP,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,MAAQ,iBAIlDwrI,GAAqBp1K,IAAOC,IAAV,oOAOL,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,GAAK,KAC9B,SAAA1pC,GAAK,OAAKA,EAAM0pC,QAAU,EAAI,MAChC,SAAA1pC,GAAK,OAAKA,EAAMkzH,OAAS,SAAW,aAmCvCs6E,GA1BV,SAAC,GAAuE,IAArEt6L,EAAoE,EAApEA,KAAMmmG,EAA8D,EAA9DA,SAAU31G,EAAoD,EAApDA,SAAU0yK,EAA0C,EAA1CA,gBAAiBq3B,EAAyB,EAAzBA,mBAC/C,OACI,gCACI,eAAC,GAAD,WACI,cAAC,GAAD,2BACIrvM,UAAU,SACV80H,OAAQ7Z,IAAa8lD,GAAesE,MAChC2S,GAHR,IAIIn1K,YAAU,sCAJd,SAMI,cAAC,GAAD,OAEJ,cAAC,GAAD,CAEIo9J,OAAQnrJ,EACR24F,SAAUwN,IAAa8lD,GAAekX,KACtC3yK,SAAUA,GAHLwP,EAAK3T,QAMhBkuM,GACE,cAAC,GAAD,CAAoBpvC,OAAQnrJ,EAAMxP,SAAUA,QC9BtDsxK,GAA0Bl1K,IAAOC,IAAV,+EAKvBk1K,GAA2Bn1K,IAAOC,IAAV,4BAExBo1K,GAAsBr1K,IAAOC,IAAV,wDAInBq1K,GAID,SAAC,GAAgD,IAA9C/W,EAA6C,EAA7CA,OAAQ8H,EAAqC,EAArCA,OAAQkP,EAA6B,EAA7BA,uBAA6B,EACXpyJ,mBAASo7I,GADE,mBAC1CiX,EAD0C,KAC7BC,EAD6B,KAE3Ch7G,EAAY71D,qBAAWgpM,IACvBnqC,EAAO7+J,qBAAW8+J,IAExBpgJ,qBAAU,WACNm3C,GAAaA,EAAU1qC,QAAQgiG,SAAS,EAAG,KAC5C,CAACt3D,IAEJn3C,qBAAU,WACNmyJ,EAAelX,KAChB,CAACA,EAAQkX,IAEZ,IAeM0C,EAAe3C,EAAYriK,QAC7B,SAAAC,GAAI,OAAIA,EAAKovJ,UAAYnE,GAAkBqE,OAC7C/vJ,OAEF,OACI,cAAC,GAAD,UACI,cAAC,KAAD,CAAiBgjK,UAbP,SAACz2K,GACVA,EAAO02K,aATA,SAAC7I,EAAoBC,GACjC,IAAM9tK,EAAS6B,MAAMyU,KAAKggK,GAD4B,EAEpCt2K,EAAOgwG,OAAO69D,EAAY,GAArC8I,EAF+C,oBAGtD32K,EAAOgwG,OAAO89D,EAAU,EAAG6I,GAC3BJ,EAAev2K,GACfq2K,EAAuBr2K,GAOvB42K,CAAQ52K,EAAO62K,OAAO70K,MAAOhC,EAAO02K,YAAY10K,QAS5C,SACI,cAAC,KAAD,CAAW80K,YAAW,sBAAtB,SACK,SAACC,EAAeC,GAAhB,OACG,eAAC,GAAD,CACI73K,IAAK43K,EAASn/G,SACdq/G,eAAgBD,EAASC,eAF7B,UAIKX,EAAYv0K,KAAI,SAACmS,EAAkBlS,GAChC,IAAI0C,GAAW,EAQf,OANIyiK,GACAA,EAAOF,WACPE,EAAOF,YAAc/yJ,EAAK3T,KAE1BmE,GAAW,GAGX,cAAC,KAAD,CAEIwyK,YAAahjK,EAAK3T,GAAG7P,WACrBsR,MAAOA,EAHX,SAKK,SAAC+0K,EAAUC,GAAX,OACG,cAAC,GAAD,2BACI73K,IAAK43K,EAASn/G,UACVm/G,EAASI,gBAFjB,aAIKjjK,EAAKovJ,UACNnE,GAAkBqE,IACd,cAAC,GAAD,CACItvJ,KAAMA,EACNmmG,SAAUkqD,EAAKr+J,KACfxB,SAAUA,EACV0yK,gBACIL,EAASK,kBAIjB,cAAC,GAAD,CACIljK,KAAMA,EACNmmG,SAAUkqD,EAAKr+J,KACfxB,SAAUA,EACV0yK,gBACIL,EAASK,gBAEbq3B,mBACIx1B,EAAe,SA7BvC,yBAC2B/kK,EAAK3T,QAqCvCw2K,EAAShsH,uBAwBvBusH,GAbV,SAAC,GAAgB,IAAdjY,EAAa,EAAbA,OACE8H,EAAS/sJ,YAAY8sJ,IACrBqQ,EAAmBw0B,KAEzB,OACI,cAAC,GAAD,CACI1sC,OAAQA,EACR8H,OAAQA,EACRkP,uBAAwBkB,KC7I9B5S,GAA6B7jK,IAAOC,IAAV,sIAqBjB6jK,GAZV,SAAC,GAAmB,IAAjBC,EAAgB,EAAhBA,UACJ,OACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI3/J,QAAS,kBAAM2/J,EAAU,aACzB7/J,SAAS,8BAFb,sCCbC2pM,GAA8B7tM,IAAOC,IAAV,iIAO3B6tM,GAAyB9tM,IAAOC,IAAV,uHAMtB8tM,GAAoB/tM,IAAOC,IAAV,0GAMjB+tM,GAAqBhuM,IAAOC,IAAV,kIAOlBq3K,GAA4Bt3K,IAAOC,IAAV,8JAQzBkD,GAAenD,YAAOwD,IAAPxD,CAAH,wCACnB,SAAAE,GAAK,OAAOA,EAAMzB,MAAR,iBAA0ByB,EAAMzB,OAAU,MAG7CmyD,GAAgB5wD,IAAOC,IAAV,gNAabguM,GAAcjuM,IAAOC,IAAV,iICzBTiuM,GA1BS9vM,sBACpB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,oBAAG2wD,YAAU,mBAAmBlwD,KAAK,eAArC,UACI,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,mMAChD,sBAAMA,EAAE,6IAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,wBAAwB5zB,EAAE,4BChBjE8oG,GAAaroG,YAAOmuM,IAAPnuM,CAAH,oHAMVuwD,GAAUvwD,IAAOC,IAAV,mHAMPmuM,GAAmBpuM,IAAOC,IAAV,sDAIhBouM,GAAqBruM,IAAOC,IAAV,qFAKlBquM,GAA8BtuM,YAAOquM,GAAPruM,CAAH,2EAK3BuuM,GAAiBvuM,IAAOC,IAAV,oDAIduuM,GAAsBxuM,IAAOC,IAAV,sGAMnBwuM,GAAuBzuM,IAAOC,IAAV,sDAIpByuM,GAAa1uM,YAAOokB,KAAPpkB,CAAH,sOAYV2uM,GAA4B3uM,YAAOquM,GAAPruM,CAAH,qDAIzB4uM,GAAe5uM,IAAOC,IAAV,wNAUZu0C,GAASx0C,IAAOC,IAAV,6SAaNktE,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CuuM,kBAAmB,CACf1hK,aAAc,mBC6BP2hK,OA/Ff,YAKqC,IAJjCC,EAIgC,EAJhCA,gBACAC,EAGgC,EAHhCA,kBACAC,EAEgC,EAFhCA,iBACA5vG,EACgC,EADhCA,SACgC,EACHiY,KADG,mBACzBpyF,EADyB,KACfu0F,EADe,KAE1BzrC,EAAUb,KAEhB,OACI,cAAC,IAAD,CACIgyB,cAAe4vG,EACfxhG,SAAU0hG,EACV5vG,SAAUA,EACVD,oBAAoB,EAJxB,SAMK,YAAgD,IAAD,EAA5ChgG,EAA4C,EAA5CA,OAAQ8vM,EAAoC,EAApCA,MAAOC,EAA6B,EAA7BA,QAASjpG,EAAoB,EAApBA,cACxB,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAACqoG,GAAD,WACI,eAACC,GAAD,WACI,cAAC,GAAD,CACI7jM,SAA8B,IAArBvL,EAAOgwM,UAChB/qM,KAAM,GACNyhB,aAAc,WACVogF,EAAc,aAAa,GAC3BzkG,WAAWg4G,EAAU,IAEzBh2G,MAAM,oBACNG,UAAU,EACVswB,YAAa,CAAED,WAAY,QAC3B31B,UAAW0vE,EAAQ6gI,kBACnB3qM,SAAS,2BAEb,cAACuqM,GAAD,UACI,cAACC,GAAD,CACIrwM,IAAK6mB,EACLxmB,OAAO,OACPkF,UAAWxE,EAAOgwM,UAClBvpM,MAAK,UAAEzG,EAAOiwM,kBAAT,QAAuB,GAC5BvpL,aAAc,SAAAT,GAAC,QACTA,EAAEgwB,OAAOxvC,OAASmpM,EAAkB3pL,EAAEgwB,OAAOxvC,SAAWqgG,EAAc,aAAc7gF,EAAEgwB,OAAOxvC,QAEnG3B,SAAS,gCAIrB,cAACyqM,GAAD,CAA2BxtM,YAAU,+BAArC,qJAIJ,eAACitM,GAAD,WACI,cAAC,GAAD,CACIzjM,SAA8B,IAArBvL,EAAOgwM,UAChB/qM,KAAM,GACNZ,MAAM,qBACNqiB,aAAc,WACVogF,EAAc,aAAa,GACvB9mG,EAAOiwM,aAAeN,EAAgBM,YACtCnpG,EAAc,aAAc,OAGpCtiG,UAAU,EACVswB,YAAa,CAAED,WAAY,QAC3B31B,UAAW0vE,EAAQ6gI,kBACnB3qM,SAAS,uBAEb,cAACoqM,GAAD,CAA6BntM,YAAU,iCAAvC,iGAIJ,eAACytM,GAAD,CAAcztM,YAAU,mBAAxB,UACI,2CADJ,8LAIJ,cAAC,GAAD,UACI,cAAC,IAAD,CACI1C,MAAM,QACNC,OAAO,OACPkF,UAAWsrM,IAAUC,EACrBlrM,aAAa,QACbD,YAAa,GACbE,SAAS,eANb,4BCrDborM,I,eAAAA,GAvCf,YAEiC,IAD7B39J,EAC4B,EAD5BA,UAEMu6J,EAAkBf,KAElB4D,EAAkB9wL,mBAAQ,WAAyC,IAAD,EACpE,MAAO,CACHmxL,YAAaz9J,EAAU/I,SACvBymK,YAAY,UAAA19J,EAAU/I,gBAAV,eAAoBh5C,aAAc,QAEnD,CAAC+hD,EAAU/I,WAYRi2D,EAAe7uG,uBAAY,SAACkE,GAC9Bg4M,EACIh4M,EAASk7M,UAAYr5L,OAAO7hB,EAASm7M,YAAc,KACnD,cAEL,CAACnD,IAEJ,OACI,cAAC,GAAD,CACI6C,gBAAiBA,EACjBC,kBApBkB,SAACnpM,GAAD,OAAmBkQ,OAAOlQ,GAAS,GAqBrDopM,iBAnBiB,SAAC/6M,GACtB,IAAMg4D,EAAiC,GAIvC,OAHIh4D,EAASk7M,YAAcl7M,EAASm7M,aAChCnjJ,EAAOmjJ,WAAa,2BAEjBnjJ,GAeHmzC,SAAUR,KCrCT0wG,GAAevvM,IAAOC,IAAV,oGAMZuvM,GAAexvM,IAAOC,IAAV,8KAOZovH,GAAiBrvH,IAAOC,IAAV,+kBA6BdwvM,GAAiBzvM,IAAOC,IAAV,8HAOdyvM,GAAa1vM,IAAOC,IAAV,yECVR0vM,OA7Bf,YAGgC,IAF5Bh+J,EAE2B,EAF3BA,UACA3hB,EAC2B,EAD3BA,QAGA,OACI,cAAC,GAAD,CACI7rB,MAAM,qBACN6rB,QAASA,EACTvxB,MAAO,IACPyF,SAAS,2BAJb,SAMI,eAACqrM,GAAD,WACI,cAACC,GAAD,UACI,eAAC,GAAD,CACIruM,YAAU,eADd,UAGI,cAACsuM,GAAD,UAAgB,cAAC,GAAD,MAHpB,gBAOJ,cAACC,GAAD,UACI,cAAC,GAAD,CAAwB/9J,UAAWA,Y,UCDxCi+J,GA9BUxxM,sBACrB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,oBAAG2wD,YAAU,mBAAb,UACI,sBAAM9vD,GAAG,aAAakE,MAAO,CAAEksM,SAAU,aAAeC,UAAU,iBAAiBjxM,EAAE,IAAIC,EAAE,IAAIL,MAAM,KAAKC,OAAO,KAAjH,SACI,sBAAMa,EAAE,kBAAkBF,KAAK,WAEnC,mBAAG0wM,KAAK,mBAAR,SACI,sBAAMvgJ,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,6jEAA6jEF,KAAK,cAG1nE,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCsF7BywM,OA5Ff,YAUoC,IAAD,EAT/B3pC,EAS+B,EAT/BA,OACA10H,EAQ+B,EAR/BA,UACA8hI,EAO+B,EAP/BA,WACAw8B,EAM+B,EAN/BA,sBACA12F,EAK+B,EAL/BA,SACAi+D,EAI+B,EAJ/BA,aACA9C,EAG+B,EAH/BA,UACApB,EAE+B,EAF/BA,aACA48B,EAC+B,EAD/BA,yBAEMpoI,EAAkByxC,IAAa8lD,GAAesE,KAC9CwsC,IAAsB9pC,EAAOF,WAAasN,EAC1C28B,IACIz+J,EAAU4sH,SAEkE,IAA1E5sH,EAAU4sH,OAAOtsK,MAAMkhB,QAAO,SAAC6jK,GAAD,OAAsBA,EAAKz8K,QAAMoY,QAC1C,QAAlB0zJ,EAAOt0K,QACPo+M,IAGRroI,EACDuoI,IACI1+J,EAAU4sH,SAEsE,IAA9E5sH,EAAU4sH,OAAOtsK,MAAMkhB,QAAO,SAAC6jK,GAAD,OAAsBA,EAAK3C,YAAU1hK,QAChEw9L,GAGf,OACI,eAACtC,GAAD,WACKoC,GACG,cAAC,GAAD,CACIt+J,UAAWA,EACX3hB,QAAS,kBAAMkgL,GAAyB,MAGhD,eAACpC,GAAD,WACI,cAACC,GAAD,CAAmB5sM,YAAU,oBAA7B,2BACA,cAAC6sM,GAAD,CAAoB7sM,YAAU,2BAA9B,UACK,UAAAwwC,EAAU/I,gBAAV,eAAoBh5C,aAAc,iBAG3C,eAAC,GAAD,WACI,eAACq+M,GAAD,WACI,cAAC,GAAD,CACIxqM,MAAM,mBACNK,WAAY,cAAC,GAAD,UAAe,cAAC,GAAD,MAC3BF,SAAUwsM,EACV3xM,MAAM,QACNC,OAAO,OACPjE,OAAQ64K,EACRpvK,SAAS,+BAEM,aAAlBmiK,EAAOt0K,OACJ,cAAC,GAAD,CACI0R,MAAM,OACNK,WAAY,cAAC,GAAD,UAAe,cAAC,GAAD,MAC3BF,SAAUysM,EACV51M,OAAQi6K,EACRh2K,OAAO,OACPD,MAAM,OACNyF,SAAS,uBAGb,cAAC,GAAD,CACIT,MAAM,OACNK,WAAY,cAAC,GAAD,UAAe,cAAC,KAAD,MAC3Bd,MAAM,UACNvI,OAAQ+8K,EACR94K,OAAO,OACPD,MAAM,OACNyF,SAAS,sBAIrB,8BACI,cAAC,GAAD,CACIT,MAAM,WACNK,WAAY,cAAC,GAAD,UAAe,cAAC,GAAD,MAC3BF,SAAUkkE,EACVrpE,MAAM,OACNC,OAAO,OACPjE,OAAQ,kBAAMy1M,GAAyB,IACvChsM,SAAS,gCC/DlBosM,I,sDAAAA,GA7Bf,WACI,IAAM7sC,EAAO7+J,qBAAW8+J,IADK,EAE6BvgJ,oBAAS,GAFtC,mBAEtB8sL,EAFsB,KAECC,EAFD,KAIvB7pC,EAAS/sJ,YAAY8sJ,IACrBz0H,EAAY26J,KAAoBn6M,KAChCsiL,EAAgB1N,KAChBlC,EAAQS,KAA0B1oJ,WAClC83J,EAAY9vK,qBAAW8yK,IACvBC,EAAyBd,GAC3BllI,EAAU4sH,OAAOtsK,MAAMkhB,QAAO,SAAA6jK,GAAI,OAAIA,EAAKxU,UAAYnE,GAAkBoE,YACzE,cAGJ,OACI,cAAC,GAAD,CACI9wH,UAAWA,EACX00H,OAAQA,EACRoN,WAAU,OAAE5O,QAAF,IAAEA,OAAF,EAAEA,EAAO4O,WACnBw8B,sBAAuBA,EACvB12F,SAAUkqD,EAAKr+J,KACfoyK,aAAc/C,EACdC,UAAWA,EACXpB,aAAcqE,EACdu4B,yBAA0BA,KCbhC53B,GAAuBt4K,IAAOC,IAAV,oHAOpBs4K,GAAkBv4K,IAAOC,IAAV,iHAMfu4K,GAAiBx4K,IAAOC,IAAV,sGAGE,SAAAC,GAAK,OAAKA,EAAM0pC,QAAU,cAAgB,SAG1D6uI,GAAiBz4K,IAAOC,IAAV,iPAKF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SACtB,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAM9CkmH,GAAc9qG,IAAOi0C,IAAV,mEAKXykI,GAAsB14K,YAAOq4K,GAAPr4K,CAAH,mEAKnBO,GAAaP,IAAOgoB,EAAV,gHAGH,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInCuzL,GAAc34K,IAAOC,IAAV,iDAIX24K,GAAqB54K,IAAOC,IAAV,wKASlBswM,GAAmB,SAAC,GAIE,IAEpBhkK,EALJoF,EAGuB,EAHvBA,UACAmnI,EAEuB,EAFvBA,iBACAr+I,EACuB,EADvBA,QAEMgpI,EAAO7+J,qBAAW8+J,IAElBr3H,EAAQ,OAAG5R,QAAH,IAAGA,OAAH,EAAGA,EAAS6R,QAa1B,OAZID,EACAE,EAAO,cAAC,GAAD,CAAajoC,IAAK+nC,EAAU9nC,IAAI,YAChCk2B,IACP8R,EACI,cAAChB,GAAA,EAAD,CACI3jC,QAAS6yB,EACTp2B,KAAM,KACNunC,cAAegtI,MAMvB,eAAC,GAAD,WACI,cAAC,GAAD,IACA,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAgBz3K,YAAU,4BAA1B,SACI,cAAC,GAAD,MAEJ,cAAC,GAAD,CAAYA,YAAU,2BAAtB,yBAEJ,eAAC,GAAD,CAAgByoC,SAAO,EAAvB,UACI,cAAC,GAAD,CAAgBzoC,YAAU,qBAA1B,SAAgDorC,IAChD,cAAC,GAAD,CAAYprC,YAAU,sBAAtB,uBAGPwwC,EAAU4sH,QACP,cAAC,GAAD,CAAmBA,OAAQ5sH,EAAU4sH,OAAOtsK,QAE/CwxK,EAAKr+J,OAASi6J,GAAekX,MAC1B,cAAC,GAAD,CAAcxS,UAAW+U,WA8B9B03B,GApBV,SAAC,GAAqC,IAAnC7+J,EAAkC,EAAlCA,UAAWmnI,EAAuB,EAAvBA,iBACTlxK,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtBinF,EAAatC,KAQnB,OANA77F,qBAAU,YACDmX,EAAQh7B,KAAT,OAAemI,QAAf,IAAeA,OAAf,EAAeA,EAASrU,YACxBkuH,EAAU,OAAC75G,QAAD,IAACA,OAAD,EAACA,EAASrU,aAEzB,QAACknC,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAV,OAAcmI,QAAd,IAAcA,OAAd,EAAcA,EAASrU,UAAWkuH,IAGjC,cAAC,GAAD,CACI9vE,UAAWA,EACXmnI,iBAAkBA,EAClBr+I,QAASA,KCxIfu+I,GAA6Bh5K,IAAOC,IAAV,uFAK1Bg5K,GAAsBj5K,IAAOC,IAAV,sFAuBVwwM,GAjBO,SAAC,GAGK,IAFxB9+J,EAEuB,EAFvBA,UACAmnI,EACuB,EADvBA,iBAEA,OACI,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAennI,UAAWA,IAC1B,cAAC,GAAD,CACIA,UAAWA,EACXmnI,iBAAkBA,UCrBhCvyJ,GAAYvmB,IAAOC,IAAV,wEAKTw8K,GAAqBz8K,IAAOC,IAAV,4CAIlB2gD,GAAkB5gD,IAAOC,IAAV,yEAKf28K,GAAiB58K,YAAOokB,KAAPpkB,CAAH,uGAkDL68K,GA5CwD,SAAC,GAA+B,IAA7BlrI,EAA4B,EAA5BA,UAAWmrI,EAAiB,EAAjBA,WAC3EovB,EAAkBf,KAClB1nC,EAAO7+J,qBAAW8+J,IAClBlyK,EAASm5B,eACThX,EAAaT,eAAyB/gB,KACtC2f,EAAcnQ,cAEpB2hB,qBAAU,cAAU,IAOpB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI2mC,YAAY,kBACZvrD,OAAQ,OACRgnB,UAAW,IACXI,aAAc,SAACm0B,GAAD,OACViyJ,EAAgBjyJ,EAAM5E,OAAOxvC,MAAO,UAExCA,MAAO8rC,EAAUxtC,MACjBwhB,SAAU89I,EAAKr+J,OAASi6J,GAAesE,KACvC/jK,MAAOk9K,EACP54K,SAAS,sBAGjB,cAAC,GAAD,UACI,cAAC,GAAD,CACIC,MAAO,SACP3S,OAAQmiB,EACR/P,SAAU6/J,EAAKr+J,OAASi6J,GAAesE,KACvCxwE,qBA1BkB,WAC9B+4G,EAAgB16M,EAAO4jB,eAAgB,iBACvCtD,EAAY,yCAA0C,YAyB1CshF,sBAAuB,QACvBlvF,SAAS,2BCUvB89F,GAAOjiF,EAAQ,KACfgyE,GAAKhyE,EAAQ,IAENwsG,GAAkBvsH,IAAOC,IAAV,8MAKV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxCg8L,GAAyBngL,IAAOC,IAAV,+FAMtBmgL,GAAmBpgL,IAAOC,IAAV,gGAET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5B47L,GAKR,CACD,CACIx6K,MAAO,QACPpS,KAAM,QACNmN,QAAS,2BACT0/K,SAAS,GAEb,CACIz6K,MAAO,SACPpS,KAAM,SACNmN,QAAS,sBACT0/K,SAAS,GAEb,CACIz6K,MAAO,WACPpS,KAAM,WACNmN,QAAS,qBACT0/K,SAAS,GAEb,CACIz6K,MAAO,UACPpS,KAAM,UACNmN,QAAS,oBACT0/K,SAAS,IAIJ9E,GAAqB72K,yBAAc,GACnCipM,GAA4BjpM,wBAAmB,MAC/C+yK,GAAmB/yK,wBAAmB,MACtC++J,GAAkB/+J,wBAG5B,CACCS,KAAM,OACN3K,OAAQ,eAGNi2M,GAuBD,SAAC,GAiBC,IAAD,UAhBFl/C,EAgBE,EAhBFA,eACAD,EAeE,EAfFA,UACAt/F,EAcE,EAdFA,MACAluD,EAaE,EAbFA,QACAwgB,EAYE,EAZFA,SACAosL,EAWE,EAXFA,aACAh/J,EAUE,EAVFA,UACA1gD,EASE,EATFA,YACAwvL,EAQE,EARFA,uBACAmwB,EAOE,EAPFA,qBACAhwB,EAME,EANFA,qBACAzN,EAKE,EALFA,oBACA0N,EAIE,EAJFA,wBACA/uK,EAGE,EAHFA,YACA8F,EAEE,EAFFA,QACAhQ,EACE,EADFA,QACE,EAC8Bub,mBAC5Bk8I,GAAesE,MAFjB,mBACKpqD,EADL,KACeooE,EADf,KAKIkvB,ExBpK2C,WACjD,IAAMxvM,EAAWO,cACXgW,EAAUW,cACVzG,EAAcnQ,cAEpB,OAAO3R,uBACH,SACIgxL,EACAtpI,GAIA,GAFAspI,GAAe,IAEV59I,kBAAQsU,GAAY,CACrB,IAAMC,EAA0BD,EAC5BvP,MAGE2oK,EAAwBp5J,EAC1BtP,MAGE2oK,EAA0Br5J,EAC5BlP,MAEJ,GAAImP,EAAyB,CACzBt2C,EACI6b,aACIy6B,EACA,WAIR,IAAM+lI,EAAiBt6I,kBAAQ2tK,GAEzBn/J,KAAkB/C,MADlB+C,KAAkBx+C,OAGlBguL,EAAgBf,GAAYltK,QAC9B,SAACC,GAAD,OAAeA,EAAKvN,QAAU63K,KAElC5rK,EAAYsvK,EAAc,GAAGxgL,QAAS,gBAC/BkwM,GACPzvM,EACI6b,aACI4zL,EACA,WAMhBl5L,EAAQH,KAAKluB,IAAO6C,iBAAiBF,WAAWH,OAEpD,CAACsV,EAAUuW,EAAS9F,IwBiHpBk/L,GACEC,ExBvG0C,WAChD,IAAM/E,EAAkBf,KAClBr5L,EAAcnQ,cAEpB,OAAO3R,uBACH,SACIgxL,EACAphL,EACAigL,GAEA,IAAKz8I,kBAAQy8I,GAAqB,CAC9B,IAAMloI,EAA0BkoI,EAC5B13I,MAGEm3I,EAAkB,OAAG3nI,QAAH,IAAGA,OAAH,EAAGA,EAAyBl4C,GAMhD6/K,GACA4sB,EAAgB5sB,EAAoB,OAIvC,OAAL1/K,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWkR,EAAYlS,EAAMgB,QAAS,SAC7CogL,GAAe,KAEnB,CAACkrB,EAAiBp6L,IwB2ElBo/L,GACEC,ExBpE+B,WACrC,IAAM9vM,EAAWO,cACXgW,EAAUW,cACVklK,EAAwB3rL,eAE9B,OAAO9B,uBACH,SAACiB,GACGwsL,EAAsB,UAAW,CAACxsL,IAAcq6B,MAAK,SAAAgT,GACjDj9B,EAAS6b,aAA8BohB,EAAU,WAEjD1mB,EAAQq0G,cAGhB,CAAC5qH,EAAUuW,EAAS6lK,IwBuDO2zB,GAC/B9nK,YACIswI,GAAe,YAAargE,EAAUtnD,GACtC,CAACtgB,EAAUxtC,QAEf,IAAMu9K,EAAyB1f,KACzBlqJ,EAAWF,EAAQE,SAfvB,EAiBoCqL,oBAAS,GAjB7C,mBAiBKo4J,EAjBL,KAiBkByF,EAjBlB,KAkBInkL,EAAasJ,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MACzCgnE,EAAYt1C,iBAAO,MAnBvB,EAoBkChC,oBAAS,GApB3C,mBAoBK25J,EApBL,KAoBiB8E,EApBjB,KAqBIC,KAAY,OAAClwI,QAAD,IAACA,OAAD,EAACA,EAAWlyC,IAExBw/J,EAAU,UAAGltE,GAAGngE,MAAM9Z,EAAShjB,eAArB,aAAG,EAA2BmqK,WACxCiD,EAAS,UAAGnwE,GAAGngE,MAAM9Z,EAAShjB,eAArB,aAAG,EAA2BotK,UACvCgqC,GAAkBf,KAElBryB,GAAmB9oL,uBACrB,SAACwyK,EAA4BrB,EAAkB5mK,GAC3C,IAAMiyG,EAAa,CACf/sG,GAAG,QAAD,OAAUuiG,MACZznG,KAAI,OAAEA,QAAF,IAAEA,IAAQ,GACdioK,QAASA,EACT9lG,SAAU/qB,EAAU4sH,OACd5sH,EAAU4sH,OAAOtsK,MAAM0gB,OAAS,EAChC,EACN0+L,oBACI7uC,IAAYnE,GAAkBqE,IAAM,GAAK,KAC7Csf,SAAUrwI,EAAUqwI,UAGxBvB,EAAuBj0E,EAAY20D,KAEvC,CAACxvH,EAAU4sH,OAAQ5sH,EAAUqwI,SAAUvB,IAG3Cn9J,qBAAU,WACF27I,GAAciD,GACdwf,EAAuBziB,EAAYiD,GAAW52I,MAAK,YAAsC,IAAnCi3I,EAAkC,EAAlCA,QAASp+J,EAAyB,EAAzBA,MAAOukC,EAAkB,EAAlBA,YAClE65H,EAAQ3sJ,SAAQ,SAAAohK,GAAI,MAAqB,aAAjBA,EAAKxU,SAA0BsW,GAAiB9B,EAAKxU,SAAS,EAAOwU,EAAKz8K,SAClG2xM,GAAgB/nM,GAAS,GAAI,SAC7B+nM,GAAgBxjK,GAAe,GAAI,oBAI5C,CAACu2H,EAAYiD,EAAWwf,IAE3Bp+J,qBAAU,WAAO,IAAD,SAER,OAAC1L,QAAD,IAACA,GAAD,UAACA,EAASE,gBAAV,iBAAC,EAAmBhW,aAApB,iBAAC,EAA0BuW,oBAA3B,iBAAC,EAAwCgkC,gBAAzC,aAAC,EAAkD3qC,SAC/C,+BAGJk/L,IACAz9B,KAEKlhH,GAAShhE,GACV0/M,EAAa1/M,MAItB,CACC0/M,EACA1/M,EACAghE,EACAkhH,EACAy9B,IAGJttL,qBAAU,WACN,OAAO,WACH6vJ,OAEL,CAACA,IAEJ7vJ,qBAAU,WACNq+J,GACKE,IAAY5vH,GAAUtgB,EAAU5/C,SAAW6/C,KAAkB/C,OAAUhyC,EAElEwiK,GAAesE,KADftE,GAAekX,QAI1B,CAACsL,EAAU5vH,EAAOtgB,EAAU5/C,OAAQ4vL,IAEvC,IAAMnwL,GAASm5B,eACThX,GAAaT,eAAyB/gB,KACtCw7B,GAAwBD,eACxBu0J,GACFl1J,eACEk4H,GACF/uI,eACEo7L,GAAwBxzL,eAE9BwF,qBAAU,WACN,GAAIquB,EAAUngD,QAAUmgD,EAAUngD,OAAOmhB,OAAS,EAAG,CACjD,IAAM6D,EAAmBm7B,EAAUngD,OAC7B+jB,EAAoB0vI,GACtBzuI,EACA7C,IAEJga,GAAsBpY,QAEtBoY,GAAsB,IAE1B,OAAO,WACHA,GAAsB,OAE3B,CACCgkB,EAAUngD,OACVmiB,GACAsxI,GACAt3H,KAIJrK,qBAAU,WACN,GAAK8f,kBAAQuO,EAAUngD,QAQnBywL,GAAkC,QARN,CAAC,IAAD,EACtBzrK,EAAgB,UAAGm7B,EAAUngD,cAAb,QAAuB,GACvC+jB,EAAoB0vI,GACtBzuI,EACA7C,IAEJsuK,GAAkC1sK,GAItC,OAAO,WACH0sK,GAAkC,OAGvC,CAACtwI,EAAUngD,SAEd,IAAM+/M,GACFzyB,KAEM0yB,GnH2oCP,WACH,IAAMC,EAAsB7/M,eACtB8/M,EAA0BngN,cAC1BgnD,EAA4B9mD,cAC5ButL,EAAyBhtL,cACzBitL,EAA+BntL,eAS/BotL,EAA8BlvL,uBAChC,SACIiB,EACAysL,EACAv2H,GAEA,IAAMg4H,EAAsC,CACxCr2H,WAAY,CACR40H,cAAa,OAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAep3K,cAC9BjV,aAAc,CAACJ,GACfy1D,aAAc,GAElBD,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY5f,KACZ6f,eAAgB42H,EAChB32H,sBACI62H,MAGZ,CAACF,IAWCG,EAAgCpvL,uBAClC,SACIiB,EACAqxL,EACAxvC,EACA3rF,GAEA,IAAK/jB,kBAAQk/I,GAAgB,CACzB,IAQMqvB,EAAwC,CAC1C7oJ,WAAY,CACRt3D,OAVY8wL,EAAcrhL,KAC9B,SAAA1M,GAAO,MACF,CACGtD,cACAsD,eAQRkyD,UAAW,UAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY/f,KACZggB,eAAgBqpJ,EAChBppJ,sBACIqpJ,IAIZ,IAAKvuK,kBAAQ0vG,GAAkB,CAC3B,IAQM8+D,EAA0C,CAC5C9oJ,WAAY,CACRt3D,OAVcshJ,EAAgB7xI,KAClC,SAAA1M,GAAO,MACF,CACGtD,cACAsD,eAQRkyD,UAAW,UAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY9f,KACZ+f,eAAgB9P,EAChB+P,sBACIspJ,OAIhB,CAACF,EAAyBn5J,IASxB8mI,EAAsCrvL,sBAAW,yCACnD,WAAOiB,EAAqBstL,GAA5B,gBAAAtsK,EAAA,0DACQhhB,EADR,uBAEcsuL,EAFd,OAEsChB,QAFtC,IAEsCA,OAFtC,EAEsCA,EAAct9K,KAAI,SAAA+1K,GAAS,IAAD,EAQhDA,GAAQ,GARwC,IAEhD0H,eAFgD,MAEtC,EAFsC,MAGhD96D,gBAHgD,MAGrC,EAHqC,MAIhDlnD,gBAJgD,MAIrC,KAJqC,MAKhDniE,YALgD,MAKzC,GALyC,MAMhDioK,eANgD,MAMtC,GANsC,MAOhDX,SAGJ,MAAO,CACH6c,UACA96D,WACAlnD,WACAniE,OACAioK,UACAX,cAhBgD,MAOrC,GAPqC,MAFhE,SAsBcmd,EACF/tL,EACAsuL,GAxBZ,2CADmD,wDA6BnD,CAACP,IAQCQ,EAA+BxvL,uBACjC,SACIiB,EACAstL,EACAp3H,GAEA,IAAMs4H,EAAgC,CAClC32H,WAAY,CACR73D,cACAstL,gBAEJ93H,UAAW,gBAGfU,EAAW1vC,KAAK,CACZ2wC,WAAY7f,KACZ8f,eAAgBg3H,EAChB/2H,sBAAuBm3H,EACvB/4H,aAAc,QAGtB,CAAC24H,IAOL,OAAOrvL,uBACH,SAAC0vL,GAAyC,IAElCzuL,EASAyuL,EATAzuL,YACAkT,EAQAu7K,EARAv7K,MACAukC,EAOAg3I,EAPAh3I,YACAC,EAMA+2I,EANA/2I,iBACA25I,EAKA5C,EALA4C,cACAxvC,EAIA4sC,EAJA5sC,gBACA7gJ,EAGAytL,EAHAztL,MACAF,EAEA2tL,EAFA3tL,OACA62C,EACA82I,EADA92I,SAGAue,EAAiD,CACjD,CACIiB,WAAYhgB,KACZigB,eAAgBopJ,EAChB/qJ,aAAc,EACd4B,sBAAuB,CACnBQ,WAAY,CACR73D,cACAU,cAAe,CACXwS,QACAukC,cACAC,mBACAC,YAEJ8d,aAAc,GAElBD,UAAW,kBAsBvB,OAjBKrjB,kBAAQk/I,IAAmBl/I,kBAAQ0vG,IACpCssC,EACInuL,EACAqxL,EACAxvC,EACA3rF,GAIH/jB,kBAAQnxC,IACTutL,EAA6BvuL,EAAagB,EAAOk1D,GAGjDp1D,GAAUA,IAAW6/C,KAAkB/C,OACvCqwI,EAA4BjuL,EAAac,EAAQo1D,GAG9CA,IAEX,CACIi4H,EACAI,EACAN,EACAuyB,ImHp3CJI,GAEElvB,GACFhD,GACI1tH,EAAQ,SAAW,SACnB,aACA,SAAAva,GAAS,OACLm5J,EAAmC7vB,EAAgBtpI,MACvD,SAAC93C,EAAOigL,GAAR,OACIoxB,EACIjwB,EACAphL,EACAigL,MAIVisB,GAAwB,SAC1BlpB,EACA7wL,GACE,IAAD,sBACDivL,GAAe,GACf,IAAM1iJ,EtB/VmB,SAACqT,EAAsB5/C,GAAoB,IAAD,IACjE8wL,EAAS,CACXC,OAAO,EACPliL,QAAS,GACTnN,KAAM,IAGV,OAAQ1B,GACJ,IAAK,UACD8wL,EAAOC,OAAQ,EACf,MACJ,IAAK,UACG,UAACnxI,EAAUxtC,aAAX,aAAC,EAAiBm1B,QAIXqY,EAAU4sH,OAAOtsK,MAAM0gB,OAAS,GACvCkwK,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,4CAEhB+wC,EAAU4sH,OAAOC,eAClB7sH,EAAU4sH,OAAOC,cAAgB,IAEjCqkB,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,0BAEjB+wC,EAAU4sH,OAAOtsK,MAAMgP,KAAI,SAAC+1K,GAKxB,OAJKA,EAAK3C,UAA6B,aAAjB2C,EAAKxU,UACvBqgB,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,0BAEdiiL,MAlBXA,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,iBACjBiiL,EAAOpvL,KAAO,QAmBlB,MACJ,IAAK,SACG,UAACk+C,EAAUxtC,aAAX,aAAC,EAAiBm1B,QAIXqY,EAAU4sH,OAAOtsK,MAAM4iB,MAAK,SAAAmiK,GAAI,OAAKA,EAAK0H,aACjDmE,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,2BALjBiiL,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,iBACjBiiL,EAAOpvL,KAAO,QAKlB,MACJ,IAAK,WACL,QACQk+C,EAAUxtC,MAAMwO,OAAS,IACzBkwK,EAAOC,OAAQ,EACfD,EAAOjiL,QAAU,kBAG7B,OAAOiiL,EsB2ScE,CACbpxI,EACA5/C,GAAkB4/C,EAAU5/C,QAEhC,IAAKusC,EAASwkJ,MAMV,OALAF,GAAaA,EAAU90I,WACvBh8B,EAAYwsB,EAAS19B,QAAS,SAC9BogL,GAAe,QAEfY,EAAgC,SAAlBtjJ,EAAS7qC,MAGvBmuL,GAAc,GAGlB,IAAMlC,EAA2C,CAC7Cv7K,MAAOwtC,EAAUxtC,MACjBukC,YAAaiJ,EAAUjJ,YACvBC,iBAAgB,UAAEgJ,EAAUhJ,wBAAZ,QAAgC,EAChD1a,SAAUvX,aACNllB,GAAO4jB,eADsB,UAE7B5jB,GAAOwxL,gCAFsB,QAEM,IAEvC/wL,MAAK,oBACD0/C,EAAU4sH,cADT,iBACD,EAAkBtsK,aADjB,aACD,EAAyBkhB,QAAO,SAAA6jK,GAAI,OAAIA,EAAKz8K,KAAKoY,OAAS,YAD1D,QAED,GACJ5gB,OAAM,OAAEA,QAAF,IAAEA,IAAU4/C,EAAU5/C,OAC5B62C,SAAU+I,EAAU/I,UAGlBkpK,EAAuC,CACzC7gN,YAAW,UAAE0gD,EAAUlyC,UAAZ,QAAkB,EAC7B0E,MAAOwtC,EAAUxtC,MACjBukC,YAAaiJ,EAAUjJ,YACvB45I,cAAe5rK,aACXllB,GAAO4jB,eAD2B,UAElC5jB,GAAOwxL,gCAF2B,QAEC,IAEvClwC,gBAAiBv8H,aACb/kB,GAAO4jB,eAD4B,UAEnC5jB,GAAOwxL,gCAF4B,QAEA,IAEvC/wL,MAAK,oBACD0/C,EAAU4sH,cADT,iBACD,EAAkBtsK,aADjB,aACD,EAAyBkhB,QAAO,SAAA6jK,GAAI,OAAIA,EAAKz8K,KAAKoY,OAAS,YAD1D,QAED,GACJ5gB,OAAM,OAAEA,QAAF,IAAEA,IAAU4/C,EAAU5/C,OAC5B62C,SAAU+I,EAAU/I,UAGlBmpK,EACFR,GAAkC7xB,GAEhCsyB,EACFR,GAAgCM,GAEhC//M,IAAW6/C,KAAkB9C,SACxB6C,EAAUlyC,GAGXkjL,GAA+BqvB,GAF/BrvB,GAA+B,CAACovB,KAK3B,OAATpgK,QAAS,IAATA,OAAA,EAAAA,EAAWlyC,KAAM0xM,EAAuBx/J,EAAUlyC,KAoC1D,OAjBA6jB,qBAAU,WAEFguL,GAAsBpzL,oBAClBzZ,KAAgBwtM,oBAGpBpxB,MAEL,CAACA,EAAyBywB,KAE7BhuL,qBAAU,WACF2uC,GAAStgB,EAAU4sH,OAAOtsK,MAAM0gB,OAAS,IAAMssJ,GAC/C6Z,GAAiBza,GAAkBoE,UAAU,KAElD,CAAC9wH,EAAU4sH,OAAOtsK,MAAM0gB,OAAQmmK,GAAkB7mH,EAAOgtG,KAGvDhtG,GAASluD,EAEN,cAAC,GAAD,CACIwtJ,UAAWA,EACXC,eAAgBA,EAFpB,SAII,cAAC,GAAD,UACI,cAAC,KAAD,QAOZ,cAAC,GAAD,CACID,UAAWA,EACXC,eAAgBA,EAFpB,SAII,eAAC,GAAD,CAAiBnzJ,IAAKo8D,EAAtB,UACI,cAAC,GAAgBwT,SAAjB,CACIpoE,MAAO,CAAET,KAAMm0G,EAAU9+G,OAAQknL,GADrC,SAGI,eAAC,GAAmB1zG,SAApB,CAA6BpoE,MAAO01K,EAApC,UACI,cAAC,GAAD,CACI5pI,UAAWA,EACXm6J,sBAAuBA,GACvBvnL,SAAuB,aAAbA,EACVo2J,WAAY99K,IAEhB,cAAC,GAAD,CACI80C,UAAWA,EACXmrI,WAAYA,IAEfnrI,EAAU0xI,SACP,eAAC,GAAD,CAAkBliL,YAAU,yBAA5B,kCACgBwwC,EAAU0xI,eAD1B,aACgB,EAAmB1kJ,UAAW,IAD9C,UAEKgT,EAAU0xI,eAFf,aAEK,EAAmBxkJ,YAG5B,cAAC,KAAD,IACA,cAAC+uK,GAA0B3/H,SAA3B,CAAoCpoE,MAAO40D,EAA3C,SACI,cAAC,GAAiBwT,SAAlB,CAA2BpoE,MAvE9B,WACjBstK,IACA,IAGMmQ,EAHc3xI,EAAU4sH,OAAOtsK,MAAMkhB,QACvC,SAACorJ,GAAD,OAAwBA,EAAO8V,YAG9BlhK,QAAO,SAAAorJ,GAAM,OAAIA,EAAOiE,UAAYnE,GAAkBoE,YACtDxhK,KAAI,SAACs9J,GAAD,OAAwBA,EAAO9+J,MACxCgC,YAAW,WACPm/K,EAAqB0C,KACtB,MA6DiB,SACI,cAAC,GAAD,CACI3xI,UAAWA,EACXmnI,iBAAkBA,cAMtC,cAAC,KAAD,CAAkByK,KAAmB,aAAbh/J,EAAxB,SACK,gBAAGspB,EAAH,EAAGA,UAAWC,EAAd,EAAcA,SAAd,OACG,cAACN,GAAA,EAAD,CACIC,WAAY,mBACZ/E,YACI,0CAEJkF,iBAAkB,UAClBD,kBAAmB,OACnBG,SAAUD,EACVA,UAAW,WACPi+J,GAAsB,CAAEj+J,YAAWC,cAEvC5pC,SAAS,gCAyDtBguM,GA7CV,SAAC,GAAmC,IAAjC3gD,EAAgC,EAAhCA,UAAWC,EAAqB,EAArBA,eACT7/G,EAAY26J,KAAoBn6M,KAChCoyB,EAAW+nL,KAAoB7tC,KAC/B16J,EAAUuoM,KAAoBvoM,QAC9B6T,EAAUW,cACV3Q,EAAU0R,YAAY3R,MAEtBpY,EAA4C00I,cAE5C0sE,EAAe9G,KACfsI,EAAiB7G,KACjBxyB,EAAmB2xB,KAEnB2H,EAAiB9rC,KACjBmO,EAAgB1N,KAChBj1J,EAAcnQ,cAEdgiL,EAAoBtkE,KACpBwhE,EAA0B7wL,uBAC5B,kBAAa,OAAP4X,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAaowL,EAAiB,OAAC/7K,QAAD,IAACA,OAAD,EAACA,EAASrU,aACvD,CAACowL,EAAD,OAAoB/7K,QAApB,IAAoBA,OAApB,EAAoBA,EAASrU,YAGjC,OACI,cAAC,GAAD,CACIo+C,UAAWA,EACX1gD,YAAa1B,EAAO0B,YACpBszB,SAAUA,EACVxgB,QAASA,EACTkuD,MAA8B,QAAvB1iE,EAAO0B,YACdugK,eAAgBA,EAChBD,UAAWA,EACX35I,QAASA,EACThQ,QAASA,EACT+oM,aAAcA,EACdlwB,uBAAwB3H,EACxB83B,qBAAsBuB,EACtBvxB,qBAAsBwxB,EACtBj/B,oBAAqBsB,EACrBoM,wBAAyBA,EACzB/uK,YAAaA,KCriBVugM,OAlBf,YAMI,IALAC,EAKD,EALCA,WACAC,EAID,EAJCA,cAKMC,EAAS,kBACTC,EAAc,kBAGpB,MAAM,2mtBAAN,OAComtBD,EADpmtB,0BAC4ntBC,EAD5ntB,oBAFc,2CAEd,w/CAE4EF,EAF5E,yBAE0GD,EAF1G,4BAEwIC,EAFxI,4CAG2BC,EAH3B,0BAGmDC,EAHnD,yBAG+EH,EAH/E,4BAG6GC,EAH7G,gBCLSG,GAAqB/tM,6BAA2B5T,GCF7D,IAqBe4hN,GArBQ,WACnB,IAAM79I,EDIClwD,qBAAW8tM,ICFZn0C,EAASv9H,SAASC,cAAc,UAetC,OAdAs9H,EAAOq0C,OAAQ,EACfr0C,EAAOs0C,UAAYC,GAAS,CACxBP,cAAez9I,EAAOi+I,WACtBT,WAAYx9I,EAAOk+I,kBAGvB1vL,qBAAU,WAGN,OAFA0d,SAASiyK,KAAK5xK,YAAYk9H,GAEnB,WACHv9H,SAASiyK,KAAKryI,YAAY29F,MAE/B,CAACA,IAEG,MCuBE20C,GAAkCxgL,IAAM/tB,eACjD,WACI,MAAM,IAAInF,MAAM,sBAIX2zM,GAA2CzgL,IAAM/tB,eAC1D,WACI,MAAM,IAAInF,MAAM,sBAIX4zM,GAAoC1gL,IAAM/tB,eACnD,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS6zM,KACZ,OAAO/5L,YAAY1U,qBAAWsuM,KAG3B,SAASI,KACZ,OAAOh6L,YAAY1U,qBAAWuuM,KAe3B,SAASI,KACZ,OAAOj6L,YAAY1U,qBAAWwuM,KAS3B,IAAMI,GAAyC90J,eAE/C,SAAS+0J,KACZ,OAAOn6L,YAAY1U,qBAAW4uM,KAU3B,IAAME,GAAwCh1J,eAE9C,SAASi1J,KACZ,OAAOr6L,YAAY1U,qBAAW8uM,KAQ3B,IClHKnrM,GC0BAqrM,GAKAC,GAKAC,GF8E4Cp1J,eCfjD,SAASq1J,GACZC,EAAyB7hM,GAEzB,MAAO,CACHnX,KAAMuN,GAAQ0rM,qCACdD,gBACA7hM,cAWD,SAAS+hM,KACZ,MAAO,CACHl5M,KAAMuN,GAAQ4rM,mCAIf,SAASC,GACZJ,EACA3oM,GAEA,MAAO,CACHrQ,KAAMuN,GAAQ8rM,oCACdL,gBACA3oM,cAID,SAASipM,GAAiC10M,GAC7C,MAAO,CACH5E,KAAMuN,GAAQgsM,oCACd30M,SAID,SAAS40M,KACZ,MAAO,CACHx5M,KAAMuN,GAAQksM,8BAIf,SAASC,GAA4B90M,GACxC,MAAO,CACH5E,KAAMuN,GAAQosM,+BACd/0M,SAID,SAASg1M,GAA4BC,EAA0BC,GAClE,MAAO,CACH95M,KAAMuN,GAAQwsM,+BACdF,aACAC,W,SA7JIvsM,K,wEAAAA,E,4EAAAA,E,4EAAAA,E,wEAAAA,E,4EAAAA,E,4EAAAA,E,kFAAAA,E,sFAAAA,E,sFAAAA,E,sFAAAA,E,0FAAAA,E,0FAAAA,E,sEAAAA,E,0EAAAA,E,0EAAAA,E,4DAAAA,E,gEAAAA,E,gEAAAA,E,8DAAAA,E,kEAAAA,E,sEAAAA,E,sEAAAA,E,wCAAAA,E,4CAAAA,E,4CAAAA,E,4BAAAA,E,8CAAAA,E,kDAAAA,E,gFAAAA,E,0DAAAA,E,8DAAAA,E,8DAAAA,E,sDAAAA,E,2DAAAA,Q,cC0BAqrM,K,oBAAAA,E,uBAAAA,Q,cAKAC,K,kBAAAA,E,qBAAAA,Q,cAKAC,K,cAAAA,E,mBAAAA,Q,SChCAkB,GCAAC,G,UCACC,GAED,SAICC,GACK,eADLA,GAEC,WAGDC,GAAmF,CAC5F,CACI3hN,KAAM,eACNoS,MAAOsvM,IAEX,CACI1hN,KAAM,WACNoS,MAAOsvM,KAiFFE,GAAgC,SACzClkN,EACAoC,EACAyH,EACA0N,GAC2B,IAAD,IAC1B,MAAO,CACHhW,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/BY,UAAS,OAAEA,QAAF,IAAEA,OAAF,EAAEA,EAAW3D,WACtBgD,MAAOzB,EAAa0B,WACpByiN,MAAOl+M,aAAsBjG,EAAa4B,QAAS,IACnDhB,OAAQmjN,GACRK,WAAY7sM,EAAQ8sM,aACd3B,GAAsB/kK,SACtB+kK,GAAsB4B,QAC5Bh6M,OAAQiN,EAAQ7M,QAAQ3I,KAAK,KAC7BqB,QAASmU,EAAQulB,SAAS/6B,KAAK,KAC/B8H,S,SF5ED,SAAS06M,KACZ,IAAM33L,EAAeC,eACrB,OAAOC,mBACH,kBAvCR,SAAuCF,GACnC,IAAM4xB,EAAa,SAACklK,GAAD,OACfA,EAAWphF,WACJ71G,aAAcG,EAActZ,KAAgBkxM,qBAEjD9lK,EAAa,SAACglK,GAAD,OACdA,EAAWphF,WACL71G,aAAcG,EAActZ,KAAgBmxM,qBAoBvD,MAAO,CACHjmK,aACAE,aACAtwB,eApBmB,SAACs2L,GAAD,OACnBn2L,aACIm2L,EACA,CACIl2L,aACIq1L,GAAkBzkK,QAClBslK,EACAlmK,GAEJhwB,aACIq1L,GAAkBxkK,QAClBqlK,EACAhmK,OAiBNimK,CAA8B/3L,KACpC,CAACA,ICJF,SAASg4L,KACZ,IAAMh4L,EAAeC,eACrB,OAAOC,mBACH,kBAvCR,SAA0CF,GACtC,IAAM4xB,EAAa,SAACklK,GAAD,OACfA,EAAWphF,WACJ71G,aAAcG,EAActZ,KAAgBkxM,qBAEjD9lK,EAAa,SAACglK,GAAD,OACdA,EAAWphF,WACL71G,aAAcG,EAActZ,KAAgBmxM,qBAoBvD,MAAO,CACHjmK,aACAE,aACAtwB,eApBmB,SAACs2L,GAAD,OACnBn2L,aACIm2L,EACA,CACIl2L,aACIs1L,GAAqB1kK,QACrBslK,EACAlmK,GAEJhwB,aACIs1L,GAAqBzkK,QACrBqlK,EACAhmK,OAiBNmmK,CAAiCj4L,KACvC,CAACA,K,SD7CGi3L,O,qBAAAA,I,sBAAAA,Q,cCAAC,O,qBAAAA,I,sBAAAA,Q,KEPL,I,6CCOKgB,GDPCC,GAA+B,2BEA/BC,GAAY,SAAC98J,EAAe+8J,GAAhB,IAA8B5sK,EAA9B,uDAAuC,IAAvC,gBAClB6P,EADkB,YACT+8J,GADS,OACQ,IAAV/8J,EAAc7P,EAAS,KCwDjC6sK,GAAuC,WAChD,IAAMh1M,EAAWO,cACX00M,EAAuBp8M,eACvB0N,EAAU0R,YAAY3R,MACtBmK,EAAcnQ,cASpB,OAAO3R,uBACH,SACImB,EACAuX,EACA6tM,GACE,IAAD,EACDl1M,ERDD,CACHrG,KAAMuN,GAAQiuM,qCQEV,IAAMC,EAA0BpB,GAC5BlkN,EADyD,iBAEzDyW,QAFyD,IAEzDA,OAFyD,EAEzDA,EAASrU,iBAFgD,QAEnC,EACtBqgN,GAAgBltM,UAChBgC,GAGkC,IAAlCA,EAAQguM,eAAe/jM,SACvB8jM,EAAwBE,gBAAkBjuM,EAAQguM,eAAe,IAGrEJ,EAAqBG,GAChBnrL,MAAK,SAAAn5B,GACF,IAAIokN,EAAwB,CACxB,IAAMK,EAA4B,6BAC3BzlN,GAD2B,IAE9B0lN,cAAenuM,IAEnBrH,EAAS08B,aAAeC,KAAapyC,YAAY6H,KAAMuqC,KAAapyC,YAAYsyC,aAAc04K,IRhB/G,IACHf,EQiBgBx0M,GRjBhBw0M,EQiB2D1jN,ERfpD,CACH6I,KAAMuN,GAAQuuM,qCACdjB,iBQcYx0M,EACI0yM,GACI5hN,EAAK+f,MAAMjR,KAAI,SAAA4zM,GAAU,OAAIA,EAAWp1M,MACxCtN,EAAKknD,WAGhB7tB,OAAM,SAAC5rB,GACJyB,ERjBb,SAA2CzB,GAC9C,MAAO,CACH5E,KAAMuN,GAAQwuM,qCACdn3M,SQcqBo3M,CAAkCp3M,EAAMgB,UACjDkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAD,OAAWuG,QAAX,IAAWA,OAAX,EAAWA,EAASrU,UAAW+iN,EAAsBxkM,KAQhDmlM,GAAgD,WACzD,IAAM51M,EAAWO,cACX00M,EAAuBp8M,eACvB0N,EAAU0R,YAAY3R,MACtBmK,EAAcnQ,cASpB,OAAO3R,uBACH,SACImB,EACAuX,EACAo0B,GACE,IAAD,EACDz7B,ERxCD,CACHrG,KAAMuN,GAAQ2uM,qCQyCV,IAAMT,EAA0BpB,GAC5BlkN,EADyD,iBAEzDyW,QAFyD,IAEzDA,OAFyD,EAEzDA,EAASrU,iBAFgD,QAEnC,EACtBqgN,GAAgBltM,UAChBgC,GAGkC,IAAlCA,EAAQguM,eAAe/jM,SACvB8jM,EAAwBE,gBAAkBjuM,EAAQguM,eAAe,IAGrEJ,EAAqBG,GAChBnrL,MAAK,SAAAn5B,GACF,IAAM6hN,EAAgB7hN,EAAK+f,MAAMjR,KAAI,SAAA4zM,GAAU,OAAIA,EAAWp1M,MAC9D4B,EACI0yM,GACIC,EACA7hN,EAAKknD,QAEE,OAAfvc,QAAe,IAAfA,KAAkBk3K,MAErBxoL,OAAM,SAAC5rB,GACJyB,ERjDb,SAA2CzB,GAC9C,MAAO,CACH5E,KAAMuN,GAAQ4uM,qCACdv3M,SQ8CqBw3M,CAAkCx3M,EAAMgB,UACjDkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAD,OAAWuG,QAAX,IAAWA,OAAX,EAAWA,EAASrU,UAAW+iN,EAAsBxkM,KAQhDulM,GAAiC,WAC1C,IAAMh2M,EAAWO,cACXkQ,EAAcnQ,cACd21M,EAA0Bn9M,eAC1Bo9M,EAAyB18M,eAQ9B,OAAO7K,uBACJ,SACIoK,EACA0iC,GAEA,IAAI+3K,EACJxzM,EAASmzM,MACT8C,EAAwBl9M,GACnBkxB,MAAK,SAAAn5B,GAEF,OADA0iN,EAAa1iN,GACEqlN,WACJD,EAAuBn9M,GACzBoxB,OAAM,SAAC5rB,GAEJ,OADAkS,EAAYlS,EAAMgB,QAAS,SACpB+rB,QAAQo7B,aAAQh3D,MAGxB47B,QAAQo7B,aAAQh3D,MAG9Bu6B,MAAK,SAACwpL,GACHzzM,EACIuzM,GAA4BC,EAAYC,IAE7B,OAAfh4K,QAAe,IAAfA,KAAkB+3K,MAErBrpL,OAAM,SAAC5rB,GACe,MAAfA,EAAMrG,KACN8H,EAASqzM,GACLwB,MAGJ70M,EAASqzM,GAA4B90M,EAAMgB,UAC3CkR,EAAYlS,EAAMgB,QAAS,eAI3C,CAACS,EAAUi2M,EAAyBC,EAAwBzlM,KAQvD2lM,GAAgC,WACzC,IAAMp2M,EAAWO,cACX21M,EAAyB18M,eAO9B,OAAO7K,uBAAY,SAACoK,GACjB,OAAOm9M,EAAuBn9M,GACzBkxB,MAAK,SAACwpL,GAIH,OAHAzzM,ER9ET,SAAoCyzM,GACvC,MAAO,CACH95M,KAAMuN,GAAQmvM,8BACd5C,UQ4EY6C,CAA2B7C,IAExBnoL,QAAQo7B,QAAQ+sJ,QAG/B,CAACzzM,EAAUk2M,KAkENK,GAAwB,WACjC,IAAMv2M,EAAWO,cACjB,OAAO5R,uBACH,SAAC6V,EAAY7S,GACTqO,ERnJL,SAAqBwE,EAAwB7S,GAChD,MAAO,CACHgI,KAAMuN,GAAQsvM,aACd7kN,MAAOA,EACP6S,MAAOA,GQ+IMiyM,CAAYjyM,EAAO7S,GAAgB,cAEhD,CAACqO,KAII02M,GAAgC,WACzC,IAAM12M,EAAWO,cACjB,OAAO5R,uBACH,SAACoK,EAAwBuQ,EAAkBC,GACvCvJ,ER9IL,SACHjH,EACAuQ,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQyvM,sBACd59M,eACAuQ,UACAC,WQqIaqtM,CAAoB79M,EAAcuQ,EAASC,MAExD,CAACvJ,KAII62M,GAAkC,WAC3C,IAAM72M,EAAWO,cACjB,OAAO5R,uBACH,SAACoK,GR9JF,IAA+BqF,EQ+J1B4B,GR/J0B5B,EQ+JKrF,ER9JhC,CACHY,KAAMuN,GAAQ4vM,wBACd14M,UQ8JA,CAAC4B,KAII+2M,GAAqC,WAC9C,IAAM/2M,EAAWO,cACjB,OAAO5R,uBACH,SAACoK,GRvIF,IAAkCqF,EQwI7B4B,GRxI6B5B,EQwIKrF,ERvInC,CACHY,KAAMuN,GAAQ8vM,4BACd54M,UQuIA,CAAC4B,KAIIi3M,GAAmC,WAC5C,IAAMj3M,EAAWO,cACjB,OAAO5R,uBACH,SAACoK,EAAwBuQ,EAAkBC,GACvCvJ,ER/JL,SACHjH,EACAuQ,EACAC,GAEA,MAAO,CACH5P,KAAMuN,GAAQgwM,0BACdn+M,eACAuQ,UACAC,WQsJa4tM,CAAuBp+M,EAAcuQ,EAASC,MAE3D,CAACvJ,KA4BIo3M,GAAgC,WACzC,IAAMp3M,EAAWO,cACX00M,EAAuBp8M,eACvB0N,EAAU0R,YAAY3R,MACtBmK,EAAcnQ,cACpB,OAAO3R,uBACH,SAACmB,EAA4BuX,GAA4C,IAAD,EACpErH,ERtVD,CACHrG,KAAMuN,GAAQmwM,8BQuVV,IAAMjC,EAA0BpB,GAC5BlkN,EADyD,iBAEzDyW,QAFyD,IAEzDA,OAFyD,EAEzDA,EAASrU,iBAFgD,QAEnC,EACtBqgN,GAAgBntM,SAChBiC,GAEAA,EAAQvS,YAAYwc,OAAS,IAC7B8jM,EAAwBpgN,WAAaqS,EAAQvS,YAAYjD,KAAK,MAGlEojN,EAAqBG,GAChBnrL,MAAK,SAAAn5B,GACF,IR9VhBwmN,EQ8VsB/B,EAA4B,6BAC3BzlN,GAD2B,IAE9B0lN,cAAenuM,IAEnBrH,EACI08B,aACIC,KAAa4M,SAASn3C,KACtBuqC,KAAa4M,SAAS1M,aACtB04K,IAGRv1M,GRzWhBs3M,EQyWoDxmN,ERvW7C,CACH6I,KAAMuN,GAAQqwM,8BACdD,uBQuWSntL,OAAM,SAAC5rB,GACJyB,ERpWb,SAAoCzB,GACvC,MAAO,CACH5E,KAAMuN,GAAQswM,8BACdj5M,SQiWqBk5M,CAA2Bl5M,EAAMgB,UAC1CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CACIS,EADJ,OAEIuG,QAFJ,IAEIA,OAFJ,EAEIA,EAASrU,UACT+iN,EACAxkM,KASCinM,GAAkC,WAC3C,IAAM13M,EAAWO,cACX00M,EAAuBp8M,eACvBq9M,EAAyB18M,eACzBiX,EAAcnQ,cASpB,OAAO3R,uBACH,SACIoK,EACA0iC,GAEAz7B,EAASmzM,MACT,IAKIK,EALEtlN,EAAkC,CACpC6K,aAAcA,EAAaxK,WAC3B8C,MAAO,EACPC,OAAQ,GAGZ2jN,EAAqB/mN,GAChB+7B,MAAK,SAACn5B,GACH,OAAIA,EAAK+f,MAAMS,OAAS,GACpBkiM,EAAa1iN,EAAK+f,MAAM,IACTslM,WACJD,EAAuBn9M,GACzBoxB,OAAM,SAAC5rB,GAEJ,OADAkS,EAAYlS,EAAMgB,QAAS,SACpB+rB,QAAQo7B,aAAQh3D,MAGxB47B,QAAQo7B,aAAQh3D,GAGpB47B,QAAQC,OAAO,CAAEhsB,QAASs1M,QAGxC5qL,MAAK,SAACwpL,GACY,OAAfh4K,QAAe,IAAfA,KAAkB+3K,GAClBxzM,EACIuzM,GAA4BC,EAAYC,OAG/CtpL,OAAM,SAAC5rB,GACJyB,EAASqzM,GAA4B90M,EAAMgB,UACvChB,EAAMgB,UAAYs1M,IAClBpkM,EAAYlS,EAAMgB,QAAS,cAI3C,CAACS,EAAUi1M,EAAsBiB,EAAwBzlM,KAIpDknM,GAA+B,SAACC,GACzC,IAAM53M,EAAWO,cACXs3M,EAAwBx+M,cACxBoX,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgkN,GAEG,OADA3yM,EAAS6yM,MACFgF,EAAsBlF,GACxB1oL,MAAK,SAAAn5B,GACFkP,EACI+yM,GAAiCJ,EAAe,WAEpD,IAAMmF,EAAYhD,GAAUnC,EAAcrhM,OAAQsmM,EAAiB,gBAAkB,wBAC/Er4M,EACFozM,EAAcrhM,OAAS,EAAvB,UACSwmM,EADT,iCAESA,EAFT,sBAIJ,OADArnM,EAAYlR,EAAS,WACdzO,KAEVq5B,OAAM,SAAC5rB,GACJyB,EAASizM,GAAiC10M,EAAMgB,UAChDkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU63M,EAAuBD,EAAgBnnM,KAI7CsnM,GAA+B,SAACH,GACzC,IAAM53M,EAAWO,cACXy3M,EAAwBz+M,eAExBkX,EAAcnQ,cACpB,OAAO3R,uBACH,SAACgkN,GAEG,OADA3yM,EAAS6yM,MACFmF,EAAsBrF,GACxB1oL,MAAK,SAAAn5B,GACFkP,EACI+yM,GAAiCJ,EAAe,WAEpD,IAAMmF,EAAYhD,GAAUnC,EAAcrhM,OAAQsmM,EAAiB,gBAAkB,wBAC/Er4M,EACFozM,EAAcrhM,OAAS,EAAvB,UACSwmM,EADT,iCAESA,EAFT,sBAIJ,OADArnM,EAAYlR,EAAS,WACdzO,KAEVq5B,OAAM,SAAC5rB,GACJyB,EAASizM,GAAiC10M,EAAMgB,UAChDkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU43M,EAAgBI,EAAuBvnM,KCxiB7CyU,GAAYvmB,IAAOC,IAAV,iHAMTkvB,GAAUnvB,IAAOC,IAAV,+IASP2gD,GAAkB5gD,IAAOC,IAAV,2HAQf2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQd8kI,GAAkB/kI,IAAOC,IAAV,gOAYfq5M,GAAgBt5M,IAAOC,IAAV,gIAOb+kI,GAAahlI,IAAOC,IAAV,uDAIV+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,kIAOd6lB,GAAgBvtC,IAAOC,IAAV,uDC7Bbs5M,GAGR,SAAC,GAGC,IAFH7wM,EAEE,EAFFA,QACA68H,EACE,EADFA,eAEM/zI,EAASm5B,eACT6N,EAAQ+iF,KACRoqB,EAAapyH,eACbqyH,EAAepyH,eACfsuI,EAAYrC,KACZ1Z,EAA6B5qB,GAAazyG,EAAQulB,UANtD,EAQ0C9K,qBAR1C,mBAQKuzL,EARL,KAQqB8C,EARrB,OASsCr2L,qBATtC,mBASKqyL,EATL,KASmBiE,EATnB,KAWIC,EAA8B1pN,uBAChC,SAAC2pN,GACG,IAAMlnN,EAAWoW,aAAiB,OAC9B6tM,QAD8B,IAC9BA,IAAkBhuM,EAAQguM,eAAgBiD,GAC9CH,EAAkB/mN,KAEtB,CAAC+mN,EAAmB9C,EAAgBhuM,EAAQguM,iBAGhDpzL,qBAAU,WACFyiH,IACAH,EAAal9H,EAAQulB,UACrB03G,OAEL,CACCI,EACAr9H,EAAQulB,SACR03G,EACAC,IAGJ,IAAMnyC,EAAiBzjG,uBAAY,WAC/B21I,IACAmc,IACAvc,EAAe,CACXmxE,eAAc,OAAEA,QAAF,IAAEA,IAAkBhuM,EAAQguM,eAC1ClB,aAAY,OAAEA,QAAF,IAAEA,IAAgB9sM,EAAQ8sM,aACtCvnL,SAAUz8B,EAAO6iB,SACjBxY,QAAS28B,EAAMnkB,aAEpB,CACCqiM,EACAlB,EACAhkN,EAAO6iB,SACPmkB,EAAMnkB,SACNsxH,EACAmc,EACAvc,EACA78H,IAGEw9H,EACF1tG,EAAMnkB,SAAS1B,OACfnhB,EAAO6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,SACpC,OAAC6iM,QAAD,IAACA,IAAgB9sM,EAAQ8sM,cAAgB,EAAI,IAC9C,OAACkB,QAAD,IAACA,IAAkBhuM,EAAQguM,gBAAgB/jM,OAEzCozL,EAAgBnmD,KAChBzZ,EAAiBryH,eASvB,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAACygB,GAAA,EAAD,CAAUpwB,MAAO,gBAAiBD,SAAS,8BAA3C,SACI,cAACo1M,GAAD,UACKlE,GAAyCn0M,KAAI,SAAAmS,GAAI,OAC9C,cAAC,GAAD,CAA6BjS,YAAU,+BAAvC,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,SACI,OAAC+rM,QAAD,IAACA,IAAkBhuM,EAAQguM,gBACtBhlM,SAAS0B,EAAKvN,OAEvBigB,aAAc,WACV4zL,EAA4BtmM,EAAKvN,QAErCpC,MAAO2P,EAAK3f,KACZsyB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAK2oE,oBAAUz5D,EAAK3f,MAApB,cAZH2f,EAAKvN,QAFDuN,EAAKvN,cAoBlC,cAAC0uB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAACo1M,GAAD,UACI,cAAC,GAAD,CAAYn4M,YAAU,wBAAtB,SACI,cAAC2iB,GAAA,EAAD,CACInZ,QAAO,OAAE6qM,QAAF,IAAEA,IAAgB9sM,EAAQ8sM,aACjC1vL,aAAc,SAAAT,GACVo0L,EAAgBp0L,EAAEgwB,OAAO1qC,UAE7BlH,MAAM,WACNsiB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAS,+BAM7B,cAACqwB,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI4kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAAC,GAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAS,UACTpC,MAAO,QACPhE,OAAQ,kBAhFxBg/M,GAAgB,GAChBD,EAAkB,IAClBzT,SACA5/D,KA8EgBjiI,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQg5F,EACRvvF,SAAS,sBAHb,iCC7ID01M,GArDMx7M,sBACjB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,0hBC5ChBs6M,GAAuC75M,IAAOC,IAAV,yEAOpC65M,GAGD,SAAC,GAGE,IAFJt2E,EAEG,EAFHA,iBACAt/H,EACG,EADHA,SAEA,OACI,cAAC21M,GAAD,UACI,cAAC,GAAD,CACIl2E,KAAM,CACF,CACIzyG,IAAK,gBACL/sB,MAAO,iBACPu8B,IAAKn3C,IAAOsC,oBAAoBC,eAAeC,KAEnD,CACImlC,IAAK,aACL/sB,MAAO,aACPu8B,IAAKn3C,IAAOsC,oBAAoBK,WAAWH,IAC3Cy3I,iBAAkBA,IAG1Bt/H,SAAUA,OAgBX61M,GAPV,SAAC,GAGE,IAFJv2E,EAEG,EAFHA,iBACAt/H,EACG,EADHA,SAEA,OAAO,cAAC,GAAD,CAAuBs/H,iBAAkBA,EAAkBt/H,SAAUA,KCrBjE81M,GAxBU57M,sBACrB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,SAUI,sBACIU,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,yIACFF,KAAK,iBChBZsuF,GAAa3tF,IAAOC,IAAV,0FAMVwtF,GAA0BztF,IAAOC,IAAV,uIAQvBytF,GAAS1tF,YAAOurC,KAAPvrC,CAAH,2FAMNy8D,GAAcz8D,IAAOC,IAAV,kKAUXktE,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,kBAGb6qL,kBAAmB,CACf7qL,QAAS,iBACTuiC,SAAU,U,SRlCNskJ,K,kBAAAA,E,mBAAAA,Q,KS6BL,SAASiE,GACZ5oM,EACAngB,EACAuX,EACAwmE,EACAC,EACAC,GAEA,IAAM+qI,EAAkBh1L,iBAAiC,WAEnD9jB,EAAWO,cAEXw4M,EClB+C,SACrD9oM,EACAvf,GAEA,IAAMukN,EAAuBp8M,eACvBmgN,EAAuB3/M,cACvB4/M,EAAuB1/M,eACvBgN,EAAU0R,YAAY3R,MACtBmK,EAAcnQ,cAOpB,OAAO3R,sBAAW,yCACd,WACImB,EACAuX,EACAymE,GAHJ,4BAAAl9D,EAAA,iFAMSgkM,GAAwB1lK,QAAU8pK,GAN3C,eAOSpE,GAAwBzlK,QAAU8pK,GAFjCC,EALV,EAUU9D,EAA0BpB,GAC5BlkN,EADyD,iBAEzDyW,QAFyD,IAEzDA,OAFyD,EAEzDA,EAASrU,iBAFgD,QAEnC,EACZ,aAAV+d,EACMsiM,GAAgBntM,SAChBmtM,GAAgBltM,UACtBgC,IAIA,OAACA,QAAD,IAACA,GAAD,UAACA,EAA2CvS,mBAA5C,eACMwc,QAAS,IAEf8jM,EAAwBpgN,WACpBqS,EACFvS,YAAYjD,KAAK,MAKF,KADjB,OAACwV,QAAD,IAACA,GAAD,UAACA,EAAwCguM,sBAAzC,eACM/jM,UAEN8jM,EAAwBE,gBACpBjuM,EACFguM,eAAe,IAGf8D,EAAyBD,EAA2BxoN,GArC9D,SAuCUukN,EAAqBG,GACtBnrL,KADC,yCACI,WAAMgT,GAAN,gBAAArsB,EAAA,yDACGmxB,kBAAQ9E,EAASpsB,OADpB,uBAEQ8hM,EAAgB11K,EAASpsB,MAAMjR,KACjC,SAAAmS,GAAI,OAAIA,EAAK3T,MAHnB,SAMQ+6M,EAAuBxG,GACxB1oL,MAAK,kBAAM6jD,EAAkB6kI,EAAcrhM,WAC3C6Y,OAAM,SAAC5rB,GAGJ,MAFK,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UACHkR,EAAYlS,EAAMgB,QAAS,SACzBhB,KAXhB,2CADJ,uDAgBD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAxDlB,2CADc,0DA4Dd,CACIy6M,EADJ,OAEIzyM,QAFJ,IAEIA,OAFJ,EAEIA,EAASrU,UACT+mN,EACAhpM,EACAglM,EACAxkM,EACA/f,ID/DJ0oN,CACInpM,EACA6oM,EAAgBpqL,SAGlBs/C,EAAkBx2D,eAClB/G,EAAcnQ,cAEd2xI,EAAsBnuH,iBAAe,GAd7C,EAgBoChC,oBAAkB,GAhBtD,mBAgBSosD,EAhBT,KAgBoBC,EAhBpB,KAkBQroB,EACF,CACI,CACIiB,WE/DZ,kCFgEYC,eAAgB+xJ,EAChB9xJ,sBAAuB,CACnBQ,WAAY,CACR33D,aAAa,6BACNA,GADK,IAERwB,OAAQ,IAEZ+V,UACAymE,kBAAmB,SAAAonE,GAAiB,OAC/BjD,EAAoBvjH,QACjBujH,EAAoBvjH,QACpBwmH,GACRnwF,WAAY8oB,GAEhBzoB,UAAW,gBASrBi0J,EAA2B,kBAAOpnE,EAAoBvjH,QAAU,GAMhEwgD,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnB7pB,YAAW,WACP4tE,MACD,KAEHE,GAAaC,GAAa,GAC1BkrI,IAEiB,OAAjBvrI,QAAiB,IAAjBA,UAGJr9D,EAAY,GAAD,OAEHwhI,EAAoBvjH,QAFjB,kCAGmBq3H,GACtB+yD,EAAgBpqL,UAEpB,aAEL,CAACs/C,EAAiBE,EAAWJ,EAAmBr9D,IAM7C0+D,EAAwCxgF,uBAAY,WACtD28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAW,GAAD,OAAK0sK,EAAgBpqL,QAArB,eACVC,QAASq/C,MAKrBqrI,IAEAnrI,GAAaC,GAAa,GAEX,OAAfJ,QAAe,IAAfA,YAEL,CAAC/tE,EAAUguE,EAAiBE,EAAWH,IAElC7nB,EAAiBL,aACrBC,EACAopB,EACAC,GAHIjpB,aAUF2rF,EAA8BljJ,uBAAY,WAC5C28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACbioB,GAAa,GACbH,IAEAqrI,IAEiB,OAAjBvrI,QAAiB,IAAjBA,UAGJr9D,EAAY,GAAD,OAEHwhI,EAAoBvjH,QAFjB,kCAGmBq3H,GACtB+yD,EAAgBpqL,UAEpB,aAEL,CAACs/C,EAAiBF,EAAmB5nB,EAAcz1C,IAMhDqhI,EAA+BnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAW,GAAD,OAAK0sK,EAAgBpqL,QAArB,eACV4gD,wBAAyBuiE,EACzBljH,QAASq/C,MAKrB9nB,GAAa,QAElB,CAAClmD,EAAU6xI,EAA6B7jE,EAAiB9nB,IAS5D,OAPAjkC,qBAAU,WACFisD,GACA4jE,MAGL,CAAC5jE,IAEGv/E,uBAAY,SAACyK,GAChB0/M,EAAgBpqL,QAAUt1B,EAE1B+0E,GAAa,KACd,IG9HP,I,wTAAMuiB,GAAKhyE,EAAQ,IAEN+qH,GAAiB,GACxB6vE,GAA0B,CAC5BxF,GACAA,IAGEyF,GA4BD,SAAC,GAiBC,IAAD,QAhBFhzM,EAgBE,EAhBFA,QACAiuM,EAeE,EAfFA,YACAgF,EAcE,EAdFA,kBACA92M,EAaE,EAbFA,QACA+2M,EAYE,EAZFA,mBACAljM,EAWE,EAXFA,QACAhP,EAUE,EAVFA,eACAmyM,EASE,EATFA,oBACAC,EAQE,EARFA,sBACAC,EAOE,EAPFA,oBACAjiE,EAME,EANFA,cACAkiE,EAKE,EALFA,6BACAC,EAIE,EAJFA,yBACAC,EAGE,EAHFA,oBACA/vE,EAEE,EAFFA,uBACA1E,EACE,EADFA,YAEM5vG,EAAoC,CACtClkC,WAAY,GACZE,QAAS,GACTL,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGb+4H,GACDvoG,GAAQujG,IACPA,EAAYp3I,QACdo3I,EAAYz1G,MAAQ8M,KAAapyC,YAAY6H,KACvCkzI,EAAYp3I,OACZwnC,EAfR,EAuBED,aAAqB60G,GALrBx6I,EAlBF,EAkBEA,aACAg4B,EAnBF,EAmBEA,cACA4O,EApBF,EAoBEA,WACAW,EArBF,EAqBEA,UACAK,EAtBF,EAsBEA,oBAGEi1C,EAAUb,KAzBd,EA0BwChqD,mBAAS,IAAIhD,MA1BrD,mBA0BK+mD,EA1BL,KA0BoBqkE,EA1BpB,OA2BkCpoH,qBA3BlC,mBA2BKsoH,EA3BL,KA2BiBC,EA3BjB,OAqCoCvoH,oBAAc,GArClD,mBAqCK8mD,EArCL,KAqCkBuhE,EArClB,KAsCI6vE,EAAc,UAAGlqN,EAAa0lN,qBAAhB,QAA+D,CAC/EH,eAAgBiE,GAChBnF,cAAc,EACd35M,QAAS,GACToyB,SAAQ,OAAErlB,QAAF,IAAEA,IAAkB,IA1C9B,EA4C4Bua,mBAAqCk4L,GA5CjE,mBA4CK3yM,EA5CL,KA4Cc4yM,EA5Cd,KA8CIhwE,EAAgB5I,KAEhBv7D,EAAcn3E,uBAAY,WAC5BmB,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,GACtB+uE,EAAkB1pN,EAAcuX,GAChC6iI,EAAiB,IAAIprH,MACrB+6L,EAA6B,IAAI,EAAMnvE,IACvCP,GAAe,KAEhB,CAACqvE,EAAmB1pN,EAAcuX,IAO/B6yM,GAA8B,SAAC1G,GAA8B,IAAD,EACzDA,GACLj9L,EAAQH,KACJluB,IAAOsC,oBAAoBK,WAAWF,OAAO2D,QACzC,gBADJ,UAEIklN,EAAWp1M,UAFf,aAEI,EAAe7P,YAEnB,CACIm8H,WAAW,EACX3xH,aAAcy6M,EAAWp1M,GACzBwyD,OAAQ4iJ,EAAW2G,SAASC,SAC5BtqN,eACAuX,aAuBNyQ,GAAck5B,eAyBd05F,GACF8pE,GACAA,EAAY3jM,OACZ8oM,GACAA,EAAsBroM,OAASkjM,EAAY3jM,MAAMS,OAE/C+oM,GAA4B1rN,uBAC9B,SAAC2a,GACG,IAAMqpM,EACD6B,GACGA,EAAY3jM,MAAMjR,KAAI,SAAC4zM,GAAD,OAClB9+L,OAAO8+L,EAAWp1M,QAE1B,GACJy7M,EACIlH,EACArpM,EACAohI,MAGR,CAAC8pE,EAAa9pE,GAA6BmvE,IAUzCS,GACFzB,GACI,YACA/oN,EACAuX,EAHsC,iBAItCmtM,QAJsC,IAItCA,OAJsC,EAItCA,EAAax8J,aAJyB,QAIhB,EACtB8tB,GAGFy0I,GAAqB5rN,uBAAY,WACnC,GAAIi6E,EACA0xI,GAAwC,eACrC,CACH,IACKX,GACEA,IAA0BA,EAAsBroM,SAClDooM,EAED,OAGJA,EAAoBC,GAAuB1vL,MAAK,SAACpsB,GACvCA,GACFg8M,EACIF,GACA,GACA,SAOjB,CACCA,EACAD,EACAG,IAGEW,GAAqB7rN,uBAAY,WACnC,GAAIi6E,EACA0xI,GAAwC,eACrC,CACH,IACKX,GACEA,IAA0BA,EAAsBroM,SAClDyoM,EAED,OAGJA,EAAoBJ,GAAuB1vL,MAAK,SAACpsB,GACvCA,GACFg8M,EACIF,GACA,GACA,SAOjB,CACCA,EACAI,EACAF,IAGEY,GAAqB9rN,uBACvB,SAACwnC,GACG6zG,EAAuB7zG,EAAWvJ,UAClCqtL,EAAW9jL,KAEf,CAAC6zG,IAGCt4I,GAAU5B,EAAa4B,QACvBgpN,GAAcjyE,GAAW,YAAa/2I,GAASglC,GAC/CikL,GAAmBlyE,GAAW,YAAa/2I,GAASglC,GACpDkkL,GAAmBnyE,GAAW,kBAAmB/2I,GAASglC,GAC1DmkL,GAAepyE,GAAW,WAAY/2I,GAASglC,GAC/CokL,GAAUryE,GAAW,QAAS/2I,GAASglC,GACvCqkL,GAAgBtyE,GAAW,kBAAmB/2I,GAASglC,GAEvDjgB,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEAuxE,GACF3zM,EAAQulB,SAAStb,OACjBjK,EAAQ7M,QAAQ8W,QACfjK,EAAQ8sM,aAAe,EAAI,IAC1BnoE,kBAAc3kI,EAAQguM,gBAElB,EADA,GAIJjmH,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBqyE,GAChB9lH,YAAuB,OAAXs/G,QAAW,IAAXA,OAAA,EAAAA,EAAa3jM,MAAMS,SAAU,EACzCw3H,yBAAyB,IAGvB6Q,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAe07L,KACnC,CAACA,EAAqBjiE,IAG1Bq+C,IAAiB,WACblmM,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,GACtB+uE,EAAkB1pN,EAAcuX,KACjC,CAACmyM,EAAmB1pN,EAAcuX,IAErC4a,qBAAU,WACFw3L,GAAoB/hL,MACzB,CAAC+hL,EAAoB/hL,IAExBzV,qBAAU,WAEF1a,IACCA,EAAe+J,SAAWjK,EAAQulB,SAAStb,QACxC2pM,qBAAW1zM,EAAgBF,EAAQulB,UAAUtb,OAAS,IAE1D2oM,EAAW,6BACJ5yM,GADG,IAENulB,SAAUrlB,OAInB,CAACA,EAAgB0yM,IAEpBh4L,qBAAU,YAEiB,OAAnB23L,QAAmB,IAAnBA,OAAA,EAAAA,EAAqBtoM,SACrBsoM,EAAoBtoM,UAApB,OAA+BkjM,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAax8J,QAE5CmyF,GAAe,KAEpB,QAACqqE,QAAD,IAACA,OAAD,EAACA,EAAax8J,MAAO4hK,IAExB33L,qBAAU,WACN,OAAO,kBACH43L,EAA6B,IAAI,EAAMnvE,OAE5C,IAEHzoH,qBAAU,WACN43L,EAA6B,IAAI,EAAMnvE,MAExC,CAAC8pE,IAEJvyL,qBAAU,WACFuoH,GAAY,EACZnzG,EAAUozG,IACW,IAAdD,IACPnzG,EAAU,KAGf,CAACmzG,KAEJvoH,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB6oH,oBAChC,CAACge,IAQJ,IAgCMyB,KACAiuE,KAA2BA,EAAsBroM,OAEjDq6H,IACD6oE,GAAgBA,GAAeA,EAAY3jM,MAAMS,OAAS,EAyC/D,OACI,eAAC,GAAD,CACI22G,SAAS,OACTsC,KAAM,cAAC,GAAD,CAAgC1nH,SAAS,mBAC/Ck2L,eAAc,OAAC6gB,QAAD,IAACA,OAAD,EAACA,EAAqBtoM,QACpC27G,cAAc,iBACdpqH,SAAS,aALb,UAOKH,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAE0jN,QAAF,IAAEA,OAAF,EAAEA,EAAa3jM,MACnB+qF,SAAUr0F,KAAoBA,EAAe+J,OAC7CuqF,0BAAyB,OAAC+9G,QAAD,IAACA,OAAD,EAACA,EAAqBtoM,QAC/C/J,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,EACbjjE,SAAU,wBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAE0jM,QAAF,IAAEA,OAAF,EAAEA,EAAax8J,aAAf,QAAwB,EAClCygB,aAAcgxE,GACd74C,aArGK,SAACt/F,GACtB+lC,EAAU/lC,IAqGMu/F,uBACI/gG,EAAa0B,WAAW8f,QACxB89E,GAAYO,yBAChB9sF,SAAU,qBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,2BAEd23F,8BACKwxC,kBAAc4tE,KACd5tE,kBAAcwoE,GACnB/5G,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEkxI,QAAF,IAAEA,OAAF,EAAEA,EAAqBtoM,OACrCR,WAAU,OAAE0jM,QAAF,IAAEA,OAAF,EAAEA,EAAax8J,MACzBygB,aAAcgxE,GACdluC,iBAjHK,WACrBs+G,EAA6B,IAAI,EAAMnvE,IACvCP,GAAe,IAgHCjjH,YAzGA,WAChBmzL,IAA0B,GAC1BlwE,GAAe,IAwGC3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNonG,mBAAoB6iD,GAAYp7H,oBAC5Bo1L,GAAkBzkK,SAEhB,CAAC9rC,KAAgBkxM,oBACjB,GACNn8G,kBAAmBwhD,GAAYrwG,qBAC3BqqK,GAAkBzkK,SAEtBknD,2BAA4BmkH,GAC5B5iH,mBAAoBgiD,GAAYp7H,oBAC5Bo1L,GAAkBxkK,SAEhB,CAAC/rC,KAAgBmxM,oBACjB,GACNn8G,kBAAmBuhD,GAAYrwG,qBAC3BqqK,GAAkBxkK,SAEtBonD,2BAA4BikH,GAC5B5xI,YAAaA,EACb93D,WAAU,OAAE0jM,QAAF,IAAEA,OAAF,EAAEA,EAAax8J,QAGjC2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIloB,QAASA,EACT68H,eAAgB,SAAA/tG,GACZskL,GAAmBtkL,GACnB5G,QAIZlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAdtB,SAgBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aACImxE,EACMwG,GACA,EAEVz4M,SAAU6sF,GAAY45C,eACtBnmI,SAAS,4BAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAA0C,KAApB,OAAX8xM,QAAW,IAAXA,GAAA,UAAAA,EAAa3jM,aAAb,eAAoBS,QACpC+9E,iBAAkB,CACd7sF,KAAM+1M,GACNr/M,KACI,qCACK,IADL,eAGI,uBAHJ,qBAOJ2J,SAAU,yBAEdysF,uBAAwB,CACpBh4C,WACI,iDAEI,uBAFJ,iBAMJz0C,SAAU,gCAEd0sF,uBAAwB,CACpB1sF,SAAU,iCAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YAjMU,SAAC/wB,GAC3BuxF,GAAe,GACfkwE,GAA0BzhK,EAAM5E,OAAO1qC,UAgMvBzG,SAAU,8BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJs9M,IAJF,IAKDn4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,4BANT,2BASDC,MAAO,YACP1F,MAAO,IACJw9M,IAXF,IAYDr4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,qBAbT,2BAgBDC,MAAO,gBACP1F,MAAO,IACJy9M,IAlBF,IAmBDt4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,oCApBT,2BAuBDC,MAAO,QACP1F,MAAO,IACJ09M,IAzBF,IA0BDv4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,4BA3BT,2BA8BDC,MAAO,YACP1F,MAAO,IACJ29M,IAhCF,IAiCDx4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,gCAlCT,2BAqCDC,MAAO,cACP1F,MAAO,IACJu9M,IAvCF,IAwCDp4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,kCAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAvOD,SAACilH,GAChB0G,GAA4B1G,IAuOZ/kH,kBApNM,SAAC71C,EAAY46J,GACnCrpE,GAAe,GAxPW,SAACnmH,EAAQwvL,GACnCxvL,EAAEC,kBACIuvL,EAAWp1M,IACb07M,EAAyBtG,EAAWp1M,IAsPxC88M,CAAsBtiK,EAAO46J,IAmNbhlH,aAhOM,SAACglH,GAAD,QACpBmG,KACAnG,EAAWp1M,IACbu7M,EAAsBtpM,SAASmjM,EAAWp1M,KA8N1BswF,gBA5MS,SAAC8kH,GAC1B,OAAOppE,IAAeopE,EAAWp1M,IA4MjBivF,kBAAmB,SAACmmH,GAAD,MAA+B,CAC9CjsM,eAAgBisM,EAAW2H,YAAc,GACzC5vI,kBAAmB,CACfnoE,KAAgB61L,0BAGxBp2L,SAAU,kBAEVyrF,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvBz4C,wBAAyB,SACrBulH,GADqB,OAGrB,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CACIjtM,QAASitM,EAAWp8M,KACpB4L,KAAK,KACLH,SAAS,gCAEb,cAAC6tD,GAAA,EAAD,CACIC,UACI6iJ,EAAWp8M,MACXmP,GACAitM,EAAWp8M,KAAKgH,KACZmI,EAAQnI,GAEhBwyD,OACK4iJ,EAAW2G,SACPC,SAETv3M,SAAS,iCAXb,SAaK2wM,EAAWp8M,MACRo8M,EAAWp8M,KAAKkmC,UACZ,IACAk2K,EAAWp8M,KACNomC,kBAMjC,CACIswD,UAAW,aACXj/B,oBAAqB,SACjB2kJ,GADiB,cAEhB,UAACA,EAAWljK,iBAAZ,aAAC,EAAsBxtC,QAC5BirF,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SAAC8mH,GAAD,uBACTA,EAAWljK,iBADF,aACT,EAAsBxtC,OAC1BD,SAAU,8BAGlB,CACIirF,UAAW,cACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2kJ,GADiB,OAEfA,EAAW2C,YACjBpoH,WAAY,CACRb,mBAAoB,SAChBsmH,GADgB,MAEd,CACF9iN,OAAQ,SACRuM,UAAW0vE,EAAQ+5D,uBAGvBh6C,YAAa,SAAC8mH,GAAD,OACT,eAACp4I,GAAD,CAAat7D,YAAU,gCAAvB,UACI,cAAC,GAAD,IACCwgB,aAAWkzL,EAAW2C,kBAKvC,CACIroH,UAAW,aACXj/B,oBAAqB,SACjB2kJ,GADiB,OAEfA,EAAW4H,OACjBrtH,WAAY,CACRrB,YAAa,SAAC8mH,GAAD,OACTA,EAAW4H,OACfv4M,SAAU,0BAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB2kJ,GADiB,OAEfA,EAAW74D,WACjB5sD,WAAY,CACRrB,YAAa,SAAC8mH,GAAD,OACTlzL,aAAWkzL,EAAW74D,YAC1B93I,SAAU,oCAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB2kJ,GADiB,cAEhB,UAACA,EAAW9+M,kBAAZ,aAAC,EAAuBtC,OAC7B27F,WAAY,CACRH,gBAAgB,EAChB3wF,UAAW0vE,EAAQisI,kBACnBlsH,YAAa,SAAC8mH,GAAD,uBACTA,EAAW9+M,kBADF,aACT,EAAuBtC,MAC3ByQ,SAAU,gCAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACfmmH,GADe,MAEb,CACF10M,KAAMsrI,IAAeopE,EAAWp1M,GAChCs7C,WAAY,WA5rBrB,IAAC4wB,KA6rB+BkpI,EAAWp1M,KA1rB9DisI,EADAD,IAAe9/D,OACD56E,EAEA46E,IAyrBc/iE,eACIisM,EAAW2H,YAAc,GAC7Bt4M,SAAU,6BAItB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBimH,GADqB,OAGrB,eAAC,GAAD,CACI//F,YAAa,IACbU,YACK,OAACylG,QAAD,IAACA,OAAD,EAACA,EAAqBtoM,QAE3BzO,SAAS,uBALb,UAOI,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBi4M,iBAFxB,SAKI,cAAC,GAAD,CACIt4M,QAAS,SAAAihB,GACLA,EAAEC,kBACFi2L,GACI1G,IAGR3wM,SAAS,yBAPb,+BAaJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBipH,8BAFxB,SAKI,cAAC,GAAD,CACItpH,QAAS,SAAAihB,GAtrBtB,IAC/Bh2B,EACAiO,EAqrBgD+nB,EAAEC,kBAtrBlDj2B,EAwrBoDwlN,EAAWp8M,KAAKgH,GAvrBpEnC,EAwrBoDu3M,EAAWv3M,aAtrB3Dsa,EAAQH,KACJluB,IAAOiE,gBACFmC,QACG,UACAN,EAAOO,YAEVD,QACG,gBACA2N,EAAa1N,YAErB,CAAEm8H,WAAW,KA+qBuB7nH,SAAS,iCARb,uCAcJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgB4rH,uBAFxB,SAKI,cAAC,GAAD,CACIjsH,QAAS,SAAAihB,GArrB/B,IAACh2B,EAsrByBg2B,EAAEC,kBAtrB3Bj2B,EAwrB6BwlN,EAAWp8M,KAAKgH,GAvrBhE0Z,GAAYzH,SAASjN,KAAgB4rH,wBACrCz4G,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QAAQ,UAAWN,EAAQO,YACnD,CAAEm8H,WAAW,KAurBuB7nH,SAAS,sBAPb,4BAaH80I,EAAcnpG,WACXglK,IAEA,cAAC,GAAD,CACIzwM,QAAS,SAAAihB,GAprB/B,IAAC2uL,EAqrByB3uL,EAAEC,oBArrB3B0uL,EAsrB2C,CACda,EAAWp1M,MAtrBtCu0M,IAAkBA,EAAcrhM,QAEzDyoM,GAAuBA,EAAoBpH,IAurBC9vM,SAAS,iBAPb,qBAYH80I,EAAcrpG,WACXklK,IAEA,cAAC,GAAD,CACIvzI,aAAa,EACbl9D,QAAS,SAAAihB,GA1sB/B,IAAC2uL,EA2sByB3uL,EAAEC,oBA3sB3B0uL,EA4sB2C,CACda,EAAWp1M,MA5sBtCu0M,IAAkBA,EAAcrhM,QAEzDooM,GAAuBA,EAAoB/G,IA6sBC9vM,SAAS,iBARb,oCAiFjCy4M,GAxDuB,WAClC,IAAM/kM,EAAUW,cACV3Q,EAAU0R,YAAY3R,MACtBkuM,EAAcxC,KACdtvM,EAAUsvM,KAAsBtvM,QAChC+2M,EAAqBrH,KAErBoH,EAAoBxE,KACpBuF,EAAqB5C,IAA6B,GAClD6C,EAAqBzC,IAA6B,GAClD8B,EAA+BnD,KAC/BoD,EAA2BjD,KAC3B7sE,EAAyBl/G,eACzB4qE,EAAgBhkE,eAChB6pL,EAAoBlhG,KAEpBs9B,EAAgB08D,KAEhBlkN,EAASm5B,eAETswL,EAAsBh9L,mBACxB,kBnBh6BD,SACHnc,GACe,IAAD,EACd,OAAO0kC,aAAgB,OAAe1kC,QAAf,IAAeA,OAAf,EAAeA,EAAO6I,QAAtB,OAA+B7I,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAO3P,YAAtC,aAA+B,EAAa+f,OmB65BzD2qM,CAA0BhH,KAChC,CAACA,IAEClvE,EAAcrtH,YAAYotH,IAEhC,OACI,cAAC,KAAkBz4D,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,eAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,eAAjD,SACI,cAAC,GAAD,CACIzJ,QAASA,EACTiuM,YAAaA,EAAY1jN,KACzByqB,WAAYi5L,EAAYiH,qBACxBjzM,YAAagsM,EAAYkH,sBACzB/B,sBAAuBnF,EAAYlrM,QACnCswM,oBAAqBA,EACrBjiE,cAAeA,EACfj1I,QAASA,GAAWvS,EAAOwrN,YAC3BnC,kBAAmBA,EACnBC,mBAAoBA,EAAmB3oN,KACvCylB,QAASA,EACThP,eAAgBpX,EAAO6iB,SACvB0mM,oBAAqBa,EACrBR,oBAAqBS,EACrBX,6BAA8BA,EAC9BC,yBAA0BA,EAC1B9vE,uBAAwBA,EACxBt0C,cAAeA,EACfkmH,aAAcL,EAAkBzqN,KAChCw0I,YAAaA,SC//BpBu2E,GAA0B,UAE1BC,GAA+D,CACxEC,cAAe,CAAC,kBCGPC,GAAuB14M,wBAAyC,CACzE0M,YAAa,oBACbC,MAAO4rM,KCREI,GAA0B,WACnC,IAAMhjJ,EAAU11D,qBAAWy4M,IAE3B,IAAK/iJ,EACD,MAAM,IAAI96D,MACN,wHAGR,OAAO86D,GCJEnpD,GAA0B,WAAO,IAAD,EACnC9P,EAAWO,cADwB,EAET07M,KAAxBjsM,EAFiC,EAEjCA,YAAaC,EAFoB,EAEpBA,MAErB,QAAoBvgB,IAAhBsgB,EACA,MAAM,IAAI7R,MACN,6FAIR,IAAM+R,EAAeD,GAAS4rM,GAC9B,GACI3rM,IAAgB2rM,MAChB,UAACC,GAAmB9rM,UAApB,aAAC,EAAiCK,SAASH,IAE3C,MAAM,IAAI/R,MAAJ,qBACY+R,EADZ,mFACkGF,EADlG,cAKV,OAAOrhB,uBACH,SAA2ByK,GACvBA,EAAOkX,OAASJ,EAChBlQ,EAASuQ,aAAkB,2BAA4BnX,MAE3D,CAAC4G,EAAUkQ,KC6CNgsM,GAAmB,WAC5B,IAAMl8M,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,ECC0D,CAC9DrG,KAAM,oBDDH,CAACqG,KAoCKm8M,GAA0B,WACnC,IAAMn8M,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,EClEwE,CAC5ErG,KAAM,2BDkEH,CAACqG,KEtHKo8M,GAAoB,WAAuB,IAAD,MACpBH,KAAvBjsM,EAD2C,EAC3CA,YAAaC,EAD8B,EAC9BA,MACfkjB,EAAWlb,aAAY,SAAAxX,GAAK,OAAIA,KAEtC,QAAoB/Q,IAAhBsgB,EACA,MAAM,IAAI7R,MACN,yFAIR,IAAMi1B,EAAuC,UAOzCD,EAAQ,qBAPiC,iBAOzC,EAA2BkpL,kBAPc,aAOzC,EAAwCpsM,GAASE,MAIrD,IAAKijB,EACD,MAAM,IAAIj1B,MAAJ,4BACmB6R,EADnB,oCAKV,OAAOojB,GCzBLqrH,GAAkB9/I,IAAOC,IAAV,sEAKf4iD,GAAc7iD,IAAO0nB,KAAV,4BAEXo7B,GAAc9iD,IAAO0nB,KAAV,4BAEXq4H,GAAmB//I,IAAOC,IAAV,iGAOhB+/I,GAAYhgJ,IAAOC,IAAV,+WACF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAC3B,SAAA8a,GAAK,OAAIA,EAAM0D,SAAN,uBAML,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAKpB+5M,GAMR,SAAC,GAAmE,IAAjEnlL,EAAgE,EAAhEA,MAAO0nH,EAAyD,EAAzDA,cAAmCE,GAAsB,EAA1CD,mBAA0C,EAAtBC,gBACxCj8F,EAAYn0D,uBACd,SAACq0D,GACG,QAAS67F,KAAmB77F,GAAS67F,EAAcxuI,SAAS2yC,KAEhE,CAAC67F,IAKC57F,EAAqBt0D,uBACvB,SAACyL,GACG,QACMykJ,KACAzkJ,GACFykJ,EAAcxuI,UAAUqE,OAAOta,MAGvC,CAACykJ,IAGC37F,EAAgB,SAAC9oD,GACfA,GAAU2kJ,GACVA,EAAehgG,aAA0B8/F,EAAezkJ,KAKhE,IAAK+8B,GAAUA,GAA0B,IAAjBA,EAAM7lB,OAAe,OAAO,KAEpD,IAAMirM,EAAmBplL,EAAMrlB,QAC3B,SAAA6yC,GAAI,OAAKA,EAAKvmD,IAAMygJ,EAAcj/I,KAAI,SAAAxB,GAAE,OAAIgT,KAAKqX,IAAIrqB,MAAKiS,SAASs0C,EAAKvmD,OAGtEo+M,EAAsBrlL,EAAMrlB,QAC9B,SAAA6yC,GAAI,OAAKA,EAAKvmD,KAAOygJ,EAAcj/I,KAAI,SAAAxB,GAAE,OAAIgT,KAAKqX,IAAIrqB,MAAKiS,SAASs0C,EAAKvmD,OAGvE8gJ,EAAwBq9D,EAG9B,OACI,eAAC,GAAD,WACKA,EAAiBjrM,OAAS,GACvB,eAAC,GAAD,WACK4tI,EAAsBt/I,KAAI,SAAA+kD,GACvB,OACI,eAAC,GAAD,WACI,cAACliC,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU6B,EAAKvmD,KACf6kD,EAAmB0B,EAAKvmD,IAE5BmL,QAAS05C,EAAmB0B,EAAKvmD,IACjCqmB,aAAc,kBACVy+B,EAAcyB,EAAKvmD,OAG3B,cAAC,GAAD,CACI2E,QAAS,kBAAMmgD,EAAcyB,EAAKvmD,KADtC,SAGKumD,EAAK7hD,UAfS6hD,EAAKvmD,OAoBnCm+M,EAAiBjrM,OAAS6lB,EAAM7lB,QAAU,cAAC,KAAD,CAAclU,MAAM,WAGvE,cAAC,GAAD,UACKo/M,EAAoB58M,KAAI,SAAA+kD,GACrB,OACI,eAAC,GAAD,WACI,cAACliC,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU6B,EAAKvmD,KACf6kD,EAAmB0B,EAAKvmD,IAE5BmL,QAAS05C,EAAmB0B,EAAKvmD,IACjCqmB,aAAc,kBAAMy+B,EAAcyB,EAAKvmD,OAE3C,cAAC,GAAD,CAAW2E,QAAS,kBAAMmgD,EAAcyB,EAAKvmD,KAA7C,SACKumD,EAAK7hD,UAXS6hD,EAAKvmD,aCnH9Cq+M,GAAuB99M,IAAOC,IAAV,kLASpB89M,GAA8B/9M,IAAOC,IAAV,kIAO3BG,GAAcJ,IAAOC,IAAV,6GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInC+hC,GAAezmB,IAAOC,IAAV,wPACC,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cA6B1Bs5N,GA1BsD,SAAC,GAG/D,IAFHj6M,EAEE,EAFFA,QACAq/B,EACE,EADFA,QAEA,OAAIr/B,EAEI,cAAC+5M,GAAD,UACI,cAAC,KAAD,MAMR,cAACA,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,CAAa58M,YAAWiiC,EAAU,oBAAsB,0BAAxD,SACKA,EAAU,cAAC+hB,GAAA,EAAD,IAAe,cAACj+B,GAAA,EAAD,MAE9B,cAAC,GAAD,CAAc/lB,YAAWiiC,EAAU,oBAAsB,0BAAzD,SACKA,EAAU,mBAAqB,6BC3B9Cq9G,GAAoBzgJ,IAAOC,IAAV,uIAQjBygJ,GAAkB1gJ,IAAOC,IAAV,oHAOfonB,GAAgBrnB,IAAOC,IAAV,wMAUbqnB,GAAmBtnB,IAAOC,IAAV,+HAOhBsnB,GAAgBvnB,IAAOC,IAAV,2LAWbwnB,GAAcznB,IAAO0nB,KAAV,+OASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,mHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,0EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,GAAkB9nB,IAAO0nB,KAAV,+CACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCsjC,GAAc/nB,IAAOgoB,EAAV,4GAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInC6iC,GAAgBjoB,IAAOC,IAAV,wDAIbunB,GAA4BxnB,IAAOC,IAAV,wDAKzBg+M,GAAgD,SAAC,GAehD,IAdHzlL,EAcE,EAdFA,MACA5kB,EAaE,EAbFA,aACAhQ,EAYE,EAZFA,SACAG,EAWE,EAXFA,QACAqkB,EAUE,EAVFA,OACAC,EASE,EATFA,gBACAC,EAQE,EARFA,cACAC,EAOE,EAPFA,YACAG,EAME,EANFA,cACAC,EAKE,EALFA,aACAC,EAIE,EAJFA,kBACAC,EAGE,EAHFA,WACAs3H,EAEE,EAFFA,mBAEE,IADFr3H,gBACE,SACIE,EAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCyiC,EAAeh6B,uBAAY,WACd,OAAfq4B,QAAe,IAAfA,SACD,CAACA,IAvBF,EAyBwDlF,mBAExD,IA3BA,mBAyBKmG,EAzBL,KAyB4BC,EAzB5B,OA6BkCpG,wBAA6BpyB,GA7B/D,mBA6BK8B,EA7BL,KA6BiBs2B,EA7BjB,OA+ByBhG,oBAAkB,GAApCy9H,EA/BP,oBAiCIE,EAAiB7iI,mBAAQ,WAC3B,IAAI/e,GAAc,OAALs5B,QAAK,IAALA,OAAA,EAAAA,EAAOtmB,QAAS,GAS7B,GARMrf,IACFqM,EAASA,EAAOiU,QACZ,SAAAC,GAAI,OAG4C,IAF5CA,EAAKjP,MACAmC,cACAkR,QAAQ3kB,EAAWyT,mBAGhCpH,EAAOyT,OAAS,EAAG,CAEnB,IAAMiX,GADN1qB,EAAS6hJ,iBAAO7hJ,GAAQ,SAAAi9C,GAAC,uBAAIA,EAAEh4C,aAAN,aAAI,EAASmC,kBACNrF,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAEjD8pB,EACI3V,EAAaT,QAAO,SAAAC,GAAI,OACpBwW,EAAiBlY,SAASe,KAAKqX,IAAI1W,QAI/C,OAAOlU,IACR,QAACs5B,QAAD,IAACA,OAAD,EAACA,EAAOtmB,MAAOrf,EAAY+gB,IAExBmW,EAAgB9L,mBAClB,wBAAMrK,GAAgBA,EAAajB,UAAb,OAAwB6lB,QAAxB,IAAwBA,GAAxB,UAAwBA,EAAOtmB,aAA/B,aAAwB,EAAcS,UAC5D,CAACiB,EAAc4kB,IAKbmtB,EAAmB31D,uBAAY,WAC7B+5B,GAAiBzB,GACjBA,IACAs4H,GAAe,IACRr4H,IACPq4H,GAAe,GACfr4H,EAAYu4H,EAAe7/I,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,UAEjD,CAAC6oB,EAAeC,EAAawB,EAAe+2H,IAGzC32H,IAAc,OAACqO,QAAD,IAACA,OAAD,EAACA,EAAO6gB,OACtBhvB,GAAkBy2H,EAAenuI,QAAU5O,EAC3Ci9I,EAAsB13H,EAAsBnW,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAC/DkT,OAEL,OACI,cAAC,GAAD,UACI,eAAC,GAAD,WACKgW,GACG,cAAC,GAAD,UACI,cAAC,GAAD,UAAcA,MAGrBE,GACG,cAAC,GAAD,UACI,cAAC,KAAD,CACI0B,SA5DF,SAAC1kB,GAAD,OAAmBsjB,EAActjB,IA6D/BjC,SAAUumB,EACVjmB,SAAS,uBAIpB0kB,IAAsBuB,GACnB,eAAC,GAAD,WACI,8BACI,cAAC,GAAD,CAAiBhpB,YAAU,0BAA3B,SACK6/I,EAAsB,EAAtB,UACQA,EADR,YAC+BA,EAAsB,EAC5C,sBACA,sBAEJ,4BAGd,cAAC,GAAD,UACKj3H,EACG,cAAC,GAAD,CACInmB,SAC4B,IAAxBgQ,EAAajB,QACb0X,EAEJrnB,MAAOgmB,EAAaC,MAAMjmB,MAC1B6kB,YAAamB,EAAaC,MAAMpB,YAChCD,WAAYoB,EAAaC,MAAMrB,WAC/BxjB,QAAS4lB,EACT7oB,YAAU,yBATd,0BAcA,cAAC,GAAD,CACIyC,SAAUymB,EACVrnB,MAAOgmB,EAAaE,OAAOlmB,MAC3B6kB,YACImB,EAAaE,OAAOrB,YAExBD,WAAYoB,EAAaE,OAAOtB,WAChCxjB,QAASuhD,EACTxkD,YAAU,uBARd,6BAgBfkpB,EACG,cAAC,GAAD,CACItmB,QAASA,EACTq/B,UAAS,OAAC5K,QAAD,IAACA,OAAD,EAACA,EAAO6gB,SAGrB,qCACI,cAAC,GAAD,CACI8mG,mBAAoBA,EACpB3nH,MAAOsoH,EACPZ,cAAetsI,EACfhQ,SAAUA,EACVw8I,eAAgB13H,IAEnBN,GAAUU,GACP,cAAC,GAAD,UACI,cAAC,IAAD,CACI9tB,KAAM,SACNyI,MAAO,OACPhJ,OAAQ,kBAAM2tB,KACd1pB,OAAQ,OACRD,MAAO,QACPyF,SAAS,8BCpShCsD,GAAe,CACxBrV,KAAM,CACF+f,MAAO,GACPxf,MAAO,EACPC,OAAQ,EACRigB,cAAe,EACfymC,MAAO,EACPzqB,iBAAa79B,GAEjBgT,SAAS,GCUPgzB,GAA2B,CAC7BlkC,WAAY,GACZgjB,SAAU,GACVnN,QAAS,CAAC,CAAE1V,MAAO,SAAU6S,MAAO,CAACopC,KAAe77C,UACpDL,QAAS,CACLC,MAAO,QACPC,KAAK,GAETP,MAAO,IACPC,OAAQ,GAGCurN,GAAwC,SAAC,GAO/C,IANHx1L,EAME,EANFA,cACAw3H,EAKE,EALFA,cAKE,IAJFkB,oBAIE,aAHF32H,8BAGE,SAFF01H,EAEE,EAFFA,mBACGz1H,EACD,+GACI51B,EPzB+B,SACrCiiC,GAEA,IAAM11B,EAAWO,cACXkQ,EAAcnQ,cACds2L,EAAkBhiM,eAExB,OAAOjG,uBACH,SAACmB,GACG,IAAMwlD,EAAwBvH,aAC1BrY,GAAuB5lC,GAK3B,OAFAkQ,ECZoE,CAC5ErG,KAAM,yBDaSi9L,EAAgBthJ,GAClBrrB,MAAK,SAAAn5B,GAEF,OADAkP,ECRd,CACFrG,KAAM,yBACNkE,ODM6C/M,IACtBA,KAEVq5B,OAAM,SAACnG,GACJhkB,ECLkD,CAClErG,KAAM,yBACN4F,QDG6CykB,EAAEzkB,UAC/BkR,EAAYuT,EAAEzkB,QAAS,cAGnC,CAACS,EAAU42L,EAAiBlhK,EAAqBjlB,IOAtC2kC,GACPpiC,EAAaopM,KAAbppM,SAFN,EDzBeiF,aAAY,SAAAxX,GAAK,OAAIA,KACtBq8M,kBC2BRhsN,EAHN,EAGMA,KAAM4R,EAHZ,EAGYA,QACRimB,EPiBmB,WACzB,IAAM3oB,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,ECK4D,CAChErG,KAAM,qBDLH,CAACqG,IOtBiBggJ,GACfr2H,EAAcuyL,KACdr0L,EPyC4B,WAClC,IAAM7nB,EAAW8P,KACjB,OAAOnhB,uBACH,SAACqjB,GAEGhS,EC7BiC,SACzCgS,GADyC,MAEwB,CACjErY,KAAM,0BACNqY,ODyBiB+qM,CAA8B/qM,MAE3C,CAAChS,IOhDUq+I,GACT7qJ,EPmDuB,WAC7B,IAAMwM,EAAW8P,KAEjB,OAAOnhB,uBACH,SAAC8wJ,GAEGz/I,EC7D6D,CACrErG,KAAM,qBACNu1L,aD2DiCzvC,MAE7B,CAACz/I,IO3DaigJ,GACZr2H,EAAcuyL,KACdtyL,EPqE2B,WACjC,IAAM7pB,EAAW8P,KAEjB,OAAOnhB,uBAAY,WACfqR,ECtE4E,CAChFrG,KAAM,6BDsEH,CAACqG,IO1EkBkgJ,GAsBtB,OApBAj+H,qBAAU,WAKN,OAJI89H,IAAiBjvJ,EAAK+f,MAAMS,QAC5B7d,EAAOiiC,IAGJ,WACCtM,GACAS,OAIT,IAEH5H,qBAAU,WACF48H,GACArrJ,EAAUqrJ,KAGf,IAGC,cAAC,GAAD,cACI1nH,MAAOrmC,EACPyhB,aAAcS,EACdtQ,QAASA,EACTskB,gBAAiB,WACbK,GAAiBA,EAAc,IAC/BsB,KAEJ5B,OAAQ4C,EACRtC,cAAe,SAACs9B,GACZt9B,GAAiBA,EAAcs9B,GAC/B98B,EAAO88B,IAEXm6F,mBAAoBA,EACpB53H,YAAa,SAACiQ,GACV9P,GAAiBA,EAAc8P,GAC/B3jC,EAAU2jC,IAEdlQ,cAAe2C,GACXP,KCrEVnE,GAAYvmB,IAAOC,IAAV,iHAMTkvB,GAAUnvB,IAAOC,IAAV,+IASP2gD,GAAkB5gD,IAAOC,IAAV,2HAQf2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQd8kI,GAAkB/kI,IAAOC,IAAV,gKAQf+kI,GAAahlI,IAAOC,IAAV,uDAIV+gD,GAAUhhD,IAAOC,IAAV,0JASPglI,GAAiBjlI,IAAO0nB,KAAV,yHAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8oD,GAAgBvtC,IAAOC,IAAV,uDAKNo+M,GAGR,SAAC,GAGC,IAFH31M,EAEE,EAFFA,QACA68H,EACE,EADFA,eAEM/zI,EAASm5B,eACT6N,EAAQ+iF,KACR9/F,EAAYgiM,KAEZ93E,EAAapyH,eACbqyH,EAAepyH,eACfsuI,EAAYrC,KACZ6+D,EAAgBf,KARpB,EAUsCp6L,qBAVtC,mBAUKqyL,EAVL,KAUmBiE,EAVnB,KAWI1zE,EAA6B5qB,GAAazyG,EAAQulB,UAExD3K,qBAAU,WACFyiH,IACAH,EAAal9H,EAAQulB,UACrB03G,OAEL,CACCI,EACAr9H,EAAQulB,SACR03G,EACAC,IAGJ,IAAMnyC,EAAiBzjG,uBAAY,WAC/B21I,IACAmc,IACAw8D,IACA/4E,EAAe,CACXiwE,aAAY,OAAEA,QAAF,IAAEA,IAAgB9sM,EAAQ8sM,aACtCvnL,SAAUz8B,EAAO6iB,SACjBxY,QAAS28B,EAAMnkB,SACfle,YAAaslB,EAAUpH,aAE5B,CACCsxH,EACAmc,EACAw8D,EACA9I,EACAhkN,EAAO6iB,SACPmkB,EAAMnkB,SACNoH,EAAUpH,SACVkxH,EACA78H,IAGEw9H,EACF10I,GACAgnC,EAAMnkB,SAAS1B,OAAS8I,EAAUpH,SAAS1B,OACvCnhB,EAAO6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,SACpC,OAAC6iM,QAAD,IAACA,IAAgB9sM,EAAQ8sM,cAAgB,EAAI,GAEhDzP,EAAgBnmD,KAChBzZ,EAAiBryH,eACjByqM,EAAoBf,KAS1B,OACI,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAACjpL,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CAAY/C,YAAU,wBAAtB,SACI,cAAC2iB,GAAA,EAAD,CACInZ,QAAO,OAAE6qM,QAAF,IAAEA,IAAgB9sM,EAAQ8sM,aACjC1vL,aAAc,SAAAT,GACVo0L,EAAgBp0L,EAAEgwB,OAAO1qC,UAE7BlH,MAAM,WACNsiB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAS,4BAKzB,cAACqwB,GAAA,EAAD,CAAUpwB,MAAO,YAAaD,SAAS,0BAAvC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI2kB,YAAU,EACVD,mBAAiB,EACjBE,UAAU,QAItB,cAACyL,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI4kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,GAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,GAAD,WACI,eAAC,GAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAS,UACTpC,MAAO,QACPhE,OAAQ,kBAhExBg/M,GAAgB,GAChB1T,IACA5/D,SACAo4E,KA8DgBr6M,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQg5F,EACRvvF,SAAS,sBAHb,iCCpOHs6M,GAAWpgN,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASE,sBAAMU,SAAS,UAAUqjD,SAAS,UAAUpjD,EAAE,gwCAAgwCF,KAAK,sBAMlzCm/M,MC+CTzsH,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GAEjBp9C,GAAS1tF,YAAOurC,KAAPvrC,CAAH,2FAMN2tF,GAAa3tF,IAAOC,IAAV,wLAWVwtF,GAA0BztF,IAAOC,IAAV,uIAQvBw+M,GA0BD,SAAC,GAiBC,IAAD,QAhBF72M,EAgBE,EAhBFA,QACA+wM,EAeE,EAfFA,eACAkC,EAcE,EAdFA,kBACA92M,EAaE,EAbFA,QACA+2M,EAYE,EAZFA,mBACAljM,EAWE,EAXFA,QACAhP,EAUE,EAVFA,eACAmyM,EASE,EATFA,oBACAC,EAQE,EARFA,sBACA0D,EAOE,EAPFA,uBACA1lE,EAME,EANFA,cACAkiE,EAKE,EALFA,6BACAC,EAIE,EAJFA,yBACAC,EAGE,EAHFA,oBACA/vE,EAEE,EAFFA,uBACA1E,EACE,EADFA,YAEM34D,EAAUb,KACVp2C,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,GACTL,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGb+rM,GACDv7K,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,UACJ,OAAXo3I,QAAW,IAAXA,OAAA,EAAAA,EAAaz1G,OAAQ8M,KAAa4M,SAASn3C,KAF3C,OAGMkzI,QAHN,IAGMA,OAHN,EAGMA,EAAap3I,OACbwnC,EAjBR,EAyBED,aAAqB6nL,GALrBxtN,EApBF,EAoBEA,aACAg4B,EArBF,EAqBEA,cACA4O,EAtBF,EAsBEA,WACAW,EAvBF,EAuBEA,UACAK,EAxBF,EAwBEA,oBAxBF,EA2BwC5V,mBAAS,IAAIhD,MA3BrD,mBA2BK+mD,EA3BL,KA2BoBqkE,EA3BpB,OA4BkCpoH,qBA5BlC,mBA4BKsoH,EA5BL,KA4BiBC,EA5BjB,OA6BoCvoH,oBAAkB,GA7BtD,mBA6BK8mD,EA7BL,KA6BkBuhE,EA7BlB,KA8BI6vE,EAAc,UAAGlqN,EAAa0lN,qBAAhB,QAAkE,CAClFrB,cAAc,EACd35M,QAAS,GACT1F,YAAa,GACb83B,SAAQ,OAAErlB,QAAF,IAAEA,IAAkB,IAlC9B,EAoC4Bua,mBAAwCk4L,GApCpE,mBAoCK3yM,EApCL,KAoCc4yM,EApCd,KAsCIhwE,EAAgB5I,KAChBk8E,GVzH+B,WACrC,IAAMv9M,EAAWO,cAMjB,OAAO5R,uBAAY,WACfqR,ECpBqF,CACzFrG,KAAM,6BDoBH,CAACqG,IUgH2Bw9M,GAEzB/mM,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAEAiB,GACF4sE,GACAA,EAAezmM,OACf8oM,GACAA,EAAsBroM,OAASgmM,EAAezmM,MAAMS,OAElDw0D,GAAcn3E,uBAAY,WAC5BmB,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,GACtB+uE,EAAkB1pN,EAAcuX,GAChC6iI,EAAiB,IAAIprH,MACrB+6L,EAA6B,IAAI,EAAMnvE,IACvCP,GAAe,KAChB,CACCr6I,EACA26I,GACA+uE,EACAK,EACAnvE,GACArjI,IAGE6yM,GAA8B,SAACnhN,GAC5BA,GAELwd,EAAQH,KACJluB,IAAOsC,oBAAoBC,eAAeE,OAAO2D,QAC7C,gBACAyK,EAAaxK,YAEjB,CACIm8H,WAAW,KAuBjB5yG,GAAck5B,eA0BdqpK,GAA4B1rN,uBAC9B,SAAC2a,GACG,IAAMqpM,EACD2E,GACGA,EAAezmM,MAAMjR,KAAI,SAAC69M,GAAD,OACrB/oM,OAAO+oM,EAAcr/M,QAE7B,GACJy7M,EACIlH,EACArpM,EACAohI,MAGR,CACI4sE,EACA5sE,GACAmvE,IAUFS,GACFzB,GACI,WACA/oN,EACAuX,EAHsC,iBAItCiwM,QAJsC,IAItCA,OAJsC,EAItCA,EAAgBt/J,aAJsB,QAIb,EACzB8tB,IAGFy0I,GAAqB5rN,uBAAY,WACnC,GAAIi6E,EACA0xI,GAAwC,eACrC,CACH,IACKX,GACEA,IAA0BA,EAAsBroM,SAClDooM,EAED,OAGJA,EAAoBC,GAAuB1vL,MAAK,SAACpsB,GACvCA,GACFg8M,EACIF,GACA,GACA,SAMjB,CACCA,EACAD,EACAG,IAGEW,GAAqB7rN,uBAAY,WACnC,GAAIi6E,EACA0xI,GAAwC,eACrC,CACH,IACKX,GACEA,IAA0BA,EAAsBroM,SAClDyoM,EAED,OAGJA,EAAoBJ,GAAuB1vL,MAAK,SAACpsB,GACvCA,GACFg8M,EACIF,GACA,GACA,SAMjB,CACCA,EACAI,EACAF,IAGEY,GAAqB9rN,uBACvB,SAACwnC,GACG6zG,EAAuB7zG,EAAWvJ,UAClCqtL,EAAW9jL,KAEf,CAAC6zG,IAGCt4I,GAAU5B,EAAa4B,QACvBgpN,GAAcjyE,GAAW,YAAa/2I,GAASglC,GAC/CikL,GAAmBlyE,GAAW,YAAa/2I,GAASglC,GACpDgnL,GAAkBj1E,GAAW,iBAAkB/2I,GAASglC,GACxDokL,GAAUryE,GAAW,WAAY/2I,GAASglC,GAC1CqkL,GAAgBtyE,GAAW,kBAAmB/2I,GAASglC,GAWvDskL,GACF3zM,EAAQulB,SAAStb,OACjBjK,EAAQ7M,QAAQ8W,OAChBjK,EAAQvS,YAAYwc,QACnBjK,EAAQ8sM,aAAe,EAAI,GAG1B/kH,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBqyE,GAChB9lH,YAA0B,OAAdoiH,QAAc,IAAdA,OAAA,EAAAA,EAAgBzmM,MAAMS,SAAU,EAC5Cw3H,yBAAyB,IAGvB6Q,GAAc/8H,mBAChB,kBAAM+6H,EAAcz5H,eAAem/L,KACnC,CAACA,EAAwB1lE,IAG7Bq+C,IAAiB,WACblmM,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,GACtB+uE,EAAkB1pN,EAAcuX,KACjC,CAACmyM,EAAmB1pN,EAAcuX,IAErC4a,qBAAU,WACFw3L,GAAoB/hL,MACzB,CAAC+hL,EAAoB/hL,IAExBzV,qBAAU,WAEF1a,IACCA,EAAe+J,SAAWjK,EAAQulB,SAAStb,QACxC2pM,qBAAW1zM,EAAgBF,EAAQulB,UAAUtb,OAAS,IAE1D2oM,EAAW,6BACJ5yM,GADG,IAENulB,SAAUrlB,OAInB,CAACA,EAAgB0yM,IAEpBh4L,qBAAU,WACFuoH,GAAY,EACZnzG,EAAUozG,IACW,IAAdD,IACPnzG,EAAU,KAGf,CAACmzG,KAEJvoH,qBAAU,WACN,OAAO,WACH43L,EAA6B,IAAI,EAAMnvE,IACvC6yE,QAGL,IAEHt7L,qBAAU,WACN43L,EAA6B,IAAI,EAAMnvE,MAExC,CAAC4sE,IAEJr1L,qBAAU,YAEoB,OAAtBo7L,QAAsB,IAAtBA,OAAA,EAAAA,EAAwB/rM,SACxB+rM,EAAuB/rM,UAAvB,OAAkCgmM,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAgBt/J,QAElDmyF,GAAe,KAEpB,QAACmtE,QAAD,IAACA,OAAD,EAACA,EAAgBt/J,MAAOqlK,IAE3Bp7L,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB6oH,oBAChC,CAACge,IAQJ,IAgCMyB,KACAiuE,KAA2BA,EAAsBroM,OAEjDq6H,IACD2rE,GAAmBA,GAAkBA,EAAezmM,MAAMS,OAAS,EAyCxE,OACI,eAAC,GAAD,CACI22G,SAAS,OACTsC,KAAM,cAAC,GAAD,CAAgC1nH,SAAS,iBAC/Ck2L,eAAc,OAACskB,QAAD,IAACA,OAAD,EAACA,EAAwB/rM,QACvC27G,cAAc,iBACdpqH,SAAS,WALb,UAOKH,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEwmN,QAAF,IAAEA,OAAF,EAAEA,EAAgBzmM,MACtB+qF,SAAUr0F,KAAoBA,EAAe+J,OAC7CuqF,0BAAyB,OAACwhH,QAAD,IAACA,OAAD,EAACA,EAAwB/rM,QAClD/J,eAAgBA,EAChBu0F,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,sBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEwmM,QAAF,IAAEA,OAAF,EAAEA,EAAgBt/J,aAAlB,QAA2B,EACrCygB,aAAcgxE,GACd74C,aArGK,SAACt/F,GACtB+lC,EAAU/lC,IAqGMu/F,uBACI/gG,EAAa0B,WAAW8f,QACxB89E,GAAYO,yBAChB9sF,SAAU,mBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,yBAEd23F,8BACKwxC,kBAAcqxE,KACdrxE,kBAAcsrE,GACnB78G,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAE20I,QAAF,IAAEA,OAAF,EAAEA,EAAwB/rM,OACxCR,WAAU,OAAEwmM,QAAF,IAAEA,OAAF,EAAEA,EAAgBt/J,MAC5BygB,aAAcgxE,GACdluC,iBAjHK,WACrBs+G,EAA6B,IAAI,EAAMnvE,IACvCP,GAAe,IAgHCjjH,YAzGA,WAChBmzL,IAA0B,GAC1BlwE,GAAe,IAwGC3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNonG,mBAAoB6iD,GAAYp7H,oBAC5Bq1L,GAAqB1kK,SAEnB,CAAC9rC,KAAgBkxM,oBACjB,GACNn8G,kBAAmBwhD,GAAYrwG,qBAC3BsqK,GAAqB1kK,SAEzBknD,2BAA4BmkH,GAC5B5iH,mBAAoBgiD,GAAYp7H,oBAC5Bq1L,GAAqBzkK,SAEnB,CAAC/rC,KAAgBmxM,oBACjB,GACNn8G,kBAAmBuhD,GAAYrwG,qBAC3BsqK,GAAqBzkK,SAEzBonD,2BAA4BikH,GAC5B5xI,YAAaA,EACb93D,WAAU,OAAEwmM,QAAF,IAAEA,OAAF,EAAEA,EAAgBt/J,QAGpC2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIloB,QAASA,EACT68H,eAAgB,SAAA/tG,GACZskL,GAAmBtkL,GACnB5G,QAIZlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAdtB,SAgBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAc23E,GACdz4M,UAEI,EAEJM,SAAS,0BAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAA6C,KAApB,OAAd40M,QAAc,IAAdA,GAAA,UAAAA,EAAgBzmM,aAAhB,eAAuBS,QACvC+9E,iBAAkB,CACd7sF,KAAM26M,GACNjkN,KAAM,wBACN2J,SAAU,uBAEdysF,uBAAwB,CACpBh4C,WAAY,sDACZz0C,SAAU,+BAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QAASmhI,KAAgC9hE,EACzCe,YAhLU,SAAC/wB,GAC3BuxF,GAAe,GACfkwE,GAA0BzhK,EAAM5E,OAAO1qC,UA+KvBzG,SAAU,4BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJs9M,IAJF,IAKDn4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,0BANT,2BASDC,MAAO,gBACP1F,MAAO,IACJ09M,IAXF,IAYDv4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,yBAbT,2BAgBDC,MAAO,YACP1F,MAAO,IACJ29M,IAlBF,IAmBDx4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,8BApBT,2BAuBDC,MAAO,WACP1F,MAAO,IACJsgN,IAzBF,IA0BDn7M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,6BA3BT,2BA+BDC,MAAO,cACP1F,MAAO,IACJu9M,IAjCF,IAkCDp4M,SAAU6sF,GAAY85C,eACtBrmI,SAAU,gCAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAhND,SAACkvH,GAChBvD,GAA4BuD,EAAcr/M,KAgN1BqwF,kBA7LM,SAAC71C,EAAY6kK,GACnCtzE,GAAe,GArPW,SAACnmH,EAAQy5L,GACnCz5L,EAAEC,kBACIw5L,EAAcr/M,IAChB07M,EAAyB2D,EAAcr/M,IAmP3C88M,CAAsBtiK,EAAO6kK,IA4LbjvH,aAzMM,SAACivH,GAAD,QACpB9D,KACA8D,EAAcr/M,IAChBu7M,EAAsBtpM,SAASotM,EAAcr/M,KAuM7BswF,gBArLS,SAAC+uH,GAC1B,OAAOrzE,IAAeqzE,EAAcr/M,IAqLpBivF,kBAAmB,SAACowH,GAAD,YAAkC,CACjDl2M,eAAc,UAAEk2M,EAActC,kBAAhB,QAA8B,GAC5C5vI,kBAAmB,CACfnoE,KAAgB61L,0BAGxBp2L,SAAU,gBACVyrF,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvBz4C,wBAAyB,SACrBwvH,GADqB,OAGrB,cAAC,GAAD,UACI,eAAC,GAAD,WACI,cAAC,GAAD,CACIxgN,UAAU,SACVktC,cAAe,CACX7M,UACImgL,EAAcrmN,KACTkmC,UACTE,SACIigL,EAAcrmN,KACTomC,SACTqN,QACI4yK,EAAcrmN,KACT+zC,SACTz6C,OAAQ+sN,EAAcrmN,KACjB1G,QAETsS,KAAK,KACLH,SAAS,8BAEb,cAAC6tD,GAAA,EAAD,CACIC,UACI8sJ,EAAcrmN,MACdmP,GACAk3M,EAAcrmN,KAAKgH,KACfmI,EAAQnI,GAEhByE,SAAS,+BAPb,SASK46M,EAAcrmN,MACXqmN,EAAcrmN,KACTkmC,UACD,IACAmgL,EAAcrmN,KACTomC,kBAMjC,CACIswD,UAAW,aACXj/B,oBAAqB,SACjB4uJ,GADiB,cAEhB,UAACA,EAAcE,gBAAf,aAAC,EAAwBA,WAC9B5vH,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACT+wH,GADS,gBAGNrsM,KAAKqpI,MAEA,IADJgjE,EAAcE,SAASA,UAJlB,MAOb96M,SAAU,wBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB4uJ,GADiB,OAEfA,EAAc9iE,WACpB5sD,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACT+wH,GADS,OAERn9L,aAAWm9L,EAAc9iE,YAC9B93I,SAAU,kCAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQisI,kBACvB/pJ,oBAAqB,SACjB4uJ,GADiB,cAEhB,UAACA,EAAcjuK,gBAAf,aAAC,EAAwB1sC,QAC9BirF,WAAY,CACRH,gBAAgB,EAChB3wF,UAAW0vE,EAAQisI,kBACnBlsH,YAAa,SACT+wH,GADS,uBAERA,EAAcjuK,gBAFN,aAER,EAAwB1sC,OAC7BD,SAAU,2BAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB4uJ,GADiB,cAEhB,UAACA,EAAc/oN,kBAAf,aAAC,EAA0BtC,OAChC27F,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACT+wH,GADS,uBAERA,EAAc/oN,kBAFN,aAER,EAA0BtC,MAC/ByQ,SAAU,8BAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACfowH,GADe,YAEb,CACF3+M,KAAMsrI,IAAeqzE,EAAcr/M,GACnCs7C,WAAY,WAndrB,IAAC4wB,KAqdgBmzI,EAAcr/M,KAldlDisI,EADAD,IAAe9/D,OACD56E,EAEA46E,IAkdc/iE,eAAc,UACVk2M,EAActC,kBADJ,QACkB,GAChCt4M,SAAU,2BAItB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBkwH,GADqB,OAGrB,eAAC,GAAD,CACIhqG,YAAa,IACbU,YACK,OAACkpG,QAAD,IAACA,OAAD,EAACA,EAAwB/rM,QAE9BzO,SAAS,qBALb,UAOI,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBi4M,iBAFxB,SAKI,cAAC,GAAD,CACIt4M,QAAS,SAAAihB,GACLA,EAAEC,kBACFi2L,GACIuD,EAAcr/M,KAGtByE,SAAS,4BAPb,kCAaJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBipH,8BAFxB,SAKI,cAAC,GAAD,CACItpH,QAAS,SAAAihB,GA3pBtB,IAC/Bh2B,EACAiO,EA0pBgD+nB,EAAEC,kBA3pBlDj2B,EA6pBoDyvN,EAAcrmN,KACTgH,GA7pBzDnC,EA8pBoDwhN,EAAcxhN,aA5pBlEsa,EAAQH,KACJluB,IAAOiE,gBACFmC,QACG,UACAN,EAAOO,YAEVD,QACG,gBACA2N,EAAa1N,YAErB,CAAEm8H,WAAW,KAqpB2B7nH,SAAS,iCATb,uCAeJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgB4rH,uBAFxB,SAKI,cAAC,GAAD,CACIjsH,QAAS,SAAAihB,GA3pB/B,IAACh2B,EA4pByBg2B,EAAEC,kBA5pB3Bj2B,EA8pB6ByvN,EAAcrmN,KACTgH,GA9pBrD0Z,GAAYzH,SAASjN,KAAgB4rH,wBACrCz4G,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QAAQ,UAAWN,EAAOO,YAClD,CAAEm8H,WAAW,KA8pBuB7nH,SAAS,sBARb,4BAcH80I,EAAcrpG,WACXmvK,IAEA,cAAC,GAAD,CACIx9I,aAAa,EACbl9D,QAAS,SAAAihB,GAlqB/B,IAAC2uL,EAmqByB3uL,EAAEC,oBAnqB3B0uL,EAoqB2C,CACd8K,EAAcr/M,MApqBzCu0M,IAAkBA,EAAcrhM,QAGzDooM,GAAuBA,EAAoB/G,IAoqBC9vM,SAAS,iBARb,qBAaH80I,EAAcnpG,WACXivK,IAEA,cAAC,GAAD,CACI16M,QAAS,SAAAihB,GA1qB/B,IAAC2uL,EA2qByB3uL,EAAEC,oBA3qB3B0uL,EA4qB2C,CACd8K,EAAcr/M,MA5qBzCu0M,IAAkBA,EAAcrhM,QAEzDyoM,GAAuBA,EAAoBpH,IA6qBC9vM,SAAS,iBAPb,oCA+EjC+6M,GAvDgB,WAC3B,IAAMrnM,EAAUW,cACV3Q,EAAU0R,YAAY3R,MACtBgxM,EAAiBpF,KACjBxvM,EAAUwvM,KAAwBxvM,QAClC+2M,EAAqBrH,KAErByL,EAAuBzG,KACvBmD,EAAqB5C,IAA6B,GAElD6C,EAAqBzC,IAA6B,GAClD8B,EAA+B5C,KAC/B6C,EAA2B/C,KAE3B/sE,EAAyBl/G,eACzB4qE,EAAgBhkE,eAChB6pL,EAAoBlhG,KACpBs9B,EAAgB+8D,KAEhBvkN,EAASm5B,eACTg8G,EAAcrtH,YAAYotH,IAE1Bg4E,EAAyBzgM,mBAC3B,kBlCl5BD,SACHnc,GACe,IAAD,EACd,OAAO0kC,aAAgB,OAAe1kC,QAAf,IAAeA,OAAf,EAAeA,EAAO6I,QAAtB,OAA+B7I,QAA/B,IAA+BA,GAA/B,UAA+BA,EAAO3P,YAAtC,aAA+B,EAAa+f,OkC+4BzDitM,CAA6BxG,KACnC,CAACA,IAGL,OACI,cAAC,KAAkB1qI,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,eAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,eAAjD,SACI,cAAC,GAAD,CACIzJ,QAASA,EACT+wM,eAAgBA,EAAexmN,KAC/B6oN,sBAAuBrC,EAAehuM,QACtC+zM,uBAAwBA,EACxB1lE,cAAeA,EACfj1I,QAASA,GAAWvS,EAAOwrN,YAC3BnC,kBAAmBqE,EACnBpE,mBAAoBA,EAAmB3oN,KACvCylB,QAASA,EACThP,eAAgBpX,EAAO6iB,SACvB0mM,oBAAqBa,EACrBR,oBAAqBS,EACrBX,6BAA8BA,EAC9BC,yBAA0BA,EAC1B9vE,uBAAwBA,EACxBt0C,cAAeA,EACfkmH,aAAcL,EAAkBzqN,KAChCw0I,YAAaA,SC/9BlBy4E,GAlBK,kBAChB,eAAC,IAAD,WACI,cAAC,IAAD,CACI5pM,KAAMjsB,IAAOqC,YACb4kI,OAAK,EACL/jF,GAAIljD,IAAOsC,oBAAoBC,eAAeC,MAElD,cAAC,GAAD,CACI2D,KAAMnG,IAAO6C,iBAAiBE,YAAYP,IAC1CwjG,UAAW8vH,KAEf,cAAC,GAAD,CACI3vN,KAAMnG,IAAOsC,oBAAoBK,WAAWH,IAC5CwjG,UAAWytG,S,wECsCRsiB,GAvDSlhN,sBACpB,WAAkCC,GAAS,IAAxCC,EAAuC,EAAvCA,UAAWC,EAA4B,EAA5BA,OAAQ2F,EAAoB,EAApBA,SAClB,OACI,sBACI7F,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BACXuC,YAAW+C,EARf,YAUO3F,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,+BACF4zB,UAAU,+BCUfosL,GA1DUnhN,sBACrB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,gBACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,yIAEN,sBACIF,KAAK,eACLC,SAAS,UACTC,EAAE,6I,mBCnDhBilG,GAAeC,aAAW,CAC5BC,KAAM,CACFhmG,OAAQ,EACR0wB,QAAS,SAEbu1E,KAAM,CACFjmG,OAAQ,EACRs1H,QAAS,IACTnxH,aAAc,EACd/C,gBAAiB,oBACjBkD,MAAO,mBAEX4hG,MAAO,CACHlmG,OAAQ,EACRmE,aAAc,EACd/C,gBAAiB,uBAErB+kG,MAAO,CACHnmG,OAAQ,GACRD,MAAO,GACP0iD,WAAY,EACZvtB,YAAa,EACb9zB,gBAAiB,sBACjB,UAAW,CACP2qE,UAAU,QAEd,UAAW,CACPA,UAAU,+BAEd,WAAY,CACRA,UAAU,iCA9BDg6B,CAiClBK,MAqBY06G,GAdV,SAAC,GAA0D,IAAxDC,EAAuD,EAAvDA,OAAQl1L,EAA+C,EAA/CA,SAAUm1L,EAAqC,EAArCA,kBAAmBvwB,EAAkB,EAAlBA,YACzC,OACI,cAAC3qF,GAAD,CACI9xF,IAAK,EACLwqC,IAAK,EACLmoD,KAAM,IACNx/F,MAAO45M,EACPl1L,SAAUA,EACVm1L,kBAAmBA,EACnBvwB,YAAaA,KCSVxS,GA1Dav+K,sBACxB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,6fACF4zB,UAAU,wDCK3BwsL,GArDevhN,sBAC1B,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,sBACII,KAAK,eACLC,SAAS,UACTC,EAAE,8kBC9ChBilG,GAAeC,aAAW,CAC5BC,KAAM,CACFhmG,OAAQ,EACR0wB,QAAS,SAEbu1E,KAAM,CACFjmG,OAAQ,EACRs1H,QAAS,IACTnxH,aAAc,EACd/C,gBAAiB,oBACjBkD,MAAO,mBAEX4hG,MAAO,CACHlmG,OAAQ,EACRmE,aAAc,EACd/C,gBAAiB,qBAErB+kG,MAAO,CACH/C,QAAS,OACTpjG,OAAQ,EACRD,MAAO,EACP0iD,WAAY,EACZvtB,YAAa,EACb9zB,gBAAiB,sBACjB,UAAW,CACP2qE,UAAU,QAEd,UAAW,CACPA,UAAU,+BAEd,WAAY,CACRA,UAAU,iCA/BDg6B,CAkClBK,MAmBY86G,GAbV,SAAC,GAA6C,IAA3CC,EAA0C,EAA1CA,OAAQt1L,EAAkC,EAAlCA,SAAUm1L,EAAwB,EAAxBA,kBACtB,OACI,cAAC,GAAD,CACIhtM,IAAK,EACLwqC,IAAK,EACLmoD,KAAM,IACNx/F,MAAOg6M,EACPt1L,SAAUA,EACVm1L,kBAAmBA,KC5BhBI,GApBS1hN,sBACpB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,sBAAMW,EAAE,wQAAwQF,KAAK,iBACrR,sBAAME,EAAE,yZAAyZF,KAAK,iBACta,sBAAME,EAAE,iYAAiYF,KAAK,uBCJxZ0gN,GAA4B//M,IAAOC,IAAV,gDAIzB+/M,GAAkBhgN,IAAOC,IAAV,oLAUfggN,GAAWjgN,IAAOC,IAAV,oHAORigN,GAAsBlgN,IAAOC,IAAV,gGAMnBkgN,GAAuBngN,IAAOC,IAAV,gDAIpB2wD,GAAgB5wD,IAAOC,IAAV,wVAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAE3B,SAAA+b,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAOrB,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4B,aACtC,SAAAoa,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4B,aAE5C,SAAAoa,GAAK,OACFA,EAAM0D,UAAP,qFAIwB1D,EAAMI,MAAMpc,OAAO4B,UAJ3C,kCAKcoa,EAAMI,MAAMpc,OAAO4B,UALjC,qBAUFs6N,GAAepgN,IAAOC,IAAV,yEAKZogN,GAAgBrgN,IAAOC,IAAV,0FAMbqgN,GAAetgN,IAAOC,IAAV,qGAMZsgN,GAAcvgN,IAAOC,IAAV,qIAEJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMnCq8N,GAAexgN,IAAOC,IAAV,kDAIZwgN,GAAkBzgN,IAAOC,IAAV,wEAKRygN,GAmBR,SAAC,GAiBC,IAhBHC,EAgBE,EAhBFA,QACAC,EAeE,EAfFA,MACAf,EAcE,EAdFA,OACAJ,EAaE,EAbFA,OACAoB,EAYE,EAZFA,WACAC,EAWE,EAXFA,SACAC,EAUE,EAVFA,eACAC,EASE,EATFA,iBACAC,EAQE,EARFA,mBACAC,EAOE,EAPFA,OACAC,EAME,EANFA,gBACAC,EAKE,EALFA,cACAC,EAIE,EAJFA,gBACAC,EAGE,EAHFA,WACAC,EAEE,EAFFA,aACAC,EACE,EADFA,YAEA,OACI,cAACzB,GAAD,UACI,eAACC,GAAD,CACI57M,QAAS,SAAAihB,GACLA,EAAEC,mBAENikK,cAAe,SAAAlkK,GACXA,EAAEC,mBALV,UAQI,eAAC26L,GAAD,WACI,cAACG,GAAD,UACI,cAAC,GAAD,CAAeh8M,QAASy8M,EAAxB,SACKF,EAAU,cAAC,GAAD,IAAgB,cAAC,GAAD,QAGnC,cAACN,GAAD,UACI,cAAC,GAAD,CACIZ,OAAQA,EACRl1L,SAAU22L,EACV/xB,YAAagyB,EACbzB,kBAAmB0B,SAI/B,eAACnB,GAAD,WACI,cAACG,GAAD,IACA,eAACE,GAAD,WACI,eAACG,GAAD,WACI,cAACF,GAAD,UAAciB,IACd,eAAChB,GAAD,WACI,cAACN,GAAD,UACKU,EACG,cAAC,GAAD,CAAex8M,QAAS08M,EAAxB,SACI,cAACW,GAAA,EAAD,CAAW9+M,SAAU,YAGzB,cAAC,GAAD,CAAeyB,QAAS08M,EAAxB,SACI,cAACY,GAAA,EAAD,CAAU/+M,SAAU,cAIhC,cAACw9M,GAAD,UACI,cAAC,GAAD,CACIN,OAAQA,EACRt1L,SAAUw2L,EACVrB,kBAAmBsB,YAKnC,eAACP,GAAD,WACKa,GACG,cAACpB,GAAD,UACI,cAAC,GAAD,CACI97M,QAASk9M,EACTn9M,MAAM,YAFV,SAII,cAAC,GAAD,QAIXk9M,GACG,cAACnB,GAAD,UACKqB,EACG,cAAC,GAAD,CAAe39M,UAAU,EAAzB,SACI,cAAC,KAAD,CAASS,KAAM,OAGnB,cAAC,GAAD,CACID,QAASi9M,EACTl9M,MAAM,WAFV,SAII,cAAC,GAAD,QAKhB,cAAC+7M,GAAD,UACI,cAAC,GAAD,CACI97M,QAAS68M,EACT98M,MAAM,mBAFV,SAII,cAAC,GAAD,uBChOrB,OAA0B,qCC+BnCw9M,GAAuB3hN,IAAOC,IAAV,2SAapBmhG,GAAmBphG,IAAOC,IAAV,0IAShB2hN,GAAmB5hN,IAAOC,IAAV,0LAUT4hN,GAUR,SAAC,GAUC,IATHnhL,EASE,EATFA,IACA2gL,EAQE,EARFA,gBACAC,EAOE,EAPFA,WACAC,EAME,EANFA,aACAjjN,EAKE,EALFA,UACAwjN,EAIE,EAJFA,YACAC,EAGE,EAHFA,WACAC,EAEE,EAFFA,UACAxwC,EACE,EADFA,SACE,EAC0CruJ,oBAAS,GADnD,mBACS8+L,EADT,KACuBC,EADvB,OAE4B/+L,mBAAS,CAC/Bw9L,UAAWnvC,EACXovC,OAAO,EACPf,OAAQ,GACRJ,OAAQ,EACR0C,cAAe,IAPrB,mBAESrgN,EAFT,KAEgBkvK,EAFhB,OASgC7tJ,oBAAS,GATzC,mBASSi/L,EATT,KASkBC,EATlB,OAUwCl/L,oBAAS,GAVjD,mBAUSm/L,EAVT,KAUsBC,EAVtB,KAYU5B,EAAkD7+M,EAAlD6+M,QAASC,EAAyC9+M,EAAzC8+M,MAAOf,EAAkC/9M,EAAlC+9M,OAAQJ,EAA0B39M,EAA1B29M,OAAQ0C,EAAkBrgN,EAAlBqgN,cAElCK,EAAYr9L,iBAAY,MACxBs9L,EAAqBt9L,iBAAY,MAEjCu9L,EAAkB,WACpB1xC,EAAS,6BAAKlvK,GAAN,IAAa6+M,SAAU7+M,EAAM6+M,YA2BnCgC,EAAyB,WACvBC,KAAWC,WACXD,KAAWE,OAAOL,EAAmB1yL,UAyCvCyxL,EAhKY,SAAChhM,GACvB,GAAIuiM,MAAMviM,GACN,MAAO,QAGX,IAAMP,EAAO,IAAIE,KAAe,IAAVK,GAChBwiM,EAAK/iM,EAAKgjM,cACVC,EAAKjjM,EAAKkjM,gBACVC,EAAKnjM,EACNojM,gBACAzzN,WACA0zN,SAAS,EAAG,KAEjB,OAAIN,EACM,GAAN,OAAUA,EAAV,YAAgBE,EAAGtzN,WAAW0zN,SAAS,EAAG,KAA1C,YAAkDF,GAGhD,GAAN,OAAUF,EAAV,YAAgBE,GA+IQG,CAJAf,EAAUzyL,QACxByyL,EAAUzyL,QAAQyzL,iBAClB,SAuBN,OAnBAlgM,qBAAU,WACFw+L,GACAA,EAAYK,KAEjB,CAACA,EAAeL,IAEnBx+L,qBAAU,WACFy+L,GACAA,EAAWpB,KAEhB,CAACA,EAASoB,IAEbz+L,qBAAU,WACFod,GACA6hL,GAAe,KAEpB,CAAC7hL,IAIA,eAACihL,GAAD,CACIv9M,QAASs+M,EACTn5B,cAAeo5B,EACftkN,IAAKokN,EACLnkN,UAAWA,EAJf,UAMKoiC,GACG,cAAC,KAAD,CACIriC,IAAKmkN,EACL1tJ,OAAQ,CACJoL,KAAM,CACFujJ,WAAY,CACRC,QAAS,UAIrBjlN,MAAO,OACPC,OAAQ,OACRiF,MAAO,CACHyU,WAAYn0B,IAAUC,OAAOqB,eAC7B0mG,OAAQ,GAEZvrD,IAAKA,EACLpiC,UAAU,oBACVqiN,QAASA,EACTC,MAAOoB,GAAapB,EACpBf,OAAQA,EACR8D,QAAS,WACLzB,GAAgB,GAChBK,GAAe,IAEnBqB,WA1FO,SAACC,GACfzB,IACDpxC,EAAS,6BAAKlvK,GAAU+hN,IACG,IAAvBA,EAAYpE,QACZzuC,EAAS,6BAAKlvK,GAAN,IAAa6+M,SAAS,EAAOlB,OAAQ,SAyFhD6C,GACG,cAAClhH,GAAD,UACI,cAAC,KAAD,CAAS3iG,MAAO,YAItBiiC,GACE,eAACkhL,GAAD,WACI,qBAAKt9M,IAAKw/M,GAASv/M,IAAI,QACvB,cAAC,KAAD,CAAKgrF,UAAU,OAAOw0H,GAAI,EAA1B,yDAMP9B,GAAgBvhL,GACb,cAAC,GAAD,CACI++K,OAAQA,EACRkB,QAASA,EACTC,MAAOA,EACPf,OAAQA,EACRgB,WAAY6B,EACZ5B,SAjJG,WACf9vC,EAAS,6BAAKlvK,GAAN,IAAa8+M,OAAQ9+M,EAAM8+M,UAiJvBoD,SA9IK,WACjBxB,EAAUzyL,QAAQk0L,OAAOzB,EAAUzyL,QAAQyzL,iBAAmB,KA8IlDzC,eA3IW,SAAC17L,EAAQktF,GAChCy+D,EAAS,6BACFlvK,GADC,IAEJ+9M,OAAQqE,WAAW3xG,GACnBquG,MAAoB,IAAbruG,MAwICyuG,iBApIa,SAAC37L,EAAQktF,GAClCy+D,EAAS,6BACFlvK,GADC,IAEJ+9M,OAAQqE,WAAW3xG,GACnBquG,MAAoB,IAAbruG,MAiIC0uG,mBAAoB0B,EACpBzB,OA/GS,SAAC77L,EAAQktF,GAC9By+D,EAAS,6BACFlvK,GADC,IAEJqgN,cAAe+B,WAAW3xG,OA6GlB4uG,gBAzGY,WACxBkB,GAAW,IAyGCjB,cAtGU,SAAC/7L,EAAQktF,GAC/B8vG,GAAW,GACPG,EAAUzyL,QAAQ+xL,gBAAkBqC,MAIvB,IAAb5xG,EACAiwG,EAAUzyL,QAAQk0L,OAAOzB,EAAUzyL,QAAQ+xL,eAE3CU,EAAUzyL,QAAQk0L,OAAO1xG,KA8FjB8uG,gBAAiBA,EACjBC,WAAYA,EACZC,aAAcA,EACdC,YAAaA,QC/P/B54E,GAAsB5oI,IAAOC,IAAV,0IAQnBgvH,GAAejvH,IAAOC,IAAV,uIASZkpI,GAAanpI,IAAOC,IAAV,oMAWV4xD,GAAuB7xD,IAAO0nB,KAAV,8NAOb,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAwB1B2/N,GAhBV,SAAC,GAA+B,IAA7B3rN,EAA4B,EAA5BA,KAAMmP,EAAsB,EAAtBA,QAASnN,EAAa,EAAbA,OACnB,OACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAc2J,QAAS,kBAAM3L,GAAQgC,EAAOhC,EAAKgH,KAAjD,SACI,cAAC8rC,GAAA,EAAD,CAAmBlnC,KAAK,KAAKuD,QAASnP,MAE1C,eAAC,GAAD,CAAY2L,QAAS,kBAAM3L,GAAQgC,EAAOhC,EAAKgH,KAA/C,UACKhH,GAAI,UAAOA,EAAKkmC,UAAZ,YAAyBlmC,EAAKomC,UAClCj3B,GAAWnP,GAAQA,EAAKgH,KAAOmI,EAAQnI,IACpC,cAAC,GAAD,4BCjDd4kN,GAA8BrkN,IAAOC,IAAV,qUAoB3BqkN,GAAoBtkN,IAAOC,IAAV,uWAGC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAG5B,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAU9C0iF,GAAStnE,IAAOC,IAAV,uMAOC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,UAGnCyvC,GAAQt0B,IAAOC,IAAV,8YACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACtB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAoBxCo8G,GAAc1lG,IAAOC,IAAV,4SACJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SACtB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAcxCi7N,GAAMvkN,IAAOC,IAAV,uFA+DMukN,GAjDV,SAAC,GASC,IARH9jL,EAQE,EARFA,IACAiR,EAOE,EAPFA,UACA8yK,EAME,EANFA,oBACAhsN,EAKE,EALFA,KACAgC,EAIE,EAJFA,OACAiqN,EAGE,EAHFA,oBACAnD,EAEE,EAFFA,aACAoD,EACE,EADFA,eAEM/8M,EAAU0R,YAAY3R,MAE5B,OACI,eAAC08M,GAAD,WACI,cAAC,GAAD,CAAe5rN,KAAMA,EAAMmP,QAASA,EAASnN,OAAQA,IACrD,cAAC,GAAD,CACIimC,IAAKA,GAAY,UACjB2gL,gBAAiBqD,EACjBnD,aAAcA,EACdjjN,UAAU,QACVgjN,WAAYqD,IAEhB,eAACL,GAAD,WACI,cAACC,GAAD,UACI,cAAC,GAAD,0BAEJ,cAACA,GAAD,UACI,cAAC,GAAD,CACIngN,QAAS,kBACLutC,EAAUlyC,IAAMglN,EAAoB9yK,EAAUlyC,KAFtD,gBAKKkyC,QALL,IAKKA,OALL,EAKKA,EAAWxtC,UAGpB,cAACogN,GAAD,UACI,cAAC,GAAD,CACIngN,QAAS,kBACLutC,EAAUlyC,IAAMglN,EAAoB9yK,EAAUlyC,KAFtD,gBAKKkyC,QALL,IAKKA,OALL,EAKKA,EAAWjJ,uBC/I9Bk8K,GAA+B5kN,IAAOC,IAAV,yEAErB,SAAAC,GAAK,OAAIA,EAAM4iI,cAAgB,MAGtC+hF,GAA6B7kN,IAAOC,IAAV,qGAM1B6kN,GAAyB9kN,IAAOC,IAAV,gIAGV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC4gO,GAAsB/kN,IAAOC,IAAV,uQAOP,SAAAC,GAAK,OACfA,EAAMmU,SAAWnU,EAAM8C,MAAQ/e,IAAUC,OAAOU,YAC3C,SAAAsb,GAAK,OACVA,EAAMmU,SAAWpwB,IAAUC,OAAOC,MAAQF,IAAUC,OAAO0B,YAY7Do/N,GAAehlN,IAAOC,IAAV,0MAOA,SAAAC,GAAK,OACfA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAO+D,cACnBiY,EAAMI,MAAMpc,OAAOwC,eAEvB,SAAAwZ,GAAK,OACHA,EAAMmU,SACAnU,EAAMI,MAAMpc,OAAOI,YACnB4b,EAAMI,MAAMpc,OAAOQ,cAE/B,SAAAwb,GAAK,OAAKA,EAAM+kN,WAAN,wBAmDDC,GApCV,SAAC,GAUC,IATHzxN,EASE,EATFA,KACA4gB,EAQE,EARFA,SACA8wM,EAOE,EAPFA,UACAC,EAME,EANFA,UACAC,EAKE,EALFA,UACAriN,EAIE,EAJFA,MACAsiN,EAGE,EAHFA,aACAC,EAEE,EAFFA,QACAvhG,EACE,EADFA,QAEA,OACI,eAAC4gG,GAAD,CACIxgN,QAAS,kBAAMkhN,EAAa7xN,IAC5BqvI,aAAcuiF,EAAY,IAAM,GAFpC,UAII,eAACR,GAAD,WACI,cAACE,GAAD,CACI1wM,SAAUA,GAAa+wM,GAAaD,EACpCniN,MACIA,GAAgB/e,IAAUC,OAAO4D,uBAErCymJ,MAAOg3E,EACPvhG,QAASA,IAEb,cAAC8gG,GAAD,OAEJ,cAACE,GAAD,CACIC,YAAY,EACZ5wM,SAAUA,EACVrR,MAAOA,GAAgB/e,IAAUC,OAAO4D,6BCvGlDq5E,GAAQnhE,IAAOC,IAAV,yIAGE,SAAAC,GAAK,OAAIA,EAAM8C,SAcbwiN,GANV,SAAC,GAAsB,IAApB/hN,EAAmB,EAAnBA,MAAOT,EAAY,EAAZA,MACX,OACI,cAAC,GAAD,CAAOA,MAAOA,GAAgB/e,IAAUC,OAAO0B,SAA/C,SAA0D6d,KCZ5DgiN,GAA2BzlN,IAAOC,IAAV,kGAMxBylN,GAAU1lN,IAAOC,IAAV,8NAIM,SAAAC,GAAK,OAAOA,EAAM0zB,WAAa1zB,EAAM0zB,WAAa,UCbxDguB,GAAa5hD,IAAOC,IAAV,gHAGV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACjB,SAAAyb,GAAK,OAAIA,EAAMmnE,QAAU,KAGpClkE,GAAenD,IAAOC,IAAV,oaAKD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAC5B,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,QAKtCy9D,IACG,SAAA1hD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,QAE9Bw8D,IACE,SAAA1hD,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGjB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cCrB3CihO,GAAoC,SAAC,GAM3C,IALHlrN,EAKE,EALFA,OACAmJ,EAIE,EAJFA,SACAG,EAGE,EAHFA,QACAzF,EAEE,EAFFA,UACAwiD,EACE,EADFA,KAEA,OACI,cAAC,GAAD,CACIl9C,SAAUA,GAAYG,EACtBK,QAAS3J,EACT6D,UAAWA,EAHf,SAKI,cAAC,GAAD,CAAY+oE,OAAQvmB,GAAQ,EAAI,EAAhC,SACI,cAACkS,GAAA,EAAD,SCPV4yJ,GAAgC5lN,IAAOC,IAAV,oEAK7B4lN,GAAoB7lN,IAAOC,IAAV,2LACLhc,IAAUC,OAAOC,OAEX,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAK9C23C,GAAUv8B,IAAOC,IAAV,2IAGWhc,IAAUC,OAAOU,SACvBX,IAAUC,OAAOU,UAI7BkhO,GAAW9lN,IAAOC,IAAV,wKAIC,SAAAC,GAAK,OAAIA,EAAMkvB,SAAW,mBAC3B,SAAAlvB,GAAK,OAAIA,EAAMgtE,QAAU,aAIjC64I,GAAY/lN,IAAOC,IAAV,2HAOTq0B,GAAQt0B,IAAOC,IAAV,4EAKL+lN,GAAiBhmN,IAAOC,IAAV,sJAQdgmN,GAAUjmN,IAAOC,IAAV,+GAGAhc,IAAUC,OAAOQ,YAIxB05G,GAAQp+F,IAAOC,IAAV,kHAEEhc,IAAUC,OAAOgB,MAKxBghO,GAAkBlmN,aHtCnB,SAAC,GAcC,IAbHvM,EAaE,EAbFA,KACAye,EAYE,EAZFA,MACAzO,EAWE,EAXFA,MACAoC,EAUE,EAVFA,MACAy/M,EASE,EATFA,aACAa,EAQE,EARFA,iBACA/jJ,EAOE,EAPFA,WACAp/D,EAME,EANFA,MACAghH,EAKE,EALFA,QACAuhG,EAIE,EAJFA,QACA5/L,EAGE,EAHFA,SACArnB,EAEE,EAFFA,UACAs1B,EACE,EADFA,WAEA,OACI,eAAC6xL,GAAD,CAA0BnnN,UAAWA,EAArC,UACKmF,GACG,cAAC,GAAD,CACIT,MAAOo/D,GAAcA,EACrB3+D,MAAOA,IAGf,cAACiiN,GAAD,CAAS9xL,WAAYA,EAArB,SACK1hB,EAAMjR,KAAI,SAACmS,EAAYlS,GAAb,OACP,cAAC,GAAD,CAEImT,WAAYxO,GAASuN,GAAQvN,EAC7Bs/M,UAAW/xM,IAASvN,EACpBu/M,UAAWhyM,IAASlB,EAAMS,OAC1B0yM,UAAqB,IAAVnkN,EACXzN,KAAI,UAAK2f,GAAL,OACA+yM,GAAsC,IAE1Cb,aAAc,kBACT3/L,GACD2/L,GACAA,EAAalyM,EAAM3f,IAEvBuP,MAAOA,EACPghH,QAASA,EACTuhG,QAASA,GAhBb,UACYnyM,EADZ,YACoBlS,cGYhBlB,CAAH,4CAIfiqG,GAAQjqG,IAAOC,IAAV,qHAEE,SAAAC,GAAK,OACVA,EAAMysK,MACA1oL,IAAUC,OAAOQ,WACjBT,IAAUC,OAAOI,eAKzBohH,GAAc1lG,IAAOC,IAAV,6IACJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAIrB,SAAAyb,GAAK,OAAIA,EAAMu+D,aAAe,SAG5C2nJ,GAAwBpmN,IAAOC,IAAV,iFAKrBomN,GAA4BrmN,IAAOC,IAAV,sIAGlB,SAAAC,GAAK,OAAIA,EAAM4iI,cAAgB,MAE/B,SAAA5iI,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAGnCkkJ,GAAsB5oI,IAAOC,IAAV,6JAQnBqmN,GAA+BtmN,IAAOC,IAAV,0GAM5BsmN,GAA2BvmN,IAAOC,IAAV,sDAIxBmhD,GAAwBphD,IAAOC,IAAV,uDAIrBumN,GAA4BxmN,IAAOC,IAAV,4BAEzBwmN,GAAc,CAAC,EAAG,EAAG,EAAG,EAAG,GAmOlBC,GArNV,SAAC,GAYC,IAAD,EAXFthN,EAWE,EAXFA,KACA0vM,EAUE,EAVFA,OACA6R,EASE,EATFA,UACAC,EAQE,EARFA,QACA9O,EAOE,EAPFA,YACA+O,EAME,EANFA,wBACAC,EAKE,EALFA,iBACAC,EAIE,EAJFA,gBACAC,EAGE,EAHFA,oBACAC,EAEE,EAFFA,mBACAC,EACE,EADFA,uBAEMC,EAAclpM,mBAAQ,WACxB,OAAK62L,EAEDA,EAAOjvM,MACAivM,EAAOjvM,OhD1IUqM,EAWE,SAAC08G,EAAUz1F,GAC7C,IADkE,EAC5DiuL,EAAM,GADsD,eAEhDjuL,GAFgD,IAElE,2BAA0B,CAAC,IAAlBnmC,EAAiB,QAChB47H,EAAI57H,IACNo0N,EAAI3vM,KAAKm3G,EAAI57H,KAJ6C,8BAOlE,OAAOo0N,EgD0HCC,CAAuBvS,EAAQ,CAC3B,UACA,YACA,aACA,aACA,kBhDhJCniM,QAAUT,EAAMmF,QAAO,SAACwtH,EAAOyiF,EAAQpmN,EAAOm/C,GAEvD,OADAwkF,GAASyiF,EACLpmN,IAAUm/C,EAAM1tC,OAAS,EAClBkyH,EAAQxkF,EAAM1tC,OAEdkyH,KgDkIA,EhDxIgB,IAAC3yH,IgDoJ7B,CAAC4iM,IAEJ,OACI,eAAC8Q,GAAD,WACI,eAAC,GAAD,WACI,eAAC,GAAD,wBACejkM,aAAWglM,GAAW,MAEpCI,GACG,eAACT,GAAD,WACI,eAAC,GAAD,CAAa7nJ,YAAY,OAAzB,UACKuoJ,EAAsB,EAD3B,OACkCD,KAElC,cAACR,GAAD,UACI,cAAC,GAAD,CACIzlK,MAAI,EACJrmD,OAAQ,kBAAMqsN,GAAiB,QAGvC,cAACN,GAAD,UACI,cAAC,GAAD,CAAa/rN,OAAQ,kBAAMqsN,GAAiB,cAK5D,eAACjB,GAAD,WACI,cAACC,GAAD,UACI,cAAC,GAAD,gCAEJ,eAACA,GAAD,CACIniN,MAAO,CACH85F,WAAY,aACZ8pH,WAAY,MACZC,YAAa,QAJrB,UAOI,cAAC,GAAD,CAAO76C,QAASw6C,EAAc,GAA9B,SACKA,EAAY7gK,QAAQ,KAEzB,eAAC0/J,GAAD,WACI,cAACC,GAAD,wBACA,cAACA,GAAD,2BACA,cAACA,GAAD,kCAGR,cAACG,GAAD,UACKK,GAAYxlN,KAAI,SAAAmS,GAAI,OACjB,cAACizM,GAAD,CAEIvjF,aAAuB,IAAT1vH,EAAa,EAAI,GAFnC,SAIKA,GAHIA,QAOjB,cAAC,GAAD,IACA,eAAC0yM,GAAD,WACI,cAAC1nH,GAAD,sBACA,cAAC8nH,GAAD,CACIljN,MAAO/e,IAAUC,OAAOgE,cACxBgqB,MAAOu0M,GACPhzN,KAAM,UACN8xN,SAAS,EACTvhG,QAAS,MACTn+G,MAAK,OAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQ2S,QACfnC,aAAcxN,EACdnyL,SAAmB,SAATvgB,OAGlB,eAAC0gN,GAAD,WACI,cAAC1nH,GAAD,wBACA,cAAC8nH,GAAD,CACIljN,MAAO/e,IAAUC,OAAOgE,cACxBgqB,MAAOu0M,GACPhzN,KAAM,YACN8xN,SAAS,EACTvhG,QAAS,MACTn+G,MAAK,OAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQ4S,UACfpC,aAAcxN,EACdnyL,SAAmB,SAATvgB,OAGlB,eAAC0gN,GAAD,WACI,cAAC1nH,GAAD,yBACA,cAAC8nH,GAAD,CACIljN,MAAO/e,IAAUC,OAAOgE,cACxBgqB,MAAOu0M,GACPhzN,KAAM,aACN8xN,SAAS,EACTvhG,QAAS,MACTn+G,MAAK,OAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQ6S,WACfrC,aAAcxN,EACdnyL,SAAmB,SAATvgB,OAGlB,eAAC0gN,GAAD,WACI,cAAC1nH,GAAD,yBACA,cAAC8nH,GAAD,CACIljN,MAAO/e,IAAUC,OAAOgE,cACxBgqB,MAAOu0M,GACPhzN,KAAM,aACN8xN,SAAS,EACTvhG,QAAS,MACTn+G,MAAK,OAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQ8S,WACftC,aAAcxN,EACdnyL,SAAmB,SAATvgB,OAGlB,eAAC0gN,GAAD,CAAU54I,OAAO,aAAjB,UACI,cAACkxB,GAAD,4BACA,cAAC8nH,GAAD,CACIljN,MAAO/e,IAAUC,OAAOgE,cACxBgqB,MAAOu0M,GACPhzN,KAAM,eACN8xN,SAAS,EACTvhG,QAAS,MACTn+G,MAAK,OAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQ+S,aACfvC,aAAcxN,EACdnyL,SAAmB,SAATvgB,OAGlB,cAAC,GAAD,CACIS,MAAK,iBAAEivM,QAAF,IAAEA,OAAF,EAAEA,EAAQgT,YAAV,QAAkB,GACvBr0N,KAAK,QACLw2D,YAAY,2BACZqP,QAAS,EACT/uC,SAAU,SAAC0vB,GAAD,OACN69J,EAAY79J,EAAM5E,OAAOxvC,MAAO,SAEpCuS,WAAYn0B,IAAUC,OAAOqC,SAC7Bqd,SAAmB,SAATwB,EACV83C,IAAK,IACLuhB,YAAY,OACZ97D,SAAS,OACTygK,gBAAgB,YAGxB,eAAC2iD,GAAD,WACI,cAAC,KAAD,CACI5sM,YAAa,CAAC1U,KAAgBsjN,mBADlC,SAGI,cAAC,IAAD,CACIrpN,OAAO,OACPD,MAAM,QACNmF,UACKkxM,KAEGA,EAAO4S,WACP5S,EAAO2S,SACP3S,EAAO6S,YACP7S,EAAO8S,YACP9S,EAAO+S,eAEF,SAATziN,GACA8hN,EAEJ3jN,oBAAqBtf,IAAUC,OAAOQ,WACtC+V,OAAQosN,EAhBZ,SAkBc,SAATzhN,EACK,mBACA,sBAGbwhN,IAAYM,GACT,cAAC,KAAD,CACI/tM,YAAa,CAAC1U,KAAgBujN,yBADlC,SAGI,cAAC,GAAD,UACI,cAAC,IAAD,CACItpN,OAAO,OACPD,MAAM,QACNhE,OAAQwsN,EACRjkN,MAAM,kBACNnC,QAAQ,UALZ,qC,UCnVtBqsC,GAAcltC,IAAOC,IAAV,wMAUXihD,GAAgBlhD,IAAOC,IAAV,uIAObmtC,GAAoBptC,IAAOC,IAAV,wIAEV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAMnC+8D,GAAiBxhD,IAAOC,IAAV,iDAIdotC,GAAgBrtC,IAAOC,IAAV,qLASbwhD,GAAczhD,YAAOokB,KAAPpkB,CAAH,0GACE,SAAAE,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAEtB,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAG9Cm7D,GAAuB1hD,IAAOC,IAAV,wDAIbgoN,GAIR,SAAC,GAAmC,IAAjCnvJ,EAAgC,EAAhCA,OAAQ9oC,EAAwB,EAAxBA,QAAS+oC,EAAe,EAAfA,SAAe,EACE51C,mBAAS,CAC3C1vB,KAAMslE,EACNx+D,KAAM,KAH0B,mBAC7B2+D,EAD6B,KAChBC,EADgB,KAM9BC,EAA0B,SAACloC,EAAarrB,GAC1CszD,GAAe,SAAAjV,GAAS,oCAAUA,GAAV,mBAAsBhzB,EAAMrrB,QAGxD,OACI,qCACI,cAAC,GAAD,6BACA,eAAC,GAAD,WACI,cAAC,GAAD,4HAIA,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,CACI7K,KAAK,OACLvH,KAAK,OACLg4D,aAAa,sBACb5lD,MAAOqzD,EAAYzlE,KACnBgQ,MAAM,OACNijF,cAAc,OACdl7B,kBAAkB,OAClB6N,gBAAiB,IACjB3zC,UAAW,IACXhnB,OAAO,OACPonB,aAAc,SAACT,GAAD,OACV+zC,EAAwB,OAAQ/zC,EAAEgwB,OAAOxvC,YAIrD,cAACkgE,GAAA,EAAD,CACIlgE,MAAOqzD,EAAY3+D,KACnBgwB,SAAU,SAAClF,GAAD,OACN+zC,EAAwB,OAAQ/zC,EAAEgwB,OAAOxvC,QAE7CpS,KAAK,mBACLw2D,YAAY,kBACZ/M,IAAK,IACLoc,QAAS,EACT32D,SAAS,OACTysB,QAAQ,YACRvsB,aAAa,MACboqC,UAAU,QACVssB,sBAAuB,SAG/B,eAAC,GAAD,WACI,cAAC,IAAD,CACI96D,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRnvB,QAAQ,UACRmC,MAAM,UACNM,YAAarf,IAAUC,OAAOW,OANlC,oBAUA,cAAC,IAAD,CACI4Z,MAAM,QACNC,OAAO,OACPjE,OAAQ,mBAAQq+D,GAAUA,EAAOI,IACjCt1D,UAAWs1D,EAAYzlE,OAASylE,EAAY3+D,KAC5CyI,MAAM,UACNM,YAAarf,IAAUC,OAAOW,OANlC,8BCpHdqoD,GAAcltC,IAAOC,IAAV,6FAMXihD,GAAgBlhD,IAAOC,IAAV,uIAObmtC,GAAoBptC,IAAOC,IAAV,2FAEV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAInC4oD,GAAgBrtC,IAAOC,IAAV,4JAQbk5K,GAA0Bn5K,IAAOC,IAAV,yJAQvBm5K,GAAsBp5K,IAAOC,IAAV,oHAIZ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5ByjO,GAKR,SAAC,GAAoE,IAAlEC,EAAiE,EAAjEA,iBAAkB9xH,EAA+C,EAA/CA,UAAWrmE,EAAoC,EAApCA,QAASo4L,EAA2B,EAA3BA,qBAC1C,OACI,qCACI,cAAC,GAAD,uBACA,eAAC,GAAD,WACI,cAAC,GAAD,oGAIA,eAAC,GAAD,WACI,cAACtkM,GAAA,EAAD,CACIzf,KAAM,GACNsG,UAAWw9M,EACXpiM,OAAQ9hC,IAAUC,OAAO4C,MACzBusC,kBAAmBpvC,IAAUC,OAAO4C,MACpCg/B,aAAcsiM,EACdh0L,mBAAmB,QAEvB,cAAC,GAAD,oDAIJ,eAAC,GAAD,WACI,cAAC,IAAD,CACI31B,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRnvB,QAAQ,UACRmC,MAAM,UALV,qBASA,cAAC,IAAD,CACIvE,MAAM,QACNC,OAAO,OACPjE,OAAQ,mBAAQ47F,GAAaA,KAC7BrzF,MAAM,UAJV,+BCnFPujB,GAAYvmB,IAAOC,IAAV,4DAITq0B,GAAQt0B,IAAOC,IAAV,6JAQLylG,GAAc1lG,IAAOC,IAAV,oIAOXwtE,GAAkBztE,IAAOC,IAAV,uGCebooN,I,MClCAC,GDQf,YAA+E,IAA3Ct4L,EAA0C,EAA1CA,QAChC,OACI,cAAC,GAAD,UACI,eAACwd,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,oBAD1C,UAGI,cAAC,GAAD,uBACA,cAAC,GAAD,qHAIA,cAAC,GAAD,UACI,cAAC,IAAD,CACI3wB,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRhtB,MAAM,UAJV,4BEQLulN,GA1BYnqN,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLf,UAAWA,EACXK,MAAM,6BAPV,UASI,oBAAG4wD,YAAU,mBAAmBC,YAAU,UAAUC,YAAU,UAA9D,UACI,sBAAMlwD,EAAE,0HAA0HF,KAAK,YACvI,sBAAME,EAAE,2nCAA2nCF,KAAK,YAE5oC,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,mBAAmB5zB,EAAE,kCCpB5DipN,GAAaxoN,IAAOC,IAAV,mNAUVwoN,GAAmBzoN,IAAOC,IAAV,2SCWdyoN,ICrBAC,GDMf,YAAkF,IAAhDxkN,EAA+C,EAA/CA,MAAOukC,EAAwC,EAAxCA,YACrC,OACI,eAACs2D,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACI,cAAC,GAAD,IACA,cAACm0K,GAAD,UAAarkN,IACb,cAACskN,GAAD,UACK//K,IAEL,eAAC+/K,GAAD,2BACiB,mBAAGvnL,KAAK,+BAAR,wBADjB,iDEPG0nL,I,iFCPAC,GDAf,WACI,OAAO,cAACF,GAAD,CACHxkN,MAAM,kCACNukC,YAAY,4FEHP4+B,GAAStnE,IAAOC,IAAV,mJAONq0B,GAAQt0B,IAAOC,IAAV,4GAMLmnH,GAAWpnH,IAAOC,IAAV,oIAORswD,GAAUvwD,IAAOC,IAAV,8DAIPqgH,GAAWtgH,IAAOC,IAAV,sGAMR6oN,GAAY9oN,IAAOC,IAAV,8JAQT8oN,GAAW/oN,IAAOC,IAAV,4GAMR+oN,GAAchpN,IAAOC,IAAV,mGAMXgpN,GAAqBjpN,IAAOC,IAAV,+EAKlBipN,GAAYlpN,IAAOC,IAAV,qLASTkpN,GAAiBnpN,IAAOC,IAAV,mIAOdmpN,GAAuBppN,IAAOC,IAAV,mIAOpBopN,GAAiBrpN,IAAOC,IAAV,4HAOdqpN,GAAQtpN,IAAOC,IAAV,kNASLspN,GAAavpN,IAAOC,IAAV,qIAOVupN,GAAaxpN,IAAOC,IAAV,2JAQVwpN,GAAiBzpN,IAAOC,IAAV,4JAQdypN,GAAY1pN,IAAOC,IAAV,sJAQT0pN,GAAiB3pN,IAAOC,IAAV,qIAOd2pN,GAAkB5pN,IAAOC,IAAV,qEAKf4pN,GAAgB7pN,IAAOC,IAAV,qJAQb6pN,GAAiB9pN,IAAOC,IAAV,+PAQV,SAAAC,GAAK,gBAAqB,GAAdA,EAAMgB,MAAb,cAIT6oN,GAAU/pN,IAAOC,IAAV,oIAOP+pN,GAAchqN,IAAOC,IAAV,4PAWXgqN,GAAmBjqN,IAAOC,IAAV,2GAOhBiqN,GAAalqN,IAAOC,IAAV,mRAYVkqN,GAAkBnqN,IAAOC,IAAV,4GChKtBmqN,GAAiBxrD,gBCpCO,GDqCxByrD,GAAqBzrD,gBCpCQ,GD6FpB0rD,I,uIE9FHC,G,GCEGC,GHqCf,WACI,OAAO,qCACH,eAAC,GAAD,WACI,cAAC,GAAD,IACA,cAAC,GAAD,OAEJ,eAAC,GAAD,WACI,eAAC,GAAD,WACI,cAAC1B,GAAD,IACA,cAACC,GAAD,OAEJ,eAACC,GAAD,WACI,eAACC,GAAD,WACI,cAACC,GAAD,UACI,cAAC,KAAD,CAAS7kN,KAAM,OAEnB,cAAC8kN,GAAD,IACA,cAACC,GAAD,OAEJ,eAACC,GAAD,WACI,eAACC,GAAD,WACI,cAACC,GAAD,IACA,cAACC,GAAD,IACA,cAACC,GAAD,IAEIW,GAAenpN,KAAI,SAAAkT,GAAC,OAChB,eAACu1M,GAAD,WACI,cAACC,GAAD,IACA,cAACC,GAAD,UACI,cAACC,GAAD,UAEQQ,GAAmBppN,KAAI,SAAAmrE,GAAC,OACpB,cAAC09I,GAAD,CAAgB5oN,MAAOkrE,oBASvD,eAAC29I,GAAD,WACI,cAACC,GAAD,UACI,cAACC,GAAD,MAEJ,cAACC,GAAD,UACI,cAACC,GAAD,sBIlCtBM,GAAyBzqN,IAAOC,IAAV,kGAMtByqN,GAA8B1qN,IAAOC,IAAV,+IAQ3B0qN,GAAyB,yBAEzBC,GA0BD,SAAC,GAoBC,IAAD,IAnBF7mN,EAmBE,EAnBFA,QACA8wM,EAkBE,EAlBFA,WACAC,EAiBE,EAjBFA,OACAnjK,EAgBE,EAhBFA,UACA/5B,EAeE,EAfFA,QACA6iB,EAcE,EAdFA,QACAq9K,EAaE,EAbFA,YACA+S,EAYE,EAZFA,2BACA/D,EAWE,EAXFA,iBACAC,EAUE,EAVFA,gBACAC,EASE,EATFA,oBACAv1L,EAQE,EARFA,aACAq5L,EAOE,EAPFA,sBACAljN,EAME,EANFA,QACAmjN,EAKE,EALFA,8BACAC,EAIE,EAJFA,wBACAC,EAGE,EAHFA,yBACAC,EAEE,EAFFA,+BACAC,EACE,EADFA,oBAEMj7F,EAAiB/qG,iBAAOsV,GACxB2wL,EAAuB,oCAF3B,EAIgDjoM,oBAAS,GAJzD,mBAIKkoM,EAJL,KAIwBC,EAJxB,OAMEnoM,oBAAS,GANX,mBAKKooM,EALL,KAKgCC,EALhC,OAO8CroM,oBAAS,GAPvD,mBAOKglM,EAPL,KAOuBsD,EAPvB,OAQ0DtoM,oBAAS,GARnE,mBAQK+jM,EARL,KAQ6BwE,EAR7B,KAUI55M,EAAcnQ,cAEpB2hB,qBAAU,WACN4sG,EAAengG,QAAU0K,KAE7B,IAAM01F,EAAcD,EAAengG,QAEnCzM,qBAAU,WACDmX,IAAYA,EAAQh7B,IAAQ0wH,IAAgBA,EAAY1wH,IAEzDg7B,EAAQh7B,KAAO0wH,EAAY1wH,IAC3BmY,EAAQH,KAAKluB,IAAOsC,oBAAoBK,WAAWH,OAExD,CAAC0uC,EAAS01F,EAAav4G,IAE1B0L,qBAAU,WAAO,IAAD,IACN2uC,EAAK,UAAGr6C,EAAQE,SAAShW,aAApB,aAAG,EAAwBmwD,MAChC73D,EAAY,UAAGwd,EAAQE,SAAShW,aAApB,aAAG,EAAwB1H,aAEzC63D,GAAS73D,GACT2wN,EAA8B3wN,KAEnC,CAAC2wN,EAA+BnzM,IAEnC,IAAM+zM,EAAa37N,uBAAY,WAAO,IAAD,YACjC,GAAK8kN,EAAL,CAEA,IAAM3iN,EAA+B,CACjC21N,KAAI,UAAEhT,EAAOgT,YAAT,QAAiB,GACrBL,QAAO,UAAE3S,EAAO2S,eAAT,QAAoB,EAC3BC,UAAS,UAAE5S,EAAO4S,iBAAT,QAAsB,EAC/BC,WAAU,UAAE7S,EAAO6S,kBAAT,QAAuB,EACjCC,WAAU,UAAE9S,EAAO8S,kBAAT,QAAuB,EACjCC,aAAY,UAAE/S,EAAO+S,oBAAT,QAAyB,GAgCzC,GA9BAgD,EAA2BhW,EAAYp1M,GAAItN,GACtCm5B,MAAK,kBAAM1T,EAAQH,KAAKluB,IAAOsC,oBAAoBK,WAAWH,QAC9Dy/B,OAAM,SAAC5rB,GACJ,OAAQA,EAAMrG,MACV,KAAK,IACDuY,EAAY,uCAAwC,SACpD8F,EAAQH,KAAKluB,IAAOsC,oBAAoBK,WAAWH,KACnD,MACJ,KAAK,IACDo/N,EAAoBtW,EAAYp1M,IAC3B6rB,MAAK,SAACsgM,GACHJ,GAA6B,GAC7B15M,EAAY,0CAAD,OACmC85M,EAAUnzN,KAAKkmC,UADlD,YAC+DitL,EAAUnzN,KAAKomC,UACrF,YAGZ,MACJ,KAAK,IACL,KAAK,IACD6sL,GAA0B,GAC1B55M,EAAYlS,EAAMgB,QAAS,SAC3B,MACJ,QACIkR,EAAYlS,EAAMgB,QAAS,aAMvCunN,GAAsB12L,GAAkB7pB,EAAS,CACjD,IAAMikN,EAAsBp6L,EAAa3gC,IAAIs6N,GACzCU,EAAiB,GACjBD,IACAC,EAAiBn6L,KAAKC,MAAMi6L,IAGhCC,EAAer0M,KAAK7P,EAAQnI,IAC5BgyB,EAAaoqB,IACTuvK,EACAz5L,KAAKG,UAAUg6L,QAGxB,CACCr6L,EACA02L,EACA0C,EACAhW,EACAj9L,EACAhQ,EACAktM,EACAqW,EACAr5M,IAGE+0M,EAA0B72N,uBAAY,WACxC,IAAI+7N,GAA8B,EAC5BF,EACFp6L,GAAgBA,EAAa3gC,IAAIs6N,GACjCS,GAAyBjkN,IAEzBmkN,EADuBp6L,KAAKC,MAAMi6L,GACWn6M,SAAS9J,EAAQnI,KAG9DssN,EACAJ,IAEAH,GAA6B,KAElC,CAAC/5L,EAAck6L,EAAY/jN,IAExBokN,EAAuBh8N,uBACzB,SAACmC,GACG,GAAK0iN,GAAe1iN,EAApB,CACAm5N,GAAqB,GACrB,IAAMW,EAA6B,CAC/B3xN,WAAYnI,EAAKsB,KACjB8G,KAAMpI,EAAKoI,MAEfuwN,EAAsBjW,EAAWp1M,GAAIwsN,GAAM3gM,MACvC,SAACgT,GACoB,YAAbA,GACA1mB,EAAQH,KAAKluB,IAAOsC,oBAAoBK,WAAWH,WAKnE,CAAC8oN,EAAYiW,EAAuBlzM,IApItC,EA0JsCuL,oBAAS,GA1J/C,mBA0JKo+L,EA1JL,KA0JmB2K,GA1JnB,KAyKF,IAAKrX,GAAc9wM,EACf,OACI,cAAC,GAAD,CAAamqH,YAAY,EAAzB,SACI,cAACs8F,GAAD,MAKZ,IAAMplN,GAAQyvM,EAAW2C,WAAsB,OAAT,OAEtC,OACI,eAAC,GAAD,CACIrzM,MAAM,qBACNmlH,SAAUurF,EAAW9+M,WAAa8+M,EAAW9+M,WAAWtC,KAAO,GAC/Dq4H,UAAWviI,IAAOsC,oBAAoBK,WAAWH,IACjDggI,aAAY,UAACn0G,EAAQE,SAAShW,aAAlB,aAAC,EAAwBiqH,WACrCuC,cAAa,sBACTumF,EAAW9+M,WAAa8+M,EAAW9+M,WAAWtC,KAAO,GAD5C,cAGTohN,EAAWp8M,MAAX,UACGo8M,EAAWp8M,KAAKkmC,UADnB,YACgCk2K,EAAWp8M,KAAKomC,UAJvC,cALjB,UAYI,cAAC4rL,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,CACIhqL,IAAKm0K,EAAWxoK,SAChBsF,UACIA,IACA,UAAAkjK,EAAWljK,iBAAX,eAAsBlyC,MAAOkyC,EAAUlyC,GAChCkyC,EACDkjK,EAAWljK,UAErB8yK,oBA3DQ,SAACxzN,GACpBA,GACLunB,YACIZ,EACAruB,IAAO6C,iBAAiBF,WAAWF,OAAO2D,QACtC,eACAsB,EAAYrB,cAsDJ6I,KAAMo8M,EAAWp8M,KACjBgC,OArEa,SAAC0xN,GACzBA,GACLv0M,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QAAQ,UAAWw8N,EAAUv8N,YACrD,CAAEm8H,WAAW,KAkED24F,oBAjDQ,WAAO,IAAD,EAC9B,GAAK7P,EAAL,CACAqX,IAAgB,GAChB,IAAMxrL,EAAG,OAAGm0K,QAAH,IAAGA,OAAH,EAAGA,EAAYxoK,SAClB+zB,EAAQ,UAAGy0I,EAAW9+M,kBAAd,aAAG,EAAuBtC,KAEpCitC,GAAO0/B,GACPU,aAAwBpgC,EAAK0/B,GAAU90C,MAAK,kBACxC4gM,IAAgB,QA0CR3K,aAAcA,EACdoD,eAAgBqG,IAEpB,cAAC,GAAD,CACIlW,OAAQA,EACR1vM,KAAMA,GACNuhN,UAAW9R,EAAW74D,UACtB4qE,QAAkB,SAATxhN,GACT0yM,YAAaA,EACb+O,wBAAyBA,EACzBC,iBAAkBA,EAClBC,gBAAiBA,EACjBC,oBAAqBA,EACrBC,mBAAoB,kBAAMqE,GAAqB,IAC/CpE,uBAAwBA,IAE3BmE,GACG,cAAC79K,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAAC,GAAD,CACI2pC,SACMnxD,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVi6B,OAAQkzJ,EACRh8L,QAAS,kBAAMs7L,GAAqB,QAI/CC,IAA8BrE,GAC3B,cAAC15K,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAAC,GAAD,CACIinE,UAAWs1H,EACXxD,iBAAkBA,EAClBC,qBAAsB,SAAC/iM,GAAD,OAClBomM,EAAoBpmM,EAAEgwB,OAAO1qC,UAEjCqlB,QAAS,kBACLw7L,GAA6B,aAOpDP,GACG,cAAC3C,GAAD,CACIt4L,QAASk7L,QAgNdkB,GAzMoB,WAC/B,IAAMvX,EAAalB,KADkB,EAECxwL,mBAAS,GAFV,mBAE9BkpM,EAF8B,KAEjBC,EAFiB,KAI/B10M,EAAUW,cACVg0M,EAAuBjZ,KAA+BU,cACtDwY,EAA8BlZ,KAA+BvvM,QAC7D0oN,EAAuBnZ,KAA+BnhM,WACtDpO,EAAU4vM,KAA4B5vM,QACtCxU,EAAS00I,cACT6zE,EAAcF,KACd8U,E7D1IuC,WAC7C,IAAMrrN,EAAWO,cACX+qN,EAA6B7xN,eAC7BgX,EAAcnQ,cAOpB,OAAO3R,uBACH,SAACoK,EAAsBjI,GAEnB,OADAkP,EAAS6yM,MACFyY,EAA2BvyN,EAAcjI,GAC3Cm5B,MAAK,SAAAn5B,GAGF,OAFAkP,EAAS+yM,GAAiC,CAACh6M,GAAe,WAC1D0X,EAAY,kBAAmB,WACxB6a,QAAQo7B,QAAQ51D,MAE1Bq5B,OAAM,SAAC5rB,GAEJ,OADAyB,EAASizM,GAAiC10M,EAAMgB,UACzC+rB,QAAQC,OAAOhtB,QAGlC,CAACyB,EAAUsrN,EAA4B76M,I6DkHd86M,GACvB9B,E7D/GqC,WAC3C,IAAMzpN,EAAWO,cACXirN,EAA2BxyN,eAC3ByX,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoK,EAAsB6xN,GAGnB,OAFA5qN,EAAS6yM,MAEF2Y,EAAyBzyN,EAAc6xN,GACzC3gM,MAAK,SAAAn5B,GAGF,OAFAkP,EAAS+yM,GAAiC,CAACh6M,GAAe,WAC1D0X,EAAY,oBAAqB,WAC1B,aAEV0Z,OAAM,SAAC5rB,GACJ,OAAmB,MAAfA,EAAMrG,MACN8H,EAAS+yM,GAAiC,CAACh6M,GAAe,WAC1D0X,EH5SoB,0CG4SsB,SACnC,YAEPzQ,EAASizM,GAAiC10M,EAAMgB,UAChDkR,EAAYlS,EAAMgB,QAAS,SACpB,cAIvB,CAACS,EAAUwrN,EAA0B/6M,I6DqFXg7M,GACxBryL,EAAUnhB,YAAYkhB,MACtB5yB,EAAU0R,YAAY3R,MACtB8pB,EAAegsC,eACfstJ,E7DlCsC,WAC5C,IAAM1pN,EAAWO,cACXmrN,EAA6BvyN,eAC7BsX,EAAcnQ,cACpB,OAAO3R,uBACH,SAACoK,GACG2yN,EAA2B3yN,EAAc,QACpCkxB,MAAK,WACFjqB,EACI+yM,GACI,CAACh6M,GACD,cAIXoxB,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACkR,EAAai7M,EAA4B1rN,I6DeR2rN,GAChCC,EAAuB5V,KACvB6V,EAAwBnU,KACxBpI,EAAe9G,KAnBgB,EAoBkByC,KAAzC36J,EApBuB,EAoB7Bx/C,KAA0Bg7N,EApBG,EAoBZppN,QApBY,EAqB2Bof,oBAAS,GArBpC,mBAqB9B8nM,EArB8B,KAqBJmC,EArBI,KAsB/BC,E7DoL2B,WACjC,IAAMv7M,EAAcnQ,cAOpB,OAAO3R,uBAAY,SAAC6kN,GAChB,IAAMl0M,EAAU,uBACTk0M,EAAWp8M,KAAX,gBAA2Bo8M,EAAWp8M,KAAKkmC,UAA3C,YAAwDk2K,EAAWp8M,KAAKomC,UAAa,KACrFg2K,EAAW9+M,WAAX,2BAA4C8+M,EAAW9+M,WAAWtC,MAAS,IAFlE,0BAGSktC,OAAO7oB,SAASopB,MACrC7B,aAAoB1+B,IACpBmR,EAAY,2BAA4B,aAE7C,CAACA,I6DpMsBw7M,GACpBnC,EAAsB1T,KACtB8V,EACFtW,KAMEuW,EAAqCx9N,uBACvC,SAAC6kN,GACG,GAAIA,EAAY,CAAC,IAAD,EACN5jN,EAAW,UAAG4jN,EAAWljK,iBAAd,aAAG,EAAsBlyC,GACtCxO,GACA0/M,EAAa/8I,OAAO3iE,OAIhC,CAAC0/M,IAGC7uM,EAAa8V,EAAQE,SAAShW,MAC9B2rN,IAAe,OAAC3rN,QAAD,IAACA,OAAD,EAACA,EAAOiqH,WACvB2hG,EAAoB,OAAG5rN,QAAH,IAAGA,OAAH,EAAGA,EAAO3Q,aAC9Bw8N,EAAe,OAAG7rN,QAAH,IAAGA,OAAH,EAAGA,EAAO4G,QAE/B4a,qBAAU,WACN,GAAI/zB,EAAO6K,aAAc,CAKrB,KAJmBwd,EAAQE,SAASukC,SAAS7kC,QACzCjuB,IAAOsC,oBAAoBK,WAAWF,OACjC2D,QAAQ,gBAAiBJ,EAAO6K,gBACpC,GACY,OACbqzN,EACAP,EAAsB39N,EAAO6K,aAAcozN,GAE3CP,EAAqB19N,EAAO6K,aAAcozN,MAGnD,CACC51M,EAAQE,SAASukC,SACjB9sD,EAAO6K,aACPqzN,EACAR,EACAC,EACAM,IAGJ,IAAMxG,EAAsB/oM,mBAAQ,WAChC,GACIsuM,IAAoB,OACpB1X,QADoB,IACpBA,OADoB,EACpBA,EAAYjwK,UACZ8oL,EACF,CACE,IAAME,EAAkBrB,EAAqB3gJ,WACzC,SAAAxxE,GAAY,OAAIA,IAAiBy6M,EAAWjwK,QAASnlC,MAEzD,OAAOiuN,EAAqB/6N,OAAS05N,EAAcuB,EAEvD,OAAO,IACR,CAACrB,EAAD,OAAuB1X,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAYjwK,QAAS8oL,EAAsBrB,IAW/DwB,EAA0B79N,uBAAY,SAACykI,GACzC,GAAI83F,IAAyBxoN,IAAYopN,GAAoBO,EAAsB,CAC/E,IAAME,EAAkB5G,EAAsB0G,EAAqB/6N,OAAS05N,EAC5E,GAAI53F,EAAM,CACN,GAAIuyF,IAAwByF,EAAwB,EAChD,OACJ,GAAwB3hF,KAApB8iF,EACAL,EAA2C,6BAEhCG,GAF+B,IAGlC/6N,OAAQ+6N,EAAqB/6N,OAAS05N,EAAcvhF,KAExD6iF,GACA,SAACx7N,GACGm6N,EAAeD,EAAcvhF,IAC7B,IAAMgjF,EAAmB37N,EAAK,GAC9B86N,EAAqBa,EAAkBN,UAE5C,CACH,IAAMM,EAAmBvB,EAAqBqB,EAAkB,GAChEX,EAAqBa,EAAkBN,QAExC,CACH,GAA4B,IAAxBxG,EACA,OACJ,GAAwB,IAApB4G,EACAL,EAA2C,6BAEhCG,GAF+B,IAGlC/6N,OAAQ+6N,EAAqB/6N,OAAS05N,EAAcvhF,KAExD6iF,GACA,SAACx7N,GACGm6N,EAAeD,EAAcvhF,IAC7B,IAAMgjF,EAAmB37N,EAAKA,EAAKwgB,OAAS,GAC5Cs6M,EAAqBa,EAAkBN,UAE5C,CACH,IAAMM,EAAmBvB,EAAqBqB,EAAkB,GAChEX,EAAqBa,EAAkBN,QAIpD,CACCxG,EACAqF,EACAqB,EACAC,EACA5pN,EACAopN,EACAZ,EACAE,EACAc,EACAN,EACAO,IAQGxC,EAA0Bh7N,uBAAY,WACrCyhC,EAAa3gC,IAAI65N,IACjB0C,EAAkBxY,EAAWjwK,SAE7BwoL,GAA4B,KAEjC,QAACvY,QAAD,IAACA,OAAD,EAACA,EAAYjwK,QAASnT,EAAc47L,IAOhCnC,EAAiCl7N,uBAAY,WAChDo9N,GAA4B,GAC5BC,EAAkBxY,EAAWjwK,SAC7BnT,EAAaoqB,IAAI8uK,IAAwB,KAC1C,QAAC9V,QAAD,IAACA,OAAD,EAACA,EAAYjwK,QAASyoL,EAAmB57L,IAE5C,OACc,OAAVojL,QAAU,IAAVA,OAAA,EAAAA,EAAYj1M,OACV,cAACipN,GAAD,IACA,cAAC,GAAD,CACEhU,WAAYA,EAAWjwK,QACvBkwK,OAAQD,EAAWC,OACnBnjK,UAAWA,EACX5tC,QAASA,GAAWyoN,EACpB50M,QAASA,EACT6iB,QAASA,EACTq9K,YAAaA,EACb+S,2BAA4B6B,EAC5B5F,iBAAkB+G,EAClB9G,gBAAiB0F,EACjBzF,oBAAqBA,EACrBp/M,QAASA,EACT6pB,aAAcA,EACdq5L,sBAAuBA,EACvBC,8BAA+BA,EAC/BC,wBAAyBA,EACzBC,yBAA0BA,EAC1BC,+BAAgCA,EAChCC,oBAAqBA,KCjkBpB4C,GAAqB/tN,IAAOC,IAAV,0QAalBqnE,GAAStnE,IAAOC,IAAV,yPCEJ+tN,GAXM,WACjB,OACI,eAAChvH,EAAA,EAAD,CAAkBzqD,aAAc,IAAKK,UAAU,EAA/C,UACI,cAAC,GAAD,6BACA,cAACm5K,GAAD,qECCNxnM,GAAYvmB,IAAOC,IAAV,8JAQTkvB,GAAUnvB,IAAOC,IAAV,6IAQP+gD,GAAUhhD,IAAOC,IAAV,wJAQP8kI,GAAkB/kI,IAAOC,IAAV,oLASf+kI,GAAahlI,IAAOC,IAAV,qGAMVymJ,GAAkB1mJ,IAAOC,IAAV,uDAIfstC,GAAgBvtC,IAAOC,IAAV,uDAIbilI,GAAqBllI,YAAO8kI,GAAP9kI,CAAH,qDAIlBiuN,GAAmBjuN,IAAOC,IAAV,oHAGT,SAAAC,GAAK,yBAAIA,EAAMI,aAAV,iBAAI,EAAapc,cAAjB,aAAI,EAAqBO,aAKrCqqJ,IAAsD,sBACvDj8E,KAAek8E,SAAW,CAAE5qI,MAAO,aADoB,gBAEvD0uD,KAAeuY,WAAa,CAAEjnE,MAAO,gBAFkB,gBAGvD0uD,KAAem8E,QAAU,CAAE7qI,MAAO,YAHqB,IAM/C+pN,GASR,SAAC,GASC,IARHh4B,EAQE,EARFA,iBACAC,EAOE,EAPFA,cACAC,EAME,EANFA,mBACAC,EAKE,EALFA,iBACA9wD,EAIE,EAJFA,eACAC,EAGE,EAHFA,gBACAliG,EAEE,EAFFA,QACA3lC,EACE,EADFA,aAEA2lB,qBAAU,WACN8yK,EAAmBD,KAEpB,IAJD,MAM8BhzK,mBAASmgB,GANvC,mBAMK+rG,EANL,KAMeC,EANf,KAQIgnD,EAAwBtmM,uBAC1B,SAAC+B,GACGqkM,EAAmBvtL,aAAkBqtL,EAAkBnkM,MAE3D,CAACqkM,EAAoBF,IAGnBziG,EAAiBzjG,uBAAY,WAC/BqmM,EAAiBH,GACjB1wD,EAAgB6J,GAChB9J,MACD,CAAC8wD,EAAkBH,EAAkB3wD,EAAgB8J,EAAU7J,IAG5D6kD,EAAiBr6L,uBAAY,WAC/BomM,EAAmB,IACnB9mD,EAAY,MACb,CAAC8mD,IAEE3mD,EAAyBz/I,uBAC3B,SAAC0/I,EAA2BrqH,GACpBA,EAAEgwB,OAAO1qC,QACT2kI,EAAY,GAAD,oBAAKD,GAAL,CAAeK,KAE1BJ,EAAYD,EAASl8H,QAAO,SAAAC,GAAI,OAAIA,IAASs8H,QAGrD,CAACL,EAAUC,IAGT6+E,EAA4Bj4B,EAAiBvjL,OAAS08H,EAAS18H,OAErE,OACI,eAAC,GAAD,WACI,eAAC,GAAD,YACKhV,GAAiB,cAAC42B,GAAA,EAAD,CAAUpwB,MAAO,kBAAjB,SACd,cAAC,GAAD,UACKuB,KAAyBzE,KAAI,SAAAmS,GAC1B,OACI,cAAC,GAAD,UACI,cAAC0Q,GAAA,EAAD,CAEIgC,aAAc,WACVwwK,EAAsBljL,EAAKvN,QAE/B8E,QAASurL,EAAiBxkL,SACtB0B,EAAKvN,OAETxB,KAAM,GACNZ,MAAO2P,EAAK3f,KACZkP,SAAU,GACVqxB,UAAW/vC,IAAUC,OAAOkB,MAC5B6uC,WAAY,OAXP7gB,EAAKvN,QAFIuN,EAAKvN,cAoB3C,cAAC0uB,GAAA,EAAD,CAAUpwB,MAAO,WAAjB,SACI,cAAC,GAAD,UACMk4B,OAAOtrB,KACL+9H,IACmB7tI,KAAI,SAAAmS,GAAI,OAC3B,eAAC,GAAD,WACI,cAAC0Q,GAAA,EAAD,CAEInZ,QAAS0kI,EAAS39H,SAAS0B,GAC3B0S,aAAc,SAAAT,GAAC,OACXoqH,EAAuBr8H,EAAMiS,IAEjC5hB,MAAOqrI,GAAY17H,GAAMjP,MACzB4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,OARvBguB,GAURA,IAASy/C,KAAem8E,SAAW,cAAC,GAAD,iBAMxD,eAAC,GAAD,WACI,eAACi/E,GAAD,WACKE,EADL,eAGA,cAAC,GAAD,UACI,cAAC,IAAD,CACI1vN,MAAO,QACPoC,QAAS,UACTpG,OAAQ,kBAAM4vL,KACdzmL,SAAUuqN,EAA4B,EAJ1C,qBASJ,cAAC,IAAD,CAAQ1vN,MAAO,QAAShE,OAAQ,kBAAMg5F,KAAtC,iCCpMHtmB,GAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,OCyEX2iE,GAAKhyE,EAAQ,IAEb+qH,GAAiB,GAEjBr9C,GAA0BztF,IAAOC,IAAV,gHAOvBonI,GAAuBrnI,IAAOC,IAAV,iDAIpBqnI,GAAiBtnI,IAAOC,IAAV,4EAKd2pI,GAAoB5pI,YAAO8kI,GAAP9kI,CAAH,qDAIjBouN,GAAwBhwN,sBAAW,SAAC8B,EAAY7B,GAClD,OAAO,cAAC,GAAD,cAAoBgwN,KAAMhwN,GAAS6B,OAGxCouN,GA6BD,SAAC,GAoBC,IAAD,oBAnBFzhN,EAmBE,EAnBFA,QACAhD,EAkBE,EAlBFA,YAEA0kN,GAgBE,EAjBFh/N,OAiBE,EAhBFg/N,qBACAC,EAeE,EAfFA,sBACA52M,EAcE,EAdFA,QACAhQ,EAaE,EAbFA,QACA0zL,EAYE,EAZFA,mBACA98I,EAWE,EAXFA,oBACA/zC,EAUE,EAVFA,iCACA8wL,EASE,EATFA,qCACAxkG,EAQE,EARFA,cACAhzF,EAOE,EAPFA,QACA0qN,EAME,EANFA,0BACA9wN,EAKE,EALFA,aACA+wN,EAIE,EAJFA,aACAC,EAGE,EAHFA,YACAh6H,EAEE,EAFFA,2BACA05H,EACE,EADFA,KAEMrgJ,EAAUb,KADd,EAGoChqD,oBAAkB,GAHtD,mBAGK8mD,EAHL,KAGkBuhE,EAHlB,OAI8CroH,mBAAmB,IAJjE,mBAIK+yK,EAJL,KAIuBsC,EAJvB,OAKwCr1K,mBAAmB,IAL3D,mBAKKgzK,EALL,KAKoBsC,EALpB,KAOIntD,EAAgB5I,KAChBp2B,EAA8BvzF,eAE9Bge,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACTmN,SAAU,GACV9iB,QAAS,GACTL,MAAOo4I,GACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf8kB,eAAgB,MAnBlB,EA6BEZ,aAAqBC,GANrB5lC,EAvBF,EAuBEA,aACAg4B,EAxBF,EAwBEA,cACA4O,GAzBF,EAyBEA,WACAW,GA1BF,EA0BEA,UACAK,GA3BF,EA2BEA,oBACAJ,GA5BF,EA4BEA,UAGE7gB,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,GAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,GACtB,EAYAiB,GACFliI,GACAA,EAAYqI,OACZssC,GACAA,EAAoB7rC,OAAS9I,EAAYqI,MAAMS,OAE7Ci8M,GAA2B5+N,uBAC7B,SAAC2a,GACG,IAAMg2H,EACD92H,GACGA,EAAYqI,MAAMjR,KAAI,SAAC46C,GAAD,OAClB9lC,OAAO8lC,EAAIp8C,QAEnB,GACJgL,EACIk2H,EACAh2H,EACAohI,MAGR,CACIliI,EACAkiI,GACAthI,IAWFokN,GAAiC7+N,uBAAY,WACzC6c,GAAaA,EAAQpN,KACG,OAA1Bk1F,QAA0B,IAA1BA,KAA6B,IAC7B+5H,EAAa7hN,EAAQpN,GAAI9B,MAE9B,CAACkP,EAAS8nF,EAA4B+5H,EAAc/wN,IAEjD69I,GACFrE,GACI,CACI9nJ,SAAgB,OAAPwd,QAAO,IAAPA,OAAA,EAAAA,EAASpN,KAAM,GAAG7P,WAC3BuB,gBAEJ,aALgC,OAMhC0Y,QANgC,IAMhCA,OANgC,EAMhCA,EAAawvC,MACbw1K,IAGFC,GAA2B9+N,uBAC7B,SAACiN,GACOgtE,EACAuxE,KAEAizE,EAA0BxxN,GAAequB,MAAK,kBAC1CujM,UAIZ,CACIrzE,GACAqzE,GACAJ,EACAxkJ,IASF2iE,GAAuB,SAACjpF,GAC1BhrB,GAAU,kBAAmBgrB,IAG3B81F,GAA6B,SAACpqJ,EAAgBiO,GAChDmN,EAAiC,IAAI,GAAO,GAC5CmN,EAAQH,KACJluB,IAAOiE,gBACFmC,QACG,UACAN,EAAOO,YAEVD,QACG,gBACA2N,EAAa1N,YAErB,CAAEm8H,WAAW,KAIf08E,IACDjqJ,GACAA,IAAwBA,EAAoB7rC,OAE3C5f,GAAU5B,EAAa4B,QACvBi5I,GAASlC,GAAW,YAAa/2I,GAASglC,IAE1Cs0G,GAAmBvC,GAAW,gBAAiB/2I,GAASglC,IACxD6wK,GAAa9+D,GAAW,WAAY/2I,GAASglC,IAC7Cg3L,GAAYjlF,GAAW,UAAW/2I,GAASglC,IAC3Ci3L,GAAgBllF,GAAW,WAAY/2I,GAASglC,IAChDk3L,GAAiBnlF,GAAW,gBAAiB/2I,GAASglC,IACtDm3L,GAAkBplF,GAAW,WAAY/2I,GAASglC,IAClDk0G,GAAYnC,GAAW,WAAY/2I,GAASglC,IAG5C04D,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,iBACK,UAAA74I,EAAa0kB,gBAAb,eAAuBlD,SAAU,KACjC,UAAAxhB,EAAaumC,sBAAb,eAA6B/kB,SAAU,KACvC,UAAAxhB,EAAam9D,uBAAb,eAA8B37C,SAAU,GAC7C4jF,YAAuB,OAAX1sF,QAAW,IAAXA,OAAA,EAAAA,EAAaqI,MAAMS,SAAU,IAGvC4mL,GAAiB,SAACxnM,GACpBymM,EAAoBzmM,IAElBynM,GAAe,SAACznM,GAClB0mM,EAAiB1mM,IAGf8K,GAAasJ,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAE/C07N,8BAAoBd,GAAM,WACtB,MAAO,CACHt1L,2BAWR,IAgBMq2L,GACFj5B,EAAcxjL,SACb,UAAAxhB,EAAa0kB,gBAAb,eAAuBlD,SAAU,KACrB,OAAZxhB,QAAY,IAAZA,GAAA,UAAAA,EAAcm9D,uBAAd,eAA+B37C,SAAU,GAgBxC08M,GAA0B,SAACh8M,GAC7Bi5F,EAA4B,CACxB7+D,WAAY,gBACZ/E,YAAa,4CACbkF,iBAAkB,UAClBD,kBAAmB,UACnBE,UAAW,kBAfgBz4C,EAegBie,QAd9C+vB,kBAAQhuC,IAAkB05N,GAAyB15N,IADtB,IAACA,GAgB3B24C,cAAe,CACX3e,QAAS,sBACTgf,kBAAmB,GACnBC,wBAAyB,OAsBrCgpJ,IAAiB,WACblmM,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,GACtB0iF,EAAsBr9N,KACvB,CAACq9N,EAAuBr9N,IAE3BmyB,qBAAU,WACFzZ,GAAeA,EAAYqI,OAC3Bq8M,EAAoB1kN,EAAYqI,MAAMS,UAE3C,CAAC47M,EAAqB1kN,EAAtB,OAAmCA,QAAnC,IAAmCA,OAAnC,EAAmCA,EAAaqI,QAEnDoR,qBAAU,YACFg4K,IAAkB,OAAIvkG,QAAJ,IAAIA,OAAJ,EAAIA,EAAe5kG,QACrC4mC,OAEL,CAACuiK,EAAD,OAAqBvkG,QAArB,IAAqBA,OAArB,EAAqBA,EAAe5kG,KAAM4mC,KAE7CzV,qBAAU,WACN,IAAMs0I,EAAgB/tJ,EAChBA,EAAYqI,MAAMjR,KAAI,SAAAlL,GAAU,OAAIggB,OAAOhgB,EAAW0J,OACtD,GACAm6L,EAAejjL,aACjB6nC,EACAo5G,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtClI,EAAiCmvL,GAAc,KAEpD,CAACp7I,EAAqB30C,EAAaY,IAEtC6Y,qBAAU,WACN,OAAO,kBAAM7Y,EAAiC,IAAI,GAAO,MAE1D,IAEH6Y,qBAAU,WACN7Y,EAAiC,IAAI,GAAO,KAC7C,CACCZ,EACA+N,EAAQE,SAASukC,SACjB5xC,IAGJ6Y,qBAAU,YAEiB,OAAnBk7B,QAAmB,IAAnBA,OAAA,EAAAA,EAAqB7rC,SACrB6rC,EAAoB7rC,UAApB,OAA+B9I,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAawvC,QAE5CmyF,GAAe,KAEpB,QAAC3hI,QAAD,IAACA,OAAD,EAACA,EAAawvC,MAAOmF,IAExBl7B,qBAAU,WACFuoH,IAAa,GACbpqI,YAAW,WACPi3B,GAAUozG,MACX,OAER,CAACA,GAAeD,GAAWnzG,KAE9BpV,qBAAU,WACNqV,GACI,iBACAw9J,EAAcxjL,OAAS,EAAIwjL,EAAgB,QAEhD,CAACA,EAAex9J,KAEnBrV,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB8oH,qBAChC,CAAC+d,IAoDJ,OACI,qCACKvnI,IAAYkmE,GAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAE0X,QAAF,IAAEA,OAAF,EAAEA,EAAaqI,MACnB8qF,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,aAAf,QAAwB,EAClCygB,aAAcgxE,GACd74C,aAtDK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IAsDMu/F,uBACI/gG,EAAa0B,WAAW8f,SAAxB,UACAxhB,EAAa0kB,gBADb,aACA,EAAuBlD,QAC3BzO,SAAU,uBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,6BAEd23F,8BACKytG,kBAAc9qJ,KACd8qJ,kBAAcz/L,GACnBiyF,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEvrB,QAAF,IAAEA,OAAF,EAAEA,EAAqB7rC,OACrCR,WAAU,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,MACzBygB,aAAcgxE,GACdluC,iBAAkB,WACdnyF,EAAiC,IAAI,GAAO,GAC5C+gI,GAAe,IAEnBjjH,YAAa,WACT,IAAMlV,EACDxJ,GACGA,EAAYqI,MAAMjR,KACd,SAACmS,GAAD,OACIA,EAAK3T,OAEhB,GACLgL,EACI4I,GACA,EACA04H,IAEJP,GAAe,IAEnB3uC,kBAAmB,CACfj5F,SAAU6kM,GACVhwG,2BAA4B,CACxBh0F,KAAgBuoD,qBAEpB0rC,yBA7LgB,WACpC,IACK4wG,kBAAa,OAACz/L,QAAD,IAACA,OAAD,EAACA,EAAaqI,SAC3Bo3L,kBAAc9qJ,GACjB,CACE,IAAMvhD,EAAa,OAAG4M,QAAH,IAAGA,OAAH,EAAGA,EAAaqI,MAC9BiB,QAAO,SAAA0oC,GAAG,cAAI2C,QAAJ,IAAIA,OAAJ,EAAIA,EAAqB9sC,SAASmqC,EAAIp8C,OAChDwB,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAEtBxC,GAAiBoyN,GAAwBpyN,KAsLzBgtE,YAAaA,EACb93D,WAAU,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAawvC,QAGjC2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIslK,iBAAkBA,EAClBC,cAAeA,EACfC,mBAAoBmD,GACpBlD,iBAAkBmD,GAClBj0D,eAAgB,kBAAM30G,KACtB40G,gBAAiBoH,GACjBtpG,QACKnyC,EAAam9D,iBACd,GAEJ3wD,aAAcA,KAGtBkyB,iBAAkB,IAhBtB,SAkBK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAc0qF,GACdxrN,SAAU6sF,GAAY45C,eACtBnmI,SAAS,8BAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAA0C,KAApB,OAAX8F,QAAW,IAAXA,GAAA,UAAAA,EAAaqI,aAAb,eAAoBS,QACpC+9E,iBAAkB,CACd7sF,KAAM82L,GACNpgM,KAAM,+BACN2J,SAAU,uBACVzF,MAAO,SAEXkyF,uBAAwB,CACpBh4C,WAAY,eACZz0C,SAAU,+BAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,UACM6zC,KACAA,EAAoB7rC,OAC1B/O,UACKiG,IAA0B,OAAXA,QAAW,IAAXA,GAAA,UAAAA,EAAaqI,aAAb,eAAoBS,QAAS,EACjD/H,SACgB,OAAXf,QAAW,IAAXA,OAAA,EAAAA,EAAawvC,QACVxvC,EAAYwvC,MAAQyxF,KACnB7gE,GACL8hE,KACA,EACJ/gE,YA5JU,SAAC/wB,GAC3B20K,GAAyB30K,EAAM5E,OAAO1qC,SACtC6gI,GAAe,IA2JCtnI,SAAU,gCAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,eACP1F,MAAO,IACJutI,IAJF,IAKDpoI,SAAU6sF,GAAY85C,eACtBrmI,SAAU,wBANT,2BASDC,MAAO,WACP1F,MAAO,GACJwtI,IAXF,IAYDroI,SAAU6sF,GAAY85C,eACtBrmI,SAAU,oBAbT,2BAgBDC,MAAO,WACP1F,MAAO,IACHd,EAAe,KAAOuxN,IAlBzB,IAmBDtrN,SAAU6sF,GAAY85C,eACtBt5E,aAAa,EACbC,YACI,+DACJhtD,SAAU,oBAvBT,2BA0BDC,MAAO,WACP1F,MAAO,IACHd,EAAe,KAAOqxN,IA5BzB,IA6BDprN,SAAU6sF,GAAY85C,eACtBt5E,aAAa,EACbC,YACI,gFACJhtD,SAAU,oBAjCT,2BAoCDC,MAAO,gBACP1F,MAAO,IACHd,EAAe,KAAOsxN,IAtCzB,IAuCDrrN,SAAU6sF,GAAY85C,eACtBt5E,aAAa,EACbC,YACI,oDACJhtD,SAAU,yBA3CT,2BA8CDC,MAAO,WACP1F,MAAO,IACJmqM,IAhDF,IAiDDhlM,SAAU6sF,GAAY85C,eACtBrmI,SAAU,oBAlDT,2BAqDDC,MAAO,UACP1F,MAAO,IACHd,EAAe,KAAOoxN,IAvDzB,IAwDDnrN,SAAU6sF,GAAY85C,eACtBrmI,SAAU,mBAzDT,2BA4DDC,MAAO,gBACP1F,MAAO,GACHd,EAAe,KAAO0uI,IA9DzB,IA+DDzoI,SAAU6sF,GAAY85C,eACtBrmI,SAAU,yBAEd,CACIzF,MAAO,IAGfixF,UAAW,CACPE,WA5ND,SAACivC,GAChB4a,GAA2B5a,EAAWpmI,KAAKgH,GAAIo/H,EAAWp/H,KA4N1CqwF,kBAzMM,SAAC71C,EAAY4kF,IA3ST,SAACx5G,EAAQw5G,GACnCx5G,EAAEC,kBACIu5G,EAAWp/H,IACb87L,EAAqC18D,EAAWp/H,IAySpD8tI,CAAsBtzF,EAAO4kF,GAC7B2M,GAAe,IAwMC37C,aArNM,SAACgvC,GAAD,QACpBrgF,KACAqgF,EAAW9oI,WAAW0J,IACxB++C,EAAoB9sC,SAASmtH,EAAWp/H,KAmNxByE,SAAU,wBAEVyrF,MAAO,CACH,CACIR,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAY9oI,WAAWtC,OAC7B27F,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACT8wC,GADS,cAERA,QAFQ,IAERA,OAFQ,EAERA,EAAY9oI,WAAWtC,MAC5ByQ,SAAU,0BAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAYv7F,UAClB8rD,WAAY,CACRrB,YAAa,SACT8wC,GADS,uBA1ZrB,SACpBgH,EACAviG,EACAstG,GAEA,IAAMvuD,EAAOwjD,IAAe+K,EAAc,cAAC,GAAD,IAAwB,KAQlE,OAPoBttG,EAChB,eAAC,GAAD,WACKvhB,aAAuBuhB,GACvB++C,KAEL,KAkZ4BitI,CACIzwF,EAAWgH,WACXhH,EAAWv7F,QACXu7F,EAAW+R,oBANN,QAOJ,IACT1sI,SAAU,8BAGlB,CACIirF,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvBz4C,wBAAyB,SACrBuvC,GADqB,OAGrB,cAAC,GAAD,CAAyB19H,YAAU,4BAAnC,SACMxD,EAeE,cAdA,cAAC,GAAD,UACI,cAAC,GAAD,CACI07C,MAAO5mC,KAAK87H,MAEJ,IADJ1P,EAAWC,UAGf5hF,IAAK,IACL0zF,YACI/R,EAAW+R,YAEf7+I,OAAQ8sI,EAAW9sI,eAS3C,CACIo9F,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAYgd,kBAClBzsD,WAAY,CACRH,gBAAgB,EAChBlB,YAAa,SACT8wC,GADS,OAGC,OAAVA,QAAU,IAAVA,OAAA,EAAAA,EAAYgd,kBAAZ,UACGppI,KAAKqpI,MACyB,IAA7Bjd,EAAWgd,iBAFf,MAIJ33I,SAAU,8BAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAYkd,eAClB3sD,WAAY,CACRrB,YAAa,SACT8wC,GADS,OAGTA,EAAWkd,cAAX,UACG1N,GACCxP,EAAWkd,gBAEnB73I,SAAU,mCAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAYmd,YAClB5sD,WAAY,CACRrB,YAAa,SACT8wC,GADS,OAERl9G,aAAU,OAACk9G,QAAD,IAACA,OAAD,EAACA,EAAYmd,YAC5B93I,SAAU,mCAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAY2Z,YAClBppD,WAAY,CACRrB,YAAa,SACT8wC,GADS,OAGTA,EAAW9sI,SACPwgD,KAAqB5U,SACzBhgC,EACM,GACAkhI,EAAW2Z,UACX72H,aAAWk9G,EAAW2Z,WACtB,IACVt0I,SAAU,iCAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQ+5D,qBACvB73E,oBAAqB,SACjB2uE,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAYod,iBAClB7sD,WAAY,CACRrB,YAAa,SACT8wC,GADS,OAERl9G,aAAU,OAACk9G,QAAD,IAACA,OAAD,EAACA,EAAYod,iBAC5B/3I,SAAU,mCAGlB,CACIirF,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvB34C,WAAY,CACRR,wBAAyB,SACrBiwC,GADqB,OAGrB,eAAC,GAAD,CACI/pB,YAAa,IACbU,YACK,OAACh3D,QAAD,IAACA,OAAD,EAACA,EAAqB7rC,QAE3BzO,SAAS,wBALb,UAOI,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBipH,8BAFxB,SAKI,cAAC,GAAD,CACItpH,QAAS,SAAAihB,GACLA,EAAEC,kBACFm0H,GACI5a,EAAWpmI,KAAKgH,GAChBo/H,EAAWp/H,KAGnByE,SAAS,0BARb,uCAaJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBipH,8BAFxB,SAKI,eAAC,GAAD,CACItpH,QAAS,SAAAihB,GACLA,EAAEC,kBAhtB/B,SAACu5G,GACpBrmH,YACIZ,EACAruB,IAAO6C,iBAAiBE,YAAYN,OAAO2D,QACvC,gBACAkvI,EAAW9oI,WAAW0J,GAAI7P,aA4sBc6mM,CACI53D,IAGR36H,SAAQ,UACJrH,GACM,OACA,OAHF,gBAPZ,UAaKA,GACK,OACA,OAAQ,IAflB,qBAoBuB,OAAxBgiI,EAAWC,YACTD,EAAW2Z,YACX76I,GACG,cAAC,GAAD,CACIyG,QAAS,SAAAihB,GAAM,IAAD,EACVspM,EAAY,WACR9vF,EAAWp/H,UADH,QAEJ,KAGZyE,SAAS,qBAPb,oBAYR,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgBuoD,qBAFxB,SAKI,cAAC,GAAD,CACIsU,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACF+pM,GACI,CAACxwF,EAAWp/H,MAGpByE,SAAS,uBARb,mDAyBnCqrN,GAAiCnxN,sBAAW,SAAC8B,EAAY7B,GAClE,OAAO,cAAC,GAAD,cAA6BgwN,KAAMhwN,GAAS6B,OAG1CsvN,GAIR,SAAC,GAAiD,IAAD,IAA9C7xN,EAA8C,EAA9CA,aAAc4wN,EAAgC,EAAhCA,oBAAqBF,EAAW,EAAXA,KACjCxhN,EAAUq6B,eACV33C,EAA6B00I,cAE7BrsH,EAAUW,cACV3Q,EAAU0R,YAAY3R,MACtB8nN,EAAqBptL,eACrBssL,EAAc7qL,eACdz0C,GAAgB,OAAPwd,QAAO,IAAPA,GAAA,UAAAA,EAAS1a,YAAT,mBAAesN,UAAf,eAAmB7P,aAAc,GAC1C+mG,EAAqB70D,aAAgCzyC,GACrDqgO,EAAuB3vL,aAAiC1wC,GAExDm/N,EAAwB73H,EACxBg5H,EAA8BvoL,eAC9BwoL,EAAiCt6K,aACnCk5K,GAGE/jN,EACF+3B,eACE+4J,EACF94J,eACEgsL,EAA4BvsL,eAC5B60D,EAAgBhkE,eAChB4hE,EACF1+C,eACE45K,EAAuBttL,eAEvButL,EAAgB3qM,iBAAY,MAelC,OAbAgqM,8BAAoBd,GAAM,WACtB,MAAO,CACH0B,yBAA0B,kCACtBD,EAAc//L,eADQ,aACtB,EAAuBgJ,2BAInCzV,qBAAU,WACN,OAAO,WACHusM,OAEL,CAACA,IAGA,cAACzB,GAAD,CACIvhN,QAASA,EAAQ1a,KACjB5C,OAAQA,EACRqoB,QAASA,EACThQ,QAASA,EACT4mN,sBAAuBoB,EACvBI,yBAA0BN,EAC1B7lN,YAAagD,EAAQhD,YACrB9F,QAAS8I,EAAQ9I,SAAW8I,EAAQkjG,mBACpCvxD,oBAAqB3xC,EAAQ2xC,oBAC7B88I,mBAAoBq0B,EAA4Bx9N,KAChDsY,iCAAkCA,EAClC8wL,qCACIA,EAEJ5mG,2BAA4BA,EAC5BoC,cAAeA,EACf03H,0BAA2BA,EAC3B9wN,aAAcA,EACd+wN,aAAce,EACdd,YAAaA,EACbtwN,IAAKyxN,EACLvB,oBAAqBA,KC5gCpBvpE,GAER,SAAC,GAAc,IAAZvsJ,EAAW,EAAXA,KACEg8B,EAAc9J,eACds6H,EAA6BhwI,eAC7BwlB,EAAUnhB,YAAYkhB,MACtBtR,EAAS1V,eACT0X,EAAgBnX,eAChB63H,EAAmBzwB,GAAa1gF,GAEhCyqH,EAAuBl1J,uBAAY,WACrC,GAAIyI,EAAM,CAAC,IAAD,IACAw3N,EAAa,6BACZx3N,GADY,IAEfjH,OAAM,iBACFiH,QADE,IACFA,GADE,UACFA,EAAMjH,cADJ,aACF,EAAcyP,KAAI,SAAC1M,GAAD,MAAsB,CAAEkL,GAAIlL,aAD5C,QAEF,KASR,OAN8B0wJ,EAC1B,CAACxsJ,EAAKgH,IACN,CACIyS,MAAO,CAAC+9M,KAHR16M,kBASZ,OAAO,OACR,CAAC9c,EAAMwsJ,IAEJE,EAAkBn1J,uBAAY,WAChC,IAAMo1J,EAAoBF,IAEA,OAAtBE,GACAl8H,EAAOk8H,KAEZ,CAACl8H,EAAQg8H,IA8BZ,OA5BA5hI,qBAAU,WACN6hI,MACD,CAACA,EAAiB1sJ,IAErB6qB,qBAAU,WACN6hI,MACD,CAACA,IAEJ7hI,qBAAU,WACN,GAAIsoH,EAAkB,CAClB1gH,IACAi6H,IAEA,IAAMC,EAAoBF,IAEA,OAAtBE,GACAl8H,EAAOk8H,MAGhB,CACCF,EACAtZ,EACAn3G,EAAYpgB,SACZ6U,EACAgC,EACAi6H,IAIA,cAAC,KAAD,CACIv8H,mBAAiB,EACjBE,UAAU,EACVD,YAAU,KCrDPw8H,GAvBV,SAAC,GAAmD,IAAjD6qE,EAAgD,EAAhDA,mBAAoB1+I,EAA4B,EAA5BA,sBAClBF,EAAiB93B,eACjB8rG,EAAkCjwF,eAWxC,OATA/xC,qBAAU,WACN,GAAIkuD,EAAuB,CACvB,IAAIQ,EAAgB,OAAGk+I,QAAH,IAAGA,IAAsB,GAC7C1+I,EAAsBQ,GACtBV,EAAeU,MAGpB,CAACszE,IAGA,cAAC,KAAD,CACIx8H,UAAU,EACVF,mBAAmB,EACnBC,YAAY,EACZ4B,wBAAwB,KCMrBm7H,GAxBV,SAAC,GAAmD,IAAjDntJ,EAAgD,EAAhDA,KAAM0nJ,EAA0C,EAA1CA,mBAAoB0F,EAAsB,EAAtBA,gBACxBC,EAAWpG,KAWjB,OATAp8H,qBAAU,WACN,GAAIuiI,EAAiB,CAAC,IAAD,EACXI,EAAgB,iBAAGxtJ,QAAH,IAAGA,OAAH,EAAGA,EAAM+/B,aAAT,QAAkB,GAExCstH,EAASG,MAGd,IAGC,cAAC,GAAD,CACI9F,mBAAoBA,EACpBr3H,UAAU,EACVF,mBAAmB,EACnBw4H,cAAc,EACdv4H,YAAY,EACZ4B,wBAAwB,KC1BvBlE,GAAYvmB,IAAOC,IAAV,gIAOTkvB,GAAUnvB,IAAOC,IAAV,6IAQP2gD,GAAkB5gD,IAAOC,IAAV,iJAQf2hJ,GAAiB5hJ,IAAOC,IAAV,iJAQdytE,GAAuB1tE,IAAOC,IAAV,iJAQpB+gD,GAAUhhD,IAAOC,IAAV,0JASPwtE,GAAkBztE,IAAOC,IAAV,uDCZfimJ,GAYR,SAAC,GAA6C,IAAD,gBAA1CztJ,EAA0C,EAA1CA,KAAMK,EAAoC,EAApCA,cAAeysI,EAAqB,EAArBA,eAAqB,EAClBpiH,oBAAS,GADS,mBACvCgjI,EADuC,KAC/BC,EAD+B,KAG5Bx9I,EAAmB+hB,eAA7BtW,SACFxH,EAAUq6B,eAEVsX,EAA4C,iBAC9C3xC,QAD8C,IAC9CA,GAD8C,UAC9CA,EAAS6sD,oBADqC,iBAC9C,EAAuB5gE,qBADuB,iBAC9C,EAAsC3G,YADQ,iBAC9C,EAA4C+f,aADE,aAC9C,EAAmDjR,KAAI,SAAAlL,GAAU,YAAK,CAClET,aAAY,UAAES,EAAW0J,UAAb,QAAmB,EAC/B6jC,SAAmB,OAAVvtC,QAAU,IAAVA,OAAA,EAAAA,EAAYutC,SACfviB,KAAMhrB,EAAWutC,SAASnhB,OAAOohB,MACjC,gBALoC,QAMvC,GAEO8tC,EAA6BvrB,eAAvCzxC,SACU6rI,EAAkB3kC,KAA5BlnG,SACFgyI,EAAmB/vI,eACnBi7D,EAA0Bpb,eAE1BowF,EAAkBd,KAnBsB,EAqB1CtiI,mBAAkCq7B,GArBQ,mBAoBvCyX,EApBuC,KAoBnBub,EApBmB,KAsBxC5pE,EAAU0R,YAAY3R,MAuC5B,OACI,eAAC,GAAD,WACI,eAAC,GAAD,aACOxB,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAC3BuS,aAAkB,OAAC4B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,SACjCwS,aAAkB,OAACxN,QAAD,IAACA,GAAD,UAACA,EAAMzE,YAAP,aAAC,EAAYP,OAC5B,cAAC8gC,GAAA,EAAD,CACIpwB,MAAO,QACPD,SAAS,4BAFb,SAII,cAAC,GAAD,UACI,cAAC,GAAD,CACIzL,KAAMA,EACNotJ,iBAAiB,EACjB1F,oBAAoB,QAKxC,cAAC5rH,GAAA,EAAD,CACIpwB,MAAO,eACPD,SAAS,mCAFb,SAII,cAAC,GAAD,UACI,cAAC,GAAD,CACIgsN,mBAAoB1xK,EACpBgzB,sBAAuBA,QAInC,cAACj9C,GAAA,EAAD,CACIpwB,MAAO,SACPD,SAAS,uBAFb,SAII,cAAC,GAAD,UACI,cAAC,GAAD,CAAczL,KAAMA,WAIhC,eAAC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,IAAD,CACIgL,MAAO,SACP5C,QAAS,UACTpG,OAAQ,kBAAM8qI,GAAe,IAC7B9mI,MAAO,QACPmF,SAAUuiJ,MAGlB,cAAC,IAAD,CACI1iJ,MAAO,QACPhJ,OAxFW,WAAO,IAAD,YACvB2a,EAAiBxM,EAAeuK,QAAO,SAAAtU,GAAC,OAAIA,EAAI,KAChD00I,EAAgB8S,EAAiBz9I,GAEjC46B,EAAuB+tC,EAAuB,OAChD1kE,QADgD,IAChDA,GADgD,UAChDA,EAAS6sD,oBADuC,iBAChD,EAAuB5gE,qBADyB,iBAChD,EAAsC3G,YADU,aAChD,EAA4C+f,MAC5Cm/D,EAAyBpwE,KACrB,SAAA8wE,GAAqB,OAAIA,EAAsBz8E,gBAEnD2gE,EAAmBh1D,KACf,SAAA8wE,GAAqB,OAAIA,EAAsBz8E,iBAV1B,EAaoBihE,aAAoC,OACjF1pD,QADiF,IACjFA,GADiF,UACjFA,EAAS6sD,oBADwE,iBACjF,EAAuB5gE,qBAD0D,iBACjF,EAAsC3G,YAD2C,aACjF,EAA4C+f,MAC5Cm/D,EACApb,GAHIO,EAbqB,EAarBA,iBAAkB7yB,EAbG,EAaHA,mBAKpB+hH,EAAgBxF,EAAc/sI,QAAO,SAAAtU,GAAC,OAAIA,EAAI,KAC9CsxN,GAAqB,OAAJ13N,QAAI,IAAJA,OAAA,EAAAA,EAAM+/B,MAAMv3B,KAAI,SAACxF,GAAD,OAAoBA,OAAW,GAChEkqJ,EAAeY,EAAgBrG,EAAeiwE,GACpD/pE,GAAU,GAEVttJ,EACIsc,EACAm+H,EACA/8E,EACAhzB,EACAkiH,EACAC,EACAhiH,GACFrY,MAAK,WACHi6G,IACA6gB,GAAU,OAwDF3nJ,MAAO,QACPsF,QAASoiJ,W,UCrGvB55B,GAAkBvsH,IAAOC,IAAV,4BAEfmwN,GAAwBpwN,IAAOC,IAAV,yGAMrBowN,GAA2BrwN,IAAOC,IAAV,0IAOxBgpI,GAAsBjpI,IAAOC,IAAV,4IAQnBqwN,GAAwBtwN,IAAOC,IAAV,4EAKrBswN,GAA0BvwN,IAAOC,IAAV,uFAKvBipI,GAAiBlpI,IAAOC,IAAV,6GAMdsgH,GAAWvgH,IAAOgoB,EAAV,oKAGD,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAMnC0kJ,GAAanpI,IAAOC,IAAV,sGACV,SAAAC,GAAK,QAAMA,EAAMkpI,QAAR,yCAGF,SAAAlpI,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAGnCikJ,GAAcrpI,IAAOC,IAAV,6FAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8rE,GAAUvwD,IAAOC,IAAV,4BAEPuwN,GAAoBxwN,IAAOC,IAAV,2OAajBupI,GAAqBxpI,IAAO0nB,KAAV,4FAGX,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOY,SAGnC2kJ,GAA+BzpI,IAAOC,IAAV,mOAMV,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOoE,2BAK9CupE,GAAuB7xD,IAAO0nB,KAAV,uMAMb,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAInC8iK,GAAyBvnJ,IAAOC,IAAV,sIAOtB0nJ,GAAyB3nJ,IAAOC,IAAV,iHAMtBqkI,GAAqBtkI,IAAOC,IAAV,qNAKV,SAAAC,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aACnC,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aACjC,SAAAub,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOO,aACnB,SAAAyb,GAAK,OACXA,EAAMC,KAAN,oBACmBD,EAAMI,MAAMpc,OAAOQ,YADtC,oBAEmBwb,EAAMI,MAAMpc,OAAOS,cAIxCi9D,GAAa5hD,IAAOC,IAAV,kPAUH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCgvC,GAAczzB,IAAOC,IAAV,kPAUJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCgsO,GAqBD,SAAC,GAgBC,IAAD,YAfF74M,EAeE,EAfFA,QACA/K,EAcE,EAdFA,QACAjF,EAaE,EAbFA,QACA8mN,EAYE,EAZFA,aACA3qN,EAWE,EAXFA,QACAxU,EAUE,EAVFA,OACAolG,EASE,EATFA,2BACAhnE,EAQE,EARFA,sBACA7b,EAOE,EAPFA,YACA2oB,EAME,EANFA,QACAwnJ,EAKE,EALFA,kCACAe,EAIE,EAJFA,yBACArlL,EAGE,EAHFA,aACAu5F,EAEE,EAFFA,cACA2wG,EACE,EADFA,gBACE,EACwC1kL,mBAAS,IAAIhD,MADrD,mBACK+mD,EADL,KACoBqkE,EADpB,OAE4CpoH,oBAAS,GAFrD,mBAEK02E,EAFL,KAEsBC,EAFtB,OAG8B32E,mBAC5BtW,GAAWA,EAAQhD,aAAegD,EAAQhD,YAAY8I,OAChD9F,EAAQhD,YAAY8I,OACpB,GAHD+9M,EAHP,sBAQgCvtM,oBAAS,GARzC,mBAQK4oG,EARL,KAQgB4kG,EARhB,KAUIC,EAA0B5uL,eAE1B7oB,EAAck5B,eAEdw+K,EAAsB7gO,uBAAY,WAChC6c,GAAWsM,EAAYzH,SAASjN,KAAgB2oD,eAChDx1C,EAAQH,KACJluB,IAAOmB,QAAQiF,QAAQ,UAAWkd,EAAQpN,GAAI7P,eAGvD,CAACgoB,EAAS/K,EAASsM,IAEhB23M,EAA6B,WAC/Bh3H,GAAmB,IAGjB9C,EAA2BhnG,uBAC7B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KACd,GAAIoZ,GAAWA,EAAQpN,GAAI,CACvB,IAAM6gC,EAA2B,CAC7BtlC,KAAM,SACNsC,aAAc,KACds0I,WAAY/kI,EAAQpN,GACpBlF,OACAD,cAEJutM,EAAgB,CAACvnK,GAAgBwwL,MAGzC,CAACjpB,EAAiBh7L,IAEhBm2B,IACA78B,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAC1BuS,aAAkB,OAAC4B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,SACrCwS,aAAkB,OAAC4G,QAAD,IAACA,GAAD,UAACA,EAAS7Y,YAAV,aAAC,EAAeP,MAEjC+jK,EAAiC,yCAAG,WACtCpiJ,EACAm+H,EACA14H,EACA2oB,EACAkiH,EACAC,EACAhiH,GAPsC,UAAA1xB,EAAA,yDASjC1iB,EAAOF,OAT0B,0CASX,GATW,gCAW/B0hO,EAA2BxhO,EAAOF,OAAQ2zC,EAAmB,CAChES,kBAAmBruB,EACnBsuB,gBAAiB6vG,EACjBlwG,sBAAuBxoB,EACvB2oB,qBAAsBA,EACtBN,gBAAiBwiH,EACjBviH,eAAgBwiH,EAChBqrE,6BAA4B,OAAEn2M,QAAF,IAAEA,OAAF,EAAEA,EAAqB5Z,KAC/C,SAAAgwN,GAAkB,MAAK,CACnB3zN,aAAc2zN,EAAmB37N,aACjCguC,QAAS2tL,EAAmB3tL,YAGpCK,uBAECrY,MAAK,WAEF,OADAxZ,EAAY,0BAA2B,YAChC,KAEV0Z,OAAM,WACH,OAAO,MA/BuB,2CAAH,kEAwCjC0lM,EAAsB,yCAAG,WAAOrgM,GAAP,UAAA5e,EAAA,sEACrB2+M,EAAwB/jN,EAASpN,GAAI7P,YAAY07B,MAAK,WACxDuF,OAFuB,mFAAH,sDAKtBsgM,EAAUhsM,iBAAY,MAEtBisM,EAAqBphO,uBAAY,WAAO,IAAD,EACzC,UAAAmhO,EAAQphM,eAAR,SAAiBggM,2BAEjBrB,EAAan/N,EAAOF,OAASsO,KAC9B,CAAC+wN,EAAcn/N,EAAOF,OAAQsO,IAEjC2lB,qBAAU,WACF/zB,EAAOF,QACPq/N,EAAan/N,EAAOF,OAAQsO,KAEjC,CAAC+wN,EAAcn/N,EAAOF,OAAQsO,IAEjC,IAAMozN,EAA6BruL,eAE7BlB,EAAgC,aAAb,OAAP30B,QAAO,IAAPA,OAAA,EAAAA,EAAS9a,QAErBo1E,GAAcn3E,uBAAY,WACxBT,EAAOF,SACPq/N,EAAan/N,EAAOF,OAAQsO,GAC5B4tI,EAAiB,IAAIprH,SAE1B,CAACuuM,EAAcn/N,EAAOF,OAAQsO,IAE3BuyH,GAAiB/qG,iBAAOsV,GAC9BnX,qBAAU,WACN4sG,GAAengG,QAAU0K,KAE7B,IAAM01F,GAAcD,GAAengG,QAmEnC,OAjEAzM,qBAAU,WACDmX,EAASh7B,IAAO0wH,GAAa1wH,IAC9Bg7B,EAASh7B,KAAO0wH,GAAa1wH,IAC7BmY,EAAQH,KAAKluB,IAAOkE,SAEzB,CAACgtC,EAAS01F,GAAav4G,IAE1B0L,qBAAU,WACN,GACIzW,GACAA,EAAQrb,QACRqb,EAAQrb,OAAOmhB,QACfsvK,GACA1yL,EAAOF,QACPwd,EAAQpN,KAAOjQ,SAASD,EAAOF,OAAOO,YACxC,CACE,IACMyhO,EADWnnM,aAAYrd,GAAWA,EAAQrb,QAAW,IAC9ByP,KAAI,SAACmS,GAAD,OAAeA,EAAK3T,MAC/CwuB,EAAWphB,EAAQrb,OAAOyP,KAAI,SAAAwC,GAAK,OAAIA,EAAMhE,MAC7C6xN,EAAqBD,EAAYpwN,KAAI,SAACxB,GAAD,OACvCwuB,EAASvc,SAASjS,GAAMA,GAAMA,KAElCwiL,EAAkCqvC,MAEvC,CAACzkN,EAASo1K,EAAmC1yL,EAAOF,SAEvDi0B,qBAAU,WAEF0/J,GACAA,EAAyBrwK,QACzBgb,GAEAA,EAAsBq1J,KAE3B,CAACr1J,EAAuBq1J,IAE3B1/J,qBAAU,WACN,GAAI3lB,GAAgBkP,GAAWA,EAAQhD,YAAa,CAChD,IAAMgR,EAAsBhO,EAAQhD,YAAY5I,KAC5C,SAAC46C,GAAD,OAAcA,EAAIp8C,MAGI,OAA1Bk1F,QAA0B,IAA1BA,KAA6B95E,MAElC,CAAChO,EAAS8nF,EAA4Bh3F,IAEzC2lB,qBAAU,WACN,OAAO,WACHqxE,GAA8BA,EAA2B,IACzDhnE,GAAyBA,EAAsB,IAC/Cs0J,GACIA,EAAkC,OAE3C,CACCttF,EACAhnE,EACAs0J,IAGJ3+J,qBAAU,WAAO,IAAD,EAEZqtM,KAAc,UAAC/4M,EAAQE,SAAShW,aAAlB,aAAC,EAAwBiqH,cAExC,IAGC,eAAC,GAAD,CACIzC,SAAS,eACTwC,UAAWviI,IAAOkE,MAClBs+H,UAAWA,EACXrtH,OAAO,OACP4vH,cAAa,uBACTzhH,EAAO,mBAAQA,QAAR,IAAQA,OAAR,EAAQA,EAAS8xB,UAAjB,mBAA8B9xB,QAA9B,IAA8BA,OAA9B,EAA8BA,EAASgyB,UAAa,GADlD,cAGb36B,SAAS,eARb,UAUI,cAAC,KAAD,CACIgjE,cAAeA,EACfC,YAAaA,GACbjjE,SAAS,2BAEZH,GAAW,cAAC,KAAD,IACZ,eAAC,GAAD,WACI,cAACssN,GAAD,UACI,eAACD,GAAD,WACI,eAACE,GAAD,WACI,cAAC,GAAD,UACI,cAAC/kL,GAAA,EAAD,CACI3jC,QACIiF,EAEJm+B,gBAAgB,MAChBa,UAAW,GACXC,WAAY,GACZR,gBAAiB,EACjBU,QAAQ,EACR9nC,SAAS,0BAGjB,eAAC,GAAD,WACK2I,EACG,cAAC,GAAD,CAAU1L,YAAU,oBAApB,SACKxD,EACK0I,aAAqBwG,GACrBzG,aAAcyG,KAGxB,cAACy3F,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,GACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,qBAKvBvL,EACG,eAAC,GAAD,CACIu8H,OAAQzrI,GAAgB6jC,EACxBrgC,YAAU,yBAFd,qCAIQ0L,QAJR,IAIQA,OAJR,EAIQA,EAAS8xB,iBAJjB,QAI8B,GAJ9B,6BAKQ9xB,QALR,IAKQA,OALR,EAKQA,EAASgyB,gBALjB,QAK6B,KAGjB,OAAPj3B,QAAO,IAAPA,OAAA,EAAAA,EAASnI,OAAT,OAAgBoN,QAAhB,IAAgBA,OAAhB,EAAgBA,EAASpN,KACtB,cAAC,GAAD,qBAKF+hC,GAAa7jC,IACX,cAAC,GAAD,UACI,cAAC,GAAD,CAAoBwD,YAAU,6BAA9B,uCAOZ,cAACmjG,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,IACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,qBAIxB,cAAC,GAAD,CAAajX,YAAU,qBAAvB,0BACK0L,QADL,IACKA,OADL,EACKA,EAAStc,aADd,QAEQ,cAAC+zG,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,IACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,6BAOpC,cAACm4M,GAAD,UACI,eAACC,GAAD,WACI,cAAC,GAAD,UACI,cAAC,GAAD,UACI,cAAC,KAAkBviJ,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,iBAHf,SAMI,cAAC,KAAuB28D,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,YACbC,MAAO,iBAHf,SAMI,cAAC+e,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACI20G,eAAgB,SACZgsF,GAEKA,GACDH,IAEJxgM,KAEJn4B,KAAMoU,EACN/T,cACI0+J,KAIZ9nI,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBP,gBAAiB,CACbM,SAAU,MACVC,WAAY,SAvBpB,SA0BK,SACG7xB,EADH,OAEKwyB,EAFL,EAEKA,YAAaL,EAFlB,EAEkBA,MAFlB,OAIG,eAAC,GAAD,CACInyB,IAAKA,EACL+F,QAAS,kBACL8sN,EACIrgM,IAGR1wB,KAAMqwB,EACNrvB,YAAU,sBARd,UAUI,cAAC,GAAD,wBAGA,cAAC,GAAD,UACKqvB,EACG,cAACivB,GAAA,EAAD,IAEA,cAACD,GAAA,EAAD,oBAWpC,cAAC,IAAD,CACI/gD,MAAM,QACNC,OAAO,OACPjE,OAAQo2N,EACRhwN,QAAQ,UACR+C,SAAUjG,GAAgB6jC,EAC1Bj+B,oBACItf,IAAUC,OAAOQ,WAErBwf,SAAS,gBATb,2BAaA,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQ,kBAAMq/F,GAAmB,IACjCv2F,oBACItf,IAAUC,OAAOQ,WAErBkf,SAAUjG,GAAgB6jC,EAC1Bt9B,SAAS,aARb,kCAgBhB,cAAC,KAAD,IACA,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB+hI,2BADlC,SAGI,cAAC,GAAD,UACK35H,IAAY9I,GACT,cAACwrN,GAAD,CACIlxN,IAAK8yN,EACL5C,oBAAqBmC,EACrB/yN,aAAcA,WAMjCk8F,GACG,cAACrsD,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACI10D,MAAK,mCACD0I,EAAUA,EAAQ8xB,UAAY,GAD7B,YAED9xB,EAAUA,EAAQgyB,SAAW,IACjCk6B,SAAUm+B,EACVp+B,OAAQk+B,EACRhnE,QAAS,kBAAM8pE,GAAmB,IAClC7vC,YAAY,wCAoErBunK,GA5D4C,SAAC,GAAc,IAChE7zN,EAAwB,eADuC,EAAX3C,KAGpD6R,EAAUq6B,eACVuoL,EAAqBptL,eACrB9yC,EAAS00I,cACTrsH,EAAUW,cAEVzW,EAAQ6oB,eACR8P,EAAUnhB,YAAYkhB,MACtBi3L,EAAenzK,eACfq2C,EACF1+C,eACEtoB,EAAwBD,eACxB5b,EAAcnQ,cAEdsgL,EACFl1J,eACEnlB,EAAU0R,YAAY3R,MACtBiiM,EAAgBxpK,eAEtB,OACI,cAAC,KAAkB6tC,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,aAAlD,SACI,cAACiuI,GAAiBrxE,SAAlB,CAA2BpoE,MAAO,CAAEwL,YAAa,aAAjD,SACI,cAAC,KAAuB48D,SAAxB,CACIpoE,MAAO,CAAEwL,YAAa,aAD1B,SAGI,cAAC,GAAD,CACIuG,QAASA,EACT/K,QAASA,EAAQ1a,KACjByV,QAASA,EACT8mN,aAAce,EACdlgO,OAAQA,EACRwU,QAAS8I,EAAQ9I,QACjB02B,QAASA,EACTrlB,eAAgBtT,EAAMsT,eACtByF,oBAAqB42M,EAAa52M,oBAClC85E,2BAA4BA,EAC5BhnE,sBAAuBA,EACvB7b,YAAaA,EACbmwK,kCACIA,EAEJe,yBACIlhL,EAAMkhL,yBAEVrlL,aAAcA,EACdu5F,cACMtvF,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVgpK,gBAAiB+B,WCprB1B8nB,GA1B4B,SAAC,GAMrC,IALQnnH,EAKT,EALFhb,UACAib,EAIE,EAJFA,WAGG9/E,GACD,EAHFgW,IAGE,EAFFh9B,SAEE,6DACF,OACI,cAAC,IAAD,6BACQgnB,GADR,IAEIqpE,OAAQ,SAAA7zF,GAAK,OAvBZ+7B,KAAQnrC,IAAI,SAyBL,cAAC,IAAD,CACI27C,GAAI,CACA4P,SAAUmuD,GAA0BjhH,IAAOqC,YAC3CkW,MAAO,CAAE0T,KAAMtV,EAAM4X,aAI7B,cAACyyF,EAAD,6BAAerqG,GAAWwqB,SCzB9C,SAASinM,GAAU13K,EAAiBxmD,EAAcm+N,GAC9C,MAAO,CACH33K,QACAxmD,OACAm+N,gB,SfnBIrH,K,gCAAAA,E,gCAAAA,E,gCAAAA,E,4CAAAA,E,4CAAAA,E,4CAAAA,E,kCAAAA,E,kCAAAA,E,kCAAAA,E,oCAAAA,E,oCAAAA,E,oCAAAA,E,oEAAAA,E,wCAAAA,E,wCAAAA,E,wCAAAA,E,0BAAAA,E,sCAAAA,E,sCAAAA,E,gCAAAA,E,sCAAAA,E,sCAAAA,E,sCAAAA,E,sCAAAA,E,4BAAAA,E,4BAAAA,E,4BAAAA,E,0BAAAA,E,gCAAAA,E,gCAAAA,E,gCAAAA,E,0BAAAA,E,gCAAAA,E,0BAAAA,E,0BAAAA,E,oDAAAA,E,8CAAAA,E,4CAAAA,E,4BAAAA,E,4CAAAA,E,4BAAAA,E,4BAAAA,E,4BAAAA,E,4DAAAA,E,4DAAAA,E,qDAAAA,Q,KeuBZ,IAsFYsH,GAtFNC,GAAa,CACfH,GAAUpH,GAASwH,eAAgB,kBAAkB,GACrDJ,GAAUpH,GAASyH,eAAgB,kBAAkB,GACrDL,GAAUpH,GAAS0H,eAAgB,kBAAkB,GACrDN,GAAUpH,GAAS2H,qBAAsB,wBAAwB,GACjEP,GAAUpH,GAAS4H,qBAAsB,wBAAwB,GACjER,GAAUpH,GAAS6H,qBAAsB,wBAAwB,GACjET,GAAUpH,GAASxkG,gBAAiB,mBACpC4rG,GAAUpH,GAASn5K,gBAAiB,mBACpCugL,GAAUpH,GAASp5K,gBAAiB,mBACpCwgL,GAAUpH,GAAS1kG,mBAAoB,sBACvC8rG,GAAUpH,GAASr6K,mBAAoB,sBACvCyhL,GAAUpH,GAASv6K,mBAAoB,sBACvC2hL,GAAUpH,GAAStkG,iBAAkB,oBACrC0rG,GAAUpH,GAASr4K,iBAAkB,oBACrCy/K,GAAUpH,GAASt4K,iBAAkB,oBACrC0/K,GAAUpH,GAAS8H,iCAAkC,oCACrDV,GAAUpH,GAAS3qK,YAAa,eAChC+xK,GAAUpH,GAASprM,kBAAmB,qBACtCwyM,GAAUpH,GAASjrM,kBAAmB,qBACtCqyM,GAAUpH,GAAStjB,YAAa,eAChC0qB,GAAUpH,GAASpkG,eAAgB,kBACnCwrG,GAAUpH,GAAS+H,eAAgB,kBACnCX,GAAUpH,GAASgI,eAAgB,kBACnCZ,GAAUpH,GAASiI,kBAAmB,qBACtCb,GAAUpH,GAASkI,kBAAmB,qBACtCd,GAAUpH,GAASmI,kBAAmB,qBACtCf,GAAUpH,GAASxC,kBAAmB,qBACtC4J,GAAUpH,GAASoI,aAAc,gBACjChB,GAAUpH,GAASqI,aAAc,gBACjCjB,GAAUpH,GAASsI,aAAc,gBACjClB,GAAUpH,GAASuI,eAAgB,kBACnCnB,GAAUpH,GAASlkG,YAAa,eAChCsrG,GAAUpH,GAASwI,YAAa,eAChCpB,GAAUpH,GAASyI,YAAa,eAChCrB,GAAUpH,GAAS0I,eAAgB,kBACnCtB,GAAUpH,GAAS2I,qBAAsB,wBACzCvB,GAAUpH,GAAS4I,yBAA0B,4BAC7CxB,GAAUpH,GAAS6I,sBAAuB,yBAC1CzB,GAAUpH,GAAS8I,aAAc,gBACjC1B,GAAUpH,GAAS+I,aAAc,gBACjC3B,GAAUpH,GAASgJ,aAAc,gBACjC5B,GAAUpH,GAASiJ,6BAA8B,+BACjD7B,GAAUpH,GAASkJ,qBAAsB,wBACzC9B,GAAUpH,GAASmJ,aAAc,gBACjC/B,GAAUpH,GAASoJ,6BAA8B,+BACjDhC,GAAUpH,GAASqJ,yBAA0B,6BAG3CC,GAAgB/B,GAAWz6M,QAAO,SAACnY,EAAQuI,GAE7C,OADAvI,EAAOuI,EAAKwyC,OAASxyC,EACdvI,IACR,IAMI,SAAS86C,GAAUC,GAA0B,IAAD,EAC/C,OAAO,UAAA45K,GAAc55K,UAAd,eAAsBxmD,OAAQwmD,EAGlC,SAAS65K,GACZr7N,GAEO,IADPs7N,IACM,yDACA70N,EAASzG,EAAI,UAAMA,EAAKkmC,UAAX,YAAwBlmC,EAAKomC,UAAa,GAC7D,OAAOk1L,EAAS,UAAM70N,EAAN,YAAgB80N,GAAUv7N,IAAUyG,EAGjD,SAAS80N,GAAUv7N,GACtB,OAAOA,EAAI,WAAOA,EAAKlI,MAAZ,KAAuB,GAG/B,SAASuuC,GAAYrE,GACxB,OAAc,OAAPA,QAAO,IAAPA,OAAA,EAAAA,EAAShnC,OAAQ,GAGrB,SAASwgO,GAAoBx5L,EAAuChiC,GAAqE,IAApCs7N,IAAmC,yDAC3I,MAAM,GAAN,OAAUj1L,GAAYrE,GAAtB,YAAkCq5L,GAASr7N,EAAMs7N,IAG9C,SAASG,GAAOj0M,GACnB,MAAM,MAAN,OAAaD,aAAWC,GAAM,GAA9B,YAAuC0B,aAAW1B,K,SAG1C4xM,K,0BAAAA,E,mCAAAA,Q,KAKZ,IAAMsC,IAAoB,sBACrBtC,GAAiBuC,YAAc,eADV,gBAErBvC,GAAiBwC,gBAAkB,mBAFd,IC7FnB,IClBK9rN,GDkBC+rN,GAER,SAAC,GAAkB,IDgGY75N,EChGrB4qB,EAAQ,EAAf40B,MACJ,OAAQ50B,EAAE40B,OACN,KAAKswK,GAASwH,eAEV,IAAMhzD,EAAkC15I,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,sBAEwB,IACnBvkJ,GAAYigI,GAHjB,IAGsBm1D,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAAS0H,eAEV,IAAMlzD,EAAkC15I,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,sBAEwB,IACnBvkJ,GAAYigI,GAHjB,IAGsBm1D,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAASyH,eAEV,IAAMjzD,EAAkC15I,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,sBAEwB,IACnBvkJ,GAAYigI,GAHjB,IAGsBm1D,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAAS2H,qBAEV,IAAMz5N,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,aAEej9K,aAAc3N,GAF7B,KAEsC,IACjCq7N,GAASr7N,GAHd,IAGsBy7N,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAAS6H,qBAEV,IAAM35N,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,aAEej9K,aAAc3N,GAF7B,KAEsC,IACjCq7N,GAASr7N,GAHd,IAGsBy7N,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAAS4H,qBAEV,IAAM15N,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,IACgCywC,GAASzuM,EAAEg+J,SAAU,IADrD,aAEej9K,aAAc3N,GAF7B,KAEsC,IACjCq7N,GAASr7N,GAHd,IAGsBy7N,GAAO7uM,EAAE22H,cAIvC,KAAKuuE,GAASxkG,gBAEV,IAAMl1E,EAAiCxrB,EAAElzB,KAAKuvC,QAE9C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,yBAEkC,OAARxyI,QAAQ,IAARA,OAAA,EAAAA,EAAU1sC,QAAS,GAAI,IAC5C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASp5K,gBAEV,IAAMN,EAAiCxrB,EAAElzB,KAAKuvC,QAE9C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,yBAEkC,OAARxyI,QAAQ,IAARA,OAAA,EAAAA,EAAU1sC,QAAS,GAAI,IAC5C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASn5K,gBAEV,IAAMP,EAAiCxrB,EAAElzB,KAAKuvC,QAE9C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,yBAEkC,OAARxyI,QAAQ,IAARA,OAAA,EAAAA,EAAU1sC,QAAS,GAAI,IAC5C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS1kG,mBAEV,IAAM9vH,EAAsCsvB,EAAElzB,KAAKuvC,QAEnD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,4BAEuC,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAAI,IAChDygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASv6K,mBAEV,IAAMj6C,EAAsCsvB,EAAElzB,KAAKuvC,QAEnD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,4BAEuC,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAAI,IAChDygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASr6K,mBAEV,IAAMn6C,EAAsCsvB,EAAElzB,KAAKuvC,QAEnD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,4BAEuC,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAAI,IAChDygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAStkG,iBAEV,IAAMt0E,EAAmCtsB,EAAElzB,KAAKuvC,QAEhD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0BAEoC,OAAT1xI,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IAC9C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASr4K,iBAEV,IAAMP,EAAmCtsB,EAAElzB,KAAKuvC,QAEhD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0BAEoC,OAAT1xI,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IAC9C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASt4K,iBAEV,IAAMN,EAAmCtsB,EAAElzB,KAAKuvC,QAEhD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0BAEoC,OAAT1xI,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IAC9C+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS8H,iCAEV,IAAM1gL,EAAmCtsB,EAAElzB,KAAKuvC,QAEhD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,4BAEsC,OAAT1xI,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IAChD+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS3qK,YAEV,IAAMnnD,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,WAEaywC,GAASr7N,GAAO,IACxBy7N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASprM,kBAEV,IAAM1mB,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0BAE4Bj9K,aAAc3N,GAF1C,MAEoDq7N,GAASr7N,GAAO,IAC/Dy7N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASjrM,kBAEV,IAAM7mB,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,2BAE6Bj9K,aAAc3N,GAF3C,MAEqDq7N,GAASr7N,GAAO,IAChEy7N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAStjB,YAEV,IAAMxuM,EAAkC4sB,EAAElzB,KAAKuvC,QAE/C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,aAEej9K,aAAc3N,GAF7B,MAEuCq7N,GAASr7N,GAAO,IAClDy7N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASpkG,eAEV,IAAMouG,EAAwClvM,EAAElzB,KAAKuvC,QAErD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,wBAEgC,OAAPkxC,QAAO,IAAPA,OAAA,EAAAA,EAAS9gO,OAAQ,GAAI,IACzCygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS+H,eAEV,IAAMiC,EAAwClvM,EAAElzB,KAAKuvC,QAErD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,wBAEgC,OAAPkxC,QAAO,IAAPA,OAAA,EAAAA,EAAS9gO,OAAQ,GAAI,IACzCygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASgI,eAEV,IAAMgC,EAAwClvM,EAAElzB,KAAKuvC,QAErD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,wBAEgC,OAAPkxC,QAAO,IAAPA,OAAA,EAAAA,EAAS9gO,OAAQ,GAAI,IACzCygO,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASiI,kBAEV,IAAMz8N,EAAsCsvB,EAAElzB,KAAKuvC,QAAQ3rC,WACrD47C,EAAmCtsB,EAAElzB,KAAKuvC,QAAQiQ,UAExD,OACI,qCACKvrC,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0CAEqD,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAF/D,oBAGyB,OAATk+C,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IACnC+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASkI,kBAEV,IAAM18N,EAAsCsvB,EAAElzB,KAAKuvC,QAAQ3rC,WACrD47C,EAAmCtsB,EAAElzB,KAAKuvC,QAAQiQ,UAExD,OACI,qCACKvrC,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0CAEqD,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAF/D,oBAGyB,OAATk+C,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IACnC+vN,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASmI,kBAEV,IAAM38N,EAAsCsvB,EAAElzB,KAAKuvC,QAAQ3rC,WACrD47C,EAAmCtsB,EAAElzB,KAAKuvC,QAAQiQ,UAExD,OACI,qCACKvrC,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,0CAEqD,OAAVttL,QAAU,IAAVA,OAAA,EAAAA,EAAYtC,OAAQ,GAF/D,oBAGyB,OAATk+C,QAAS,IAATA,OAAA,EAAAA,EAAWxtC,QAAS,GAAI,IACnC+vN,GAAO7uM,EAAE22H,cAQtB,KAAKuuE,GAASoI,aAEV,IAAM9d,EAAqCxvL,EAAElzB,KAAKuvC,QAElD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+CAE0D,OAAVwxB,QAAU,IAAVA,OAAA,EAAAA,EAAYp1M,KAAM,GAFlE,IAEuE,IAClEy0N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASqI,aAEV,IAAM/d,EAAqCxvL,EAAElzB,KAAKuvC,QAElD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+CAE0D,OAAVwxB,QAAU,IAAVA,OAAA,EAAAA,EAAYp1M,KAAM,GAFlE,IAEuE,IAClEy0N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASsI,aAEV,IAAMhe,EAAqCxvL,EAAElzB,KAAKuvC,QAElD,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+CAE0D,OAAVwxB,QAAU,IAAVA,OAAA,EAAAA,EAAYp1M,KAAM,GAFlE,IAEuE,IAClEy0N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASuI,eAEV,IAAM5+N,EAA4BmxB,EAAElzB,KAAKuvC,QAEzC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,YD7QoB5oL,EC+QavG,EAASg9B,ID9Q/CijM,GAAqB15N,IAAW,IC8QuBvG,EAASg9B,KAAO,IAAI,IACjEgjM,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASlkG,YAGV,IAAMlqE,EAAsB92B,EAAElzB,KAAKuvC,QACnC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,2BAEsBlnI,QAFtB,IAEsBA,OAFtB,EAEsBA,EAAG1oD,KAAM,IAC1BygO,IAAQ,OAAD/3K,QAAC,IAADA,OAAA,EAAAA,EAAG6/F,YAAa32H,EAAE22H,cAItC,KAAKuuE,GAASwI,YAGV,IAAM52K,EAAsB92B,EAAElzB,KAAKuvC,QACnC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,2BAEsBlnI,QAFtB,IAEsBA,OAFtB,EAEsBA,EAAG1oD,KAAM,IAC1BygO,IAAQ,OAAD/3K,QAAC,IAADA,OAAA,EAAAA,EAAG6/F,YAAa32H,EAAE22H,cAItC,KAAKuuE,GAASyI,YAGV,IAAM72K,EAAsB92B,EAAElzB,KAAKuvC,QACnC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,2BAEsBlnI,QAFtB,IAEsBA,OAFtB,EAEsBA,EAAG1oD,KAAM,IAC1BygO,IAAQ,OAAD/3K,QAAC,IAADA,OAAA,EAAAA,EAAG6/F,YAAa32H,EAAE22H,cAItC,KAAKuuE,GAAS0I,eAGV,IAAM92K,EAAsB92B,EAAElzB,KAAKuvC,QACnC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,8BAEyBlnI,QAFzB,IAEyBA,OAFzB,EAEyBA,EAAG1oD,KAAM,IAC7BygO,IAAQ,OAAD/3K,QAAC,IAADA,OAAA,EAAAA,EAAG6/F,YAAa32H,EAAE22H,cAItC,KAAKuuE,GAAS2I,qBAGV,IAAMsB,EAAiCnvM,EAAElzB,KAAKuvC,QAC9C,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,gCAE2BmxC,QAF3B,IAE2BA,OAF3B,EAE2BA,EAAInlO,OAF/B,gCAE6DmlO,QAF7D,IAE6DA,OAF7D,EAE6DA,EAAI/4N,OAAQ,IACpEy4N,IAAS,OAAFM,QAAE,IAAFA,OAAA,EAAAA,EAAIx4E,YAAa32H,EAAE22H,cAIvC,KAAKuuE,GAAS4I,yBAIV,OACI,qCACK/sN,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+BAEiC,IAC5B6wC,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS6I,sBAIV,OACI,qCACKhtN,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,8BAEgC,IAC3B6wC,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAAS8I,aAEV,IAAM/yN,EAA2B+kB,EAAElzB,KAAKuvC,QAExC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,sBAE4B,OAAL/iL,QAAK,IAALA,OAAA,EAAAA,EAAO6D,QAAS,GAAI,IACtC+vN,IAAY,OAAL5zN,QAAK,IAALA,OAAA,EAAAA,EAAO07I,YAAa32H,EAAE22H,cAI1C,KAAKuuE,GAAS+I,aAIV,OACI,qCACKltN,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,kBAEoB,IACf6wC,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASgJ,aAEV,IAAMjzN,EAA2B+kB,EAAElzB,KAAKuvC,QAExC,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,sBAE4B,OAAL/iL,QAAK,IAALA,OAAA,EAAAA,EAAO6D,QAAS,GAAI,IACtC+vN,IAAY,OAAL5zN,QAAK,IAALA,OAAA,EAAAA,EAAO07I,YAAa32H,EAAE22H,cAI1C,KAAKuuE,GAASiJ,6BAEV,IAAMiB,EAAoDpvM,EAAElzB,KAAKuvC,QAEjE,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+CAE0D,OAAVoxC,QAAU,IAAVA,OAAA,EAAAA,EAAYn/N,eAAgB,GAAI,IAC3E4+N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASkJ,qBAEV,IAAMgB,EAA+DpvM,EAAElzB,KAAKuvC,QAE5E,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,wCAEmD,OAAVoxC,QAAU,IAAVA,OAAA,EAAAA,EAAYC,UAAW,GAAI,IAC/DR,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASmJ,aAGV,OACI,qCACKttN,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,kBAEoB,IACf6wC,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASoJ,6BAEV,IAAMc,EAAoEpvM,EAAElzB,KAAKuvC,QAEjF,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,+CAE0D,OAAVoxC,QAAU,IAAVA,OAAA,EAAAA,EAAYn/N,eAAgB,GAAI,IAC3E4+N,GAAO7uM,EAAE22H,cAItB,KAAKuuE,GAASqJ,yBAEV,IAAMa,EAAmEpvM,EAAElzB,KAAKuvC,QAEhF,OACI,qCACKt7B,aAAcif,EAAEg+J,SADrB,SACqC4wC,GAAoB5uM,EAAEoV,QAASpV,EAAEg+J,SAAU,IADhF,4CAEuD,OAAVoxC,QAAU,IAAVA,OAAA,EAAAA,EAAYp+N,aAAc,GAAI,IACtE69N,GAAO7uM,EAAE22H,cAK1B,OAAO,mCAAGrqH,KAAKG,UAAUzM,EAAElzB,KAAKuvC,YCjiB7B,SAASizL,KACZ,MAAO,CACH35N,KAAMuN,GAAQqsN,sB,SA7BVrsN,K,4CAAAA,E,gDAAAA,E,gDAAAA,E,iDAAAA,Q,KCSL,I,GAAMssN,GAAuB,WAChC,IAAMxzN,EAAWO,cACXkzN,EAAgB/9N,eAChB+a,EAAcnQ,cACpB,OAAO3R,uBACH,SAACg4B,GACG3mB,EDPD,CACHrG,KAAMuN,GAAQwsN,oBCOVD,EAAc9sM,GACTsD,MAAK,SAAAn5B,GDJf,IAA2B6iO,ECKd3zN,GDLc2zN,ECKa7iO,EDJpC,CACH6I,KAAMuN,GAAQ0sN,oBACdD,aCISxpM,OAAM,SAAC5rB,GACJyB,EDDb,SAA2BzB,GAC9B,MAAO,CACH5E,KAAMuN,GAAQ2sN,oBACdt1N,SCFqBu1N,CAAkBv1N,EAAMgB,UACjCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUyzN,EAAehjN,KChBrBsjN,GAA2B12K,eCHjC,I,uFLoEgB22K,I,YKpEVC,IAAgC,SAAAp1N,GAAU,IAC3C5B,EAAuB4B,EAAvB5B,UAAW8F,EAAYlE,EAAZkE,QACnB,OACI,cAAC,IAAD,CAAM9F,UAAWA,EAAjB,SACI,cAAC,IAAD,CAAQG,MAAM,QAAQhE,OAAQ2J,EAASF,SAAS,eAAhD,6BAON0lD,IAAO5pD,IAAOC,IAAV,sDCAGs1N,IAAgBn3N,sBACzB,SAAC8B,EAAO7B,GAAS,IAET08C,EAKA76C,EALA66C,WACA56C,EAIAD,EAJAC,KAHQ,EAORD,EAHA0D,gBAJQ,WAOR1D,EAFAwkI,oBALQ,MAKO,EALP,EAMRxgI,EACAhE,EADAgE,SAGEmlH,EAAcr5H,uBAChB,kBAAO4T,GAAYm3C,MACnB,CAACn3C,EAAUm3C,IAGf,OACI,cAAC,GAAD,CACI18C,IAAKA,EACL8B,KAAMA,EACNyD,SAAUA,EACVQ,QAASilH,EACTloH,YAAW+C,EALf,SAOI,cAAC,KAAD,CAAST,MAAM,UAAUmpC,OAAO,cAAc1oC,SAAS,kBAAvD,SACI,eAAC,GAAD,WACI,cAAC,GAAD,CAAYN,SAAUA,EAAtB,SACI,cAAC,GAAD,MAEH8gI,EAAe,GACZ,cAACH,GAAD,UACI,cAACC,GAAD,CACIrjI,YACI+C,GAAQ,UAAOA,EAAP,0BCtCnCsxN,IAAkB,SAAwBt1N,GAAuB,IAClEyK,EAA6DzK,EAA7DyK,QAASlH,EAAoDvD,EAApDuD,MAAOoC,EAA6C3F,EAA7C2F,MAAO+E,EAAsC1K,EAAtC0K,QAAShH,EAA6B1D,EAA7B0D,SAAUS,EAAmBnE,EAAnBmE,KAAMkmB,EAAarqB,EAAbqqB,SAElDzE,EAAe91B,uBAAY,WACzBu6B,GACAA,EAAS1kB,KAEd,CAACA,EAAO0kB,IAEX,OACI,eAAC,IAAD,CAAMppB,YAAU,mCAAhB,UACI,cAAC2iB,GAAA,EAAD,CACInZ,QAASA,EACTC,QAASA,EACThH,SAAUA,EACVS,KAAMA,EACNyhB,aAAcA,EACd5hB,SAAS,yBAEb,cAAC,IAAD,CACIN,SAAUA,EACVQ,QAAS0hB,EACT3kB,YAAA,oBAHJ,SAKKsC,QAMXmmD,IAAO5pD,IAAOC,IAAV,iGAUJkhE,IAAQnhE,IAAOC,IAAV,mXACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAC3B,SAAA8a,GAAK,OAAKA,EAAM0D,SAAN,uBAMN,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BC/DpB6xN,IAAqBh5L,KCQrBi5L,IAAsB,SAAwBx1N,GAAuB,IAE1EgS,EAIAhS,EAJAgS,MAFyE,EAMzEhS,EAHAmE,YAHyE,MAGlE,GAHkE,EAIzEsxN,EAEAz1N,EAFAy1N,UACAprM,EACArqB,EADAqqB,SAGEqrM,EAAW33M,mBAAQ,kBAAM03M,EAAYzjN,EAAMiB,QAAO,SAAAgB,GAAC,OAAIA,EAAExJ,WAAW,KAAI,CAACgrN,EAAWzjN,IACpF2jN,EAAc53M,mBAAQ,kBAAM03M,EAAYzjN,EAAMiB,QAAO,SAAAgB,GAAC,OAAKA,EAAExJ,WAAW,KAAI,CAACgrN,EAAWzjN,IACxF4jN,EAAiB,SAAC1iN,GAAD,OACnB,cAAC,IAAD,CAEIzI,QAASyI,EAAKzI,QACdlH,MAAO2P,EAAK3P,MACZoC,MAAOuN,EAAKvN,MACZ+E,QAASwI,EAAKxI,QACdhH,SAAUwP,EAAKxP,SACfS,KAAMA,EACNkmB,SAAUA,GAPLqpC,OAAOxgD,EAAKvN,SAWzB,OAAI8vN,EAEI,cAAC,IAAD,CAAMx0N,YAAU,yBAAhB,SACI,eAAC40N,IAAD,CAAM50N,YAAU,+BAAhB,UACKy0N,EAAS30N,IAAI60N,KACXF,EAASjjN,QAAUijN,EAASjjN,OAAST,EAAMS,QAAU,cAAC8iN,IAAD,IACvDI,EAAY50N,IAAI60N,QAO7B,cAAC,IAAD,CAAM30N,YAAU,yBAAhB,SACI,cAAC40N,IAAD,CAAM50N,YAAU,+BAAhB,SACK+Q,EAAMjR,IAAI60N,QAcrBlsK,IAAO5pD,IAAOC,IAAV,sEAKJ81N,IAAO/1N,IAAO0nB,KAAV,4BC3DGsuM,IAAgC,SAAA91N,GAAU,IAC3C0D,EAAiC1D,EAAjC0D,SAAUtF,EAAuB4B,EAAvB5B,UAAW8F,EAAYlE,EAAZkE,QAC7B,OACI,cAAC,IAAD,CAAM9F,UAAWA,EAAjB,SACI,cAAC,IAAD,CACIsF,SAAUA,EACVnF,MAAM,QACNoC,QAAQ,UACRpG,OAAQ2J,EACRF,SAAS,eALb,sBAaN0lD,IAAO5pD,IAAOC,IAAV,sDChBGg2N,IAA6B,SAAA/1N,GAAU,IACxCiE,EAAgDjE,EAAhDiE,MAAO1F,EAAyCyB,EAAzCzB,MAAOwuC,EAAkC/sC,EAAlC+sC,UAAW/oC,EAAuBhE,EAAvBgE,SAAUR,EAAaxD,EAAbwD,SAC3C,OACI,cAAC6wB,GAAA,EAAD,CAAUpwB,MAAOA,EAAOD,SAAUA,EAAlC,SACI,cAAC,IAAD,CACIzF,MAAOA,EACPwuC,UAAWA,EACX9rC,YAAW+C,GAAQ,UAAOA,EAAP,SAHvB,SAKI,cAAC,IAAD,CAAS/C,YAAW+C,GAAQ,UAAOA,EAAP,YAA5B,SACKR,SAYfsyH,IAAOh2H,IAAOC,IAAV,+JAOJ,SAAAC,GAAK,QACDA,EAAMzB,OACRkpB,YADA,kEAEaznB,EAAMzB,UAGrB,SAAAyB,GAAK,QACDA,EAAM+sC,WACRtlB,YADA,uEAEkBznB,EAAM+sC,cAI1BsjB,IAAUvwD,IAAOC,IAAV,sHCxCAi2N,IAA4B,SAAAh2N,GAAU,IACvCi2N,EAA8Bj2N,EAA9Bi2N,UAAWpyN,EAAmB7D,EAAnB6D,QAAS4oK,EAAUzsK,EAAVysK,MAE5B,OAAI5oK,EAEI,cAAC,IAAD,UACI,cAAC,KAAD,MAMR,cAAC,IAAD,CAAM5C,YAAU,4BAAhB,SACI,eAACi1N,IAAD,WACI,cAAC,IAAD,CAAaj1N,YAAU,mBAAvB,SACKwrK,EAAQ,cAACxnH,GAAA,EAAD,IAAe,cAACj+B,GAAA,EAAD,MAE5B,cAACmvM,IAAD,CAAcl1N,YAAU,iBAAxB,SACU,aAASg1N,EAAdxpD,EAAK,yBAOpB/iH,IAAO5pD,IAAOC,IAAV,oLASJm2N,IAASp2N,IAAOC,IAAV,oIAONG,IAAcJ,IAAOC,IAAV,+GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInC2xO,IAAer2N,IAAOC,IAAV,0PACC,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cCnE5B4xO,IAA0B,SAAAp2N,GAAU,IACrCwD,EAAaxD,EAAbwD,SACR,OACI,cAAC,IAAD,UACKA,KAKPkmD,IAAO5pD,IAAOC,IAAV,0JCTGs2N,IAAuB,SAAAr2N,GAAU,IAClCwD,EAAaxD,EAAbwD,SACR,OACI,cAAC,IAAD,UACKA,KAKPkmD,IAAO5pD,IAAOC,IAAV,iHCDGu2N,IAAqB,SAACt2N,GAAkB,IAAD,EACwCA,EAAhF0D,gBADwC,WACwC1D,EAA9DwkI,oBADsB,MACP,EADO,EACJhhI,EAA4CxD,EAA5CwD,SADI,EACwCxD,EAAlCgE,gBADN,MACiB,mBADjB,EAGhD,OACI,cAACmsB,GAAA,EAAD,CACI1vB,QAAS+C,EACTgsB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IANtB,SAQK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC+kM,IAAD,CACIl3N,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcA,EACd9gI,SAAUA,EACVM,SAAUA,QC3BjBuyN,IAA4B,SAAAv2N,GAAU,IACvCwD,EAAaxD,EAAbwD,SACR,OACI,cAAC,IAAD,UACKA,KAKPkmD,IAAO5pD,IAAOC,IAAV,+ICFGy2N,IAAgC,SAAAx2N,GAAU,IAC3C0D,EAAuB1D,EAAvB0D,SAAU2mB,EAAarqB,EAAbqqB,SAClB,OACI,cAAC,IAAD,CAAMppB,YAAU,iCAAhB,SACI,cAAC,KAAD,CACIyC,SAAUA,EACV2mB,SAAUA,EACVrmB,SAAS,4BAMnB0lD,IAAO5pD,IAAOC,IAAV,0DCpBG02N,IAA2B,SAAAz2N,GAAU,IACtCwD,EAAaxD,EAAbwD,SACR,OAAO,cAAC,IAAD,UAAOA,KAGZkmD,IAAO5pD,IAAOC,IAAV,4ICEG22N,IAAsC,SAAA12N,GAAU,IACjD22N,EAAiC32N,EAAjC22N,mBAAoBC,EAAa52N,EAAb42N,SAC5B,OACI,cAAC,IAAD,CAAM31N,YAAU,mCAAhB,SACK01N,EAAqB,EAArB,UACQ1gB,GAAU0gB,EAAoBC,GADtC,0BAEWA,EAFX,iBAOPltK,IAAO5pD,IAAO0nB,KAAV,8FAGG,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aCjB5BsyO,IAAiC,SAAA72N,GAAU,IAC5C22N,EAAuB32N,EAAvB22N,mBACR,OACI,eAAC,IAAD,CAAM11N,YAAU,2BAAhB,UACK01N,EADL,gBAMFjtK,IAAO5pD,IAAO0nB,KAAV,uHAIG,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aCV5BuyO,IAAoC,SAAA92N,GAAU,IAEnD+2N,EAGA/2N,EAHA+2N,iBACArzN,EAEA1D,EAFA0D,SACAszN,EACAh3N,EADAg3N,iBAGEtrI,EAAe57F,uBACjB,YACS4T,GAAYszN,GACbA,IAAmBD,KAG3B,CAACrzN,EAAUqzN,EAAkBC,IAGjC,OACI,cAAC,IAAD,CACItzN,SAAUA,EACVuzN,SAAUF,EAAmB,WAAa,SAC1C7yN,QAASwnF,EACTzqF,YAAU,+BAJd,SAMK81N,EAAmB,eAAiB,gBAa3CG,IAA4C,CAC9CluM,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC8vO,SAAU,CACNr0N,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCqiE,IAAO5pD,IAAO0nB,KAAV,8RASJ,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,qHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,4EAMmByvM,IAAYl3N,EAAMi3N,UAAUn0N,UAItC,SAAA9C,GAAK,OAAIk3N,IAAYl3N,EAAMi3N,UAAUvvM,cAGrC,SAAA1nB,GAAK,OAAIk3N,IAAYl3N,EAAMi3N,UAAUtvM,eChEzCyvM,IAA8B,SAAAp3N,GAAU,IACzCq3N,EAA2Cr3N,EAA3Cq3N,eAAgBC,EAA2Bt3N,EAA3Bs3N,uBADwB,EAEIr0M,mBAAiB,IAFrB,mBAEzCs0M,EAFyC,KAErBC,EAFqB,KAI1CC,EAAuD15M,mBAAQ,WACjE,IAAM25M,EAAUH,EAAmBn+L,OAAOhzB,cAI1C,OAHuBsxN,EACjBC,IAAU1kN,QAAO,SAAAgB,GAAC,OAAIA,EAAE1gB,KAAK6S,cAAckR,QAAQogN,IAAY,KAC/DC,KACc52N,KAAI,SAAAmS,GAAI,MAAK,CAC7BzI,QAAS4sN,EAAe7lN,SAAS0B,EAAKvN,OACtCpC,MAAO2P,EAAK3f,KACZoS,MAAOuN,EAAKvN,YAEjB,CAAC0xN,EAAgBE,IAEdK,EAA6B75M,mBAC/B,kBACI45M,IACK1kN,QAAO,SAAAkS,GAAC,QAAMsyM,EAAkBp5L,MAAK,SAAAwgI,GAAC,OAAIA,EAAEl5J,QAAUwf,EAAExf,YACxD5E,KAAI,SAAAokB,GAAC,OAAIA,EAAExf,WACpB,CAAC8xN,IAGCI,EAAoB/nO,uBACtB,SAACgoO,GAAD,OAAwBR,EAAuBQ,KAC/C,CAACR,IAGCS,EAAkCjoO,uBACpC,SAACkoO,GAAD,OAA2BR,EAAsBQ,KACjD,CAACR,IAGCS,EAA4BnoO,uBAC9B,SAACiqD,GACG89K,EACIR,EAAe7lN,SAASuoC,GAClBs9K,EAAepkN,QAAO,SAAAqG,GAAC,OAAIA,IAAMygC,KADvC,uBAEUs9K,GAFV,CAE0Bt9K,OAGlC,CAACs9K,EAAgBQ,IAGfK,EAA6BpoO,uBAC/B,SAAAinO,GAAgB,OACZc,EAAkBd,EAAmB,GAAKa,KAC9C,CAACA,EAAgBC,IAGrB,OACI,qCACI,cAAC,IAAD,CACIxtM,SAAU0tM,IAEd,eAAC,IAAD,WACI,cAAC,IAAD,CACInB,SAAS,QACTD,mBAAoBU,EAAe5kN,SAEvC,cAAC,IAAD,CACIskN,iBACIM,EAAe5kN,SAAWmlN,EAAenlN,OAE7CukN,iBAAkBkB,OAG1B,cAAC,IAAD,CACIlmN,MAAOylN,EACPhC,WAAW,EACXprM,SAAU4tM,KAEZR,EAAkBhlN,QAAU,cAAC,IAAD,CAAgBwjN,UAAU,eAK9D0B,ItBlBK/F,GAAW3+M,QAAO,SAAAgB,GAAC,QAAMkhN,MAAqBlhN,EAAEy9M,eAAa3wN,KAAI,SAAAkT,GAAC,OAAIA,EAAE8lC,SsBkBxDh5C,KAAI,SAAAokB,GAAC,MAAK,CAAE5xB,KAAMumD,GAAU30B,GAAIxf,MAAOwf,MC3ErDgzM,IAA6B,SAAAn4N,GAAU,IACxC0kJ,EAAyC1kJ,EAAzC0kJ,cAAe0zE,EAA0Bp4N,EAA1Bo4N,sBACjBC,EAAc75M,eAF2B,E1fShB,WAC/B,IAAM5c,EAAQ++G,KAER98G,EAAUjC,EAAMiC,QAEhBy0N,EAAcv6M,mBAChB,kCAAMnc,EAAMk8C,YAAZ,aAAM,EAAY3mC,QACd,SAACnY,EAAQlL,GAEL,OADAkL,EAAOlL,EAAKP,MAAQO,EACbkL,IAEX,MAEJ,CAAC4C,EAAMk8C,OAGLy6K,EAAgBzoO,uBAClB,SAACuuB,GAAD,OAAsBi6M,EAAYj6M,KAClC,CAACi6M,IAGL,OAAOv6M,mBAAQ,iBAAO,CAClBla,UACA00N,mBACA,CACA10N,EACA00N,I0fhC+BC,GAA3B30N,EAHuC,EAGvCA,QAAS00N,EAH8B,EAG9BA,cAEXE,EAAW16M,mBACb,kBAAMla,EACA,GACA,CAAC60N,KAAMpzN,cAAeozN,KAAMtzN,cAAeszN,KAAMrzN,MAAMtE,KACrD,SAAAsd,GACI,IAAMvqB,EAAOykO,EAAcl6M,GAC3B,MAAO,CAEH9qB,KAAmB,KAAT,OAAJO,QAAI,IAAJA,OAAA,EAAAA,EAAMyL,IAAW,gBAAjB,OAAmCzL,QAAnC,IAAmCA,OAAnC,EAAmCA,EAAMmQ,MAC/C0B,MAAK,OAAE7R,QAAF,IAAEA,OAAF,EAAEA,EAAMyL,SAI7B,CAACsE,EAAS00N,IAGRI,EAAuD56M,mBACzD,kBAAM06M,EACDxlN,QAAO,SAAAqG,GAAC,OAAI++M,EAAY35M,YAAYpF,EAAE/lB,SACtCwN,KAAI,SAAAmS,GAAI,MAAK,CACVzI,QAASi6I,EAAclzI,SAAS0B,EAAKvN,OACrCpC,MAAO2P,EAAK3f,KACZoS,MAAOuN,EAAKvN,YAEpB,CAAC8yN,EAAU/zE,EAAe2zE,IAGxB1zE,EAAmB70J,uBACrB,SAAC8rK,GAAD,OAAuBw8D,EAAsBx8D,KAC7C,CAACw8D,IAGCQ,EAA2B9oO,uBAC7B,SAAC8pC,GACG+qH,EACID,EAAclzI,SAASooB,GACjB8qH,EAAczxI,QAAO,SAAAqG,GAAC,OAAIA,IAAMsgB,KADtC,uBAEU8qH,GAFV,CAEyB9qH,OAGjC,CAAC8qH,EAAeC,IAGpB,OACI,sCACM9gJ,GAA+B,IAApB40N,EAAShmN,SAClB,cAAC,IAAD,CACIwjN,UAAU,QACVpyN,QAASA,EACT4oK,MAA2B,IAApBgsD,EAAShmN,SAGxB,cAAC,IAAD,CACIT,MAAO2mN,EACPtuM,SAAUuuM,QCxDbC,IAAwB,SAAA74N,GAAU,IACnC47J,EAAmC57J,EAAnC47J,QAASk8D,EAA0B93N,EAA1B83N,OAAQgB,EAAkB94N,EAAlB84N,cADiB,EAEA71M,mBAAmB24I,GAAW,IAF9B,mBAEnClX,EAFmC,KAEpBC,EAFoB,OAGE1hI,mBAAqB60M,GAAU,IAHjC,mBAGnCT,EAHmC,KAGnBQ,EAHmB,KAIpC7xF,EAAuB0e,EAAcjyI,OAAS4kN,EAAe5kN,OAE7DsmN,EAAmBjpO,uBACrB,WACI60J,EAAiB,IACjBkzE,EAAkB,MAEtB,CAAClzE,EAAkBkzE,IAGjBmB,EAAyBlpO,uBAC3B,kBAAMgpO,EAAcp0E,EAAe2yE,KACnC,CAAC3yE,EAAe2yE,EAAgByB,IAGpC,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAiB70N,MAAM,QAAQ1F,MAAO,IAAtC,SACI,cAAC,IAAD,CACImmJ,cAAeA,EACf0zE,sBAAuBzzE,MAG/B,cAAC,IAAD,CAAiB1gJ,MAAM,SAAS1F,MAAO,IAAKwuC,UAAW,IAAvD,SACI,cAAC,IAAD,CACIsqL,eAAgBA,EAChBC,uBAAwBO,SAIpC,eAAC,IAAD,WACI,cAAC,IAAD,CAAqBlB,mBAAoB3wF,IACzC,cAAC,IAAD,CAAoBtiI,UAAWsiI,EAAsB9hI,QAAS60N,IAC9D,cAAC,IAAD,CAAoB70N,QAAS80N,WChC9BC,IA3BO/6N,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIF,IAAKA,EACLM,MAAM,6BACNF,MAAM,OACNH,UAAWA,EACXI,OAAO,OACPW,KAAK,eACLb,QAAQ,YAPZ,UASI,sBACIa,KAAK,eACLC,SAAS,UACTC,EAAE,mYACFojD,SAAS,YAEb,sBACItjD,KAAK,eACLE,EAAE,0HCpBT65N,IAAUp5N,IAAOC,IAAV,iHAGP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAI5Bm0O,IAAuBr5N,IAAOC,IAAV,yDAIpBq5N,IAAgBt5N,IAAOC,IAAV,wPAMR,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAMjCgpF,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClBy/E,YAAa,mBAGjB+R,oBAAqB,CACjB3lM,WAAY,QCadm+D,IAAKhyE,EAAQ,IAINy5M,IAOR,SAAC,GAAgE,IAAD,IAA7DxE,EAA6D,EAA7DA,KAAMv6L,EAAuD,EAAvDA,QAASg/L,EAA8C,EAA9CA,WAAYC,EAAkC,EAAlCA,UAAW31N,EAAuB,EAAvBA,QAASyzL,EAAc,EAAdA,QAC7CzgK,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,CAAEC,MAAO,YAAaC,KAAK,GACpCP,MAde,GAefC,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGbo7D,EAAUb,MAXiD,EAqB7Dr2C,aAAqBC,GAPrB5lC,EAd6D,EAc7DA,aACAg4B,EAf6D,EAe7DA,cACA4O,EAhB6D,EAgB7DA,WACAW,EAjB6D,EAiB7DA,UACAxB,EAlB6D,EAkB7DA,UACA0B,EAnB6D,EAmB7DA,iBACAD,EApB6D,EAoB7DA,UAIE7gB,EADUS,cACST,SACnB+zH,EAAYr8I,SAASuiG,IAAGngE,MAAM9Z,EAAShjB,QAAQu9F,MAC/Cy5C,EAAgBD,EACF,IAAdA,EACI,EArCS,IAsCRA,EAAY,GACjB,EA9B2D,EAgC3B1oH,mBAAc,MAhCa,mBAgC1DwrK,EAhC0D,KAgC7CC,EAhC6C,KAkCjEtrK,qBAAU,WACFk0K,GACAiiC,EAAWtoO,KAEhB,CAACqmM,EAASiiC,EAAYtoO,IAEzBmyB,qBAAU,WACFuoH,EAAY,EACZpqI,YAAW,WACPi3B,EAAUozG,KACX,KACkB,IAAdD,GACPpqI,YAAW,WACPi3B,EAAU,KACX,OAGR,CAACmzG,IAEJvoH,qBAAU,kBAAM,kBAAMo2M,OAAa,CAACA,IAEpC,IAAM3mO,EAAU5B,EAAa4B,QACvB4mO,EAAU7vF,GAAW,QAAS/2I,EAASglC,GACvC6hM,EAAc9vF,GAAW,YAAa/2I,EAASglC,GAC/C0tK,EAAS37D,GAAW,qBAAsB/2I,EAASglC,GACnD8hM,EAAY/vF,GAAW,oBAAqB/2I,EAASglC,GAErDigM,EAAUp/L,EAAiB,UAA2B,GACtDkjI,EAAWljI,EAAiB,mBAAkC,GAE9D0gK,EAAoB7B,GAAU,QAASvgK,GACvC4iM,EAAmBriC,GAAU,iBAAkBvgK,GAE/C6iM,EAAwB/pO,uBAC1B,SAACuP,GACGo5B,EAAU,YAAap5B,KAE3B,CAACo5B,IAGCqhM,EAAsBhqO,uBACxB,SAACuP,GAAD,OAAqBo5B,EAAU,UAAWp5B,KAC1C,CAACo5B,IAGCshM,EAAmBjqO,uBACrB,SAACiwB,GACG85M,EAAsB95M,EAAKmoE,OAC3B4xI,EAAoB/5M,EAAKooE,OAE7B,CAAC0xI,EAAuBC,IApFqC,EAuFnC72M,qBAvFmC,mBAuF1Due,EAvF0D,KAuFjDw5D,EAvFiD,KAwF3Dg/H,EAAoBlqO,uBACtB,SAACiqD,GAAD,OAAoBihD,GAAW,kBAAMjhD,EAAM9nD,MAAQ8nD,EAAM9nD,KAAKuvC,aAC9D,IAEEy4L,EAAqBnqO,uBACvB,kBAAMkrG,GAAW,iBACjB,IAEI+uC,EAAuB94I,EAAvB84I,UAAWC,EAAY/4I,EAAZ+4I,QAGbz5C,EADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,gBACOC,GAAeC,EAAU,EAAI,GAAK4xB,EAAQnpJ,OAASqlN,EAAOrlN,OACjE4jF,YAAgB,OAAJy+H,QAAI,IAAJA,OAAA,EAAAA,EAAM9iN,MAAMS,SAAU,IAvG2B,EA0GvBwQ,mBAAS,IAAIhD,MA1GU,mBA0G1D+mD,EA1G0D,KA0G3CqkE,GA1G2C,KA4G3DpkE,GAAcn3E,uBAAY,WAC5BypO,EAAWtoO,GACXo6I,GAAiB,IAAIprH,QACtB,CAACs5M,EAAYtoO,IAYhB,OACI,eAAC,GAAD,CACIm4H,SAAS,aACTgF,cAAa,qBACT7zF,EAAQhnC,KAAR,YAAoBgnC,EAAQhnC,MAAS,GAD5B,cAGbyQ,SAAS,OALb,UAOKH,GAAW,cAAC,KAAD,MACT29B,GACC,cAAC8L,GAAA,EAAD,CACIC,WAAW,gBACXK,SAAUqsL,EACVvsL,iBAAiB,QACjBG,cAAe,CAAEtvC,MAAO,IAAK6vC,oBAAoB,GAJrD,SAMI,cAAC8qL,IAAD,UAAUznM,KAAKG,UAAU4P,OAIjC,cAAC,gBAAD,CACI+uD,YAAaA,EACbt+F,KAAI,OAAE6iO,QAAF,IAAEA,OAAF,EAAEA,EAAM9iN,MACZirF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,kBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAE6iN,QAAF,IAAEA,OAAF,EAAEA,EAAM7iN,kBAAR,QAAsB,EAChC2nD,aAnKD,GAoKCm4B,aApCK,SAACv/F,EAAeC,GACrC+lC,EAAU/lC,IAoCMu/F,uBACI/gG,EAAa0B,WAAW8f,SAAxB,UACAxhB,EAAauX,eADb,aACA,EAAsBiK,WACpBxhB,EAAa84I,aACb94I,EAAa+4I,QACnBhmI,SAAU,eAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,EAAY65C,cACnCpmI,SAAU,eAEd83F,cAAe,CACXU,gBACI,cAAC,IAAD,CACI94F,SAAU6sF,EAAY45C,eACtB3F,aAAco3B,EAAQnpJ,OAASqlN,EAAOrlN,OACtCzO,SAAS,eAHb,SAKK,gBAAG0sB,EAAH,EAAGA,KAAH,OACG,cAAC,IAAD,CACIkrI,QAASA,EACTk8D,OAAQA,EACRgB,cAAe,SACXp0E,EACA2yE,GAEAuC,EAAiBl1E,GACjB00C,EAAkBi+B,GAClB3mM,WAOxBqrE,sBAAuB,CACnBU,mBAAoB,CAChB92F,MAAO,CACHuiF,MAAO6hD,EAAY,IAAI9pH,KAAK8pH,GAAa,KACzC5hD,IAAK6hD,EAAU,IAAI/pH,KAAK+pH,GAAW,MAEvCniD,aAAa,EACbx9D,SAAU0vM,EACVhyI,gBAAgB,EAChBrkF,SACI6sF,EAAYpmE,iBACXl5B,EAAa84I,YACb94I,EAAa+4I,QAClBhmI,SAAU,kBAGlB6pC,cAAe,CACXquD,cAAepuB,EAAQurJ,sBAG/BloI,8BAA+B,CAC3BE,sBAAsB,EACtBb,iBAAkB,CACd7sF,KAAMsnL,GACN5wL,KAAM,cACN2J,SAAU,WAEdysF,uBAAwB,CACpBh4C,WAAY,aACZz0C,SAAU,iBAEd0sF,uBAAwB,CACpB/sF,KAAMs1N,IACN9pK,aAAc,sBACdnrD,SAAU,qBAGlBm5F,eAAgB,CACZpQ,QAAS,CAAC,2BAEF9oF,MAAO,SACP1F,MAAO,IACJk7N,GAJF,IAKD/1N,SAAU6sF,EAAY85C,eACtBjsI,UAAW0vE,EAAQ+5D,qBACnB7jI,SAAU,gBAPT,2BAUDC,MAAO,UACP1F,MAAO,IACJo7N,GAZF,IAaDj2N,SAAU6sF,EAAY85C,eACtBrmI,SAAU,mBAdT,2BAiBDC,MAAO,OACP1F,MAAO,IACJgnM,GAnBF,IAoBD7hM,SAAU6sF,EAAY85C,eACtBrmI,SAAU,gBArBT,2BAwBDC,MAAO,eACP1F,MAAO,IACJm7N,GA1BF,IA2BDh2N,SAAU6sF,EAAY85C,eACtBrmI,SAAU,gBAEd,CACIC,MAAO,UACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAU,mBAIlBwrF,UAAW,CACPxrF,SAAU,WACVyrF,MAAO,CACH,CACIR,UAAW,aACXj/B,oBAAqB,SAAC+6D,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAKhxE,QACVm1C,WAAY,CACRrB,YAAa,SAACk9B,GAAD,OACTjxE,GAAS,OAACixE,QAAD,IAACA,OAAD,EAACA,EAAKhxE,QACnB/1C,SAAU,kBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC+6D,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAKo4D,UACVj0F,WAAY,CACRrB,YAAa,SAACk9B,GAAD,OACT6oG,GAAQ,OAAC7oG,QAAD,IAACA,OAAD,EAACA,EAAKo4D,UAClBn/K,SAAU,qBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC+6D,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAKo4D,UACVj0F,WAAY,CACRrB,YAAa,SAACk9B,GAAD,OACT7kH,aAAa,OAAC6kH,QAAD,IAACA,OAAD,EAACA,EAAKo4D,UACvBn/K,SAAU,kBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC+6D,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAK+wB,YACV5sD,WAAY,CACRrB,YAAa,SAACk9B,GAAD,OACTtpG,aAAU,OAACspG,QAAD,IAACA,OAAD,EAACA,EAAK+wB,YACpB93I,SAAU,kBAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SAAC+6D,GAAD,QAAkB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAKxrH,KAC7C6vF,wBAAyB,SAAC27B,GAAD,OACrB,eAACouG,IAAD,CACIe,aAAc,WACVxrC,EAAe3jE,EAAIxrH,KAEvB46N,aAAc,WACVzrC,EAAe,OAEnBO,YAAa,WACTP,EAAe,OARvB,UAWI,cAAC78H,GAAA,EAAD,CAAwB7tD,SAAS,6BAAjC,SACI,cAAC,GAAD,CAAS+1C,MAAOgxE,MAEpB,cAACnwE,GAAA,EAAD,CACI36C,KAAMwuL,IAAgB1jE,EAAIxrH,GAC1Bs7C,WAAY6zI,EAFhB,SAII,cAAC0qC,IAAD,CAAen4N,YAAU,mBAAzB,SACI,cAAC,GAAD,CAAS84C,MAAOgxE,aAMpC,CACI97B,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAACq8B,GAAD,OACrB,cAAC,KAAD,CACI9xG,YAAa,CACT1U,KAAgB61N,kBAFxB,SAKI,cAAC,IAAD,CACIrgL,MAAOgxE,EACPsvG,cACIL,kBA6CrCM,IA9ByB,WACpC,IAAMn5N,EAAWO,cACX64N,EvB3ZCnhN,YAAY1U,qBAAWwwN,KuB4ZxB36L,EAAUnhB,YAAYkhB,MACtBg9J,EAAUJ,KACVqiC,EAAa5E,KACb6F,EAAoB1qO,uBACtB,SAACmB,IACG,OAAIspC,QAAJ,IAAIA,OAAJ,EAAIA,EAASh7B,KACTg6N,EAuBhB,SACItoO,EACAoC,GAEA,OAAO,6BACApC,GADP,IAEIuX,QAAQ,CACJ,CAAE1V,MAAO,YAAa6S,MAAOtS,IAD1B,oBAECpC,EAAauX,SAAW,OA/BbiyN,CAAiBxpO,EAAcspC,EAAQh7B,OAG1D,CAACg6N,EAAD,OAAah/L,QAAb,IAAaA,OAAb,EAAaA,EAASh7B,KAEpBm7N,EAA6BtlL,aAAmBolL,GAChDG,EAAgB7qO,uBAAY,kBAAMqR,EAASszN,QAAsB,CACnEtzN,IAEJ,OACI,cAAC,IAAD,CACI2zN,KAAMyF,EAAUtoO,KAChBsoC,QAASA,EACTg/L,WAAYmB,EACZlB,UAAWmB,EACX92N,QAAS02N,EAAU12N,QACnByzL,QAASA,KAoBrB,I,gDAAMsjC,IAGD,SAAC,GAA8B,IAA5B7gL,EAA2B,EAA3BA,MAAOsgL,EAAoB,EAApBA,cACLlxG,EAAcr5H,uBAAY,kBAAMuqO,EAActgL,KAAQ,CACxDA,EACAsgL,IAEJ,OACI,cAAC,GAAD,CAAcr2N,SAAS,gBAAvB,SACI,cAAC,GAAD,CAAYE,QAASilH,EAAanlH,SAAS,qBAA3C,wB,WC7dCowB,IAAQt0B,IAAOC,IAAV,wMAULwlG,IAAYzlG,IAAOi0C,IAAV,iJASTyxD,IAAc1lG,IAAOC,IAAV,4JAQX86N,IAAwB/6N,IAAOC,IAAV,0EAKrB+6N,IAAgBh7N,IAAOC,IAAV,+KASbg7N,IAAYj7N,IAAOC,IAAV,gEAITwtE,IAAkBztE,IAAOC,IAAV,0EC8Gbi7N,IArIW,WACtB,IAAMtjN,EAAUW,cACV4iN,EAAexqO,eAFO,EAGYwyB,mBAAwB,MAHpC,mBAGrBwgF,EAHqB,KAGP2C,EAHO,OAIwBnjF,oBAAS,GAJjC,mBAIrBi4M,EAJqB,KAIDC,EAJC,OAKYl4M,mBAAiB,IAL7B,mBAKrBm4M,EALqB,KAKPC,EALO,OAMMp4M,oBAAkB,GANxB,mBAMrB2iF,EANqB,KAMVO,EANU,KAQ5B/8D,YAAiB,6BAQjB,IAUMkyL,EAAkBxrO,uBAAY,SAAC4P,GACjC,OAAQA,EAAMrG,MACV,KAAK,IACD,MCrDuB,8HDsD3B,KAAK,IACD,MCtDyB,mCDuD7B,QACI,OAAOqG,EAAMgB,WAEtB,IAOG66N,EAAiBzrO,uBAAY,WAC/Bq2G,GAAa,GACb80H,EAAaG,GACRhwM,MAAK,SAACgT,GACH+nE,GAAa,GACbzuF,EAAQH,KACJluB,IAAOE,WAAWK,qBAAqB6F,QACnC,eACA2rO,EAAa1rO,gBAIxB47B,OAAM,SAAC5rB,GACJy7N,GAAsB,GACtBh1H,GAAa,GACbC,EAAgBk1H,EAAgB57N,SAEzC,CAAC07N,EAAc1jN,EAASujN,EAAcK,IAOnCE,EAAkB1rO,uBAAY,WAChC4nB,EAAQH,KAAKluB,IAAOE,WAAWC,SAChC,CAACkuB,IAEJ,OACI,eAAConF,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAW/vC,IAAK2hG,EAAgB7hG,QAASs3N,IAD7C,+BAIA,cAAC,IAAD,sJAKA,cAACX,IAAD,UACI,cAAC,MAAD,CACIl1N,MAAOy1N,EACP/wM,SApEiB,SAAC1kB,GAC9B01N,EAAgB11N,GAChBygG,EAAgB,OAmEJ5nG,OAAO,OACPiE,SAAS,OACTopD,WAAW,EACXztD,UAAU,uBACVmF,MAAM,GACNooD,iBAAkB83C,MAG1B,cAACq3H,IAAD,UACOr3H,EACC,cAACs3H,IAAD,UAAYt3H,IAEZ,kGAGR,cAAC,IAAD,UACI,cAAC,IAAD,CACIjlG,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZV,SAAU,GACViB,UAAW03N,GAAgBA,EAAa3oN,OAAS,EACjD5O,QAAS+hG,EACT9qG,KAAK,SACLP,OAAQghO,EARZ,yBAaHL,GACG,cAAC,IAAD,UACI,cAAC,IAAD,CACI18N,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZV,SAAU,GACV3H,KAAK,SACLP,OAAQihO,EACR76N,QAAQ,UAPZ,qCErIP0lB,IAAYvmB,IAAOC,IAAV,oIAOTmkB,IAAQpkB,IAAO+zB,MAAV,0IAGN,SAAA7zB,GAAK,qBACDA,EAAMy7N,YADL,8BACsCz7N,EAAMy7N,YAD5C,QAGJ,SAAAz7N,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UACnC,SAAA50C,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAGrCi1D,IAAO/pG,IAAOC,IAAV,oYAMJ,SAAAC,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UACnC,SAAA50C,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAGjC,SAAA50C,GAAK,OAAKA,EAAM40C,SAAW,OAAS,UAQvC,SAAA50C,GAAK,OAAKA,EAAM40C,SAAW,QAAU,WACtC,SAAA50C,GAAK,OACVA,EAAM8zB,UAAY9zB,EAAM8zB,UAAY9zB,EAAMI,MAAMpc,OAAOC,SACvC,SAAA+b,GAAK,OACrBA,EAAMJ,gBACAI,EAAMJ,gBACNI,EAAMI,MAAMpc,OAAOiB,WAC3B,SAAA+a,GAAK,QACDA,EAAMumH,WAAR,sCAC+BvmH,EAAMI,MAAMpc,OAAOQ,WADlD,QAaD,I,wCAAMk3O,IAAmB57N,IAAO0nB,KAAV,wEAR7B,WACI,OAAOm0M,YAAP,sFAWEC,IACS,EADTA,IAIM,GAiOGC,IArNe,SAAC,GAOjB,IAAD,IANTppN,cAMS,MANA,EAMA,EALT4X,EAKS,EALTA,SAKS,IAJT0/B,mBAIS,MAJK,GAIL,EAHF+xK,EAGE,EAHTn2N,MACA/F,EAES,EAFTA,gBACAk0B,EACS,EADTA,UAEMioM,EAAa,IAAIl7N,MAAM4R,GAAQtT,KAAK4qD,GADjC,EAG6B9mC,mBAAiB,GAH9C,mBAGFw4M,EAHE,KAGWO,EAHX,OAIiB/4M,mBACtB64M,EAASA,EAAOn/K,MAAM,IAAMo/K,GALvB,mBAIFp2N,EAJE,KAIKwkD,EAJL,KASHvV,EADmBC,eACSt2C,MAAQxa,IAAU2E,YAAYG,QAE1DozO,EAAeh5F,sBACfi5F,EAAWn+M,mBACb,kBACI,IAAIld,MAAM4R,GACLtT,KAAK,MACL4B,KAAI,kBAAMkiI,2BACnB,CAACxwH,IAGC0pN,EAAc,IAAIjjM,OAAJ,iBAAqBzmB,EAArB,OAKd2pN,EAAkBtsO,uBACpB,SAACkR,GAAuC,IAAxBzG,EAAuB,uDAAT,KACpB8hO,EAAmBH,EAAWA,EAASl7N,GAAO6uB,QAAU,KAE9D,OADAt1B,GAAU8hO,GAAeA,EAAY9hO,KAC9B8hO,IAEX,CAACH,IAGCI,EAAY,SAACt7N,GACfo7N,EAAgBp7N,EAAO,UAErBu7N,EAAW,SAACv7N,GACdo7N,EAAgBp7N,EAAO,SAGrBw7N,EAAc,SAACx7N,GAAD,OAAmB,WACnCg7N,EAAeh7N,GACXi7N,EAAapsM,SAASosM,EAAapsM,QAAQs8B,UAiHnD,OAzCA/oC,qBAAU,WACc,IAAhBq4M,GACAW,EAAgB,EAAG,WAExB,CAACX,EAAaW,IAGjBh5M,qBAAU,WACN,IAAMq5M,EAAYR,EAAapsM,QAC/B,GAAK4sM,EAAL,CAEA,IAAMC,EAAU,SAACv3M,GACbA,EAAEkmJ,iBAEF,IAAMsxD,EAAex3M,EAAEy3M,cACjBz3M,EAAEy3M,cAAcC,QAAQ,QACxB,GACDF,KAEa9mN,OAAOgtM,OAAO8Z,IAClBxyK,EAASwyK,EAAahgL,MAAM,OAI9C,OADA8/K,EAAUniL,iBAAiB,QAASoiL,GAC7B,kBAAMD,EAAUhiL,oBAAoB,QAASiiL,OACrD,CAACT,IAEJ74M,qBAAU,WACNiH,EAAS1kB,EAAM3S,KAAK,OACrB,CAAC2S,EAAO0kB,IAEXjH,qBAAU,WACgB,kBAAX04M,IAGI,KAAXA,GAAiBn2N,EAAM3S,KAAK,MAAQ+oO,EAAW/oO,KAAK,KAGpD8oO,IAAWn2N,EAAM3S,KAAK,KAAKm3D,EAAS2xK,EAAOn/K,MAAM,QACtD,CAACm/K,EAAQC,EAAYp2N,IAGpB,mCACI,cAACi1C,GAAA,EAAD,CAAkB36C,MAAM,EAAM46C,WAAY,kBAAMmhL,GAAgB,IAAhE,SACI,eAAC,IAAD,CACI59N,UAAU,wCAEVi4F,WAAY5jF,EAHhB,UAKI,cAAC,IAAD,CACItU,IAAK89N,EACL5wK,aAAczW,EAAW,gBAAkB,MAC3C95C,KAAK,OACLgiO,UAAU,UACVv9N,GAAG,gBAIH8qB,SA3EE,SAAClF,GAA4C,IAChD43M,EAAgB53M,EAAEgwB,OAAzBxvC,MACOw2N,EAAY9iM,KAAK0jM,KAIhC5yK,EAAS4yK,EAAYpgL,MAAM,KAC3B4/K,EAASd,KAqEOuB,QAhIC,SAAC,GAA2C,IAAzChsM,EAAwC,EAAxCA,IAAKy6I,EAAmC,EAAnCA,QACnBp5D,EAAQ,aAAO1sG,GACfs3N,EAAYxB,EAAc,EAC1ByB,EAAYzB,EAAc,EAE1BgB,EAAYR,EAAapsM,QAEzBstM,EAASF,IAAcxqN,EACvB2qN,EACF3xD,IAAYmwD,KAAmBnwD,IAAYmwD,IAO/C,OAJAY,EAAYf,GAIR2B,IAEK3B,EAAc,GACXA,IAAgBhpN,EAAS,GACzB4/F,EAASopH,KAAiB1xK,GAC7B0xK,IAAgBhpN,EAAS,GACtB4/F,EAASopH,KAAiB1xK,KAE9BiyK,EAAekB,GACf7qH,EAAS6qH,GAAanzK,EACtBuyK,EAAUY,IAEd7qH,EAASopH,GAAe1xK,OACxBI,EAASkoD,IAOTx8F,OAAOgtM,OAAO7xL,QAAlB,GAIIyrM,IAAWA,EAAU92N,MAAQ,IACjC0sG,EAASopH,GAAezqM,EACxBm5B,EAASkoD,GAEJ8qH,OAAL,GACInB,EAAeiB,QACfX,EAAUW,MAmFEl3J,OAnEA,YACK,IAAjB01J,GAEJc,EAASd,IAiEO7mL,SAAUA,EACV6mL,YAAaA,EACbx6N,YAAU,4BAGbi7N,EAASn7N,KAAI,SAAC5C,EAAK8V,GAAN,OACV,eAAC,IAAD,CAEI9V,IAAKA,EACLrK,KAAK,SACLupO,SAAU,EACVzoL,SAAUA,EACV2xE,YAAa5gH,EAAMsO,GACnB6xD,QAAS02J,EAAYvoN,GACrBrU,gBAAiBA,EACjBk0B,UAAWA,EACX11B,UAAW,oCAAsCq9N,IAAgBxnN,EAAI,WAAa,IAVtF,UAYI,sBAAMhT,YAAA,kCAAsCgT,GAA5C,SAAkDtO,EAAMsO,KACvDwnN,IAAgBxnN,GACb,cAACynN,IAAD,kBAbCznN,cC/QpBmgB,IAAQt0B,IAAOC,IAAV,wMAULwlG,IAAYzlG,IAAOi0C,IAAV,iJASTyxD,IAAc1lG,IAAOC,IAAV,4JAQXu9N,IAAex9N,IAAOC,IAAV,6JAQZw9N,IAA4Bz9N,IAAOC,IAAV,4mBA+BzBy9N,IAAoB19N,IAAOC,IAAV,uLASjBwtE,IAAkBztE,IAAOC,IAAV,kDAIfupG,IAAaxpG,IAAOC,IAAV,oIAOV09N,IAAY39N,IAAO0nB,KAAV,kEAITk2M,IAAiB59N,IAAO0nB,KAAV,qDCTZm2M,QAjEf,YAaoC,IAZhCvC,EAY+B,EAZ/BA,aACAwC,EAW+B,EAX/BA,YACAC,EAU+B,EAV/BA,kBACAC,EAS+B,EAT/BA,aACAC,EAQ+B,EAR/BA,cACAC,EAO+B,EAP/BA,YACAC,EAM+B,EAN/BA,SACAC,EAK+B,EAL/BA,cACAC,EAI+B,EAJ/BA,aACAr4H,EAG+B,EAH/BA,OACAs4H,EAE+B,EAF/BA,SACAC,EAC+B,EAD/BA,SAEA,OAAO,qCACH,eAAC,IAAD,WACI,cAAC,IAAD,CAAWj6N,IAAK2hG,EAAgB7hG,QAAS4hG,IACzC,sBAAM7kG,YAAU,uBAAhB,qCAEJ,cAAC,IAAD,CAAaA,YAAU,oBAAvB,gDACA,cAACq8N,IAAD,CAAcr8N,YAAU,gBAAxB,SAAyCm6N,IACzC,eAACmC,IAAD,CAA2Bn/N,UAAay/N,EAAoB,iBAAchtO,EAA1E,UACI,cAAC,IAAD,CACIw5B,SAAU8zM,MAEXN,GAAsB,cAACL,IAAD,CAAmBv8N,YAAU,qBAA7B,SAAmD48N,OAEhF,cAAC,IAAD,UACI,cAAC,IAAD,CACIr/N,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZV,SAAU,GACVoB,QAAS+5N,EACTl6N,UAAWs6N,EACXzjO,OAAQ6jO,EACRp6N,SAAS,gBARb,sBAaJ,eAAC,IAAD,WACI,sBAAM/C,YAAU,0BAAhB,sCADJ,IAC+Eg9N,EACnE,cAACR,IAAD,CAAWx8N,YAAU,YAArB,mBACAi9N,EACA,eAACR,IAAD,CAAgBz8N,YAAU,iBAA1B,sBACc,IADd,YAGQ88N,EAAgB,GAAK,IAAM,IAHnC,OAIOA,MAGP,cAAC,GAAD,CACI75N,QAASm6N,EACT36N,SAA2B,eAAjBo6N,EACV95N,SAAS,gBAHb,2BCuFLs6N,IC3JAC,IDUf,YAMgC,IAL5BnD,EAK2B,EAL3BA,aACAt1H,EAI2B,EAJ3BA,OACAs4H,EAG2B,EAH3BA,SACAI,EAE2B,EAF3BA,gBACAH,EAC2B,EAD3BA,SAC2B,EACHp7M,mBAAiB,IADd,mBACpB5pB,EADoB,KACdolO,EADc,OAEex7M,mBEpBV,IFkBL,mBAEpB86M,EAFoB,KAELW,EAFK,KAGrBC,EAA6B15M,mBAHR,EAIWhC,oBAAkB,GAJ7B,mBAIpB26M,EAJoB,KAIPgB,EAJO,OAKuB37M,qBALvB,mBAKpB46M,EALoB,KAKDgB,EALC,OASvB57M,mBAAuC,QAThB,mBAQpB66M,EARoB,KAQNgB,EARM,KAUrBltN,EAAcnQ,cAkCds9N,EAAejvO,uBAAY,WAC7B8uO,GAAe,GACfC,OAAqBhuO,GACrButO,EAAS/kO,GACJ+xB,MAAK,SAACgT,GACHwgM,GAAe,GACfC,OAAqBhuO,GACrB2tO,EAAgBpgM,MAEnB9S,OAAM,SAAC5rB,GACJ,OAAOA,EAAM+kC,WACT,KAAK,IACL,KAAK,IACL,KAAK,IACDo6L,EE3EqB,0BF4ErB,MACJ,KAAK,IACDA,EE7EqB,0BF8ErB,MACJ,SACS,OAALn/N,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWm+N,EAAqBn/N,EAAMgB,SAGrDk+N,GAAe,QAExB,CAACvlO,EAAM+kO,EAAUI,IAQdQ,EAAelvO,uBAAY,WAC7BgvO,EAAgB,cAChBT,IACKjzM,MAAK,WACF0zM,EAAgB,cAEnBxzM,OAAM,SAAC5rB,GACJo/N,EAAgB,QAChBltN,EAAYlS,EAAMgB,QAAS,cAEpC,CAAC29N,EAAUzsN,IAERosN,EAAcjgN,mBAAQ,kBAAsB,IAAhB1kB,EAAKoZ,SAAc,CAACpZ,IAChD4kO,EAAWlgN,mBACb,kBACIggN,GE9GwB,IF+GxBA,GAAiBkB,IACA,YAAjBnB,IACJ,CAACC,EAAeD,IAEdI,EAAgBngN,mBAClB,kBACIggN,EAAgB,GAChBA,GEtHwB,IFuHa,YAAjBD,EAA6B,EAAI,KACzD,CAACC,EAAeD,IAkBpB,OAfA16M,qBAAU,WACN,GAAqB,eAAjB06M,EAIA,OA5FJY,EEpC4B,IFqC5BC,EAAsB9uM,QAAU2hJ,aAC5B,kBAAMktD,GAAiB,SAAA16K,GAAS,OAAIA,EAAY,OAChD,KAyFO,kBAAM8wE,cAAc6pG,EAAsB9uM,UAHjDilG,cAAc6pG,EAAsB9uM,WAKzC,CAACiuM,IAEJ16M,qBAAU,WACF26M,EAAgB,GAChBjpG,cAAc6pG,EAAsB9uM,WAEzC,CAACkuM,IAGA,cAAC,IAAD,CACI3C,aAAcA,EACdwC,YAAaA,EACbC,kBAAmBA,EACnBC,aAAcA,EACdC,cAAeA,EACfC,YAAaA,EACbC,SAAUA,EACVC,cAAeA,EACfC,aAnGiB,SAACe,GAClBA,IAAY7lO,IACZolO,EAAQS,GACRL,OAAqBhuO,KAiGrBi1G,OAAQA,EACRs4H,SAAUW,EACVV,SAAUW,KGpDPG,ICjGAC,IDef,WAAyC,IAAD,EAE9BjmO,EAAW,UADqB4qI,cACX5qI,mBAAV,QAAyB,GACpCue,EAAUW,cACVgnN,EAAmBtjK,eACnBk/J,EAAexqO,eAErB24C,YAAiB,wBAQjB,IAAM21L,EAAejvO,uBACjB,SAACuJ,GACG,OAAOgmO,EAAiB,CAAE3uO,MAAOyI,EAAaE,WAElD,CAACF,EAAakmO,IAUZC,EAAsBxvO,uBACxB,SAAC+rD,EAAwBzd,GACrBmd,aAAand,EAAS7lC,KAAM6lC,EAAS5tC,OACrCorD,aACIlkC,EACAmkC,EACAzd,EAAS7lC,KACT6lC,EAAS5tC,SAGjB,CAACknB,IAQCsnN,EAAelvO,uBAAY,WAC7B,OAAOmrO,EAAa9hO,KACrB,CAAC8hO,EAAc9hO,IAOZomO,EAA8BzvO,uBAAY,WAC5C4nB,EAAQH,KAAKluB,IAAOE,WAAWI,uBAChC,CAAC+tB,IAEJ,OACI,cAACqvF,GAAkBa,SAAnB,UACK,SAAA/rD,GAAU,OACP,cAACijD,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,SACI,cAACoqL,IAAD,CACInD,aAAcjiO,EACd2sG,OAAQy5H,EACRnB,SAAUW,EACVP,gBAAiB,SAAApgM,GAAQ,OACrBkhM,EACIzjL,EACAzd,IAGRigM,SAAUW,UE5ErBQ,IAAkChtM,IAAM/tB,eAEnD,WACE,MAAM,IAAInF,MAAM,sBAGb,SAASmgO,MACZ,OAAOrmN,YAAY1U,qBAAW86N,MCnB3B,I,wLCDKn3N,IDyCGq3N,IAxCcxhO,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,8BACI,0BAAUa,GAAG,MAAb,SACI,sBACI0zB,UAAU,wBACV5zB,EAAE,gkCAGV,oBAAGsgO,SAAS,YAAZ,UACI,0BAAUpgO,GAAG,MAAb,SACI,sBACI0zB,UAAU,wBACV5zB,EAAE,qDAGV,mBAAGsgO,SAAS,YAAZ,SACI,sBACI1sM,UAAU,wBACV5zB,EAAE,+CACFF,KAAK,8BExB/BknB,IAAYvmB,IAAOC,IAAV,kOACG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO2C,aAUxCi5O,IAAW9/N,IAAOC,IAAV,2SAGD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAenCysE,IAAgB5wD,IAAOC,IAAV,yIAGN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkD,aAKnCktC,IAAQt0B,IAAOC,IAAV,gGAEE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkD,aAInCopE,IAAOxwD,IAAOC,IAAV,iGAEG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCosE,IAAUvwD,IAAOC,IAAV,uHAOP+gD,IAAUhhD,IAAOC,IAAV,yJAQPstC,IAAgBvtC,IAAOC,IAAV,yDAIb8/N,IAAgB,WAClB,IAAMlvL,EAAW8uL,MAAsB9uL,SACjCj5B,EAAUW,cAEVynN,EAAqBhwO,uBAAY,WAC/B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QACrC,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEhBwgO,EAAqBjwO,uBAAY,WAC/B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBC,SAASgD,QAC9B,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEhBygO,EAAqBlwO,uBAAY,WAC/B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBG,SAAS8C,QAC9B,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEtB,OACI,eAAC,IAAD,WACI,cAACqgO,IAAD,CAAU17N,QAAS47N,EAAnB,SACI,cAAC3rK,GAAA,EAAD,MAEJ,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,IAAD,MAEJ,cAAC,IAAD,uBACA,cAAC,IAAD,mCAEJ,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,IAAD,CACI5wD,MAAM,WACNhF,MAAM,QACNC,OAAO,OACPsE,MAAO,QACPvI,OAAQwlO,EACRp/N,QAAS,cAGjB,cAAC,IAAD,UACI,cAAC,IAAD,CACI4C,MAAM,gBACNhF,MAAM,QACNC,OAAO,OACPsE,MAAO,QACPvI,OAAQylO,aAYjBC,IAJU,WACrB,OAAO,cAAC,IAAD,KCrJL55M,IAAYvmB,IAAOC,IAAV,0KACG,SAAAC,GAAK,OACfA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOsC,WACnB0Z,EAAMI,MAAMpc,OAAOC,SAQ3BmwC,IAAQt0B,IAAOC,IAAV,gJACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmC,WAOnCmqE,IAAOxwD,IAAOC,IAAV,+FACG,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOkB,SAiBlB6nN,IAZ0C,SAAC,GAGnD,IAFH1yM,EAEE,EAFFA,KACAqJ,EACE,EADFA,SAEA,OACI,eAAC,IAAD,CAAWA,SAAUA,EAArB,UACI,cAAC,IAAD,kBACA,cAAC,IAAD,CAAMA,SAAUA,EAAhB,SAA2BrJ,QCpCjCgsB,IAAYvmB,IAAOC,IAAV,0KACG,SAAAC,GAAK,OACfA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOsC,WACnB0Z,EAAMI,MAAMpc,OAAOC,SAQ3BmwC,IAAQt0B,IAAOC,IAAV,gJACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAOnC+rE,IAAOxwD,IAAOC,IAAV,+FACG,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOkB,SAiBlBsoN,IATV,SAAC,GAAwB,IAAtBnzM,EAAqB,EAArBA,KAAMqJ,EAAe,EAAfA,SACV,OACI,eAAC,IAAD,CAAWA,SAAUA,EAArB,UACI,cAAC,IAAD,uBACA,cAAC,IAAD,CAAMA,SAAUA,EAAhB,SAA2BrJ,QCvBjCgsB,IAAYvmB,IAAOC,IAAV,kMACG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO2C,aASxCi5O,IAAW9/N,IAAOC,IAAV,2SAGD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAenCi9G,IAAmBphG,IAAOC,IAAV,0HAOhBmgO,IAAiBpgO,IAAOC,IAAV,2FAMdogO,IAAoBrgO,YAAO6hN,GAAP7hN,CAAH,mDAIjBsgO,IAAgBtgO,IAAOC,IAAV,sFAGD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOsC,cAGxCinF,IAAkBztE,IAAOC,IAAV,gJAQf6iK,IAAiB9iK,IAAOC,IAAV,4NAYdg7N,IAAYj7N,IAAOC,IAAV,2HACF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO8C,WAMnCumD,IAAgBvtC,IAAOC,IAAV,yDA0LJsgO,IAtLM,WACjB,IAAMC,EAAmBb,MACnBlkN,EAAY+kN,EAAiB3vL,SAC7B4vL,EAAiBD,EAAiBC,eAClCC,EAAgBF,EAAiBG,UACjC/oN,EAAUW,cALO,EAMS4K,mBAAS,GANlB,mBAMhBygG,EANgB,KAMNg9G,EANM,OAOOz9M,oBAAS,GAPhB,mBAOhBw9L,EAPgB,KAOPE,EAPO,KAiBjBmf,EAAqBhwO,uBAAY,WAC/ByrB,EAAUhc,IACVmY,EAAQH,KACJluB,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QACrC,cACA8rB,EAAUhc,GAAG7P,eAI1B,CAACgoB,EAAS6D,EAAUhc,KAEjBygO,EAAqBlwO,uBAAY,WAC/ByrB,EAAUhc,IACVmY,EAAQH,KACJluB,IAAOmD,kBAAkBG,SAAS8C,QAC9B,cACA8rB,EAAUhc,GAAG7P,eAI1B,CAACgoB,EAAS6D,EAAUhc,KAEjBohO,EAAsB7wO,uBAAY,WAChCyrB,EAAUhc,IACVmY,EAAQH,KACJluB,IAAOmD,kBAAkBE,UAAU+C,QAC/B,cACA8rB,EAAUhc,GAAG7P,eAI1B,CAACgoB,EAAS6D,EAAUhc,KAEjBqhO,EAAiB9wO,uBAAY,SAACwlL,GAChC,IAAIurD,EAAmB,EACvB,OAAOvrD,EAAYv0K,KAAI,SAAA+1K,GACnB,IAAMgqD,EAAmBD,EACnBE,EAAmBF,EAAmB/pD,EAAKpzD,SAGjD,OAFAm9G,EAAmBE,EAEZ,CACHxhO,GAAIu3K,EAAKv3K,GACTlF,KAAMy8K,EAAKz8K,KACXioK,QAASwU,EAAKxU,QACd6R,SAAU2C,EAAK3C,SACf3hK,IAAKsuN,EACL9jL,IAAK+jL,QAGd,IAlEoB,EAoEyB99M,mBAC5C29M,EAAeL,IArEI,mBAoEhBS,EApEgB,KAoEEC,EApEF,KAwEvB79M,qBAAU,WACN69M,EAAoBL,EAAeL,MACpC,CAACA,EAAgBK,IAEpB,IAAMM,EAAoBF,EAAiB,GAU3C,OARA59M,qBAAU,WACN69M,EACIL,EAAeL,GAAgBttN,QAC3B,SAAC6jK,GAAD,OAAeA,GAAQA,EAAK95H,KAAO0mE,QAG5C,CAACu9G,EAAqBv9G,EAAUk9G,EAAgBL,IAE9CC,EAqBDF,EAAiBz8N,QAEb,eAAC,IAAD,WACI,cAAC,IAAD,CAAUK,QAASy8N,EAAnB,SACI,cAACxsK,GAAA,EAAD,MAEJ,cAAC,IAAD,UACI,cAAC,KAAD,SAOZ,eAAC,IAAD,WACI,cAAC,IAAD,CAAUjwD,QAASy8N,EAAnB,SACI,cAACxsK,GAAA,EAAD,MAEJ,cAAC+rK,IAAD,UACI,cAACC,IAAD,CACI3/L,IAAKggM,EACL5e,YAvHS,SAACj8M,GACtB+6N,EAAY/6N,IAuHAk8M,WApHQ,SAACl8M,GACrBg7M,EAAWh7M,IAoHC2rK,UAAU,EACVwwC,WACKof,GACDA,EAAkB5+D,UAAYnE,GAAkBoE,aAI3D2+D,GAAqBzgB,GAClB,uBACIr8M,IAAK88N,EAAkB/sD,SACvBusC,MAAOwgB,EAAkB5+D,UAAYnE,GAAkBqE,IACvD8O,UAAU,IAGlB,cAAC8uD,IAAD,UACKc,GACGF,EAAiBjgO,KAAI,SAAAogO,GACjB,OAAIA,EAAW7+D,UAAYnE,GAAkBqE,IAErC,cAAC,IAAD,CAEInoK,KAAM8mO,EAAW9mO,KACjBqJ,SACIy9N,EAAW5hO,KAAO2hO,EAAkB3hO,IAHnC4hO,EAAW5hO,IASpB,cAAC,IAAD,CAEIlF,KAAM8mO,EAAW9mO,KACjBqJ,SACIy9N,EAAW5hO,KAAO2hO,EAAkB3hO,IAHnC4hO,EAAW5hO,SAUxC,cAAC,IAAD,UACI,cAAC,IAAD,CACIgE,MAAO,iBACPhF,MAAO,QACPC,OAAQ,OACRjE,OAAQomO,SAvFhB,eAAC,IAAD,WACI,cAAC,IAAD,CAAUz8N,QAAS47N,EAAnB,SACI,cAAC3rK,GAAA,EAAD,MAEJ,eAAC,IAAD,WACI,cAAC,IAAD,uCACA,cAAC,IAAD,UACI,cAAC,IAAD,CACI5wD,MAAM,aACNhF,MAAM,QACNC,OAAO,OACPjE,OAAQylO,aClM9B35M,IAAYvmB,IAAOC,IAAV,0KACG,SAAAC,GAAK,OACfA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOsC,WACnB0Z,EAAMI,MAAMpc,OAAOC,SAQ3BmwC,IAAQt0B,IAAOC,IAAV,gJACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO8C,WAOnCwpE,IAAOxwD,IAAOC,IAAV,+FACG,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOkB,SAiBlB6nN,IAZ0C,SAAC,GAGnD,IAFH1yM,EAEE,EAFFA,KACAqJ,EACE,EADFA,SAEA,OACI,eAAC,IAAD,CAAWA,SAAUA,EAArB,UACI,cAAC,IAAD,kBACA,cAAC,IAAD,CAAMA,SAAUA,EAAhB,SAA2BrJ,QCpCjCgsB,IAAYvmB,IAAOC,IAAV,0KACG,SAAAC,GAAK,OACfA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOsC,WACnB0Z,EAAMI,MAAMpc,OAAOC,SAQ3BmwC,IAAQt0B,IAAOC,IAAV,gJACE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAOnC+rE,IAAOxwD,IAAOC,IAAV,+FACG,SAAAC,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOO,UACnByb,EAAMI,MAAMpc,OAAOkB,SAiBlBsoN,IATV,SAAC,GAAwB,IAAtBnzM,EAAqB,EAArBA,KAAMqJ,EAAe,EAAfA,SACV,OACI,eAAC,IAAD,CAAWA,SAAUA,EAArB,UACI,cAAC,IAAD,uBACA,cAAC,IAAD,CAAMA,SAAUA,EAAhB,SAA2BrJ,Q,wBCpCjC8E,IAAOw8N,YAAH,gGAUJt1M,IAAYvmB,IAAOC,IAAV,iWAGG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAKxB,SAAA2Z,GAAK,OAAIA,EAAM8C,QAChB3D,KAAQ,SAAAa,GAAK,OAAIA,EAAM0jH,YAQtC09G,IAAiBthO,IAAOC,IAAV,oRAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAKxB,SAAA2Z,GAAK,OAAIA,EAAM8C,SAkBtBu+N,IAPV,SAAC,GAAkC,IAAhC39G,EAA+B,EAA/BA,SAAU5gH,EAAqB,EAArBA,MACd,OADmC,EAAdw+N,QAId,cAAC,IAAD,CAAW59G,SAAUA,EAAU5gH,MAAOA,IAFlC,cAACs+N,IAAD,CAAgBt+N,MAAOA,KCRvBy+N,IAxCKrjO,sBAChB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,oBAAG8iO,iBAAiB,MAApB,UACI,0BAAUjiO,GAAG,MAAb,SACI,sBACI0zB,UAAU,wBACV5zB,EAAE,k+BAGV,oBAAGsgO,SAAS,YAAZ,UACI,0BAAUpgO,GAAG,MAAb,SACI,sBACI0zB,UAAU,wBACV5zB,EAAE,mDAGV,mBAAGsgO,SAAS,YAAZ,SACI,sBACI1sM,UAAU,wBACV5zB,EAAE,iDACFF,KAAK,8BC7B/B8hE,IAAQnhE,IAAOC,IAAV,iNAOE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCw9O,IAAc3hO,IAAOC,IAAV,uKAMC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiD,qBAGxCgc,IAAenD,IAAOC,IAAV,6SAIA,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgD,iBAIhCy6O,KACQ,SAAAzhO,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgD,iBAEnCi6E,KACO,SAAAjhE,GAAK,OAAIA,EAAMI,MAAMpc,OAAO+C,YAI5CmZ,IAAcJ,IAAOC,IAAV,0GAIJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAgB1Bqf,IAbyB,SAAC,GAAiB,IAAfY,EAAc,EAAdA,QACvC,OACI,eAAC,IAAD,CAAcA,QAASA,EAAvB,UACI,cAAC,IAAD,mBACA,cAACu9N,IAAD,UACI,cAAC,IAAD,UACI,cAAC,IAAD,YCjDd7gL,IAAO+6K,YAAH,0HASJtwI,IAAQswI,YAAH,0HASLt1M,IAAYvmB,IAAOC,IAAV,sOAMG,SAAAC,GAAK,OAAI6sC,aAAK7sC,EAAMI,MAAMpc,OAAOkB,MAAO,OAOpDw8O,IAAS5hO,IAAOC,IAAV,4KASN4hO,IAAO7hO,IAAOC,IAAV,8LAMc,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqC,YAG9Cu7O,IAAO9hO,IAAOC,IAAV,4LACc,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiD,qBAQ9C46O,IAAO/hO,YAAO6hO,IAAP7hO,CAAH,mHACD8hO,IAEYhhL,KAIfkhL,IAAQhiO,YAAO6hO,IAAP7hO,CAAH,oMAGF8hO,IAEYv2I,KAKf02I,IAAcjiO,IAAOC,IAAV,mRAIC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAGjC,SAAA+b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiD,qBAsC1B+6O,IA5BV,SAAC,GAAiC,IAA/BC,EAA8B,EAA9BA,UAAWC,EAAmB,EAAnBA,aAaf,OAZA9+M,qBAAU,WACN,IAAM++M,EAAQ3wD,aAAY,WACtB0wD,GAAa,SAACE,GACV,OAAOA,EAAgB,OAE5B,KAEH,OAAO,WACHttG,cAAcqtG,MAEnB,CAACD,IAGA,cAAC,IAAD,UACI,eAACR,IAAD,WACI,cAACG,IAAD,UACI,cAACD,IAAD,MAEJ,cAACE,IAAD,UACI,cAACF,IAAD,MAEJ,cAACG,IAAD,UAAcE,MAPLA,O,SV7Gb55N,K,oEAAAA,E,wEAAAA,E,wEAAAA,E,sDAAAA,E,wCAAAA,E,uCAAAA,U,KWaL,I,gNCXKA,IDWCg6N,IAAmC,WAC5C,IAAMlhO,EAAWO,cACXs+J,EAAiB5pK,eACjBwb,EAAcnQ,cACpB,OAAO3R,uBACH,SAACqG,GACGgL,EXRD,CACHrG,KAAMuN,IAAQi6N,mCWQVtiE,EAAe7pK,GACVi1B,MAAK,SAAAn5B,GACFkP,EXNb,SAAyClP,GAC5C,MAAO,CACH6I,KAAMuN,IAAQk6N,mCACdtwO,QWGqBuwO,CAAgCvwO,OAE5Cq5B,OAAM,SAAC5rB,GACJyB,EXFb,SAAyCzB,GAC5C,MAAO,CACH5E,KAAMuN,IAAQo6N,mCACd/iO,SWDqBgjO,CAAgChjO,EAAMgB,UAC/CkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAU6+J,EAAgBpuJ,KAItB+wN,IAAmC,WAC5C,IAAMxhO,EAAWO,cACjB,OAAO5R,uBACH,SAACqxO,GACGhgO,EXPL,SAAsCggO,GACzC,MAAO,CACHrmO,KAAMuN,IAAQu6N,0BACdzB,cWIa0B,CAA6B1B,MAE1C,CAAChgO,KAII2hO,IAA6B,WACtC,IAAM3hO,EAAWO,cACjB,OAAO5R,uBACH,SAAC2wO,GACGt/N,EXVL,SAAgCs/N,GACnC,MAAO,CACH3lO,KAAMuN,IAAQ06N,mBACdtC,aWOauC,CAAuBvC,MAEpC,CAACt/N,KAII8hO,IAA6B,WACtC,IAAM9hO,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EXXG,CACHrG,KAAMuN,IAAQ66N,sBWWf,CAAC/hO,KEhCFklB,IAAYvmB,IAAOC,IAAV,mMAOG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO2C,aAGxCi5O,IAAW9/N,IAAOC,IAAV,2SAGD,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAenCi+O,IAASrjO,IAAOC,IAAV,yDAINqjO,IAAsBtjO,IAAOC,IAAV,2GAGP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAIxCi8O,IAAiBpgO,IAAOC,IAAV,+FAMdsjO,IAAevjO,IAAOC,IAAV,2LAUZujO,IAAcxjO,IAAOuvK,MAAV,6FAkUFk0D,IA5TE,WACb,IAAMl0D,EAAQpqJ,iBAAY,MACtBu+M,EAAgBv+M,iBAAY,MAC1BvN,EAAUW,cACVorN,EAAmBR,MAmBnBS,EAhBF5zO,uBAAY,SAACyvH,GACT,OAAO1rD,UAAUq7G,aACZC,aAAa,CACVC,OAAO,EACPC,MAAO,CACH7wK,OAAQ,IAERD,MAAO,OAGd6sB,MAAK,SAASu4M,GACX,OAAOpkH,EAASokH,MAEnBr4M,OAAM,SAAAm/C,GAAG,OAAIt5C,QAAQ45F,IAAItgD,QAC/B,IAGDm5J,EAAyBjB,MACzBkB,EAAmBf,MAenBgB,EAZFh0O,uBAAY,WACR,OAAO4zO,GAAc,SAASC,GACrBt0D,EAAMx/I,UAAW2zM,EAAS3zM,UAC/Bw/I,EAAMx/I,QAAQ6wL,OAAQ,EACtBrxC,EAAMx/I,QAAQ8vL,OAAS,EACvBtwC,EAAMx/I,QAAQk0M,UAAYJ,EAC1BH,EAAS3zM,QAAU,IAAIm0M,MAAUL,EAAQ,CACrC7oO,KAAM,gBAGf,IAIPsoB,qBAAU,WACFisJ,EAAMx/I,SACNi0M,IAAmB14M,SAExB,CAAC04M,IAEJ,IAAMG,EAAcn0O,uBAAY,WAC5B,OAAO4zO,GAAc,SAASC,GAC1BH,EAAS3zM,QAAQ6kJ,iBACjB8uD,EAAS3zM,QAAQ8zM,OAASA,OAE/B,CAACD,IAEEQ,EAAwBp0O,uBAAY,WACtC+zO,EAAiBnjM,IAAIC,gBAAgB6iM,EAAS3zM,QAAQs0M,YACtDX,EAAS3zM,QAAQ8zM,OAAOp0D,YAAY75J,SAAQ,SAAUgvF,GAClDA,EAAM8qE,UAEVg0D,EAAS3zM,QAAQu0M,UACjBZ,EAAS3zM,QAAU,OACpB,CAACg0M,IAgBJzgN,qBAAU,WACN,OAAO,WACCogN,EAAS3zM,UACT2zM,EAAS3zM,QAAQ8kJ,gBACjB6uD,EAAS3zM,QAAQ8zM,OACZp0D,YACA75J,SAAQ,SAASgvF,GACdA,EAAM8qE,UAGdg0D,EAAS3zM,QAAQu0M,UACjBZ,EAAS3zM,QAAU,MAGnBw/I,EAAMx/I,SAENw/I,EAAMx/I,QAAQk0M,UACTx0D,YACA75J,SAAQ,SAASgvF,GACdA,EAAM8qE,aAIvB,IAEH,IAAM60D,EAtCFv0O,uBAAY,WACJ0zO,GAAYA,EAAS3zM,SACrB2zM,EAAS3zM,QAAQ8kJ,cAAcuvD,GAE/B70D,EAAMx/I,SACNw/I,EAAMx/I,QAAQk0M,UACTx0D,YACA75J,SAAQ,SAASgvF,GACdA,EAAM8qE,YAGnB,IA4BD80D,EAAcvmN,mBAAQ,WACxB,OAAO,cAACulN,IAAD,CAAanlO,IAAKkxK,EAAOiC,UAAU,EAAMizD,aAAa,MAC9D,CAACl1D,IA1Ge,EA4GepsJ,mBAAS,GA5GxB,mBA4GZg/M,EA5GY,KA4GDC,EA5GC,OA6GuBj/M,oBAAS,GA7GhC,mBA6GZuhN,EA7GY,KA6GGC,EA7GH,KA+GbnE,EAAmBb,MACnB9uL,EAAW2vL,EAAiB3vL,SAhHf,EAkH2B1tB,mBAC1C0tB,EAAS0tH,OAAOtsK,OAnHD,mBAkHZ2yO,EAlHY,KAkHKC,EAlHL,KAsHnBvhN,qBAAU,WACNuhN,EAAmBh0L,EAAS0tH,OAAOtsK,SACpC,CAAC4+C,EAAS0tH,OAAOtsK,QAEpB,IAAMmvO,EAAoBwD,EAAgB,GAG1CthN,qBAAU,WACY,IAAd6+M,IACAwB,IACAgB,GAAiB,GACjBR,IAAc74M,UAEnB,CAAC62M,EAAWwC,EAAkBR,EAAaR,IAnI3B,MAqI2BxgN,mBAAS,GArIpC,mBAqIZ2hN,EArIY,KAqIKC,EArIL,KAuInBzhN,qBAAU,WACN,GACK89M,KACAA,GACGA,EAAkB5+D,UAAYnE,GAAkBqE,KAHxD,CAOA,IAAM2/D,EAAQ3wD,aAAY,WACtBqzD,GAAmB,SAAA7gL,GAAS,OAAIA,EAAY,QAC7C,KACH,OAAO,WACH8wE,cAAcqtG,OAEnB,CAAC0C,EAAoB3D,IAExB,IAAM4D,EAAiBh1O,uBAAY,WAC3B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBI,KAAK6C,QAC1B,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEhBohO,EAAsB7wO,uBAAY,WAChC6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBE,UAAU+C,QAC/B,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEhByzK,EAAeljL,uBAAY,WAsB7B,GArBIoxO,EAAkB5+D,UAAYnE,GAAkBoE,UAChDqhE,EAAuB,CACnBrkO,GAAI2hO,EAAkB3hO,GACtBlF,KAAM6mO,EAAkB7mO,KACxBqpH,SAAUw9G,EAAkBx9G,SAC5BywD,SAAU+sD,EAAkB/sD,SAC5B33G,SAAU0kK,EAAkB1kK,SAC5B8lG,QAAS4+D,EAAkB5+D,UAE/BuiE,EAAmB,KAEnBjB,EAAuB,CACnBrkO,GAAI2hO,EAAkB3hO,GACtBlF,KAAM6mO,EAAkB7mO,KACxBqpH,SAAUsgG,WAAW4gB,EAAgBx+K,QAAQ,IAC7C+tH,SAAU+sD,EAAkB/sD,SAC5B33G,SAAU0kK,EAAkB1kK,SAC5B8lG,QAAS4+D,EAAkB5+D,UAE/BuiE,EAAmB,IAGnB3D,EAAkB3hO,KAClBmlO,EAAgBA,EAAgBjyN,OAAS,GAAGlT,GAC9C,CACE8kO,IACA,IAAMU,EAAUxjO,YAAW,WACvBo/N,MACD,KAEH,OAAO,WACH7rG,cAAciwG,IAGtBJ,GAAmB,SAAAK,GACf,IAAMC,EAAe,aAAOD,GAE5B,OADAC,EAAgBC,QACTD,OAEZ,CACCrB,EACA1C,EACAmD,EACAK,EACAG,EACAD,EACAjE,IAuBJ,OApBAv9M,qBAAU,WACN,GAAK89M,GAAsBsD,EAA3B,CACA,IAAIW,EAAY,EAEVC,EAAoB5zD,aAAY,YAClC2zD,GAAa,KAEIjE,EAAkBx9G,UAC/Bw9G,EAAkB5+D,UAAYnE,GAAkBoE,WAEhDyQ,IACAmyD,EAAY,KAEjB,KAEH,OAAO,WACHrwG,cAAcswG,OAEnB,CAAClE,EAAmBwD,EAAiBF,EAAexxD,IAEnDstD,EAAiBz8N,UAAYq9N,EAEzB,eAAC,IAAD,WACI,cAAC,KAAD,IACA,cAACiC,IAAD,UAASmB,OAMjB,eAAC,IAAD,WACI,cAAC,IAAD,CAAUpgO,QAAS4gO,EAAnB,SACI,cAAC3wK,GAAA,EAAD,MAEH8tK,EAAY,GACT,cAAC,IAAD,CAAWA,UAAWA,EAAWC,aAAcA,IAEnD,cAAC,IAAD,CAEIx+G,SAAUw9G,EAAkBx9G,SAC5B5gH,MACIo+N,EAAkB5+D,UAAYnE,GAAkBoE,SAC1Cx+K,IAAUC,OAAOQ,WACjBT,IAAUC,OAAO8C,QAE3Bw6O,QAASkD,GAPJtD,EAAkB3hO,IAS1BilO,GACG,uBACIpgO,IAAK88N,EAAkB/sD,SACvBusC,MAAOwgB,EAAkB5+D,UAAYnE,GAAkBqE,IACvD8O,UAAU,IAGlB,cAAC8xD,IAAD,UACKsB,EAAgB3jO,KAAI,SAAA+1K,GACjB,OAAIA,EAAKxU,UAAYnE,GAAkBoE,SAE/B,cAAC,IAAD,CAEIloK,KAAMy8K,EAAKz8K,KACXqJ,SACIozK,EAAKv3K,KAAO2hO,EAAkB3hO,KAC7BilO,GAJA1tD,EAAKv3K,IAUd,cAAC,IAAD,CAEIlF,KAAMy8K,EAAKz8K,KACXqJ,SACIozK,EAAKv3K,KAAO2hO,EAAkB3hO,KAC7BilO,GAJA1tD,EAAKv3K,SAW9B,eAAC,IAAD,WACK+kO,EACApD,EAAkB5+D,UAAYnE,GAAkBqE,KAC7C,cAAC6gE,IAAD,UACI,cAAC,IAAD,CAAQn/N,QAAS8uK,aCrYnC3sJ,IAAYvmB,IAAOC,IAAV,yMACG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO2C,aASxC2pE,IAAOxwD,IAAOC,IAAV,iGAEG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAInCosE,IAAUvwD,IAAOC,IAAV,uJAQP+gD,IAAUhhD,IAAOC,IAAV,yJAQPstC,IAAgBvtC,IAAOC,IAAV,yDA0DJslO,IAtDE,WACb,IAAM10L,EAAW8uL,MAAsB9uL,SACjCj5B,EAAUW,cAEVynN,EAAqBhwO,uBAAY,WAC/B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QACrC,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEhBygO,EAAqBlwO,uBAAY,WAC/B6gD,EAASpxC,IACTmY,EAAQH,KACJluB,IAAOmD,kBAAkBG,SAAS8C,QAC9B,cACAkhD,EAASpxC,GAAG7P,eAIzB,CAACgoB,EAASi5B,EAASpxC,KAEtB,OACI,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,6CACA,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,IAAD,CACIgE,MAAM,sBACNhF,MAAM,QACNC,OAAO,OACPjE,OAAQylO,MAGhB,cAAC,IAAD,UACI,cAAC,IAAD,CACIz8N,MAAM,WACNhF,MAAM,QACNC,OAAO,OACPjE,OAAQulO,EACRn/N,QAAS,uBC5E/B0lB,IAAYvmB,IAAOC,IAAV,mKAIG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOiB,WAKxCqgP,IAAgBxlO,IAAOC,IAAV,4IAgDJwlO,IAxCS,WACpB,IAAMjiD,EAAc++C,MACdhzO,EAAS00I,cAOf,OANA3gH,qBAAU,WACF/zB,EAAO8G,YACPmtL,EAAYj0L,EAAO8G,cAExB,CAACmtL,EAAaj0L,EAAO8G,aAGpB,cAAC,IAAD,UACI,cAACmvO,IAAD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,CACIhwN,KAAMjsB,IAAOkD,YACb+jI,OAAK,EACL/jF,GAAIljD,IAAOmD,kBAAkBG,WAEjC,cAAC,GAAD,CACI6C,KAAMnG,IAAOmD,kBAAkBE,UAC/B2iG,UAAWwwI,MAEf,cAAC,GAAD,CACIrwO,KAAMnG,IAAOmD,kBAAkBC,SAC/B4iG,UAAWgxI,MAEf,cAAC,GAAD,CACI7wO,KAAMnG,IAAOmD,kBAAkBG,SAC/B0iG,UAAWk0I,MAEf,cAAC,GAAD,CACI/zO,KAAMnG,IAAOmD,kBAAkBI,KAC/ByiG,UAAWg2I,cCnD7BG,IAAsB1lO,IAAOC,IAAV,wEAKnB4iD,IAAc7iD,IAAO0nB,KAAV,8BAEXo7B,IAAc9iD,IAAO0nB,KAAV,8BAEXi+M,IAAuB3lO,IAAOC,IAAV,mGAMpB2lO,IAAgB5lO,IAAOC,IAAV,qXACN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAK3Bi8L,IAAa7/L,IAAO0nB,KAAV,uEAEH,qBAAGpnB,MAAkBpc,OAAOO,aAE5BohP,IAKR,SAAC,GAA8C,IAA5C3tO,EAA2C,EAA3CA,MAAO22G,EAAoC,EAApCA,cAAei3H,EAAqB,EAArBA,eACpB3hL,EAAYn0D,uBACd,SAACq0D,GACG,QAASwqD,KAAmBxqD,GAASwqD,EAAcn9F,SAAS2yC,KAEhE,CAACwqD,IAGCjnG,EAAU0R,YAAY3R,MAEtB28C,EAAqBt0D,uBACvB,SAACX,GACG,QACMw/G,KACAx/G,GACFw/G,EAAcn9F,UAAUqE,OAAO1mB,MAGvC,CAACw/G,IAGCtqD,EAAgB,SAACl1D,GACfA,GAAUy2O,GACVA,EAAe1lL,aAA0ByuD,EAAex/G,KAIhE,IAAK6I,GAAUA,GAA0B,IAAjBA,EAAMya,OAAe,OAAO,KAEpD,IAAMozN,EAAmB7tO,EAAMib,QAC3B,SAAA1a,GAAI,OAAIA,EAAKgH,IAAMovG,EAAcn9F,SAASjZ,EAAKgH,OAG7CumO,EAAsB9tO,EAAMib,QAC9B,SAAA1a,GAAI,OAAIA,EAAKgH,KAAOovG,EAAcn9F,SAASjZ,EAAKgH,OAGpD,OACI,eAACimO,IAAD,WACKK,EAAiBpzN,OAAS,GACvB,eAAC,IAAD,WACKozN,EAAiB9kO,KAAI,SAAAxI,GAClB,OACI,eAACktO,IAAD,WACI,cAAC7hN,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU1rD,EAAKgH,KACf6kD,EAAmB7rD,EAAKgH,IAE5BmL,QAAS05C,EAAmB7rD,EAAKgH,IACjCqmB,aAAc,kBAAMy+B,EAAc9rD,EAAKgH,KACvCyE,SAAS,oCAEb,eAAC0hO,IAAD,CACIxhO,QAAS,kBAAMmgD,EAAc9rD,EAAKgH,KAClC0B,YAAU,8BAFd,UAIK1I,EAAKkmC,UAJV,IAIsBlmC,EAAKomC,SAAU,IAChCpmC,EAAKgH,MAAL,OAAYmI,QAAZ,IAAYA,OAAZ,EAAYA,EAASnI,KAClB,cAAC,IAAD,yBAjBehH,EAAKgH,OAuBvCsmO,EAAiBpzN,OAASza,EAAMya,QAAU,cAAC,KAAD,CAAclU,MAAM,WAGvE,cAAC,IAAD,UACKunO,EAAoB/kO,KAAI,SAAAxI,GACrB,OACI,eAACktO,IAAD,WACI,cAAC7hN,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU1rD,EAAKgH,KACf6kD,EAAmB7rD,EAAKgH,IAE5BmL,QAAS05C,EAAmB7rD,EAAKgH,IACjCqmB,aAAc,kBAAMy+B,EAAc9rD,EAAKgH,KACvCyE,SAAS,2BAEb,eAAC0hO,IAAD,CACIxhO,QAAS,kBAAMmgD,EAAc9rD,EAAKgH,KAClC0B,YAAU,qBAFd,UAIK1I,EAAKkmC,UAJV,IAIsBlmC,EAAKomC,SAAU,IAChCpmC,EAAKgH,MAAL,OAAYmI,QAAZ,IAAYA,OAAZ,EAAYA,EAASnI,KAClB,cAAC,IAAD,yBAjBehH,EAAKgH,aC1H3CwmO,IAAc,SAAC7uN,GAAD,OAAkB,SACzClf,GAEA,OAAKkf,EAIElf,EAAMib,QACT,SAAAC,GAAI,OACCA,GACGA,EAAKurB,YAEA,IADLvrB,EAAKurB,UAAUr4B,cAAckR,QAAQJ,EAAK9Q,gBAE7C8M,GACGA,EAAKyrB,WAEA,IADLzrB,EAAKyrB,SAASv4B,cAAckR,QAAQJ,EAAK9Q,iBAExC,OAAJ8M,QAAI,IAAJA,OAAA,EAAAA,EAAMurB,YAAavrB,EAAKyrB,WAC6E,IAAlG,UAAGzrB,EAAKurB,UAAR,YAAqBvrB,EAAKyrB,UAAWvF,OAAOhzB,cAAckR,QAAQJ,EAAK9Q,cAAcgzB,WAdtFphC,I,WCaTquB,IAAYvmB,IAAOC,IAAV,yIAQTyxL,IAAgB1xL,IAAOC,IAAV,sHAObgoB,IAAgBjoB,IAAOC,IAAV,0DAIbsnB,IAAgBvnB,IAAOC,IAAV,6LAWbwnB,IAAcznB,IAAO0nB,KAAV,iPASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,qHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,4EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,IAAkB9nB,IAAO0nB,KAAV,iDACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCyhP,IAAmBlmO,IAAO0nB,KAAV,sDAIhB8oE,IAAoBxwF,IAAOC,IAAV,kIASjB+oB,IAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCwvC,IAA6C,CAC/ClkC,WAAY,IA6HDszO,IAvHV,SAAC,GAA6C,IAA3Ct3H,EAA0C,EAA1CA,cAAeu3H,EAA2B,EAA3BA,qBACbC,EAAappM,eACbqpM,EAAcx/L,eACd3J,EAAiBlf,mBAAQ,kBAAMqoN,EAAYnpM,gBAAkB,KAAI,CACnEmpM,IAJ0C,EAONxvM,aACpCC,KADI5lC,EAPsC,EAOtCA,aAAcg4B,EAPwB,EAOxBA,cAItB7F,qBAAU,WACN+iN,EAAW,CACPxzO,WAAY,OAEjB,CAACwzO,IAEJ,IAAME,EAAoBv2O,uBAAY,WAClC,OAAImtC,EACOxT,mBACHs8M,IAAY90O,EAAa0B,YACzBmkB,KAFG2S,CAGLwT,GAEK,KAEZ,CAAChsC,EAAa0B,WAAYsqC,IAUvB9S,GAAkBk8M,IAAoB5zN,OACtC6zN,EAAqB33H,EAAcl8F,OAEnCoX,EAAgB9L,mBAClB,kBAAMkf,EAAexqB,SAAW6zN,IAChC,CAACrpM,EAAexqB,OAAQ6zN,IAG5B,OACI,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,KAAD,CACIj8M,SAAUpB,EACVvlB,SAAUu5B,EAAexqB,OAAS,EAClCzO,SAAS,sBAGjB,eAAC,IAAD,WACI,8BACI,cAAC,IAAD,CAAiB/C,YAAU,yBAA3B,SACKqlO,EAAqB,EAArB,UACQA,EADR,YAESA,EAAqB,EACf,kBACA,kBAEV,wBAGd,8BACKz8M,EACG,cAAC,IAAD,CACInmB,SAC6B,IAAzBirG,EAAcl8F,QAAgB0X,EAElCrnB,MAAOgmB,IAAaC,MAAMjmB,MAC1B6kB,YAAamB,IAAaC,MAAMpB,YAChCD,WAAYoB,IAAaC,MAAMrB,WAC/BxjB,QA3CP,WACjBgiO,EAAqB,KA2CGjlO,YAAU,wBARd,0BAaA,cAAC,IAAD,CACIyC,SAAUymB,EACVrnB,MAAOgmB,IAAaE,OAAOlmB,MAC3B6kB,YAAamB,IAAaE,OAAOrB,YACjCD,WAAYoB,IAAaE,OAAOtB,WAChCxjB,QA1DH,WACrBgiO,EAAqBG,IAAoBtlO,KAAI,SAAAxI,GAAI,OAAIA,EAAKgH,QA0DlC0B,YAAU,sBANd,6BAaXkpB,EACGi8M,EAAYx3H,iBACR,cAAC7iE,GAAA,EAAD,IAEA,cAACukD,IAAD,UACI,cAAC,MAAD,CAAY3sF,KAAMqjB,KAAgBhjB,SAAS,cAA3C,SACI,cAACgiO,IAAD,iCAOZ,cAAC,IAAD,CACIhuO,MAAOquO,IACP13H,cAAeA,EACfjrG,UAAU,EACVkiO,eAAgBM,UCjOlCV,IAAsB1lO,IAAOC,IAAV,wEAKnB4iD,IAAc7iD,IAAO0nB,KAAV,8BAEXo7B,IAAc9iD,IAAO0nB,KAAV,8BAEXi+M,IAAuB3lO,IAAOC,IAAV,mGAMpB2lO,IAAgB5lO,IAAOC,IAAV,qXACN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAK3Bi8L,IAAa7/L,IAAO0nB,KAAV,uEAEH,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAE5BgiP,IAKR,SAAC,GAA8C,IAA5CvuO,EAA2C,EAA3CA,MAAO22G,EAAoC,EAApCA,cAAei3H,EAAqB,EAArBA,eACpB3hL,EAAYn0D,uBACd,SAACq0D,GACG,QAASwqD,KAAmBxqD,GAASwqD,EAAcn9F,SAAS2yC,KAEhE,CAACwqD,IAGCjnG,EAAU0R,YAAY3R,MAEtB28C,EAAqBt0D,uBACvB,SAACX,GACG,QACMw/G,KACAx/G,GACFw/G,EAAcn9F,UAAUqE,OAAO1mB,MAGvC,CAACw/G,IAGCtqD,EAAgB,SAACl1D,GACfA,GAAUy2O,GACVA,EAAe1lL,aAA0ByuD,EAAex/G,KAIhE,IAAK6I,GAAUA,GAA0B,IAAjBA,EAAMya,OAAe,OAAO,KAEpD,IAAMozN,EAAmB7tO,EAAMib,QAC3B,SAAA1a,GAAI,OAAIA,EAAKgH,IAAMovG,EAAcn9F,SAASjZ,EAAKgH,OAG7CumO,EAAsB9tO,EAAMib,QAC9B,SAAA1a,GAAI,OAAIA,EAAKgH,KAAOovG,EAAcn9F,SAASjZ,EAAKgH,OAGpD,OACI,eAAC,IAAD,WACKsmO,EAAiBpzN,OAAS,GACvB,eAAC,IAAD,WACKozN,EAAiB9kO,KAAI,SAAAxI,GAClB,OACI,eAAC,IAAD,WACI,cAACqrB,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU1rD,EAAKgH,KACf6kD,EAAmB7rD,EAAKgH,IAE5BmL,QAAS05C,EAAmB7rD,EAAKgH,IACjCqmB,aAAc,kBAAMy+B,EAAc9rD,EAAKgH,KACvCyE,SAAS,mCAEb,eAAC,IAAD,CACIE,QAAS,kBAAMmgD,EAAc9rD,EAAKgH,KAClC0B,YAAU,6BAFd,UAIK1I,EAAKkmC,UAJV,IAIsBlmC,EAAKomC,SAJ3B,IAIsCpmC,EAAKgH,MAAL,OAAYmI,QAAZ,IAAYA,OAAZ,EAAYA,EAASnI,KAAM,cAAC,IAAD,yBAf1ChH,EAAKgH,OAoBvCsmO,EAAiBpzN,OAASza,EAAMya,QAAU,cAAC,KAAD,CAAclU,MAAM,WAGvE,cAAC,IAAD,UACKunO,EAAoB/kO,KAAI,SAAAxI,GACrB,OACI,eAAC,IAAD,WACI,cAACqrB,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAU1rD,EAAKgH,KACf6kD,EAAmB7rD,EAAKgH,IAE5BmL,QAAS05C,EAAmB7rD,EAAKgH,IACjCqmB,aAAc,kBAAMy+B,EAAc9rD,EAAKgH,KACvCyE,SAAS,0BAEb,eAAC,IAAD,CACIE,QAAS,kBAAMmgD,EAAc9rD,EAAKgH,KAClC0B,YAAU,oBAFd,UAIK1I,EAAKkmC,UAJV,IAIsBlmC,EAAKomC,SAJ3B,IAIsCpmC,EAAKgH,MAAL,OAAYmI,QAAZ,IAAYA,OAAZ,EAAYA,EAASnI,KAAM,cAAC,IAAD,yBAf1ChH,EAAKgH,aCnGlD8mB,IAAYvmB,IAAOC,IAAV,yIAQTyxL,IAAgB1xL,IAAOC,IAAV,sHAObgoB,IAAgBjoB,IAAOC,IAAV,0DAIbsnB,IAAgBvnB,IAAOC,IAAV,6LAWbwnB,IAAcznB,IAAO0nB,KAAV,iPASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,qHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,4EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,IAAkB9nB,IAAO0nB,KAAV,iDACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCyhP,IAAmBlmO,IAAO0nB,KAAV,sDAIhB8oE,IAAoBxwF,IAAOC,IAAV,kIASjB+oB,IAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAIhCwvC,IAA6C,CAC/ClkC,WAAY,IAqID6zO,IA/HV,SAAC,GAA4C,IAA1C73H,EAAyC,EAAzCA,cAAe83H,EAA0B,EAA1BA,oBACbN,EAAajpM,eACbkpM,EAAcx/L,eACd8/L,EAAgB3oN,mBAAQ,kBAAMqoN,EAAYM,eAAiB,KAAI,CACjEN,IAJyC,EAOLxvM,aACpCC,KADI5lC,EAPqC,EAOrCA,aAAcg4B,EAPuB,EAOvBA,cAItB7F,qBAAU,WACN+iN,EAAW,CACPxzO,WAAY,OAEjB,CAACwzO,IAEJ,IAAME,EAAoBv2O,uBAAY,WAClC,OAAI42O,EACOj9M,mBACHs8M,IAAY90O,EAAa0B,YACzBmkB,KAFG2S,CAGLi9M,GAEK,KAEZ,CAACz1O,EAAa0B,WAAY+zO,IAUvBv8M,GAAkBk8M,IAAoB5zN,OACtC6zN,EAAqB33H,EAAcl8F,OAEnCoX,EAAgB9L,mBAClB,kBAAM2oN,EAAcj0N,SAAW6zN,IAC/B,CAACI,EAAeJ,IAGpB,OACI,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,KAAD,CACIj8M,SAAUpB,EACVvlB,SAAUgjO,EAAcj0N,OAAS,EACjCzO,SAAS,qBAGjB,eAAC,IAAD,WACI,8BACI,cAAC,IAAD,CAAiB/C,YAAU,wBAA3B,SACKqlO,EAAqB,EAArB,UACQA,EADR,YAESA,EAAqB,EACf,kBACA,kBAEV,wBAGd,8BACKz8M,EACG,cAAC,IAAD,CACInmB,SAC6B,IAAzBirG,EAAcl8F,QAAgB0X,EAElCrnB,MAAOgmB,IAAaC,MAAMjmB,MAC1B6kB,YAAamB,IAAaC,MAAMpB,YAChCD,WAAYoB,IAAaC,MAAMrB,WAC/BxjB,QA3CP,WACjBuiO,EAAoB,KA2CIxlO,YAAU,uBARd,0BAaA,cAAC,IAAD,CACIyC,SAAUymB,EACVrnB,MAAOgmB,IAAaE,OAAOlmB,MAC3B6kB,YAAamB,IAAaE,OAAOrB,YACjCD,WAAYoB,IAAaE,OAAOtB,WAChCxjB,QA1DH,WACrBuiO,EAAoBJ,IAAoBtlO,KAAI,SAAAxI,GAAI,OAAIA,EAAKgH,QA0DjC0B,YAAU,qBANd,6BAaXkpB,EACGi8M,EAAYv3H,gBACR,cAAC9iE,GAAA,EAAD,IACA96C,EAAa0B,WACb,cAAC,IAAD,UACI,cAAC,MAAD,CAAYgR,KAAMqjB,KAAgBhjB,SAAS,mBAA3C,SACI,cAAC,IAAD,iCAMR,cAAC,IAAD,UACI,cAAC,MAAD,CAAYL,KAAMuqI,GAAMlqI,SAAS,aAAjC,SACI,cAAC,IAAD,+BAOZ,cAAC,IAAD,CACIhM,MAAOquO,IACP13H,cAAeA,EACfjrG,UAAU,EACVkiO,eAAgBa,UC5OlCpgN,IAAYvmB,IAAOC,IAAV,iHAMTkvB,IAAUnvB,IAAOC,IAAV,+IAQP+gD,IAAUhhD,IAAOC,IAAV,4JASPglI,IAAiBjlI,IAAO0nB,KAAV,2HAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8oD,IAAgBvtC,IAAOC,IAAV,yDAIb4mO,IAAmB7mO,IAAOC,IAAV,mJAQT6mO,IAUR,SAAC,GAUC,IATHC,EASE,EATFA,uBACAC,EAQE,EARFA,oBACAZ,EAOE,EAPFA,qBACAa,EAME,EANFA,mBACAC,EAKE,EALFA,mBACAC,EAIE,EAJFA,sBACAR,EAGE,EAHFA,oBACAS,EAEE,EAFFA,kBACA7hG,EACE,EADFA,eAEAjiH,qBAAU,WACN8iN,EAAqBY,GACrBL,EAAoBO,KAErB,IAEH,IAAMzzI,EAAiBzjG,uBAAY,WAC/Bi3O,EAAmBF,GACnBK,EAAkBD,GAClB5hG,MACD,CACCwhG,EACAI,EACA5hG,EACA0hG,EACAG,IAGE/8C,EAAiBr6L,uBAAY,WAC/Bo2O,EAAqB,IACrBO,EAAoB,MACrB,CAACP,EAAsBO,IAEpB3/E,EACF+/E,EAAuBp0N,OAASw0N,EAAsBx0N,OAE1D,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC4hB,GAAA,EAAD,CAAUpwB,MAAO,aAAcD,SAAS,yBAAxC,SACI,cAAC2iO,IAAD,UACI,cAAC,IAAD,CACIh4H,cAAek4H,EACfX,qBAAsBA,QAIlC,cAAC7xM,GAAA,EAAD,CAAUpwB,MAAO,YAAaD,SAAS,wBAAvC,SACI,cAAC2iO,IAAD,UACI,cAAC,IAAD,CACIh4H,cAAes4H,EACfR,oBAAqBA,WAKrC,eAAC,IAAD,WACI,eAAC,IAAD,CAAgBxlO,YAAU,8BAA1B,UACK6lJ,EADL,eAGA,cAAC,IAAD,UACI,cAAC,IAAD,CACIvoJ,MAAO,QACPoC,QAAS,UACTpG,OAAQ,kBAAM4vL,KACdzmL,SAAUojJ,EAAuB,EACjCzjJ,oBAAqBtf,IAAUC,OAAOQ,WACtCwf,SAAS,eANb,qBAWJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,sBAHb,iCChHDmjO,IApBSjpO,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACII,MAAM,6BACNF,MAAM,OACNC,OAAO,OACPW,KAAK,OACLb,QAAQ,YACRF,UAAWA,EACXD,IAAKA,EAPT,UASI,sBAAMI,MAAM,KAAKC,OAAO,IAAIG,EAAE,IAAIC,EAAE,IAAIO,KAAK,eAAewwK,GAAG,QAC/D,sBAAMpxK,MAAM,KAAKC,OAAO,IAAIG,EAAE,KAAKC,EAAE,IAAIO,KAAK,eAAewwK,GAAG,QAChE,sBAAMxwK,KAAK,eAAeC,SAAS,UAAUC,EAAE,qLAAqLojD,SAAS,kBCZvPn7C,IAA6C,CAC/C4b,MAAM,GAGGkkN,IAAiB,SAACxlO,GAAD,OAAqBA,EAAMylO,eAAenkN,MCP3D+pD,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CuiM,uBAAwB,CACpBlxI,SAAU,KAGdmxI,2BAA4B,CACxB1zK,QAAS,OC8CX2iE,IAAKhyE,EAAQ,IAEb+qH,IAAiB,GAKjB08F,IAqBD,SAAC,GAYC,IAAD,UAXFC,EAWE,EAXFA,OACAC,EAUE,EAVFA,iBACAC,EASE,EATFA,aACAC,EAQE,EARFA,cACAhgO,EAOE,EAPFA,QACAigO,EAME,EANFA,cACAv3H,EAKE,EALFA,eACAw3H,EAIE,EAJFA,wBACAC,EAGE,EAHFA,oBACAhkO,EAEE,EAFFA,QACA6T,EACE,EADFA,QACE,EACwCuL,mBAAS,IAAIhD,MADrD,mBACK+mD,EADL,KACoBqkE,EADpB,OAEoCpoH,oBAAkB,GAFtD,mBAEK8mD,EAFL,KAEkBuhE,EAFlB,OAI0DroH,mBAE1D,IANA,mBAIK4jN,EAJL,KAI6BiB,EAJ7B,OAOoD7kN,mBAClD,IARF,mBAOK6jN,EAPL,KAO0BiB,EAP1B,OAUwD9kN,mBAExD,IAZA,mBAUKgkN,EAVL,KAU4Be,EAV5B,OAakD/kN,mBAAmB,IAbrE,mBAaK+jN,EAbL,KAayBiB,EAbzB,KAeI78F,EAAgB5I,KAChBp2B,EAA8BvzF,eAE9Bge,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,CAAEC,MAAO,yBAA0BC,KAAK,GACjDP,MAAOo4I,IACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAzBjB,EAmCEkkB,aAAqBC,GANrB5lC,EA7BF,EA6BEA,aACAg4B,EA9BF,EA8BEA,cACA4O,EA/BF,EA+BEA,WACAW,GAhCF,EAgCEA,UACAxB,GAjCF,EAiCEA,UACA6B,GAlCF,EAkCEA,oBAGEi1C,GAAUb,MACVr1D,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,IAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,IACtB,EAEAiB,GACF07F,GACAA,EAAOv1N,OACPo+F,GACAA,EAAe39F,OAAS80N,EAAOv1N,MAAMS,OAEnCw0D,GAAcn3E,uBAAY,WAC5BmB,EAAauB,MAAQo4I,IACrB35I,EAAawB,OAASm5I,GACtB67F,EAAax2O,GACbo6I,EAAiB,IAAIprH,MACrBqrH,GAAe,GAEfs8F,EAAwB,IAAI,EAAM/7F,MACnC,CACCD,GACAC,GACA47F,EACAx2O,EACA22O,IAGEM,GAAoB9uN,YAAYguN,KAEhC7wC,GAAiBzmM,uBACnB,SAACoI,GACGwf,EAAQH,KACJluB,IAAO8B,aAAaC,SAASqE,QACzB,WACAyI,EAAQxI,eAIpB,CAACgoB,IAGCixI,GAAsB74J,uBACxB,SAAC2a,GACG,IAAMmE,EACD24N,GACGA,EAAOv1N,MAAMjR,KAAI,SAACsN,GAAD,OAAkBwH,OAAOxH,EAAM9O,QACpD,GACJqoO,EACIh5N,EACAnE,EACAohI,MAGR,CAAC07F,EAAQ17F,GAA6B+7F,IAUpCr/B,IACDn4F,GAAmBA,IAAmBA,EAAe39F,OAEpD5f,GAAU5B,EAAa4B,QACvBs1O,GAAUv+F,GAAW,OAAQ/2I,GAASglC,GACtCuwM,GAAgBx+F,GAAW,aAAc/2I,GAASglC,GAClDwwM,GAAez+F,GAAW,oBAAqB/2I,GAASglC,GACxDywM,GAAe1+F,GAAW,YAAa/2I,GAASglC,GAChD0wM,GAAkB3+F,GACpB,yBACA/2I,GACAglC,GAEE2wM,GAAe5+F,GAAW,YAAa/2I,GAASglC,GAEhD4wM,GAA6BlxC,GA3JjB,YA2J0CvgK,IACtD0xM,GAA4BnxC,GA3JjB,iBA2JyCvgK,IAEpDkvM,GAAuB,SAAC7uO,GAC1BywO,EAA0BzwO,IAExB0vO,GAAqB,SAAC1vO,GACxB0wO,EAAuB1wO,IAGrBovO,GAAsB,SAACpvO,GACzB2wO,EAAyB3wO,IAEvB6vO,GAAoB,SAAC7vO,GACvB4wO,EAAsB5wO,IAGpB4hB,GAAck5B,eAQdw6F,IAAe46F,GAAWA,IAAWA,EAAOv1N,MAAMS,OAGlD89E,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAc,UAAE74I,EAAauX,eAAf,aAAE,EAAsBiK,OACtC4jF,YAAkB,OAANkxI,QAAM,IAANA,OAAA,EAAAA,EAAQv1N,MAAMS,SAAU,IAwBlCk2N,GAAqB,SAAC/5N,GACxBw9F,EAA4B,CACxB7+D,WAAY,UACZ/E,YACI,yFACJkF,iBAAkB,UAClBD,kBAAmB,UACnBD,WAAY,SACZG,UAAW,kBAxBW,SAAC/+B,GAC3B,IAAMo6L,EAAqC,IAApBp6L,EAAS6D,QAAuBs3D,EAEvD29J,EACI94N,EACAm7D,EACM2gE,GAAYz5I,EAAD,OAAes2O,QAAf,IAAeA,OAAf,EAAeA,EAAQt1N,YAClChhB,EACN+3M,GAgBiB4/B,CAAsBh6N,OAI/CuoL,IAAiB,WACblmM,EAAauB,MAAQo4I,IACrB35I,EAAawB,OAASm5I,GACtB67F,EAAax2O,KACd,CAACw2O,EAAcx2O,IAElBmyB,qBAAU,YACFukN,IAAa,OAAIH,QAAJ,IAAIA,OAAJ,EAAIA,EAAkBjoO,MACnCs5B,OAEL,CAAC8uM,EAAD,OAAgBH,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAkBjoO,GAAIs5B,KAEzCzV,qBAAU,WACN,IAAMs0I,EAAgB6vE,EAChBA,EAAOv1N,MAAMjR,KAAI,SAAAsN,GAAK,OAAIwH,OAAOxH,EAAM9O,OACvC,GACAm6L,EAAejjL,aACjB25F,EACAsnD,GAEAgiC,GAAgBA,EAAajnL,OAAS,GACtCm1N,EAAwBluC,GAAc,KAE3C,CAACtpF,EAAgBm3H,EAAQK,IAE5BxkN,qBAAU,WACNqlN,GAA2B3B,GAC3B4B,GAA0B1B,KAC3B,CACCF,EACAE,EACAyB,GACAC,KAGJtlN,qBAAU,WACN,OAAO,WACH8iN,GAAqB,IACrBO,GAAoB,IACpBmB,EAAwB,IAAI,EAAM/7F,OAGvC,IAEHzoH,qBAAU,WACNwkN,EAAwB,IAAI,EAAM/7F,MAEnC,CAAC+7F,IAEJxkN,qBAAU,YAEY,OAAdgtF,QAAc,IAAdA,OAAA,EAAAA,EAAgB39F,SAChB29F,EAAe39F,UAAf,OAA0B80N,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAQt1N,aAElCq5H,GAAe,KAEpB,QAACi8F,QAAD,IAACA,OAAD,EAACA,EAAQt1N,WAAYm+F,IAExBhtF,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAER,CAACozG,GAAeD,GAAWnzG,KAE9BpV,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgBopH,cAChC,CAACyd,IAyCJ,OACI,eAAC,GAAD,CACIhiB,SAAS,QACTuC,WAAkB,OAAPjkH,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAChB,cAAC,GAAD,CACIA,UAAWqU,EAAQrU,UACnBygK,mBAAoB9tJ,aAAW,OAAC0B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,QAGvDm4H,KAAM,cAAC,GAAD,IACN0C,cAAc,kBACdpqH,SAAS,QAVb,UAYKH,IAAYkmE,IAAgBm+J,IACzB,cAAC,KAAD,IAEJ,cAAC,gBAAD,CACI33I,YAAaA,GACbt+F,KAAI,OAAEs1O,QAAF,IAAEA,OAAF,EAAEA,EAAQv1N,MACdirF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,mBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEs1N,QAAF,IAAEA,OAAF,EAAEA,EAAQt1N,kBAAV,QAAwB,EAClC2nD,aAAcgxE,IACd74C,aA7DK,SAACv/F,EAAeC,GACrC+lC,GAAU/lC,IA6DMu/F,uBACI/gG,EAAa0B,WAAW8f,SAAxB,UACAxhB,EAAauX,eADb,aACA,EAAsBiK,QAC1BzO,SAAU,gBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,eAEvCzuC,8BACKz4D,kBAAQktE,KAAoBltE,kBAAQqkM,GACzC3rI,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAEumC,QAAF,IAAEA,OAAF,EAAEA,EAAgB39F,OAChCR,WAAU,OAAEs1N,QAAF,IAAEA,OAAF,EAAEA,EAAQt1N,WACpB2nD,aAAcgxE,IACdluC,iBAAkB,WACdkrI,EACI,IACA,EACA/7F,IAEJP,GAAe,IAEnBjjH,YAAa,WACT,IAAMzZ,EACD24N,GACGA,EAAOv1N,MAAMjR,KAAI,SAACsN,GAAD,OACbwH,OAAOxH,EAAM9O,QAErB,GACJqoO,EACIh5N,GACA,EACAi9H,IAEJP,GAAe,IAEnB3uC,kBAAmB,CACfj5F,SAAU6kM,GACVxvG,gBAAiB,gBACjBG,sBAAuB,CACnB30F,KAAgB8tN,gBAEpBl5H,oBAAqB,WACjBiX,GACIu4H,GAAmBv4H,IAE3BrmC,YAAaA,EACb93D,WAAU,OAAEs1N,QAAF,IAAEA,OAAF,EAAEA,EAAQt1N,aAG5B6pF,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIm2M,uBACIA,EAEJC,oBACIA,EAEJZ,qBACIA,GAEJa,mBAAoBA,GACpBE,sBACIA,EAEJD,mBAAoBA,EACpBP,oBACIA,GAEJS,kBAAmBA,GACnB7hG,eAAgB,WACZ30G,QAIZlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IA9BtB,SAgCK,SAACxxB,EAAD,SAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aACIsiG,EAAoBr0N,OACpBu0N,EAAmBv0N,OAEvB/O,SACI6sF,GAAY45C,gBACZlkI,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAEhCyQ,SAAS,uBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAqC,KAApB,OAAN0jO,QAAM,IAANA,GAAA,UAAAA,EAAQv1N,aAAR,eAAeS,QAC/B+9E,iBAAkB,CACd7sF,KAAMwjO,IACN9sO,KAAM,gBACN2J,SAAU,cAEdysF,uBAAwB,CACpBh4C,WAAY,SACZz0C,SAAU,oBAEd0sF,uBAAwB,CACpB1sF,SAAU,wBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,UAAW2lG,KAAoBA,EAAe39F,OAC9C/O,UACK6jO,GAAWA,GAAUA,EAAOv1N,MAAMS,OAAS,EAChD/H,QAASmhI,KAAgC9hE,EACzCe,YAtLU,SAAC/wB,GAC3BuxF,GAAe,GACfqd,GAAoB5uG,EAAM5E,OAAO1qC,UAqLjBzG,SAAU,mBAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,SACP1F,MAAO,IACHouI,GAAc,KAAOw7F,IAJxB,IAKDzkO,SAAUipI,GACVvuI,UAAW0vE,GAAQ60H,uBACnB3+L,SAAU,gBAPT,2BAUDC,MAAO,QACP1F,MAAO,IACHouI,GAAc,KAAOy7F,IAZxB,IAaD1kO,SAAUipI,GACV3oI,SAAU,uBAdT,2BAiBDC,MAAO,aACP1F,MAAO,IACHouI,GAAc,KAAO07F,IAnBxB,IAoBD3kO,SAAUipI,GACV3oI,SAAU,mBArBT,2BAwBDC,MAAO,aACP1F,MAAO,IACHouI,GAAc,KAAO27F,IA1BxB,IA2BD5kO,SAAUipI,GACV3oI,SAAU,yBA5BT,2BA+BDC,MAAO,YACP1F,MAAO,IACHouI,GAAc,KAAO47F,IAjCxB,IAkCD7kO,SAAUipI,GACV3oI,SAAU,kBAnCT,2BAsCDC,MAAO,YACP1F,MAAO,IACHouI,GAAc,KAAO67F,IAxCxB,IAyCD9kO,SAAUipI,GACV3oI,SAAU,qBAEd,CACIzF,MAAO,IAGfixF,UAAW,CACPE,WAAY,SAACrhF,GApXP,IAACnW,KAqXemW,EAAM9O,KApX3B0Z,GAAYzH,SAASjN,KAAgB6tN,iBAGtD77B,IAAkBA,GAAer+L,IAkXjB03F,kBAzNM,SAAC71C,EAAY1rC,GACnCi9H,GAAe,GAtMM,SAACnmH,EAAQ9W,GAC9B8W,EAAEC,kBACI/W,EAAM9O,IACRsoO,EAAoBx5N,EAAM9O,IAoM9BspO,CAAiB9uL,EAAO1rC,IAwNRshF,aAnOM,SAACthF,GAAD,QACpB+hG,KAAoB/hG,EAAM9O,IAAM6wG,EAAe5+F,SAASnD,EAAM9O,KAmOhDyE,SAAU,aACVyrF,MAAO,CACH,CACIR,UAAW,aACXC,WAAY,CACRrB,YAAa,SAACx/E,GAAD,gBACNA,EAAM9a,OACbw7F,gBAAgB,EAChBH,kBAAmB,SAACvgF,GAAD,YAAmB,CAClCyjD,UAAS,WACE,OAAPpqD,QAAO,IAAPA,OAAA,EAAAA,EAASnI,OAAT,OAAgB8O,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAO9O,WADlB,WAGbyE,SAAU,eAGlB,CACIirF,UAAW,aACXC,WAAY,CACRrB,YAAa,SAACx/E,GAAD,oBACTA,QADS,IACTA,GADS,UACTA,EAAO61F,kBADE,aACT,EAAmBx0G,YACvBsU,SAAU,gBAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SAAC3hD,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAO80K,UACZj0F,WAAY,CACRxB,UAAW,SAACr/E,GAAD,QACLA,EAAM80K,SACZl1F,aAAa,EACbJ,YAAa,SAACx/E,GAAD,+BACNA,QADM,IACNA,GADM,UACNA,EAAO80K,eADD,aACN,EAAgB1kJ,UADV,mBACuBpwB,QADvB,IACuBA,GADvB,UACuBA,EAAO80K,eAD9B,aACuB,EAAgBxkJ,WACpDmvD,eAAgB,SAACz/E,GAAD,MAAmB,CAC/B3G,QAAO,OAAE2G,QAAF,IAAEA,OAAF,EAAEA,EAAO80K,UAEpBn/K,SAAU,YAGlB,CACIirF,UAAW,aACXC,WAAY,CACRrB,YAAa,SAACx/E,GAAD,OACToT,aAAU,OAACpT,QAAD,IAACA,OAAD,EAACA,EAAOytI,YACtB93I,SAAU,kBAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SAAC3hD,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAO+uB,eACZ8xD,WAAY,CACRxB,UAAW,SAACr/E,GAAD,QACLA,EAAM+uB,cACZ6wD,aAAa,EACbJ,YAAa,SAACx/E,GAAD,+BACNA,QADM,IACNA,GADM,UACNA,EAAO+uB,oBADD,aACN,EAAqBqB,UADf,mBAC4BpwB,QAD5B,IAC4BA,GAD5B,UAC4BA,EAAO+uB,oBADnC,aAC4B,EAAqBuB,WAC9DmvD,eAAgB,SAACz/E,GAAD,MAAmB,CAC/B3G,QAAO,OAAE2G,QAAF,IAAEA,OAAF,EAAEA,EAAO+uB,eAEpBp5B,SAAU,WAGlB,CACIirF,UAAW,aACXC,WAAY,CACRrB,YAAa,SAACx/E,GAAD,OACToT,aAAU,OAACpT,QAAD,IAACA,OAAD,EAACA,EAAOktK,YACtBv3K,SAAU,gBAGlB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAACrgF,GAAD,OACrB,eAAC,GAAD,CACIumG,YAAa,IACbU,YAAW,OAAClF,QAAD,IAACA,OAAD,EAACA,EAAgB39F,QAC5BzO,SAAS,iBAHb,UAKI,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgB6tN,gBAFxB,SAKI,cAAC,GAAD,CACIluN,QAAS,kBACLqyL,GAAeloL,EAAM9O,KAEzByE,SAAS,cAJb,oBASJ,cAAC,KAAD,CACIiV,YAAa,CACT1U,KAAgB8tN,gBAFxB,SAKI,cAAC,GAAD,CACIjxJ,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFujN,GAAmB,CACft6N,EAAM9O,MAGdyE,SAAS,sBARb,2CAuDjC8kO,IA9BoB,WAC/B,IAAMlnO,EAAQglC,eACRmiM,EAAqBjiM,eACrBpvB,EAAUW,cACVovN,EAAejrM,eACf90B,EAAU0R,YAAY3R,MACtBuhO,EAAwB5zL,aAAmBqyL,GAC3CG,EAA0B/qM,eAC1BgrM,EAAsB/qM,eACtBmsM,EAAcvsM,eACd8qM,EAAmBn3E,KAAoBy1C,WAE7C,OACI,cAAC,IAAD,CACIpuL,QAASA,EACT8vN,iBAAkBA,EAClBC,aAAcuB,EACdtB,cAAeuB,EACfvhO,QAASA,EACT6/N,OAAQ3lO,EAAM3P,KACdm+G,eAAgBxuG,EAAMwuG,eACtBvsG,QAASjC,EAAMiC,QACf8jO,cAAeoB,EAAmB92O,KAClC21O,wBAAyBA,EACzBC,oBAAqBA,KCruBpBqB,IAA6B1qL,gB,SdV9Bn2C,K,6CAAAA,E,iDAAAA,E,iDAAAA,E,iDAAAA,E,sDAAAA,E,0DAAAA,E,oDAAAA,E,2DAAAA,U,KAYL,IeaK8gO,IfiBCC,IAA0B,SACnC1pO,GADmC,MAEF,CACjC5E,KAAMuN,IAAQghO,4BACd3pO,UgBvBS4pO,IAAyB,WAClC,IAAMnoO,EAAWO,cACX6nO,EAAkB54O,eAClBihB,EAAcnQ,cACdiG,EAAU0R,YAAY3R,MAE5B,OAAO3X,uBACH,SAACmB,EAA4Bu4O,EAAuBn2O,GAAwB,IAAD,QACvE,GAAI,OAACqU,QAAD,IAACA,OAAD,EAACA,EAASrU,UAAd,CAEA8N,EhBrBqD,CAC7DrG,KAAMuN,IAAQohO,uBgBqBN,IAAM9tO,GAAU,UAAC1K,EAAa0K,eAAd,QAAyB,IAAI8W,OAAS,EAChDxhB,EAAa0K,QACZsK,aAAY,UAACyB,EAAQ5T,YAAT,aAAC,EAAcP,MACxBi2O,OACA34O,EACJ64O,EAA8B,CAChCl3O,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAM,UAAExB,EAAawB,cAAf,QAAyB,EAC/B2iN,MAAOl+M,aAAsBjG,EAAa4B,QAAS,IACnD82O,UAAW14O,EAAa0B,WACxBirC,WAAW,OAACvqC,QAAD,IAACA,IAAaqU,EAAQrU,WAAW3D,WAC5C4oC,MAAK,OAAE38B,QAAF,IAAEA,OAAF,EAAEA,EAAS3I,KAAK,KACrB42O,UAAW34O,EAAa84I,UAClB,IAAI9pH,KAAKhvB,EAAa84I,WAAW8/F,mBACjCh5O,EACNi5O,QAAS74O,EAAa+4I,QAChB,IAAI/pH,KAAKhvB,EAAa+4I,SAAS6/F,mBAC/Bh5O,GAEV04O,EAAgBG,GACXt+M,MAAK,SAAAn5B,GhBjCa,IAC/B83O,EgBiCgB5oO,GhBjChB4oO,EgBiC6C93O,EhBhChB,CAC7B6I,KAAMuN,IAAQ2hO,uBACdD,egBgCaz+M,OAAM,SAAC5rB,GACJyB,EhB3Be,SAC/BzB,GAD+B,MAEF,CAC7B5E,KAAMuN,IAAQ4hO,uBACdvqO,SgBuByBwqO,CAAoBxqO,EAAMgB,UACnCkR,EAAYlS,EAAMgB,QAAS,eAGvC,CAACS,EAAUyQ,EAAa23N,EAAiB7hO,KAgBpCyiO,IAA6B,WACtC,IAAMhpO,EAAWO,cACX0oO,EAAoBvvO,cACpBwvO,EAAuBtvO,cACvB6W,EAAcnQ,cAOpB,OAAO3R,uBAAY,SAACg/K,GhB9Ba,IACjC50K,EgB8BIiH,GhB9BJjH,EgB8BmC40K,EAAOvvK,GhB7BX,CAC/BzE,KAAMuN,IAAQiiO,0BACdpwO,kBgB4BQ40K,EAAOy7D,cACPF,EAAqBv7D,EAAOvvK,GAAIuvK,EAAOy7D,eAClCn/M,MAAK,WACFjqB,EhBRmB,SACnCjH,GADmC,MAEF,CACjCY,KAAMuN,IAAQmiO,4BACdtwO,gBgBIyBuwO,CAAwB37D,EAAOvvK,QAE3C+rB,OAAM,SAAC5rB,GACJyB,EAASioO,IAAwB1pO,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,cAGnC0pO,EAAkBt7D,EAAOvvK,GAAIq0M,GAAqB82B,SAC7Ct/M,MAAK,SAACn5B,GACHkP,EhB/BgB,SAChCjH,EACAc,GAFgC,MAGF,CAC9BF,KAAMuN,IAAQsiO,yBACdzwO,eACAc,UgByByB4vO,CAAqB97D,EAAOvvK,GAAItN,EAAKsN,QAEjD+rB,OAAM,SAAC5rB,GACJyB,EAASioO,IAAwB1pO,EAAMgB,UACvCkR,EAAYlS,EAAMgB,QAAS,gBAIvC,CAACS,EAAUipO,EAAmBC,EAAsBz4N,KC/F/Ci5N,IAAiC,SAAA7qO,GAAU,IAC5CrE,EAA2BqE,EAA3BrE,QAASm9N,EAAkB94N,EAAlB84N,cADkC,EAET71M,mBAAmBtnB,GAAW,IAFrB,mBAE5CqkJ,EAF4C,KAE7B8qF,EAF6B,KAG7C9kG,EAAuBga,EAAcvtI,OAErCsmN,EAAmBjpO,uBACrB,kBAAMg7O,EAAiB,MACvB,CAACA,IAGC9R,EAAyBlpO,uBAC3B,kBAAMgpO,EAAc94E,KACpB,CAACA,EAAe84E,IAGpB,OACI,eAAC,IAAD,WACI,cAAC,IAAD,UACI,cAAC,IAAD,CAAiB70N,MAAM,QAAQ1F,MAAO,IAAKwuC,UAAW,IAAK/oC,SAAS,gBAApE,SACI,cAAC,GAAD,CACIg8I,cAAeA,EACfuB,sBAAuBupF,QAInC,eAAC,IAAD,WACI,cAAC,IAAD,CAAoBpnO,UAAWsiI,EAAsB9hI,QAAS60N,IAC9D,cAAC,IAAD,CAAoB70N,QAAS80N,Y,SFlBjCmQ,K,gBAAAA,E,kBAAAA,E,qBAAAA,U,KG1BL,I,4BAyCQ4B,IAzCkB7sO,sBAC7B,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRyoB,QAAQ,MACRtoB,MAAM,6BACNL,UAAWA,EAPf,SASI,mBAAG20B,OAAO,OAAOkyC,YAAY,IAAI9lE,KAAK,OAAOC,SAAS,UAAtD,SACI,mBACI6zB,UAAU,sCACV9zB,KAAK,eACLC,SAAS,UAHb,SAKI,oBAAG6zB,UAAU,oCAAb,UACI,sBACI5zB,EAAE,wQACFE,GAAG,SAEP,yBACIA,GAAG,YACH0zB,UAAU,qFACV+3M,OAAO,4FAEX,yBACIzrO,GAAG,YACH0zB,UAAU,mGACV+3M,OAAO,wGC5B1BlqL,IAAUhhD,IAAOC,IAAV,8EAKPkrO,IAAkBnrO,IAAOC,IAAV,gHAGtB,gBAAGlO,EAAH,EAAGA,OAAQuO,EAAX,EAAWA,MAAX,OACEvO,IAAWs3O,IAAgBh2O,SAC3Bs0B,YADA,gEAEarnB,EAAMpc,OAAOQ,eAKrB0mP,IAA8BprO,YAAOqrO,IAAPrrO,CAAH,iHAK3B,qBAAGM,MAAkBpc,OAAOQ,cAG5ByoF,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClBy/E,YAAa,uBCJN8jB,IAzBkBltO,sBAC7B,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIF,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,mBAAG4wD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,8kCAA8kCF,KAAK,cAE/lC,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,iBAAiB5zB,EAAE,iCCgBxD8iF,IAjCKjkF,sBAChB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,mBAAG4wD,YAAU,mBAAb,SACI,sBACIC,YAAU,UACVC,YAAU,UACVlwD,EAAE,4hBACFF,KAAK,mBAGb,+BACI,0BAAUI,GAAG,aAAb,SACI,sBACIJ,KAAK,OACLE,EAAE,4BCCfgsO,IAzBWntO,sBACtB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,mBAAG4wD,YAAU,mBAAb,SACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,4hBAA4hBF,KAAK,mBAErlB,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCM7BisO,IAvBaptO,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,2yBACFF,KAAK,sBCfZosO,IAAazrO,IAAOiS,EAAV,0EAKVy5N,IAAiB1rO,YAAOurO,IAAPvrO,CAAH,iHAQd2rO,IAAmB3rO,YAAOwrO,IAAPxrO,CAAH,+GCGd4rO,I,4JClBAA,IDCf,YAIyB,IAHrBjhO,EAGoB,EAHpBA,QACA4f,EAEoB,EAFpBA,SACArmB,EACoB,EADpBA,SAEA,OAAO,cAACunO,IAAD,CACHrnO,QAASmmB,EACTppB,YAAW+C,EAFR,SAKCyG,EACM,cAAC+gO,IAAD,IACA,cAACC,IAAD,OEoCZ55I,IAAKhyE,EAAQ,IAIb8rN,IAaD,SAAC,GASC,IAAD,IARFt4O,EAQE,EARFA,UACAurC,EAOE,EAPFA,YACA/6B,EAME,EANFA,QACAkmO,EAKE,EALFA,OACA/oF,EAIE,EAJFA,cACA4qF,EAGE,EAHFA,cACAC,EAEE,EAFFA,QACAC,EACE,EADFA,WACE,EACwC7oN,mBAAS,IAAIhD,MADrD,mBACK+mD,EADL,KACoBqkE,EADpB,OAEoCpoH,oBAAS,GAF7C,mBAEK8oN,EAFL,KAEkBC,EAFlB,OAWEp1M,aAAqB,CACrBjkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/BP,MAvCe,GAwCfC,OAAQ,EACRwf,WAAY,EACZS,cAAe,IAbfzhB,EALF,EAKEA,aACAg4B,EANF,EAMEA,cACA4O,EAPF,EAOEA,WACAW,EARF,EAQEA,UACAC,EATF,EASEA,UACAJ,EAVF,EAUEA,WAWE3gB,EAAUW,cACVy1D,EAAUb,MACVr1D,EAAWF,EAAQE,SACnB+zH,EAAYr8I,SAASuiG,IAAGngE,MAAM9Z,EAAShjB,QAAQu9F,MAC/Cy5C,EAAgBD,EACF,IAAdA,EACI,EAnDS,IAoDRA,EAAY,GACjB,EAEAr1G,EAAmB0kF,GAAgB/pH,GACnC2zM,EAAgB5pF,GAAgB3nH,GAMhC44O,EAAWn8O,uBAAY,WACzB,IAAM05O,EAAcxoF,EAAejgJ,KAAI,SAAA+kD,GAAI,OAAIA,EAAKvmD,MACpDtO,EAAawB,OAASm5I,EACtBggG,EAAc36O,EAAcu4O,EAAan2O,KAC1C,CAACu4O,EAAe36O,EAAc+vJ,EAAe3tJ,EAAWu4I,IAE3DxoH,qBAAU,WAED2oN,GACCt5M,kBAAQ6D,EAAkBrlC,IACxBoC,IAAcuxM,GAElBqnC,MAEL,CACCA,EACAh7O,EACAqlC,EACAjjC,EACAuxM,EACAmnC,IAIJ3oN,qBAAU,WACF2oN,IAAW,OAAI/qF,QAAJ,IAAIA,OAAJ,EAAIA,EAAevuI,UAC9Bu5N,GAAe,GACfC,OAEL,CAACF,EAAa/qF,EAAeirF,IAGhC7oN,qBAAU,kBAAM,kBAAMyoN,OAAW,IAEjCzoN,qBAAU,WACFuoH,EAAY,EACZpqI,YAAW,WACPi3B,EAAUozG,KACX,KACkB,IAAdD,GACPpqI,YAAW,WACPi3B,EAAU,KACX,OAGR,CAACmzG,IAnFF,ICI+BugG,EDiFzBniG,EAA8C94I,EAA9C84I,UAAWC,EAAmC/4I,EAAnC+4I,QAASn3I,EAA0B5B,EAA1B4B,QArF1B,EAqFoD5B,EAAjB0K,eArFnC,MAqF6C,GArF7C,EAsFIwwO,EAAgBr8O,uBAAY,WAC9Bm8O,IACA5gG,EAAiB,IAAIprH,QACtB,CAACgsN,IAGE17I,EADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBnuI,EAAQ8W,OACxB4jF,YAAkB,OAAN0zI,QAAM,IAANA,OAAA,EAAAA,EAAQ/3N,MAAMS,SAAU,EACpCs3H,YACAC,YAGEoiG,EAAa,6BCpHS,SAC5Bn7O,EACA4mC,GACE,IACMhlC,EAAY5B,EAAZ4B,QACR,MAAO,CACH0M,GAAIqqI,GAAW,KAAM/2I,EAASglC,GAC9Bt/B,KAAMqxI,GAAW,OAAQ/2I,EAASglC,GAClC8Y,SAAUi5F,GAAW,WAAY/2I,EAASglC,GAC1C9X,KAAM6pH,GAAW,OAAQ/2I,EAASglC,GAClC3yB,KAAM0kI,GAAW,OAAQ/2I,EAASglC,GAClCinL,SAAUl1E,GAAW,WAAY/2I,EAASglC,ID0GvCw0M,CAAiBp7O,EAAc4mC,IADnB,IAEfy0M,KAAM1iG,GAAW,eAAgB/2I,EAASglC,KAExCkkE,ECvK8B,SACpC9qG,EACAi7O,EACAzzM,EACAz0B,GACyB,IACjB+lI,EAAuB94I,EAAvB84I,UAAWC,EAAY/4I,EAAZ+4I,QACb6vF,EAAwB/pO,uBAC1B,SAACuP,GAAD,OAAqBo5B,EAAU,YAAap5B,KAC5C,CAACo5B,IAECqhM,EAAsBhqO,uBACxB,SAACuP,GAAD,OAAqBo5B,EAAU,UAAWp5B,KAC1C,CAACo5B,IAECshM,EAAmBjqO,uBACrB,SAACiwB,GACG85M,EAAsB95M,EAAKmoE,OAC3B4xI,EAAoB/5M,EAAKooE,OAE7B,CAAC0xI,EAAuBC,IAG5B,MAAO,CACHr9H,mBAAoB,CAChB92F,MAAO,CACHuiF,MAAO6hD,EAAY,IAAI9pH,KAAK8pH,GAAa,KACzC5hD,IAAK6hD,EAAU,IAAI/pH,KAAK+pH,GAAW,MAEvCniD,aAAa,EACbx9D,SAAU0vM,EACVhyI,gBAAgB,EAChBrkF,SACIwoO,IACCniG,IACAC,EACLhmI,aDmIsBuoO,CAC1Bt7O,EACAs/F,EAAYpmE,eACZsO,EACA,uBAEE+zM,GC1G2BN,GD2G5BroO,GAAqC,KAApB,OAANkmO,QAAM,IAANA,GAAA,UAAAA,EAAQ/3N,aAAR,eAAeS,QC1GxBsL,mBAAQ,WACX,MAAO,CACHszE,qBAAsB66I,EACtB17I,iBAAkB,CACd7sF,KAAMynO,IACN/wO,KAAM,sBACN2J,SAAU,oBAEdysF,uBAAwB,CACpBh4C,WAAY,eACZz0C,SAAU,6BAGnB,CAACkoO,KD0GJ,OACI,eAAC,GAAD,CACI9iH,SAAS,eACTgF,cAAa,uBACTxvF,EAAW,YAAQA,GAAgB,GAD1B,cAGb56B,SAAS,aALb,UAOKH,GAAW,cAAC,KAAD,IACZ,cAAC,gBAAD,CACI0sF,YAAaA,EACbt+F,KAAI,OAAE83O,QAAF,IAAEA,OAAF,EAAEA,EAAQ/3N,MACdirF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaklK,EACbnoO,SAAU,wBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAE83N,QAAF,IAAEA,OAAF,EAAEA,EAAQ5wL,aAAV,QAAmB,EAC7BygB,aAxKD,GAyKCm4B,aAzBK,SAACv/F,EAAeC,GACrC+lC,EAAU/lC,IAyBMu/F,uBACI/gG,EAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,GAC7B+S,SAAU,qBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,EAAY65C,cACnCpmI,SAAU,qBAEd83F,cAAe,CACXU,gBACI,cAAC,IAAD,CACI94F,SAAU6sF,EAAY45C,eACtB3F,aAAc7oI,EAAQ8W,OACtBzO,SAAS,qBAHb,SAKK,gBAAG0sB,EAAH,EAAGA,KAAH,OACG,cAAC,IAAD,CACI/0B,QAASA,EACTm9N,cAAe,SAAA94E,GACX3nH,EAAW2nH,GACXtvH,WAOxBqrE,yBAEJ5K,8BAA+Bq7I,EAC/BrvI,eAAgB,CACZpQ,QAAS,CAAC,2BAEF9oF,MAAO,IACP1F,MAAO,IACJ6tO,EAAc7sO,IAJhB,IAKDmE,SAAU6sF,EAAY85C,eACtBjsI,UAAW0vE,EAAQ+5D,qBACnB7jI,SAAU,cAPT,2BAUDC,MAAO,QACP1F,MAAO,IACJ6tO,EAAc7zO,MAZhB,IAaDmL,SAAU6sF,EAAY85C,eACtBrmI,SAAU,iBAdT,2BAiBDC,MAAO,WACP1F,MAAO,IACJ6tO,EAAcz7L,UAnBhB,IAoBDjtC,SAAU6sF,EAAY85C,eACtBrmI,SAAU,oBAEd,CACIC,MAAO,MACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAU,cA3BT,2BA8BDC,MAAO,OACP1F,MAAO,MACJ6tO,EAAcrsN,MAhChB,IAiCDrc,SAAU6sF,EAAY85C,eACtBrmI,SAAU,gBAlCT,2BAqCDC,MAAO,OACP1F,MAAO,IACJ6tO,EAAclnO,MAvChB,IAwCDxB,SAAU6sF,EAAY85C,eACtBrmI,SAAU,gBAzCT,2BA4CDC,MAAO,WACP1F,MAAO,IACJ6tO,EAActtB,UA9ChB,IA+CDp7M,SAAU6sF,EAAY85C,eACtBrmI,SAAU,oBAhDT,2BAmDDR,SAAU,cAAC,IAAD,IACVjF,MAAO,GACJ6tO,EAAcE,MArDhB,IAsDD5oO,SAAU6sF,EAAY85C,eACtBrmI,SAAU,iBAGlBwrF,UAAW,CACPxrF,SAAU,kBACVyrF,MAAO,CACH,CACIR,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,QAEhB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAQvvK,KACd2vF,WAAY,CACRrB,YAAa,SAACihF,GAAD,oBACTA,QADS,IACTA,GADS,UACTA,EAAQvvK,UADC,aACT,EAAY7P,YAChBsU,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAOv2K,MACb22F,WAAY,CACRrB,YAAa,SAACihF,GAAD,gBACNA,EAAOv2K,KAAKkmC,UADN,YACmBqwI,EAAOv2K,KAAKomC,WAC5C36B,SAAU,yBAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAO29D,cACbr9I,wBAAyB,SACrB0/E,GADqB,OAGrB,eAACm8D,IAAD,CACIp5O,OACIi9K,EAAO49D,eAFf,UAKI,qBAAKzrO,YAAU,2BAAf,SACK6tK,EAAO29D,eAEX39D,EAAO49D,iBACJvD,IAAgBh2O,SAChB,cAAC,KAAD,CACIoQ,MAAM,4BACNi5D,SAAS,uBAFb,SAII,sBAAMv7D,YAAU,gCAAhB,SACI,cAACiqO,IAAD,aAOxB,CACIj8I,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAO69D,WACD79D,EAAO89D,yBAA4CjoO,KAAaK,eAC5EkqF,WAAY,CACRrB,YAAa,SAACihF,GAAD,OACTA,EAAO69D,UAAP,UACS79D,EAAO69D,UADhB,eACgC79D,EAAOqV,cACjC,OACVngL,SAAU,wBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAO+9D,aACb39I,WAAY,CACRrB,YAAa,SAACihF,GAAD,OACTjuJ,KAAMiuJ,EAAO+9D,aAAa5qN,OACtB,oBAERje,SAAU,yBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAO89D,wBACb19I,WAAY,CACRrB,YAAa,SAACihF,GAAD,OACT7pK,aACI6pK,EAAO89D,yBAEf5oO,SAAU,yBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SACjB8+G,GADiB,OAEfA,EAAOgwC,UACb5vH,WAAY,CACRrB,YAAa,SAACihF,GAAD,gBACNv8J,KAAKqpI,MAAwB,IAAlBkzB,EAAOgwC,UADZ,MAEb96M,SAAU,6BAGlB,CACIirF,UAAW,eACXG,wBAAyB,SACrB0/E,GADqB,OAGrB,cAAC,IAAD,UACI,cAACg+D,IAAD,CACIriO,UAAWqkK,EAAOy7D,cAClBlgN,SAAU,kBAAMyhN,EAAWh9D,IAC3B9qK,SAAS,sCAoCtC+oO,IAvB0B,WAAO,IAAD,EACrCC,EAAe1D,MACfuC,EXvX6B,WACnC,IAAM1qO,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EAASszN,QACV,CAACtzN,IWkXY8rO,GACVC,EAAmB/C,MAEnB5vM,EAAUnhB,YAAYkhB,MACtB6yM,EbhbC/zN,YAAY1U,qBAAWwkO,MaibxBloF,EAAgBD,KAEtB,OACI,cAAC,IAAD,CACIgpF,OAAQoD,EAAYl7O,KACpBoB,UAAS,OAAEknC,QAAF,IAAEA,OAAF,EAAEA,EAASh7B,GACpBq/B,YAAarE,EAAQhnC,KACrBsQ,QAASspO,EAAYtpO,SAAWspO,EAAYC,YAC5CpsF,cAAa,UAAEA,EAAc/uJ,YAAhB,aAAE,EAAoB+f,MACnC45N,cAAeoB,EACfnB,QAASA,EACTC,WAAYoB,KErclBttF,IAAkB9/I,IAAOC,IAAV,wEAKf4iD,IAAc7iD,IAAO0nB,KAAV,8BAEXo7B,IAAc9iD,IAAO0nB,KAAV,8BAEXq4H,IAAmB//I,IAAOC,IAAV,mGAMhB+/I,IAAYhgJ,IAAOC,IAAV,qXACF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAOvB,SAAA8a,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SAKxC,SAAA+b,GAAK,OAAIA,EAAM0D,UAAY,0BAM3BiuD,IAAuB7xD,IAAO0nB,KAAV,gOAOb,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5B8oP,IAIR,SAAC,GAAoD,IAAlDC,EAAiD,EAAjDA,YAAattF,EAAoC,EAApCA,cAAeE,EAAqB,EAArBA,eAC1Bx4I,EAAU0R,YAAY3R,MACtBw8C,EAAYn0D,uBACd,SAACq0D,GACG,QAAS67F,KAAmB77F,GAAS67F,EAAcxuI,SAAS2yC,KAEhE,CAAC67F,IAGC57F,EAAqBt0D,uBACvB,SAACyL,GACG,QACMykJ,KACAzkJ,GACFykJ,EAAcxuI,UAAUqE,OAAOta,MAGvC,CAACykJ,IAGC37F,EAAgB,SAAC9oD,GACfA,GAAU2kJ,GACVA,EAAe3kJ,IAIjBgyO,EAAqBD,EACrBA,EAAYr6N,QACR,SAAA6yC,GAAI,OACAA,EAAKkwF,WAAclwF,EAAKvmD,IAAMygJ,EAAcxuI,SAASs0C,EAAKvmD,OAElE,GAEAiuO,EAAwBF,EACxBA,EAAYr6N,QACR,SAAA6yC,GAAI,OACCA,EAAKkwF,WAAalwF,EAAKvmD,KAAOygJ,EAAcxuI,SAASs0C,EAAKvmD,OAEnE,GAEN,OACI,eAAC,IAAD,WACKguO,EAAmB96N,OAAS,GACzB,eAAC,IAAD,WACK86N,EAAmBxsO,KAAI,SAAA0sO,GACpB,OACI,eAAC,IAAD,WACI,cAAC7pN,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUwpL,EAAOluO,KACjB6kD,EAAmBqpL,EAAOluO,IAE9BmL,QAAS05C,EAAmBqpL,EAAOluO,IACnCqmB,aAAc,kBACVy+B,EAAcopL,EAAOluO,OAG7B,cAAC,IAAD,CACI2E,QAAS,kBAAMmgD,EAAcopL,EAAOluO,KADxC,mBAGQkuO,EAAOhvM,UAHf,YAG4BgvM,EAAO9uM,cAfhB8uM,EAAOluO,OAoBrCguO,EAAmB96N,QACf66N,EAAcA,EAAY76N,OAAS,IACpC,cAAC,KAAD,CAAclU,MAAM,WAIhC,cAAC,IAAD,UACKivO,EAAsBzsO,KAAI,SAAA0sO,GACvB,OACI,eAAC,IAAD,WACI,cAAC7pN,GAAA,EAAD,CACIzf,KAAM,GACNsG,QACIw5C,EAAUwpL,EAAOluO,KACjB6kD,EAAmBqpL,EAAOluO,IAE9BmL,QAAS05C,EAAmBqpL,EAAOluO,IACnCqmB,aAAc,kBAAMy+B,EAAcopL,EAAOluO,OAE7C,eAAC,IAAD,CAAW2E,QAAS,kBAAMmgD,EAAcopL,EAAOluO,KAA/C,oBACQkuO,EAAOhvM,UADf,YAC4BgvM,EAAO9uM,UAC9Bj3B,GAAWA,EAAQnI,KAAOkuO,EAAOluO,IAC9B,cAAC,IAAD,yBAbWkuO,EAAOluO,aCjGvCmuO,IAhCYxvO,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLK,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BANf,SAQI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,4BACI,4BACI,sBACIC,EAAE,6gCACF4zB,UAAU,6GChBhD4xB,IAAoB/kD,IAAOC,IAAV,oLASjB8mB,IAA2B/mB,IAAOC,IAAV,oIAOxBG,IAAcJ,IAAOC,IAAV,+GAGJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAInC+hC,IAAezmB,IAAOC,IAAV,0PACC,SAAAC,GAAK,OAAIA,EAAMI,MAAMjX,MAAMC,WAQjC,SAAA4W,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cA6B1BmpP,IA1BwD,SAAC,GAGjE,IAFH9pO,EAEE,EAFFA,QACAq/B,EACE,EADFA,QAEA,OAAIr/B,EAEI,cAAC,IAAD,UACI,cAAC,KAAD,MAMR,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC,IAAD,UACKq/B,EAAU,cAAC,IAAD,IAAkB,cAAClc,GAAA,EAAD,MAEjC,cAAC,IAAD,UACKkc,EAAU,sBAAwB,gCC9BjDq9G,IAAoBzgJ,IAAOC,IAAV,yIAQjBygJ,IAAkB1gJ,IAAOC,IAAV,sHAOfonB,IAAgBrnB,IAAOC,IAAV,0MAUbqnB,IAAmBtnB,IAAOC,IAAV,iIAOhBsnB,IAAgBvnB,IAAOC,IAAV,6LAWbwnB,IAAcznB,IAAO0nB,KAAV,iPASX,SAAAxnB,GAAK,OACHA,EAAM0D,SACA+jB,YADN,qHAEmBznB,EAAMI,MAAMpc,OAAOQ,YAGhCijC,YALN,4EAMmBznB,EAAM8C,UAIhB,qBAAG4kB,cAGH,qBAAGC,eAOdC,IAAkB9nB,IAAO0nB,KAAV,iDACR,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnCsjC,IAAc/nB,IAAOgoB,EAAV,8GAGJ,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAInC6iC,IAAgBjoB,IAAOC,IAAV,0DAKb6tO,IAA8C,SAAC,GAY9C,IAXHN,EAWE,EAXFA,YACA55N,EAUE,EAVFA,aACA7P,EASE,EATFA,QACAqkB,EAQE,EARFA,OACAG,EAOE,EAPFA,YACAG,EAME,EANFA,cACAwC,EAKE,EALFA,cACAvC,EAIE,EAJFA,aACAC,EAGE,EAHFA,kBACAC,EAEE,EAFFA,WAEE,IADFC,gBACE,SACIE,EAOF,CACAC,MAAO,CACHjmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,aAElC2hC,OAAQ,CACJlmB,MAAO/e,IAAUC,OAAOI,YACxBsjC,WAAY3jC,IAAUC,OAAOsD,UAC7BqgC,YAAa5jC,IAAUC,OAAOqD,cAjBpC,EAqBkC47B,mBAAS,IArB3C,mBAqBKtwB,EArBL,KAqBiBs2B,EArBjB,OAuBwDhG,mBAExD,IAzBA,mBAuBKmG,EAvBL,KAuB4BC,EAvB5B,KA2BIS,EAAeh6B,uBAAY,WAC7Bu4B,EAAY,MACb,CAACA,IAEEwlN,EAAuB9vN,mBAAQ,WACjC,GAAIuvN,EAAa,CACb,IAAMtuO,EClKe,SAC7BkY,EACAo2N,GAEA,OAAKp2N,EAIEo2N,EAAYr6N,QACf,SAAAw6N,GAAM,OACFA,EAAOhvM,UAAUr4B,cAAcoL,SAAS0F,EAAK9Q,gBAC7CqnO,EAAO9uM,SAASv4B,cAAcoL,SAAS0F,EAAK9Q,gBAC5C,UAAGqnO,EAAOhvM,UAAV,YAAuBgvM,EAAO9uM,UAAWvF,OAAOhzB,cAAcoL,SAAS0F,EAAK9Q,cAAcgzB,WAPvFk0M,ED6JYQ,CAAkBn7O,EAAY26O,GAC7C,GAAItuO,EAAOyT,OAAS,EAAG,CACnB,IAAMiX,EAAmB1qB,EAAO+B,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MACjD8pB,EACI3V,EAAaT,QAAO,SAAAC,GAAI,OAAIwW,EAAiBlY,SAAS0B,OAI9D,OAAOlU,EAEP,MAAO,KAEZ,CAACrM,EAAY26O,EAAa55N,IAEvBmW,EAAgB9L,mBAClB,kBAAMrK,EAAajB,UAAb,OAAwB66N,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAa76N,UAC3C,CAACiB,EAAajB,OAAQ66N,IAGpB7nL,EAAmB31D,uBAAY,WAC7B+5B,EACAxB,EAAY,IACLA,GACPA,EACIwlN,EACMA,EAAqB9sO,KAAI,SAAA0sO,GAAM,OAAIA,EAAOluO,MAC1C,MAGf,CAACsqB,EAAexB,EAAawlN,IAEhCzqN,qBAAU,WACN,OAAO,WACH4H,OAEL,CAACA,IAEJ5H,qBAAU,WAEAzwB,GACFy2B,EAAsB3W,SAAWiB,EAAajB,QAE9CgzC,MAEL,CAAC9yD,EAAY8yD,EAAkBr8B,EAAuB1V,EAAcm6N,IAEvE,IAAM5jN,IAAc,OAACqjN,QAAD,IAACA,OAAD,EAACA,EAAa76N,QAC5B0X,GAAkB0jN,EAAqBp7N,QAAU5O,EACjDkqO,EAA4B3kN,EAAsBnW,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KACrEkT,OAEL,OACI,cAAC,IAAD,UACI,eAAC,IAAD,WACKgW,GACG,cAAC,IAAD,UACI,cAAC,IAAD,UAAcA,MAGrBE,GACG,cAAC,IAAD,UACI,cAAC,KAAD,CACI0B,SAzEF,SAAC1kB,GAAD,OAAmBsjB,EAActjB,IA0E/BjC,SAAUumB,MAIrBvB,IAAsBuB,GACnB,eAAC,IAAD,WACI,8BACI,cAAC,IAAD,UACK8jN,EAA4B,EAA5B,UACQA,EADR,YAESA,EAA4B,EACtB,yBACA,yBAEV,+BAGd,8BACKlkN,EACG,cAAC,IAAD,CACInmB,SACqC,IAAjC0lB,EAAsB3W,QACtB0X,EAEJrnB,MAAOgmB,EAAaC,MAAMjmB,MAC1B6kB,YAAamB,EAAaC,MAAMpB,YAChCD,WAAYoB,EAAaC,MAAMrB,WAC/BxjB,QAAS4lB,EARb,0BAaA,cAAC,IAAD,CACIpmB,SAAUymB,EACVrnB,MAAOgmB,EAAaE,OAAOlmB,MAC3B6kB,YACImB,EAAaE,OAAOrB,YAExBD,WAAYoB,EAAaE,OAAOtB,WAChCxjB,QAASuhD,EAPb,6BAeft7B,EACG,cAAC,IAAD,CACItmB,QAASA,EACTq/B,UAAS,OAACoqM,QAAD,IAACA,OAAD,EAACA,EAAa76N,UAG3B,qCACI,cAAC,IAAD,CACI66N,YAAaO,EACb7tF,cAAe52H,EACf82H,eAAgB13H,IAEnBN,GAAUU,GACP,cAAC,IAAD,UACI,cAAC,IAAD,CACI9tB,KAAM,SACNyI,MAAO,OACPhJ,OAAQ,kBAAM2tB,KACd1pB,OAAQ,OACRD,MAAO,qBE5QrC8nB,IAAYvmB,IAAOC,IAAV,iHAMTkvB,IAAUnvB,IAAOC,IAAV,+IAQP2gD,IAAkB5gD,IAAOC,IAAV,mJAQf2hJ,IAAiB5hJ,IAAOC,IAAV,mJAQdiuO,IAAuBluO,IAAOC,IAAV,mJAQpB+gD,IAAUhhD,IAAOC,IAAV,4JASPglI,IAAiBjlI,IAAO0nB,KAAV,2HAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8oD,IAAgBvtC,IAAOC,IAAV,yDAINkuO,IAMR,SAAC,GAMC,IAAD,EALF/oG,EAKE,EALFA,kBACAC,EAIE,EAJFA,eACAqhE,EAGE,EAHFA,cACA0nC,EAEE,EAFFA,oBACA7oG,EACE,EADFA,eAEM/sG,EAAQ+iF,KACR/pH,EAASm5B,eACTi7G,EAAepyH,eACfmyH,EAAapyH,eACbuuI,EAAYrC,KACZ1Z,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAIJ,IAAM4nG,EAAca,KAAkBb,YAEhCc,EAAqBzsG,KACrB0sG,EAAyBtsG,KACzBusG,EAAkBhsG,KAClBisG,EAAmBrsG,KAEnB2jE,EAAgBnmD,KAChBzZ,EAAiBryH,eACjB46N,EAAsBpsG,KAEtB7uC,EAAiBzjG,uBAAY,WAC/Bq1I,EAAe7zI,EAAO6iB,UACtBqyL,EAAcluK,EAAMnkB,UACpB+5N,EAAoBZ,EAAYn5N,UAChCsxH,IACAmc,IACA0sF,IACAjpG,MACD,CACCF,EACA7zI,EAAO6iB,SACPqyL,EACAluK,EAAMnkB,SACN+5N,EACAZ,EAAYn5N,SACZsxH,EACAmc,EACA0sF,EACAjpG,IAGE8kD,EAAiBr6L,uBAAY,WAC/Bm2I,IACAuoG,IACA3oC,MACD,CAAC5/D,EAAgB4/D,EAAe2oC,IAE7BxoG,EACF1tG,EAAMnkB,SAAS1B,OACfnhB,EAAO6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,OACrC66N,EAAYn5N,SAAS1B,OAEzB,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC4hB,GAAA,EAAD,CAAUpwB,MAAO,QAAjB,SACI,cAAC,IAAD,UACI,cAAC,GAAD,CACI2kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,eAAjB,SACI,cAAC+pO,IAAD,UACI,cAAC,IAAD,CACIV,YAAW,UAAEA,EAAYr7O,YAAd,aAAE,EAAkB+f,MAC/B0B,aAAc45N,EAAYn5N,SAC1BqU,cAAe4lN,EACf/lN,YAAagmN,EACbrjN,cAAeujN,EACf3lN,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,IAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,IAAD,WACI,eAAC,IAAD,WACKq9G,EADL,eAGA,cAAC,IAAD,UACI,cAAC,IAAD,CAAQtiI,UAAWsiI,EAAsBrlI,QAAQ,UAAUpC,MAAO,QAAShE,OAAQ,kBAAM4vL,KAAzF,qBAIJ,cAAC,IAAD,CAAQ5rL,MAAO,QAAShE,OAAQ,kBAAMg5F,KAAtC,iCC7IDk7I,IAhEQvwO,sBACnB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,8BACI,sBACID,KAAK,UACLE,EAAE,mDACF4zB,UAAU,4CAEd,sBACI9zB,KAAK,UACLE,EAAE,grCACF4zB,UAAU,yDC6G3BizG,IArIV,SAAC,GAQC,IAPHpgF,EAOE,EAPFA,KACA4oL,EAME,EANFA,eACAC,EAKE,EALFA,iBACAC,EAIE,EAJFA,iBACAC,EAGE,EAHFA,gBACAC,EAEE,EAFFA,oBACAx5H,EACE,EADFA,SAEMhkH,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACb0xI,EAA6B/uI,eALjC,EAwBwDiN,mBAExD,MA1BA,mBAwBK8zK,EAxBL,KAwB4BC,EAxB5B,KA4BI5nK,EAAanK,iBAAO,MAE1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CAAcwlF,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,kBAA7D,UACI,cAAC,KAAD,CAAiBiV,YAAa,CAAC1U,KAAgBwqO,WAA/C,SACI,cAAC,GAAD,CACI7qO,QAAS,SAAAihB,GACLA,EAAEC,kBACFspN,EAAe5oL,EAAKvmD,KAExByE,SAAS,mBALb,yBAUJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBsuN,aADlC,SAGI,cAAC,GAAD,CACI3uN,QAAS,SAAAihB,GACLA,EAAEC,kBACFupN,EAAiB7oL,EAAKvmD,GAAIumD,EAAKkwF,YAEnChyI,SAAS,qBALb,4BAUF8hD,EAAKkwF,WACH,qCACI,cAAC,KAAD,CACI/8H,YAAa,CACT1U,KAAgByqO,mBAFxB,SAKI,cAAC,GAAD,CACI9qO,QAAS,SAAAihB,GACLA,EAAEC,kBACF4xK,EAAyBlxI,EAAKvmD,IA7D/B,WAC/B,IAAM+W,EAAmBwvC,EAAKx0D,QAAU,GAClC+jB,EAAoB0vI,EACtBzuI,EACA7C,EAAWxhB,MAEfq4L,EAAgBj1K,GAChBowH,IAuDgCwxD,IAEJjzL,SAAS,4BANb,6BAWJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBwuN,gBADlC,SAGI,cAAC,GAAD,CACI7uN,QAAS,SAAAihB,GACL0pN,EAAgB/oL,IAEpB9hD,SAAS,wBAJb,yBASJ,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgBuuN,aADlC,SAGI,cAAC,GAAD,CACI1xJ,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFwpN,EAAiB9oL,EAAKvmD,KAE1ByE,SAAS,qBANb,8BAepB,cAACmsB,GAAA,EAAD,CACIf,WAAYA,EACZnvB,KAAM82L,IAA0BjxI,EAAKvmD,GACrC8vB,UAAW,WACP2nK,EAAyB,OAJjC,SAOI,cAAC,GAAD,CACI7xD,eAjGiB,SAACxvH,GAC9B,IAAMysK,EAAgB5rK,aAAwBb,EAAUrkB,EAAOi8G,OACzDqlC,EAAkBv8H,aAAuBV,EAAUrkB,EAAOi8G,OAEhEuhI,EAAoB1sD,EAAexvC,IA8FvBvN,eAAgB,WACZ2xD,EAAyB,OAE7Bh5C,YAAY,UC1JnBxwD,IAAS1tF,YAAOurC,KAAPvrC,CAAH,wHAONy8D,IAAcz8D,IAAOC,IAAV,8EAiCXktE,KA5BmBntE,IAAOC,IAAV,yeA4BJmtE,cAAW,SAAA9sE,GAAK,MAAK,CAC1CynI,qBAAsB,CAClB34G,QAAS,kBAEb+/M,oBAAqB,CACjB//M,QAAS,4BAEbo5G,gBAAiB,CACbnhC,eAAgB,4BCuDlBtV,IAAKhyE,EAAQ,IAEb+qH,IAAiB,GAEjBskG,IA4BD,SAAC,GAmBC,IAAD,YAlBF52M,EAkBE,EAlBFA,MACAg1M,EAiBE,EAjBFA,YACA6B,EAgBE,EAhBFA,aACAz3N,EAeE,EAfFA,QACA4nI,EAcE,EAdFA,YACAnU,EAaE,EAbFA,uBACAzjI,EAYE,EAZFA,QACA6yB,EAWE,EAXFA,QACA60M,EAUE,EAVFA,YACA1mO,EASE,EATFA,eACAs3I,EAQE,EARFA,cACAqvF,EAOE,EAPFA,oBACAC,EAME,EANFA,uBACAC,EAKE,EALFA,mBACA14I,EAIE,EAJFA,cACAhzF,EAGE,EAHFA,QACA4iI,EAEE,EAFFA,YACA9yH,EACE,EADFA,UAEMm6D,EAAUb,MACVr7D,EAAcnQ,cACduzD,EAAc+rF,KACdyuF,EAAmBpuG,KACnBquG,EAAwBC,KACxBlB,EAAsBpsG,KACtBksG,EAAkBhsG,KAClBujE,EAAgBnmD,KAChBkC,EAAYrC,KACZnU,EAAgB5I,KAChBmtG,EAAmBC,KACnBxjI,EAA8BvzF,eAE9BjB,EAAWF,EAAQE,SACnB+zH,EAAYr8I,SAASuiG,IAAGngE,MAAM9Z,EAAShjB,QAAQu9F,MAC/Cy5C,EAAgBD,EACF,IAAdA,EACI,GACCA,EAAY,GAAKf,IACtB,EAEA3xH,EAAck5B,eAEdtb,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACT7M,QAASq5D,EAAYu4C,MACrB/+C,YAAa8+K,EAAcA,EAAY//H,MAAQ,GAC/C53F,SAAUjN,EACV7V,QAAS,KACTL,MAAOo4I,IACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAlCjB,EAqCwCuQ,mBAAS,IAAIhD,MArCrD,mBAqCK+mD,EArCL,KAqCoBqkE,GArCpB,QAsCoCpoH,oBAAc,GAtClD,qBAsCK8mD,GAtCL,MAsCkBuhE,GAtClB,SAwCkCroH,mBAChC,MAzCF,qBAwCKsoH,GAxCL,MAwCiBC,GAxCjB,MA4CIC,IACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,SACfo3I,EAAYz1G,MAAQ8M,KAAajxC,MAAM0G,KACjCkzI,EAAYp3I,OACZwnC,EAjDR,GA2DED,aAAqB60G,IAPrBx6I,GApDF,GAoDEA,aACAg4B,GArDF,GAqDEA,cACA4O,GAtDF,GAsDEA,WACAE,GAvDF,GAuDEA,YACAS,GAxDF,GAwDEA,UACAC,GAzDF,GAyDEA,UACAI,GA1DF,GA0DEA,oBAIE03D,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,IACzColG,YAAiB,OAAL/9D,QAAK,IAALA,OAAA,EAAAA,EAAOtmB,MAAMS,SAAU,IAGjCkrG,GAAwB1C,GAAahqH,IACrCy6I,GAAmBzwB,GAAa1gF,GAChCs1M,GAAuB50H,GAAak0H,GAEpCW,GAAsBx3M,EACtBA,EAAMtmB,MAAMiB,QAAO,SAACC,GAAD,OAAiBA,EAAK8iI,aACzC,GAEAnK,GACFmU,GAAiBA,EAAcvtI,OAASq9N,GAAoBr9N,OAE1D5f,GAAU5B,GAAa4B,QACvBy8J,GAAU1lB,GAAW,OAAQ/2I,GAASglC,IACtCk4M,GAAYnmG,GAAW,UAAW/2I,GAASglC,IAC3Cw3H,GAAgBzlB,GAAW,OAAQ/2I,GAASglC,IAE5Cm4M,GAAqBlgP,uBAAY,WACnCw/O,EAAuB,IAAI,EAAOzjG,IAClCP,IAAe,KAChB,CAACO,GAA6ByjG,IAE3BroK,GAAcn3E,uBAAY,WAC5BmB,GAAauB,MAAQo4I,IACrB35I,GAAawB,OAASm5I,EACtB0T,EAAYruJ,IACZo6I,GAAiB,IAAIprH,MACrB+vN,KACA1kG,IAAe,KAChB,CAACr6I,GAAc26I,EAAe0T,EAAa0wF,KAExCC,GAAsBngP,uBACxB,SAAC2a,GACG,IAAM9O,EACD28B,GACGA,EAAMtmB,MACDiB,QAAO,SAACC,GAAD,OAAiBA,EAAK8iI,aAC7Bj1I,KAAI,SAAC+kD,GAAD,OAAgBjwC,OAAOiwC,EAAKvmD,QACzC,GACJ+vO,EACI3zO,EACA8O,EACAohI,MAGR,CAACvzG,EAAOuzG,GAA6ByjG,IAqDnC/mC,IACDvoD,GAAkBA,IAAkBA,EAAcvtI,OAsBjDk8N,GAAmB,SAACpzO,EAAiB20O,GAClC30O,GACL+c,YACIZ,EACAruB,IAAOyD,YAAYI,YAAYuC,QAC3B,UACA8L,EAAO7L,YAEX,CAAEwgP,mBASJC,GAAuBrgP,uBACzB,SAACy+D,EAA2B6hL,GAWxB,OAVa7hL,EAAQltC,MAAM,EAAG+uN,GAAcrvO,KAAI,SAAA0sO,GAC5C,IAAM/lO,EAAO,0CACN+lO,GACAA,EAAOl1O,MAFD,IAGTyzC,QAASyhM,EAAOl1O,KAAK+zC,WAGzB,OAAO,cAAC,IAAD,CAAQ5kC,QAASA,EAASvD,KAAK,YAK9C,IAQEksO,GAAkBvgP,uBACpB,SAACy+D,GAAgC,IAAD,EAC5B,IAAKA,GAAYA,IAAYA,EAAQ97C,OAAS,OAAO,EAErD,IAAMg7N,EAASl/K,EAAQlwB,MACnB,SAAAnrB,GAAI,OAAI2C,OAAO3C,EAAK3T,MAAQsW,OAAM,OAACnO,QAAD,IAACA,OAAD,EAACA,EAASnI,OAGhD,OACIkuO,GAAUxnO,aAAY,OAACyB,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,QAAUk6O,EAAOlyB,WAG/D,CAAC7zM,IAQCgnO,GAAiB,SAACnvO,GACfA,GAED0Z,EAAYzH,SAASjN,KAAgBwqO,YACrCr3N,EAAQH,KACJluB,IAAOyD,YAAYH,SAAS8C,QAAQ,UAAW8P,EAAG7P,YAClD,CACIm8H,WAAW,KAUrB8gB,IAAer0G,GAAUA,IAAUA,EAAMtmB,MAAMS,OAO/C+5H,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAQrB01L,GAAqB,SAAC11L,GACxBslB,GAAU,UAAWtlB,IAQnBm9N,GAA4B,SAACn9N,GAC/BslB,GAAU,cAAetlB,IAOvB62D,GAAgB1xC,IAAK,OAAIA,QAAJ,IAAIA,GAAJ,UAAIA,EAAOtmB,aAAX,aAAI,EAAc2C,MAAK,SAAAzB,GAAI,OAAIA,EAAK8iI,cAE/DmhD,IAAiB,WACbq4C,MACD,CAACA,EAAkBJ,EAAaS,KAEnCzsN,qBAAU,YACFu6F,IAAyB+tB,IAAoBmkG,MAC7C5+O,GAAauB,MAAQo4I,IACrB35I,GAAawB,OAASm5I,EACtB0T,EAAYruJ,OAEjB,CACCquJ,EACAruJ,GACAy6I,GACA/tB,GACAkyH,GACAjkG,IAGJxoH,qBAAU,WACFgsN,GAAav2M,OAClB,CAACu2M,EAAav2M,KAEjBzV,qBAAU,WACFuoH,EAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,KACX,KACkB,IAAdD,GACPpqI,YAAW,WACPi3B,GAAU,KACX,OAGR,CAACmzG,IAEJvoH,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,WACN,IAAMmtN,EAAgBj4M,EAChBA,EAAMtmB,MAAMjR,KAAI,SAAA+kD,GAAI,OAAIjwC,OAAOiwC,EAAKvmD,OACpC,GACAixO,EAAe/5N,aACjBupI,EACAuwF,GAEAC,GAAgBA,EAAa/9N,OAAS,GACtC68N,EAAuBkB,GAAc,KAE1C,CAACxwF,EAAe1nH,EAAOg3M,IAE1B,IAAMmB,GAA4B,CAC9B7nL,WAAY,CACR33D,aAAa,6BACNA,IADK,IAERuB,MAAOo4I,IACPn4I,OAAM,UACDs3E,GAAW,OAAGzxC,QAAH,IAAGA,OAAH,EAAGA,EAAO6gB,MAAV,OAAkB6mG,QAAlB,IAAkBA,OAAlB,EAAkBA,EAAevtI,cAD3C,QACsD,IAEhEkiI,gBAAkB5qE,QAA8Bl5E,EAAhBmvJ,EAChC3pD,WAAU,UACJtsB,GAAD,OAAuCzxC,QAAvC,IAAuCA,OAAvC,EAAuCA,EAAO6gB,MAA9C,OAAe6mG,QAAf,IAAeA,OAAf,EAAeA,EAAevtI,cADzB,QACmD,GAEjE8zC,UAAYwjB,GAAkC,sBAApB,mBAGxB8rE,GrcmU2B,WACjC,IAAM66F,EAAuB56F,KACvBC,EAAsBH,KAC5B,OAAO9lJ,sBAAW,yCACd,WAAOmB,EAA4B0jJ,GAAnC,UAAA5iI,EAAA,0DACQ4iI,EADR,gCAEcoB,EAAoBpB,GAFlC,6CAIc+7F,EAAqBz/O,GAJnC,2CADc,wDAQd,CAAC8kJ,EAAqB26F,Iqc9UNl1G,GAMdm1G,GAA+B7gP,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACnBkgH,IAAe,GACfrkE,KACA1lE,WAAWkuO,EAAuB,KAClC79N,EAAY,2BAA4B,gBAE7C,CAACq1D,GAAawoK,EAAuB79N,IAIhCg/N,GrcmLL,SACHr2O,EACAgzC,EACA0hC,EACAC,GACD,IACS/mB,EAA0C5tD,EAA1C4tD,eAAgBC,EAA0B7tD,EAA1B6tD,sBAElBjnD,EAAWO,cACXytE,EAAkBx2D,eAJ1B,EAQMyvC,EADAQ,WAPN,IAOoB+rF,uBAPpB,MAOsC,KAPtC,MAO4Ct+C,WAGpCw8C,GACA8B,SAXR,MAOyD,EAPzD,ID3tBoC,ICuuB7BA,GAAmBA,EAAgBliI,QDtuBL,GC2uB7BmiI,EAAyC9kJ,uBAAY,WACnD+iJ,GACAtxI,YAAW,WACP4tE,MACD,KAEPhuE,EAASs1H,MAEQ,OAAjBxnD,QAAiB,IAAjBA,SACD,CAACE,EAAiBF,EAAmB4jE,EAAkB1xI,IAMpDmvE,EAAwCxgF,uBAAY,WAClD+iJ,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,aACAzd,QAASq/C,MAKzBhuE,EAASw1H,MAEM,OAAfznD,QAAe,IAAfA,SACD,CACC/tE,EACAguE,EACA5hC,EACA2hC,EACA2jE,IAGIxrF,EACJL,aACI,CACI,CACIkB,WAAYusF,GACZtsF,iBACAC,0BAGRwsF,EACAtkE,GAVAjpB,aAiBF2rF,EAA8BljJ,uBAAY,WAC5C28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IACiB,OAAjBF,QAAiB,IAAjBA,YAEL,CAACE,EAAiBF,EAAmB5nB,IAkCxC,MAAO,CACH4rF,6BA7BiCnjJ,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,aACAkjC,wBACIuiE,EACJljH,QAASq/C,MAMzB9nB,GAAa,GACblmD,EAASo1H,WAEd,CACCp1H,EACA6xI,EACA7jE,EACA5hC,EACA8Z,EACAwrF,IAKAG,+BqczSA69F,CACA,CACI3oL,WAAYusF,GACZtsF,eAAgB0tF,GAChBztF,sBAAuBqoL,IAE3B,iBACAE,IATA19F,6BAiBE69F,GAAyBhhP,uBAC3B,SAACihP,GACG,IAAMC,EACFD,GAC2B,KAAb,OAAb/wF,QAAa,IAAbA,OAAA,EAAAA,EAAevtI,SAAgButI,EAAc,GAElDgxF,GAAiBrB,EAAiBqB,KAEtC,CAAChxF,EAAe2vF,IAQdsB,GAA4BnhP,uBAC9B,SAACihP,GACOhnK,IAAgBi2E,GAAiBA,EAAcvtI,OAAS,EACxDm+N,KAEAE,GAAuBC,KAG/B,CACID,GACAF,GACA7mK,GACAi2E,IASFkxF,GAAoCphP,uBACtC,SAACyL,GACG6wG,EAA4B,CACxB7+D,WAAY,UACZ/E,YACI,oGACJkF,iBAAkB,UAClBD,kBAAmB,UACnBD,WAAY,SACZG,UAAW,kBAAMsjM,GAA0B11O,QAGnD,CAAC01O,GAA2B7kI,IAO1B+kI,GAA4BrhP,uBAAY,WAGtCi6E,GACA6mK,KAEAM,OAEL,CACCA,GACAN,GACA7mK,KAGJ3mD,qBAAU,WACN,OAAO,kBACHksN,EAAuB,IAAI,EAAMzjG,OAEtC,IAEHzoH,qBAAU,WACNksN,EAAuB,IAAI,EAAMzjG,MAElC,CAACvzG,IAEJlV,qBAAU,WACDqjH,EAAYz1G,KACbyH,GAAU,UAAWu8B,EAAYu4C,SAItC,CAACv4C,EAAYu4C,MAAO90E,KAEvBrV,qBAAU,YACS,OAAXkqN,QAAW,IAAXA,OAAA,EAAAA,EAAa//H,SAAUk5B,EAAYz1G,KACnCyH,GAAU,cAAe60M,EAAY//H,SAG1C,CAAC+/H,EAAa70M,KAEjBrV,qBAAU,WACNgoH,EAAc,CAAC7mI,KAAgB6sO,cAChC,CAAChmG,IAEJhoH,qBAAU,WACN,OAAO,WACHorN,IACAF,IACAzoC,IACAjkD,OAEL,CAAC4sF,EAAqBF,EAAiBzoC,EAAejkD,IAQzD,IAwCM/U,KAA4BmT,KAAmBA,EAAcvtI,OAE7Dq6H,IACDx0G,GACAA,GAASA,EAAMtmB,MAAMS,OAAS,GAC9B6lB,GAASA,EAAM6gB,SAAW6wB,GAAgB,EAAI,GA6C7C+iE,GAAuB,SAAC14I,EAAiByxD,IA7db,SAACzxD,EAAiBkH,GAChD,GAAMlH,GAAakH,EAAQ,CACvB,IAAMuqD,EAAOxtB,GAASA,EAAMtmB,MAAMqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOhE,KACrDjK,EAAS+/O,IAAkB,OAAJvrL,QAAI,IAAJA,OAAA,EAAAA,EAAMx0D,SAAU,IACvCggP,EAAoB,GAE1B,GAAMxrL,GAAQx0D,EAAQ,CAClB,IAAMiS,EAAQjS,EAAO+sC,MAAK,SAAA96B,GAAK,OAAIA,EAAMhE,KAAOlL,KAChD,GAAMkP,EAAO,CACT,IAAMC,EAAkB,GACxBi+B,aAAgBnwC,EAAQiS,EAAMhE,GAAIiE,GAE5BA,GAAcA,EAASiP,QACzBjP,EAASkS,SAAQ,SAAAxC,GACbo+N,EAAkB/5N,KAAK,CACnBhc,OAAQA,EACRlH,QAAS6e,EAAK3T,QAK1B+xO,EAAkB/5N,KAAK,CAAEhc,OAAQA,EAAQlH,aAGjDg7O,EAAoBiC,EAAmB/1O,IAsc3CyxI,CAA0B34I,EAASyxD,EAAKvmD,KAGtC8xO,GAAgB,SAACtjN,GAAwB,IAAD,EAC1C,OACa,OAATpa,QAAS,IAATA,GAAA,UAAAA,EAAW3B,aAAX,eAAkBiB,QAAO,SAAA1P,GAAK,OAAIwqB,EAASvc,SAASjO,EAAMhE,SAAQ,IAOpEq6L,GAAgCznD,GAHX71I,cACEC,cAKzB0qE,IAyBEsqK,Grc5lBH,SACHtiK,EACAC,GAEA,IAAMjoB,EAAahiC,iBAAY,IACzBusN,EAAiBvsN,iBAAoB,MAF7C,EAG4CusN,EAAe3hN,SAAW,GAHtE,IAGUq9G,oBAHV,MAGyB,EAHzB,MAG4B57I,cAH5B,MAGqC,GAHrC,IAKoC2xB,oBAAkB,GALtD,mBAKSosD,EALT,KAKoBC,EALpB,KAOQnuE,EAAWO,cACXytE,EAAkBx2D,eAClB/G,EAAcnQ,cAEdgwO,EAAgBv1O,cAChBw1O,EAAqBp1O,cACrBq1O,EAAwB31O,eACxB+4I,EAAsB54I,cAEtB02I,EAAmB3F,EAAe,IAAMhqG,kBAAQ5xC,GAQhDsgP,EAA0C9hP,sBAAW,yCACvD,WACI+hP,EACAC,EACA7gP,GAHJ,UAAA8gB,EAAA,0DAKQ8/N,IAAiBC,EALzB,gCAMcH,EAAsBE,EAAe5gP,GACtCm6B,KADC,yCACI,WAAOgT,GAAP,kBAAArsB,EAAA,yDACI3V,EADJ,OACcgiC,QADd,IACcA,GADd,UACcA,EAAUpsB,aADxB,aACc,EAAiBjR,KAAI,SAAAmS,GAAI,YAAK,CAC1C/jB,OAAQ+jB,EAAK3a,KAAKgH,GAClB5C,WAAU,UAAEuW,EAAKvW,kBAAP,SACVpB,OAAQu2O,MAEP5uM,kBAAQ9mC,GANX,gCAOQ24I,EAAoB34I,GAASkvB,OAC/B,SAAC5rB,GACG,MAAMA,KAThB,2CADJ,uDAeD4rB,OAAM,SAAC5rB,GACJ,MAAMA,KAtBtB,2CADuD,0DA2BvD,CAACq1I,EAAqB48F,IAOpBrhK,EAAwCxgF,uBAAY,WAClD+iJ,GACA1xI,EACIqX,aAAgB,CACZO,UAAW,2BACXD,WAAY,CACRy0B,WAAY,iBACZzd,QAASq/C,MAMzBE,GAAaC,GAAa,GAE1BroB,EAAWp3B,QAAU,GACN,OAAfq/C,QAAe,IAAfA,SACD,CACC/tE,EACAguE,EACAE,EACAH,EACA2jE,IAOExiE,EAA+BvgF,uBAAY,WAC7C28B,QAAQo7B,UAAUz8B,MAAK,WACfynH,GACAtxI,YAAW,WACP4tE,MACD,KAGPA,IACAE,GAAaC,GAAa,GAE1B19D,EAAY,yBAA0B,WAEtCq1C,EAAWp3B,QAAU,GACJ,OAAjBo/C,QAAiB,IAAjBA,YAEL,CACCE,EACAE,EACAJ,EACA4jE,EACAjhI,IAGIy1C,EAAiBL,aACrBC,EAAWp3B,QACXwgD,EACAC,GAHIjpB,aAUFs8I,EAA2C7zM,uBAAY,WACzD28B,QAAQo7B,UAAUz8B,MAAK,WACnBi8B,GAAa,GACb8nB,IACiB,OAAjBF,QAAiB,IAAjBA,OACAhoB,EAAWp3B,QAAU,QAE1B,CAACs/C,EAAiBF,EAAmB5nB,IASlC0qL,EAA2CjiP,uBAC7C,SAAC+hP,EAAuBC,GACpB,IAaME,EAA4B,CAC9B7pL,eAAgBypL,EAChBxpL,sBAf+B,CAC/BQ,WAAY,CACRipL,gBACAC,YACA7gP,aAAc,CACV2B,KAAM,WACNJ,MDlWK,GCmWLC,OAAQy6I,IAGhB3mF,UAAW,wBAQfU,EAAWp3B,QAAQtY,KAAKy6N,KAE5B,CAAC9kG,EAAc0kG,IAQbK,EAA0CniP,uBAC5C,SAACoiP,EAA+BJ,GAC5B,IAAMK,EAAiB,OAAGD,QAAH,IAAGA,OAAH,EAAGA,EAAqBnxO,KAAI,SAAA1M,GAAO,MAAK,CAC3DkH,OAAQu2O,EACRz9O,cAUE+9O,EAA2B,CAC7BjqL,eAAgBupL,EAChBtpL,sBAT8B,CAC9BQ,WAAY,CACRt3D,OAAQ6gP,GAEZ5rL,UAAW,WAQfU,EAAWp3B,QAAQtY,KAAK66N,KAE5B,CAACV,IAQC13E,EAAyBlqK,uBAAY,WACvC28B,QAAQo7B,UAAUz8B,MAAK,WACnBjqB,EACIqX,aAAgB,CACZO,UAAW,6BACXD,WAAY,CACRy0B,WAAY,iBACZkjC,wBACIkzH,EACJ7zK,QAASq/C,MAKrB9nB,GAAa,QAElB,CACClmD,EACAwiM,EACAx0H,EACA9nB,IAQEgrL,EAAiCviP,uBACnC,SAACgiP,GAAuB,IAAD,EAKfN,EAAe3hN,QALA,IAEftwB,GAAIsyO,OAFW,MAEK,EAFL,MAGf3kG,oBAHe,MAGA,EAHA,MAIf57I,OAAQ4gP,OAJO,MAIe,GAJf,EAOfr/F,GACI3F,EAAe,GACf6kG,EACIF,EACAC,GAIH5uM,kBAAQgvM,IACTD,EACIC,EACAJ,GAIR93E,KAIAvtI,QAAQo7B,UAAUz8B,MAAK,WACF,OAAjB6jD,QAAiB,IAAjBA,OACAK,GAAa,QAIzB,CACI2iK,EACAF,EACA/3E,EACA/qF,EACA4jE,IAQFy/F,EAA4CxiP,uBAAY,WAAO,IAAD,EAC1C0hP,EAAe3hN,QAA7Bt8B,KAEFg/O,EAA0BvhG,QAHgC,MACjD,GADiD,GAKhEygG,EAAcc,GACTnnN,MAAK,SAAAgT,GAAa,IACH0zM,EAAc1zM,EAAlB7+B,GAEJuyO,GACAO,EAA+BP,MAGtCxmN,OAAM,SAAC5rB,GACJ,GAAIA,EAAMgB,QAAS,CAAC,IAAD,EACT+iG,EAAY,UACdpiG,KAA0B3B,EAAMgB,gBADlB,QAEdhB,EAAMgB,QAIV,MAFAkR,EAAY6xF,EAAc,SAC1Bn0B,GAAa,GACP5vE,QAGnB,CAAC+xO,EAAeY,EAAgCzgO,IAenD,OAbAwR,qBAAU,WACFisD,GACAijK,MAGL,CAACjjK,IAQGv/E,uBAAY,SAAC+9I,GAChB2jG,EAAe3hN,QAAUg+G,EAEzBv+D,GAAa,KACd,IqcgSoCkjK,CACnCvrK,GACAA,IAQEwrK,GAAsB,SAAC3sL,GACrBA,GACAyrL,GAA+BzrL,IAoBvC,OAfA1iC,qBAAU,WAMN,OALAg3B,aAAcvR,KAAcC,OAAqB,WAC7Cm+B,KACAuoK,OAGG,WACHh1L,aAAc3R,KAAcC,OAAqB,WAC7Cm+B,KACAuoK,UAIT,IAGC,eAAC,GAAD,CACIpmH,SAAS,QACT8wE,eAAc,OAACl6C,QAAD,IAACA,OAAD,EAACA,EAAevtI,QAC9Bi5G,KAAM,cAAC,GAAD,IACN0C,cAAc,kBACdpqH,SAAS,QALb,UAOKH,IAAYkmE,IAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEqmC,QAAF,IAAEA,OAAF,EAAEA,EAAOtmB,MACbtJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CuqF,0BAAyB,OAACgjD,QAAD,IAACA,OAAD,EAACA,EAAevtI,QACzCwqF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,GACbjjE,SAAU,mBAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAEqmB,QAAF,IAAEA,OAAF,EAAEA,EAAO6gB,aAAT,QAAkB,EAC5BygB,aAAcgxE,IACd74C,aA3LK,SAACt/F,GACtB+lC,GAAU/lC,IA2LMu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,gBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBACImoC,GAAyBzzI,IAAgB,GACzC07I,IACmC,IAAnC17I,GAAa0B,WAAW8f,QAEhCkpF,8BACKwxC,kBAAc6S,KAAmB7S,kBAAc70G,GACpDsjE,oBAAqB,CACjB7xB,YAAaA,GACbF,eAAc,OAAEm2E,QAAF,IAAEA,OAAF,EAAEA,EAAevtI,OAC/BR,WAAU,OAAEqmB,QAAF,IAAEA,OAAF,EAAEA,EAAO6gB,MACnBygB,aAAcgxE,IACdluC,iBAxMK,WACrBszI,MAwMgB3nN,YAjMA,WAChB4nN,IAAoB,GACpB3kG,IAAe,IAgMC3uC,kBAAmB,CACfj5F,SACI6kM,KACCtvL,EAAYzH,SACTjN,KAAgBuuN,aAExBn/H,cAAe,gCACfuF,sBAAuB,CACnB30F,KAAgBuuN,aAEpB/5H,gBAAiB,eACjBI,oBAAqB,kBACjB6mD,GAAiBmxF,MACrBpnK,YAAaA,GACb93D,WAAU,OAAEqmB,QAAF,IAAEA,OAAF,EAAEA,EAAO6gB,QAG3B2iD,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIw0G,kBAAmBx8H,GAAkB,GACrCy8H,eAAgBqH,GAChBg6D,cAAeqC,GACfqlC,oBACIoC,GAEJjrG,eAAgB,kBAAM30G,QAG9Bf,iBAAkB,IAZtB,SAcK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcE,GACVzzI,IAEJyS,UACKzS,GAAa0B,WAAW8f,OACrB,GAGM,IAFNiyH,GACIzzI,MAER07I,GAEJ3oI,SAAS,uBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAoC,KAApB,OAALy0B,QAAK,IAALA,GAAA,UAAAA,EAAOtmB,aAAP,eAAcS,QAC9B+9E,iBAAkB,CACd7sF,KAAM8qO,IACNp0O,KAAM,mBACN2J,SAAU,YAEdysF,uBAAwB,CACpBh4C,WAAY,QACZz0C,SAAU,kBAEd0sF,uBAAwB,CACpB/sF,KAAMugI,GACN3lI,MAAO,QACPyF,SAAU,sBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QACImhI,KACC,iBAACvzG,QAAD,IAACA,OAAD,EAACA,EAAO6gB,aAAR,QAAiB,GAAKyxF,MAClB7gE,GACTe,YA1QU,SAAC/wB,GAC3B,IAAM24L,EAAwB1oK,GACxB4gE,IACAA,GACAzxF,GAAa,OAAL7gB,QAAK,IAALA,OAAA,EAAAA,EAAO6gB,QAAS,EAE1BmyF,GADAnyF,EAAQu5L,GAMZzC,GAAoBl2L,EAAM5E,OAAO1qC,UAgQjBzG,SAAU,yBAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACHouI,GAAc,KAAO2iB,IAJxB,IAKD5rJ,SAAUipI,GACVvuI,UAAW0vE,EAAQ+5D,qBACnB7jI,SAAU,sBAPT,2BAUDC,MAAO,UACP1F,MAAO,IACHouI,GAAc,KAAOojG,IAZxB,IAaDrsO,SAAUipI,GACV3oI,SAAU,yBAdT,2BAiBDC,MAAO,eACP1F,MAAO,IACHouI,GAAc,KAAO0iB,IAnBxB,IAoBD3rJ,SAAUipI,GACV3oI,SAAU,8BAEd,CACIC,MAAO,eACP1F,MAAO,GACPmF,SAAUipI,GACV3oI,SAAU,6BAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAIfixF,UAAW,CACPE,WAzRD,SAAC5pC,GAChB4oL,GAAe5oL,EAAKvmD,KAyRJqwF,kBAxQM,SAAC71C,EAAY+L,IAtdf,SAAC/L,EAA0B+L,GAC/C/L,EAAM30B,kBACA0gC,EAAKvmD,IACPgwO,EAAmBzpL,EAAKvmD,IAod5BozO,CAAgB54L,EAAO+L,GACvBwlF,IAAe,IAuQC37C,aAlRM,SAAC7pC,GAAD,QACpBk6F,KAAmBl6F,EAAKvmD,IAAMygJ,EAAcxuI,SAASs0C,EAAKvmD,KAkR5CswF,gBAhQS,SAAC/pC,GAC1B,OAAOylF,MAAU,OAAKzlF,QAAL,IAAKA,OAAL,EAAKA,EAAI,KAgQV0oC,kBAAmB,SAAC1oC,GAAD,MAAiB,CAChCp9C,eAAc,OAAEo9C,QAAF,IAAEA,OAAF,EAAEA,EAAMx0D,OACtBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAEpBu8D,cAAe,SAACn4E,GAAD,OACX04I,GAAqB14I,EAASyxD,MAEtCgqC,aAAc,SAAChqC,GAAD,OACVA,EAAKkwF,UAAY,aAAe,IACpChmD,qBAAsB,SAAClqC,GAAD,8BAClBA,QADkB,IAClBA,OADkB,EAClBA,EAAMkwF,iBADY,UAEtBjmD,YAAa,SAACjqC,GAAD,OACTA,EAAKkwF,UAAY,mBAAqB,cAE1CvmD,MAAO,CACH,CACIR,UAAW,eACXG,wBAAyB,SAACtpC,GAAD,OACrB,cAAC+L,GAAA,EAAD,CACIE,MAAOs+K,GAAgBvqL,EAAKyI,SAC5BvqD,SAAS,kBAFb,SAImB,OAAd8hD,EAAKvyD,KAAgBuyD,EAAKvyD,KAAO,OAI9C,CACI07F,UAAW,aACXj/B,oBAAqB,SAAClK,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAMonF,eACgB,KAAnB,OAAJpnF,QAAI,IAAJA,OAAA,EAAAA,EAAMonF,eACVh+C,WAAY,CACRrB,YAAa,SAAC/nC,GAAD,OACa,OAAtBA,EAAKonF,cACiB,IAAtBpnF,EAAKonF,cACLpnF,EAAKonF,cACTlpI,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAClK,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAMmnF,mBACoB,KAAvB,OAAJnnF,QAAI,IAAJA,OAAA,EAAAA,EAAMmnF,mBACV/9C,WAAY,CACRrB,YAAa,SAAC/nC,GAAD,OACiB,OAA1BA,EAAKmnF,kBACqB,IAA1BnnF,EAAKmnF,kBACLnnF,EAAKmnF,kBACTjpI,SAAU,4BAGlB,CACIirF,UAAW,eACXj/B,oBAAqB,SAAClK,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAMyI,UAAmC,IAAxBzI,EAAKyI,QAAQ97C,QACnC28E,wBAAyB,SAACtpC,GACtB,IAAMyI,EACFzI,EAAKyI,QAET,OACI,eAAC,IAAD,CAAattD,YAAU,0BAAvB,UACKkvO,GACG5hL,EAJiB,GAMlB,IACFA,EAAQ97C,OAPY,EAOpB,YAES87C,EAAQ97C,OATG,GAYf,QAKtB,CACIw8E,UAAW,aACXC,WAAY,CACRV,kBAAmB,SAAC1oC,GAAD,MAAiB,CAChC7lD,KAAMsrI,KAAezlF,EAAKvmD,GAC1Bs7C,WAAY,WA9vBrB,IAAC4wB,KA+vB+B3lB,EAAKvmD,KA5vBxDisI,GADAD,KAAe9/D,EACD,KAEAA,IA2vBc/iE,eAAgBo9C,EAAKx0D,OACrBurE,YAAa/W,EAAKkwF,UAClBhyI,SAAU,sBAEd5F,UAAW0vE,EAAQw6D,kBAG3B,CACIr5C,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAAC5oC,GAAD,OACrB,cAAC,KAAkBioB,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,QACbC,MAAO,gBAHf,SAMI,cAAC,IAAD,CACI00C,KAAMA,EACN4oL,eAAgBA,GAChBC,iBACIA,GAEJC,iBACIsC,GAEJrC,gBACI4D,GAEJ3D,oBAAqB,SACjB1sD,EACAwwD,GAFiB,aA9UlC,SAC3BxwD,EACAxvC,EACAr3I,GAEAq+L,GACI,CACInhJ,WAAY,OACZ+5F,SAAUj3I,GAEd6mL,EACAxvC,GAuUwCigG,CACIzwD,EACAwwD,EAFkB,iBAGlB9sL,QAHkB,IAGlBA,OAHkB,EAGlBA,EAAMvmD,UAHY,QAGN,IAGpB+1G,YACK,OAAC0qC,QAAD,IAACA,OAAD,EAACA,EAAevtI,wBAuEtDqgO,IAxDyB,WACpC,IAAMlxO,EAAQy5G,KACR8zH,EAAezzH,KAAmB0zH,YAClC1yB,EAAoBlhG,KACpB9jG,EAAUW,cACVinI,EAAchlB,IAAsB,GACpC5yH,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MACtBy4M,EAAuB39L,aAAmBkqG,GAC1C3wH,EAAiB3b,eACjB1hB,EAASm5B,eACT4kN,E3ezlBmC,WACzC,IAAMluO,EAAWO,cACXsxO,EAAyBz2O,cACzBqV,EAAcnQ,cAEpB,OAAO3R,uBACH,SAACwhP,EAAmB/1O,GAChBy3O,EAAuB1B,GAClBlmN,MAAK,WACFjqB,EACIg2H,GACI,CAAE53H,GAAIhE,GACN,WAGRqW,EAAY,6BAA8B,cAE7C0Z,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACkR,EAAaohO,EAAwB7xO,I2eokBd8xO,GACtBxlN,EAAwBD,eACxB29G,EAAyBl/G,eACzBqjN,EAAyBp0G,KACzBq0G,EAAqBl0G,KACrBxkC,EAAgBhkE,eAChBqgN,EAAkB95N,YAAYstH,IAEpC,OACI,cAAC,KAAkB34D,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,SAFrB,SAKI,cAACiuI,GAAiBrxE,SAAlB,CACIpoE,MAAO,CACHwL,YAAa,SAFrB,SAKI,cAAC,IAAD,CACIuG,QAASA,EACT4nI,YAAayzF,EACbrrO,QAASA,EACT4wB,MAAO12B,EAAMuxO,QACb7F,YAAa1rO,EAAM0rO,YACnB6B,aAAcA,EACd50M,QAASA,EACTylH,cAAep+I,EAAMwxO,qBACrBvvO,QAASjC,EAAMiC,QACfurO,YAAa1yB,EAAkBzqN,KAC/ByW,eAAgBpX,EAAO6iB,SACvBsZ,sBAAuBA,EACvBopE,cAAeA,EACfs0C,uBAAwBA,EACxBkkG,oBAAqBA,EACrBC,uBAAwBA,EACxBC,mBAAoBA,EACpB9oG,YAAaysG,EACbv/N,UAAWgb,EAAe18B,YC1pC/BohP,IAvBwBn1O,sBACnC,WAAgBC,GAAQ,EAArBC,UACC,OAAQ,sBAAKK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxF,UACA,mBAAGkwD,YAAU,mBAAb,SACI,oBAAGA,YAAU,mBAAmBlwD,KAAK,UAArC,UACI,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,qhBAChD,sBAAMA,EAAE,4aAA4a0zB,OAAO,UAAU+wE,eAAa,IAAIgf,iBAAe,QAAQC,kBAAgB,UAC7f,sBAAM1jH,EAAE,kBACR,sBAAMA,EAAE,0DAGhB,iCACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,oBAExB,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,6BCjB/BgnB,IAAYvmB,IAAOC,IAAV,iHAMTkvB,IAAUnvB,IAAOC,IAAV,+IAQP2gD,IAAkB5gD,IAAOC,IAAV,mJAQf2hJ,IAAiB5hJ,IAAOC,IAAV,mJAQd+gD,IAAUhhD,IAAOC,IAAV,4JASPglI,IAAiBjlI,IAAO0nB,KAAV,wIASd6lB,IAAgBvtC,IAAOC,IAAV,yDClCbuzO,IAKR,SAAC,GAKC,IAJHpuG,EAIE,EAJFA,kBACAC,EAGE,EAHFA,eACAqhE,EAEE,EAFFA,cACAnhE,EACE,EADFA,eAEM/sG,EAAQ+iF,KACR/pH,EAASm5B,eACTi7G,EAAepyH,eACfmyH,EAAapyH,eACbuuI,EAAYrC,KACZ1Z,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAGJ,IAAMnyC,EAAiBzjG,uBAAY,WAC/Bq1I,EAAe7zI,EAAO6iB,UACtBqyL,EAAcluK,EAAMnkB,UACpBsxH,IACAmc,IACAvc,MACD,CACCF,EACA7zI,EAAO6iB,SACPqyL,EACAluK,EAAMnkB,SACNsxH,EACAmc,EACAvc,IAGEW,EACF1tG,EAAMnkB,SAAS1B,OACfnhB,EAAO6iB,SAASlB,QAAO,SAAC1T,GAAD,OAAaA,EAAK,KAAGkT,OAE1CwzH,EAAiBryH,eACjBiyL,EAAgBnmD,KAOtB,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAACrrH,GAAA,EAAD,CAAUpwB,MAAO,QAASD,SAAS,sBAAnC,SACI,cAAC,IAAD,UACI,cAAC,GAAD,CACI4kB,UAAU,EACVs4H,cAAc,EACdx4H,mBAAiB,EACjBC,YAAU,QAItB,cAAC0L,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,IAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,IAAD,WACI,eAAC,IAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,IAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAQ,UACRpC,MAAO,QACPhE,OArCG,WACnB0rI,IACA4/D,KAoCgB7hM,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQg5F,EACRvvF,SAAS,sBAHb,iCC5GH6yB,IAAoC,CAC7ClkC,WAAY,GACZE,QAAS,KACTL,MAL0B,GAM1BC,OAAQ,EACRigB,cAAe,EACfiD,SAAU,IAGD49N,IAA4B,qCCX5B7uG,IAA2B,SAACzzI,GACrC,IAAI0zI,EAAQ,EAUZ,OARI1zI,GAAgBA,EAAa0K,SAAW1K,EAAa0K,QAAQ8W,SAC7DkyH,GAAgB1zI,EAAa0K,QAAQ8W,QAGrCxhB,GAAgBA,EAAa0kB,UAAY1kB,EAAa0kB,SAASlD,SAC/DkyH,GAAgB1zI,EAAa0kB,SAAS1C,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,QAGxDkyH,GCHE6uG,IAKR,SAAC,GAKC,IAJHj7O,EAIE,EAJFA,KACA23H,EAGE,EAHFA,kBACAy2E,EAEE,EAFFA,2BACArxF,EACE,EADFA,SAEA,OACI,+BACI,8BACI,eAAC,GAAD,CAAcV,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,iBAA7D,UACI,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB4rH,uBADlC,SAGI,cAAC,GAAD,CAAYjsH,QAAS,kBAAMgsH,EAAkB33H,IAAOyL,SAAS,sBAA7D,4BAIJ,cAAC,KAAD,CAAiBiV,YAAa,CAAC1U,KAAgBgoD,YAA/C,SACI,cAAC,GAAD,CACIroD,QAAS,SAAAihB,GACLA,EAAEC,kBACFuhL,EAA2BpuM,EAAKgH,KAEpCyE,SAAS,oBALb,kCC0RTyvO,ICxTHprO,IDwTGorO,IAtSf,YA8B8B,IAAD,EA7BrB/rO,EA6BqB,EA7BrBA,QACA1P,EA4BqB,EA5BrBA,MACA/G,EA2BqB,EA3BrBA,aACA4S,EA0BqB,EA1BrBA,QACA0sF,EAyBqB,EAzBrBA,YACAvpB,EAwBqB,EAxBrBA,cACAt+D,EAuBqB,EAvBrBA,eACAm/L,EAsBqB,EAtBrBA,wBACAl5F,EAqBqB,EArBrBA,cACA+kI,EAoBqB,EApBrBA,QACA3pK,EAmBqB,EAnBrBA,YACA4pK,EAkBqB,EAlBrBA,UACApoG,EAiBqB,EAjBrBA,WACAqoG,EAgBqB,EAhBrBA,mBACAC,EAeqB,EAfrBA,qBACA5sK,EAcqB,EAdrBA,YACA0rB,EAaqB,EAbrBA,iBACAmhJ,EAYqB,EAZrBA,mBACA5jH,EAWqB,EAXrBA,kBACA6jH,EAUqB,EAVrBA,qBACAC,EASqB,EATrBA,oBACAjnG,EAQqB,EARrBA,qBACAknG,EAOqB,EAPrBA,kBACAttC,EAMqB,EANrBA,2BACAutC,EAKqB,EALrBA,kBACAC,EAIqB,EAJrBA,oBACAC,EAGqB,EAHrBA,iBACAC,EAEqB,EAFrBA,aACAjsC,EACqB,EADrBA,yBAGEt6H,EAAUb,KACV26H,EAAgBT,KAEhBmtC,GACDt8O,GAAUA,IAAUA,EAAMga,MAAMS,OAErC,OACI,eAAC,GAAD,CACQi5G,KAAM,cAAC,GAAD,IACN0C,cAAa,mBACbpqH,SAAS,mBACTolH,SAAU,QAJlB,YAMWy+E,GACC,cAACv6J,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACIE,SACMnxD,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVi6B,OAAQq7K,EACRnkN,QAAS,kBAAM62K,EAA2B,WAItD,cAAC,gBAAD,CACIp2G,YAAW,gBAAMA,GACjBt+F,MAAW,OAAL+F,QAAK,IAALA,OAAA,EAAAA,EAAOga,QAAS,GACtBtJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CwqF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,EACbjjE,SAAU,8BAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,OAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,MACnBygB,aH/FE,GGgGFm4B,aAAcY,EACdX,wBAAwB,EACxBhuF,SAAU,2BAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B4pG,sBAAuBhM,EAAY65C,cACnC9tC,eAAgBw3I,EAChB/pL,YAAa,GACb/lD,SAAU,2BAEd23F,8BACKwxC,kBAAcx+B,KACdw+B,kBAAcn1I,GACnB4jG,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAE8kC,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,OAC/BR,WAAU,OAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,MACnBygB,aHlHE,GGmHF8iC,iBAAkB,WACdw3I,GAAkB,GAClBC,EAAoB,KAExB9rN,YAAa,WACT8rN,EAAoBn8O,EAAQA,EAAMga,MAAMjR,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAAM,IAC/D20O,GAAkB,IAEtBv3I,kBAAmB,CACfj5F,SAAmC,IAAzBirG,EAAcl8F,OACxB4kF,kBAAkB,EAClBP,yBACIsxG,EACJvwG,qBAAsB,CAClBtzF,KAAgBgoD,YAEpBwd,YAAaA,EACb93D,WAAU,OAAEja,QAAF,IAAEA,OAAF,EAAEA,EAAOmhD,MACnBnkC,cAAe25F,IAGvB7S,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIw0G,kBAAmBx8H,GAAkB,GACrC89L,cAAewtC,EACf7uG,eAAgB4uG,EAChB1uG,eAAgB,kBAAM30G,QAG9BlB,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IAbtB,SAeK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcE,IACVzzI,GAEJyS,SAGU,IAFNghI,IACIzzI,IAEJs/F,EAAY45C,eAEhBnmI,SAAS,kCAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAoC,KAApB,OAAL7L,QAAK,IAALA,GAAA,UAAAA,EAAOga,aAAP,eAAcS,QAC9B+9E,iBAAkB,CACd7sF,KAAM0vO,IACNh5O,KAAM,mBACN2J,SAAU,cAEdysF,uBAAwB,CACpBh4C,WAAY,WACZz0C,SAAU,kBAEd0sF,uBAAwB,CACpB1sF,SAAU,sBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,UAAWkkG,EAAcl8F,OACzB/O,WAAU,OAAC1L,QAAD,IAACA,OAAD,EAACA,EAAOga,MAAMS,QACxB/H,QACKikG,GAAiB32G,GAAS22G,EAAcl8F,OAASza,EAAMga,MAAMS,SAAYs3D,EAC9Ee,YAAaspK,EACbpwO,SAAU,2BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,OACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,gBAClBiqG,EACE,KACAZ,EAAQlrC,YAPb,IAQDxkM,SAAU,gBART,2BAWDC,MAAO,QACP1F,MAAO,IACH+1O,EACE,KACAZ,EAAQa,YAfb,IAgBD7wO,SAAU6sF,EAAY85C,eACtBrmI,SAAU,iBAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAAYwgC,EACZrgC,gBAAiBgkJ,EACjBjkJ,kBAAmB,SAAC71C,EAAYxhD,GAAb,aAA8B87O,EAAa97O,EAAKgH,GAAN,OAAUw6C,QAAV,IAAUA,GAAV,UAAUA,EAAO5E,cAAjB,aAAU,EAAe1qC,UACtFklF,aAAc,SAACp3F,GAAD,OAAWo2G,EAAcn9F,SAASjZ,EAAKgH,KAAOwqE,GAC5DykB,kBAAmB,SAACj2F,GAAD,MAAmB,CAClCmQ,eAAgBnQ,EAAKjH,OACrBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAGpBu8D,cAAe,SAACn4E,GAAD,OACX04I,EAAqB14I,EAASkE,MAEtCk3F,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQ+5D,qBACvB34C,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTqvM,EAAcrvM,IAClBu1F,eAAgB,SAACv1F,GAAD,MAAmB,CAC/B+yC,cAAe,CACX7M,UAAWlmC,EAAKkmC,UAChBE,SAAUpmC,EAAKomC,SACfqN,QAASzzC,EAAK+zC,SACdz6C,OAAQ0G,EAAK1G,QAEjBsS,KAAM,OAEVH,SAAU,4BAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAACz3D,GAAD,OAChBA,EAAK+/B,OACV42D,WAAY,CACRrB,YAAa,SAACt1F,GAAkB,IAAD,EACrBi8O,EAAa,UAAGj8O,EAAK+/B,aAAR,aAAG,EAAYnhB,QAAO,SAACmhB,EAAiB/8B,GACvD,IAAMuqD,EAAO6tL,EAAU3hO,MAAMqsB,MAAK,SAACynB,GAAD,OAAqBA,EAAKvmD,KAAOhE,KACnE,OAAOuqD,EAAI,uBAAOxtB,GAAP,CAAcwtB,EAAKvyD,OAAQ+kC,IACvC,IAEJ,OAAoB,OAAbk8M,QAAa,IAAbA,OAAA,EAAAA,EAAe/hO,QAAS+hO,EAAcxhP,KAAK,MAAQ,cAACyxD,GAAA,EAAD,KAE7DzgD,SAAU,6BAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SAACj2F,GAChB,MAAO,CACH0H,KAAMsrI,KAAU,OAAKhzI,QAAL,IAAKA,OAAL,EAAKA,EAAMgH,IAC3Bs7C,WAAY,kBACR+4L,EAAkB,OAACr7O,QAAD,IAACA,OAAD,EAACA,EAAMgH,KAC7BmJ,eAAgBnQ,EAAKjH,OACrB0S,SAAU,8BAK1B,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SAACn2F,GAAD,OACrB,cAAC,IAAD,CACIA,KAAMA,EACN23H,kBACIA,EAEJy2E,2BACIA,EAEJrxF,YAAW,OAAC3G,QAAD,IAACA,OAAD,EAACA,EAAel8F,sBEjS9DgiO,IAAsCjiN,IAAM/tB,eACrD,WACI,MAAM,IAAInF,MAAM,uB,SDZZ+I,K,wDAAAA,E,4DAAAA,E,6DAAAA,U,KEYL,IAAMqsO,IAA+B,WACxC,IAAMvzO,EAAWO,cACXizO,EAAwBp3O,eACxBqU,EAAcnQ,cAMpB,OAAO3R,uBAAY,SAACmB,GAAgC,IAAD,MACzC6gB,EAAK,CACPwmB,MAAK,UAAErnC,EAAa0K,eAAf,aAAE,EAAsB3I,KAAK,KAClC1B,OAAM,UAAEL,EAAa0kB,gBAAf,aAAE,EAAuB3iB,KAAK,KACpCR,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQxB,EAAawB,OACrBC,MAAOzB,EAAa0B,WACpBC,KAAMsE,aAAsBjG,EAAa4B,QAAS,aAAa,GAC/D+qC,UAAW3sC,EAAaoC,WAG5B,OADA8N,EFxBG,CACHrG,KAAMuN,IAAQusO,6BEwBPD,EAAsB7iO,GACxBsZ,MAAK,SAACn5B,GACHkP,EFtBT,SAAmClP,GACtC,MAAO,CACH6I,KAAMuN,IAAQwsO,6BACd5iP,QEmBiB6iP,CAA0B7iP,OAEtCq5B,OAAM,SAAC5rB,GACJyB,EFlBT,SAAmCzB,GACtC,MAAO,CACH5E,KAAMuN,IAAQ0sO,6BACdr1O,SEeiBs1O,CAA0Bt1O,EAAMgB,UACzCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAUwzO,EAAuB/iO,KClBnCigF,IAAKhyE,EAAQ,IAqVJo1N,I,YAAAA,IAnVf,WAAuC,IAAD,QACQhyN,mBAAS,IAAIhD,MADrB,mBAC3B+mD,EAD2B,KACZqkE,EADY,OAEEpoH,mBAChC,MAH8B,mBAE3BsoH,EAF2B,KAEfC,EAFe,OAM9BvoH,mBAAwB,MANM,mBAK3B4kL,EAL2B,KAKFlB,EALE,OAOQ1jL,mBAAmB,IAP3B,mBAO3B0rF,EAP2B,KAOZumI,EAPY,OAQIjyN,oBAAkB,GARtB,mBAQ3B8mD,EAR2B,KAQduhE,EARc,KAU5B5zH,EAAUW,cAVkB,EFP3Be,YAAY1U,qBAAW+vO,MEkBhBz8O,EAXoB,EAW1B/F,KAAwB4R,EAXE,EAWb2D,UACfE,EAAU0R,YAAY3R,MAEtB0tO,EAAwBT,MACxBvpG,EAAyBl/G,eACzBw4K,EAAkBpjK,eAClBqoK,EAAgBxpK,eAChB8gH,EAAgBD,KAEhBrH,EAAmC,WACrCitD,EAA2B,OAGzB/uL,EAAWF,EAAQE,SACnB+zH,EAAYr8I,SAASuiG,IAAGngE,MAAM9Z,EAAShjB,QAAQu9F,OAAS,EAExDy5C,GAAiBD,EAAY,GAAKf,GAClCa,EAA6B50G,IA5BD,EA+B9BD,aAAqB60G,GADjBx6I,EA9B0B,EA8B1BA,aAAcg4B,EA9BY,EA8BZA,cAAeuP,EA9BH,EA8BGA,UAAWT,EA9Bd,EA8BcA,YAAaF,EA9B3B,EA8B2BA,WAAYY,EA9BvC,EA8BuCA,UAGnE5lC,EAAU5B,EAAa4B,QACvB21M,EAAa5+D,GACf,YACA/2I,EACAglC,GAEE08M,EAAa3qG,GACf,YACA/2I,EACAglC,GAGEu0G,GAAoBvC,KACRnhI,GAAmB+hB,eAA7BtW,SAERiP,qBAAU,WACN1a,IAAkBqvB,EAAYrvB,MAC/B,CAACA,GAAgBqvB,IAEpB3U,qBAAU,WACFuoH,EAAY,EACZpqI,YAAW,WACPi3B,EAAUozG,KACX,KACkB,IAAdD,GACPpqI,YAAW,WACPi3B,EAAU,KACX,OAER,CAACozG,EAAeD,EAAWnzG,IAE9BpV,qBAAU,YACW,OAAburF,QAAa,IAAbA,OAAA,EAAAA,EAAel8F,WAAf,OAA0Bza,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAOmhD,QACjCmyF,GAAe,KAEpB,QAACtzI,QAAD,IAACA,OAAD,EAACA,EAAOmhD,MAAOw1D,IAElBvrF,qBAAU,WACNqJ,QAAQo7B,UAAUz8B,MAAK,WACnB8pN,EAAiB,IACjB5pG,GAAe,QAEpB,CAACtzI,IAEJorB,qBAAU,WACN,OAAO,kBAAM8xN,EAAiB,OAE/B,IAyBH/9C,IAAiB,YACT,OAACzvL,QAAD,IAACA,OAAD,EAACA,EAASrU,aACdpC,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,EACtBupG,EAAsB,6BACflkP,GADc,IAEjBoC,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,UACpBsiB,SAAUjN,SAEf,CAACysO,EAAuBlkP,EAAxB,OAAsCyW,QAAtC,IAAsCA,OAAtC,EAAsCA,EAASrU,YAOhD,IAIIk9F,GAAc67C,GAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBpF,IAAyBzzI,GACzColG,YAAiB,OAALr+F,QAAK,IAALA,GAAA,UAAAA,EAAOga,aAAP,eAAcS,SAAU,IAOlCw0D,GAAcn3E,uBAAY,WACxBmB,EAAauB,MAAQo4I,GACrB35I,EAAawB,OAASm5I,EACtBupG,EAAsB,6BAAIlkP,GAAL,IAAmBoC,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,aAC5Dg4I,EAAiB,IAAIprH,MACrBi1N,EAAiB,IACjB5pG,GAAe,KACpB,CAACM,EAAe36I,EAAckkP,EAA9B,OAAqDztO,QAArD,IAAqDA,OAArD,EAAqDA,EAASrU,YAE3DwmJ,GAA8B3F,GAChC,UACA,CACI7gJ,UAAS,iBAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,iBAAX,QAAwB,GAErCpC,EAL8D,iBAM9D+G,QAN8D,IAM9DA,OAN8D,EAM9DA,EAAOmhD,aANuD,QAM9C,EAChB8tB,IAGEkhI,GAAsCr4M,uBAAY,WACpDw7I,GAAe,GACf4pG,EAAiB,MAClB,IAMG9sC,GAA2Bt4M,uBAC7B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KAEd,GAAIw2E,EACA8vE,GAA4B,CAAEx/I,KAAMk5O,IAA4Bl5O,EAAMD,oBAEtE,GAAIu0G,EAAe,CACf,IAAMorC,EAAiBprC,EAAc5tG,KACjC,SAAAxI,GAAI,MACC,CACGuC,KAAM,UACN42I,WAAYn5I,EACZ6E,aAAc,KACdhD,aACAC,KAAMk5O,IAA4Bl5O,MAI9CqvM,EACI3vD,EACAouD,OAKhB,CACIp+H,EACA8vE,GACAlrC,EACA+6F,EACAvB,KA2DFitC,GAAoBtlP,uBACtB,SAACyP,EAAYqC,GAELszO,EADAtzO,EACiB,SAAAoiD,GAAS,6BAAQA,GAAR,CAAmBzkD,KAE5B,SAAAykD,GAAS,OACtBA,EAAU/wC,QAAO,SAAAC,GAAI,OAAIA,IAAS3T,OAG1C+rI,GAAe,KAEnB,CAAC4pG,IAOCv7F,GAAwB7pJ,uBAC1B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KACVs0M,GASA6B,EACI,CAT6B,CAC7B5uM,KAAM,UACNsC,aAAc,KACds0I,WAAYm2D,EACZztM,aACAC,KAAMk5O,IAA4Bl5O,IAKlCq/I,KAIZ,CAACmuD,EAAyB6B,IAG9B,OACI,cAAC,KAAkB37H,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,SAFrB,SAKI,cAACiuI,GAAiBrxE,SAAlB,CACIpoE,MAAO,CACHwL,YAAa,SAFrB,SAKA,cAAC,IAAD,CACIzJ,QAASA,EACT1P,MAAOA,EACPu4F,YAAaA,GACbt/F,aAAcA,EACd4S,QAASA,EACTmjE,cAAeA,EACfC,YAAaA,GACb0rB,iBAAkBn6D,EAClBs7M,mBAAoB7qN,EACpBinG,kBA7Gc,SAAC33H,GACvBmf,EAAQH,KACJluB,IAAOoE,iBAAiBgC,QACpB,UACA8I,EAAKgH,GAAG7P,YAEZ,CAAEm8H,WAAW,KAwGTnjH,eAAgBA,GAChBqrO,qBAAsB5oG,EACtB6oG,oBAnMiB,SAAC7gO,GAC1BslB,EAAU,UAAWtlB,IAmMb45H,qBAjGe,SAAC14I,EAAiBkE,GACzCksM,EAAgBlsM,EAAKgH,GAAIlL,EAAS4yE,KAiG1BgtK,kBAAmBt6F,GACnBkuD,wBAAyBA,EACzBlB,2BAA4B,SAACpnM,GAAD,OAAuBonM,EAA2BpnM,IAC9EovG,cAAeA,EACf+kI,QAAS,CAACa,aAAY/rC,cACtBz+H,YAAaA,EACbmqK,kBAAmB5oG,EACnB6oG,oBAAqBe,EACrBd,iBAjGmD,SAAAjvN,GAEvDntB,GAASA,EAAMmhD,MAAQyxF,KACF,IAArBzlH,EAAEgwB,OAAO1qC,QAET6gI,GAAe,GAEfA,GAAe,GAGnB,IAAMO,EACNl9B,GAAiB32G,GAAS22G,EAAcl8F,OAASza,EAAMga,MAAMS,OAEzD0S,EAAEgwB,OAAO1qC,SAAWohI,EACpBqpG,EAAkBl9O,GAASA,EAAMga,MAAMjR,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,OAAQ,IAEhE21O,EAAiB,KAkFbb,aAAce,GACdzB,UAAW3yF,EAAc/uJ,KACzBm2M,yBAA0BA,GAC1BwrC,mBAnPe,SAACnoK,GACnBA,GAED+/D,EADAD,IAAe9/D,EACD,KAEAA,IA+OVooK,qBAtOiB,SAACjmJ,GAC1B,OAAO29C,KAAU,OAAK39C,QAAL,IAAKA,OAAL,EAAKA,EAAKruF,KAsOnBgsI,WAAYA,SCzUb8pG,IA3BYn3O,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,sBACIY,EAAE,iHACFF,KAAK,YAET,sBACImwD,YAAU,UACVC,YAAU,UACVlwD,EAAE,kFACFF,KAAK,kBCGVm2O,IAvBQp3O,sBACnB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBACI6wD,YAAU,UACVC,YAAU,UACVlwD,EAAE,oYACFF,KAAK,iBCkBVo2O,IAlCOr3O,sBAClB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,UASI,mBAAG4wD,YAAU,mBAAb,SACI,sBACIC,YAAU,UACVC,YAAU,UACVlwD,EAAE,iMACFF,KAAK,cAGb,+BACI,0BAAUI,GAAG,aAAb,SACI,sBACIJ,KAAK,OACL8zB,UAAU,wBACV5zB,EAAE,4BC1BjBm2O,IAAa11O,IAAOC,IAAV,oIAOV01O,IAAkB31O,YAAO01O,IAAP11O,CAAH,qFAKf41O,IAAa51O,IAAOC,IAAV,wDC2BR41O,I,gCCvCAA,IDUf,YAG2B,IAFvBC,EAEsB,EAFtBA,aACAlnN,EACsB,EADtBA,YAEA,OAAOknN,GACH,KAAKt6H,GAAiBzsE,YAClB,OAAO,qCACH,cAAC6mM,IAAD,CAAYz0O,YAAU,2BAAtB,SAAiD,cAAC,IAAD,MACjD,cAACu0O,IAAD,CAAYv0O,YAAU,2BAAtB,kCAER,KAAKq6G,GAAiB5uH,UAClB,OAAO,qCACH,cAACgpP,IAAD,CAAYz0O,YAAU,0BAAtB,SAAgD,cAAC,IAAD,MAChD,cAACu0O,IAAD,CAAYv0O,YAAU,0BAAtB,8BAER,KAAKq6G,GAAiBu6H,MAClB,OAAO,qCACH,cAACH,IAAD,CAAYz0O,YAAU,8BAAtB,SAAoD,cAAC,IAAD,MACpD,cAACu0O,IAAD,CAAYv0O,YAAU,8BAAtB,qDAER,QACI,OAAKytB,EAEE,eAAC+mN,IAAD,CAAiBx0O,YAAU,iBAA3B,0BACWwgB,aAAWiN,MAFlB,+BE5BjBsnG,IAAel2H,IAAOC,IAAV,iNAOL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAInC8wP,IAAoBh2O,IAAOC,IAAV,oPAYjBg2O,IAAgBj2O,IAAOC,IAAV,8EAoCJqnE,IA3BV,SAAC,GAIC,IAHH4uK,EAGE,EAHFA,aACAtnN,EAEE,EAFFA,YACAknN,EACE,EADFA,aAEA,OACI,eAAC,IAAD,WACI,cAACE,IAAD,CAAmB70O,YAAU,kBAA7B,yBAGA,eAAC80O,IAAD,WACI,cAACE,IAAD,CACIL,aAAcA,EACdlnN,YAAaA,IAEjB,cAAC,IAAD,CACInrB,MAAO,QACP5C,QAAS,UACTpC,MAAO,QACPhE,OAAQy7O,EACRhyO,SAAS,uBC/BdkyO,IAxBiBh4O,sBAC5B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,SAUI,sBACIW,EAAE,qCACF0zB,OAAO,eACP+wE,eAAa,MACbgf,iBAAe,eCOpBqzH,IAxBYj4O,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,SAUI,sBACIW,EAAE,+CACF0zB,OAAO,eACP+wE,eAAa,MACbgf,iBAAe,e,WChBtB71C,IAAYC,eAAW,SAAA9sE,GAAK,MAAK,CAC1Cg2O,eAAgB,CACZllL,OAAQ,oBACRpuD,MAAO,kCAIFy+C,IAAczhD,YAAOokB,KAAPpkB,CAAH,gMAIV,SAAAE,GAAK,OAAIA,EAAMN,MAAQ,OAAS,gCAG5B,SAAAM,GAAK,OAAIA,EAAMN,MAAQ,OAAS,gCAIrCiqD,IAAe7pD,IAAOC,IAAV,kHAOnBo1G,IAAer1G,IAAOC,IAAV,mOAWL4nE,IAAe7nE,YAAOq1G,IAAPr1G,CAAH,wFAKZu2O,IAAav2O,YAAOq1G,IAAPr1G,CAAH,2FCuBRw2O,QAzDf,SAA8Bt2O,GAAmC,IAEzDxB,EAcAwB,EAdAxB,OACAgnB,EAaAxlB,EAbAwlB,UACAukC,EAYA/pD,EAZA+pD,YACApkD,EAWA3F,EAXA2F,MACA+8I,EAUA1iJ,EAVA0iJ,SACA6zF,EASAv2O,EATAu2O,YACA9gI,EAQAz1G,EARAy1G,WACA+gI,EAOAx2O,EAPAw2O,eACAxyO,EAMAhE,EANAgE,SACAqmB,EAKArqB,EALAqqB,SACA0iD,EAIA/sE,EAJA+sE,UACAjH,EAGA9lE,EAHA8lE,QACAl4B,EAEA5tC,EAFA4tC,SACA1lB,EACAloB,EADAkoB,OAEE4lD,EAAUb,MAEhB,OAAO,qCACH,cAAC,IAAD,UACI,cAAC,IAAD,CACIzuE,OAAQA,EACRgnB,UAAWA,EACXukC,YAAaA,EACbpkD,MAAOA,EACPjG,MAAOgjJ,EACPh/I,SAAU+xG,EACVzxG,SAAQ,UAAKA,EAAL,UACR4hB,aAAcyE,EACd0iD,UAAWA,EACXjH,QAASA,MAIbywK,GACI,qCACI,cAAC5uK,IAAD,CACIzjE,QAASuxG,OAAa5kH,EAAY+8C,EAClCxvC,UAAWq3G,EAAa3nC,EAAQsoK,oBAAiBvlP,EACjDoQ,YAAW+C,GAAQ,UAAOA,EAAP,WAHvB,SAKI,cAAC,IAAD,MAEJ,cAACqyO,IAAD,CACInyO,QAASsyO,OAAiB3lP,EAAYq3B,EACtC9pB,UAAWo4O,EAAiB1oK,EAAQsoK,oBAAiBvlP,EACrDoQ,YAAW+C,GAAQ,UAAOA,EAAP,SAHvB,SAKI,cAAC,IAAD,aCoETyyO,I,gVAAAA,IAxHf,YAO2B,IANvBj4O,EAMsB,EANtBA,OACAgnB,EAKsB,EALtBA,UACAukC,EAIsB,EAJtBA,YACApkD,EAGsB,EAHtBA,MACA3B,EAEsB,EAFtBA,SACAkkB,EACsB,EADtBA,OACsB,EACYjF,mBAAStd,GADrB,mBACf0jF,EADe,KACJC,EADI,OAEgBrmE,oBAAS,GAFzB,mBAEfszN,EAFe,KAEFG,EAFE,OAGczzN,oBAAS,GAHvB,mBAGfwyF,EAHe,KAGHkhI,EAHG,OAIU1zN,oBAAS,GAJnB,mBAIfy/H,EAJe,KAILk0F,EAJK,KA8BhBJ,EAAiB,kBAAOntJ,GAAaosB,GAwBrCugI,EAAe,WACjBvpN,QAAQo7B,UAAUz8B,MAAK,WACnBsrN,GAAe,GACfptJ,EAAa3jF,GACbixO,GAAY,OASdC,EAAa,WACXxtJ,IAAc1jF,GACd8mB,QAAQo7B,UAAUz8B,MAAK,WACnBurN,GAAc,GACdC,GAAY,MAEhB1uN,EAAOmhE,GACFj+D,MAAK,WACFqB,QAAQo7B,UAAUz8B,MAAK,WACnBurN,GAAc,GACdD,GAAe,SAGtBprN,OAAM,WACHmB,QAAQo7B,UAAUz8B,MAAK,WACnBurN,GAAc,GACdC,GAAY,UAIxBF,GAAe,IAQvB,OAJAtzN,qBAAU,WACNkmE,EAAa3jF,KACd,CAACA,IAEG,cAAC,IAAD,CACHnH,OAAQA,EACRgnB,UAAWA,EACXukC,YAAaA,EACbpkD,MAAO0jF,EACPq5D,SAAUA,EACV1+I,SAAUA,EACVuyO,YAAaA,EACb9gI,WAAYA,EACZ+gI,eAAgBA,IAChBnsN,SAtFsB,SAAC0vB,GACvB,IAAMs4D,EAAWt4D,EAAM5E,OAAOxvC,MAC9B2jF,EAAa+oB,GACbukI,GAAY,IAoFZ7pK,UApEkB,SAAChzB,GACnB,IAAM5E,EAAS4E,EAAMuuB,cACjB0vC,GAAaj+D,KAAWy8L,KACxBK,IACA1hM,EAAO2hM,QACA7+H,GAAWl+D,KAAW07D,IAC7BugI,IACA7gM,EAAO2hM,SA8DXhxK,QAhGgB,kBAAM4wK,GAAe,IAiGrC9oM,SAAUooM,EACV9tN,OAAQ2uN,KC1HDJ,QC0BTtpM,IAAgBrtC,IAAOC,IAAV,oJAQbg3O,IAAQj3O,IAAOC,IAAV,sEAKLi3O,IAAqBl3O,IAAOoD,OAAV,iWAQX,gBAAG9C,EAAH,EAAGA,MAAH,SAAUsD,SACJtD,EAAMpc,OAAOQ,WAAa4b,EAAMpc,OAAOO,aACxC,SAAAyb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOS,aAIhC,qBAAGif,SAA2B,UAAY,aAI9C,gBAAGzD,EAAH,EAAGA,KAAMkU,EAAT,EAASA,SAAT,OAAyBlU,GAAQkU,EAAW,EAAI,KAChD,qBAAG/T,MAAkBpc,OAAOQ,cAIhCk9D,IAAa5hD,IAAOC,IAAV,oPAUH,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC0yP,IAAqBn3O,IAAOC,IAAV,sDAIlB+gD,IAGD,SAAC,GAAoC,IAAlCgF,EAAiC,EAAjCA,KAAMoxL,EAA2B,EAA3BA,qBACJ/1O,EAAWO,cAEXpQ,EAASm5B,eACThX,EAAaT,eACbiqG,EAAcnpG,eACdqjO,EAAuBnhO,eACvBohO,EAAoB9jO,eACpBmyH,EAAapyH,eACbikH,EAAgBc,KAkChBwhE,EAAgCznD,GAjCX71I,cACEC,cAMSzM,uBAAY,WAC9CqR,EAASs1H,OAET,OAAI3wE,QAAJ,IAAIA,OAAJ,EAAIA,EAAMvmD,KACN+3H,EAAcxxE,EAAKvmD,MAExB,CAAC4B,EAAUm2H,EAAexxE,IAOQh2D,uBAAY,WAC7CqR,EAASw1H,QACV,CAACx1H,IAOgCrR,uBAAY,WAC5CqR,EAASo1H,QACV,CAACp1H,KAeEk2O,EAAoB,SAACtpN,GAAwB,IAAD,EACxC6kH,EAAkBv8H,aAAuB0X,EAAUz8B,EAAOi8G,OAC1DolC,EAAmBn8H,aACrBuX,EACAz8B,EAAOi8G,OAGXqsF,EACI,CACInhJ,WAAY,OACZ+5F,SAAQ,iBAAE1sF,QAAF,IAAEA,OAAF,EAAEA,EAAMvmD,UAAR,QAAc,GAE1BozI,EACAC,IA8BR,OA1BAxvH,qBAAU,WACN,OAAO,WACH65F,OAEL,CAACA,IAEJ75F,qBAAU,WACN,UAAI0iC,QAAJ,IAAIA,OAAJ,EAAIA,EAAMx0D,OAAQ,CACd,IAAM4zI,EAAoBiyG,EACtBrxL,EAAKx0D,OACLmiB,EAAWxhB,MAGfmlP,EAAkBlyG,GAClBO,SAEA2xG,EAAkB,MAEvB,CACCA,EACAD,EACA1jO,EAAWxhB,KACXwzI,EACA3/E,IAIA,eAAC,IAAD,WACI,cAACwxL,IAAD,CACI94O,OAAO,OACPgnB,UAAW,GACXukC,YAAY,YACZpkD,MAAOmgD,EAAOA,EAAKvyD,KAAO,GAC1ByQ,SAAS,YACTkkB,OAAQgvN,IAEZ,cAACH,IAAD,UACI,cAAC5mN,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,GAAD,CACIy0G,eAAgBkyG,EAChBhyG,eAAgB,kBAAM30G,KACtBstH,YAAY,KALxB,SASK,SAAC7/I,EAAD,SAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC0mN,IAAD,CACI74O,IAAKA,EACL+F,QAASysB,EACT1wB,KAAMqwB,EACNnc,SAAU7iB,EAAOi8G,MAAM96F,OAAS,EAChC/O,UAAU,UAAA+P,EAAWxhB,YAAX,eAAiBggB,YAAa,EACxChR,YAAU,qBANd,SAQI,eAACg2O,IAAD,WACI,cAAC,IAAD,UACK3mN,EAAQ,cAACivB,GAAA,EAAD,IAAc,cAACD,GAAA,EAAD,MAF/B,8BA8Bbi4L,IAbV,SAAC,GAAoC,IAAlCzxL,EAAiC,EAAjCA,KAAMoxL,EAA2B,EAA3BA,qBACV,OACI,cAAC,KAAkBnpK,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,WACbC,MAAO,qBAHf,SAMI,cAAC,IAAD,CAAS00C,KAAMA,EAAMoxL,qBAAsBA,OC5KxCM,IA9DSt5O,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,WACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAG2zB,OAAO,eAAV,SACI,8BACI,sBACI1zB,EAAE,WACF4zB,UAAU,4CAEd,sBACI5zB,EAAE,gBACF4zB,UAAU,wEC3CpC5M,IAAYvmB,IAAOC,IAAV,mHAMTkvB,IAAUnvB,IAAOC,IAAV,iJASP2gD,IAAkB5gD,IAAOC,IAAV,6HAQf+gD,IAAUhhD,IAAOC,IAAV,0JAQPstC,IAAgBvtC,IAAOC,IAAV,yDAIb8kI,IAAkB/kI,IAAOC,IAAV,kKAQf+kI,IAAahlI,IAAOC,IAAV,yDAIVglI,IAAiBjlI,IAAO0nB,KAAV,2HAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAG5BkzP,IAMR,SAAC,GAMC,IAAD,EALFtyG,EAKE,EALFA,eACAE,EAIE,EAJFA,eACA6J,EAGE,EAHFA,2BACAwoG,EAEE,EAFFA,gBACAzoG,EACE,EADFA,mBACE,EAC8BhsH,mBAAQ,OAAWy0N,QAAX,IAAWA,IAAmB,IADpE,mBACK3pN,EADL,KACemwH,EADf,KAEIzY,EAAapyH,eACbqyH,EAAepyH,eACfhiB,EAASm5B,eAJb,EAMsDxH,mBACpDgsH,GAAsB,IAPxB,mBAMKI,EANL,KAM2BC,EAN3B,KAUI6O,EAAuBruJ,uBACzB,SAACqjB,GAAD,OAAmB+qI,EAAY/qI,KAC/B,CAAC+qI,IAGC3qD,EAAiBzjG,uBAAY,WAC/Bq1I,EAAep3G,GACW,OAA1BmhH,QAA0B,IAA1BA,KAA6BG,GAC7B5J,IACAJ,MACD,CACCF,EACAp3G,EACAmhH,EACAG,EACA5J,EACAJ,IAGE8kD,EAAiBr6L,uBAAY,WAC/B41I,EAAa,IACbwY,EAAY,IACZ5O,EAAwB,MACzB,CAAC5J,EAAc4J,IAEZP,GAA8C,oBAC/CtM,GAAqBhlG,QAAU,CAAEx5B,MAAO,YADO,eAE/Cw+H,GAAqBvvI,OAAS,CAAE+Q,MAAO,WAFQ,GAK9CwrI,EAAoC3/I,uBACtC,SAACi2I,EAAgC5gH,GACzBA,EAAEgwB,OAAO1qC,QACT6kI,EAAwB,GAAD,oBAAKD,GAAL,CAA2BtJ,KAElDuJ,EACID,EAAqBp8H,QACjB,SAACC,GAAD,OAAeA,IAAS6yH,QAKxC,CAACuJ,EAAyBD,IAGxBrJ,EACF10I,EAAO6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,QAArC,OACA48H,QADA,IACAA,OADA,EACAA,EAAsB58H,QAEpBklO,GACDrmP,EAAO6iB,SAAS1B,SAAW48H,EAAqB58H,OAErD,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC4hB,GAAA,EAAD,CAAUpwB,MAAO,sBAAuBD,SAAS,8BAAjD,SACI,cAAC,IAAD,UAEQm4B,OAAOtrB,KACHk+H,GAENhuI,KAAI,SAAAmS,GAAI,OACN,cAAC,IAAD,CAAYjS,YAAU,qCAAtB,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,QACI4kI,GACAA,EAAqB79H,SAAS0B,GAElC0S,aAAc,SAAAT,GAAC,OACXsqH,EACIv8H,EACAiS,IAGR5hB,MAAOwrI,EAAe77H,GAAMjP,MAC5B4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAQ,UAAK2oE,oBAAUoiE,EAAe77H,GAAMjP,OAApC,cAfHiP,YAqBzB,cAACmhB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,iBAApC,SACI,cAAC,IAAD,UACI,cAAC,KAAD,CACIwkB,cAAe21H,EACfv1H,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,IAAD,WACI,eAAC,IAAD,CAAgB1nB,YAAU,8BAA1B,UACK+kI,EADL,eAGA,cAAC,IAAD,UACI,cAAC,IAAD,CACItiI,SAAUi0O,EACVh3O,QAAQ,UACRpC,MAAO,QACPhE,OAAQ4vL,EACRnmL,SAAS,eALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQg5F,EACRvvF,SAAS,sBAHb,iC,4CChHVqiB,IAAYvmB,IAAOC,IAAV,uNAGgB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkE,aACnC,SAAA8X,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAM9C0iF,IAAStnE,IAAOC,IAAV,yDAINq0B,IAAQt0B,IAAOC,IAAV,0IAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnC0yP,IAAU93O,IAAOC,IAAV,yIAGA,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAKnCm3G,IAAa57F,IAAOC,IAAV,sLASVghE,IAAiBjhE,IAAOC,IAAV,oHAOd0sJ,IAAQ3sJ,IAAOwsF,MAAV,oIAOLpI,IAAYpkF,IAAOC,IAAV,4IAGH,SAAAC,GAAK,OAAKA,EAAM63O,WAAa,IAAM,OAC7B,SAAA73O,GAAK,OAAKA,EAAM63O,WAAa,QAAU,OAInDzqF,IAAwBttJ,YAAO65D,KAAP75D,CAAH,kDAIrBg4O,IAAWh4O,IAAOC,IAAV,gIACR,SAAAC,GAAK,OAAIA,EAAMkmE,MAAN,gBAAuBlmE,EAAMkmE,KAA7B,QAOT6xK,IAAUj4O,IAAOC,IAAV,gOAMK,SAAAC,GAAK,OACfA,EAAMmU,SAAWnU,EAAMI,MAAMpc,OAAOS,UAAY,UAClDqzP,KACW,SAAA93O,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAQ/BkoG,IAAoBttF,YAAOqtJ,KAAPrtJ,CAAH,gEAIjBk4O,IAAmBl4O,IAAOC,IAAV,yKAShBk4O,IAAqBn4O,IAAOC,IAAV,2GAMlBm4O,IAAoBp4O,IAAOC,IAAV,0MAGV,SAAAC,GAAK,OACVA,EAAM0D,SACA,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,YAC5B,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOG,eAC5B,SAAA6b,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAIlC,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,IAAM,SAI9Cy0O,IAAer4O,IAAOC,IAAV,+GAOZwtF,IAA0BztF,IAAOC,IAAV,oIAQvB0tF,IAAa3tF,IAAOC,IAAV,4FAMVytF,IAAS1tF,YAAOurC,KAAPvrC,CAAH,6FAMNs4O,IAA0Bt4O,YAAOysE,MAAPzsE,CAAH,yDAIvBsqL,IAAkBtqL,IAAOC,IAAV,8CAIf2gD,IAAkB5gD,IAAOC,IAAV,4FAMfs4O,IAAqBv4O,YAAOg4O,IAAPh4O,CAAH,0EAKlBw4O,IAA4Bx4O,IAAOC,IAAV,iFAKzBgzF,IAAYjzF,IAAOgoB,EAAV,wGACF,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAMnCg0P,IA6BD,SAAC,GA4BC,IAAD,MA3BFvgP,EA2BE,EA3BFA,MACA0P,EA0BE,EA1BFA,QACAuhB,EAyBE,EAzBFA,cACAh4B,EAwBE,EAxBFA,aACAunP,EAuBE,EAvBFA,gBACAC,EAsBE,EAtBFA,sBACA9pI,EAqBE,EArBFA,cACA5kC,EAoBE,EApBFA,YACAsqK,EAmBE,EAnBFA,aACAqE,EAkBE,EAlBFA,uBACArwN,EAiBE,EAjBFA,YACAmQ,EAgBE,EAhBFA,UACA7iB,EAeE,EAfFA,SACAoiB,EAcE,EAdFA,YACA9lB,EAaE,EAbFA,WACAs5H,EAYE,EAZFA,WACAotG,EAWE,EAXFA,iBACA/E,EAUE,EAVFA,mBACArjJ,EASE,EATFA,YACAk0G,EAQE,EARFA,gBACA7pD,EAOE,EAPFA,0BACA7vI,EAME,EANFA,cACA6tO,EAKE,EALFA,oCACA5xK,EAIE,EAJFA,cACAC,EAGE,EAHFA,YACA7uC,EAEE,EAFFA,QACAp0B,EACE,EADFA,SAEM1S,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACbe,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OACxCkT,EAAqBjP,eACrB4iO,EAAkB59H,GAAatlG,GAPnC,EAYoDsN,mBAClD,IAbF,mBAYK61N,EAZL,KAY0BC,EAZ1B,KAgBIC,EAA6BlkG,KAE7BmkG,EAAoC,CACtCrwL,WAAY,CACRrtD,SAAQ,iBAAEtK,QAAF,IAAEA,OAAF,EAAEA,EAAcsK,cAAhB,QAA0B,GAClCtK,aAAa,6BACNA,GADK,IAERmnC,UACA5lC,MAAOo4I,IACPn4I,OAAM,UAAGs3E,EAAc93D,EAAH,OAAgB08F,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAel8F,cAA7C,QAAwD,IAElEkiI,gBAAkB5qE,OAA8Bl5E,EAAhB89G,EAChCtY,WAAU,iBAAEsY,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,cAAjB,QAA2B,GAEzC8zC,UAAYwjB,EAAkC,sBAApB,mBAOxBmvK,EAAkCppP,uBAAY,WAChD28B,QAAQo7B,UAAUz8B,MAAK,WACnBrgB,IACAk8D,IACA2xK,SAEL,CAAC7tO,EAAe6tO,EAAqC3xK,IAGtBkyK,EAC9BzkG,GACA,CACIxsF,WAAYusF,GACZtsF,eAAgB6wL,EAChB5wL,sBAAuB6wL,GAE3B,eACAC,GARAjmG,6BAeEmmG,EAAyBtpP,uBAAY,WACvCqpP,MACD,CAACA,IAEJ/1N,qBAAU,WACN,OAAO,kBAAMrY,OAEd,IAEHqY,qBAAU,WACFy1N,IACAvuD,EAAgB30K,GAChB8vH,OAEL,CAAC9vH,EAAUkjO,EAAiBvuD,EAAiB7kD,IAGhD,IAIM3rE,EAAgB70C,iBAAuB,MAOvCo0N,EAAiB,SAAC9gP,GAAD,OACnBo2G,EAAcn9F,SAASjZ,EAAKgH,KAEhC,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAO0B,YAAA,UAAc+C,EAAd,UAAP,uBACA,cAAC4zO,IAAD,OAEJ,cAAC,IAAD,UACI,cAAC,KAAD,CACI5wK,cAAeA,EACfC,YAAaA,EACbjjE,SAAQ,UAAKA,EAAL,cACRsiE,KAAM,GACN7jE,SAAU,OAGlB,cAAC,KAAD,IACA,eAAC,IAAD,WACKzK,GACG,cAAC4xE,GAAA,EAAD,CACInmE,MAAO,CACHlF,MAAO,OACPC,OAAQ,GACRyiD,WAAY,IAEhB8oB,YAAaA,EACbF,eAAgB8kC,EAAcl8F,OAC9BR,WAAYA,EACZ2nD,aAAcgxE,IACd9gE,gBAAiB,WACb/+D,KAEJsd,YAAa,WACTqwN,GAAuB,GACvBrwN,GAAY,IAEhBrkB,SAAUA,EAjBd,SAmBI,2BAGR,cAAC,IAAD,UACI,cAAC,KAAD,CACIqmB,SAAUpB,EACVvlB,SAAU6sF,EAAY65C,kBAG9B,cAAC,IAAD,UACI,cAACj6G,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIy0G,eAAgBptG,EAChBstG,eAAgB,kBAAM30G,KACtBgnN,gBAAiB/hO,EACjBs5H,mBAAoB6pG,EACpB5pG,2BAA4B,SACxBhwI,GAEA65O,EAAuB75O,GACE,OAAzB07I,QAAyB,IAAzBA,KAA4B17I,OAX5C,SAgBK,SAACf,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,SACI6sF,EAAY45C,iBACX12H,EAAWxhB,KAAK+f,MAAMS,OAE3BooC,WAAYlqB,EACZ6zG,aACI7uH,EAASlD,OAASqmO,EAAoBrmO,OAE1CzO,SAAQ,UAAKA,EAAL,mBAKxB,cAAC8uF,GAAD,UACI,cAAC,MAAD,UACI,cAACC,IAAD,CACI9xF,YAAA,UAAc+C,EAAd,YADJ,mBAEKiO,EAFL,YAGmB,IAAfA,EAAmB,OAAS,kBAK5C,cAAC,KAAD,IACA,eAAC,IAAD,WACK0D,GACG,cAAC2iO,IAAD,UACI,cAAC,KAAD,CACI5vO,eAAgBiN,EAChByuD,cACI9yE,EAAOi8G,MAAM96F,OAAS,EApL5B,SAAClP,GACnBw0B,EAAY7S,EAAmB3hB,EAAOoS,EAAUvB,UAqLlBvjB,MAKtB,cAAC,IAAD,UACI,cAAC,GAAD,UACI,eAAC,KAAD,WACI,cAAC,IAAD,CACImT,SAAQ,UAAKA,EAAL,oBADZ,SAGI,cAAC4f,GAAA,EAAD,CACInZ,UAAWkkG,EAAcl8F,OACzBtO,KAAM,GACNuG,SAAUq/D,EACVnkD,aAAc,SAAAT,GACVuzN,EACIvzN,EAAEgwB,OAAO1qC,SAEb4d,GAAY,IAEhB3kB,SAAUi1O,MAGlB,cAAC,KAAD,6BACQH,GADR,IAEIj6O,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAQ,UAAKA,EAAL,iBAJZ,oBAQA,cAAC,KAAD,6BACQy0O,GADR,IAEI/0O,SAAU6sF,EAAY85C,eACtBrmI,SAAQ,UAAKA,EAAL,yBAHZ,mCAWZ,cAAC,IAAD,CACI7F,IAAK27D,EACL+9K,YAAatnJ,EAAYpmE,eAF7B,UAIMomE,EAAYpmE,gBACV,cAAC,IAAD,CACIyvC,aAAcgxE,IACd/wE,UAAW7hE,EAAQA,EAAMga,MAAMS,OAAS,EACxCR,WAAYA,EACZgoD,eAAgBzhC,EAChBshC,cAAeA,EALnB,gBAOK9hE,QAPL,IAOKA,OAPL,EAOKA,EAAOga,MAAMjR,KAAI,SAAAxI,GACd,OACI,eAAC,IAAMqkJ,SAAP,WACI,eAACm7F,IAAD,CACI5jO,SAAUklO,EAAe9gP,GACzB0I,YAAA,UAAc+C,EAAd,SAFJ,UAII,cAACg0O,IAAD,UACI,cAACp0N,GAAA,EAAD,CACInZ,QAAS4uO,EACL9gP,GAEJ4L,KAAM,GACNyhB,aAAc,WACVyuN,EAAa97O,EAAKgH,KAEtByE,SAAQ,UAAKA,EAAL,sBAGhB,cAAC8zO,IAAD,CAAU5xK,KAAM,GAAhB,SACI,eAAC,IAAD,WACI,cAAClJ,IAAA,EAAD,CACI/8D,KACIsrI,IACAhzI,EAAKgH,GAETs7C,WAAY,kBACR+4L,EACIr7O,EAAKgH,KAGbmJ,eACInQ,EAAKjH,OAET0S,SAAQ,UAAKA,EAAL,kBAEZ,eAAC,IAAD,WACI,cAAC,IAAD,CACI0D,QAASnP,EACT4L,KAAK,KACLH,SAAQ,UAAKA,EAAL,kBAEZ,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KACJhH,EAAKgH,GAEbyE,SAAQ,UAAKA,EAAL,cACRytD,SAAS,OAPb,mBASQl5D,EAAKkmC,UATb,YAS0BlmC,EAAKomC,oBAK3C,cAAC05M,IAAD,CACIp3O,YAAA,UAAc+C,EAAd,uBADJ,SAGKzL,EAAKixM,aACF/nL,aACIlpB,EAAKixM,cAGT,cAAC/kJ,GAAA,EAAD,SAIX8mF,IAAehzI,EAAKgH,IACjB,cAAC64O,IAAD,CACI1vO,eAAgBnQ,EAAKjH,OACrBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAEpBu8D,cAAe,SAACn4E,GAAD,OAlPzB,SAACA,EAAiBlF,GAChDs1M,EAAgBt1M,EAAQkF,GAkPoB24I,CACI34I,EACAkE,EAAKgH,SA3EJhH,EAAKgH,WAsF7CgxF,EAAYpmE,gBACT,eAACo7C,IAAA,EAAD,WACKgrB,EAAYK,oBACT,cAAC,MAAD,CACIjtF,KAAMuqI,GACNlqI,SAAQ,UAAKA,EAAL,eAFZ,0BAOHusF,EAAYM,0BACT,cAAC,MAAD,CACIp4C,WAAY,QACZz0C,SAAQ,UAAKA,EAAL,wBAGfusF,EAAYO,0BACT,cAAC,MAAD,CACI9sF,SAAQ,UAAKA,EAAL,8BAM5B,cAAC,KAAD,IACA,cAACi0O,IAAD,UACI,eAACC,IAAD,CACIx0O,SAAUirG,EAAcl8F,OAAS,EACjCvO,QAASk1O,EACTn4O,YAAU,yBAHd,UAKK0tG,EAAcl8F,OAAS,EAAvB,cACYwjM,GACHlsI,EAAc93D,EAAa08F,EAAcl8F,OACzC,kBAEJ,qBACN,cAAC0lO,IAAD,UACI,cAAC,IAAD,eAQlBvtG,IAAiB,GAqOR0uG,IAlOWp7O,sBACtB,WAAkEC,GAAS,IAAD,QAAvEy6O,EAAuE,EAAvEA,oCACOvpP,EAA6B00I,cAC7Bw1G,EAAgB79H,KAChBh0G,EAAU0R,YAAY3R,MACtB+xO,EAAqB9gH,KACrB+gH,EACFrkM,aAAmBokM,GACjBj+O,EAASlM,EAAOkM,OAChB6wI,EAAoBvC,KACpB46D,EAAkB9pE,GAAwCp/H,GAC1Dm+O,EAAoBvzM,eACpBhO,EAAQwoF,KAERvoF,EAAUra,mBAAQ,WAAO,IAAD,EAC1B,GAAI,UAACoa,EAAM2lB,YAAP,aAAC,EAAYrrC,OACjB,MAAO,CACHtN,KAAWE,KACXF,KAAWI,YACXJ,KAAWC,eACbrE,KAAI,SAAAsd,GAAQ,OAAI8Z,EAAM2lB,KAAKzf,MAAK,SAAAvqC,GAAI,OAAIA,EAAKP,OAAS8qB,KAAW9e,QACpE,CAAC44B,EAAM2lB,OAEJjnB,EAAoC,CACtClkC,WAAY,GACZ4I,OA3BQ,QA2BAA,EAAyBA,OAAS1K,EAC1C2X,QAAS,GACT3V,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/BP,MAAOo4I,IACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GA9BmD,EAwClEkkB,aAAqBC,GANrB5lC,EAlCkE,EAkClEA,aACAg4B,EAnCkE,EAmClEA,cACA4O,EApCkE,EAoClEA,WACAE,EArCkE,EAqClEA,YACAS,EAtCkE,EAsClEA,UACAC,EAvCkE,EAuClEA,UAGJrV,qBAAU,WACDgV,GACLqhN,EAA4B,6BACrBxoP,GADoB,IAEvBmnC,eAEL,CACCnnC,EACAwoP,EACAl+O,EACAm+O,EAAkBznP,KAClBmmC,IAGJ,IAAMvlC,EAAU5B,EAAa4B,QACvB2lP,EAAkB5uG,GAAW,OAAQ/2I,EAASglC,GAC9C4gN,EAAwB7uG,GAC1B,aACA/2I,EACAglC,GA7DkE,EAgE5B5U,mBAAmB,IAhES,mBAgE/D0rF,EAhE+D,KAgEhDumI,EAhEgD,OAiEhCjyN,oBAAS,GAjEuB,mBAiE/D8mD,EAjE+D,KAiElDuhE,EAjEkD,KAkEhE2tB,EAAYl7I,mBACd,kBAAOw7N,EAAcI,SAAWJ,EAAcI,SAAS3nO,MAAQ,KAC/D,CAACunO,EAAcI,WAEb1nO,EAAU,oBAAGsnO,EAAcI,gBAAjB,aAAG,EAAwBxgM,aAA3B,QAAoC,EAC9Cw/L,EAAmB1/E,EAAUxmJ,OAAS,EACtCmnO,EAAsBjrI,EAAcl8F,OAASwmJ,EAAUxmJ,OAmC7D2Q,qBAAU,YAED2mD,GACD4kC,EAAcl8F,SAAWR,GACzBA,EAAa,GAEbq5H,GAAe,KAEpB,CAACvhE,EAAa93D,EAAY08F,IAE7BvrF,qBAAU,WAEF2mD,IACC7mC,kBAAQyrE,IACTA,EAAcl8F,OAASwmJ,EAAUxmJ,QAEjCyiO,EAAiBj8E,EAAUl4J,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,SAEjD,CAACwqE,EAAa4kC,EAAesqD,IA7HsC,MA+HlCh2I,mBAChC,MAhIkE,mBA+H/DsoH,EA/H+D,KA+HnDC,EA/HmD,OAqJ5BvoH,mBAAS,IAAIhD,MArJe,mBAqJ/D+mD,EArJ+D,KAqJhDqkE,GArJgD,KA2JhEpkE,GAAcn3E,uBAAY,WAC5B2pP,EAA4B,6BAEjBxoP,GAFgB,IAGnBuB,MAAOo4I,IAAiB35I,EAAawB,OACrCA,OAAQ,EACR2lC,aAEJ,GAEJizG,GAAiB,IAAIprH,QACtB,CAACw5N,EAA6BxoP,EAAcmnC,IAC/C62L,8BAAoD9wN,GAAK,iBAAO,CAC5D8oE,mBAGJ,IAAM4yK,GAA8B,UAAG5oP,EAAauX,eAAhB,aAAG,EAAsBiK,OAEvD89E,GAAc67C,EAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,gBACI,UAAA74I,EAAa0kB,gBAAb,eAAuBlD,QAASonO,GACpCxjJ,WAAYpkF,IAGhB,OACI,cAAC,KAAkB87D,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,WACbC,MAAO,YAHf,SAMI,cAAC,IAAD,CACIpZ,MAAOuhP,EAAcI,SACrBjyO,QAASA,EACT/U,WAAY1B,EAAa0B,WACzBs2B,cAAeA,EACfuvN,gBAAiBA,EACjBC,sBAAuBA,EACvB9pI,cAAeA,EACf5kC,YAAaA,EACbsqK,aArHa,SAAC90O,GACtB,IAAMu6O,EAAmBnrI,EAAcn9F,SAASjS,GAC1CovG,EAAc17F,QAAO,SAAA9jB,GAAM,OAAIA,IAAWoQ,KAC1CovG,EAAcmP,OAAOv+G,GAC3B21O,EAAiB4E,GACjBxuG,GAAe,IAiHPotG,uBA1GuB,SAACvkO,GAChC+gO,EACI/gO,GAAYylO,EACN3gF,EAAUl4J,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,MAC3B,KAuGF8oB,YAAaijH,EACb9yG,UAAWA,EACX7iB,SAAU1kB,EAAa0kB,UAAY,GACnCoiB,YAAaA,EACb9lB,WAAYA,EACZs5H,WAAYA,EACZotG,iBAAkBA,EAClB/E,mBAjEe,SAACnoK,GACnBA,GAED+/D,EADAD,IAAe9/D,EACD,KAEAA,IA6DV8kB,YAAaA,GACbk0G,gBAAiBA,EACjBxzM,aAAcA,EACd2pJ,0BA9EsB,SAAC17I,GAC/Bu5B,EAAU,UAAW,CACjB,CACI3lC,MAAO,SACP6S,MAAOzG,MA2EP6L,cA5GU,WAClBmqO,EAAiB,IACjB5pG,GAAe,IA2GPstG,oCACIA,EAEJ5xK,cAAeA,EACfC,YAAaA,GACb7uC,QAASA,EACTp0B,SAAS,wBCr2Bd+1O,IA5DM77O,sBACjB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,sBACIC,EAAE,s7BACF4zB,UAAU,oFChCjC+mN,IAAqC,SAC9CC,GAEA,OAAKA,GAAgBA,EAAe,EACzB,kBACiB,IAAjBA,EACA,gBAED,GAAN,OAAUA,EAAV,kBC6DF5zN,IAAYvmB,IAAOC,IAAV,uNAGgB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkE,aACnC,SAAA8X,GAAK,OAAIA,EAAMI,MAAMpc,OAAOI,eAM9CgjF,IAAStnE,IAAOC,IAAV,yDAINq0B,IAAQt0B,IAAOC,IAAV,0IAGE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAKnC0yP,IAAU93O,IAAOC,IAAV,wIAGA,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAKnCm3G,IAAa57F,IAAOC,IAAV,sLASVghE,IAAiBjhE,IAAOC,IAAV,oHAOd0sJ,IAAQ3sJ,IAAOwsF,MAAV,oIAOLpI,IAAYpkF,IAAOC,IAAV,4IAGH,SAAAC,GAAK,OAAKA,EAAM63O,WAAa,IAAM,OAC7B,SAAA73O,GAAK,OAAKA,EAAM63O,WAAa,QAAU,OAInDzqF,IAAwBttJ,YAAO65D,KAAP75D,CAAH,kDAIrBg4O,IAAWh4O,IAAOC,IAAV,gIACR,SAAAC,GAAK,OAAIA,EAAMkmE,MAAN,gBAAuBlmE,EAAMkmE,KAA7B,QAOTg0K,IAAiBp6O,YAAOg4O,IAAPh4O,CAAH,0EAKdi4O,IAAUj4O,IAAOC,IAAV,gOAMK,SAAAC,GAAK,OACfA,EAAMmU,SAAWnU,EAAMI,MAAMpc,OAAOS,UAAY,UAClDqzP,KACW,SAAA93O,GAAK,OACVA,EAAM0D,SACA1D,EAAMI,MAAMpc,OAAOQ,WACnBwb,EAAMI,MAAMpc,OAAOkB,SAQ/BkoG,IAAoBttF,YAAOqtJ,KAAPrtJ,CAAH,gEAIjBk4O,IAAmBl4O,IAAOC,IAAV,yKAShBk4O,IAAqBn4O,IAAOC,IAAV,2GAMlBm4O,IAAoBp4O,IAAOC,IAAV,sLAGV,SAAAC,GAAK,OACVA,EAAM0D,SACA,SAAA1D,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,YAC5B,SAAAwb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOW,WAC5B,SAAAqb,GAAK,OAAKA,EAAM0D,SAAW,UAAY,aAGlC,SAAA1D,GAAK,OAAKA,EAAM0D,SAAW,IAAM,SAI9Cy2O,IAAiBr6O,IAAOC,IAAV,qMAQP,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmE,qBAGnColG,IAA0BztF,IAAOC,IAAV,oIAQvB0tF,IAAa3tF,IAAOC,IAAV,iHAOVytF,IAAS1tF,YAAOurC,KAAPvrC,CAAH,6FAMNs4O,IAA0Bt4O,YAAOysE,MAAPzsE,CAAH,yDAIvBsqL,IAAkBtqL,IAAOC,IAAV,8CAIf2gD,IAAkB5gD,IAAOC,IAAV,4FAMfq6O,IAAgBt6O,IAAO0nB,KAAV,8BAEb8wN,IAA4Bx4O,IAAOC,IAAV,iFAKzBgzF,IAAYjzF,IAAOgoB,EAAV,wGACF,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAMnC81P,IA+BD,SAAC,GA8BC,IAAD,IA7BFriP,EA6BE,EA7BFA,MACAuD,EA4BE,EA5BFA,OACAmM,EA2BE,EA3BFA,QACAuhB,EA0BE,EA1BFA,cACAuvN,EAyBE,EAzBFA,gBACA8B,EAwBE,EAxBFA,kBACA3rI,EAuBE,EAvBFA,cACA5kC,EAsBE,EAtBFA,YACAsqK,EAqBE,EArBFA,aACAqE,EAoBE,EApBFA,uBACArwN,EAmBE,EAnBFA,YACAkyN,EAkBE,EAlBFA,uBACA/hN,EAiBE,EAjBFA,UACA7iB,EAgBE,EAhBFA,SACAoiB,EAeE,EAfFA,YACA9lB,EAcE,EAdFA,WACAs5H,EAaE,EAbFA,WACAotG,EAYE,EAZFA,iBACA/E,EAWE,EAXFA,mBACArjJ,EAUE,EAVFA,YACAiqJ,EASE,EATFA,kBACA5/F,EAQE,EARFA,0BACA3pJ,EAOE,EAPFA,aACA8Z,EAME,EANFA,cACA0vO,EAKE,EALFA,uCACAzzK,EAIE,EAJFA,cACAC,EAGE,EAHFA,YACAgzK,EAEE,EAFFA,aACAj2O,EACE,EADFA,SAEM1S,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACbe,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OACxCkT,EAAqBjP,eACrB4iO,EAAkB59H,GAAatlG,GAMrCyN,qBAAU,WACFy1N,IACAvuD,EAAgB30K,GAChB8vH,OAEL,CAAC9vH,EAAUkjO,EAAiBvuD,EAAiB7kD,IAEhDriH,qBAAU,WACN,OAAO,kBAAMrY,OAEd,IAGH,IAIM+uD,EAAgB70C,iBAAuB,MACvCy1N,EAA+B,OACjCzpP,QADiC,IACjCA,GADiC,UACjCA,EAAc68D,kCADmB,aACjC,EAA0Cr7C,OAExCkoO,EAAsC,CACxC/xL,WAAY,CACRrtD,QAASA,EACTtK,aAAa,6BACNA,GADK,IAERuB,MAAOo4I,IACPn4I,OAAQs3E,EAAc93D,EAAa08F,EAAcl8F,SAErDkiI,gBAAkB5qE,OAA8Bl5E,EAAhB89G,EAChCtY,WAAU,iBAAEsY,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,cAAjB,QAA2B,GAEzC8zC,UAAYwjB,EAAkC,sBAApB,mBAGxB2rE,EAAwBL,KAMxBulG,EAAuC9qP,uBAAY,WACrD28B,QAAQo7B,UAAUz8B,MAAK,WACnBrgB,IACAk8D,IACAwzK,SAEL,CAAC1vO,EAAek8D,EAAawzK,IAIxB7J,EACJl8F,GACA,CACIxsF,WAAYusF,GACZtsF,eAAgButF,EAChBttF,sBAAuBuyL,GAE3B,iBACAC,GATA3nG,6BAgBE4nG,EAA4B/qP,uBAAY,WAC1C8gP,MACD,CAACA,IAEJ,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAO3vO,YAAA,UAAc+C,EAAd,UAAP,0BACA,cAAC,IAAD,CAAS/C,YAAA,UAAc+C,EAAd,oBAAT,SACKg2O,IAAkC,OAACC,QAAD,IAACA,IAAgB,QAG5D,cAAC,IAAD,UACI,cAAC,KAAD,CACIjzK,cAAeA,EACfC,YAAaA,EACbjjE,SAAQ,UAAKA,EAAL,cACRsiE,KAAM,GACN7jE,SAAU,OAIlB,cAAC,KAAD,IAEA,eAAC,IAAD,WACI,cAACmnE,GAAA,EAAD,CACInmE,MAAO,CACHlF,MAAO,OACPC,OAAQ,GACRyiD,WAAY,IAEhB8oB,YAAaA,EACbF,eAAgB8kC,EAAcl8F,OAC9BR,WAAYA,EACZ2nD,aAAcgxE,IACd9gE,gBAAiB,WACb/+D,KAEJsd,YAAa,WACTqwN,GAAuB,GACvBrwN,GAAY,IAEhBrkB,SAAUA,EAjBd,SAmBI,2BAEJ,cAAC,IAAD,UACI,cAAC,KAAD,CACIqmB,SAAUpB,EACVvlB,SAAU6sF,EAAY65C,kBAG9B,cAAC,IAAD,UACI,cAACj6G,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIy0G,eAAgBptG,EAChBstG,eAAgB,kBAAM30G,KACtBgnN,gBAAiB/hO,EACjBs5H,mBACIh+I,EAAa68D,4BACb,GAEJohF,2BACI0L,KAXhB,SAgBK,SAACz8I,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,SACI6sF,EAAY45C,iBACX12H,EAAWxhB,KAAK+f,MAAMS,OAE3BooC,WAAYlqB,EACZ6zG,aACI7uH,EAASlD,OAASioO,EAEtB12O,SAAQ,UAAKA,EAAL,mBAKxB,cAAC8uF,GAAD,UACI,cAAC,MAAD,UACI,eAAC,IAAD,CAAW7xF,YAAA,UAAc+C,EAAd,YAAX,UACK,IACAiO,EAAY,IACG,IAAfA,EAAmB,OAAS,QAAS,cAKtD,cAAC,KAAD,IACA,eAAC,IAAD,WACK0D,GACG,cAAC,IAAD,UACI,cAAC,KAAD,CACIjN,eAAgBiN,EAChByuD,cACI9yE,EAAOi8G,MAAM96F,OAAS,EA7K5B,SAAClP,GACnBw0B,EAAY7S,EAAmB3hB,EAAOoS,EAAUvB,UA8KlBvjB,MAKtB,cAAC,IAAD,UACI,cAAC,GAAD,UACI,eAAC,KAAD,WACI,cAAC,IAAD,CACImT,SAAQ,UAAKA,EAAL,oBADZ,SAGI,cAAC4f,GAAA,EAAD,CACInZ,UAAWkkG,EAAcl8F,OACzBtO,KAAM,GACNuG,SAAUq/D,EACVnkD,aAAc,SAAAT,GACVuzN,EAAuBvzN,EAAEgwB,OAAO1qC,SAChC4d,GAAY,IAEhB3kB,SAAUi1O,MAGlB,cAAC,KAAD,6BACQH,GADR,IAEIj6O,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAQ,UAAKA,EAAL,iBAJZ,oBAQA,cAAC,KAAD,6BACQs2O,GADR,IAEI52O,SAAU6sF,EAAY85C,eACtBrmI,SAAQ,UAAKA,EAAL,uBAHZ,iCAWZ,cAAC,IAAD,CACI7F,IAAK27D,EACL+9K,YAAatnJ,EAAYpmE,eAF7B,UAIMomE,EAAYpmE,gBACV,cAAC,IAAD,CACIyvC,aAAcgxE,IACd/wE,UAAW7hE,EAAQA,EAAMga,MAAMS,OAAS,EACxCR,WAAYA,EACZgoD,eAAgBzhC,EAChBshC,cAAeA,EALnB,SAOK9hE,GACGA,EAAMga,MAAMjR,KAAI,SAAA+5O,GACZ,OACI,eAAC,IAAMl+F,SAAP,WACI,eAAC,IAAD,CACI37I,YAAA,UAAc+C,EAAd,SADJ,UAGI,cAAC,IAAD,UACI,cAAC4f,GAAA,EAAD,CACInZ,QAASkkG,EAAcn9F,SAASspO,EAAOviP,KAAKgH,IAC5C4E,KAAM,GACNyhB,aAAc,WACVyuN,EAAayG,EAAOviP,KAAKgH,KAE7ByE,SAAQ,UAAKA,EAAL,sBAGhB,cAAC,IAAD,CAAUkiE,KAAM,GAAhB,SACI,eAAC,IAAD,WACI,cAAClJ,IAAA,EAAD,CACI/8D,KACIsrI,IACAuvG,EAAOviP,KAAKgH,GAEhBs7C,WAAY,kBACR+4L,EACIkH,EAAOviP,KACFgH,KAGbmJ,eACIoyO,EAAOxpP,OAEX0S,SAAQ,UAAKA,EAAL,kBAEZ,eAAC,IAAD,WACI,cAAC,IAAD,CACIsnC,cAAe,CACX7M,UACIq8M,EACKviP,KACAkmC,UACTE,SACIm8M,EACKviP,KACAomC,SACTqN,QACI8uM,EACKviP,KACA+zC,SACTz6C,OAAQipP,EAAOjtL,YAEnB1pD,KAAK,KACLH,SAAQ,UAAKA,EAAL,kBAEZ,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KACJu7O,EACKviP,KACAgH,GAEbyyD,WACI8oL,EAAOn+O,YACH,cAACw9O,IAAD,CAAgBl5O,YAAA,UAAc+C,EAAd,eAAhB,SACI,cAAC,IAAD,MAIZA,SAAQ,UAAKA,EAAL,cACRytD,SAAS,OAhBb,mBAkBQqpL,EAAOviP,KAAKkmC,UAlBpB,YAkBiCq8M,EAAOviP,KAAKomC,oBAKzD,cAACu7M,IAAD,UACI,cAACE,IAAD,UACI,cAAC,GAAD,CACIp5O,MACI85O,EAAOviP,KAAKgH,GAEhBkL,QACIqwO,EAAOn+O,WAEX0tB,SAAU,SAAAlF,GACNo1N,EACIO,EAAOv7O,GACP4lB,EAAEgwB,OACG1qC,UAGbjM,OAAQ,GACRD,MAAO,GACP6yG,aAAc,GACdptG,SAAQ,UAAKA,EAAL,mCAKvBunI,IAAeuvG,EAAOviP,KAAKgH,IACxB,cAAC,IAAD,CACImJ,eACIoyO,EAAOxpP,QAAU,GAErBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAEpBu8D,cAAe,SACXn4E,GADW,OAjU7B,SAACA,EAAiBlF,GAChDqrP,EAAkBrrP,EAAQkF,GAmUsB24I,CACI34I,EACAymP,EAAOviP,KAAKgH,OAIzB,MApHcu7O,EAAOviP,KAAKgH,WA4HxDgxF,EAAYpmE,gBACT,eAACo7C,IAAA,EAAD,WACKgrB,EAAYK,oBACT,cAAC,MAAD,CACIjtF,KAAMuqI,GACN3vI,MAAO,QACPyF,SAAQ,UAAKA,EAAL,eAHZ,yBAQHusF,EAAYM,0BACT,cAAC,MAAD,CACIp4C,WAAY,UACZz0C,SAAQ,UAAKA,EAAL,wBAGfusF,EAAYO,0BACT,cAAC,MAAD,CACI9sF,SAAQ,UAAKA,EAAL,8BAM5B,cAAC,KAAD,IACA,cAAC,IAAD,UACI,cAAC,IAAD,CACIN,SAAUirG,EAAcl8F,OAAS,EACjCvO,QAAS,WACDyqG,EAAcl8F,OAAS,GACvBooO,KAGR55O,YAAA,UAAc+C,EAAd,oBAPJ,SASK2qG,EAAcl8F,OAAS,EAAvB,iBACewjM,GACNlsI,EACM93D,EACA08F,EAAcl8F,OACpB,kBAEJ,gCAOpBm4H,IAAiB,GAgNRmwG,IA9Mc78O,sBACzB,WAEIC,GACE,IAAD,YAFCs8O,EAED,EAFCA,uCAGIprP,EAA6B00I,cAC7Bw1G,EAAgB79H,KAChBh0G,EAAU0R,YAAY3R,MACtBlM,EAASlM,EAAOkM,OAChBy/O,EAAoB7hH,GAAkC59H,GACtD0/O,EACF7lM,aAAmB4lM,GACjB5uG,EAAoBvC,KACpB6vG,EAAoBvzM,eACpBq0M,EAAoBz/G,GAAsCx/H,GAE1Ds7B,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACTmN,SAAU,GACV9iB,QAAS,KACTL,MAAOo4I,IACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GApBlB,EA8BGkkB,aAAqBC,GANrB5lC,EAxBH,EAwBGA,aACAg4B,EAzBH,EAyBGA,cACA4O,EA1BH,EA0BGA,WACAE,EA3BH,EA2BGA,YACAS,EA5BH,EA4BGA,UACAC,EA7BH,EA6BGA,UAGJrV,qBAAU,WACN63N,EAA2BhqP,KAC5B,CACCA,EACAgqP,EACA1/O,EACAm+O,EAAkBznP,OAGtB,IAAMY,EAAU5B,EAAa4B,QACvB2lP,EAAkB5uG,GAAW,OAAQ/2I,EAASglC,GAC9CyiN,EAAoB1wG,GACtB,eACA/2I,EACAglC,GA9CH,EAiDyC5U,mBAAmB,IAjD5D,mBAiDM0rF,EAjDN,KAiDqBumI,EAjDrB,OAkDqCjyN,oBAAS,GAlD9C,mBAkDM8mD,EAlDN,KAkDmBuhE,EAlDnB,KAmDK2tB,EAAYl7I,mBACd,kBAAMw7N,EAAcvkL,YAAcukL,EAAcvkL,YAAYhjD,MAAQ,KACpE,CAACunO,EAAcvkL,cAEb/iD,EAAU,oBAAGsnO,EAAcvkL,mBAAjB,aAAG,EAA2B7b,aAA9B,QAAuC,EACjDw/L,EAAmB1/E,EAAUxmJ,OAAS,EACtCmnO,EAAsBjrI,EAAcl8F,OAASwmJ,EAAUxmJ,OAiC7D2Q,qBAAU,YACD2mD,GAAe4kC,EAAcl8F,SAAWR,GAAcA,EAAa,GACpEq5H,GAAe,KAEpB,CAACvhE,EAAa93D,EAAY08F,IAE7BvrF,qBAAU,WAEF2mD,IACC7mC,kBAAQyrE,IACTA,EAAcl8F,OAASwmJ,EAAUxmJ,QAEjCyiO,EAAiBj8E,EAAUl4J,KAAI,SAAAmS,GAAI,OAAIA,EAAK3a,KAAKgH,SAEtD,CAACwqE,EAAa4kC,EAAesqD,IAEhC,IAAMshF,EAAyB7gH,KA1G9B,EA4GmCz2G,mBAChC,MA7GH,mBA4GMsoH,EA5GN,KA4GkBC,EA5GlB,OA6HyCvoH,mBAAS,IAAIhD,MA7HtD,mBA6HM+mD,GA7HN,KA6HqBqkE,GA7HrB,KAmIKpkE,GAAcn3E,uBAAY,WAC5BkrP,EAAkB,6BAEP/pP,GAFM,IAGTuB,MAAOo4I,IAAiB35I,EAAawB,OACrCA,OAAQ,KAEZ,GAEJ44I,GAAiB,IAAIprH,QACtB,CAAChvB,EAAc+pP,IAClB/rB,8BAAuD9wN,GAAK,iBAAO,CAC/D8oE,mBAGJ,IAAM4yK,GAA8B,UAChC5oP,EAAa68D,kCADmB,aAChC,EAAyCr7C,OAEvC89E,GAAc67C,EAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,gBACI,UAAA74I,EAAa0kB,gBAAb,eAAuBlD,QAASonO,GACpCxjJ,WAAYpkF,IAGhB,OACI,cAAC,KAAkB87D,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,WACbC,MAAO,eAHf,SAMI,cAAC,IAAD,CACIpZ,MAAOuhP,EAAcvkL,YACrBttD,QAASA,EACTnM,OAAQA,EACR5I,WAAY1B,EAAa0B,WACzBs2B,cAAeA,EACfuvN,gBAAiBA,EACjB8B,kBAAmBA,EACnB3rI,cAAeA,EACf5kC,YAAaA,EACbsqK,aA7Ga,SAAC90O,GACtB,IAAMu6O,EAAmBnrI,EAAcn9F,SAASjS,GAC1CovG,EAAc17F,QAAO,SAAA9jB,GAAM,OAAIA,IAAWoQ,KAC1CovG,EAAcmP,OAAOv+G,GAC3B21O,EAAiB4E,GACjBxuG,GAAe,IAyGPotG,uBAlGwB,SAACvkO,GACjC+gO,EACI/gO,GAAYylO,EAAsB3gF,EAAUl4J,KAAI,SAAAmS,GAAI,OAAIA,EAAK3a,KAAKgH,MAAM,KAiGpE8oB,YAAaijH,EACbivG,uBAAwBA,EACxB/hN,UAAWA,EACX7iB,SAAU1kB,EAAa0kB,UAAY,GACnCoiB,YAAaA,EACb9lB,WAAYA,EACZs5H,WAAYA,EACZotG,iBAAkBA,EAClB/E,mBAvEe,SAACnoK,GACnBA,GAED+/D,EADAD,IAAe9/D,EACD,KAEAA,IAmEV8kB,YAAaA,GACbiqJ,kBAAmBA,EACnB5/F,0BAjEsB,SAAC17I,GAC/Bu5B,EAAU,6BAA8Bv5B,IAiEhCjO,aAAcA,EACd8Z,cAvGW,WACnBmqO,EAAiB,IACjB5pG,GAAe,IAsGPmvG,uCACIA,EAEJzzK,cAAeA,GACfC,YAAaA,GACbgzK,aAAY,UAAEV,EAActnP,YAAhB,iBAAE,EAAoBs8D,eAAtB,aAAE,EAA6B97C,OAC3CzO,SAAS,sBCx7BhBqiB,IAAYvmB,IAAOC,IAAV,kNAGS,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkE,aACnC,SAAA8X,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAMvC0iF,IAAStnE,IAAOC,IAAV,yDAINq0B,IAAQt0B,IAAOC,IAAV,iHAGL,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5Bi1P,IAAiBr6O,IAAOC,IAAV,qMAQd,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmE,qBAG5BolG,IAA0BztF,IAAOC,IAAV,oIAQvB0tF,IAAa3tF,IAAOC,IAAV,4FAMVytF,IAAS1tF,YAAOurC,KAAPvrC,CAAH,6FAMNs6O,IAAgBt6O,IAAO0nB,KAAV,8BAEbq8E,IAAc/jG,IAAOgoB,EAAV,wGACX,SAAA9nB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAM5B0oF,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1C4nI,mBAAoB,CAChBxpI,OAAQ,kBACRg+D,SAAU,WACVolC,QAAS,OACTsF,cAAe,SACfhhC,KAAM,GAGV+hE,kBAAmB,CACfzpI,OAAQ,QAGZ08O,wBAAyB,CACrB/yG,UAAW,uBAGfE,gBAAiB,CACbn5G,QAAS,iBACT3wB,MAAO,OAGX48O,uBAAwB,CACpBv5I,QAAS,OACT17B,KAAM,EACNihC,eAAgB,gBAChBD,cAAe,OAGnBmyH,oBAAqB,CACjBnqM,QAAS,sBAGbktE,wBAAyB,CACrBl2B,KAAM,UAGVk1K,iBAAkB,CACdl1K,KAAM,c,WCnCRm1K,IAsBD,SAAC,GAkBC,IAAD,MAjBFrjP,EAiBE,EAjBFA,MACA0P,EAgBE,EAhBFA,QACAzW,EAeE,EAfFA,aACAg4B,EAcE,EAdFA,cACAuvN,EAaE,EAbFA,gBACA8B,EAYE,EAZFA,kBACAC,EAWE,EAXFA,uBACA/hN,EAUE,EAVFA,UACA7iB,EASE,EATFA,SACAoiB,EAQE,EARFA,YACA9lB,EAOE,EAPFA,WACAgoO,EAME,EANFA,aACA1uG,EAKE,EALFA,WACAqoG,EAIE,EAJFA,mBACArjJ,EAGE,EAHFA,YACAiqJ,EAEE,EAFFA,kBACA5/F,EACE,EADFA,0BAEM9sE,EAAUb,MACV37E,EAASm5B,eACThX,EAAaT,eACbs3K,EAAkBh3K,eAClBmyH,EAAapyH,eACbe,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OACxCkT,EAAqBjP,eACrB4iO,EAAkB59H,GAAatlG,GAMrCyN,qBAAU,WACFy1N,IACAvuD,EAAgB30K,GAChB8vH,OAEL,CAAC9vH,EAAUkjO,EAAiBvuD,EAAiB7kD,IAGhD,IAIM61G,IACFv1O,aAAkB,OAAC2B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAClCuS,aAAkB,OAAC4B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAGhCumE,EAAgB70C,iBAAuB,MACvCy1N,EAA+B,OACjCzpP,QADiC,IACjCA,GADiC,UACjCA,EAAc68D,kCADmB,aACjC,EAA0Cr7C,OAW9C,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAOxR,YAAU,oBAAjB,yBACA,cAAC4iG,IAAD,CAAa5iG,YAAU,qBAAvB,SACK+4O,IAAkC,OAACC,QAAD,IAACA,IAAgB,QAG5D,cAAC,KAAD,IACA,cAAC,gBAAD,CACI1pJ,YAAaA,EACbt+F,KAAI,OAAE+F,QAAF,IAAEA,OAAF,EAAEA,EAAOga,MACb0/E,SAAU/yB,MAAc48K,gBACxBr+I,qBAAqB,SACrBL,sBAAuB/uB,EAAQm6D,kBAC/Bh3C,wBAAyBnjB,EAAQotK,wBACjC1pJ,UAAW13B,EACXy3B,sBAAuB,CACnB33B,aAAcgxE,IACd/wE,UAAW7hE,EAAQA,EAAMga,MAAMS,OAAS,EACxCR,WAAYA,EACZgoD,eAAgBzhC,EAChBshC,cAAeA,EACfK,aAAa,EACb37D,OAAQ,IACRJ,UAAW0vE,EAAQk6D,oBAEvBt/H,eAAgBiN,EAChByuD,cACI9yE,EAAOi8G,MAAM96F,OAAS,EA/DhB,SAAClP,GACnBw0B,EAAY7S,EAAmB3hB,EAAOoS,EAAUvB,UA8DMvjB,EAE9CisG,kBAAmB,CACfjB,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,EAAY65C,cACnChsI,UAAW0vE,EAAQstK,iBACnBp3O,SAAU,sBAEd83F,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIy0G,eAAgBptG,EAChBstG,eAAgB,kBAAM30G,KACtBgnN,gBAAiB/hO,EACjBs5H,mBACIh+I,EAAa68D,4BACb,GAEJohF,2BACI0L,KAXhB,SAgBK,SAACz8I,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,SAAU6sF,EAAY45C,eACtBtvF,WAAYlqB,EACZ6zG,aACI7uH,EAASlD,OACTioO,EAEJ12O,SAAS,4BAM7B61D,WAAgB,OAAL7hE,QAAK,IAALA,OAAA,EAAAA,EAAOmhD,OAAP,iBACFnhD,QADE,IACFA,OADE,EACFA,EAAOmhD,MADL,YAEgB,KAAZ,OAALnhD,QAAK,IAALA,OAAA,EAAAA,EAAOmhD,OAAc,OAAS,SAElC,GACN8iD,kBAAmB,oBACnBpuD,cAAe,CACXsuD,iBAAkBruB,EAAQqtK,uBAC1B/+I,wBACItuB,EAAQsuB,wBACZF,cAAepuB,EAAQurJ,sBAG/BloI,8BAA+B,CAC3BE,sBAAsB,EACtBb,iBAAkB,CACd7sF,KAAMuqI,GACN7zI,KAAM,cACN2J,SAAU,kBAEdysF,uBAAwB,CACpBh4C,WAAY,UACZz0C,SAAU,yBAGlBm5F,eAAgB,CACZpQ,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJi6O,GAJF,IAKD90O,SAAU6sF,EAAY85C,eACtBrmI,SAAU,iBANT,2BASDC,MAAO,cACP1F,MAAO,GACJ+7O,GAXF,IAYD52O,SAAU6sF,EAAY85C,eACtBrmI,SAAU,wBAIlBwrF,UAAW,CACPK,gBAzHS,SAACirJ,GAC1B,OAAOvvG,IAAeuvG,EAAOviP,KAAKgH,IAyHlBivF,kBAAmB,SAACssJ,GAAD,MAAyB,CACxCpyO,eAAgBoyO,EAAOxpP,OACvBo7E,kBAAmB,CACfnoE,KAAgB0L,mBAEpBu8D,cAAe,SAACn4E,GAAD,OAjJL,SAACA,EAAiBlF,GAChDqrP,EAAkBrrP,EAAQkF,GAiJF24I,CACI34I,EACAymP,EAAOviP,KAAKgH,OAGxByE,SAAU,mBAEVyrF,MAAO,CACH,CACIR,UAAW,eACXkB,cAAeriB,EAAQu6D,gBACvBj5C,wBAAyB,SACrB0rJ,GADqB,OAGrB,eAAC,IAAD,WACI,cAAC99K,IAAA,EAAD,CACI/8D,KAAMsrI,IAAeuvG,EAAOviP,KAAKgH,GACjCs7C,WAAY,kBACR+4L,EACIkH,EAAOviP,KAAKgH,KAGpBmJ,eAAgBoyO,EAAOxpP,OACvB0S,SAAS,kBAEb,eAAC,IAAD,WACI,cAAC,IAAD,CACIsnC,cAAe,CACX7M,UACIq8M,EAAOviP,KAAKkmC,UAChBE,SACIm8M,EAAOviP,KAAKomC,SAChBqN,QACI8uM,EAAOviP,KAAK+zC,SAChBz6C,OAAQipP,EAAOjtL,YAEnB1pD,KAAK,KACLH,SAAS,kBAEb,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KACJu7O,EAAOviP,KAAKgH,GAEpByyD,WACI8oL,EAAOn+O,YACH,cAAC,IAAD,CAAgBsE,YAAU,mBAA1B,SACI,cAAC,IAAD,MAIZ+C,SAAS,cAbb,mBAeQ82O,EAAOviP,KAAKkmC,UAfpB,YAeiCq8M,EAAOviP,KAAKomC,oBAO7D,CACIswD,UAAW,eACXG,wBAAyB,SACrB0rJ,GADqB,OAGrB,cAAC,KAAD,CACIv3O,MAAM,sCACNi5D,SAAS,uBACT94D,WAEQ43O,GACER,EAAOn+O,YANrB,SAUI,cAAC,IAAD,UACI,cAAC,GAAD,CACIqE,MAAO85O,EAAOviP,KAAKgH,GACnBkL,QAASqwO,EAAOn+O,WAChB0tB,SAAU,SAAAlF,GACNo1N,EACIO,EAAOv7O,GACP4lB,EAAEgwB,OAAO1qC,UAGjBjM,OAAQ,GACRD,MAAO,GACP6yG,aAAc,GACd1tG,SACI43O,GACAR,EAAOn+O,WAEXqH,SAAS,sCAcnD4mI,IAAiB,GAqGR4wG,IAnGqB,WAAO,IAAD,UAChCnsP,EAA6B00I,cAC7Bw1G,EAAgB79H,KAChBh0G,EAAU0R,YAAY3R,MACtBlM,EAASlM,EAAOkM,OAChBy/O,EAAoB7hH,GAAkC59H,GACtD0/O,EAA6B7lM,aAAmB4lM,GAChD5uG,EAAoBvC,KACpB4xG,EAAsB1gH,GAAsCx/H,GAC5Dm+O,EAAoBvzM,eAEpBtP,EAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACTmN,SAAU,GACV9iB,QAAS,KACTL,MAAOo4I,IACPn4I,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAnBmB,EA6BlCkkB,aAAqBC,GANrB5lC,EAvBkC,EAuBlCA,aACAg4B,EAxBkC,EAwBlCA,cACA4O,EAzBkC,EAyBlCA,WACAE,EA1BkC,EA0BlCA,YACAS,EA3BkC,EA2BlCA,UACAC,EA5BkC,EA4BlCA,UAGJrV,qBAAU,WACN63N,EAA2BhqP,KAC5B,CAACA,EAAcgqP,EAA4BvB,EAAkBznP,OAEhE,IAAMY,EAAU5B,EAAa4B,QACvB2lP,EAAkB5uG,GAAW,OAAQ/2I,EAASglC,GAC9CyiN,EAAoB1wG,GACtB,eACA/2I,EACAglC,GAGE0iN,EAAyB7gH,KA3CO,EA6CFz2G,mBAChC,MA9CkC,mBA6C/BsoH,EA7C+B,KA6CnBC,EA7CmB,KA8DhCj7C,EAAc67C,EAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAc,UAAE74I,EAAa0kB,gBAAf,aAAE,EAAuBlD,OACvC4jF,YAAyB,OAAbkjJ,QAAa,IAAbA,GAAA,UAAAA,EAAevkL,mBAAf,eAA4B7b,QAAS,IAGrD,OACI,cAAC,KAAkB40B,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,WACbC,MAAO,sBAHf,SAMI,cAAC,IAAD,CACIpZ,MAAOuhP,EAAcvkL,YACrBttD,QAASA,EACT/U,WAAY1B,EAAa0B,WACzBs2B,cAAeA,EACfuvN,gBAAiBA,EACjB8B,kBAAmBA,EACnBC,uBAAwBA,EACxB/hN,UAAWA,EACX7iB,SAAU1kB,EAAa0kB,UAAY,GACnCoiB,YAAaA,EACb9lB,WAAU,UAAEsnO,EAAcvkL,mBAAhB,aAAE,EAA2B7b,MACvC8gM,aAAY,OAAEV,QAAF,IAAEA,GAAF,UAAEA,EAAetnP,YAAjB,iBAAE,EAAqBs8D,eAAvB,aAAE,EAA8B97C,OAC5C84H,WAAYA,EACZqoG,mBApCe,SAACnoK,GACnBA,GAED+/D,EADAD,IAAe9/D,EACD,KAEAA,IAgCV8kB,YAAaA,EACbiqJ,kBAAmBiB,EACnBxqP,aAAcA,EACd2pJ,0BA5CsB,SAAC17I,GAC/Bu5B,EAAU,6BAA8Bv5B,SCnZ1Cw8O,IAAkB57O,YAAOkxJ,GAAPlxJ,CAAH,iFACR,SAAAE,GAAK,OAAKA,EAAMkwO,cAAgB,MAAQ,SAE/C,SAAAlwO,GAAK,OACHA,EAAMkwO,eAAN,2CAEyBlwO,EAAMI,MAAM1X,YAAYM,aAFjD,yHAWFq9B,IAAYvmB,IAAOC,IAAV,8PAGG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOC,SASxC6xI,IAAOh2H,IAAOC,IAAV,0OAWJ47O,IAAc77O,IAAOC,IAAV,mOAWX67O,IAOD,SAAC,GAOC,IANH91L,EAME,EANFA,KACAoxL,EAKE,EALFA,qBACAlB,EAIE,EAJFA,aACA9F,EAGE,EAHFA,cACA0F,EAEE,EAFFA,aACAt+G,EACE,EADFA,cAEMukH,EAAiB52N,mBAKjB62N,EAAc72N,mBAMpB,OACI,eAAC,IAAD,WACI,cAAC,IAAD,CACI+wN,aAAcA,EACdtnN,YAAW,OAAEo3B,QAAF,IAAEA,OAAF,EAAEA,EAAMy1H,UACnBq6D,aAAcA,KAEhB1F,GACE,qCACI,cAAC,KAAD,IACA,cAAC,IAAD,CACIpqL,KAAMA,EACNoxL,qBAAsBA,IAE1B,cAAC,KAAD,OAGPhH,EACG,cAACyL,IAAD,UACI,cAAC,IAAD,MAGJ,eAAC,IAAD,WACI,cAAC,IAAD,CACIx9O,IAAK29O,EACLlD,oCAnCgB,WAAO,IAAD,EACtC,UAAAiD,EAAehsN,eAAf,SAAwBo3C,iBAsCZ,cAAC,IAAD,CACI9oE,IAAK09O,EACLpB,uCApCmB,WAAO,IAAD,EACzC,UAAAqB,EAAYjsN,eAAZ,SAAqBo3C,cACrBqwD,EAAcxxE,EAAMvmD,cA2Gbw8O,IA/D0C,SAAC,GAGnD,IAAD,MAFF1qF,EAEE,EAFFA,UACAC,EACE,EADFA,eAEM55I,EAAUW,cACV2jO,EAAYtgI,KAEZugI,EAAgBD,GAAaA,EAAU/pP,KACvCiqP,EAAYpiH,KACZxC,EAAgBc,KAChB/oI,EAGF00I,cACExoI,EAASlM,EAAOkM,OAGhB20O,GAFc,OAAGx4N,QAAH,IAAGA,GAAH,UAAGA,EAASE,gBAAZ,iBAAG,EAAmBhW,aAAtB,iBAAG,EAA0B3P,YAA7B,aAAG,EAAgCi+O,gBAGhC+L,GAAiBA,EAAcjmG,YAAc,EAC9DmmG,EAAiBhiH,GAAyB5+H,GAE1C6gP,EAAe,WACjB1kO,EAAQq0G,UAoBZ,OAjBA3oG,qBAAU,WACF/zB,EAAOkM,QACP+7H,EAAczhH,OAAOxmB,EAAOkM,WAEjC,CAAC+7H,EAAejoI,EAAOkM,SAE1B6nB,qBAAU,WACN,OAAO,WACH84N,IAGAriM,aAAehR,KAAcE,OAC7B8Q,aAAehR,KAAcG,OAC7B6Q,aAAehR,KAAcC,UAElC,CAACozM,IAGA,cAAC,KAAkBnuK,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,YAAlD,SACI,cAACuqO,IAAD,CACIxL,cAAeA,EACf7+E,UAAWA,EACXC,eAAgBA,EAChBG,kBAAmB2qF,EAJvB,SAMI,cAAC,IAAD,CACIt2L,KAAMm2L,EACN/E,qBAAsBiF,EACtBnG,aAAcoG,EACdlM,cAAeA,EACf0F,aAAcoG,EAAUpG,aACxBt+G,cAAeA,SCxMtBokH,IAAkB57O,YAAOkxJ,GAAPlxJ,CAAH,oQAcfumB,IAAYvmB,IAAOC,IAAV,4QAYTq0B,IAAQt0B,IAAOC,IAAV,yMAULs8O,IAAgBv8O,IAAOC,IAAV,8EAKbu8O,IAAYx8O,YAAOokB,KAAPpkB,CAAH,gMAIR,SAAAE,GAAK,OAAIA,EAAMN,MAAQ,OAAS,gCAG5B,SAAAM,GAAK,OAAIA,EAAMN,MAAQ,OAAS,gCAIrC68O,IAAkBz8O,IAAOC,IAAV,4GAMfy8O,IAAkB18O,IAAOC,IAAV,kDCOb08O,QAxDf,YASyB,IARrBprF,EAQoB,EARpBA,UACAC,EAOoB,EAPpBA,eACA/9J,EAMoB,EANpBA,KACA8rG,EAKoB,EALpBA,aACAqjD,EAIoB,EAJpBA,SACAg6F,EAGoB,EAHpBA,aACA9uM,EAEoB,EAFpBA,SACA1lB,EACoB,EADpBA,OAEA,OACI,cAAC,IAAD,CACImpI,UAAWA,EACXC,eAAgBA,EAFpB,SAII,eAAC,IAAD,WACI,cAAC,IAAD,CAAOrwJ,YAAU,yBAAjB,6BACA,cAAC,KAAD,IACA,cAACo7O,IAAD,UACI,cAACC,IAAD,CACI99O,OAAO,OACPgnB,UAAW,GACXukC,YAAY,YACZnkC,aAAc,SAACm0B,GAAD,OACV2iM,EAAa3iM,EAAM5E,OAAOxvC,QAE9BA,MAAOpS,EACPyQ,SAAS,mBACTtE,MAAOgjJ,MAGf,cAAC,KAAD,IACA,eAAC65F,IAAD,WACI,cAAC,IAAD,CACIh5O,MAAM,SACN5C,QAAQ,UACRpC,MAAM,QACNhE,OAAQqzC,EACR5pC,SAAS,uBAEb,cAACw4O,IAAD,IACA,cAAC,IAAD,CACIj5O,MAAO,SACPhF,MAAM,QACNsF,QAASw7F,EACT37F,SAAiC,IAAvBnQ,EAAK6lC,OAAO3mB,OACtBlY,OAAQ2tB,EACRlkB,SAAS,8BCsBlB24O,I,oMClBHC,IC9DGD,IFUf,YAG6B,IAFzBtrF,EAEwB,EAFxBA,UACAC,EACwB,EADxBA,eACwB,EACAruI,mBAAS,IADT,mBACjB1vB,EADiB,KACXkkH,EADW,OAEgBx0F,oBAAS,GAFzB,mBAEjBo8E,EAFiB,KAEHsK,EAFG,OAGQ1mF,oBAAS,GAHjB,mBAGjBy/H,EAHiB,KAGPk0F,EAHO,KAIlBl/N,EAAUW,cACVo5N,EAAgBz3G,KAChBy1G,EAAwBn1G,KAC9BlxF,YAAiB,mBAQjB,IAUO4sM,EAAelmP,uBAClB,kBAAM4nB,EAAQq0G,WACd,CAACr0G,IA4BL,OAAO,cAAC,IAAD,CACH25I,UAAWA,EACXC,eAAgBA,EAChB/9J,KAAMA,EACN8rG,aAAcA,EACdqjD,SAAUA,EACVg6F,aA9CqB,SAAC/2O,GACtB8xG,EAAQ9xG,GACRixO,GAAY,IA6CZhpM,SAAUooM,EACV9tN,OA3Be,WACfyhF,GAAgB,GAChB8nI,EAAcl+O,GACT63B,MAAK,SAAC06B,GACHvkD,WAAWkuO,EAAuB,KAClCl3N,YACIb,EACAruB,IAAOyD,YAAYI,YAAYuC,QAAQ,UAAWq2D,EAAKvmD,GAAG7P,YAC1D,CAAEwgP,eAAe,OAGxB5kN,OAAM,WACHmB,QAAQo7B,UAAUz8B,MAAK,WACnBu+E,GAAgB,GAChBitI,GAAY,aG9D1BvwN,IAAYvmB,IAAOC,IAAV,iRAOS,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YASrCm4P,IAJ8B,SAAC,GAA6B,IAA3Br5O,EAA0B,EAA1BA,SAAUpF,EAAgB,EAAhBA,UACtD,OAAO,cAAC,IAAD,CAAWA,UAAWA,EAAtB,SAAkCoF,KCbvC6iB,IAAYvmB,IAAOC,IAAV,wHAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOgB,QAQ1B83P,IAJsD,SAAC,GAAuC,IAArCt5O,EAAoC,EAApCA,SAAUpF,EAA0B,EAA1BA,UAAW4F,EAAe,EAAfA,SACzF,OAAO,cAAC,IAAD,CAAW5F,UAAWA,EAAW6C,YAAW+C,EAA5C,SAAuDR,KCR5D6iB,IAAYvmB,IAAOC,IAAV,sJAYAg9O,IAJkC,SAAC,GAA6B,IAA3Bv5O,EAA0B,EAA1BA,SAAUpF,EAAgB,EAAhBA,UAC1D,OAAO,cAAC,IAAD,CAAWA,UAAWA,EAAtB,SAAkCoF,KCLvCw5O,IAAiBl9O,YAAO+8O,IAAP/8O,CAAH,iFAKdm9O,IAAan9O,IAAOC,IAAV,oIAOVm9O,IAAUp9O,IAAO0nB,KAAV,8GAIP,gBAAE0b,EAAF,EAAEA,QAAS9iC,EAAX,EAAWA,MAAX,OAAsB8iC,GAAO,iBAAc9iC,EAAMpc,OAAOQ,eAGxD24P,IAAYr9O,IAAO0nB,KAAV,mGAMTg+E,IAAc1lG,IAAO0nB,KAAV,uFAEJ,qBAAGpnB,MAAkBpc,OAAOO,aAInC64P,IAAyBt9O,YAAOk9O,IAAPl9O,CAAH,yLAUtBu9O,IAAoBv9O,YAAOk9O,IAAPl9O,CAAH,sJASjBw9O,IAAsBx9O,YAAOi9O,IAAPj9O,CAAH,sHAMnBy9O,IAAiBz9O,IAAOC,IAAV,oGAoELy9O,IA1DV,SAAC,GAA4C,IAA1C7+G,EAAyC,EAAzCA,WAAyC,EAA7Bmd,UAA6B,EAAlBpL,YAE3B,OACI,eAACssG,IAAD,aACOr+G,EAAW9oI,WAAWyuL,eACrB,qCACI,eAAC84D,IAAD,WACI,cAAC,IAAD,CAAep5O,SAAS,uBAAxB,4BACA,cAAC,IAAD,UACI,eAACi5O,IAAD,WACOt+G,EAAWgd,gBACV,eAACuhG,IAAD,CAASj8O,YAAU,8BAAnB,UACKsR,KAAKqpI,MAC2B,IAA7Bjd,EAAWgd,iBAEf,cAACwhG,IAAD,mBAGJ,cAACD,IAAD,CAASh6M,SAAS,EAAMjiC,YAAU,yBAAlC,oBAEJ,cAAC,IAAD,CAAaA,YAAU,wBAAvB,6BAIZ,cAACs8O,IAAD,OAGR,eAACF,IAAD,WACI,cAAC,IAAD,CAAer5O,SAAS,iBAAxB,sBACA,eAACs5O,IAAD,aACO3+G,EAAW9oI,WAAWyuL,eACrB,eAAC24D,IAAD,WACI,eAACC,IAAD,CAASj8O,YAAU,oBAAnB,UACI,sBAAMA,YAAU,wBAAhB,SAAyC09H,EAAW8+G,sBACpD,eAACN,IAAD,WACK,IADL,MACY,sBAAMl8O,YAAU,uBAAhB,SAAwC09H,EAAW9oI,WAAWyuL,sBAG9E,cAAC,IAAD,CAAarjL,YAAU,0BAAvB,4BAGL09H,EAAW9oI,WAAW0uL,gBACrB,eAAC04D,IAAD,WACI,eAACC,IAAD,CAASj8O,YAAU,qBAAnB,UACI,sBAAMA,YAAU,yBAAhB,SAA0C09H,EAAW++G,uBACrD,eAACP,IAAD,WACK,IADL,MACY,sBAAMl8O,YAAU,wBAAhB,SAAyC09H,EAAW9oI,WAAW0uL,uBAG/E,cAAC,IAAD,CAAatjL,YAAU,2BAAvB,qCC1Fb08O,IA7BYz/O,sBACvB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIF,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,4BACI,sBACIC,EAAE,8SACF4zB,UAAU,wECjBxC5M,IAAYvmB,IAAOC,IAAV,4JAQTuwD,IAAOxwD,IAAOC,IAAV,kNACG,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cAUnCksE,IAAgB5wD,IAAOC,IAAV,mFACN,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOQ,cACnC,qBAAGo5P,YACD,qEA4BOC,IAfV,SAAC,GAAuD,EAArDr6O,SAAsD,IAA5CpF,EAA2C,EAA3CA,UAAW0/O,EAAgC,EAAhCA,UAAWn6O,EAAqB,EAArBA,KAAMK,EAAe,EAAfA,SAC1C,OACI,eAAC,IAAD,CAAW5F,UAAWA,EAAtB,UACI,cAAC,IAAD,CAAew/O,aAAcj6O,EAAM1C,YAAW+C,GAAQ,UAAOA,EAAP,SAAtD,gBACKL,QADL,IACKA,IAAQ,cAAC,IAAD,MAEZm6O,EACG,cAAC,IAAD,CAAM78O,YAAW+C,GAAQ,UAAOA,EAAP,SAAzB,SAAkD85O,IAElD,cAAC,IAAD,CAAM78O,YAAW+C,GAAQ,UAAOA,EAAP,SAAzB,sC,uDC7CVqiB,IAAYvmB,IAAOC,IAAV,yYAUJ,SAAAC,GAAK,OAAIA,EAAMsmE,OACd,SAAAtmE,GAAK,OAAIA,EAAM4gD,QAMrB0P,IAAOxwD,IAAOC,IAAV,sJAQJkgB,IAAOngB,IAAOC,IAAV,sGA0BKg+O,IAdV,SAAC,GAAmD,IAAjD1jP,EAAgD,EAAhDA,KAAM0lB,EAA0C,EAA1CA,KAAMi+N,EAAoC,EAApCA,UAAW/5O,EAAyB,EAAzBA,MAAOg6O,EAAkB,EAAlBA,YAClC,OAAKD,EAAUr/O,GAAMq/O,EAAUp/O,EAI3B,eAAC,IAAD,CAAW0nE,IAAK03K,EAAUp/O,EAAGgiD,KAAMo9L,EAAUr/O,EAA7C,UACI,eAAC,IAAD,WACK4T,KAAK87H,MAAMx4H,OAAOxb,IADvB,IACiD,IAAjBwb,OAAOxb,IAAc4jP,GAAuBh6O,KAE5E,cAAC,IAAD,UAAO8b,OAPJ,yBC5BTsG,IAAYvmB,IAAOC,IAAV,0lBAaE,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YAG7B,SAAAsb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOU,YA6R7Bw5P,IA9PV,SAAC,GAAmD,IAAjDjsP,EAAgD,EAAhDA,KAAM6Q,EAA0C,EAA1CA,MAAOS,EAAmC,EAAnCA,MAAO46O,EAA4B,EAA5BA,YAAan6O,EAAe,EAAfA,SAC/Bo6O,EAAen5N,iBAAuB,MADQ,EAEhBhC,mBAAS,CACzC1kB,MAAO,IACPC,OAAQ,IACRwuE,OAAQ,KALwC,mBAE7CqxK,EAF6C,KAEjCC,EAFiC,KAQ9CngP,EAAM8mB,iBAAsB,MARkB,EASlBhC,mBAKxB,MAd0C,mBAS7CwlJ,EAT6C,KASlC81E,EATkC,OAedt7N,oBAAS,GAfK,mBAe7Cu7N,EAf6C,KAehCC,EAfgC,OAgBJx7N,mBAG7C,CACCtkB,EAAG,KACHC,EAAG,OArB6C,mBAgB7C8/O,EAhB6C,KAgB3BC,EAhB2B,OAuBR17N,mBAAS,CACjD27N,OAAQ,GACRvkP,KAAM,KAzB0C,mBAuB7CwkP,EAvB6C,KAuB7BC,EAvB6B,KA4B9Cj0L,EAAe/6D,uBAAY,WACzBsuP,EAAavuN,SACbyuN,EAAc,6BACPD,GADM,IAET9/O,MAAO6/O,EAAavuN,QAAQkvN,YAAc,QAGnD,CAACT,EAAeD,IAuMnB,OArMAj7N,qBAAU,WACN,GAAKg7N,EAAavuN,QAIlB,OADA4Q,OAAO6Z,iBAAiB,SAAUuQ,GAC3B,kBAAMpqB,OAAOga,oBAAoB,SAAUoQ,MACnD,CAACA,EAAcwzL,IAElBj7N,qBAAU,WACFg7N,EAAavuN,SACbyuN,EAAc,CACV9/O,OAAQ,IACRwuE,OAAQ,GACRzuE,MAAO6/O,EAAavuN,QAAQkvN,YAAc,OAGnD,CAACT,IAEJl7N,qBAAU,WACN,GAAKqlJ,GAAcx2K,GAASA,EAAKwgB,OAE1B,CACH,IAAM9T,EAAIqgP,gBACLxiM,OAAOvqD,EAAK8O,KAAI,SAAA1B,GAAC,OAAIA,EAAE0gB,SACvB2+I,MAAM,CAAC,GAAI2/E,EAAW9/O,MAAQ,KAE7B0gP,EAAqBjiM,cAAI/qD,GAAM,SAAAoN,GAAC,OAAIwW,OAAOxW,EAAEsG,WAAY,EACzDu5O,EAAYD,EAAqB,EAAI,EAAIA,EAEzCrgP,EAAIugP,gBACL3iM,OAAO,CAAC,EAAG0iM,IACXxgF,MAAM,CAAC2/E,EAAW7/O,OAAS6/O,EAAWrxK,OAAQ,IAE7CoyK,EAAQC,cAAW1gP,GACpB2gP,WAAW,IACXC,YAAW,SAAAlgP,GAAC,OAAIA,KAChBmgP,cAAc,GAEbC,EAAQC,cAAS9gP,GAClB0gP,WAAW,CAAC,EAAGJ,EAAY,EAAGA,IAC9BM,cAAc,GAEnB/2E,EAAU9zK,UAAU,KAAKynD,SAEzB,IAAMujM,EAAMl3E,EACPlD,OAAO,KACPq6E,KACG,YAHI,oBAISvB,EAAWrxK,OAJpB,aAI+BqxK,EAAWrxK,OAAS,GAJnD,MAYN6yK,EANQF,EACTp6E,OAAO,KACPq6E,KAAK,QAAS,iBACdjrP,UAAU,QACV1C,KAAKA,GAES+hI,QAAQuxC,OAAO,KAElCs6E,EAAKt6E,OAAO,QACPq6E,KAAK,QAAS,GACdA,KAAK,SAAU,GACfA,KAAK,WAAW,SAAAvgP,GACb,OAAIuiB,aAAQviB,EAAE0gB,MACH,QAEA,UAGd6/N,KAAK,OAAQ98O,GACb88O,KAAK,KAAK,SAACvgP,EAAG2B,GACX,OAAI/O,EAAKwgB,OAAS,EACP9T,EAAEU,EAAE0gB,MAASphB,EAAEmhP,YAAc,EAAIC,EAEzB,GAAR/+O,EAAa,MAG3B4+O,KAAK,KAAK,SAAUvgP,GACjB,OAAOA,EAAEsG,MAAQ/G,EAAES,EAAEsG,OAAS/G,EAAE,GAAK,KAG7CihP,EAAKt6E,OAAO,UACPq6E,KAAK,OAAQ98O,GACb88O,KAAK,WAAW,SAAAvgP,GACb,OAAIuiB,aAAQviB,EAAE0gB,MACH,QAEA,UAGd6/N,KAAK,SAAU,QACfA,KAAK,SAAU,WACfA,KAAK,UAAW,OAChBA,KAAK,MAAM,SAACvgP,EAAG2B,GACZ,OAAI/O,EAAKwgB,OAAS,EAEV9T,EAAEU,EAAE0gB,MAASphB,EAAEmhP,YAAc,EAAIC,EAAgB,EAGtC,GAAR/+O,EAAa,GAAK,KAGhC4+O,KAAK,MAAM,SAAAvgP,GACR,OAAOA,EAAEsG,MACH/G,EAAES,EAAEsG,OACJ04O,EAAW7/O,OAAS6/O,EAAWrxK,UAExC4yK,KAAK,IAAK,GAEfC,EAAKt6E,OAAO,QACPq6E,KAAK,SAAU,WACfA,KAAK,QA3JJ,GA4JDA,KAAK,UAAU,SAAAvgP,GAAC,MACM,kBAAZA,EAAEsG,OAAsBtG,EAAEsG,MAAQ,EACnC04O,EAAW7/O,OAAS6/O,EAAWrxK,OAASpuE,EAAES,EAAEsG,OAC5C,KAETi6O,KAAK,KAAK,SAACvgP,EAAG2B,GACX,OAAI/O,EAAKwgB,OAAS,EACP9T,EAAEU,EAAE0gB,MAASphB,EAAEmhP,YAAc,EAAIC,EAEzB,GAAR/+O,EAAa,MAG3B4+O,KAAK,KAAK,SAAAvgP,GACP,MAAuB,kBAAZA,EAAEsG,OAAsBtG,EAAEsG,MAAQ,EAClC/G,EAAES,EAAEsG,OAEJ04O,EAAW7/O,OAAS6/O,EAAWrxK,OAAS,KAGtD4yK,KAAK,OAAQ98O,GACb88O,KAAK,WAAW,SAAAvgP,GACb,OAAIuiB,aAAQviB,EAAE0gB,MACH,GAEA,KAGdigO,GAAG,aAAa,SAAC76N,EAAGlzB,GACjBwsP,GAAe,GACfE,EAAoB,CAChBhgP,EAAGwmB,EAAE+rJ,QAAU,GACftyK,EAAGumB,EAAE86N,QAAU,KAEnBnB,EAAkB,CACdF,OAAO,GAAD,OAAK3sP,EAAK0T,OAAS,GACzBtL,KAAMpI,EAAK8tB,UAGlBigO,GAAG,YAAY,WACZvB,GAAe,GACfE,EAAoB,CAAEhgP,EAAG,KAAMC,EAAG,UAG1CihP,EAAKt6E,OAAO,QACPq6E,KAAK,QAAS,gBACdA,KAAK,OAAQ77P,IAAUC,OAAOO,WAC9Bq7P,KAAK,cAAe,UACpBA,KAAK,QAASjhP,EAAEmhP,aAChBF,KAAK,KAAK,SAACvgP,EAAG2B,GACX,OAAI/O,EAAKwgB,OAAS,EACP9T,EAAEU,EAAE0gB,MAASphB,EAAEmhP,YAAc,EAAIC,EAEzB,GAAR/+O,EAAa,MAG3B4+O,KAAK,KAAK,WACP,OAAOvB,EAAW7/O,OAAS6/O,EAAWrxK,OAAS,MAElD3yE,MAAK,SAACgF,EAAG2B,GACN,OAAc,IAAVA,GAAeA,IAAU/O,EAAKwgB,OAAS,EAChC8P,aAAgBljB,EAAE0gB,MAElB,MAInB4/N,EAAIp6E,OAAO,KACNq6E,KACG,YAFR,uBAGwBvB,EAAW7/O,OAAS6/O,EAAWrxK,OAHvD,MAKKkzK,KAAKd,GAEVO,EAAIp6E,OAAO,QACNq6E,KAAK,QAAS,iBACdA,KAAK,SAAU,OACfA,KAAK,QAASvB,EAAW9/O,OACzBqhP,KACG,YALR,uBAMwBvB,EAAW7/O,OAAS6/O,EAAWrxK,OANvD,MASA2yK,EAAIp6E,OAAO,KAAK26E,KAAKT,QA7KrBlB,EAAapgP,EAAI0xB,SAAW7G,cAAO7qB,EAAI0xB,YA+K5C,CAAC44I,EAAWx2K,EAAMosP,EAAYv7O,IAG7B,eAAC,IAAD,CAAW3E,IAAKigP,EAAcn9O,YAAW+C,EAAzC,UACI,qBACI7F,IAAKA,EACLI,MAAO8/O,EAAW9/O,MAAQ8/O,EAAWrxK,OAAS,GAC9CxuE,OAAQ6/O,EAAW7/O,OAAS6/O,EAAWrxK,SAE1CwxK,GACG,cAAC,IAAD,CACInkP,KAAMwkP,EAAeD,OACrB7+N,KAAMwC,aAAgBs8N,EAAexkP,MACrC2jP,UAAWU,EACXz6O,MAAOV,GAAS,GAChB06O,YAAaE,QCjT3B93N,IAAYvmB,IAAOC,IAAV,yFAYAogP,IAPoC,SAAC,GAG7C,IAFH38O,EAEE,EAFFA,SACApF,EACE,EADFA,UAEA,OAAO,cAAC,IAAD,CAAWA,UAAWA,EAAtB,SAAkCoF,KCTvC6iB,IAAYvmB,IAAOC,IAAV,wHAGF,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAI5B67P,IAA2BtgP,IAAOC,IAAV,sHAIxB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAgB1Bm7P,KAbyBvgP,IAAOC,IAAV,8FAGxB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGe,SAAC,GAGlD,IAFHif,EAEE,EAFFA,SACApF,EACE,EADFA,UAEA,OAAO,cAAC,IAAD,CAAWA,UAAWA,EAAtB,SAAkCoF,MCS9B88O,IAjCmBpiP,sBAC9B,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,sBACIE,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNN,IAAKA,EACLC,UAAWA,EANf,UAQI,oBAAGixD,YAAU,UAAUlwD,KAAK,UAA5B,UACI,sBAAMR,EAAE,MAAMC,EAAE,SAASL,MAAM,IAAIC,OAAO,QAAQmxK,GAAG,MACrD,sBAAMhxK,EAAE,MAAMC,EAAE,IAAIL,MAAM,IAAIC,OAAO,KAAKmxK,GAAG,MAC7C,sBAAMhxK,EAAE,OAAOC,EAAE,KAAKL,MAAM,IAAIC,OAAO,KAAKmxK,GAAG,MAC/C,sBAAMhxK,EAAE,OAAOC,EAAE,KAAKL,MAAM,IAAIC,OAAO,KAAKmxK,GAAG,MAC/C,sBAAMhxK,EAAE,OAAOC,EAAE,IAAIL,MAAM,IAAIC,OAAO,KAAKmxK,GAAG,MAC9C,sBAAMtwK,EAAE,uBAEZ,+BACI,0BAAUE,GAAG,IAAb,SACI,sBACIJ,KAAK,OACL8zB,UAAU,gBACV5zB,EAAE,4BCZxB29O,IAAiBl9O,YAAO+8O,IAAP/8O,CAAH,2GAWdygP,IAAiCzgP,YAAOsgP,IAAPtgP,CAAH,sDAI9B0gP,IAAiC1gP,IAAO0nB,KAAV,0DA0CrBi5N,IAnCV,SAAC,GAAyB,IAAvBxuP,EAAsB,EAAtBA,KAAMyuP,EAAgB,EAAhBA,UACV,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAe18O,SAAS,mBAAxB,wBACC6R,OAAO6qO,GAAa,GACjB,cAAC,IAAD,UACI,eAACH,IAAD,CAAgCt/O,YAAU,mBAA1C,UACKktI,GAAmBuyG,GAAY,IAChC,cAACF,IAAD,+BAOhB,cAAC,IAAD,WACS,OAAJvuP,QAAI,IAAJA,OAAA,EAAAA,EAAMwgB,QACH,cAAC,IAAD,CACIxgB,KAAMA,EACN6Q,MAAO/e,IAAUC,OAAOI,YACxBmf,MAAO,MACPS,SAAS,qBAEb,cAAC,IAAD,CACIL,KAAM,cAAC,IAAD,IACNm6O,UAAU,wDACV95O,SAAS,2BCvClB28O,IAtBcziP,sBACzB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIE,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNN,IAAKA,EACLC,UAAWA,EANf,SAQI,sBACIgB,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,ivBACFF,KAAK,iBCOVyhP,IAtBc1iP,sBACzB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIE,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNN,IAAKA,EACLC,UAAWA,EANf,SAQI,sBACIgB,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,uWACFF,KAAK,iBCOV0hP,IAtBS3iP,sBACpB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAA6B,EAAlBC,OACV,OACI,qBACIE,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNN,IAAKA,EACLC,UAAWA,EANf,SAQI,sBACIgB,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,yIACFF,KAAK,iBCdZ2hP,IAAgBhhP,IAAOC,IAAV,sMAQbghP,IAAqBjhP,IAAOC,IAAV,2MAOrB,SAAAC,GAAK,OAAKA,EAAM0D,UAAP,qBAINs9O,IAAWlhP,IAAO0nB,KAAV,oFAKRy5N,IAAwBnhP,IAAOC,IAAV,6HAOrBmhP,IAAgBphP,IAAOC,IAAV,kIAObohP,IAAYrhP,IAAO0nB,KAAV,gHAMT45N,IAAathP,IAAO0nB,KAAV,oGAMV65N,IAAkBvhP,YAAOshP,IAAPthP,CAAH,qDAIfwhP,IAAiBxhP,YAAOshP,IAAPthP,CAAH,iEAIdyhP,IAAiBzhP,YAAOshP,IAAPthP,CAAH,8DAId0hP,IAAgB1hP,IAAOC,IAAV,2MAUb0hP,IAAkB3hP,IAAO0nB,KAAV,qHAGf,qBAAGilJ,MAAqB,mBAAqB,0BACvC,qBAAGA,MAAqB,OAAH,WAG3Bi1E,IAAsB5hP,IAAO0nB,KAAV,6EAKnBm6N,IAAkB7hP,IAAO0nB,KAAV,2GAMfo6N,IAAc9hP,IAAO0nB,KAAV,sDAIXq6N,IAAe/hP,IAAO0nB,KAAV,mIAOZs6N,IAAsBhiP,IAAOC,IAAV,6HAOnBgiP,IAAajiP,IAAOC,IAAV,iPAWViiP,IAAaliP,IAAOC,IAAV,sGAMV+jB,IAAiBhkB,IAAOC,IAAV,oNAUd4iF,IAAY7iF,YAAOgzD,KAAPhzD,CAAH,8EAGhB,SAAAE,GAAK,OAAIA,EAAM0D,UAAN,qBAGFu+O,IAAiBniP,YAAO+gP,IAAP/gP,CAAH,mDC5HZoiP,IAlBahkP,sBACxB,WAAyCC,GAAS,IAA/CC,EAA8C,EAA9CA,UAA8C,IAAnCG,aAAmC,MAA3B,GAA2B,MAAvBC,cAAuB,MAAd,GAAc,EAC7C,OACI,qBACIL,IAAKA,EACLI,MAAOA,EACPC,OAAQA,EACRF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,sBAAMW,EAAE,mMAAmMF,KAAK,sBCQjNgjP,IApBOjkP,sBAClB,WAAyCC,GAAS,IAA/CC,EAA8C,EAA9CA,UAA8C,IAAnCG,aAAmC,MAA3B,GAA2B,MAAvBC,cAAuB,MAAd,GAAc,EAC7C,OACI,sBACIL,IAAKA,EACLI,MAAOA,EACPC,OAAQA,EACRF,QAAQ,YACRF,UAAWA,EACXe,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,sBAAMW,EAAE,qRAAqRF,KAAK,iBAClS,sBAAME,EAAE,kBAAkB0zB,OAAO,UAAU+wE,eAAa,IAAIgf,iBAAe,gBCoBrFs/H,IAID,SAAC,GAAwD,IAAD,MAArDC,EAAqD,EAArDA,mBAAoBC,EAAiC,EAAjCA,SAAUC,EAAuB,EAAvBA,iBAC5B5tC,EAAU,UAAG0tC,EAAmBzjH,SAAS+2E,mBAA/B,aAAG,EAAyCt3K,MACxD,SAAA4mI,GAAC,OAAIA,EAAE65C,SAAS0jC,eAAiB79O,KAAaK,iBAE5Cy9O,IAAWJ,EAAmBzjH,SAAS8R,YACvCgyG,GAAcD,GAAUJ,EAAmBzjH,SAAS+jH,UAAY,EAChEC,GAAcP,EAAmBzjH,SAAS+jH,UAEhD,OACI,eAAC5B,IAAD,CACIr9O,UAAWixM,EACXzwM,QAAS,kBAAMo+O,EAAQ,OAAC3tC,QAAD,IAACA,OAAD,EAACA,EAAYp1M,KACpC0B,YAAU,gBAHd,UAKI,eAACggP,IAAD,WACI,qBAAKhgP,YAAU,qBAAf,SACI,cAAC,IAAD,MAEJ,eAACigP,IAAD,WACI,cAACF,IAAD,CAAU//O,YAAU,qBAApB,sBACA,cAACkgP,IAAD,CAAWlgP,YAAU,sBAArB,SAA4CohP,EAAmB5hP,QAAQwD,QACtEw+O,GACG,eAACpB,IAAD,CAAiBpgP,YAAU,uBAA3B,UACI,cAACghP,IAAD,IADJ,aACiC,KAClB,OAAVttC,QAAU,IAAVA,OAAA,EAAAA,EAAY74D,YAAZ,aACSl7H,aACF,IAAIX,KAAJ,iBAAS00L,QAAT,IAASA,OAAT,EAASA,EAAY74D,iBAArB,QAAkC,SAIjD4mG,GAAc,cAACpB,IAAD,CAAgBrgP,YAAU,uBAA1B,yBACd2hP,GAAc,cAACrB,IAAD,CAAgBtgP,YAAU,uBAA1B,+BAGvB,eAACugP,IAAD,WACI,cAACG,IAAD,CAAiB1gP,YAAU,qBAA3B,kBACA,eAACwgP,IAAD,CAAiBxgP,YAAU,sBAA3B,UACI,sBAAMA,YAAU,sBAAhB,SAAuCohP,EAAmBzjH,SAAS+jH,YACnE,eAACjB,IAAD,WACK,IADL,MACY,sBAAMzgP,YAAU,4BAAhB,SAA6CohP,EAAmB5hP,QAAQ0jL,qBAGvFk+D,EAAmBzjH,SAAS+jH,UAAY,GAAK,cAACd,IAAD,CAAc5gP,YAAU,yBAAyBiD,QAAS,SAACihB,GACrGA,EAAEC,kBACFm9N,EAAiBF,EAAmB5hP,QAAQtK,aAFF,uBAKlD,cAAC2rP,IAAD,aACM,OAACntC,QAAD,IAACA,OAAD,EAACA,EAAYmK,WACX,cAACijC,IAAD,CAAY9gP,YAAU,wBAAtB,SACI,cAAC+gP,IAAD,CAAY/gP,YAAU,6BAAtB,SACK0zM,EAAWxoK,SAAW,cAAC,IAAD,IAAmB,cAAC,IAAD,CAAQ5tC,MAAO,GAAIC,OAAQ,WAKrF,eAACgjP,IAAD,WACI,cAACG,IAAD,CAAiB1gP,YAAU,8BAA3B,2BACA,cAACwgP,IAAD,CAAiBh1E,QAAO,OAACkoC,QAAD,IAACA,OAAD,EAACA,EAAYmK,UAAU79M,YAAU,0BAAzD,UACM,OAAC0zM,QAAD,IAACA,OAAD,EAACA,EAAYmK,UACX,qCACKvsM,KAAKqpI,MAAqC,IAA/B+4D,EAAWmK,SAASA,UADpC,eAEU,OAACnK,QAAD,IAACA,OAAD,EAACA,EAAYmK,WACf,+CACKujC,EAAmBzjH,SAASikH,kBADjC,QAC+C,EAC3C,eAACjB,IAAD,CAAa3gP,YAAU,kCAAvB,UACK,IAC2C,IAA3CohP,EAAmBzjH,SAASikH,WACvB,UACA,oBAMtB,mCAAG,gBAIf,cAAC,IAAD,CAAgB5hP,YAAU,yBAA1B,SACI,cAAC0hF,IAAD,CAAWj/E,UAAWixM,UAMhCmuC,IAGD,SAAC,GAAsC,IAAD,EAAnCT,EAAmC,EAAnCA,mBAAoBC,EAAe,EAAfA,SAClB3tC,EAAa0tC,EAAmBzjH,SAAS+1E,WACzCouC,EAAqC,YAAb,OAAVpuC,QAAU,IAAVA,OAAA,EAAAA,EAAY9iN,QAEhC,OACI,eAACkvP,IAAD,CACIr9O,UAAWq/O,EACX7+O,QAAS,kBAAM6+O,GAAeT,EAAQ,OAAC3tC,QAAD,IAACA,OAAD,EAACA,EAAYp1M,KACnD0B,YAAU,iBAHd,UAKI,eAACggP,IAAD,WACI,qBAAKhgP,YAAU,sBAAf,SACI,cAAC,IAAD,MAEJ,eAACigP,IAAD,WACI,cAACF,IAAD,CAAU//O,YAAU,sBAApB,uBACA,cAACkgP,IAAD,CAAWlgP,YAAU,uBAArB,SAA6CohP,EAAmB5hP,QAAQwD,SAC7D,OAAV0wM,QAAU,IAAVA,OAAA,EAAAA,EAAY2C,aACT,eAAC+pC,IAAD,CAAiBpgP,YAAU,wBAA3B,UACI,cAACghP,IAAD,IADJ,eACmC,IAC9BrhO,aAAa,IAAIX,KAAJ,OAAS00L,QAAT,IAASA,OAAT,EAASA,EAAY2C,gBAG1CyrC,IAAgBpuC,EAAY2C,YACzB,cAACiqC,IAAD,CAAgBtgP,YAAU,wBAA1B,2BAEF8hP,GACE,cAACxB,IAAD,CAAgBtgP,YAAU,wBAA1B,iCAIZ,cAACugP,IAAD,IACA,cAACM,IAAD,aACQntC,IAAcouC,IACd,cAAChB,IAAD,CAAY9gP,YAAU,wBAAtB,SACI,cAAC+gP,IAAD,CAAY/gP,YAAU,6BAAtB,SACK0zM,EAAWxoK,SAAW,cAAC,IAAD,IAAmB,cAAC,IAAD,CAAQ5tC,MAAO,GAAIC,OAAQ,WAKrF,eAACgjP,IAAD,WACI,cAACG,IAAD,CAAiB1gP,YAAU,uBAA3B,mBACA,cAACwgP,IAAD,CAAiBh1E,QAAO,OAACkoC,QAAD,IAACA,OAAD,EAACA,EAAY4H,OAAOt7M,YAAU,wBAAtD,0BACK0zM,QADL,IACKA,OADL,EACKA,EAAY4H,aADjB,QAC0B,cAG9B,cAAC,IAAD,CAAgBt7M,YAAU,yBAA1B,SACI,cAAC0hF,IAAD,CAAWj/E,UAAWq/O,UAmCvBC,IAxBV,SAAC,GAAD,IAAGviP,EAAH,EAAGA,QAASwiP,EAAZ,EAAYA,iBAAkBC,EAA9B,EAA8BA,kBAAmBX,EAAjD,EAAiDA,iBAAjD,OACD,cAACzB,IAAD,iBACKrgP,QADL,IACKA,OADL,EACKA,EAASM,KAAI,SAACmS,EAAMlS,GAAP,OACV,qCACKkS,EAAKzS,QAAQ3F,OAASw3C,KAAoB9rC,UACvC,cAAC,IAAD,CACI67O,mBAAoBnvO,EACpBovO,SAAUY,IAEdhwO,EAAKzS,QAAQ3F,OAASw3C,KAAoB/rC,SAC1C,cAAC,IAAD,CACI87O,mBAAoBnvO,EACpBovO,SAAUW,EACVV,iBAAkBA,IAGtB,6BAEHvhP,EAAQP,EAAQgS,OAAS,GAAK,cAAC,KAAD,c,SpB/InCmqO,K,kBAAAA,E,oBAAAA,E,sBAAAA,E,mBAAAA,U,KAOgB,wBACvBA,IAAkBn/M,QAAoB,aADf,iBAEvBm/M,IAAkBuG,SAAqB,YAFhB,iBAGvBvG,IAAkBwG,UAAsB,aAHjB,iBAIvBxG,IAAkBzpP,QAAoB,WAO3C,IqB/EYkV,IrB+ENg7O,IAYD,SAAC,GAYC,IAAD,MAXF37O,EAWE,EAXFA,QACAi3H,EAUE,EAVFA,WACAC,EASE,EATFA,SACAC,EAQE,EARFA,cACAxvI,EAOE,EAPFA,OACAwU,EAME,EANFA,QACAgoH,EAKE,EALFA,UACAD,EAIE,EAJFA,UACA03H,EAGE,EAHFA,sBACAC,EAEE,EAFFA,wBACA57C,EACE,EADFA,gBAEMjwL,EAAUW,cADd,EAE4C4K,oBAAS,GAFrD,mBAEK02E,EAFL,KAEsBC,EAFtB,KAGIt4D,GAAsB,OAAVq9F,QAAU,IAAVA,OAAA,EAAAA,EAAYpmI,KAAK1G,UAAW2rC,KAAWC,QAEzDra,qBAAU,WAKN,OAJI/zB,EAAO+N,cACPkmP,GAAwBj0P,EAAO+N,cAG5B,WACHmmP,OAEL,CAACD,EAAuBC,EAAyBl0P,EAAO+N,eAE3D,IAwEMomP,EAAmB1zP,uBAAY,WACjC8pG,GAAmB,KACpB,IAEG6pJ,EAAc3zP,uBAChB,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KACd,UAAIorI,QAAJ,IAAIA,OAAJ,EAAIA,EAAYpmI,KAAKgH,GAAI,CACrB,IAAM6gC,EAA2B,CAC7BtlC,KAAM,aACNsC,aAAcuhI,EAAWp/H,GACzBmyI,WAAY/S,EAAWpmI,KAAKgH,GAC5BlF,OACAD,cAEJutM,EAAgB,CAACvnK,GAAgBojN,MAGzC,QAAC7kH,QAAD,IAACA,OAAD,EAACA,EAAYpmI,KAAKgH,GAAlB,OAAsBo/H,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAYp/H,GAAIooM,EAAiB67C,IAG3D,OACI,eAAC,GAAD,CACIv/O,MAAM,qBACNmlH,SAAQ,OAAEuV,QAAF,IAAEA,GAAF,UAAEA,EAAY9oI,kBAAd,aAAE,EAAwBtC,KAClCo4H,UACI,cAAC,GAAD,UACKgT,EACG,qCACI,eAAC,GAAD,YACe,OAAVA,QAAU,IAAVA,OAAA,EAAAA,EAAY9sI,UACTugD,KAAiB3U,SACjB,cAACmrG,GAAD,CAAsB3nI,YAAU,qBAAhC,0BAIO,OAAV09H,QAAU,IAAVA,OAAA,EAAAA,EAAY9sI,UACTugD,KAAiBsb,UACjB,cAACm7E,GAAD,CAAyB5nI,YAAU,qBAAnC,0BAIO,OAAV09H,QAAU,IAAVA,OAAA,EAAAA,EAAY9sI,UACTugD,KAAiB1lD,WACjB,eAACo8I,GAAD,CAAwB7nI,YAAU,qBAAlC,yBACiB,IACZ2f,aACG,IAAIX,KAAK0+G,EAAW+R,oBAKpC,cAACjH,GAAD,CAAiBxoI,YAAU,uBAA3B,SAxEA,WAA2B,IAAD,SACR09H,QADQ,IACRA,IAAc,GAA5CgH,EADsC,EACtCA,WAAYviG,EAD0B,EAC1BA,QAAS7qC,EADiB,EACjBA,KAE7B,OAAK6qC,EAEMuiG,EAEH,eAAC6D,GAAD,qBACQjxI,EAAMkmC,UADd,YAC2BlmC,EAAMomC,SADjC,4DAEiC9c,aACrBuhB,IAER,cAACsmG,GAAD,OAIF,aAAN,OAAoB7nH,aAAuBuhB,IAZpC,cAqEcsgN,QAIT,eAAC/5G,GAAD,WACI,cAACvlC,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,IACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,sBAGpB,cAACksF,GAAA,EAAD,CACIzjG,QAAQ,OACRpC,MAAO,GACPC,OAAQ,GACRiF,MAAO,CACHyU,WAAY,2BAOpC2zG,UAAWA,EACXD,UAAWA,EACX5nH,SAAS,qBACT+pH,gBAAgB,QA3DpB,UA6DKlqH,IAAY86H,EACP,cAAC8J,GAAD,IAEE,eAACD,GAAD,WACI,eAACE,GAAD,WACI,eAAC,GAAD,WACI,cAACK,GAAD,UACI,cAAC19F,GAAA,EAAD,CACI3jC,QAASi3H,EAAWpmI,KACpBozC,UAAW,GACXC,WAAY,GACZR,gBAAiB,EACjBU,QAAQ,EACR9nC,SAAS,8BAGjB,eAACglI,GAAD,WACI,eAACC,GAAD,CAAYC,OAAQ5nG,EAApB,UACI,uBAAMrgC,YAAU,wBAAhB,oBACQ09H,EAAWpmI,KAAKkmC,WAAa,GADrC,YAEQkgG,EAAWpmI,KAAKomC,UAAY,IAE/Bj3B,GAAWi3H,EAAWpmI,KAAKgH,KAAOmI,EAAQnI,IACvC,eAACoyD,GAAD,WACK,IADL,cAKPrwB,GACG,cAACioG,GAAD,UACI,cAACD,GAAD,CAAoBroI,YAAU,iCAA9B,uCAMZ,cAACkoI,GAAD,CAAaloI,YAAU,yBAAvB,SACK09H,EAAWpmI,KAAKlI,eAI3BixC,GACE,cAAC,IAAD,CACI/iC,MAAM,QACNC,OAAO,OACPjE,OAAQ,kBAAMq/F,GAAmB,IACjC51F,SAAS,eAJb,sBAUR,cAAC,KAAD,IACA,cAAColI,GAAD,UACI,eAACC,GAAD,WACI,cAAC,IAAD,CACI1K,WAAYA,EACZmd,UAAS,OAAEnd,QAAF,IAAEA,OAAF,EAAEA,EAAY2Z,UACvB5H,YAAa/R,EAAW+R,cAE5B,cAAC,IAAD,CACIz+I,KAAM4sI,EAAe99H,KAAI,SAAA4iP,GACrB,MAAO,CACH5jO,KAAM4jO,EAAI5jO,KACVpa,OsBpVdi+O,EtBoVmCD,EAAIE,UAAY,GsBnVtEtxO,KAAK87H,MAAY,IAANu1G,GAAa,MAD5B,IAAuBA,KtBuVMlD,UAAW/hH,EAAWkd,oBAIlC,cAAC,IAAD,CACIp7I,QAAO,OAAEm+H,QAAF,IAAEA,OAAF,EAAEA,EAAU5sH,MACnBkxO,kBApOS,SAAChpP,GACzBA,GAELwd,EAAQH,KACJluB,IAAOsC,oBAAoBK,WAAWF,OAAO2D,QACzC,gBACAyK,GAEJ,CACI2xH,WAAW,KA4NCo3H,iBAvNO,SAAC/oP,GACvBA,GAELwd,EAAQH,KACJluB,IAAOsC,oBAAoBC,eAAeE,OAAO2D,QAC7C,gBACAyK,GAEJ,CACI2xH,WAAW,KA+MC02H,iBA1MC,SAACroP,GACjBA,GAAiBykI,GAEtBrmH,YACIZ,EACAruB,IAAOgE,qBACFoC,QACG,UACAkvI,EAAWpmI,KAAKgH,GAAG7P,YAEtBD,QACG,gBACAkvI,EAAWp/H,GAAG7P,YAChBD,QACE,cACAyK,EAAaxK,mBAgMpBiqG,GACG,cAACrsD,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACI10D,MAAK,mCAA8B06H,EAAYpmI,KAAKkmC,UAA/C,YAA4DkgG,EAAYpmI,KAAKomC,UAClFk6B,SAAQ,iBAAKnxD,QAAL,IAAKA,OAAL,EAAKA,EAAS+2B,UAAd,mBAA2B/2B,QAA3B,IAA2BA,OAA3B,EAA2BA,EAASi3B,UAC5Ci6B,OAAQ6qL,EACR3zN,QAAS0zN,EACT1qL,eAAc,oBAAE6lE,EAAY9oI,kBAAd,aAAE,EAAwBtC,YAA1B,QAAkC,WAyCzDuwP,IAjC0B,WAAO,IAAD,QACrC7xP,EAAOqqH,KACPjtH,EAAS00I,cACTr8H,EAAU0R,YAAY3R,MACtB67O,EAAwBhlH,KACxBylH,EAAwB7kH,KACxBwqE,EAAgBxpK,eAGhBg5G,EAFU7gI,cAEmBT,SAAShW,MAO5C,OALAwnC,YAAiB,qBAAsB,CAAC,GAAD,iBAChCn3C,EAAK0sI,kBAD2B,aAChC,EAAiBpmI,KAAKkmC,UADU,sBACGxsC,EAAK0sI,kBADR,aACG,EAAiBpmI,KAAKomC,UADzB,UAEnC1sC,EAAK0sI,kBAF8B,iBAEnC,EAAiB9oI,kBAFkB,aAEnC,EAA6BtC,OAI7B,cAAC,IAAD,CACImU,QAASA,EACTi3H,WAAY1sI,EAAK0sI,WACjBC,SAAU3sI,EAAK2sI,SACfC,cAAe5sI,EAAK4sI,cACpBh7H,QAAS5R,EAAK4R,QACdxU,OAAQA,EACRw8H,aAAY,OAACqtB,QAAD,IAACA,OAAD,EAACA,EAAertB,WAC5BD,UAAWviI,IAAOoE,iBAAiBgC,QAAQ,UAAWJ,EAAOF,QAC7Dm0P,sBAAuBA,EACvBC,wBAAyBQ,EACzBp8C,gBAAiB+B,KuBlZhB7yK,IAAsB,CAC/BrkC,MAH0B,GAI1BC,OAAQ,EACRigB,cAAe,EACf/f,WAAY,GACZE,QAAS,O,SFJDwV,K,kDAAAA,E,sDAAAA,E,sDAAAA,E,2CAAAA,U,KGWL,I,gBAAM27O,IAA4B,WACrC,IAAM7iP,EAAWO,cACXuiP,EAAqB9oP,eACrByW,EAAcnQ,cAKpB,OAAO3R,uBAAY,SAACmB,EAA4BmM,EAAsBjH,GAAwB,IAAD,EACnF2b,EAAK,CACPtf,MAAK,UAAEvB,EAAauB,aAAf,QAAwB,GAC7BC,OAAQxB,EAAawB,OACrB2K,cAAeA,EACfjH,YAAaA,GAGjB,OADAgL,EHnBG,CACHrG,KAAMuN,IAAQ67O,0BGmBPD,EAAmBnyO,GACrBsZ,MAAK,SAACn5B,GACHkP,EHlBT,SAAgClP,GACnC,MAAO,CACH6I,KAAMuN,IAAQ87O,0BACdlyP,QGeiBmyP,CAAuBnyP,OAEnCq5B,OAAM,SAAC5rB,GACJyB,EHfT,SAAgCzB,GACnC,MAAO,CACH5E,KAAMuN,IAAQg8O,0BACd3kP,SGYiB4kP,CAAuB5kP,EAAMgB,UACtCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAU8iP,EAAoBryO,KAOzB2yO,IAA+B,WACxC,IAAMpjP,EAAWO,cAKjB,OAAO5R,uBAAY,WACfqR,EHzBG,CACHrG,KAAMuN,IAAQm8O,wBGyBf,CAACrjP,KCzCKsjP,IAAmCjyN,IAAM/tB,eAClD,SAAC0gB,GACG,MAAM,IAAI7lB,MAAM,sBCXjB,IAAM80B,IAAQt0B,IAAOC,IAAV,0JAQLsnE,IAAWvnE,IAAOC,IAAV,wLASRsmB,IAAYvmB,IAAOC,IAAV,qOAUT0oI,IAAgB3oI,IAAOC,IAAV,sIAObktE,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1C6nI,kBAAmB,CACfy8G,UAAW,8BAEf/hD,uBAAwB,CACpB2kB,YAAa,YCjCRq9B,IAAmB,SAAC,GAUA,IAVCtzF,EAUF,EAVEA,UAC9BC,EAS4B,EAT5BA,eACAm7E,EAQ4B,EAR5BA,aACAl8I,EAO4B,EAP5BA,YACA6+F,EAM4B,EAN5BA,KACA5nL,EAK4B,EAL5BA,UACAw/D,EAI4B,EAJ5BA,cACAC,EAG4B,EAH5BA,YACA0rB,EAE4B,EAF5BA,iBACAiyJ,EAC4B,EAD5BA,iBAEM92K,EAAUb,MAChB,OAAO,cAAC,GAAD,CACCokF,UAAWA,EACXC,eAAgBA,EAChB/yJ,MAAO,QAHR,SAIC,eAAC,IAAD,WACI,cAAC,IAAD,uBACA,cAAC8oE,IAAD,UAAWolK,IACVjlO,KAAa,OAAC4nL,QAAD,IAACA,OAAD,EAACA,EAAMp9K,MAAMS,SACvB,cAAC,IAAD,UAAe,cAAC,KAAD,MAEnB,cAAC,gBAAD,CACIoqF,sBAAuB/uB,EAAQm6D,kBAC/B13C,YAAaA,EACbt+F,KAAI,OAAEm9L,QAAF,IAAEA,OAAF,EAAEA,EAAMp9K,MACZirF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,EACbjjE,SAAU,0BAEd84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,OAAEm9K,QAAF,IAAEA,OAAF,EAAEA,EAAMj2I,MAClBygB,aJ3CE,GI4CFm4B,aAAcY,EACdX,wBAAwB,EACxBC,aAAa,EACbjuF,SAAU,mBAEd23F,8BAA8B,GAElCxK,8BAA+B,CAC3BE,sBAAsB,GAE1B8L,eAAgB,CACZpQ,QAAS,CACL,CACI9oF,MAAO,OACP1F,MAAO,GACPH,UAAW0vE,EAAQ60H,uBACnBj/L,SAAU6sF,EAAY85C,eACtBrmI,SAAU,eAEd,CACIC,MAAO,OACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAU,eAEd,CACIC,MAAO,MACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAU,cAEd,CACIC,MAAO,WACP1F,MAAO,GACPmF,SAAU6sF,EAAY85C,eACtBrmI,SAAU,oBAIlBwrF,UAAW,CACPC,MAAO,CACH,CACIR,UAAW,aACXj/B,oBAAqB,SAAC2zL,GAAD,OAChBA,EAAI7nG,WACT5sD,WAAY,CACRrB,YAAa,SAAC81J,GAAD,OAAsBliO,aAAWkiO,EAAI7nG,YAClD93I,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC2zL,GAAD,OAChBA,EAAI7kC,SAAS0jC,cAClBtzJ,WAAY,CACRrB,YAAa,SAAC81J,GAAD,OAAsB/+O,KAAkB++O,EAAI7kC,SAAS0jC,eAClEx+O,SAAU,uBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC2zL,GAAD,OAChBA,EAAIhX,YAAciY,GACvB11J,WAAY,CACRrB,YAAa,SAAC81J,GAAD,gBAAyBA,EAAIhX,UAA7B,eAA6CiY,IAC1D5gP,SAAU,sBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC2zL,GAAD,OAChBA,EAAI7kC,SAASA,UAClB5vH,WAAY,CACRrB,YAAa,SAAC81J,GAAD,OAAsBpxO,KAAKqpI,MAA8B,IAAxB+nG,EAAI7kC,SAASA,UAAkB,KAC7E96M,SAAU,sCCbnC4tH,iBA7F0C,SAAC,GAAiC,IAAD,EAA/By/B,EAA+B,EAA/BA,UAAWC,EAAoB,EAApBA,eAAoB,EHM/El4I,YAAY1U,qBAAW+/O,MGLhBr1D,EADwE,EAC9En9L,KAAYuV,EADkE,EAClEA,UACd4kI,EAAoBvC,KAF4D,EAG5C5mH,mBAAS,IAAIhD,MAH+B,mBAG/E+mD,EAH+E,KAGhEqkE,EAHgE,KAKhFh8I,EAIF00I,cAEI50I,EAAqCE,EAArCF,OAAQiO,EAA6B/N,EAA7B+N,aAAcjH,EAAe9G,EAAf8G,WAXwD,EAYxCmmH,KAAtCqiB,EAZ8E,EAY9EA,WAAsBkmH,EAZwD,EAYlEjmH,SAEhBgmH,EAA2B,EAC3BnY,EAAe,GACftpD,EAAU,GAEd,GAAIxkD,GAAcvhI,GAAgBjH,GAAcwoI,EAAWp/H,MAAQnC,EAAc,CAC7E,IAAMu3M,EAAU,OAAGkwC,QAAH,IAAGA,OAAH,EAAGA,EAAa7yO,MAAMqsB,MAAK,qBAAG59B,QAAsBtK,cAAgBA,KAEpF,GAAIw+M,EAAY,CAAC,IAAD,UACJl0M,EAAsBk0M,EAAtBl0M,QAASm+H,EAAa+1E,EAAb/1E,SAEjB6tG,GAAe,UAAAhsO,EAAQkwC,gBAAR,eAAkB1sC,QAAS,GAC1C2gP,GAA2B,OAARhmH,QAAQ,IAARA,OAAA,EAAAA,EAAU+jH,YAAa,EAC1Cx/D,GAAU,UAAA1iL,EAAQkwC,gBAAR,mBAAkBwyI,eAAlB,eAA2B1kJ,WAAY,KAAvC,UAA6Ch+B,EAAQkwC,gBAArD,iBAA6C,EAAkBwyI,eAA/D,aAA6C,EAA2BxkJ,WAI1F,IAAM4xD,EAAc67C,EAAkB,CAClC/1C,YAAgB,OAAJ+4F,QAAI,IAAJA,GAAA,UAAAA,EAAMp9K,aAAN,eAAaS,SAAU,IA/B+C,EAmClFmkB,aAAqBC,KADjB5lC,EAlC8E,EAkC9EA,aAAcunC,EAlCgE,EAkChEA,UAGhBssN,EAAqBd,MACrBe,EAAoBR,MAE1BnhO,qBAAU,WAIN,OAHIhmB,GAAgBjH,GAChB2uP,EAAmB7zP,EAAcmM,EAAcjH,GAE5C,WACH4uP,OAGL,IAQH,IAAMpyJ,EAAmB7iG,uBACrB,SAACi5E,EAAGt2E,GACA+lC,EAAU/lC,GACV2K,GAAgBjH,GAAc2uP,EAAmB,6BAAK7zP,GAAN,IAAoBwB,WAAU2K,EAAcjH,KAEhG,CAAClF,EAAcunC,EAAWssN,EAAoB1nP,EAAcjH,IAO3D8wE,EAAcn3E,uBAAY,WACxBsN,GAAgBjH,GAAc2uP,EAAmB7zP,EAAcmM,EAAcjH,GAC7Ek1I,EAAiB,IAAIprH,QAC1B,CAAC6kO,EAAoB7zP,EAAcmM,EAAcjH,IAInD,OAFDizC,YAAiB,UAAW,CAAC+5I,EAASspD,IAE9B,cAAC,IAAD,CACHp7E,UAAWA,EACN5hK,QAAQ,UADF,OACaN,QADb,IACaA,IAAU,IAC7BM,QAAQ,gBAFF,OAEmB2N,QAFnB,IAEmBA,IAAgB,IACzC3N,QAAQ,cAHF,OAGiB0G,QAHjB,IAGiBA,IAAc,IAE1Cm7J,eAAgBA,EAChBm7E,aAAcA,EACdl8I,YAAaA,EACb6+F,KAAMA,EACN5nL,UAAWA,EACXw/D,cAAeA,EACfC,YAAaA,EACb0rB,iBAAkBA,EAClBiyJ,iBAAkBA,OC/FnB,SAASI,IAAmBpjP,GAC/B,OAAsBA,EAAOg9H,SAG1B,SAASqmH,IAA4BrjP,GACxC,OAAsBA,EAAOqzD,oBAG1B,SAASiwL,IAA2BtjP,GACvC,OAAOojP,IAAmBpjP,GAAOkpI,gBAG9B,SAASq6G,IAA2BvjP,GACvC,OAAOojP,IAAmBpjP,GAAO/E,YAG9B,SAASuoP,IAAuBxjP,GACnC,OAAsBA,EAAOyjP,YAG1B,SAASC,IAAuB1jP,GACnC,OAAOojP,IAAmBpjP,GAAO2jP,OAG9B,SAASC,IAAW5jP,GACvB,OAAsBA,EAAO5J,MAG1B,SAASytP,IAAU7jP,GACtB,OAAsBA,EAAO8jP,KAG1B,SAASC,IAAiB/jP,GAC7B,OAAsBA,EAAO0d,YAG1B,SAASsmO,IAAqBhkP,GACjC,OAAsBA,EAAOkzD,YAG1B,SAAS+wL,IAAkBjkP,GAC9B,OAAsBA,EAAO+2J,aAG1B,SAASmtF,IAAwBlkP,GACpC,OAAsBA,EAAO0iM,mBAG1B,SAASyhD,IAA4BnkP,GACxC,OAAsBA,EAAOg2J,uBAG1B,SAASouF,IAAqBpkP,GACjC,OAAsBA,EAAOqkP,gBAG1B,SAASC,IAAwBtkP,GACpC,OAAsBA,EAAOukP,mBAG1B,SAASC,IAA+BxkP,GAC3C,OAAsBA,EAAOykP,0BAG1B,SAASC,IAAsB1kP,GAClC,OAAsBA,EAAO2kP,iBAG1B,SAASC,IAA6B5kP,GACzC,OAAsBA,EAAO6kP,wBAG1B,SAASC,IAAuB9kP,GACnC,OAAsBA,EAAO+kP,kBAG1B,SAASC,IAA8BhlP,GAC1C,OAAsBA,EAAOilP,yBAG1B,SAASC,IAAellP,GAC3B,OAAsBA,EAAO6vC,UAG1B,SAASs1M,IAAiBnlP,GAC7B,OAAsBA,EAAO+zM,YAG1B,SAASqxC,IAA0BplP,GACtC,OAAsBA,EAAOyqN,qBAG1B,SAAS46B,IAAuBrlP,GACnC,OAAsBA,EAAOslP,kBAG1B,SAASC,IAAmBvlP,GAC/B,OAAsBA,EAAOs7M,cAG1B,SAASkqC,IAAwBxlP,GACpC,OAAsBA,EAAOg5M,mBAG1B,SAASysC,IAA0BzlP,GACtC,OAAsBA,EAAO0lP,qBAG1B,SAASC,IAAY3lP,GACxB,OAAsBA,EAAOtQ,OAG1B,SAASk2P,IAAkB5lP,GAC9B,OAAsBA,EAAO6lP,aAG1B,SAASC,IAAmB9lP,GAC/B,OAAsBA,EAAOi1F,cAG1B,SAAS8wJ,IAAuB/lP,GACnC,IAAM8F,EAAyB9F,EAAO8F,QAAQH,KAC9C,OAAOG,GAAWA,EAAQuR,YAAcvR,EAAQuR,YAAc,GAG3D,SAAS2uO,IAAgBhmP,GAC5B,OAAsBA,EAAOkzN,KAE1B,SAAS+yB,IAAuBjmP,GACnC,OAAsBA,EAAOkmP,YAG1B,SAASC,IAAYnmP,GACxB,OAAsBA,EAAO2lO,OAG1B,SAASygB,IAAepmP,GAC3B,OAAsBA,EAAOizD,UAG1B,SAASozL,IAAmBrmP,GAC/B,OAAsBA,EAAO+lO,cAG1B,SAASugB,IAAkBtmP,GAC9B,OAAsBA,EAAOmoO,OAG1B,SAASoe,IAAWvmP,GACvB,OAAsBA,EAAO02B,MAG1B,SAAS8vN,IAAoBxmP,GAChC,OAAsBA,EAAOymP,eAG1B,SAASC,IAAkB1mP,GAC9B,OAAsBA,EAAOm7M,aAG1B,SAASwrC,IAAiB3mP,GAC7B,OAAsBA,EAAOozD,YAG1B,SAASwzL,IAAe5mP,GAC3B,OAAsBA,EAAOmzD,SAG1B,SAAS0zL,IAAW7mP,GACvB,OAAsBA,EAAOu2B,MAG1B,SAASuwN,IAAmB9mP,GAC/B,OAAsBA,EAAO+mP,cAG1B,SAASC,IAAsBhnP,GAClC,OAAsBA,EAAOinP,iBAG1B,SAASC,IAAalnP,GACzB,OAAsBA,EAAOmnP,QAG1B,SAASC,IAAqBpnP,GACjC,OAAsBA,EAAOqnP,gBAG1B,SAASC,IAAkBtnP,GAC9B,OAAsBA,EAAOunP,aAG1B,SAASC,IAAexnP,GAC3B,OAAsBA,EAAOynP,UAG1B,SAASC,IAAc1nP,GAC1B,OAAsBA,EAAO2nP,SCxM1B,ICGKC,IDwBGC,IA3BUvrP,sBACrB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EACXK,MAAM,6BACNC,WAAW,+BAPf,SASI,mBAAGS,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,0kBACF4zB,UAAU,mDCcnC,SAASy2N,MACZ,IAAM7rO,EAAeC,eACrB,OAAOC,mBACH,kBA1BR,SAA6CF,GACzC,IAAM8rO,EAAmB,kBAAMjsO,aAAcG,EAActZ,KAAgBkoD,eAc3E,MAAO,CACHk9L,mBACAtqO,eAdmB,SAAC8tC,GAAD,OACnB3tC,aACI2tC,EACA,CACI1tC,aACI+pO,IAAyBh8L,YACzBL,EACAw8L,OAgBNC,CAAoC/rO,KAC1C,CAACA,K,SAhCG2rO,O,8BAAAA,U,KCKL,I,oBAAMK,IAA6B,SACtC18L,EACA28L,GACiB,IAAD,IACV/pO,EAAI,OAAGotC,QAAH,IAAGA,GAAH,UAAGA,EAAUn7C,aAAb,iBAAG,EAAiBqsB,MAAK,SAAA1xB,GAAO,OAAIA,EAAQpN,KAAOuqP,YAAnD,aAAG,EAAoE1mN,QAEjF,OAAOrjB,EAAOc,KAAMd,GAAckC,OAAOohB,MAAe,M,WCf/C4xE,IAAoBn1G,IAAOC,IAAV,mOAKxB,qBAAGm1G,oBAAyB,mBAKrB,SAAAl1G,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aACvB,SAAAyb,GAAK,OACfA,EAAMC,OAASD,EAAMk1G,mBAArB,oBACmBl1G,EAAMI,MAAMpc,OAAOQ,YAChC,UACU,SAAAwb,GAAK,OACrBA,EAAMC,OAASD,EAAMk1G,mBACfl1G,EAAMI,MAAMpc,OAAOqC,SACnB,WAGDqqE,IAAgB5wD,IAAOC,IAAV,2MAYbgqP,IAAiB,CAC1BxrP,MAAO,IACPgsE,UAAW,kCACXr7C,QAAS,MACTvsB,aAAc,EACduV,WAAY,OACZmzE,MAAO,GACPpqC,UAAW,IChCT6gD,IAAOjiF,EAAQ,KAiFNmqO,IA/EuC,SAAAhqP,GAAU,IACpDoqC,EAAYpqC,EAAZoqC,QADmD,EAG3BnnB,mBAA6B,MAHF,mBAGpD2M,EAHoD,KAG1Cq6N,EAH0C,KAIrD12H,EAAYn5F,QAAQxK,GAepB5tB,EAAc,WAChBioP,EAAY,OAGhB,OACI,qCACI,cAAC,IAAD,CAAe/lP,QAdF,SAAC61C,GAClBkwM,EAAYlwM,EAAMuuB,gBAawBrnE,YAAU,0BAAhD,SACI,cAAC,IAAD,CAAmBhB,KAAMszH,EAAWre,oBAAoB,EAAxD,SACI,cAAC,GAAD,QAGPqe,GACG,cAAC,MAAD,CACIh0H,GAAG,gBACH2qP,cAAe,CACX,kBAAmB,eAEvBt6N,SAAUA,EACV3vB,KAAMszH,EACNzjG,QAAS9tB,EACTmoP,WAAY,CACR1mP,MAAOsmP,KATf,SAYK3/M,EAAQrpC,KAAI,SAAAxG,GAAW,IACZ0J,EAA0C1J,EAA1C0J,MAAOgV,EAAmC1e,EAAnC0e,YAAa/U,EAAsB3J,EAAtB2J,QAASF,EAAazJ,EAAbyJ,SAErC,OACI,cAAC,WAAD,UACKiV,EACG,cAAC,KAAD,CAAiBA,YAAaA,EAA9B,SACI,cAAC,GAAD,CACI/U,QAAS,WACLA,IACAlC,KAEJgC,SAAUA,EALd,SAOKC,MAIT,cAAC,GAAD,CACIC,QAAS,WACLA,IACAlC,KAHR,SAMKiC,KApBE69F,gBCqCrCsoJ,IAoBD,SAAC,GAgBC,IAAD,UAfF1iP,EAeE,EAfFA,QACAylD,EAcE,EAdFA,SACAk9L,EAaE,EAbFA,iBACAC,EAYE,EAZFA,uBACAC,EAWE,EAXFA,0BACAl7P,EAUE,EAVFA,OACAm7P,EASE,EATFA,eACA3mP,EAQE,EARFA,QACA40I,EAOE,EAPFA,eACAgyG,EAME,EANFA,2BACA/yO,EAKE,EALFA,QACAghI,EAIE,EAJFA,gBACA7iJ,EAGE,EAHFA,WACA6S,EAEE,EAFFA,eACAowI,EACE,EADFA,cAEMhrE,EAAUb,KACVy9K,EAAcC,eACdl3O,EAAaT,eACbyyH,EAAapyH,eACbu3O,EAAiBt3O,eACjB4R,EAAqBjP,eACrB7B,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OAP5C,EASEiR,oBAAkB,GATpB,mBAQKogC,EARL,KAQ+BC,EAR/B,OAWoCrgC,qBAXpC,mBAWKsgC,EAXL,KAWkBC,EAXlB,OAY8BvgC,qBAZ9B,mBAYKwgC,EAZL,KAYeC,EAZf,KAcFta,YAAiB,6BAA8B,QAACvzC,QAAD,IAACA,OAAD,EAACA,EAAYtC,OAE5D,IAAMs3P,EAAsB9sO,mBACxB,kBACI2sO,EAAYn9I,MAAM96F,OAAS,EACrBi4O,EAAYn9I,MACZ7kG,GAAkB,KAC5B,CAACgiP,EAAYn9I,MAAO7kG,IAGlBmjI,EACF1+E,GACAA,EAASn7C,OACTq4O,GACAA,EAAiB53O,OAAS06C,EAASn7C,MAAMS,OAEvCk6H,GAAex/E,KAAY,OAACA,QAAD,IAACA,GAAD,UAACA,EAAUn7C,aAAX,aAAC,EAAiBS,QAEnD2Q,qBAAU,WACFsnO,EAAYn9I,MAAM96F,OAAS,GAAK/J,GAChCkiP,EAAeliP,KAEpB,CAACA,EAAgBgiP,EAAYn9I,MAAOq9I,IAEvC,IASMp5J,EAAYvsE,iBAAY,MAExB4R,EAAoC,CACtClkC,WAAY,GACZE,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/BqC,aAAc/F,EAAO+F,aACrBoT,QAAS,GACTmN,SAAUk1O,EACVr4P,MA7Fe,GA8FfC,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACfrf,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,WA3DtB,EAsEEujC,aAAqBC,GAPrB5lC,EA/DF,EA+DEA,aACAg4B,EAhEF,EAgEEA,cACAuP,GAjEF,EAiEEA,UACAT,GAlEF,EAkEEA,YACAc,GAnEF,EAmEEA,oBACAhB,GApEF,EAoEEA,WACAY,GArEF,EAqEEA,UArEF,GAwEwCxV,mBAAS,IAAIhD,MAxErD,qBAwEK+mD,GAxEL,MAwEoBqkE,GAxEpB,MA0EIpkE,GAAcn3E,uBAAY,WAC5B06P,EAAe,6BAEJv5P,GAFG,IAGNwB,OAAQ,EACRD,MArHO,GAqHiBvB,EAAawB,UAEzC,GAEJ44I,GAAiB,IAAIprH,MACrBsqO,EAA0B,IAAI,EAAM1+G,KACrC,CACC56I,EACAu5P,EACAD,EACA1+G,IAGEluB,GAAwB1C,GAAahqH,GAE3CmyB,qBAAU,WACN/zB,EAAO+F,cAAgBsjJ,EAAgBrpJ,EAAO+F,gBAC/C,CAACsjJ,EAAiBrpJ,EAAO+F,eAE5BguB,qBAAU,WACFu6F,KACA1sH,EAAauB,MA1IF,GA2IXg4P,EAAev5P,MAEpB,CAACu5P,EAAgBv5P,EAAc0sH,KAElCv6F,qBAAU,WACNynO,GAAuB9yN,GAAY8yN,KACpC,CAACA,EAAqB9yN,KAEzB3U,qBAAU,WACFq1H,GAAkBA,EAAehmI,OAAS,GAC1ComB,OAEL,CAAC4/G,EAAgB5/G,KAEpBzV,qBAAU,WACN,OAAO,kBACHmnO,EAA0B,IAAI,EAAM1+G,MAEzC,IAEHzoH,qBAAU,WACNmnO,EAA0B,IAAI,EAAM1+G,KAErC,QAAC1+E,QAAD,IAACA,OAAD,EAACA,EAAUhU,QAMd,IAAM2xM,GAAkB,SAACh4P,GACrB+kC,GAAW/kC,GACX4pG,MAGE7pG,GAAU5B,EAAa4B,QACvBk4P,GAAcnhH,GAAW,OAAQ/2I,GAASi4P,IAC1CE,GAAiBphH,GAAW,kBAAmB/2I,GAASi4P,IAzI5D,GA2I0C7nO,oBAAS,GA3InD,qBA2IKgoO,GA3IL,MA2IqBC,GA3IrB,SA4IwCjoO,oBAAS,GA5IjD,qBA4IKkoO,GA5IL,MA4IoBC,GA5IpB,SA6IoCnoO,oBAAS,GA7I7C,qBA6IK8mD,GA7IL,MA6IkBuhE,GA7IlB,MA+IFloH,qBAAU,WACFinO,GAAoBA,EAAiB53O,OAAS,EAC9Cy4O,IAAkB,GAElBA,IAAkB,KAEvB,CAACb,IAEJ,IAAMgB,GAAyBv7P,uBAC3B,SAAC2a,GACG,IAAMpT,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GACJgrP,EACIlzP,EACAoT,EACAohI,KAGR,CAAC1+E,EAAU0+E,EAA6B0+G,IAUtCe,GAAmB,CACrBl2P,aAAc/F,EAAO+F,aACrByH,YAAW,iBACPwtP,QADO,IACPA,OADO,EACPA,EAAkBtpP,KAAI,SAAAwqP,GAAe,YAAK,CACtCp8P,OAAQo8P,EACRn2P,aAAc/F,EAAO+F,aACrBguC,SAAS,UAAAymN,IAA2B18L,EAAUo+L,UAArC,eACL9nM,QADK,IACLA,OADK,EACLA,EAAW8nM,IADN,OAEC9nM,QAFD,IAECA,OAFD,EAECA,EAAW8nM,GACX,gBAPP,QAQA,GACX32P,OAAQ3D,EACRmyC,QAAS2mC,GAAW,OAAGxmB,QAAH,IAAGA,OAAH,EAAGA,EAAaioM,iBAAmB,MAGrDC,GAA2C,WAC7CxkL,KACAsjL,EAA0B,IAAI,GAAM,GACpC7yO,EAAQq0G,UAGN2/H,GACFj1G,GACI60G,GADgC,OAEhCn+L,QAFgC,IAEhCA,OAFgC,EAEhCA,EAAUhU,MACVsyM,IAcRroO,qBAAU,WACN,IAAMg4H,EAAiCjuF,EACjCA,EAASn7C,MAAMjR,KAAI,SAAA4L,GAAO,OAAIA,EAAQpN,MACtC,GACAosP,EAAkBl1O,aACpB4zO,EACAjvG,GAEAuwG,GAAmBA,EAAgBl5O,OAAS,GAC5C83O,EAA0BoB,GAAiB,KAEhD,CAACtB,EAAkBl9L,EAAUo9L,IAEhCnnO,qBAAU,YAEc,OAAhBinO,QAAgB,IAAhBA,OAAA,EAAAA,EAAkB53O,SAClB43O,EAAiB53O,UAAjB,OAA4B06C,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAUhU,QAEtCmyF,IAAe,KAEpB,QAACn+E,QAAD,IAACA,OAAD,EAACA,EAAUhU,MAAOkxM,IAErBjnO,qBAAU,WACN,GAAI2mD,GAAa,CACb,IAAM1yE,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GACJgrP,EACIlzP,GACA,EACAw0I,GAIR,UAAItoF,QAAJ,IAAIA,OAAJ,EAAIA,EAAaioM,iBAAkB,CAC/B,IAAMznM,EAA+B,KAC5B,OAARoJ,QAAQ,IAARA,OAAA,EAAAA,EAAUn7C,QAAS,IAAI0D,SAAQ,YAAa,IAAVnW,EAAS,EAATA,GAC/BwkD,EAAgBxkD,GAAhB,OAAsBgkD,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAaioM,oBAEvC9nM,EAAY,6BAAKD,GAAaM,OAInC,CAACoJ,IAhQF,OAkQkClqC,mBAChC,MAnQF,qBAkQKsoH,GAlQL,MAkQiBC,GAlQjB,MAqQIkvG,GAA+B,OACjCzpP,QADiC,IACjCA,GADiC,UACjCA,EAAc68D,kCADmB,aACjC,EAA0Cr7C,OAWxCm5O,GAAoBt+N,KACpBu+N,GAAmBvrH,KACzBl9G,qBAAU,WACN,OAAO,WACHwoO,KACAC,QAEL,CAACD,GAAmBC,KAEvB,IAAMr/G,GAAqB,SAACr5H,GACxB4kB,GAAY5kB,IAIVo9E,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,GACzColG,YAAoB,OAARlpC,QAAQ,IAARA,OAAA,EAAAA,EAAUn7C,MAAMS,SAAU,IAGpCmoI,GAA4B,SAAC17I,GAC/Bu5B,GAAU,6BAA8Bv5B,IAGtC47I,GAAc/8H,mBAChB,kBACI+6H,EAAcz5H,eAAd,OACI8tC,QADJ,IACIA,OADJ,EACIA,EAAUn7C,MAAMiB,QAAO,SAAAtU,GAAC,cAAI0rP,QAAJ,IAAIA,OAAJ,EAAIA,EAAkB74O,SAAS7S,EAAEY,UAEjE,CAAC8qP,EAAkBvxG,EAAnB,OAAkC3rF,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAUn7C,QAO1C4xC,GAAiB,SAACz0D,GACpB,IAAMoJ,EAAI,OAAG40D,QAAH,IAAGA,OAAH,EAAGA,EAAUn7C,MAAMqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOpQ,KACtD,OAAOoJ,KAAiB,OAARkrD,QAAQ,IAARA,OAAA,EAAAA,EAAWlrD,EAAKgH,OAAhB,OAAuBhH,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAM6qC,UACvCvhB,cACY,OAAR4hC,QAAQ,IAARA,OAAA,EAAAA,EAAQ,OAAGlrD,QAAH,IAAGA,OAAH,EAAGA,EAAMgH,OAAjB,OAAyBhH,QAAzB,IAAyBA,OAAzB,EAAyBA,EAAM6qC,UAEnC,MAGJygB,GAAgB,yCAAG,WAAO10D,GAAP,0BAAA4iB,EAAA,sDACjBqxB,EAAU,KACVtoC,EAAO,GAEL2oD,EAAWt0D,EACX,CAACy0D,GAAez0D,IADC,OAEjBk7P,QAFiB,IAEjBA,OAFiB,EAEjBA,EAAkBtpP,KAAI,SAAAxB,GAClB,OAAOqkD,GAAerkD,OAG1BusP,EAAaj0F,iBAAOp0G,GAAU,SAAAvwC,GAAI,OAAIA,MAE7BT,OAAS,EACpB3X,EAAO,YAEPA,EAAOgxP,EAAW,GACZ,SACA/hL,KAAW,OAAIxmB,QAAJ,IAAIA,OAAJ,EAAIA,EAAaioM,kBAC5B,WACA,aALH,cAMSM,EANT,GAMF1oN,EANE,MASDnxC,EAAO,CACTknD,MAAK,OAAEkxM,QAAF,IAAEA,OAAF,EAAEA,EAAkB53O,OACzB3X,OACAsoC,WAGJogB,EAAe,6BACRvxD,GADO,IAEV8K,cAAe5N,EAAS,CAACA,GAAUk7P,KAEvC/mM,GAA4B,GAjCP,2CAAH,sDAoChBQ,GAAa,yCAAG,WAAO/jC,GAAP,kBAAAhO,EAAA,sDACdg4D,IACAvmB,EAAe,6BAAKD,GAAN,IAAmBioM,iBAAkBzrO,KAG/ChjB,EAAkBwmD,EAAlBxmD,cAEFgnD,EAA+B,GACrChnD,EAAc2Y,SAAQ,SAACnW,GACnBwkD,EAAgBxkD,GAAMwgB,KAG1B2jC,EAAY,6BAAKD,GAAaM,IAC9BT,GAA4B,GAC5B2jB,KAdkB,2CAAH,sDAqBby1B,GAAmB,WACrB6tJ,EAA0B,IAAI,EAAM1+G,GACpCP,IAAe,IA0BbuB,KACAw9G,KAAsBA,EAAiB53O,OAEvCq6H,GAA2Bv8C,GAAY85C,eA8B7C,OACI,qCACI,eAAC9C,GAAD,WACI,cAACX,GAAD,UACI,gCACI,eAACE,GAAD,WACI,cAACC,GAAD,CAAqC9lI,YAAU,8BAA/C,4CAGA,cAACf,GAAD,UACI,cAAC,IAAD,SAGR,eAAC8mI,GAAD,CAAyB/lI,YAAU,qBAAnC,kDACmCpL,QADnC,IACmCA,OADnC,EACmCA,EAAYtC,aAIvD,cAAC,KAAD,IACCsQ,IAAYkmE,IAAe,cAAC,KAAD,IAC5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEk7D,QAAF,IAAEA,OAAF,EAAEA,EAAUn7C,MAChB0/E,SAAU/yB,MAAc48K,gBACxBr+I,qBAAqB,SACrB1L,UAAWA,EACXD,sBAAuB,CACnB33B,aArfD,GAsfCC,UAAS,OAAE1M,QAAF,IAAEA,GAAF,UAAEA,EAAUn7C,aAAZ,aAAE,EAAiBS,OAC5BR,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtB8gB,eAAgBzhC,GAChBshC,cAAe03B,EACfr3B,aAAa,EACb37D,OAAQ,IACRJ,UAAW0vE,EAAQk6D,oBAEvBnrC,sBAAuB/uB,EAAQm6D,kBAC/Bh3C,wBACInjB,EAAQs6D,qCAEZ1/H,eAAgBmiP,EAChBzmL,cACIsmL,EAAYn9I,MAAM96F,OAAS,EACrB,SAAAlP,IAzbE,SAACA,GACrBsnP,EAAoBp4O,OAAS,IAC7Bm4O,EACI1lO,EAAmB3hB,EAAOsnP,EAAqBz2O,IAEnDqxH,KAqbsBsmH,CAAoBxoP,SAExB1S,EAEVosG,2BAA4B,CACxBj2B,cAAeA,GACfC,YAAaA,GACbjjE,SAAU,0BAEd84F,kBAAmB,CACfjB,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,uBAEd23F,8BACKwxC,kBAAck9G,KACdl9G,kBAAchgF,GACnByuC,oBAAqB,CACjB7xB,YAAaA,GACbF,eAAc,OAAEwgL,QAAF,IAAEA,OAAF,EAAEA,EAAkB53O,OAClCR,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtBygB,aA7hBL,GA8hBK8iC,iBAAkBA,GAClBr0E,YAzHJ,WAChB,IAAMhxB,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GACJgrP,EAA0BlzP,GAAS,GAAO,GAC1Ci0I,IAAe,IAoHK3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNunG,oBACI0iD,GAAYp7H,oBACR8pO,IAAyBh8L,aAEvB,CAACjpD,KAAgBkoD,cACjB,GACV0rC,mBACI2iD,GAAYrwG,qBACR++M,IAAyBh8L,aAEjCuc,YAAaA,GACb93D,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtB++C,uBAAwBr0C,KAGhCi4C,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIy0G,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,KACtBu+G,mBACIh+I,EAAa68D,4BACb,GAEJohF,2BACI0L,MAVhB,SAeK,SAACz8I,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,UACKzS,EAAa0B,WACT8f,OAAS,GAGJ,IAFNiyH,GACIzzI,KAER07I,EAEJ9xF,WAAYlqB,EACZ6zG,aACIqmH,GACAA,EAAoBp4O,OAChBioO,GAER12O,SAAS,6BAM7B61D,WAAmB,OAAR1M,QAAQ,IAARA,OAAA,EAAAA,EAAUhU,OAAV,iBACFgU,QADE,IACFA,OADE,EACFA,EAAUhU,MADR,YAEmB,KAAZ,OAARgU,QAAQ,IAARA,OAAA,EAAAA,EAAUhU,OAAc,OAAS,SAErC,GACN8iD,kBAAmB,4BAEvB9K,8BAA+B,CAC3BE,sBACKxtF,GAAuC,KAApB,OAARspD,QAAQ,IAARA,GAAA,UAAAA,EAAUn7C,aAAV,eAAiBS,QACjC+9E,iBAAkB,CACd7sF,KAAMuqI,GACN7zI,KAAM,eACN2J,SAAU,gBAEdysF,uBAAwB,CACpBh4C,WAAY,QACZz0C,SAAU,mBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QACImhI,IAAgC9hE,GACpCe,YAnMM,SAAC/wB,GAC3BsxM,GAAuBtxM,EAAM5E,OAAO1qC,SACpC6gI,IAAe,IAkMKnnI,KAAM,GACNH,SAAU,gCAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJwsP,IAJF,IAKDrnP,SAAU6sF,GAAY85C,eACtBrmI,SAAU,iBAEd,CACIC,MAAO,WACP1F,MAAO,GACPmF,SAAU6sF,GAAY85C,eACtBrmI,SAAU,mBAZT,2BAeDC,MAAO,gBACP1F,MAAO,IACJysP,IAjBF,IAkBDtnP,SAAU6sF,GAAY85C,eACtBrmI,SAAU,8BAIlBwrF,UAAW,CACPI,kBAvME,SAAC71C,EAAYxhD,IAhQZ,SAAC4sB,EAAQ5sB,GAChC4sB,EAAEC,kBACI7sB,EAAKgH,IACP+qP,EAAuB/xP,EAAKgH,IA8PhCysP,CAAmBjyM,EAAOxhD,GAC1B+yI,IAAe,IAsMK37C,aAjNE,SAACp3F,GAAD,QACpB8xP,KAAsB9xP,EAAKgH,IAAM8qP,EAAiB74O,SAASjZ,EAAKgH,KAiN9C4E,KAAM,GACN0rF,gBAhMK,SAACt3F,GAC1B,OAAOgzI,MAAU,OAAKhzI,QAAL,IAAKA,OAAL,EAAKA,EAAI,KAiMNi2F,kBAAmB,SAACj2F,GAAD,MAAmB,CAClCmQ,gBAAoB,OAAJnQ,QAAI,IAAJA,OAAA,EAAAA,EAAMjH,SAAU,GAChCo7E,kBAAmB,CACfnoE,KAAgBwhM,2BAGxB/hM,SAAU,YAEVyrF,MAAO,CACH,CACIR,UAAW,eACX1wF,MAAO,GACP4xF,cAAeriB,EAAQu6D,gBACvBj5C,wBAAyB,SAAC72F,GAAD,OACrB,eAACqvI,GAAD,WACI,cAAC5qE,IAAA,EAAD,CACI/8D,KAAMsrI,KAAehzI,EAAKgH,GAC1Bs7C,WAAY,WA3X7B,IAAC4wB,KA4XuClzE,EAAKgH,KAzXhEisI,GADAD,KAAe9/D,EACD,KAEAA,IAyXsB/iE,gBACQ,OAAJnQ,QAAI,IAAJA,OAAA,EAAAA,EAAMjH,SAAU,GAEpB0S,SAAS,qBAEb,eAACypF,GAAD,WACI,cAACD,GAAD,CACI9lF,QAASnP,EACT4L,KAAK,KACLo6D,YAAa,EACbv6D,SAAS,qBAEb,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KAAOhH,EAAKgH,GAExByE,SAAS,iBALb,mBAMKzL,EAAKkmC,UANV,YAMuBlmC,EAAKomC,oBAK5C,CACIswD,UAAW,aACXkB,cAAeriB,EAAQu6D,gBACvB9pI,MAAO,GACPyxD,oBAAqB,SACjBz3D,GADiB,QAEhB,OAACkrD,QAAD,IAACA,OAAD,EAACA,EAAWlrD,EAAKgH,OAAQhH,EAAK6qC,SACnC8rD,WAAY,CACRrB,YAAa,SAACt1F,GAAD,QACA,OAARkrD,QAAQ,IAARA,OAAA,EAAAA,EAAWlrD,EAAKgH,MACbhH,EAAK6qC,UACTvhB,cACY,OAAR4hC,QAAQ,IAARA,OAAA,EAAAA,EAAWlrD,EAAKgH,MACXhH,EAAK6qC,UAElBp/B,SAAU,uBAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQu6D,gBACvB9pI,MAAO,GACPyxD,oBAAqB,SACjBz3D,GADiB,OAEfA,EAAKgxM,cACXr6G,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTkpB,aAAU,OAAClpB,QAAD,IAACA,OAAD,EAACA,EAAMgxM,eACrBvlM,SAAU,gCAGlB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBn2F,GADqB,OAGrB,cAACovI,GAAD,YACK,OAAC0iH,QAAD,IAACA,OAAD,EAACA,EAAkB53O,SAChB,cAAC,IAAD,CACI23B,QAAS,CACL,CACInmC,MAAO,WACPC,QAAS,kBACL2/C,GACItrD,EAAKgH,KAEb0Z,YAAa,CACT1U,KAAgBkoD,cAEpBzoD,SAAU,gCAa1D,eAAC6iI,GAAD,WACI,cAACI,GAAD,UACI,cAAC,IAAD,CACI1jI,MAAO,SACP5C,QAAS,UACTpC,MAAO,QACPhE,OAjbH,WACjBmd,EAAQq0G,UAibY/nH,SAAS,oBAGjB,cAAC,IAAD,CACIT,MAAO,wBACP/E,OAAQ,OACRD,MAAO,QACPmF,SAAUunP,GACVpnP,QAASsnP,GACT5wP,OAniBY,WAC5B6wP,IAAiB,GACbrhL,GACA2hL,KAEAjB,EAA2Ba,GAAiBzuP,aACvCuuB,MAAK,kBAAMqgO,QAEpBL,IAAiB,IA4hBDpnP,SAAS,8BAIpBq/C,GACG,cAACqB,GAAA,EAAD,CACIzyD,KAAI,6BAAOsxD,GAAP,IAAoBoB,mBAAmB,IAC3C/W,SAAU,kBAAM0V,GAA4B,IAC5CsB,QAASd,SA4DdmoM,IArD6D,SAAC,GAGtE,IAFH56F,EAEE,EAFFA,UACAC,EACE,EADFA,eACE,EACcn1C,KAATv6G,EADL,oBAEI8F,EAAU0R,YAAY3R,MACtBpY,EAAS00I,cACTrsH,EAAUW,cACVsmH,EAAavlH,YAAY+rO,KACzBroH,EAAoBD,KACpBqvH,EAA6B92M,aAAmB0nF,GAChDqvH,EAA2BvuH,KAC3BP,EAAgBD,KAChB9rI,EAASm5B,eACT6/N,EAAyBrqH,KACzBmsH,EAAsCtsH,KACtCgZ,EAAgB4wG,MAEtB,OACI,cAAC,KAAkB37K,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC,GAAD,CACIkgJ,UAAWA,EACXC,eAAgBA,EAChB/yJ,MAAM,MAHV,SAKI,cAAC,IAAD,CACImJ,QAASA,EACTgQ,QAASA,EACTroB,OAAQA,EACRm7P,eAAgB0B,EAChB/+L,SAAUvrD,EAAM3P,KAChBo4P,iBAAkBzoP,EAAM+sG,cACxB27I,uBAAwBA,EACxBC,0BACI6B,EAEJv2P,WAAY8oI,EAAW9oI,WACvB4iJ,eAAgB72I,EAAM86I,OACtB74I,QAASjC,EAAMiC,QACf60I,gBAAiBrb,EACjBotH,2BAA4B0B,EAC5BzjP,eAAgBpX,EAAO6iB,SACvB2kI,cAAeA,SC/0B7BuzG,IAqBD,SAAC,GAiBC,IAAD,YAhBF3kP,EAgBE,EAhBFA,QACAylD,EAeE,EAfFA,SACA6tL,EAcE,EAdFA,kBACAqP,EAaE,EAbFA,iBACAC,EAYE,EAZFA,uBACAC,EAWE,EAXFA,0BACAl7P,EAUE,EAVFA,OACAm7P,EASE,EATFA,eACA3mP,EAQE,EARFA,QACA40I,EAOE,EAPFA,eACAgyG,EAME,EANFA,2BACA/yO,EAKE,EALFA,QACAghI,EAIE,EAJFA,gBACA7iJ,EAGE,EAHFA,WACA6S,EAEE,EAFFA,eACAowI,EACE,EADFA,cAEM4xG,EAAcC,eACdl3O,EAAaT,eACbyyH,EAAapyH,eACbu3O,EAAiBt3O,eACjB4R,EAAqBjP,eACrB7B,EAAa0B,aAAWrC,EAAWxhB,KAAK+f,OACxC87D,EAAUb,KAPd,EAUEhqD,oBAAkB,GAVpB,mBASKogC,EATL,KAS+BC,EAT/B,KAYIunM,EAAsB9sO,mBACxB,kBACI2sO,EAAYn9I,MAAM96F,OAAS,EACrBi4O,EAAYn9I,MACZ7kG,GAAkB,KAC5B,CAACgiP,EAAYn9I,MAAO7kG,IAGxB0a,qBAAU,WACFsnO,EAAYn9I,MAAM96F,OAAS,GAAK/J,GAChCkiP,EAAeliP,KAEpB,CAACA,EAAgBgiP,EAAYn9I,MAAOq9I,IAEvCxnO,qBAAU,YAEc,OAAhBinO,QAAgB,IAAhBA,OAAA,EAAAA,EAAkB53O,SAClB43O,EAAiB53O,UAAjB,OAA4B06C,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAUhU,QAEtCmyF,IAAe,KAEpB,QAACn+E,QAAD,IAACA,OAAD,EAACA,EAAUhU,MAAOkxM,IAErB,IASM74J,EAAYvsE,iBAAY,MAExB4R,EAAoC,CACtClkC,WAAY,GACZE,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/BqC,aAAcygB,OAAOxmB,EAAO+F,cAC5BmG,QAAc,OAANlM,QAAM,IAANA,OAAA,EAAAA,EAAQkM,QAASsa,OAAOxmB,EAAOkM,aAAU1K,EACjD2X,QAAS,GACTmN,SAAUk1O,EACVr4P,MA7Fe,GA8FfC,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACfrf,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,WAGlBi5P,EAA+C,CACjD35P,WAAY,GACZ6V,QAAS,GACTmN,SAAUjN,EACV7V,QAAS,KACTL,MAzGe,GA0GfC,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf8kB,eAAgB,GAChBs2B,2BAA4B,GAC5Bz6D,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,WAvEtB,EAkFEujC,aAAqBC,GAPrB5lC,EA3EF,EA2EEA,aACAg4B,EA5EF,EA4EEA,cACAuP,EA7EF,EA6EEA,UACAT,EA9EF,EA8EEA,YACAc,EA/EF,EA+EEA,oBACAhB,EAhFF,EAgFEA,WACAY,EAjFF,EAiFEA,UAjFF,EAoFwCxV,mBAAS,IAAIhD,MApFrD,mBAoFK+mD,GApFL,KAoFoBqkE,GApFpB,KAsFIQ,GACF1+E,GACAA,EAASn7C,OACTq4O,GACAA,EAAiB53O,OAAS06C,EAASn7C,MAAMS,OAEvCw0D,GAAcn3E,uBAAY,YAC5B,OAAIT,QAAJ,IAAIA,OAAJ,EAAIA,EAAQ+F,eACRo1P,EAAe,6BAEJv5P,GAFG,IAGNwB,OAAQ,EACRD,MA1IG,GA0IqBvB,EAAawB,UAEzC,GAGR44I,GAAiB,IAAIprH,MACrBsqO,EAA0B,IAAI,EAAM1+G,MACrC,CACCx8I,EAAO+F,aACPm1P,EACA1+G,GACA56I,EACAu5P,IAGJpnO,qBAAU,WACN/zB,EAAO+F,cAAgBsjJ,GAAiBrpJ,EAAO+F,gBAChD,CAACsjJ,EAAiBrpJ,EAAO+F,eAE5BguB,qBAAU,YACN,OAAI/zB,QAAJ,IAAIA,OAAJ,EAAIA,EAAQ+F,gBACRo1P,EAAev5P,IACT,OAAN5B,QAAM,IAANA,OAAA,EAAAA,EAAQkM,SAAUy/O,EAAkBsR,MAGzC,QAACj9P,QAAD,IAACA,OAAD,EAACA,EAAQkM,OAAT,OAAiBlM,QAAjB,IAAiBA,OAAjB,EAAiBA,EAAQ+F,aAAco1P,EAAgBv5P,IAE1DmyB,qBAAU,WACNynO,GAAuB9yN,EAAY8yN,KACpC,CAACA,EAAqB9yN,IAEzB3U,qBAAU,WACFq1H,GAAkBA,EAAehmI,OAAS,GAC1ComB,MAEL,CAAC4/G,EAAgB5/G,IAMpB,IAAMiyN,GAAkB,SAACh4P,GACrB+kC,EAAW/kC,GACX4pG,MAGE7pG,GAAU5B,EAAa4B,QACvBk4P,GAAcnhH,GAAW,OAAQ/2I,GAASi4P,IAC1CE,GAAiBphH,GAAW,kBAAmB/2I,GAASi4P,IAlJ5D,GAoJ0C7nO,oBAAS,GApJnD,qBAoJKgoO,GApJL,MAoJqBC,GApJrB,SAqJwCjoO,oBAAS,GArJjD,qBAqJKkoO,GArJL,MAqJoBC,GArJpB,SAsJoCnoO,oBAAS,GAtJ7C,qBAsJK8mD,GAtJL,MAsJkBuhE,GAtJlB,SAwJoCroH,qBAxJpC,qBAwJKsgC,GAxJL,MAwJkBC,GAxJlB,SAyJ8BvgC,qBAzJ9B,qBAyJKwgC,GAzJL,MAyJeC,GAzJf,MA2JIipF,IAAex/E,KAAY,OAACA,QAAD,IAACA,GAAD,UAACA,EAAUn7C,aAAX,aAAC,EAAiBS,QAEnD22B,YAAiB,6BAA8B,QAACvzC,QAAD,IAACA,OAAD,EAACA,EAAYtC,OAO3D,IAAMyiP,GAAelmP,uBAClB,kBAAM4nB,EAAQq0G,WACd,CAACr0G,IAGL0L,qBAAU,WACFinO,GAAoBA,EAAiB53O,OAAS,EAC9Cy4O,IAAkB,GAElBA,IAAkB,KAEvB,CAACb,IAEJjnO,qBAAU,WACN,OAAO,kBACHmnO,EAA0B,IAAI,EAAM1+G,OAEzC,IAEHzoH,qBAAU,WACN,GAAI2mD,GAAa,CACb,IAAM1yE,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GAEJgrP,EACIlzP,GACA,EACAw0I,IAGR,UAAItoF,SAAJ,IAAIA,QAAJ,EAAIA,GAAaioM,iBAAkB,CAC/B,IAAMznM,EAA+B,KAC5B,OAARoJ,QAAQ,IAARA,OAAA,EAAAA,EAAUn7C,QAAS,IAAI0D,SAAQ,YAAa,IAAVnW,EAAS,EAATA,GAC/BwkD,EAAgBxkD,GAAhB,OAAsBgkD,SAAtB,IAAsBA,QAAtB,EAAsBA,GAAaioM,oBAEvC9nM,GAAY,6BAAKD,IAAaM,OAGnC,CAACoJ,IAEJ,IAAMk+L,GAAyBv7P,uBAC3B,SAAC2a,GACG,IAAMpT,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GACJgrP,EACIlzP,EACAoT,EACAohI,MAGR,CAAC1+E,EAAU0+E,GAA6B0+G,IAUtC3mM,GAAiB,SAACz0D,GACpB,IAAMoJ,EAAI,OAAG40D,QAAH,IAAGA,OAAH,EAAGA,EAAUn7C,MAAMqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOpQ,KACtD,OAAOoJ,KAAiB,OAARkrD,SAAQ,IAARA,QAAA,EAAAA,GAAWlrD,EAAKgH,OAAhB,OAAuBhH,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAM6qC,UACvCvhB,cACY,OAAR4hC,SAAQ,IAARA,QAAA,EAAAA,GAAQ,OAAGlrD,QAAH,IAAGA,OAAH,EAAGA,EAAMgH,OAAjB,OAAyBhH,QAAzB,IAAyBA,OAAzB,EAAyBA,EAAM6qC,UAEnC,MAGJygB,GAAgB,yCAAG,WAAO10D,GAAP,0BAAA4iB,EAAA,sDACjBqxB,EAAU,KACVtoC,EAAO,GAEL2oD,EAAWt0D,EACX,CAACy0D,GAAez0D,IADC,OAEjBk7P,QAFiB,IAEjBA,OAFiB,EAEjBA,EAAkBtpP,KAAI,SAAAxB,GAClB,OAAOqkD,GAAerkD,OAG1BusP,EAAaj0F,iBAAOp0G,GAAU,SAAAvwC,GAAI,OAAIA,MAE7BT,OAAS,EACpB3X,EAAO,YAEPA,EAAOgxP,EAAW,GACZ,SACA/hL,KAAW,OAAIxmB,SAAJ,IAAIA,QAAJ,EAAIA,GAAaioM,kBAC5B,WACA,aALH,cAMSM,EANT,GAMF1oN,EANE,MASDnxC,EAAO,CACTknD,MAAK,OAAEkxM,QAAF,IAAEA,OAAF,EAAEA,EAAkB53O,OACzB3X,OACAsoC,WAGJogB,GAAe,6BACRvxD,GADO,IAEV8K,cAAe5N,EAAS,CAACA,GAAUk7P,KAEvC/mM,GAA4B,GAjCP,2CAAH,sDAoChBQ,GAAa,yCAAG,WAAO/jC,GAAP,kBAAAhO,EAAA,sDACdg4D,IACAvmB,GAAe,6BAAKD,IAAN,IAAmBioM,iBAAkBzrO,KAG/ChjB,EAAkBwmD,GAAlBxmD,cAEFgnD,EAA+B,GACrChnD,EAAc2Y,SAAQ,SAACnW,GACnBwkD,EAAgBxkD,GAAMwgB,KAE1B2jC,GAAY,6BAAKD,IAAaM,IAE9BT,GAA4B,GAC5B2jB,KAdkB,2CAAH,sDAiBbqkL,GAAmB,CACrBl2P,cAAgB/F,EAAO+F,aACvByH,YAAW,iBACPwtP,QADO,IACPA,OADO,EACPA,EAAkBtpP,KAAI,SAAAwqP,GAAe,YAAK,CACtCp8P,OAAQo8P,EACRn2P,cAAgB/F,EAAO+F,aACvBguC,SAAS,UAAAymN,IAA2B18L,EAAUo+L,UAArC,eACL9nM,SADK,IACLA,QADK,EACLA,GAAW8nM,IADN,OAEC9nM,SAFD,IAECA,QAFD,EAECA,GAAW8nM,GACX,gBAPP,QAQA,GACX32P,OAAQ3D,EACRmyC,QAAS2mC,GAAW,OAAGxmB,SAAH,IAAGA,QAAH,EAAGA,GAAaioM,iBAAmB,MAGrDC,GAA2C,WAC7CxkL,KACAsjL,EAA0B,IAAI,GAAM,GACpC1wM,aAAehR,KAAcI,OAC7BvxB,EAAQq0G,UAGN2/H,GACFj1G,GACI60G,GADgC,OAEhCn+L,QAFgC,IAEhCA,OAFgC,EAEhCA,EAAUhU,MACVsyM,IAeF7wG,GAA4B,SAAC17I,GAC/Bu5B,EAAU,6BAA8Bv5B,IAG5CkkB,qBAAU,WACN,IAAMg4H,EAAiCjuF,EACjCA,EAASn7C,MAAMjR,KAAI,SAAA4L,GAAO,OAAIA,EAAQpN,MACtC,GACAosP,EAAkBl1O,aACpB4zO,EACAjvG,GAEAuwG,GAAmBA,EAAgBl5O,OAAS,GAC5C83O,EAA0BoB,GAAiB,KAEhD,CAACtB,EAAkBl9L,EAAUo9L,IA1V9B,OA6VEtnO,mBAAoC,MA7VtC,qBA4VKsoH,GA5VL,MA4ViBC,GA5VjB,MAwWIgB,GAAqB,SAACr5H,GACxB4kB,EAAY5kB,IAIVo9E,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,EAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,GACzColG,YAAoB,OAARlpC,QAAQ,IAARA,OAAA,EAAAA,EAAUn7C,MAAMS,SAAU,IAEpCioO,GAA+B,OACjCzpP,QADiC,IACjCA,GADiC,UACjCA,EAAc68D,kCADmB,aACjC,EAA0Cr7C,OAExCqoI,GAAc/8H,mBAChB,kBACI+6H,EAAcz5H,eAAd,OACI8tC,QADJ,IACIA,OADJ,EACIA,EAAUn7C,MAAMiB,QAAO,SAAAtU,GAAC,cAAI0rP,QAAJ,IAAIA,OAAJ,EAAIA,EAAkB74O,SAAS7S,EAAEY,UAEjE,CAAC8qP,EAAkBvxG,EAAnB,OAAkC3rF,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAUn7C,QAO1C0qF,GAAmB,WACrB6tJ,EAA0B,IAAI,EAAM1+G,IACpCP,IAAe,IA0BbuB,KACAw9G,KAAsBA,EAAiB53O,OAEvCq6H,GAA2Bv8C,GAAY85C,eA8B7C,OACI,qCACI,eAAC9C,GAAD,WACI,eAACX,GAAD,WACI,cAACvf,GAAD,CACInjH,QAAS8xO,GACT/0O,YAAU,oBAFd,SAII,cAAC,GAAD,MAEJ,gCACI,cAACwmI,GAAD,CAAsBxmI,YAAU,qBAAhC,wCAGA,cAACymI,GAAD,CAAuBzmI,YAAU,mBAAjC,0BACKpL,QADL,IACKA,OADL,EACKA,EAAYtC,YADjB,QACyB,WAIhCsQ,IAAYkmE,IAAe,cAAC,KAAD,IAE5B,cAAC,gBAAD,CACIwmB,YAAaA,GACbt+F,KAAI,OAAEk7D,QAAF,IAAEA,OAAF,EAAEA,EAAUn7C,MAChB0/E,SAAU/yB,MAAc48K,gBACxBr+I,qBAAqB,SACrB1L,UAAWA,EACXD,sBAAuB,CACnB33B,aAlgBD,GAmgBCC,UAAS,OAAE1M,QAAF,IAAEA,GAAF,UAAEA,EAAUn7C,aAAZ,aAAE,EAAiBS,OAC5BR,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtB8gB,eAAgBzhC,EAChBshC,cAAe03B,EACfr3B,aAAa,EACb37D,OAAQ,IACRJ,UAAW0vE,EAAQk6D,oBAEvBnrC,sBAAuB/uB,EAAQm6D,kBAC/Bh3C,wBACInjB,EAAQo6D,qCAEZx/H,eAAgBmiP,EAChBzmL,cACIsmL,EAAYn9I,MAAM96F,OAAS,EACrB,SAAAlP,IAvcE,SAACA,GACrBsnP,EAAoBp4O,OAAS,IAC7Bm4O,EACI1lO,EAAmB3hB,EAAOsnP,EAAqBz2O,IAEnDqxH,KAmcsBsmH,CAAoBxoP,SAExB1S,EAEVosG,2BAA4B,CACxBj2B,cAAeA,GACfC,YAAaA,GACbjjE,SAAU,0BAEd84F,kBAAmB,CACfjB,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBrzE,EAChBszE,sBAAuBhM,GAAY65C,cACnCpmI,SAAU,uBAEd23F,8BACKwxC,kBAAck9G,KACdl9G,kBAAchgF,GACnByuC,oBAAqB,CACjB7xB,YAAaA,GACbF,eAAc,OAAEwgL,QAAF,IAAEA,OAAF,EAAEA,EAAkB53O,OAClCR,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtBygB,aA1iBL,GA2iBK8iC,iBAAkBA,GAClBr0E,YA1HJ,WAChB,IAAMhxB,EACD81D,GACGA,EAASn7C,MAAMjR,KAAI,qBAAExB,OACzB,GACJgrP,EAA0BlzP,GAAS,GAAO,GAC1Ci0I,IAAe,IAqHK3uC,kBAAmB,CACfj5F,SAAUo3I,GAAYtwG,yBACtBmpD,cAAemnD,GAAYvwG,qBACrB15C,EACA,gCACNunG,oBACI0iD,GAAYp7H,oBACR8pO,IAAyBh8L,aAEvB,CAACjpD,KAAgBkoD,cACjB,GACV0rC,mBACI2iD,GAAYrwG,qBACR++M,IAAyBh8L,aAEjCuc,YAAaA,GACb93D,WAAU,OAAEk7C,QAAF,IAAEA,OAAF,EAAEA,EAAUhU,MACtB++C,uBAAwBr0C,KAGhCi4C,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIy0G,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,KACtBu+G,mBACIh+I,EAAa68D,4BACb,GAEJohF,2BACI0L,MAVhB,SAeK,SAACz8I,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACN5sB,UACKzS,EAAa0B,WACT8f,OAAS,GAGJ,IAFNiyH,GACIzzI,KAER07I,GAEJ9xF,WAAYlqB,EACZ6zG,aACIqmH,GACAA,EAAoBp4O,OAChBioO,GAER12O,SAAS,6BAM7B61D,WAAmB,OAAR1M,QAAQ,IAARA,OAAA,EAAAA,EAAUhU,OAAV,iBACFgU,QADE,IACFA,OADE,EACFA,EAAUhU,MADR,YAEmB,KAAZ,OAARgU,QAAQ,IAARA,OAAA,EAAAA,EAAUhU,OAAc,OAAS,SAErC,GACN8iD,kBAAmB,4BAEvB9K,8BAA+B,CAC3BE,sBACKxtF,GAAuC,KAApB,OAARspD,QAAQ,IAARA,GAAA,UAAAA,EAAUn7C,aAAV,eAAiBS,QACjC+9E,iBAAkB,CACd7sF,KAAMuqI,GACN7zI,KAAM,eACN2J,SAAU,gBAEdysF,uBAAwB,CACpBh4C,WAAY,QACZz0C,SAAU,mBAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QACImhI,KAAgC9hE,GACpCe,YApMM,SAAC/wB,GAC3BsxM,GAAuBtxM,EAAM5E,OAAO1qC,SACpC6gI,IAAe,IAmMKnnI,KAAM,GACNH,SAAU,gCAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,QACP1F,MAAO,IACJwsP,IAJF,IAKDrnP,SAAU6sF,GAAY85C,eACtBrmI,SAAU,iBAEd,CACIC,MAAO,WACP1F,MAAO,GACPmF,SAAU6sF,GAAY85C,eACtBrmI,SAAU,mBAZT,2BAeDC,MAAO,gBACP1F,MAAO,IACJysP,IAjBF,IAkBDtnP,SAAU6sF,GAAY85C,eACtBrmI,SAAU,8BAIlBwrF,UAAW,CACPI,kBAxME,SAAC71C,EAAYxhD,IAnNZ,SAAC4sB,EAAQ5sB,GAChC4sB,EAAEC,kBACI7sB,EAAKgH,IACP+qP,EAAuB/xP,EAAKgH,IAiNhCysP,CAAmBjyM,EAAOxhD,GAC1B+yI,IAAe,IAuMK37C,aAlNE,SAACp3F,GAAD,QACpB8xP,KAAsB9xP,EAAKgH,IAAM8qP,EAAiB74O,SAASjZ,EAAKgH,KAkN9C4E,KAAM,GACN0rF,gBAjMK,SAACt3F,GAC1B,OAAOgzI,MAAU,OAAKhzI,QAAL,IAAKA,OAAL,EAAKA,EAAI,KAkMNi2F,kBAAmB,SAACj2F,GAAD,MAAmB,CAClCmQ,gBAAoB,OAAJnQ,QAAI,IAAJA,OAAA,EAAAA,EAAMjH,SAAU,GAChCo7E,kBAAmB,CACfnoE,KAAgBwhM,2BAGxB/hM,SAAU,YAEVyrF,MAAO,CACH,CACIR,UAAW,eACX1wF,MAAO,GACP4xF,cAAeriB,EAAQu6D,gBACvBj5C,wBAAyB,SAAC72F,GAAD,OACrB,eAACqvI,GAAD,WACI,cAAC5qE,IAAA,EAAD,CACI/8D,KAAMsrI,KAAehzI,EAAKgH,GAC1Bs7C,WAAY,WA/S7B,IAAC4wB,KAgTuClzE,EAAKgH,KA7ShEisI,GADAD,KAAe9/D,EACD,KAEAA,IA6SsB/iE,gBACQ,OAAJnQ,QAAI,IAAJA,OAAA,EAAAA,EAAMjH,SAAU,GAEpB0S,SAAS,qBAEb,eAACypF,GAAD,WACI,cAACD,GAAD,CACI9lF,QAASnP,EACT4L,KAAK,KACLo6D,YAAa,EACbv6D,SAAS,qBAEb,cAAC6tD,GAAA,EAAD,CACIC,UACIpqD,GACAA,EAAQnI,KAAOhH,EAAKgH,GAExByE,SAAS,iBALb,mBAMKzL,EAAKkmC,UANV,YAMuBlmC,EAAKomC,oBAK5C,CACIswD,UAAW,aACXkB,cAAeriB,EAAQu6D,gBACvB9pI,MAAO,GACPyxD,oBAAqB,SACjBz3D,GADiB,QAEhB,OAACkrD,SAAD,IAACA,QAAD,EAACA,GAAWlrD,EAAKgH,OAAQhH,EAAK6qC,SACnC8rD,WAAY,CACRrB,YAAa,SAACt1F,GAAD,QACA,OAARkrD,SAAQ,IAARA,QAAA,EAAAA,GAAWlrD,EAAKgH,MACbhH,EAAK6qC,UACTvhB,cACY,OAAR4hC,SAAQ,IAARA,QAAA,EAAAA,GAAWlrD,EAAKgH,MACXhH,EAAK6qC,UAElBp/B,SAAU,uBAGlB,CACIirF,UAAW,aACXkB,cAAeriB,EAAQu6D,gBACvB9pI,MAAO,GACPyxD,oBAAqB,SACjBz3D,GADiB,OAEfA,EAAKgxM,cACXr6G,WAAY,CACRrB,YAAa,SAACt1F,GAAD,OACTkpB,aAAU,OAAClpB,QAAD,IAACA,OAAD,EAACA,EAAMgxM,eACrBvlM,SAAU,gCAGlB,CACIirF,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBn2F,GADqB,OAGrB,cAACovI,GAAD,YACK,OAAC0iH,QAAD,IAACA,OAAD,EAACA,EAAkB53O,SAChB,cAAC,IAAD,CACI23B,QAAS,CACL,CACInmC,MAAO,WACPC,QAAS,kBACL2/C,GACItrD,EAAKgH,KAEb0Z,YAAa,CACT1U,KAAgBkoD,cAEpBzoD,SAAU,gCAc1D,eAACwjI,GAAD,WACI,cAAC,IAAD,CACIjkI,MAAO,SACP/E,OAAQ,OACRD,MAAO,OACPoC,QAAQ,cACRpG,OAAQy7O,GACRhyO,SAAS,kBAEb,cAAC,IAAD,CACIT,MAAO,wBACP/E,OAAQ,OACRD,MAAO,QACPmF,SAAUunP,GACVpnP,QAASsnP,GACT5wP,OAxbY,WAC5B6wP,IAAiB,GACbrhL,GACA2hL,KAEAjB,EAA2Ba,GAAiBzuP,aAC3CuuB,MAAK,kBAAMqgO,QAGhBL,IAAiB,IAgbDpnP,SAAS,8BAIpBq/C,GACG,cAACqB,GAAA,EAAD,CACIzyD,KAAI,6BAAOsxD,IAAP,IAAoBoB,mBAAmB,IAC3C/W,SAAU,kBAAM0V,GAA4B,IAC5CsB,QAASd,SAiEdyoM,IA1DwD,SAAC,GAGjE,IAFHl7F,EAEE,EAFFA,UACAC,EACE,EADFA,eACE,EACcn1C,KAATv6G,EADL,oBAEI8F,EAAU0R,YAAY3R,MACtBpY,EAAmD00I,cACnDrsH,EAAUW,cACV2iO,EAAoBn6G,GAA4BxxI,EAAOkM,QACvD0/O,EAA6B7lM,aAAmB4lM,GAChDr8G,EAAavlH,YAAY+rO,KACzBroH,EAAoBD,KACpBqvH,EAA6B92M,aAAmB0nF,GAChDqvH,EAA2BvuH,KAC3BP,EAAgBD,KAChB9rI,EAASm5B,eACT6/N,EACFrqH,KACEmsH,EACFtsH,KACEgZ,EAAgB4wG,MAEtB,OACI,cAAC,KAAkB37K,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC,GAAD,CACIkgJ,UAAWA,EACXC,eAAgBA,EAChB/yJ,MAAM,MAHV,SAKI,cAAC,IAAD,CACImJ,QAASA,EACTgQ,QAASA,EACTsjO,kBAAmBC,EACnB5rP,OAAQA,EACRm7P,eAAgB0B,EAChB/+L,SAAUvrD,EAAM3P,KAChBo4P,iBAAkBzoP,EAAM+sG,cACxB27I,uBAAwBA,EACxBC,0BACI6B,EAEJv2P,WAAY8oI,EAAW9oI,WACvB4iJ,eAAgB72I,EAAM86I,OACtB74I,QAASjC,EAAMiC,QACf60I,gBAAiBrb,EACjBotH,2BAA4B0B,EAC5BzjP,eAAgBpX,EAAO6iB,SACvB2kI,cAAeA,SC77BtB0zG,IAAY1sP,IAAOC,IAAV,uQAYT0sP,IAAe3sP,IAAOC,IAAV,kGAMZ2sP,IAAa5sP,IAAOC,IAAV,8DCKR4sP,I,oCCvBAC,IDOf,YAGqB,IAFjBnpJ,EAEgB,EAFhBA,aACAj8F,EACgB,EADhBA,UAEA,OAAO,cAACglP,IAAD,UAEChlP,EACM,cAAC,KAAD,CAASrD,KAAM,KACf,qCACE,cAACuoP,IAAD,UAAY,cAAC,IAAD,MACZ,cAACD,IAAD,UAAehpJ,UEjBtBopJ,IAAe/sP,IAAOC,IAAV,uEAIZsmB,IAAYvmB,IAAOC,IAAV,mHAMT+sP,IAAehtP,IAAOC,IAAV,8EAKZytF,IAAS1tF,YAAO+sP,IAAP/sP,CAAH,8FAMNitP,IAAUjtP,IAAOC,IAAV,gFAKPitP,IAAWltP,YAAO+sP,IAAP/sP,CAAH,qEAKRmtP,IAAiBntP,YAAO+sP,IAAP/sP,CAAH,0FAMdotP,IAAcptP,YAAO+sP,IAAP/sP,CAAH,6FAMXqtP,IAAoBrtP,YAAO+sP,IAAP/sP,CAAH,sHCdfsqN,IC7BAE,IDWf,YAA6D,IAAhC8iC,EAA+B,EAA/BA,QACzB,OAAO,eAAC,IAAD,WACH,eAACN,IAAD,WACI,cAAC,IAAD,IACA,eAACC,IAAD,WACI,cAACC,IAAD,IACA,cAACC,IAAD,UAGR,cAACL,IAAD,CACIplP,WAAY4lP,EACZ3pJ,aAAa,4CAEjB,cAACypJ,IAAD,IACA,cAACC,IAAD,QElBOE,I,wDCEXC,ICTWC,IFAf,WACI,OAAO,cAAC9kC,GAAD,CACHxkN,MAAM,oDACNukC,YAAY,kOGHPglN,IAAe1tP,IAAO0nB,KAAV,6JACR,SAAAxnB,GAAK,OAAS,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOzB,QAAS,OC4BpCsvH,IAAc/tH,IAAOC,IAAV,4oBACC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOqB,kBAkCxCooQ,IAAe3tP,IAAOC,IAAV,gUAiBZ2tP,IAAa5tP,IAAOC,IAAV,yFAKV4tP,IAAe7tP,IAAOC,IAAV,oSAkBZ6tP,IAAc9tP,IAAOC,IAAV,2RAiBXq0B,IAAQt0B,IAAOC,IAAV,gJAQL8tP,IAAkB/tP,IAAOC,IAAV,+MAKJ,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAOvCypQ,IAAkBhuP,IAAOC,IAAV,yEAKfguP,IAAcjuP,IAAOC,IAAV,mGAMJiuP,IAWR,SAAC,GAWC,IAAD,MAVFxpC,EAUE,EAVFA,oBACAC,EASE,EATFA,eACAziN,EAQE,EARFA,YACA2yM,EAOE,EAPFA,WACAs5C,EAME,EANFA,iBACApqP,EAKE,EALFA,QACAqqP,EAIE,EAJFA,eACAx2O,EAGE,EAHFA,QACAqzM,EAEE,EAFFA,yBACAC,EACE,EADFA,+BAoBA5hL,YAAiB,gBAAiB,CAAC,GAAD,cAC3BurK,QAD2B,IAC3BA,GAD2B,UAC3BA,EAAY9+M,kBADe,aAC3B,EAAwBtC,MADG,iBAE3BohN,QAF2B,IAE3BA,OAF2B,EAE3BA,EAAYp8M,KAAKkmC,UAFU,mBAEGk2K,QAFH,IAEGA,OAFH,EAEGA,EAAYp8M,KAAKomC,YAGtD,IAAMwvN,EAAY,iBAAMx5C,QAAN,IAAMA,OAAN,EAAMA,EAAYp8M,KAAKkmC,UAAvB,mBAAoCk2K,QAApC,IAAoCA,OAApC,EAAoCA,EAAYp8M,KAAKomC,UAEvE,OACI,cAAC,GAAD,CACI0yH,UAAW,uBACXC,gBAAgB,EAChB/yJ,MAAM,OACNkzJ,kBAAmBzvJ,EAJvB,SAMI,cAAC,IAAD,CAAaiC,MAAM,wBAAnB,UACM0wM,GAAc9wM,EACZ,cAAC,IAAD,CAAeupP,QAASc,IAExB,sBAAKzqP,MAAO,CAAE+4D,SAAU,YAAxB,UACI,eAACkxL,IAAD,WACI,eAACE,IAAD,WACI,cAACviN,GAAA,EAAD,CACI3jC,QAASitM,EAAWp8M,KACpB4L,KAAK,KACL/F,UAAU,WAEd,eAAC0vP,IAAD,CAAiBrqP,MAAO,CAAEX,MAAO,QAAjC,UACI,cAAC0qP,IAAD,CACIjvP,MAAO,IACP0F,MAAOkqP,EAFX,SAIKA,IAEL,eAACJ,IAAD,wBAtCb,SAACp5C,GAChB,IAAM50L,EAAO,IAAIE,KAAK00L,EAAW74D,WACjC,MAAM,GAAN,OAAUl7H,aAAab,GAAvB,eAAmCwB,aAAWxB,IAqCH0B,CAAWkzL,YAIlC,eAACg5C,IAAD,WACI,+BACKh5C,EAAWmK,SACNvsM,KAAKqpI,MAC8B,IAA/B+4D,EAAWmK,SAASA,UAExB,IAEV,gCACI,oCACA,oDAIXnK,EAAWxoK,UACR,cAAC,GAAD,CACI/tC,UAAU,QACVoiC,IAAKm0K,EAAWxoK,SAChBg1K,gBAAiB,kBACbqD,EAAoB7P,EAAWp1M,KAEnC6hN,WAAYqD,EACZpD,aAAc4sC,KAGpBt5C,EAAWxoK,UACT,cAACygN,IAAD,CACIplP,WAAW,EACXi8F,aAAa,6CAGrB,sBAAKhgG,MAAO,CAAEgrH,SAAU,KAAxB,UACI,cAAC,IAAD,oBAAQkmF,EAAWhkK,gBAAnB,aAAQ,EAAqB1sC,QAC7B,eAAC4pP,IAAD,iCACwB,IACpB,sBACI3pP,QAAS,kBA3FrC/U,EA6FoCwlN,EAAWp8M,KAAKgH,GA5FpDnC,EA6FoCu3M,EAAWv3M,kBA3F/Csa,EAAQH,KACJluB,IAAOiE,gBAAgBmC,QACnB,UACAN,EAAOO,YACTD,QAAQ,gBAAiB2N,EAAa1N,YACxC,CAAEm8H,WAAW,IATc,IAC/B18H,EACAiO,GAyFwB,mBAQKu3M,EAAW9+M,kBARhB,aAQK,EAAuBtC,aAIpC,cAACk6P,IAAD,CAAcvpP,QAASlC,EAAvB,SACI,cAACmyD,GAAA,EAAD,MAEH42J,GACG,cAAC3C,GAAD,CACIt4L,QAASk7L,YAU5BojC,IAAqB,WAC9B,IAAMlH,EAAoBzzC,KACpB/7L,EAAUW,cACVhpB,EAAmC00I,cAHL,EAIY9gH,oBAAS,GAJrB,mBAI7BgrO,EAJ6B,KAIXI,EAJW,OAMhCprO,oBAAS,GANuB,mBAK7B8nM,EAL6B,KAKHmC,EALG,KAO9BohC,E1PoQyB,WAC/B,IAAM18O,EAAcnQ,cAOpB,OAAO3R,uBAAY,SAAC6kN,GAChB,IAAMl0M,EAAU,4BACTk0M,EAAWp8M,KAAX,gBAA2Bo8M,EAAWp8M,KAAKkmC,UAA3C,YAAwDk2K,EAAWp8M,KAAKomC,UAAa,KACrFg2K,EAAWhkK,SAAX,wBAAuCgkK,EAAWhkK,SAAS1sC,OAAU,IAF5D,0BAGSw8B,OAAO7oB,SAASopB,MACrC7B,aAAoB1+B,IACpBmR,EAAY,2BAA4B,aAE7C,CAACA,I0PpRqB28O,GACnBh9N,EAAegsC,eAEfyvJ,EAAwBnU,KACxBkU,EAAuB5V,KAevBv1M,EAAa8V,EAAQE,SAAShW,MAC9B2rN,IAAe,OAAC3rN,QAAD,IAACA,OAAD,EAACA,EAAOiqH,WAE7BzoG,qBAAU,WACFmqM,EACAP,EAAsB39N,EAAO6K,cAE7B6yN,EAAqB19N,EAAO6K,gBAEjC,CACC6yN,EACAC,EACA39N,EAAO6K,aACPqzN,IAGJ,IAAMvrN,EAAc,SAAC+pH,GACbA,EACAr0G,EAAQq0G,SAERr0G,EAAQH,KAAK,mBAIrBq5I,GAAY,UAAU,kBAAM5uJ,GAAaurN,MAOzC,IAAM9I,EAAiB30N,uBAAY,WAC3Bo3P,EAAkBxiN,UACdnT,EAAa3gC,IAAI,2BACjB09P,EAAiBpH,EAAkBxiN,SAEnCwoL,GAA4B,MAGrC,CAACg6B,EAAkBxiN,QAAS4pN,EAAkB/8N,IAO3Cy5L,EAAiCl7N,uBAAY,WAC/Co9N,GAA4B,GAC5BohC,EAAiBpH,EAAkBxiN,SACnCnT,EAAaoqB,IAAI,2BAA2B,KAC7C,CAACurM,EAAkBxiN,QAAS4pN,EAAkB/8N,IAIjD,OAFAq/H,GAAY,UAAU,kBAAM5uJ,KAAa,OAACJ,QAAD,IAACA,OAAD,EAACA,EAAOiqH,eAE1Cq7H,EAAkBxnP,OAAS6tN,EAC9B,cAACggC,IAAD,IAEA,cAAC,IAAD,CACI54C,WAAYuyC,EAAkBxiN,QAC9B8/K,oBAxEoB,WAAO,IAAD,MAC9B6pC,GAAoB,GAEpB,IAAM7tN,EAAG,UAAG0mN,EAAkBxiN,eAArB,aAAG,EAA2ByH,SACjC+zB,EAAQ,UAAGgnL,EAAkBxiN,eAArB,iBAAG,EAA2BiM,gBAA9B,aAAG,EAAqC1sC,MAElDu8B,GAAO0/B,GACPU,aAAwBpgC,EAAK0/B,GACxB90C,MAAK,kBAAMijO,GAAoB,MAC/B/iO,OAAM,kBAAM+iO,GAAoB,OAgErC5pC,eAAgBA,EAChBziN,YAAa,kBAAMA,GAAaurN,IAChC71M,QAASA,EACTu2O,iBAAkBA,EAClBpqP,UAAWqjP,EAAkBrjP,WAAaqjP,EAAkBxnP,MAC5DwuP,iBAAkBhH,EAAkBxnP,MACpCqrN,yBAA0BA,EAC1BC,+BAAgCA,K,WC9XtCj9C,IAAUjuK,IAAOC,IAAV,sOAOK,SAAAC,GAAK,OAAI6sC,aAAK7sC,EAAMI,MAAMpc,OAAOyC,SAAU,OAMvDwoC,IAAUnvB,IAAOC,IAAV,iXAIC,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOK,YAI7B,SAAA2b,GAAK,OAAIA,EAAMI,MAAMpc,OAAOa,SAMrB,SAAAmb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOa,SAK9B,SAAAmb,GAAK,OAAIA,EAAMI,MAAMpc,OAAOa,SAMxC2pQ,IAAe1uP,IAAOC,IAAV,uJAQZswD,IAAUvwD,IAAOC,IAAV,kPAYA0uP,IAAgB,SAAC,GAA2C,IAAzCxuP,EAAwC,EAAxCA,KAAMyuP,EAAkC,EAAlCA,cAAkC,EAAnB5+N,QAGjD,OACI,cAAC,IAAD,UACK7vB,GACG,cAAC,IAAD,UACI,eAAC,IAAD,CAAS7B,UAAWswP,EAAgB,IAAM,GAAK,YAA/C,UACI,cAACF,IAAD,IACA,cAAC1rO,IAAA,EAAD,CAAkB6rO,UAAW,EAAGxqP,KAAI,OAAUxD,QAAS,cAAegF,MAAO+oP,IAAkBA,EAAgB,IAAhB,UAAyBA,EAAzB,KAA4C,cAAC,GAAD,CAAWtwP,UAAU,kB,WJ3DpLkvP,IADA7sN,OAAO7oB,SAASopB,KAAKxvB,SAAS,wBACrB,+BACFivB,OAAO7oB,SAASopB,KAAKxvB,SAAS,yBAC5B,gCACFivB,OAAO7oB,SAASopB,KAAKxvB,SAAS,iBAC5B,2BAEA,+BAGb,IKvBYo9O,ILuBNC,IAAS9yN,KAAQnrC,IAAI,SAAW,IAAIk+P,iBAAJ,UAC/BxB,IAD+B,wBACTvxN,KAAQnrC,IAAI,WACrC,KAEEm+P,IAAY,CACd,CACI/9N,IAAK,iBACLysC,MAAO,WAEX,CACIzsC,IAAK,4BACLysC,MAAO,WAEX,CACIzsC,IAAK,oBACLysC,MAAO,WAEX,CACIzsC,IAAK,sBACLysC,MAAO,YAwHAuxL,IApHM,WAAO,IAAD,EACa/rO,mBAAS,GADtB,mBAChB6jC,EADgB,KACJD,EADI,OAEK5jC,oBAAS,GAFd,mBAEhByqD,EAFgB,KAERuhL,EAFQ,KAGjB/mB,EAAoB9uN,YAAYguN,KAChCjmO,EAAWO,cACXkQ,EAAcnQ,cACdjR,EAAQurC,KAAQnrC,IAAI,SANH,EAOwBqyB,qBAPxB,mBAOhBisO,EAPgB,KAOCC,EAPD,KASjBvtE,EAAW9xL,uBACb,SAACq1B,GAEO2hC,EAAa,GAAKA,EAAa,MAE/B3hC,EAAEkmJ,iBACFlmJ,EAAE08J,aAAc,KAGxB,CAAC/6H,IAmFL,OA/EA1jC,qBAAU,WACN,IAAK5yB,GAASq+P,IACVA,IAAOO,aACJ,GAAI5+P,IAAUq+P,IAAQ,CACzB,IAAIQ,EAAWN,IAAUhuP,KAAI,SAAAmS,GAAI,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAM8d,OAErC69N,EAAS,IAAIC,iBAAJ,UACRxB,IADQ,wBACcvxN,KAAQnrC,IAAI,WAGzCu+P,EAAoBN,GACpBA,EAAO1jI,UAAY,SAACrxE,GAChB,IAAM7nD,EAAOw/B,KAAKC,MAAMooB,EAAU7nD,MAC9Bq9P,EAAOr9P,EAAKuvC,QAAQslB,WACpB91B,EAAM/+B,EAAK8nD,MAEXs1M,EAAS79O,SAASwf,IAClB61B,EAAcyoM,IAItBT,EAAOU,QAAU,SAAUx1M,GACvBnoC,EAAY,kCAAmC,eAE3CphB,IACRq+P,KAAUA,IAAOO,QACjBF,GAAmBA,EAAgBE,WAIxC,CAAC5+P,IAEJ4yB,qBAAU,WACN,IAAIisO,EAAWN,IAAUhuP,KAAI,SAAAmS,GAAI,cAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAM8d,OAEhB,KAAjB,OAAN69N,UAAM,IAANA,SAAA,EAAAA,IAAQW,cAERX,IAAO1jI,UAAY,SAACrxE,GAChB,IAAM7nD,EAAOw/B,KAAKC,MAAMooB,EAAU7nD,MAC9Bq9P,EAAOr9P,EAAKuvC,QAAQslB,WACpB91B,EAAM/+B,EAAK8nD,MAEXs1M,EAAS79O,SAASwf,IAClB61B,EAAcyoM,IAItBT,IAAOU,QAAU,SAAUx1M,GACvBnoC,EAAY,kCAAmC,aAIxD,CAACi9O,IAAD,OAASA,UAAT,IAASA,SAAT,EAASA,IAAQW,aAGpBpsO,qBAAU,WAEN,OADAqd,OAAO6Z,iBAAiB,eAAgBsnI,GACjC,WACHnhJ,OAAOga,oBAAoB,eAAgBmnI,MAEhD,CAACA,IAIJx+J,qBAAU,WACF0jC,EAAa,GAAKA,EAAa,IAC/BmoM,GAAU,GACY,MAAfnoM,GACPvlD,YAAW,WACPJ,ElhB7HL,CACHrG,KAAMuN,GAAQonP,uBkhB6HNluP,YAAW,WACPslD,EAAc,KACf,QAEJ,OAER,CAAC1lD,EAAU2lD,IAGV4mB,GAAWw6J,EAKX,8BACKA,GAAqBx6J,GAAU,cAAC,IAAD,CAC5BghL,cAAe5nM,EACf7mD,MAAM,MAPP,MMpJDgC,IAAkC,CAC5C,UAAW,UACX,UAAW,UACX,UAAW,UACX,UAAW,UACX,UAAW,YACX,UAAW,UACX,YAAa,UACb,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,UAAW,YACX,UAAW,UACX,UAAW,YACX,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,SAAU,UACV,UAAW,UACX,UAAW,YACX,UAAW,YACX,UAAW,UACX,UAAW,YACX,UAAW,UACX,UAAW,UACX,UAAW,UACX,UAAW,YACX,UAAW,UACX,UAAW,YACX,UAAW,UACX,UAAW,UACX,WAAY,UACZ,QAAS,UACT,QAAS,UACT,cAAe,UACf,WAAY,UACZ,WAAY,UACZ,aAAc,UACd,UAAW,UACX,UAAW,UACX,UAAW,UACX,UAAW,UACX,aAAc,UACd,aAAc,UACd,aAAc,UACd,aAAc,UACd,aAAc,UACd,UAAW,UACX,UAAW,UACX,MAAS,UACT,SAAU,UACV,SAAU,UACV,SAAU,Y,SD9DF2sP,K,cAAAA,E,sBAAAA,E,aAAAA,U,KEAG,I,wBAAA,QAA0B,gDCA1B,QAA0B,mDCA1B,QAA0B,mDCA1B,QAA0B,+CCA1B,QAA0B,kDCA1B,QAA0B,kDCA1B,QAA0B,8CCA1B,QAA0B,iDCA1B,QAA0B,iDCA1B,yzWCAA,QAA0B,+CCE5Bc,IAAoB5vP,IAAOC,IAAV,4ZAkBjB4vP,IAAiB7vP,IAAOC,IAAV,8aAoBd6vP,IAAqB9vP,IAAOC,IAAV,0aAoBlB8vP,IAAkB/vP,IAAOC,IAAV,kWAiBf+vP,IAAwBhwP,IAAOC,IAAV,mIAOrBgwP,IAAkBjwP,IAAOC,IAAV,8JCNbiwP,I,oBC5EAA,IDsBf,WACI,IAAMrlM,EAAmB9V,eACnBD,EAAW+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYE,MAC1DqnQ,GAAYr7M,GAAY+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYM,aACvEknQ,EAAWvlM,EAAiBpsD,OAASxa,IAAU2E,YAAYM,aAMjE,OAJAogD,YACI,sEAIA,cAAC01D,EAAA,EAAD,CAAkB3qD,mBAAoB,IAAtC,SACI,eAACu7M,IAAD,WACA,eAACC,IAAD,WACI,cAACC,IAAD,qCACA,cAACC,IAAD,0DACA,cAACC,IAAD,mLAGA,eAACC,IAAD,WACI,mBAAG/uN,KAAK,qDAAqDmU,OAAO,SAASmqD,IAAI,aAAjF,SACI,qBAAKl7F,IAAK+rP,IAAe5xP,MAAM,QAAQC,OAAO,OAAO6F,IAAI,gCAE7D,mBAAG28B,KAAK,sEAAsEmU,OAAO,SAASmqD,IAAI,aAAlG,SACI,qBAAKl7F,IAAKgsP,IAAiB7xP,MAAM,QAAQC,OAAO,OAAO6F,IAAI,kCAItEuwC,GACG,qBACIxwC,IAAKisP,IACLt7M,OAAM,UAAKu7M,IAAL,gBAA6BC,IAA7B,OACNlsP,IAAI,KAGX4rP,GACG,qBACI7rP,IAAKosP,IACLz7M,OAAM,UAAK07M,IAAL,gBAA8BC,IAA9B,OACNrsP,IAAI,KAGX6rP,GACG,qBACI9rP,IAAKusP,IACL57M,OAAM,UAAK67M,IAAL,gBAA+BC,IAA/B,OACNxsP,IAAI,WEtET,QAA0B,8CCA1B,QAA0B,iDCA1B,QAA0B,iDCA1B,QAA0B,6CCA1B,QAA0B,gDCA1B,QAA0B,gDCA1B,QAA0B,4CCA1B,QAA0B,+CCA1B,QAA0B,+CCE5BqrP,IAAoB5vP,IAAOC,IAAV,6ZAkBjB4vP,IAAiB7vP,IAAOC,IAAV,4cAqBd8vP,IAAkB/vP,IAAOC,IAAV,kWAiBf+vP,IAAwBhwP,IAAOC,IAAV,mIAOrB+wP,IAAmBhxP,IAAOC,IAAV,uDCcdgxP,I,gCC7EAA,IDqBf,YAAmE,IAApCC,EAAmC,EAAnCA,WACrBrmM,EAAmB9V,eACnBD,EAAW+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYE,MAC1DqnQ,GAAYr7M,GAAY+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYM,aACvEknQ,EAAWvlM,EAAiBpsD,OAASxa,IAAU2E,YAAYM,aAIjE,OAFAogD,YAAiB,8BAGb,cAAC01D,EAAA,EAAD,CAAkB3qD,mBAAoB,IAAtC,SACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,yCACA,cAAC,IAAD,2EAGA,cAAC28M,IAAD,UACI,cAAC,IAAD,CACItyP,OAAO,OACPD,MAAM,QACN4E,YAAY,OACZV,SAAU,GACVlI,OAAQy2P,EALZ,gDAWPp8M,GACG,qBACIxwC,IAAKisP,IACLt7M,OAAM,UAAKu7M,IAAL,gBAA6BC,IAA7B,OACNlsP,IAAI,KAGX4rP,GACG,qBACI7rP,IAAKosP,IACLz7M,OAAM,UAAK07M,IAAL,gBAA8BC,IAA9B,OACNrsP,IAAI,KAGX6rP,GACG,qBACI9rP,IAAKusP,IACL57M,OAAM,UAAK67M,IAAL,gBAA+BC,IAA/B,OACNxsP,IAAI,GACJ9F,MAAM,QACNC,OAAO,gBEvEhB,QAA0B,mDCA1B,QAA0B,sDCA1B,QAA0B,sDCA1B,QAA0B,kDCA1B,QAA0B,qDCA1B,QAA0B,qDCA1B,QAA0B,iDCA1B,QAA0B,oDCA1B,QAA0B,oDCE5BkxP,IAAoB5vP,IAAOC,IAAV,4ZAkBjB4vP,IAAiB7vP,IAAOC,IAAV,+dAsBd6vP,IAAqB9vP,IAAOC,IAAV,0aAoBlB8vP,IAAkB/vP,IAAOC,IAAV,kWAiBf+vP,IAAwBhwP,IAAOC,IAAV,mNAYrBkxP,IAAgBnxP,IAAOC,IAAV,6SAgBbgwP,IAAkBjwP,IAAOC,IAAV,oXAmBf+wP,IAAmBhxP,IAAOC,IAAV,uDCLdmxP,ICvHAA,ID0Bf,YAAwE,IAApCF,EAAmC,EAAnCA,WAC1BrmM,EAAmB9V,eACnBD,EAAW+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYE,MAC1DqnQ,GACDr7M,GACD+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYM,aAC7CknQ,EACFvlM,EAAiBpsD,OAASxa,IAAU2E,YAAYM,aAIpD,OAFAogD,YAAiB,kDAGb,cAAC01D,EAAA,EAAD,CAAkB3qD,mBAAoB,IAAtC,SACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,kCACA,cAAC,IAAD,mCACA,cAAC,IAAD,oJAKA,eAAC,IAAD,oDAC2C,IACvC,gEAFJ,0CAG2B,IACvB,+DAJJ,OAMA,cAAC,IAAD,UACI,cAAC,IAAD,CACI31C,OAAO,OACPD,MAAM,QACN4E,YAAY,OACZV,SAAU,GACVlI,OAAQy2P,EALZ,6CAUJ,cAACC,IAAD,qCACA,eAAC,IAAD,WACI,mBACIjwN,KAAK,qDACLmU,OAAO,SACPmqD,IAAI,aAHR,SAKI,qBACIl7F,IAAK+rP,IACL5xP,MAAM,QACNC,OAAO,OACP6F,IAAI,gCAGZ,mBACI28B,KAAK,sEACLmU,OAAO,SACPmqD,IAAI,aAHR,SAKI,qBACIl7F,IAAKgsP,IACL7xP,MAAM,QACNC,OAAO,OACP6F,IAAI,kCAKnBuwC,GACG,qBACIxwC,IAAKisP,IACLt7M,OAAM,UAAKu7M,IAAL,gBAA6BC,IAA7B,OACNlsP,IAAI,KAGX4rP,GACG,qBACI7rP,IAAKosP,IACLz7M,OAAM,UAAK07M,IAAL,gBAA8BC,IAA9B,OACNrsP,IAAI,KAGX6rP,GACG,qBACI9rP,IAAKusP,IACL57M,OAAM,UAAK67M,IAAL,gBAA+BC,IAA/B,OACNxsP,IAAI,WEhFb8sP,I,QC/BAA,IDOf,WAAwB,IACZr9P,EAASiwI,cAATjwI,KACF4jB,EAAUW,cAMT+4O,EAAiBthQ,uBAAY,WAChC4nB,EAAQH,KAAKluB,IAAOqC,eACrB,CAACgsB,IAEJ,OAAI5jB,IAAS86P,IAAeyC,MACjB,cAACC,IAAD,CACHN,WAAYI,IAEhBt9P,IAAS86P,IAAe2C,UACjB,cAACC,IAAD,CACHR,WAAYI,IAGb,cAACK,IAAD,KE9BI,QAA0B,wCCE5BnpC,IAAaxoN,IAAOC,IAAV,4LASVwoN,IAAmBzoN,IAAOC,IAAV,6SCed2xP,I,oBCxBAA,IDMf,WAII,OAFAtoN,YAAiB,+BAGb,eAAC01D,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACI,qBAAK/vC,IAAKutP,IAAYpzP,MAAM,OAAOC,OAAO,OAAO6F,IAAI,iBAAiBpD,YAAU,gBAChF,cAAC,IAAD,CAAYA,YAAU,cAAtB,oCACA,cAAC,IAAD,CAAkBA,YAAU,oBAA5B,0MAGA,eAAC,IAAD,CAAkBA,YAAU,aAA5B,0BACiB,mBAAG+/B,KAAK,+BAAR,wBADjB,iDEjBC5M,IAAQt0B,IAAOC,IAAV,oIAOLylG,IAAc1lG,IAAOC,IAAV,4JAQX86N,IAAwB/6N,IAAOC,IAAV,0EAKrB+6N,IAAgBh7N,IAAOC,IAAV,6JAQbwtE,IAAkBztE,IAAOC,IAAV,0EC2Cb6xP,QA9Df,YAOgC,IAN5Bx2B,EAM2B,EAN3BA,aACAx1H,EAK2B,EAL3BA,UACAisJ,EAI2B,EAJ3BA,QACAC,EAG2B,EAH3BA,WACAC,EAE2B,EAF3BA,OACAC,EAC2B,EAD3BA,qBAEA,OAAO,qCACH,cAAC,IAAD,CAAO/wP,YAAU,0BAAjB,+BACA,cAAC,IAAD,CAAaA,YAAU,gCAAvB,kGAGA,cAAC,IAAD,UACI,cAAC,MAAD,CACI0E,MAAOy1N,EACP/wM,SAAU2nO,EACVxzP,OAAO,OACPiE,SAAS,OACTopD,WAAW,EACXztD,UAAU,uBACVmF,MAAM,GACNS,SAAS,0BAGjB,cAAC,IAAD,CAAe/C,YAAU,2BAAzB,uFAGA,cAAC,IAAD,UACI,cAAC,IAAD,CACIzC,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZV,SAAU,GACViB,UAAW03N,GAAgBA,EAAa3oN,OAAS,EACjD5O,QAAS+hG,EACT9qG,KAAK,SACLP,OAAQu3P,EACR9tP,SAAS,mBATb,yBAcH6tP,GACG,cAAC,IAAD,UACI,cAAC,IAAD,CACIrzP,OAAO,OACPD,MAAM,OACN4E,YAAY,OACZV,SAAU,GACV9B,QAAQ,UACR7F,KAAK,SACLP,OAAQw3P,EACR/tP,SAAS,mBARb,6BCgBDiuP,ICtEAA,IDUf,YAO4B,IANxB9iQ,EAMuB,EANvBA,OACAisO,EAKuB,EALvBA,aACAy2B,EAIuB,EAJvBA,QACAG,EAGuB,EAHvBA,qBACAF,EAEuB,EAFvBA,WACAC,EACuB,EADvBA,OAEMngP,EAAcnQ,cACd29D,EAAwBlmE,eAFP,EAIW+pB,oBAAS,GAJpB,mBAIhB2iF,EAJgB,KAILO,EAJK,KAWjBo1H,EAAiBzrO,uBAAY,WAC3BX,IACAg3G,GAAa,GAEb/mC,EAAsBjwE,EAAQisO,GACzBhwM,MAAK,SAACpsB,GAE6B,IAAD,GAD/BmnG,GAAa,GACS,UAAlBnnG,EAAOnN,QACP+f,EAAW,UAAC5S,EAAO0B,eAAR,QAAmB1B,EAAO/M,KAAM,SAE3C6/P,OAGPxmO,OAAM,SAAC5rB,GACJA,EAAMgB,SAAWkR,EACO,MAApBlS,EAAM+kC,UAAoBpjC,KAA0BuxD,MAAwBlzD,EAAMgB,QAClF,SAEJylG,GAAa,SAG1B,CACCh3G,EACAiwE,EACAg8J,EACAxpN,EACAkgP,IAGJ,OACI,cAAC,IAAD,CACI12B,aAAcA,EACdx1H,UAAWA,EACXisJ,QAASA,EACTC,WAAYv2B,EACZw2B,OAAQA,EACRC,qBAAsBA,KEbnB7yB,ICnDAA,IDKf,YAK6B,IAJzBhwO,EAIwB,EAJxBA,OACAisO,EAGwB,EAHxBA,aACAt1H,EAEwB,EAFxBA,OACAs4H,EACwB,EADxBA,SAEM8zB,EAAyB94P,cACzBgmE,EAAwBlmE,eAE9BkwC,YAAiB,wBAQjB,IAAM21L,EAAejvO,uBAAY,SAACuJ,GAC9B,OAAKlK,EAEE+iQ,EAAuB/iQ,GAASkK,GAD5BozB,QAAQC,OAAO,CAAEhsB,QAAS,0BAEtC,CAACvR,EAAQ+iQ,IAONlzB,EAAelvO,uBAAY,WAC7B,OAAKX,EAEEiwE,EAAsBjwE,EAAQisO,GAD1B3uM,QAAQC,OAAO,CAAEhsB,QAAS,0BAEtC,CAACvR,EAAQisO,EAAch8J,IAE1B,OACI,cAACm/J,IAAD,CACInD,aAAcA,EACdt1H,OAAQA,EACRs4H,SAAUW,EACVP,gBAAiBJ,EACjBC,SAAUW,K,WEPPmzB,QAnCf,YAU8B,IAT1BhjQ,EASyB,EATzBA,OACAisO,EAQyB,EARzBA,aACAy2B,EAOyB,EAPzBA,QACAO,EAMyB,EANzBA,YACAJ,EAKyB,EALzBA,qBACAF,EAIyB,EAJzBA,WACAC,EAGyB,EAHzBA,OACA3zB,EAEyB,EAFzBA,SACAi0B,EACyB,EADzBA,iBAEA,OACI,eAACvzJ,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,UACKi+M,IAAgB1yL,MAA6B4yL,OAC1C,cAACC,IAAD,CACIpjQ,OAAQA,EACRisO,aAAcA,EACdy2B,QAASA,EACTG,qBAAsBA,EACtBF,WAAYA,EACZC,OAAQA,IAGfK,IAAgB1yL,MAA6BC,UAAYy7J,GACtD,cAAC,IAAD,CACIjsO,OAAQA,EACRisO,aAAcA,EACdt1H,OAAQusJ,EACRj0B,SAAUA,QCyHfo0B,I,oBCxJAC,IDwBf,WAAsC,IAAD,gBAC3B/6O,EAAwBW,cACxBm4F,EAAep3F,YAAYm3F,IAC3B7oG,EAAU0R,YAAY3R,MACtB65G,EAAa1iD,eACbrmE,EAAI,oBACLmf,EAAQE,SAAShW,aADZ,aACL,EAAwBrJ,YADnB,QACsDmP,EAC1D84F,EAAS,oBAAG9oF,EAAQE,SAAShW,aAApB,aAAG,EAAwB4+F,iBAA3B,SACTkyJ,EAAuB,oBACzBh7O,EAAQE,SAAShW,aADQ,aACzB,EAAwB69D,wBADC,QAEzBC,MAA6B4yL,MAC3Bh9O,EAAI,UAAGoC,EAAQE,SAAShW,aAApB,aAAG,EAAwB0T,KAXJ,EAYO2N,mBAAQ,iBAC5C1qB,QAD4C,IAC5CA,OAD4C,EAC5CA,EAAMY,mBADsC,QACvB,IAbQ,mBAY1BiiO,EAZ0B,KAYZC,EAZY,OAgB7Bp4M,mBAAuCyvO,GAhBV,mBAe1BN,EAf0B,KAebO,EAfa,OAiBH1vO,oBAAkB,GAjBf,mBAiB1B4uO,EAjB0B,KAiBjBe,EAjBiB,KAwB3BC,EAAuB/iQ,uBACzB,SAAC+rD,GACG,IAAMi3M,EAAY/2N,KAAQnrC,IAAI,cAC9B,GAAIkiQ,EAGA,GAFA/2N,KAAQqgB,OAAO,cACfb,aAAahjD,EAAMu6P,GACftyJ,EAAW,CAAC,IAAD,MACL1sG,EACFgS,aAAkB,UAACvN,EAAKzE,YAAN,aAAC,EAAWP,OAC9BwS,aAAkB,UAACxN,EAAKzE,YAAN,aAAC,EAAWP,MACxBq7P,IAAeyC,MACfprP,aAAY,UAAC1N,EAAKzE,YAAN,aAAC,EAAWP,MACxBq7P,IAAe2C,UACf3C,IAAevpP,KACzBqS,EAAQH,KACJluB,IAAOE,WAAWc,WAAWoF,QAAQ,QAASqE,SAGlD8nD,aACIlkC,EACAmkC,EACAtjD,EACAu6P,EACAx9O,QAIRsmC,aACIlkC,EACAmkC,EACAtjD,EACAwjC,KAAQnrC,IAAI,SACZ0kB,KAIZ,CAAC/c,EAAMmf,EAAS8oF,EAAWlrF,IAOzBimN,EAAiB,kBACnBo3B,EAAejzL,MAA6BC,SAM1CozL,EAAuB,WACzBJ,EAAejzL,MAA6B4yL,QAkChD,OA/BAlvO,qBAAU,WAAO,IAAD,IACZwvO,EAAU,iBAACpiJ,QAAD,IAACA,GAAD,UAACA,EAAcprC,iBAAf,aAAC,EAAyBC,aAA1B,YACX,CAACmrC,IAGJptF,qBAAU,WACNqd,OAAO/oB,QAAQs7O,UAAU,KAAMlyN,SAAS78B,MAAOw8B,OAAO7oB,SAASopB,MAE/DP,OAAO6Z,iBAAiB,YAAY,SAAUP,GAC1CtZ,OAAO/oB,QAAQs7O,UACX,KACAlyN,SAAS78B,MACTw8B,OAAO7oB,SAASopB,WAGzB,IAEH5d,qBAAU,aACF,OAAC7qB,QAAD,IAACA,OAAD,EAACA,EAAMgH,KAAM4sB,gBACbm1F,MAEL,QAAC/oH,QAAD,IAACA,OAAD,EAACA,EAAMgH,GAAI+hH,IAEdl+F,qBAAU,WACS,IAAD,GAAd,OAAI7qB,QAAJ,IAAIA,OAAJ,EAAIA,EAAMgH,KACN87N,EAAe,UAAC9iO,EAAKY,mBAAN,QAAqB,MAEzC,QAACZ,QAAD,IAACA,OAAD,EAACA,EAAMgH,GAAIhH,EAAKY,cAEnBiwC,YAAiB,qBAGb,cAAC29D,GAAkBa,SAAnB,UACK,SAAA/rD,GAAU,OACP,cAAC,IAAD,CACI1sD,OAAM,OAAEoJ,QAAF,IAAEA,OAAF,EAAEA,EAAMgH,GACd67N,aAAcA,EACdy2B,QAASA,EACTO,YAAaA,EACbJ,qBAAsB32B,EACtBy2B,WAAYv2B,EACZw2B,OAAQ,kBAAMc,EAAqBh3M,IACnCuiL,SAAU,kBAAMy0B,EAAqBh3M,IACrCw2M,iBAAkBU,QEjJzB1iM,IAAUvwD,IAAOC,IAAV,4ZAkBPkzP,IAAcnzP,IAAOC,IAAV,8aAoBXq0B,IAAQt0B,IAAOC,IAAV,kWAiBLylG,IAAc1lG,IAAOC,IAAV,mIAOXgwP,IAAkBjwP,IAAOC,IAAV,8JCabmzP,I,wDC3EAA,IDsBf,WACI,IAAMvoM,EAAmB9V,eACnBD,EAAW+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYE,MAC1DqnQ,GAAYr7M,GAAY+V,EAAiBpsD,MAAQxa,IAAU2E,YAAYM,aACvEknQ,EAAWvlM,EAAiBpsD,OAASxa,IAAU2E,YAAYM,aACzD4qO,EAAa7vF,cAAb6vF,SAIR,OAFAxqL,YAAiB,sDAGb,cAAC01D,EAAA,EAAD,CAAkB3qD,mBAAoB,IAAtC,SACI,eAAC,IAAD,WACI,eAAC8+M,IAAD,WACI,eAAC,IAAD,iBAAWr/B,KACX,cAAC,IAAD,uMAIA,eAAC,IAAD,WACI,mBAAG5yL,KAAK,qDAAqDmU,OAAO,SAASmqD,IAAI,aAAjF,SACI,qBAAKl7F,IAAK+rP,IAAe5xP,MAAM,QAAQC,OAAO,OAAO6F,IAAI,gCAE7D,mBAAG28B,KAAK,sEAAsEmU,OAAO,SAASmqD,IAAI,aAAlG,SACI,qBAAKl7F,IAAKgsP,IAAiB7xP,MAAM,QAAQC,OAAO,OAAO6F,IAAI,kCAItEuwC,GACG,qBACIxwC,IAAKisP,IACLt7M,OAAM,UAAKu7M,IAAL,gBAA6BC,IAA7B,OACNlsP,IAAI,KAGX4rP,GACG,qBACI7rP,IAAKosP,IACLz7M,OAAM,UAAK07M,IAAL,gBAA8BC,IAA9B,OACNrsP,IAAI,KAGX6rP,GACG,qBACI9rP,IAAKusP,IACL57M,OAAM,UAAK67M,IAAL,gBAA+BC,IAA/B,OACNxsP,IAAI,WE5CtBgiB,IAAYvmB,IAAOC,IAAV,mHAMTkvB,IAAUnvB,IAAOC,IAAV,iJASP2gD,IAAkB5gD,IAAOC,IAAV,6HAQf8kI,IAAkB/kI,IAAOC,IAAV,kKAQf+kI,IAAahlI,IAAOC,IAAV,uGAMV+gD,IAAUhhD,IAAOC,IAAV,4JASPglI,IAAiBjlI,IAAO0nB,KAAV,2HAMP,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAGnC8oD,IAAgBvtC,IAAOC,IAAV,yDAIbilI,IAAqBllI,YAAO8kI,GAAP9kI,CAAH,uDAoPTqzP,IArOV,SAAC,GAUC,IAAD,IATFjuH,EASE,EATFA,kBACAC,EAQE,EARFA,eACAC,EAOE,EAPFA,eACAvzI,EAME,EANFA,OACAo9I,EAKE,EALFA,mBACA5J,EAIE,EAJFA,eACA6J,EAGE,EAHFA,2BACA5J,EAEE,EAFFA,gBACAC,EACE,EADFA,QACE,EAC8BtiH,mBAASpxB,GADvC,mBACKU,EADL,KACeizI,EADf,OAEkCviH,qBAAWsiH,GAF7C,mBAEKI,EAFL,KAEiBC,EAFjB,OAGsD3iH,mBAAcgsH,GAHpE,mBAGKI,EAHL,KAG2BC,EAH3B,KAIIh+I,EAASm5B,eACTg7G,EAAapyH,eACbqyH,EAAepyH,eAEfuyH,EAA6B5qB,GAAaiqB,GAEhD9hH,qBAAU,WACFyiH,IACAH,EAAaR,GACbO,OAEL,CACCI,EACAX,EACAO,EACAC,IAGJ,IAAMqJ,GAAgE,oBACjEtM,GAAqBhlG,QAAU,CAAEx5B,MAAO,UAAWD,SAAU,YADI,eAEjEy+H,GAAqBvvI,OAAS,CAAE+Q,MAAO,SAAUD,SAAU,WAFM,GAKhEo3D,GAGL,oBACIhpB,KAAiB3U,QAAU,CACxBx5B,MAAO,cACPD,SAAU,gBAHjB,eAKIouC,KAAiBsb,SAAW,CACzBzpD,MAAO,cACPD,SAAU,gBAPjB,eASIouC,KAAiB1lD,UAAY,CAC1BuX,MAAO,YACPD,SAAU,cAXjB,GAeK8hI,EAAwBh2I,uBAC1B,SAACi2I,EAA4B5gH,GACrBA,EAAEgwB,OAAO1qC,QACT+6H,EAAY,GAAD,oBAAKjzI,GAAL,CAAewzI,KAE1BP,EAAYjzI,EAAS0gB,QAAO,SAAAC,GAAI,OAAIA,IAAS6yH,QAGrD,CAACP,EAAajzI,IAGZk9I,EAAoC3/I,uBACtC,SAACi2I,EAAgC5gH,GAEzBA,EAAEgwB,OAAO1qC,QACT6kI,EAAwB,GAAD,oBAAKD,GAAL,CAA2BtJ,KAElDuJ,EAAwBD,EAAqBp8H,QAAO,SAACC,GAAD,OAAeA,IAAS6yH,QAGpF,CAACuJ,EAAyBD,IAGxB97C,EAAiBzjG,uBAAY,WAC/Bs1I,EAAe7yI,GACf28I,EAA2BG,GAC3BlK,EAAe7zI,EAAO6iB,UACtBsxH,IACAJ,IACAC,EAAgBK,KACjB,CACCP,EACA7yI,EACA88I,EACAlK,EACA7zI,EAAO6iB,SACPkxH,EACAI,EACAyJ,EACA5J,EACAK,IAGEK,EACF10I,EAAO6iB,SAASlB,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KAAGkT,OACrClgB,EAASkgB,QADT,OAEA48H,QAFA,IAEAA,OAFA,EAEAA,EAAsB58H,SACrBkzH,EAAa,EAAI,GAEhBM,EAAiBryH,eASvB,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAACygB,GAAA,EAAD,CACIpwB,MAAO,sBACPD,SAAS,sBAFb,SAII,cAAC,IAAD,UAEQm4B,OAAOtrB,KACHk+H,GAENhuI,KAAI,SAAAmS,GAAI,OACN,cAAC,IAAD,CAAYjS,YAAU,qCAAtB,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,QACI4kI,GACAA,EAAqB79H,SAAS0B,GAElC0S,aAAc,SAAAT,GAAC,OACXsqH,EACIv8H,EACAiS,IAGR5hB,MAAOwrI,EAAe77H,GAAMjP,MAC5B4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAU+qI,EAAe77H,GAAMlP,UAf1BkP,YAqBzB,cAACmhB,GAAA,EAAD,CACIpwB,MAAO,qBACPD,SAAS,oBAFb,SAII,cAAC,IAAD,UACMm4B,OAAOtrB,KAAKuqD,GAAoCr6D,KAC9C,SAAAmS,GAAI,OACA,cAAC,IAAD,CAAYjS,YAAU,mCAAtB,SACI,cAAC2iB,GAAA,EAAD,CAEInZ,QAASlY,EAASif,SAAS0B,GAC3B0S,aAAc,SAAAT,GAAC,OACX2gH,EAAsB5yH,EAAMiS,IAEhC5hB,MAAO63D,EAAYloD,GAAMjP,MACzB4hB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAUo3D,EAAYloD,GAAMlP,UATvBkP,YAgB7B,cAACmhB,GAAA,EAAD,CAAUpwB,MAAO,UAAWD,SAAS,UAArC,SACI,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC4f,GAAA,EAAD,CACInZ,QAASk7H,EACT//G,aAAc,SAAAT,GAAC,OACXygH,EAAczgH,EAAEgwB,OAAO1qC,UAE3BlH,MAAM,UACNsiB,OAAQ9hC,IAAUC,OAAOO,UACzB4f,KAAM,GACN2vB,UAAW/vC,IAAUC,OAAOkB,MAC5B8e,SAAS,YAEb,cAAC,IAAD,CAAoBA,SAAS,6BAIzC,cAACqwB,GAAA,EAAD,CAAUpwB,MAAO,SAAUD,SAAS,uBAApC,SACI,cAAC,IAAD,UACI,cAAC,KAAD,CACI4kB,UAAU,EACVF,mBAAiB,EACjBC,YAAU,WAK1B,eAAC,IAAD,WACI,eAAC,IAAD,CAAgB1nB,YAAU,wBAA1B,UACK+kI,EADL,eAGA,cAAC,IAAD,UACI,cAAC,IAAD,CACItiI,UAAWsiI,EACXrlI,QAAQ,UACRpC,MAAO,QACPhE,OAAQ,kBAxGxB0rI,IACAT,EAAY,IACZ8J,EAAwB,SACxB1J,GAAc,IAsGE5hI,SAAS,uBALb,qBAUJ,cAAC,IAAD,CACIzF,MAAO,QACPhE,OAAQ,kBAAMg5F,KACdvvF,SAAS,uBAHb,iCC1PDovP,IA/DUl1P,sBACrB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,YASOL,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,8BACI,sBACID,KAAK,UACLE,EAAE,mDACF4zB,UAAU,4CAEd,sBACI5zB,EAAE,soBACF4zB,UAAU,sCC9B3BogO,IAvBgBn1P,sBAC3B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNU,KAAK,OAPT,SASI,sBACIC,SAAS,UACTqjD,SAAS,UACTpjD,EAAE,stCACFF,KAAK,sBCyHV+mI,IAlHV,SAAC,GAWC,IAVH40G,EAUE,EAVFA,OACAwY,EASE,EATFA,mBACAC,EAQE,EARFA,YACAC,EAOE,EAPFA,wBACAC,EAME,EANFA,eACAC,EAKE,EALFA,oBACApnM,EAIE,EAJFA,aACA4jL,EAGE,EAHFA,cACA56H,EAEE,EAFFA,SACArkC,EACE,EADFA,gCACE,EAIEhuD,oBAAS,GAJX,mBAEEszE,EAFF,KAGEC,EAHF,KAOIC,EAAqB52D,aACvBi7M,EAAOviP,KAAKgH,GAAG7P,YAGb0/B,EAAanK,iBAAO,MAkB1B,OACI,iCACI,qBAAK9mB,IAAKixB,EAAV,SACI,eAAC,GAAD,CAAcwlF,YAAa,IAAKU,SAAUA,EAAUtxG,SAAS,cAA7D,UACI,cAAC,GAAD,CACIE,QAAS,SAAAihB,GACLA,EAAEC,kBACFkuO,KAEJtvP,SAAS,2BALb,0BASA,cAAC,KAAD,CACIiV,YAAa,CAAC1U,KAAgB2rC,mBADlC,SAGI,cAAC,GAAD,CACIhsC,QAAS,SAAAihB,GACLA,EAAEC,kBA7B1BqxE,GAAmB,kBAAMD,GAA+B,OAgCpCxyF,SAAS,gCALb,mCAUHsoD,GAAiB,cAAC,GAAD,CACdpoD,QAAS,SAAAihB,GACLA,EAAEC,kBACFmuO,KAEJvvP,SAAS,yBALK,wBAUlB,cAAC,GAAD,CACIE,QAAS,SAAAihB,GACLA,EAAEC,kBACFouO,EAAwB1Y,EAAOviP,KAAKgH,KAExCyE,SAAS,4BALb,2BASC0vP,IAAwBxjB,GACrB,cAAC,GAAD,CACI9uK,aAAa,EACbl9D,QAAS,SAAAihB,GACLA,EAAEC,kBACFquO,KAEJzvP,SAAS,+BANb,mCAaXuyF,GACG,cAAC,KAAD,CACInnE,WAAYA,EACZs+C,OAAQ6oB,EACRzmE,QAnEyB,WACrC0mE,GAA+B,IAmEnBx+F,MAAO,CAAC8iP,EAAOviP,KAAKgH,IACpB0xE,gCACIA,QCjIX0iL,IAASz1P,sBAClB,WAAwBC,GAAS,IAA9BC,EAA6B,EAA7BA,UAAWC,EAAkB,EAAlBA,OACV,OACI,sBACIF,IAAKA,EACLM,MAAM,6BACNF,MAAM,OACNC,OAAO,OACPF,QAAQ,YACRF,UAAWA,EANf,YAQOC,GACC,+BACI,yBACIE,MAAM,SACNC,OAAO,SACPG,EAAE,SACFC,EAAE,QACFC,YAAY,oBALhB,UAOI,0BACIC,GAAG,KACHC,GAAG,cACHC,OAAO,uBAEX,gCACID,GAAG,qBACHC,OAAO,mBACPC,aAAa,MAEjB,+BACIF,GAAG,mBACHC,OAAO,qBACPE,OAAO,2EAEX,oCACI,6BAAaH,GAAG,uBAChB,6BAAaA,GAAG,0BAKhC,mBAAGI,KAAK,OAAOC,SAAS,UAAxB,SACI,mBAAGD,KAAK,eAAeC,SAAS,UAAhC,SACI,4BACI,sBACIC,EAAE,s7BACF4zB,UAAU,wDC5C7Bg6C,IAAYC,cAAW,SAAA9sE,GAAK,MAAK,CAC1C0nI,qBAAsB,CAClBvpI,MAAO,iBAEP,2BAA4B,CACxBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,mBAGX,2BAA4B,CACxBA,MAAO,kBAGX,4BAA6B,CACzBA,MAAO,mBAIf+pI,gBAAiB,CACbnhC,eAAgB,2BAIX6J,IAAOlxG,IAAOC,IAAV,8EAKJ6zP,IAA0B9zP,YAAOurC,KAAPvrC,CAAH,6FAMvB+zP,IAAmB/zP,YAAO6zP,IAAP7zP,CAAH,qHAKhB,SAAAE,GAAK,OAAIA,EAAMI,MAAMpc,OAAOmE,qBAG5B2rQ,IAAqBh0P,IAAO0nB,KAAV,wEAClB,SAAAxnB,GAAK,OAAIA,EAAMI,MAAMpc,OAAOkB,SAI5BoiJ,IAAmBxnI,IAAOC,IAAV,mzBC2DvB8xF,IAAKhyE,EAAQ,IAEb+qH,IAAiB,GAEjByvG,IA6BD,SAAC,GAoBC,IAAD,oBAnBF3yO,EAmBE,EAnBFA,QACAtL,EAkBE,EAlBFA,QACA0pD,EAiBE,EAjBFA,KACAiuM,EAgBE,EAhBFA,YACAlwP,EAeE,EAfFA,QACA6E,EAcE,EAdFA,eACAkjO,EAaE,EAbFA,cACArxM,EAYE,EAZFA,QACAlrC,EAWE,EAXFA,OACAg5P,EAUE,EAVFA,eACA2L,EASE,EATFA,gBACAR,EAQE,EARFA,wBACAS,EAOE,EAPFA,eACA9oH,EAME,EANFA,uBACAt0C,EAKE,EALFA,cACAq9J,EAIE,EAJFA,iBACA1Z,EAGE,EAHFA,kBACA/zG,EAEE,EAFFA,YACAyS,EACE,EADFA,cAEMi7G,EAA+B9+G,KAE/BvnE,EAAUb,MACVv1D,EAAUW,cACVlX,EAAWO,cALf,EAMgDuhB,mBAAS,IAAIhD,MAN7D,mBAMKm0O,EANL,KAMwBC,EANxB,OAOwCpxO,mBAAmB,IAP3D,mBAOK0rF,EAPL,KAOoBumI,EAPpB,OAQoCjyN,oBAAkB,GARtD,mBAQK8mD,EARL,KAQkBuhE,EARlB,OAS4DroH,mBAE5D,MAXA,oBASK4kL,GATL,MAS8BlB,GAT9B,SAYkC1jL,mBAChC,MAbF,qBAYKsoH,GAZL,MAYiBC,GAZjB,MAgBIkoH,GACF3tP,aAAkB,OAAC2B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAClCuS,aAAkB,OAAC4B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,MAEhC+4D,GAAex8D,uBACjB,SAACgrP,GAAD,OAAwBA,EAAOjtL,aAAerwB,KAAWtqC,SACzD,IAGEohQ,GACFl4P,GACAA,EAAQ4V,MACHiB,QAAO,SAAA6nO,GAAM,OAAIA,EAAOn+O,cACxBgY,MAAK,SAAAmmO,GAAM,OAAInsI,EAAcn9F,SAASspO,EAAOviP,KAAKgH,SACtDm0P,GAEC78N,GAAoC,CACtClkC,WAAY,GACZ6V,QAAS,GACTmN,SAAUjN,EACV7V,QAAS,KACTL,MAAOuhQ,EACPthQ,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf8kB,eAAgB,IAGdi0G,IACDvoG,GAAQujG,KACR,OAACA,QAAD,IAACA,OAAD,EAACA,EAAap3I,SACfo3I,EAAYz1G,MAAQ8M,KAAa9wC,QAAQuG,KACnCkzI,EAAYp3I,OACZwnC,GAjDR,GA4DED,aAAqB60G,IARrBx6I,GApDF,GAoDEA,aACAg4B,GArDF,GAqDEA,cACA4O,GAtDF,GAsDEA,WACAE,GAvDF,GAuDEA,YACAS,GAxDF,GAwDEA,UACAC,GAzDF,GAyDEA,UACAI,GA1DF,GA0DEA,oBACA7B,GA3DF,GA2DEA,UAEE2mF,GAAwB1C,GAAahqH,IACrCy6I,GAAmBzwB,GAAa1gF,GAAWA,EAAQh7B,IAAI,GACvD6sG,GAA8BvzF,eAE9BjB,GAAWF,EAAQE,SACnB+zH,GAAYr8I,SAASuiG,IAAGngE,MAAM9Z,GAAShjB,QAAQu9F,MAC/Cy5C,GAAgBD,GACF,IAAdA,GACI,GACCA,GAAY,GAAKf,IACtB,EAEA/3I,GAAU5B,GAAa4B,QACvB0hQ,GAAgB3qH,GAAuB,OAAQ/2I,GAASglC,IACxDk3L,GAAiBnlF,GACnB,gBACA/2I,GACAglC,IAEE28N,GAAa5qH,GACf,gBACA/2I,GACAglC,IAGE48N,GAA6B7qH,GAC/B,uBACA/2I,GACAglC,IAEE68N,GAA4B9qH,GAC9B,yBACA/2I,GACAglC,IAEE88N,GAA2B/qH,GAC7B,yBACA/2I,GACAglC,IAGEi3L,GAAgBllF,GAAW,WAAY/2I,GAASglC,IAChDk0G,GAAYnC,GAAW,UAAW/2I,GAASglC,IAE3C+8N,GAAiB,WACnBP,EAAqB,IAAIp0O,MACzBhvB,GAAauB,MAAQo4I,IACrB35I,GAAawB,OAASm5I,GACtBggG,EAAc36O,IACdikP,EAAiB,IACjB5pG,GAAe,IAoBbkB,GAAqB,SAACr5H,GACxBg4H,EAAuBh4H,IAGrBs5H,GAAsB,SAAC56I,GACzB4mC,GAAU,iBAAkB5mC,IAG1B66I,GAAuB,SAAC/G,GAC1B3uG,GAAU,CACNlkC,MAAO,aACP6S,MAAOggI,KAITiV,GAA4B,SAAC17I,GAC/Bu5B,GAAU,6BAA8Bv5B,IAGtCo1O,IACDl4O,GAAYA,IAAYA,EAAQ4V,MAAMS,OAErC2iO,GAAoBtlP,uBACtB,SAACyP,EAAYqC,GAELszO,EADAtzO,EACiB,SAAAoiD,GAAS,6BAAQA,GAAR,CAAmBzkD,KAE5B,SAAAykD,GAAS,OACtBA,EAAU/wC,QAAO,SAAAC,GAAI,OAAIA,IAAS3T,OAG1C+rI,GAAe,KAEnB,CAAC4pG,IAGCvG,GAAmB7+O,uBAAY,YAC7B,OAACg2D,QAAD,IAACA,OAAD,EAACA,EAAMvmD,UAA0B1O,KAAhB,OAAJi1D,QAAI,IAAJA,OAAA,EAAAA,EAAMkwF,YAGnB3mJ,GAAUA,EAAOkM,QACjB+c,YACIZ,EACAruB,IAAOyD,YAAYI,YAAYuC,QAC3B,UACAq2D,EAAKvmD,GAAG7P,YAEZ,CAAEwgP,cAAa,OAAEpqL,QAAF,IAAEA,OAAF,EAAEA,EAAMkwF,cAGhC,CAACt+H,EAASroB,EAAQy2D,IAEfqiJ,GAAsCr4M,uBAAY,WACpD4sG,OACD,IAEGm9C,GAA8B3F,GAChC,SACA,CACI7gJ,UAAS,iBAAEknC,QAAF,IAAEA,OAAF,EAAEA,EAASh7B,UAAX,QAAiB,GAE9BtO,GAL8D,iBAM9DmL,QAN8D,IAM9DA,OAN8D,EAM9DA,EAAS+8C,aANqD,QAM5C,EAClBy7M,IAGExsD,GAA2Bt4M,uBAC7B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KAEd,GAAIw2E,EACA8vE,GAA4B,CAAEx/I,OAAMD,oBAEpC,GAAIu0G,EAAe,CACf,IAAMorC,EAAiBprC,EAAc5tG,KACjC,SAAAxI,GAAI,MACC,CACGuC,KAAM,SACN42I,WAAYn5I,EACZ6E,aAAc,KACdhD,aACAC,WAIZ45P,EACIl6G,EACAouD,OAKhB,CACIp+H,EACA8vE,GACAlrC,EACAslJ,EACA9rD,KAIF0sD,GAA+B/kQ,uBACjC,SAACglQ,GAEOtB,GACAnkQ,GACAA,EAAOkM,QACPu5P,GAEAtB,EACI,CAACsB,GACDzlQ,EAAOkM,OACPtK,MAIZ,CAACuiQ,EAAyBnkQ,EAAQ4B,KAGhCyoJ,GAAmC,WACrCitD,GAA2B,OAGzBhtD,GAAwB7pJ,uBAC1B,SAACmC,GAAe,IACJoI,EAA2BpI,EAA3BoI,KAAYD,EAAenI,EAArBsB,KACVs0M,IASAosD,EACI,CAT6B,CAC7Bn5P,KAAM,SACNsC,aAAc,KACds0I,WAAYm2D,GACZxtM,OACAD,eAKAs/I,MAIZ,CAACu6G,EAAgBpsD,KAGf1wG,GAAkBrnG,uBAAY,WAE5B6+G,GACAA,EAAcl8F,QACd+gP,GACAnkQ,GACAA,EAAOkM,QAEPi4P,EACKzpL,EAA8B,KAAhB4kC,EACft/G,EAAOkM,OACPwuE,EACM2gE,GAAYz5I,GAAcmL,EAAQ+8C,OAClCloD,MAGf,CACC09G,EACA6kJ,EACAnkQ,EACA06E,EACA94E,GACAmL,EAAQ+8C,QAON47M,GAAqC,WACvCtoO,QAAQo7B,UAAUz8B,MAAK,WACnB8pN,EAAiB,IACjB0f,KACAzzP,ElpB9ID,CACHrG,KAAMuN,GAAQ2sP,2BkpB8IVn7M,aAAehR,KAAcG,WAwB/B2xM,GAAsC,CACxC/xL,WAAY,CACRrtD,SAAQ,UAAElM,EAAOkM,cAAT,QAAmB,GAC3BtK,aAAa,6BACNA,IADK,IAERuB,MAAOo4I,IACPn4I,OAAQs3E,EAAW,OAAG3tE,QAAH,IAAGA,OAAH,EAAGA,EAAS+8C,MAAQw1D,EAAcl8F,SAEzDkiI,gBAAkB5qE,OAA8Bl5E,EAAhB89G,EAChCtY,WAAU,iBAAEsY,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,cAAjB,QAA2B,GAEzC8zC,UAAYwjB,EAAkC,sBAApB,mBAKtB6mK,GACJl8F,GACA,CACIxsF,WAAYusF,GACZtsF,eAAgBgsM,EAChB/rM,sBAAuBuyL,IAE3B,iBACAoa,IATA9hH,6BAiBEgiH,GAA0B,SAAC9hP,GAEzB42D,EACA6mK,KAEAxkI,GAA4B,CACxB7+D,WAAY,UACZ/E,YACI,oGACJkF,iBAAkB,UAClBD,kBAAmB,UACnBD,WAAY,SACZG,UAAW,kBA3DqB,SACxCgjC,GACQ,IAAD,EACmBthF,EAAlBkM,cADD,MACU,KADV,GAEF2nC,GAAQytC,IAAoBp1E,GAC7B44P,GACK54P,OACD1K,EACA8/E,GACFvlD,MAAK,WACH2pO,QAiDiBG,CAAoC/hP,OAM3Do9E,GADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAY1B,GAAa0B,WACzBm3I,eAAgBpF,GAAyBzzI,IACzColG,YAAmB,OAAPj6F,QAAO,IAAPA,OAAA,EAAAA,EAAS4V,MAAMS,SAAU,IAGzC2Q,qBAAU,WACFu6F,KACA1sH,GAAauB,MAAQo4I,IACrB35I,GAAawB,OAASm5I,GACtBggG,EAAc36O,OAGnB,CAAC26O,EAAe36O,GAAc0sH,KAEjCv6F,qBAAU,WACFsoH,IACAh0H,EAAQH,KAAKluB,IAAOwD,SAEzB,CAAC6+I,GAAkBh0H,IAEtB0L,qBAAU,YACFilO,GAAkB2L,IAAiBn7N,OACxC,CAACwvN,EAAgB2L,EAAiBn7N,KAErCzV,qBAAU,WACFurF,EAAcl8F,QACdyiO,EAAiB,MAGtB,CAACjkP,GAAa4B,UAEjBuwB,qBAAU,WACN,GAAI0iC,GAAQz2D,GAAUA,EAAOkM,OAAQ,CACjC,IAAMgzD,EAAUzI,EAAKyI,QAErB,IAAKA,GAAYA,IAAYA,EAAQ97C,OACjC,OAEA,IAAMg7N,EAASl/K,EAAQlwB,MACnB,SAAAnrB,GAAI,OAAIA,EAAK3a,KAAKgH,MAAV,OAAiBmI,QAAjB,IAAiBA,OAAjB,EAAiBA,EAASnI,OAEtC,IAAKkuO,EAAQ,OAEPA,GAAUA,EAAOlyB,UACnB24C,EAAiB5kQ,SAASD,EAAOkM,YAI9C,CAACuqD,EAAMz2D,EAAOkM,OAAQmM,EAASwsP,EAAkB7kQ,IAEpD+zB,qBAAU,WACN1a,GAAkBqvB,GAAYrvB,KAC/B,CAACA,EAAgBqvB,KAEpB3U,qBAAU,WACFyzE,GAA8C,WAA7BA,EAAc1rF,YAC/B0tB,OACL,CAACg+D,EAAeh+D,KAEnBzV,qBAAU,YACW,OAAburF,QAAa,IAAbA,OAAA,EAAAA,EAAel8F,WAAf,OAA0BrW,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAS+8C,QACnCmyF,GAAe,KAEpB,QAAClvI,QAAD,IAACA,OAAD,EAACA,EAAS+8C,MAAOw1D,IAEpBvrF,qBAAU,WACN,OAAO,kBAAM8xN,EAAiB,OAC/B,IAEH9xN,qBAAU,WACNqJ,QAAQo7B,UAAUz8B,MAAK,WACnB8pN,EAAiB,IACjB5pG,GAAe,QAEpB,CAAClvI,IAEJgnB,qBAAU,WACFuoH,GAAY,EACZpqI,YAAW,WACPi3B,GAAUozG,MACX,KACkB,IAAdD,IACPpqI,YAAW,WACPi3B,GAAU,KACX,OAGR,CAACmzG,KAEJvoH,qBAAU,WAGN,OAFAg3B,aAAcvR,KAAcE,MAAuB6rN,IAE5C,WACHp6M,aAAc3R,KAAcE,MAAuB6rN,OAGxD,IAEH,IAAMjoH,IAAevwI,GAAYA,IAAYA,EAAQ4V,MAAMS,OAErDm6H,GAAmB,UAAG37I,GAAauX,eAAhB,aAAG,EAAsBmM,MAC9C,SAAAzB,GAAI,MAAmB,eAAfA,EAAKpgB,QAAyC,IAAfogB,EAAKvN,SAiB1C+2F,GAAmB,WACrB4uC,GAAe,GACf4pG,EAAiB,KAyBfroG,KAA4Bl+B,EAAcl8F,OAE1Cq6H,IAA4B1wI,EAAQ4V,MAAMS,OAE1Co5H,GACFl9B,GAAiBA,EAAcl8F,OAASrW,EAAQ4V,MAAMS,OAOpD6gP,GAAqBxjQ,uBACvB,SAACgrP,GACGpjO,EAAQH,KACJimD,aAAWn0E,IAAOoE,iBAAkB,CAChC0B,OAAQ2rP,EAAOviP,KAAKgH,GAAG7P,aAE3B,CAAEm8H,WAAW,MAGrB,CAACn0G,IAoCCq1H,GAAuB,SACzB14I,EACAymP,IA3E8B,SAC9BzmP,EACAymP,GAEAN,EAAkBM,EAAOviP,KAAKgH,GAAIlL,GAyElC24I,CAA0B34I,EAASymP,IAOjCqa,GAA0BrlQ,uBAC5B,SAACglQ,GACG,OAAW,OAAPptP,QAAO,IAAPA,OAAA,EAAAA,EAASnI,MAAOu1P,EACT,cAAChB,IAAD,qBAGJ,OAEX,CAACpsP,IAoDL,OACI,qCACI,eAAC,GAAD,CACI0hH,SAAUtjE,GAAQA,EAAKvyD,KAAOuyD,EAAKvyD,KAAO,GAC1Cm4H,KAAM,cAAC,GAAD,CAAqBmY,SAAQ,OAAE/9E,QAAF,IAAEA,OAAF,EAAEA,EAAMvyD,OAC3Co4H,UACI,cAAC,aAAD,CACI1nB,iBAAgB,OAAEn+C,QAAF,IAAEA,OAAF,EAAEA,EAAMmnF,iBACxB/oC,WAAU,OAAEp+C,QAAF,IAAEA,OAAF,EAAEA,EAAMonF,aAClB/oC,iBAAgB,OAAEr+C,QAAF,IAAEA,GAAF,UAAEA,EAAMyI,eAAR,aAAE,EAAe97C,SAGzCm5G,UAAWviI,IAAOyD,YAAYC,cAC9BkX,MAAM,OACN4nH,UAAS,OAAEqtB,QAAF,IAAEA,OAAF,EAAEA,EAAertB,UAC1BuC,cAAa,gBACTtoE,EAAI,YAAQA,EAAKvyD,MAAS,GADjB,cAGbyQ,SAAS,OAhBb,YAkBO6jM,IACC,cAACv6J,GAAA,EAAD,CACIO,cAAe,CACXtvC,MAAO,IACP2wB,QAAS,uBAHjB,SAMI,cAACypC,GAAA,EAAD,CACIE,SACMnxD,EAAF,UACSA,EAAQ+2B,UADjB,YAC8B/2B,EAAQi3B,UAChC,GAEVi6B,OAAQ+gF,GACR7pH,QAAS,kBAAM62K,GAA2B,WAItD,cAAC,gBAAD,CACIp2G,YAAaA,GACbt+F,KAAI,OAAEmK,QAAF,IAAEA,OAAF,EAAEA,EAAS4V,MACftJ,eAAgBA,EAChBq0F,SAAUr0F,KAAoBA,EAAe+J,OAC7CwqF,2BAA4B,CACxBj2B,cAAeotL,EACfntL,YAAa2tL,GACb5wP,SAAU,iBACVkjE,QAAS,CACL,CACI3zE,KAAM,cACNoQ,KAAM,cAAC,IAAD,IACNkjE,QAAS8nK,GACTjrO,WAAU,OAACoiD,QAAD,IAACA,OAAD,EAACA,EAAMvmD,IACjByE,SAAU,iBAItB84F,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,iBAAE7V,QAAF,IAAEA,OAAF,EAAEA,EAAS+8C,aAAX,QAAoB,EAC9BygB,aAAcgxE,IACd74C,aAhOC,SAACt/F,GACtB+lC,GAAU/lC,IAgOUu/F,uBACI/gG,GAAa0B,WAAW8f,QACxBiyH,GAAyBzzI,IAC7B+S,SAAU,eAEd63F,mBAAoB,CAChB7xC,aAAc/4D,GAAa0B,WAC3B2pG,eAAgBrzE,GAChBszE,sBACIowC,KAAgB17I,GAAa0B,WAAW8f,OAC5CzO,SAAU,eAEd23F,8BACKwxC,kBAAcx+B,KACdw+B,kBAAc/wI,GACnBw/F,oBAAqB,CACjB7xB,YAAaA,EACbF,eAAc,OAAE8kC,QAAF,IAAEA,OAAF,EAAEA,EAAel8F,OAC/BR,WAAU,OAAE7V,QAAF,IAAEA,OAAF,EAAEA,EAAS+8C,MACrBygB,aAAcgxE,IACdluC,iBAAkBA,GAClBr0E,YAxNJ,WAChB6sN,EAAiB94O,EAAQ4V,MAAMjR,KAAI,SAAAmS,GAAI,OAAIA,EAAK3a,KAAKgH,OACrD+rI,GAAe,IAuNK3uC,kBAAmB,CACfj5F,SAAmC,IAAzBirG,EAAcl8F,OACxB4kF,kBAAkB,EAClBU,uCAAwC,CACpCxzF,KAAgB2rC,mBAEpB4mD,yBACIsxG,GACJvwG,qBAAsB,CAClBtzF,KAAgBgoD,YAEpB4qC,gBAAiBA,GACjBW,sBAAuB,CACnBvzF,KAAgBuiM,kBAEpB5tG,uBAAuB,OAACpzC,QAAD,IAACA,OAAD,EAACA,EAAMkwF,gBAExBnlJ,EADA,CAAC0T,KAAgB6wP,oBAEvBr8J,gBAAiB,mBACjBI,oBAAqB,kBACjB87J,GAAwBtmJ,IAC5B9V,oBAAqBy7J,GACrBl7J,kBACI,+CACJrvB,YAAaA,EACb93D,WAAU,OAAE7V,QAAF,IAAEA,OAAF,EAAEA,EAAS+8C,MACrB63B,YAAa,CACTt+E,MAAQy6I,kBAAa,OACjBl8I,SADiB,IACjBA,QADiB,EACjBA,GAAc0B,YAGZ,KADA1B,GAAa0B,WAEnB4I,OAAM,OAAEuqD,QAAF,IAAEA,OAAF,EAAEA,EAAMvmD,GACdlL,QAAU84I,kBAAa,OACnBl8I,SADmB,IACnBA,QADmB,EACnBA,GAAc0kB,UAGZ,KADA1kB,GAAa0kB,SAEnB9jB,OAASs7I,kBAAa,OAClBl8I,SADkB,IAClBA,QADkB,EAClBA,GAAc68D,4BAGZ,KADA78D,GAAa68D,2BAEnBunM,eAAiBloH,kBAAa,OAC1Bl8I,SAD0B,IAC1BA,QAD0B,EAC1BA,GAAcumC,gBAGZ,KADAvmC,GAAaumC,eAEnBmuG,WAAYiH,IAEhB53H,cAAe25F,EACf19B,gCAAiC2jL,KAGzC94J,cAAe,CACXU,gBACI,cAACrsE,GAAA,EAAD,CACI1vB,QAAS,gBAAGiwB,EAAH,EAAGA,KAAH,OACL,cAAC,IAAD,CACIw0G,kBACIx8H,GAAkB,GAEtB08H,eAAgBqH,GAChByC,2BACI0L,GAEJ/oJ,OACIZ,GAAaumC,eAEjBy3G,mBACIh+I,GAAa68D,4BACb,GAEJw3E,gBACIoH,GAEJvH,eAAgBqH,GAChBnH,eAAgB,kBAAM30G,KACtB60G,QAASqH,MAGjBp9G,aAAc,CACVO,SAAU,SACVC,WAAY,SAEhBL,iBAAkB,IA7BtB,SA+BK,SAACxxB,EAAD,OAAQwyB,EAAR,EAAQA,YAAaL,EAArB,EAAqBA,MAArB,OACG,cAAC88G,GAAD,CACIjvI,IAAKA,EACL8B,KAAMqwB,EACNuqB,WAAYlqB,EACZ6zG,aAAcE,GACVzzI,IAEJyS,UACKzS,GAAa0B,WACT8f,OAAS,GAGJ,IAFNiyH,GACIzzI,MAER07I,GAEJ3oI,SAAS,sBAOjCmtF,8BAA+B,CAC3BE,sBACKxtF,GAAsC,KAApB,OAAPzH,QAAO,IAAPA,GAAA,UAAAA,EAAS4V,aAAT,eAAgBS,QAChC+9E,iBAAkB,CACd7sF,KAAMyvP,IACN/4P,KAAM,iBACN2J,SAAU,kBAEdysF,uBAAwB,CACpBh4C,WAAY,UACZz0C,SAAU,oBAEd0sF,uBAAwB,CACpB/sF,KAAMugI,GACN3lI,MAAO,QACPyF,SAAU,0BAGlBm5F,eAAgB,CACZrQ,qBAAsB,CAClBriF,QAASoiI,GACTnpI,SAAUopI,GACVpiI,QACImhI,KAAgC9hE,EACpCe,YAzvBuC,SAAA3lD,GAEvD/oB,EAAQ+8C,MAAQyxF,MACK,IAArBzlH,EAAEgwB,OAAO1qC,QAET6gI,GAAe,GAEfA,GAAe,GAGfnmH,EAAEgwB,OAAO1qC,SAAWohI,GACpBqpG,EAAiB94O,EAAQ4V,MAAMjR,KAAI,SAAAmS,GAAI,OAAIA,EAAK3a,KAAKgH,OAErD21O,EAAiB,KA6uBDlxO,SAAU,2BAEd+oF,QAAS,CAAC,2BAEF9oF,MAAO,eACP1F,MAAO,IACH+1O,GACE,KACAigB,IANL,IAOD7wP,SAAU4wO,GACVtwO,SAAU,wBART,2BAWDC,MAAO,UACP1F,MAAO,GACH+1O,GAAyB,KAAOvoG,IAbnC,IAcDroI,SAAU4wO,GACVvjL,aAAa,EACb/sD,SAAU,mBAhBT,2BAmBDC,MAAO,sBACP1F,MAAO,GACPyF,SAAU,6BACNswO,GACE,KACAxlB,IAxBL,IAyBDprN,SAAU4wO,GACVzjL,WAAY,GACZq8B,8BACIpf,EAAQg6D,qBACZ76C,WAAY,CAAC,2BAELhpF,MAAO,cACP1F,MAAO,IACHouI,GACE,KACAgoH,IANF,IAOJjxP,SAAUipI,GACV3oI,SAAU,uBARN,2BAWJC,MAAO,cACP1F,MAAO,IACHouI,GACE,KACA+nH,IAfF,IAgBJhxP,SAAUipI,GACV3oI,SAAU,uBAjBN,2BAoBJC,MAAO,YACP1F,MAAO,IACHouI,GACE,KACA8nH,IAxBF,IAyBJ/wP,SAAUipI,GACV3oI,SAAU,wBAvDjB,2BA4DDC,MAAO,WACP1F,MAAO,IACH+1O,GACE,KACAxlB,IAhEL,IAiEDprN,SAAU4wO,GACVvjL,aAAa,EACb/sD,SAAU,kBACVgtD,YACI,kFArEH,2BAwED/sD,MAAO,gBACP1F,MAAO,IACH+1O,GACE,KACAvlB,IA5EL,IA6EDrrN,SAAU4wO,GACVvjL,aAAa,EACb/sD,SAAU,uBACVgtD,YACI,sDAjFH,2BAoFD/sD,MAAO,gBACP1F,MAAO,IACH+1O,GAAyB,KAAOkgB,IAtFnC,IAuFD9wP,SAAU4wO,GACVtwO,SAAU,yBAEd,CACIzF,MAAO,GAEX,CACIA,MAAO,IAGfixF,UAAW,CACPE,WAAY4jK,GACZ1jK,kBA1ZE,SAAC71C,EAAY+gM,GAAwB,IAAD,EAC1D1F,GAAkB0F,EAAOviP,KAAKgH,GAAb,OAAiBw6C,QAAjB,IAAiBA,GAAjB,UAAiBA,EAAO5E,cAAxB,aAAiB,EAAe1qC,UA0Z7BklF,aApaE,SAACmrJ,GAAD,OACtBnsI,EAAcn9F,SAASspO,EAAOviP,KAAKgH,KAAOwqE,GAoatB8lB,gBAnZK,SAACirJ,GAC1B,OAAOvvG,KAAeuvG,EAAOviP,KAAKgH,IAmZdivF,kBAAmB,SAACssJ,GAAD,MAAyB,CACxCpyO,eAAgBoyO,EAAOxpP,QAAU,GACjCo7E,kBAAmB,CACfnoE,KAAgB0L,mBAEpBu8D,cAAe,SAACn4E,GAAD,OACX04I,GAAqB14I,EAASymP,MAEtC92O,SAAU,cACVyrF,MAAO,CACH,CACIR,UAAW,eACXG,wBAAyB,SACrB0rJ,GADqB,OAGrB,eAAC,IAAD,WACI,cAAC8Y,IAAD,CACItoN,cAAe,CACX7M,UACIq8M,EAAOviP,KAAKkmC,UAChBE,SACIm8M,EAAOviP,KAAKomC,SAChBqN,QACI8uM,EAAOviP,KAAK+zC,SAChBz6C,OAAQipP,EAAOjtL,YAEnB1pD,KAAK,KACLH,SAAS,kBAEb,cAACwpP,IAAD,CACIvpP,MAAK,UAAK62O,EAAOviP,KAAKkmC,UAAjB,YAA8Bq8M,EAAOviP,KAAKomC,UAC/C19B,YAAU,cAFd,mBAGK65O,EAAOviP,KAAKkmC,UAHjB,YAG8Bq8M,EAAOviP,KAAKomC,YACzCw2N,GACGra,EAAOviP,KAAKgH,KAET,OAANu7O,QAAM,IAANA,OAAA,EAAAA,EAAQn+O,aAlYzC,cAAC,KAAD,CACI4G,MAAM,wBACNi5D,SAAS,eACT/pE,OAAQ,CACJmM,EAAG,OACHD,EAAG,OALX,SAQI,cAACk1P,IAAD,WA+XgB,CACI5kK,UAAW,aACXj/B,oBAAqB,SAAC8qL,GAAD,OAChBA,EAAO9sL,WACZkhC,WAAY,CACRrB,YAAa,SAACitJ,GAAD,OACTA,EAAO9sL,WAAa,sBAAM/sD,YAAU,eAAhB,SAA+B,cAAC,GAAD,SAG/D,CACIguF,UAAW,eACXG,wBAAyB,SACrB0rJ,GADqB,OAGrB,eAAC,IAAD,WACI,cAAC,KAAD,CAAWv8O,MAAO,GAAlB,SACKu8O,EAAOwa,qBACJ,sBAAMr0P,YAAU,oBAAhB,SAEQ65O,EAAOwa,uBAIf,cAAC7wM,GAAA,EAAD,MAGR,cAAC,KAAD,CAAWlmD,MAAO,GAAlB,SACKu8O,EAAOya,mBACJ,sBAAMt0P,YAAU,oBAAhB,SAEQ65O,EAAOya,qBAIf,cAAC9wM,GAAA,EAAD,MAGR,cAAC,KAAD,CAAWlmD,MAAO,GAAlB,SACKu8O,EAAO0a,oBACJ,sBAAMv0P,YAAU,kBAAhB,SAEQ65O,EAAO0a,sBAIf,cAAC/wM,GAAA,EAAD,WAMpB,CACIwqC,UAAW,aACXj/B,oBAAqB,SAAC8qL,GAAD,OAChBA,EAAOh8B,UACZ5vH,WAAY,CACRrB,YAAa,SAACitJ,GAAD,OACTA,EAAOh8B,UAAP,UACGvsM,KAAKqpI,MACc,IAAlBk/F,EAAOh8B,UAFX,MAIJ96M,SAAU,mBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC8qL,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAQj/F,eACb3sD,WAAY,CACRrB,YAAa,SAACitJ,GAAD,OACH,OAANA,QAAM,IAANA,OAAA,EAAAA,EAAQj/F,eACR1N,GACI2sG,EAAOj/F,eAEf73I,SAAU,kBAGlB,CACIirF,UAAW,aACXj/B,oBAAqB,SAAC8qL,GAAD,QACjB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAQntG,eACbz+C,WAAY,CACRrB,YAAa,SAACitJ,GAAD,OACH,OAANA,QAAM,IAANA,OAAA,EAAAA,EAAQntG,eA3eb,SAACoO,GAChC,IAAKA,EACD,MAAO,GAGX,IAAMh8H,EAAOc,KAAMk7H,GACnB,OAAOh8H,EAAK01O,SAASx1O,KAAKk8I,MAAO,OAC3Bp8I,EAAKkC,OAAO,UACZlC,EAAKkC,OAAO,UAoekByzO,CACI5a,EAAOntG,eAEf3pI,SAAU,uBAGlB,CACIirF,UAAW,aACXC,WAAY,CACRV,kBAAmB,SACfssJ,GADe,MAEb,CACFpyO,eAAgBoyO,EAAOxpP,QAAU,GACjC2O,KAAMsrI,KAAeuvG,EAAOviP,KAAKgH,GACjCs7C,WAAY,WAvdzB,IAAC4wB,KAydoBqvK,EAAOviP,KAAKgH,KAtdpDisI,GADAD,KAAe9/D,EACD,KAEAA,IAsdkBznE,SAAU,gBAEd5F,UAAW0vE,EAAQw6D,kBAG3B,CACIr5C,UAAW,eACXC,WAAY,CACRR,wBAAyB,SACrBosJ,GADqB,OAGrB,cAAC,KAAkB/sK,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,cACbC,MAAO,gBAHf,SAMI,cAAC,IAAD,CACI0pO,OAAQA,EACRwY,mBAAoB,kBAChBA,GACIxY,IAGRyY,YAAa,WACT5sD,GACIm0C,EAAOviP,KAAKgH,KAGpBi0P,wBAAyB,kBACrBqB,GACI/Z,EAAOviP,KAAKgH,KAGpBk0P,eAAgB,WACZwB,GACI,CAACna,EAAOviP,KAAKgH,MAGrBm0P,oBACIA,GAEJpnM,aAAcA,GACVwuL,GAEJ5K,cAAa,OACTpqL,QADS,IACTA,OADS,EACTA,EAAMkwF,UAEV1gC,WACM3G,EAAcl8F,OAEpBw+D,gCACI2jL,kBAY3C/wP,IAAYkmE,GAAe,cAAC,KAAD,QCz0CzBgxK,ID80CkB,WAC7B,IAAMrzO,EAAU0R,YAAY3R,MACtBpY,EAA6B00I,cAFA,EAQ/BloB,KAJAk4I,EAJ+B,EAI/BA,YACAj2M,EAL+B,EAK/BA,KACM+vF,EANyB,EAM/B57I,KACA4R,EAP+B,EAO/BA,QAEE8xP,E9tB9tCCv8O,YAAY1U,qBAAWi3G,K8tB+tCxBq4I,EAAkBt4I,KAAmB0zH,YACrC99O,EAASm5B,eACTlvB,EAASlM,EAAOkM,OAChBy/O,EAAoBn6G,GAA4BtlI,GAChD0/O,EAA6B7lM,aAAmB4lM,GAChDzgN,EAAUnhB,YAAYkhB,MACtBk5N,EloBlRgC,WACtC,IAAMoC,EAAsBh6P,eACtBgW,EAAcnQ,cACpB,OAAO3R,uBACH,SAACuH,EAA0BkE,EAAgBuW,GAAsB,IAAD,YACtD87C,EAAa,UAAG97C,EAAGtJ,eAAN,aAAG,EAAY61B,MAC9B,SAAApH,GAAC,MAAgB,eAAZA,EAAEnkC,SAELzD,EAA8B,CAChCw+D,WAAU,UAAE/7C,EAAGg8C,kCAAL,aAAE,EAA+B96D,KAAK,KAChD+6D,iBAAgB,UAAEj8C,EAAG0lB,sBAAL,aAAE,EAAmBxkC,KAAK,KAC1Cg7D,aAAwB,OAAbJ,QAAa,IAAbA,OAAA,EAAAA,EAAejoD,aAAe9U,EACzCS,OAAM,UAAEwgB,EAAG6D,gBAAL,aAAE,EAAa3iB,KAAK,KAC1BR,OAAc,OAAP6E,QAAO,IAAPA,OAAA,EAAAA,EAASob,aAAS5hB,EAAlB,UAA8BihB,EAAGtf,aAAjC,QAA0C,GACjDC,OAAM,UAAEqf,EAAGrf,cAAL,QAAe,EACrBC,MAAOof,EAAGnf,WACVC,KAAMsE,aAAsB4a,EAAGjf,QAAS,QAAQ,GAChDmF,MAAK,OAAEX,QAAF,IAAEA,OAAF,EAAEA,EAASrE,KAAK,MAEzB,OAAO4iQ,EAAoBr6P,EAAQlM,GAC9B+7B,MAAK,SAACn5B,GAEH,OADAgmD,aAAahmD,EAAM,cACZA,KAEVq5B,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACk1P,EAAqBhkP,IkoBsPMikP,GAC1BtkH,EAAanR,KACb+K,EAAyBl/G,eACzB4qE,EAAgBhkE,eAChBpF,EAAwBD,eACxBsoO,EloBrKgC,WACtC,IAAM30P,EAAWO,cACXq0P,EAAsB95P,eACtB2V,EAAcnQ,cACpB,OAAO3R,uBACH,SAACyL,GACGw6P,EAAoBx6P,GACf6vB,MAAK,WACFjqB,EACIg2H,GACI,CAAE53H,GAAIhE,GACN,cAIX+vB,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,cAGvC,CAACkR,EAAamkP,EAAqB50P,IkoBkJP60P,GAC1Bxb,EAAoB//G,GAA4Bl/H,GAChDkrI,EAAcrtH,YAAYotH,IAE1B0S,EADU7gI,cACmBT,SAAShW,MAE5C,OACI,cAAC,KAAkBmsE,SAAnB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC,KAAuB48D,SAAxB,CACIpoE,MAAO,CACHwL,YAAa,eAFrB,SAKI,cAAC,IAAD,CACIzJ,QAASA,EACTtL,QAAS0hD,EACTgI,KAAM+nF,EACNkmH,YAAaA,EACblwP,QAASA,EACT6E,eAAgBpX,EAAO6iB,SACvBy3N,cAAeqP,EACf1gN,QAASA,EACTlrC,OAAQA,EACRg5P,eAAgBsN,EAAoB1jQ,KACpC+hQ,gBAAiBA,EACjBR,wBAAyBA,EACzBS,eAAgB1iH,EAChBpG,uBAAwBA,EACxBt0C,cAAeA,EACfppE,sBAAuBA,EACvBvY,eAAgB5jB,EAAO4jB,eACvBg/O,iBAAkB4B,EAClBtb,kBAAmBA,EACnB/zG,YAAaA,EACbyS,cAAeA,SEt0CpB+8G,I,gCAAAA,IAjDf,WAAgC,IAAD,EACrBr+O,EAAWC,cADU,EAGOksH,cAA1BxoI,cAHmB,MAGV,GAHU,EAIrB26P,EAAal7I,GAAgBz/G,GAC7B46P,EAAa9+H,KACb++H,EAAgBx+H,KAOhBy+H,EAAgBvmQ,uBAAY,WAC9BqmQ,EAAW7mQ,SAASiM,MACrB,CAAC46P,EAAY56P,IA2BhB,OAzBA6nB,qBAAU,WACF7nB,GAAU26P,IAAe36P,GACzB86P,MAEL,CAACF,EAAY56P,EAAQ26P,EAAYG,IAGpCjzO,qBAAU,WAGN,OAFAg3B,aAAcvR,KAAcG,MAA0BqtN,GAE/C,WACH77M,aACI3R,KAAcG,MACdqtN,MAIT,IAEHjzO,qBAAU,WACN,OAAO,WACHgzO,OAEL,CAACA,KAEJ,OAAIx+O,QAAJ,IAAIA,GAAJ,UAAIA,EAAUukC,gBAAd,aAAI,EAAoB3qC,SAAS,YACtB,cAAC,IAAD,IAGJ,cAAC,GAAD,KChEE4iB,IAAQt0B,IAAOC,IAAV,gHAML,SAAAC,GAAK,OAAOA,EAAM8C,MAAQ9C,EAAM8C,MAAQ,0BA6BxCqkI,KA1B0BrnI,IAAOC,IAAV,2TAMf,SAAAC,GAAK,OAChBA,EAAMitC,aAAR,UAA0BjtC,EAAMitC,aAAhC,MAAmD,UAQdntC,IAAOC,IAAV,oKAMrB,SAAAC,GAAK,OAChBA,EAAMitC,aAAR,UAA0BjtC,EAAMitC,aAAhC,MAAmD,UAIvBntC,IAAOC,IAAV,+DAIpBw3O,IAAmBz3O,IAAOC,IAAV,yGAKN,SAAAC,GAAK,OAAOA,EAAMs2P,QAAUt2P,EAAMs2P,QAAU,cAGtDC,IAAyBz2P,IAAOC,IAAV,oDAItBy2P,IAAc12P,IAAOC,IAAV,mIAOXylG,IAAc1lG,IAAOC,IAAV,gHCET02P,QAvDf,SACIz2P,GACD,IACSutC,EAA4DvtC,EAA5DutC,WAAYvpC,EAAgDhE,EAAhDgE,SAAUysE,EAAsCzwE,EAAtCywE,wBAAyB7iC,EAAa5tC,EAAb4tC,SAUvD,OAPAxqB,qBAAU,WACN,OAAO,WACHwqB,OAEL,CAACA,IAIA,eAACN,GAAA,EAAD,CAAeO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aAArD,UACI,eAAC,IAAD,CACIpsB,MAAM,qBACN7B,YAAW+C,GAAQ,UAAOA,EAAP,eAFvB,mBAIWupC,EAJX,OAOA,cAAC,IAAD,CAAatsC,YAAW+C,GAAQ,UAAOA,EAAP,qBAAhC,kIAKA,eAAC,IAAD,WACI,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQqzC,EACRjtC,QAAQ,UACRmC,MAAM,kBACNM,YAAY,qBACZY,SAAUA,GAAQ,UAAOA,EAAP,gBAPtB,oBAWA,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQk2E,EACR3tE,MAAM,kBACNM,YAAY,qBACZK,MAAO,CAAEiwB,WAAY,QACrB1vB,SAAUA,GAAQ,UAAOA,EAAP,iBAPtB,yBCLD0yP,QApCf,SAAyB12P,GAAyC,IACtDutC,EAA4DvtC,EAA5DutC,WADqD,EACOvtC,EAAhDgE,gBADyC,MAC9B,wBAD8B,EACL8rB,EAAY9vB,EAAZ8vB,QAExD,OACI,eAACwd,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aAD1C,UAGI,eAAC,IAAD,CACIpsB,MAAM,qBACN7B,YAAW+C,GAAQ,UAAOA,EAAP,UAFvB,qBAIaupC,KAGb,cAAC,IAAD,CAAatsC,YAAW+C,GAAQ,UAAOA,EAAP,gBAAhC,uFAKA,cAAC,IAAD,UACI,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQu1B,EACRhtB,MAAM,kBACNM,YAAY,qBACZK,MAAO,CAAEiwB,WAAY,QACrB1vB,SAAUA,GAAQ,UAAOA,EAAP,WAPtB,0B,WCJH2yP,IAAuB,SAAC/0P,GAAD,OAAqBA,EAAMg1P,cAEhDC,IAdX,WAA0D,IAAzDj1P,EAAwD,uDAAhD0F,MAAc/M,EAAkC,uCACzD,OAAQA,EAAOO,MACX,KAAKisD,MACD,OAAO,6BACAnlD,GADP,IAEIklD,WAAYvsD,EAAOusD,aAE3B,QACI,OAAOllD,ICUJk1P,IAvBY54P,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLI,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,eACLV,MAAM,6BACNL,UAAWA,EAPf,SASI,sBACIkxD,YAAU,UACVC,YAAU,UACVlwD,EAAE,oYACFF,KAAK,iBC6DV43P,QAhEf,SAA2B/2P,GAA0C,IACzDutC,EACJvtC,EADIutC,WADwD,EAE5DvtC,EADgBgE,gBAD4C,MACjC,iBADiC,EACfgzP,EAC7Ch3P,EAD6Cg3P,oBAAqBC,EAClEj3P,EADkEi3P,6BAG9DnwM,EAAe1tC,YAAYu9O,KAA3B7vM,WAOF86H,EAAW9xL,uBACb,SAACiqD,GACO+M,EAAa,GAAKA,EAAa,MAC/B/M,EAAMsxH,iBACNtxH,EAAM8nI,aAAc,KAG5B,CAAC/6H,IAWL,OARA1jC,qBAAU,WAGN,OAFAqd,OAAO6Z,iBAAiB,eAAgBsnI,GAEjC,WACHnhJ,OAAOga,oBAAoB,eAAgBmnI,MAEhD,CAACA,IAGA,cAACt0I,GAAA,EAAD,CACIO,cAAe,CAAEtvC,MAAO,IAAK2wB,QAAS,aACtC4e,YAAampN,EAFjB,SAII,sBAAK/yP,QAAS,SAAA61C,GAAK,OAAIA,EAAM30B,mBAA7B,UACI,cAAC,IAAD,CAAOnkB,YAAW+C,GAAQ,UAAOA,EAAP,UAA1B,SAAoDupC,IAEpD,cAAC,IAAD,UACI,cAAC,GAAD,CAAoBuZ,WAAYA,EAAY9iD,SAAUA,MAG1D,eAAC,IAAD,CAAkBsyP,QAAQ,gBAA1B,UACI,eAACC,IAAD,WACI,sBAAMt1P,YAAW+C,GAAQ,UAAOA,EAAP,iBAAzB,SAAyD,cAAC,IAAD,MACzD,cAACwyP,IAAD,CAAav1P,YAAW+C,GAAQ,UAAOA,EAAP,YAAhC,uEAKJ,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPjE,OAAQy8P,EACRtzP,SAAyB,MAAfojD,EACV9iD,SAAUA,GAAQ,UAAOA,EAAP,SALtB,2B,WChCPkzP,IAAuB,SAACt1P,GAAD,OAAqBA,EAAMu1P,cAEhDC,IAxBgE,WAGnD,IAFxBx1P,EAEuB,uDAFf0F,MACR/M,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAK4d,MACD,OAAO,gBAAP,OACOne,QADP,IACOA,OADP,EACOA,EAAQke,cAEnB,KAAKG,MACD,OAAOtR,MAEX,KAAKk7D,MACD,OAAO,6BACA5gE,GADP,IAEI4F,UAAWjN,EAAOiN,YAE1B,QACI,OAAO5F,ICkBJy1P,QAxCf,SAA+Br3P,GAAoC,IAE3DutC,EAQAvtC,EARAutC,WACA/E,EAOAxoC,EAPAwoC,YACAmF,EAMA3tC,EANA2tC,UACAD,EAKA1tC,EALA0tC,iBACAD,EAIAztC,EAJAytC,kBACAI,EAGA7tC,EAHA6tC,cACAL,EAEAxtC,EAFAwtC,WAR0D,EAU1DxtC,EADAgE,gBAT0D,MAS/C,qBAT+C,EAYxD8rB,EAAUnX,eAERnR,EAAc4R,YAAY89O,KAA1B1vP,UAEFiyK,EAAgB3pL,uBAAY,WACrB,OAAT69C,QAAS,IAATA,OAEApsC,YAAW,WACPuuB,MACD,OACJ,CAACA,EAAS6d,IAEb,OACI,cAAC,KAAD,CACIJ,WAAYA,EACZ/E,YAAaA,EACbkF,iBAAkBA,EAClBD,kBAAmBA,EACnBE,UAAW8rI,EACXjyK,UAAWA,EACXomC,SAAU9d,EACV+d,cAAeA,EACfL,WAAYA,EACZxpC,SAAUA,KC3BtB,SAASszP,MAA0B,IAAD,EACIl+O,YAAY89O,KAAtCn+O,EADsB,EACtBA,UAAWD,EADW,EACXA,WADW,EAI1BmK,oBAAkB,GAJQ,mBAGvBs0O,EAHuB,KAGIC,EAHJ,KAkBxBC,EAAmC3nQ,uBAAY,WACjD28B,QAAQo7B,UAAUz8B,MAAK,WAEftS,EACF23D,0BACF+mL,GAA6B,QAElC,CAAC1+O,IAME4+O,EAAoB,WACtBF,GAA6B,IAiB7BG,EAAiB,6BAErB,IAAK7+O,EACD,OAAO6+O,EAGX,OAAQ5+O,GACJ,IAAK,6BACA,IAAD,EAEQD,EADIy0B,EADZ,EACYA,WAAYvpC,EADxB,EACwBA,SAAU8rB,EADlC,EACkCA,QAE9B6nO,EACI,cAAC,IAAD,CACIpqN,WAAYA,EACZvpC,SAAUA,EACVgzP,oBAtDY,WAC5BQ,GAA6B,IAsDbP,6BA1BiB,WACbx2N,OAAO2/I,QACvB,8CAIAq3E,KAuBY3nO,QAASA,IAIrB,MACJ,IAAK,2BACA,IAAD,EAEQhX,EADIy0B,EADZ,EACYA,WAAYzd,EADxB,EACwBA,QAAS9rB,EADjC,EACiCA,SAE7B2zP,EACI,cAAC,IAAD,CACIpqN,WAAYA,EACZvpC,SAAUA,EACV8rB,QAASA,IAKrB,MAEJ,IAAK,qBACA,IAAD,EAUQhX,EARAy0B,EAFR,EAEQA,WACA/E,EAHR,EAGQA,YACAmF,EAJR,EAIQA,UACAD,EALR,EAKQA,iBACAD,EANR,EAMQA,kBACAD,EAPR,EAOQA,WACAK,EARR,EAQQA,cACA7pC,EATR,EASQA,SAEJ2zP,EACI,cAAC,IAAD,CACIpqN,WAAYA,EACZ/E,YAAaA,EACbmF,UAAWA,EACXF,kBAAmBA,EACnBC,iBAAkBA,EAClBF,WAAYA,EACZK,cAAeA,EACf7pC,SAAUA,IAQ9B,OACI,qCACK2zP,EACAJ,GACG,cAAC,IAAD,CACIhqN,WAAYz0B,EAAWy0B,WACvBvpC,SAAU8U,EAAW9U,SACrBysE,wBAAyBgnL,EACzB7pN,SAAU8pN,EACV5nO,QAAS4nO,OAOdl3P,uBAAK82P,KC9IpB,SAASM,IAAT,GAKgC,IAJ5Br4P,EAI2B,EAJ3BA,GACAzE,EAG2B,EAH3BA,KACA+8P,EAE2B,EAF3BA,YACAC,EAC2B,EAD3BA,SAEMC,EAAyB98P,eACzB2W,EAAcnQ,cACdiW,EAAUW,cAWhB,OATA0/O,EAAuBx4P,EAAIzE,GACtBswB,MAAK,SAAAgT,GACF1mB,EAAQH,KAAKsgP,EAAYpoQ,QAAQ,gBAAiB2uC,EAAS7+B,GAAG7P,gBAEjE47B,OAAM,SAAC5rB,GACJkS,EAAYlS,EAAMgB,QAAS,SAC3BgX,EAAQH,KAAKugP,MAGd,6BAGIt3P,IC3BAw3P,ID2BAx3P,eAAKo3P,KExBpB,SAASK,MACL,IAAM5oQ,EAAS00I,cAEf,OAAO,cAACi0H,IAAD,CACHz4P,GAAIlQ,EAAO6K,aACXY,KAAK,WACL+8P,YAAaxuQ,IAAOsC,oBAAoBC,eAAeE,OACvDgsQ,SAAUzuQ,IAAOsC,oBAAoBC,eAAeC,MAI7C2U,ICdA03P,IDcA13P,eAAKy3P,KEXpB,SAASE,MACL,IAAM9oQ,EAAS00I,cAEf,OAAO,cAACi0H,IAAD,CACHz4P,GAAIlQ,EAAO6K,aACXY,KAAK,YACL+8P,YAAaxuQ,IAAOsC,oBAAoBK,WAAWF,OACnDgsQ,SAAUzuQ,IAAOsC,oBAAoBK,WAAWH,MAIzC2U,ICbH6H,ICDG+vP,IFcA53P,eAAK23P,M,SCbR9vP,K,sCAAAA,E,0CAAAA,E,2CAAAA,U,KEcL,ICZKgwP,IDYCC,IAAuB,WAChC,IAAMn3P,EAAWO,cACX62P,EEPH,WACH,IAAM3oQ,EAAOC,eACb,OAAOC,uBACH,kBAAMF,EAAKgB,IAAI,gBAAYC,OAAWA,GAAW,KACjD,CAACjB,IFGiB4oQ,GAChB5mP,EAAcnQ,cAMpB,OAAO3R,uBAAY,WAEf,OADAqR,EFjBG,CACHrG,KAAMuN,IAAQowP,oBEiBPF,IACFntO,MAAK,SAACn5B,GACHkP,EFfT,SAA2BlP,GAC9B,MAAO,CACH6I,KAAMuN,IAAQqwP,oBACdzmQ,QEYiB0mQ,CAAkB1mQ,OAE9Bq5B,OAAM,SAAC5rB,GACJyB,EFXT,SAA2BzB,GAC9B,MAAO,CACH5E,KAAMuN,IAAQuwP,oBACdl5P,SEQiBm5P,CAAkBn5P,EAAMgB,UACjCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAUo3P,EAAe3mP,KGvBpBknP,IAA8BtmO,IAAM/tB,eAC7C,WACI,MAAM,IAAInF,MAAM,uB,SFVZ+4P,K,0CAAAA,E,gCAAAA,E,4CAAAA,E,kBAAAA,E,+BAAAA,U,KGFL,I,4BAsBQU,IAtBkB76P,sBAC7B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,sBAAMS,KAAK,UAAUE,EAAE,+BACvB,sBAAMA,EAAE,uGAAuG0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACnN,sBAAM1jH,EAAE,kGAAkG0zB,OAAO,UAAU+wE,eAAa,UACxI,sBAAMzkG,EAAE,gHAAgH0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,gBCW7Ni2I,IA3BkB96P,sBAC7B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,sBAAMW,EAAE,qCAAqC0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACjJ,sBAAM1jH,EAAE,2EAA2E0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACvL,sBAAMxjH,GAAG,aAAa05P,YAAU,YAAYrpD,UAAU,iBAAiBjxM,EAAE,IAAIC,EAAE,IAAIL,MAAM,KAAKC,OAAO,KAArG,SACI,sBAAMa,EAAE,kBAAkBF,KAAK,WAEnC,oBAAG0wM,KAAK,mBAAR,UACI,sBAAMxwM,EAAE,6ZAA6Z0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACzgB,sBAAM1jH,EAAE,wMAAwMF,KAAK,qBCa1N+5P,IAjCah7P,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,oBAAG2wD,YAAU,mBAAb,UACI,sBAAMhwD,EAAE,8OAA8OF,KAAK,YAC3P,sBAAME,EAAE,4WAA4W0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACxd,sBAAM1jH,EAAE,iHAAiH0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC7N,sBAAM1jH,EAAE,wOAAwO0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACpV,sBAAM1jH,EAAE,mFAAmF0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC/L,sBAAM1jH,EAAE,uJAAuJF,KAAK,OAAO4zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC/Q,sBAAM1jH,EAAE,4DAA4D0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACxK,sBAAM1jH,EAAE,uGAAuG0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,aAEvN,+BACI,0BAAUxjH,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCD7B85P,IAxBcj7P,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,sBAAMq0B,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,QAAQ1jH,EAAE,qCACpH,sBAAM0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,QAAQ1jH,EAAE,gRACpH,sBAAMV,EAAE,QAAQC,EAAE,QAAQL,MAAM,SAASC,OAAO,SAASmxK,GAAG,QAAQ58I,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UACxK,sBAAM1jH,EAAE,gGAAgG0zB,OAAO,UAAU+wE,eAAa,SACtI,sBAAMzkG,EAAE,wBAAwB0zB,OAAO,UAAU+wE,eAAa,SAC9D,sBAAM3kG,KAAK,UAAUE,EAAE,uBCrB1B+5P,IAAwB,YCI/BC,IAA4B,kBAC9B,IAAIzyJ,gBAAJ,gBAAsBwyJ,IAAtB,UAAiDv4O,MAAM,IAAIZ,MAAOyoD,UAAY,QAAWzmD,OAAO,cAAhG,YAAiHpB,KAAM,IAAIZ,MAAQgC,OAAO,kBC4B/Hq3O,IA9Bap7P,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,UAUI,oBAAG2wD,YAAU,mBAAb,UACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,kIAAkIF,KAAK,YACvL,sBAAMowD,YAAU,UAAUlwD,EAAE,+IAA+I0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC/Q,sBAAM1jH,EAAE,+EAA+E0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC3L,sBAAMxzD,YAAU,UAAUlwD,EAAE,+KAA+K0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,UAC/S,sBAAM1jH,EAAE,yNAAyN0zB,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,aAEzU,+BACI,0BAAUxjH,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCZ/Bk6P,IAAgB76F,gBAAM,EADA,GAGtB86F,KAAqD,wBAC7DnB,IAAWoB,oBAAsB,CAC9Bj5N,IAAKn3C,IAAOmF,QAAQE,2BACpBiV,KAAM6uB,IAAMuO,cAAcg4N,KAC1B90P,MAAO,sBACPukC,YAAa,yDACbkxN,aAAc,UAN4C,iBAQ7DrB,IAAWsB,eAAiB,CACzBn5N,IAAKn3C,IAAOmF,QAAQG,qBACpBgV,KAAM6uB,IAAMuO,cAAcm4N,KAC1Bj1P,MAAO,gBACPukC,YAAa,8DACbkxN,aAAc,UAb4C,iBAe7DrB,IAAWuB,qBAAuB,CAC/Bp5N,IFxBoCn3C,IAAOmF,QAAQI,4BAAf,WAAiDyqQ,OEyBrF11P,KAAM6uB,IAAMuO,cAAci4N,KAC1B/0P,MAAO,yBACPukC,YAAa,4DACbkxN,aAAc,UApB4C,iBAsB7DrB,IAAWwB,QAAU,CAClBr5N,IAAKn3C,IAAOmF,QAAQK,eACpB8U,KAAM6uB,IAAMuO,cAAco4N,KAC1Bl1P,MAAO,iBACPukC,YAAa,2DACbkxN,aAAc,UA3B4C,iBA6B7DrB,IAAWyB,cAAgB,CACxBt5N,IFpCsCn3C,IAAOmF,QAAQM,qBAAf,WAA0CuqQ,OEqChF11P,KAAM6uB,IAAMuO,cAAcu4N,KAC1Br1P,MAAO,uBACPukC,YAAa,4DACbkxN,aAAc,UAlC4C,KCbrDrzO,IAAYvmB,IAAOC,IAAV,gFAKT8pG,IAAO/pG,IAAOC,IAAV,+GCJJ8zG,IAAO/zG,YAAOkrC,UAAPlrC,CAAH,iVAeJs0B,IAAQt0B,IAAOC,IAAV,yJAQLylG,IAAc1lG,IAAOC,IAAV,gHAMXg6P,IAAej6P,IAAOC,IAAV,0PCPVi6P,I,4BCvBAC,IDOf,YAMwB,IALpBz5N,EAKmB,EALnBA,IACA78B,EAImB,EAJnBA,KACAM,EAGmB,EAHnBA,MACAukC,EAEmB,EAFnBA,YACAkxN,EACmB,EADnBA,aAEM11P,EAAW2oE,oBAAU1oE,GAC3B,OAAO,eAAC,IAAD,CAAMsoC,GAAI/L,EAAKv/B,YAAA,UAAc+C,EAAd,SAAf,UACH,sBAAM/C,YAAA,UAAc+C,EAAd,SAAN,SAAsCL,IACtC,cAAC,IAAD,CAAO1C,YAAA,UAAc+C,EAAd,UAAP,SAAwCC,IACxC,cAAC,IAAD,CAAahD,YAAA,UAAc+C,EAAd,gBAAb,SAAoDwkC,IACpD,cAACuxN,IAAD,CAAc94P,YAAA,UAAc+C,EAAd,UAAd,SAA+C01P,QEnB1CQ,IAAgBp6P,IAAOC,IAAV,4MASba,IAAOd,IAAOC,IAAV,4XACJ,SAAAC,GAAK,OAAIA,EAAMmE,QACd,SAAAnE,GAAK,OAAIA,EAAMmE,QACR,SAAAnE,GAAK,OAAIA,EAAMmE,KAAO,KAiB9Bg2P,IAAWr6P,YAAOc,IAAPd,CAAH,0DAIRs6P,IAAiBt6P,IAAOC,IAAV,iWACd,SAAAC,GAAK,OAAIA,EAAMzB,SACd,SAAAyB,GAAK,uBAAIA,EAAMxB,cAAV,QAAoB,KAiB1B67P,IAAgBv6P,YAAOs6P,IAAPt6P,CAAH,wDAKbw6P,IAAWx6P,YAAOs6P,IAAPt6P,CAAH,0DAIRi6P,IAAej6P,IAAOC,IAAV,4aCjDVw6P,QAZf,WACI,OACI,eAACL,IAAD,WACI,cAACC,IAAD,CAAUh2P,KAAM,KAChB,cAACm2P,IAAD,CAAU/7P,MAAO,MACjB,cAAC+7P,IAAD,CAAU/7P,MAAO,MACjB,cAAC+7P,IAAD,CAAU/7P,MAAO,MACjB,cAAC,IAAD,QCGGi8P,QAVf,WACI,OACI,qCACI,cAACF,IAAD,CAAU/7P,MAAO,KACjB,cAAC+7P,IAAD,CAAU/7P,MAAO,MACjB,cAAC+7P,IAAD,CAAU/7P,MAAO,UCsBdk8P,QAtBf,YAA6D,IAAtCjzP,EAAqC,EAArCA,UAAWvV,EAA0B,EAA1BA,KAC9B,OACI,cAAC,GAAD,CAAam3H,SAAS,UAAU0E,aAAa,EAAO9pH,SAAS,UAAUoqH,cAAc,oBAArF,SACI,eAAC,IAAD,WACK5mH,GACG+xP,IAAcx4P,KAAI,kBACd,cAAC,IAAD,UACI,cAAC,IAAD,UAGVyG,GACEvV,GACAA,EAAK+f,MAAMjR,KAAI,SAAAwkP,GAAM,OACjB,cAAC,IAAD,UACI,cAAC0U,IAAD,gBAAmBT,IAAcjU,EAAOzqP,mBCDrD4/P,I,oGCjBHryP,ICDGsyP,IFGf,WACI,IAAMC,EAAatC,MACbuC,EjBaCzhP,YAAY1U,qBAAWo0P,MiBN9B,OALA11O,qBAAU,WACNw3O,MAED,IAEI,cAAC,IAAD,CACHpzP,UAAWqzP,EAAarzP,UACxBvV,KAAM4oQ,EAAa5oQ,Q,WGddwzG,IAAiB3lG,IAAOC,IAAV,0rCAuDd+6P,IAAYh7P,IAAOC,IAAV,uLASTg7P,IAAyBj7P,IAAOC,IAAV,4LAStBi7P,IAAwBl7P,IAAOC,IAAV,4GAMrBk7P,IAAcn7P,IAAOC,IAAV,yFAEX,SAAAC,GAAK,OAAIA,EAAMs0G,SAAW,sBAAwB,sBACjD,SAAAt0G,GAAK,OAAIA,EAAMs0G,SAAW,UAAY,aAGvC4mJ,IAAyBp7P,IAAOC,IAAV,ujBA2BtBo7P,IAAoBr7P,IAAOC,IAAV,sIAOjBq7P,IAAmBt7P,IAAOC,IAAV,mDAIhBs7P,IAAev7P,IAAOC,IAAV,8LAWZu7P,IAAiBx7P,IAAOC,IAAV,+GAMdw7P,IAAsBz7P,IAAOC,IAAV,sDC5InB82B,IAAsB,CAC/BlkC,WAAY,GACZE,QAAS,KACTL,MAL0B,GAM1BkgB,cAAe,EACfjgB,OAAQ,GCLC+oQ,IAAY17P,IAAOC,IAAV,0EAKTsmB,IAAYvmB,IAAOC,IAAV,8HAOTq0B,IAAQt0B,IAAOC,IAAV,+YAiBL07P,IAAe37P,IAAOC,IAAV,0sBAiCH,SAAAC,GAAK,OAAIA,EAAM07P,iBAAmB,UAAY,YAKvDpnN,IAASx0C,IAAOC,IAAV,oFAaNq6P,KARiBt6P,IAAOC,IAAV,iKAQGD,IAAOC,IAAV,+VACd,SAAAC,GAAK,OAAIA,EAAMzB,UAkBfo9P,IAAoB77P,IAAOC,IAAV,oDASjB67P,KALyB97P,YAAOs6P,IAAPt6P,CAAH,gFAKLA,IAAOC,IAAV,2JAQduwD,IAAOxwD,IAAOC,IAAV,mKASJ87P,IAAY/7P,IAAOC,IAAV,uIAqBTs8O,KAdoBv8O,IAAOC,IAAV,2MAKjB,SAAAC,GAAK,OACVA,EAAM0D,SAAW,mBAAqB,uBAE7B,SAAA1D,GAAK,OACVA,EAAM0D,SAAW,mBAAqB,uBAKrB5D,IAAOC,IAAV,oSC3HX+7P,IAtBsB59P,sBACjC,WAAyBC,GAAQ,EAA9BC,UAA+B,IAApB4F,EAAmB,EAAnBA,SACV,OACI,sBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAO8B,YAAW+C,EAA1G,UACA,oBAAGqrD,YAAU,mBAAb,UACI,sBAAM9vD,GAAG,aAAaqwM,UAAU,iBAAiBjxM,EAAE,IAAIC,EAAE,KAAKL,MAAM,KAAKC,OAAO,KAAhF,SACI,sBAAMa,EAAE,yBAAyBF,KAAK,WAE1C,oBAAG0wM,KAAK,mBAAmB98K,OAAO,UAAU+wE,eAAa,QAAQC,oBAAkB,KAAK+e,iBAAe,QAAQC,kBAAgB,QAA/H,UACI,sBAAM1jH,EAAE,4IACR,sBAAMA,EAAE,gMAGhB,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,gBAAgB5zB,EAAE,6B,SLftDgJ,K,0CAAAA,E,8CAAAA,E,+CAAAA,U,KMcL,I,4BAAM0zP,IAAyB,WAClC,IAAM56P,EAAWO,cACXs6P,ExiBVH,WACH,IAAMpsQ,EAAOC,eACb,OAAOC,uBACH,SAACT,GAAD,OAAYO,EAAKgB,IAAI,aAAcvB,OAAQwB,GAAW,KACtD,CAACjB,IwiBMmBqsQ,GAClBrqP,EAAcnQ,cAMpB,OAAO3R,uBAAY,SAACmB,GAChBkQ,ENjBG,CACHrG,KAAMuN,IAAQ6zP,sBMiBd,IAAMpqP,EAAK,CACPrf,OAAQxB,EAAawB,OACrBD,MAAOvB,EAAauB,MACpBE,MAAOzB,EAAa0B,WACpBU,UAAWpC,EAAaoC,WAE5B,OAAO2oQ,EAAgBlqP,GAClBsZ,MAAK,SAACn5B,GACHkP,ENrBT,SAA6BlP,GAChC,MAAO,CACH6I,KAAMuN,IAAQ8zP,sBACdlqQ,QMkBiBmqQ,CAAoBnqQ,OAEhCq5B,OAAM,SAAC5rB,GACJyB,ENjBT,SAA6BzB,GAChC,MAAO,CACH5E,KAAMuN,IAAQg0P,sBACd38P,SMciB48P,CAAoB58P,EAAMgB,UACnCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAU66P,EAAiBpqP,KC7BtB2qP,IAAgC/pO,IAAM/tB,eAC/C,WACI,MAAM,IAAInF,MAAM,sBCZjB,IAAM+mB,IAAYvmB,IAAOC,IAAV,yKAQTy8P,IAAwB18P,IAAOC,IAAV,kFAKrB08P,IAAoB38P,IAAOC,IAAV,mDAIjB28P,IAA4B58P,YAAOumB,IAAPvmB,CAAH,mEAKzB68P,IAAe78P,YAAOs6P,IAAPt6P,CAAH,oIACP,SAAAE,GAAK,uBAAIA,EAAMihD,iBAAV,QAAuB,UAQjC27M,IAA0B98P,IAAOC,IAAV,wGAMvBqgO,IAAgBtgO,IAAOC,IAAV,oDCvCpB88P,IAAiB,CACnB,CACIC,WAAY,CAAC,IAAI,IAAI,MAEzB,CACIA,WAAY,CAAC,IAAI,IAAI,MAEzB,CACIA,WAAY,CAAC,IAAI,IAAI,OAgBdC,QAZf,WACI,OAAO,mCAAGF,IAAe97P,KAAI,WAAeC,GAAW,IAAxB87P,EAAuB,EAAvBA,WAC3B,OAAO,cAACL,IAAD,CAA+Bx7P,YAAU,4BAAzC,SACH,cAACy7P,IAAD,UAEQI,EAAW/7P,KAAI,SAACxC,EAAOyC,GAAR,OAAkB,cAAC27P,IAAD,CAAcp+P,MAAOA,EAAOC,OAAQ,EAAeyiD,UAAWjgD,IAAU87P,EAAWrqP,OAAS,EAAI,YAAS5hB,EAAWoQ,YAAU,kCAAlFD,SAH1DA,SCkCxBg8P,IA1BkB,WAC3Bv8N,QAAUA,OAAOw8N,MACnBx8N,OAAOw8N,KAAK,SAAU,eAAgB,CAAE,4BAA8B,IAqBxE,OANA75O,qBAAU,WACmB,oBAAhBqd,OAAOw8N,MAChB9rO,QAAQzxB,MAAM,gGAEf,IAhBe,SAAC,GAAgE,IAA9Dw9P,EAA6D,EAA7DA,SAAU3iQ,EAAmD,EAAnDA,OAAQoL,EAA2C,EAA3CA,MAAOw3P,EAAoC,EAApCA,gBACtCC,EAAY,cAChBC,eAAgBH,EAChBv3P,MAAOA,GACJw3P,GAGD18N,QAAUA,OAAOw8N,MACnBx8N,OAAOw8N,KAAK,QAAS1iQ,EAAQ6iQ,KCqDpBE,IA5BwB,WACrC,IAAMC,EAAYP,MACZt1P,EAAU0R,YAAY3R,MACtB8yB,EAAUnhB,YAAYkhB,MAsB5B,OApB+BxqC,uBAAY,SAACyK,EAAgBijQ,GAA2C,IAAD,MAC9FL,EAAqC,cACzCM,QAAgB,OAAP/1P,QAAO,IAAPA,GAAA,UAAAA,EAASnI,UAAT,eAAa7P,aAAc,MACpC4wH,SAAU54G,GAAiB,OAAPA,QAAO,IAAPA,OAAA,EAAAA,EAAS+2B,WAAY,KAArB,OAA2B/2B,QAA3B,IAA2BA,OAA3B,EAA2BA,EAASi3B,UAAW,MACnE++N,OAAe,OAAPh2P,QAAO,IAAPA,OAAA,EAAAA,EAASrX,QAAS,MAC1BstQ,WAAkB,OAAPpjO,QAAO,IAAPA,OAAA,EAAAA,EAASh7B,KAAM,EAC1Bq+P,aAAqB,OAAPrjO,QAAO,IAAPA,OAAA,EAAAA,EAAShnC,OAAQ,MAC/BsqQ,YAAW,oBAAE3pM,aAAF,EAAE,EAA+BhoB,qBAAjC,QAAkD,OACzDsxN,GAAkB,IASxBD,EANmC,CACjCL,SAAU,WACV3iQ,SACA4iQ,sBAID,CAACI,EAAWhjO,EAAS7yB,KCpDpBmqF,IAAKhyE,EAAQ,IA6PJi+O,IC1RHz1P,ICDG01P,IFgCf,WAAgC,IAAD,YACrBC,EAAejC,MACfkC,EAAoBn/F,KACpBo/F,E9iBUH,WACH,IAAMtuQ,EAAOC,eACb,OAAOC,uBACH,SAACquQ,GAAD,OACIvuQ,EAAKwB,OAAL,YAAyB+sQ,GAAY,KACzC,CAACvuQ,I8iBfkBwuQ,GACjBhyJ,EAA8BvzF,eAC9BjH,EAAcnQ,cACd48P,EAAyBf,MAEzB51P,EAAU0R,YAAY3R,MARD,ELdpB2R,YAAY1U,qBAAW63P,MKuBtB/0P,EATmB,EASnBA,UAAiB6hP,EATE,EASRp3P,KATQ,EAUegxB,mBAAS,IAAIhD,MAV5B,mBAUpB+mD,EAVoB,KAULqkE,EAVK,KAYrB3zH,EAAUW,cACVT,EAAWF,EAAQE,SAGnBg0H,ETlDoB,KSgDRt8I,SAASuiG,IAAGngE,MAAM9Z,EAAShjB,QAAQu9F,OAAS,GAE3B,GAE7Bs5C,EAA6B50G,IAC7BynO,EAAY/sO,aAAaC,QAAQ,aAnBZ,EAsBvBoF,aAAqB60G,GADjBx6I,EArBmB,EAqBnBA,aAAcg4B,EArBK,EAqBLA,cAAeuP,EArBV,EAqBUA,UAI/B+3D,EADoBs5C,IACNuC,CAAkB,CAClCz5I,WAAU,OAAE1B,QAAF,IAAEA,OAAF,EAAEA,EAAc0B,WAC1B0jG,YAAqB,OAATgzJ,QAAS,IAATA,GAAA,UAAAA,EAAWr3O,aAAX,eAAkBS,SAAU,IAG5C2Q,qBAAU,YACC,OAAP1b,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAa2qQ,EAAa,6BAAK/sQ,GAAN,IAAoBoC,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,aAC1Eg4I,EAAiB,IAAIprH,QAEtB,QAACvY,QAAD,IAACA,OAAD,EAACA,EAASrU,YAQb,IAAMs/F,EAAmB7iG,uBACrB,SAACi5E,EAAGt2E,GACA+lC,EAAU/lC,IACH,OAAPiV,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAa2qQ,EAAa,6BAAK/sQ,GAAN,IAAoBwB,SAAQY,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,eAEtF,CAACpC,EAAc+sQ,EAAcxlO,EAA7B,OAAwC9wB,QAAxC,IAAwCA,OAAxC,EAAwCA,EAASrU,YAG/CqoQ,EAAmB39O,mBAAQ,WAAO,IAAD,IACnC,OAAO/X,aAAW,OAAC0B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAASwS,aAAkB,OAAC2B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,QAC9E,QAACmU,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OAGbgrQ,EAA0BzuQ,sBAC5Bu6D,oBAAS,kBAAMg0M,EAAuB,6BAA4B,KAClE,IAGJj7O,qBAAU,WACNnyB,EAAa0B,aAAb,OAA2B4rQ,QAA3B,IAA2BA,UAC5B,CAACttQ,EAAa0B,WAAY4rQ,IAE7Bn7O,qBAAU,WACNi7O,EAAuB,2BAExB,IAKH,IAAMp3L,EAAcn3E,uBAAY,WAC5BuuQ,EAAuB,yBACvBptQ,EAAauB,MT5GS,GS6GtBvB,EAAawB,OAASm5I,GACf,OAAPlkI,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAa2qQ,EAAa,6BAAK/sQ,GAAN,IAAoBoC,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,aAC1Eg4I,EAAiB,IAAIprH,QAEtB,CAAC2rH,EAAe36I,EAAc+sQ,EAA9B,OAA4Ct2P,QAA5C,IAA4CA,OAA5C,EAA4CA,EAASrU,YAMlDygP,EAAqBhkP,uBACvB,SAAC6C,GACGs2B,EAAct2B,IACP,OAAP+U,QAAO,IAAPA,OAAA,EAAAA,EAASrU,YAAa2qQ,EAAa,6BAAK/sQ,GAAN,IAAoB0B,aAAYU,UAAS,OAAEqU,QAAF,IAAEA,OAAF,EAAEA,EAASrU,eAE1F,CAACpC,EAAc+sQ,EAAc/0O,EAA7B,OAA4CvhB,QAA5C,IAA4CA,OAA5C,EAA4CA,EAASrU,YAGnDmrQ,EAAuB,WAAQlmP,YAAUZ,EAASruB,IAAO0F,UAAUE,cAAeovQ,EAAuB,yBAmBzGI,EAAuB3uQ,uBACzB,SAACiqD,EAAsCglH,GACnChlH,EAAM30B,kBACNgnF,EAA4B,CACxB7+D,WAAY,mBACZ/E,YACI,oFACJiF,kBAAmB,SACnBC,iBAAkB,SAClBC,UAAW,WACPuwN,EAAe,CAACn/F,EAAWrvK,aAAa07B,MAAK,SAACn5B,GAC1CosQ,EAAuB,2BACvBzsP,EAAY,4BAA6B,WACzCq1D,YAMhB,CAACmlC,EAA6B8xJ,EAAgBj3L,EAAar1D,IAIzD8sP,EAAoBh3P,IAAY1B,aAAW,UAAC0B,EAAQ5T,YAAT,aAAC,EAAcP,OAASwS,aAAkB,UAAC2B,EAAQ5T,YAAT,aAAC,EAAcP,OAEpGorQ,EAAc,eAAC/C,IAAD,WAChB,cAAC,IAAD,UAAO8C,EAAoB,mBAAqB,mDAChD,cAAC,IAAD,CAAQh7P,UAAWg7P,EAAmBj8P,SAAU,GAAIgB,MAAO,CAAEswB,WAAY,OAAQm9B,OAAQwtM,EAAoB,UAAY,WAAa/9P,QAAQ,cAAcpG,OAAQikQ,EAAsB1jQ,KAAK,SAASkJ,SAAS,sBAAjN,gCAGJ,OAAO,eAAC,GAAD,CAAaolH,SAAS,cAAcgF,cAAc,wBAAwBN,aAAa,EAAO9pH,SAAS,YAAY2nH,UACtH,eAAC6vI,IAAD,CAAWv6P,YAAU,qBAArB,UAA0C,4EACtC,cAACk6P,IAAD,UACI,cAAChqM,IAAA,EAAD,CACI52D,OAAQ,kBAAM8jQ,EAAuB,0BACrChkQ,KAAM,eAAC+gQ,IAAD,WACF,cAACC,IAAD,8EACA,cAACC,IAAD,wPAEJlqM,eAAe,EACfptD,SAAS,0BAVlB,UAeH,cAAC,gBAAD,CACIusF,YAAaA,EACbt+F,KAAI,OAAEo3P,QAAF,IAAEA,OAAF,EAAEA,EAAWr3O,MACjBirF,2BAA4B,CACxBj2B,cAAeA,EACfC,YAAaA,EACbjjE,SAAU,sBACVkjE,QAAS,CACL,CACI3zE,KAAM,kBACNoQ,KAAM,cAAC,GAAD,IACNkjE,QAAS23L,EACTx6P,SAAU,sBACVN,UAAWg7P,KAIvB5hK,kBAAmB,CACfd,cAAe,CACX/pF,WAAU,OAAEo3O,QAAF,IAAEA,OAAF,EAAEA,EAAWlwM,MACvBygB,aTnNU,GSoNVm4B,aAAcY,EACdX,wBAAwB,EACxBhuF,SAAU,oBAEd63F,mBAAoB,CAChB7xC,aAAc/4D,EAAa0B,WAC3B2pG,eAAgBw3I,EAChB9vO,SAAU,mBACVu4F,wBACI,OAAC8sJ,QAAD,IAACA,OAAD,EAACA,EAAWr3O,MAAMS,UACjBxhB,EAAa0B,WAAW8f,SAGrC0+E,8BAA+B,CAC3BE,sBACK7pF,GAA0C,KAApB,OAAT6hP,QAAS,IAATA,GAAA,UAAAA,EAAWr3O,aAAX,eAAkBS,QACpC+9E,iBAAkB,CACd7sF,KAAMm4P,IACNzhQ,KAAMskQ,EACN36P,SAAU,cAEdysF,uBAAwB,CACpBh4C,WAAY,YACZz0C,SAAU,uBAGlBm5F,eAAgB,CACZpQ,QAAS,GACTyC,UAAW,CACPxrF,SAAU,gBACVyrF,MAAO,OAKfjoF,EACI,cAACm0P,IAAD,UACI,cAAC,IAAD,MAEJ,cAAC,IAAD,aACM,OAACtS,QAAD,IAACA,GAAD,UAACA,EAAWr3O,aAAZ,aAAC,EAAkBS,UAApB,OAA8B42O,QAA9B,IAA8BA,OAA9B,EAA8BA,EAAWr3O,MAAMjR,KAAI,SAACwoP,GAAc,IAAD,IAC9D,OAAO,eAACkS,IAAD,CAAcx6P,YAAU,gBAAgBiD,QAAS,SAACihB,GACrDA,EAAEC,kBACF1N,EAAQH,KAAKluB,IAAO0F,UAAUjD,OAAO2D,QACjC,cACA85P,EAAShqP,GAAG7P,aAEhB2uQ,EAAuB,8BACxB3C,iBAAkBA,EAPd,UAQH,cAAC,IAAD,CAAOz6P,YAAU,iBAAjB,SAAmCsoP,EAAStlP,QAC5C,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC43P,IAAD,CAAW56P,YAAU,sBAArB,UAAoD,OAARsoP,QAAQ,IAARA,GAAA,UAAAA,EAAUqV,aAAV,eAAiBngO,WAAY,KAA7B,OAAmC8qN,QAAnC,IAAmCA,GAAnC,UAAmCA,EAAUqV,aAA7C,aAAmC,EAAiBjgO,YADpG,WAC4H,sBAAM19B,YAAU,qBAAhB,SAAsC4f,KAAM0oO,EAAS1c,aAAa5qN,OAAO,0BAGrM,qBAAK7jB,UAAU,gBAAf,SACA,eAAC,GAAD,CAAcw2G,YAAa,IAAKU,UAAU,EAAOtxG,SAAS,gBAAgB6wG,WAAY,EAAtF,UACI,cAAC,GAAD,CAAY7wG,SAAS,mBAAmBE,QAAS,kBA7IxD3E,EA6I8EgqP,EAAShqP,GA7I3E0E,EA6I+EslP,EAAStlP,WA5IzHg6P,EAAkB,CACdl/F,WAAYx/J,EAAG7P,WACfuU,MAAO+sI,GAAyB/sI,KACjCmnB,MAAK,SAACm+N,GACL33O,EAAY,+BAAgC,WAC5CysP,EAAuB,8BACvB3mP,EAAQH,KAAR,UAAgBluB,IAAO0F,UAAUjD,OAAO2D,QACpC,cACA85P,EAAShqP,GAAG7P,cAEF,OAAd4uQ,GAAsB/sO,aAAaI,QAC/B,YACA,WAbY,IAACpyB,EAAY0E,GA6IL,uBAGA,cAAC,GAAD,CAAYD,SAAS,gBAAgBo9D,aAAa,EAAMl9D,QAAS,SAACihB,GAAD,OAAOs5O,EAAqBt5O,EAAGokO,EAAShqP,KAAzG,0C,SC7QxB8I,K,kEAAAA,E,+DAAAA,U,KAUL,IERKw2P,ICHAx2P,IHyBCy2P,IAA4B,SACrC9tO,EACAr+B,GAFqC,MAGF,CACnCmI,KAAMuN,IAAQ02P,8BACd/tO,MACAr+B,eI5BSqsQ,IAAiC,SAAChuO,GAC3C,IAAM7vB,EAAWO,cAEjB,OAAO5R,uBAAY,SAACmvQ,GAChB99P,EJImC,SACvC6vB,EACAiuO,GAFuC,MAGF,CACrCnkQ,KAAMuN,IAAQ62P,gCACdluO,MACAiuO,kBIVaE,CAA4BnuO,EAAKiuO,IACrCA,GACD99P,EAAS29P,IAA0B9tO,EAAK,OAE7C,CAACA,EAAK7vB,M,SFRD09P,K,0BAAAA,E,0BAAAA,E,gCAAAA,E,iBAAAA,U,cCHAx2P,K,wCAAAA,E,yDAAAA,U,KASL,IETKA,IFSC+2P,IAAmB,SAC5BC,GAD4B,MAEF,CAC1BvkQ,KAAMuN,IAAQi3P,mBACdD,yBGGSE,IAA6B,WACtC,IAAMp+P,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EAASi+P,IAAiB,SAC3B,CAACj+P,KAGKq+P,IAA6B,WACtC,IAAMr+P,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC2lH,GAChBt0G,EHP+B,SACnCs0G,GADmC,MAEF,CACjC36G,KAAMuN,IAAQo3P,2BACdhqJ,cGGaiqJ,CAAwBjqJ,MAClC,CAACt0G,M,SD7BIkH,K,wCAAAA,E,yDAAAA,U,KASL,IAAMs3P,IAAmB,SAC5BC,GAD4B,MAEF,CAC1B9kQ,KAAMuN,IAAQw3P,mBACdD,mBEbSE,IAAsD,CAC/DF,eAAgB,KAChBnqJ,YAAY,GCwBHsqJ,IAA2B,kBACpC3mP,aAAY,SAAAxX,GAAK,OAAIA,EAAMo+P,4BCXlBC,IAAuB,WAChC,IAAM9+P,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EAASw+P,IAAiB,SAC3B,CAACx+P,KAGK++P,IAA6B,WACtC,IAAM/+P,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC2lH,GAChBt0G,EJR+B,SACnCs0G,GADmC,MAEF,CACjC36G,KAAMuN,IAAQ83P,2BACd1qJ,cIIa2qJ,CAAwB3qJ,MAClC,CAACt0G,KC7BFk/P,IAAqB,iBCgBpB,SAASC,MAA4B,IAAD,IDd5B,SAAsBhrP,GAAwC,IAA1BirP,EAAyB,uDAAN,IAAM,EAC9Ct9O,qBAD8C,mBACjEtd,EADiE,KAC1DwkD,EAD0D,KAElEq2M,EAAqBv7O,mBASrBuqJ,EAAO1/K,uBAAY,WAAsB,IAArB2wQ,EAAoB,wDAC1C3rI,cAAc0rI,EAAc3wO,SAC5B6wO,eAAexkO,WAAWmkO,KACrBI,GACDt2M,OAASt5D,KAEd,IAWGq3F,EAAQp4F,uBAAY,WACtBq6D,EAAS70C,GACTorP,eAAe/uO,QAAQ0uO,KAAoB,IAAIpgP,MAAOvwB,YACtD8wQ,EAAc3wO,QAAU2hJ,aACpB,WACI,IAAMmvF,EAAuBD,eAAelvO,QAAQ6uO,KACpD,GAAIM,EAAsB,CACtB,IAAM52H,EAAY,IAAI9pH,KAAK0gP,GAErBC,GADU,IAAI3gP,MACcyoD,UAAYqhE,EAAUrhE,UAClDm4L,EAAgBtuP,KAAK87H,MAAMuyH,EAAoB,KAC/Cj7P,EAAQ4M,KAAKyqC,IAAI1nC,EAAOurP,EAAe,GAC7C12M,EAASxkD,QAET6pK,MAGR+wF,KAEL,CAACjrP,EAAMirP,EAAU/wF,IAepB,OAbApsJ,qBAAU,WACe,kBAAVzd,GAAgC,IAAVA,GAC7B6pK,MAEL,CAACA,EAAM7pK,IAEVyd,qBAAU,WACN,OAAO,WACHosJ,GAAK,MAGV,IAEI,CAAE7pK,QAAOuiF,SC/C2C44K,CAAa,IAAzDC,EADwB,EAC/Bp7P,MAAgCq7P,EADD,EACN94K,MADM,EAECjlE,oBAAS,GAFV,mBAEhCg+O,EAFgC,KAElBC,EAFkB,KAGjCx5P,EAAU0R,YAAY3R,MAEtB05P,E3CCH,WACH,IAAMvxQ,EAAOC,eACb,OAAOC,uBACH,SAACsxQ,EAAYC,GAAb,OACIzxQ,EAAKG,KAAL,mBAAsBqxQ,EAAtB,YAA4CC,GAAY,KAC5D,CAACzxQ,I2CNqB0xQ,GACpB1vP,EAAcnQ,cAwBpB,MAAO,CAAEw/P,eAAcF,mBAAkBQ,eAtBlBzxQ,uBACnB,SAACsxQ,EAAoBC,GACjBH,GAAgB,GAChBC,EAAkBC,EAAYC,GACzBj2O,MAAK,WAAO,IAAD,EACRxZ,EACI,oEACA,WAEC7L,aAAkB,OAAC2B,QAAD,IAACA,GAAD,UAACA,EAAS5T,YAAV,aAAC,EAAeP,OACnCytQ,IAEJE,GAAgB,MAEnB51O,OAAM,SAAC5rB,GACJwhQ,GAAgB,IACX,OAALxhQ,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWkR,EAAYlS,EAAMgB,QAAS,cAGzD,CAACygQ,EAAD,OAAoBz5P,QAApB,IAAoBA,GAApB,UAAoBA,EAAS5T,YAA7B,aAAoB,EAAeP,KAAMqe,EAAaovP,KAM9D,I,gBAQO,SAASQ,MAAmC,IAAD,EACRv+O,oBAAS,GADD,mBACvCw+O,EADuC,KAC1BC,EAD0B,KAExCC,E3CxBH,WACH,IAAM/xQ,EAAOC,eACb,OAAOC,uBACH,SAACsxQ,EAAYC,GAAb,OACIzxQ,EAAKG,KAAL,mBAAsBqxQ,EAAtB,yBAAyDC,GAAY,KACzE,CAACzxQ,I2CmB4BgyQ,GAC3BhwP,EAAcnQ,cAepB,MAAO,CAAEggQ,cAAaI,sBAbQ9jP,mBAAQ,kBAClCssC,oBAAS,SAAC+2M,EAAoBC,GAC1BM,EAAyBP,EAAYC,GAChCj2O,MAAK,SAACpsB,GACH0iQ,EAAe1iQ,EAAO8iQ,cAEzBx2O,OAAM,SAAC5rB,IACC,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOgB,UAAWkR,EAAYlS,EAAMgB,QAAS,cApBtB,OAuBnC,CAACihQ,EAA0B/vP,KCxE5B,IAAMyU,IAAYvmB,IAAOC,IAAV,+GAMT8pN,IAAU/pN,IAAOC,IAAV,sIAOPgiQ,IAAWjiQ,IAAOC,IAAV,mIAORiiQ,IAAYliQ,IAAO0nB,KAAV,uDCuBPy6O,QAzCf,YASoC,IARhCt+G,EAQ+B,EAR/BA,iBACAu+G,EAO+B,EAP/BA,gBACAC,EAM+B,EAN/BA,WACAhjK,EAK+B,EAL/BA,SACAijK,EAI+B,EAJ/BA,gBACAC,EAG+B,EAH/BA,UACAC,EAE+B,EAF/BA,QACAxuC,EAC+B,EAD/BA,UAEA,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CACIhxN,MAAO6gJ,EAAmB,OAAS,UACnCjgJ,SAAUigJ,EACV9/I,QAASq+P,EACTp+P,YAAa,GACbC,aAAa,QACbR,MAAO4+P,EACP5nQ,OAAQ4kG,EACR5gG,MAAM,QACNyF,SAAS,2BAEb,cAAC,IAAD,CACIlB,MAAOs/P,EAAkB,OAAS,UAClC1+P,SAAU0+P,EACV7+P,MAAO8+P,EACP9nQ,OAAQ,kBAAM+nQ,KACd3hQ,QAAQ,UACRpC,MAAM,QACNyF,SAAS,2BAGjB,eAAC+9P,IAAD,CAAU9gQ,YAAU,oBAApB,oCAC2B,cAAC+gQ,IAAD,UAAYluC,WCKpCyuC,IC1CAC,IDGf,YAMgC,IAL5Bt9P,EAK2B,EAL3BA,KACA4uN,EAI2B,EAJ3BA,UACA30H,EAG2B,EAH3BA,SACAmjK,EAE2B,EAF3BA,QACAvB,EAC2B,EAD3BA,iBAEMoB,EAAapkP,mBAAQ,WACvB,OAAQ7Y,GACJ,IAAK,UACD,MAAO,GACX,IAAK,SACD,MAAO,uBACX,QACI,GAAa,YAATA,GAAsB67P,EAAkB,CACxC,IAAMxyH,EAAO1tH,OACRyB,QAAQ,OACR5N,IAAIqsP,EAAkB,UACtB9+O,OAAO,SACZ,MAAM,eAAN,OAAsBssH,GAE1B,MAAO,cAEhB,CAACrpI,EAAM67P,IAEV,OACI,cAAC,IAAD,CACIp9G,iBAA2B,YAATz+I,EAClBg9P,gBAA0B,YAATh9P,EACjBi9P,WAAYA,EACZhjK,SAAUA,EACVijK,gBAA0B,aAATl9P,EACjBm9P,UAAU,QACVC,QAASA,EACTxuC,UAAWA,KE9BR,SAAS2uC,IACpB5kM,EACA0hD,GAEA,IAAM3nG,EAAWC,cACX6qP,EAAgBz9O,iBAAsB,MAE5C7B,qBAAU,WACN,IACM06C,EADc,IAAI8oC,gBAAgBhvF,EAAShjB,QAClBhE,IAAIitE,GAE/BC,IAAe4kM,EAAc7yO,UAC7B6yO,EAAc7yO,QAAUiuC,EACxByhD,EAASzhD,MAEd,CAACyhD,EAAU3nG,EAAShjB,OAAQipE,IChB5B,SAAS8kM,MACZ,IAAM/qP,EAAWC,cACXH,EAAUW,cAEhB,OAAOvoB,uBACH,SAAC+tE,EAAmBC,GAChB,IAAM2rC,EAAc,IAAI7C,gBAAgBhvF,EAAShjB,QACjD60G,EAAY9tD,IAAIkiB,EAAWC,GAG3BpmD,EAAQjoB,QAAQ,CAAEmF,OAAQ60G,EAAY/5G,eAE1C,CAACgoB,EAASE,EAAShjB,SClBpB,I,gBAAMiiC,IAAoC,CAC7ClkC,WAAY,GACZE,QAAS,CAAEC,MAAO,OAAQC,KAAK,GAC/BP,MAAO,IACPC,OAAQ,EACRwf,WAAY,EACZS,cAAe,EACf8kB,eAAgB,IAGPorO,IAA+B,aCU7BC,IAnBuB3kQ,sBAClC,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPW,KAAK,OACLV,MAAM,6BACNC,WAAW,+BARf,SAUI,sBAAM4wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yjBAAyjBF,KAAK,iBCbjnBknB,IAAYvmB,IAAOC,IAAV,2OAUTq0B,IAAQt0B,IAAOC,IAAV,+IAIL,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,0BAIjDqtJ,IAAgBhjQ,YAAOs6P,IAAPt6P,CAAH,iGAKbijQ,IAAYjjQ,IAAOC,IAAV,uICUPijQ,I,wBAAAA,IA3Bf,YAKuB,IAJnB/+P,EAIkB,EAJlBA,MACAuD,EAGkB,EAHlBA,UACAiuG,EAEkB,EAFlBA,WACAkW,EACkB,EADlBA,UAEA,OACI,cAAC,IAAD,UACKnkH,EACG,mCACI,cAACs7P,IAAD,CAAevkQ,MAAO,QAG1B,qCACI,cAAC,IAAD,CACIk3G,WAAYA,EACZx0G,YAAA,UAAc0rE,oBAAU1oE,GAAxB,iBAFJ,SAIKA,IAEJ0nH,GAAa,cAAC,IAAD,CAAW1qH,YAAA,UAAc0rE,oBAAU1oE,GAAxB,oBAAX,SAA8D0nH,UC3BnFs3I,KAAqD,wBAC7DpE,IAA0BqE,iBAAcryQ,GADqB,iBAE7DguQ,IAA0Bl4P,iBAAc9V,GAFqB,iBAG7DguQ,IAA0BsE,oBAAiBtyQ,GAHkB,iBAI7DguQ,IAA0BuE,YAASvyQ,GAJ0B,KCiCrDwyQ,IAAuB,kBAChCjqP,aAAY,SAAAxX,GAAK,OAAIA,EAAM0hQ,iBChClBj9O,IAAYvmB,IAAOC,IAAV,oKAST4pD,IAAe7pD,IAAOC,IAAV,8CAIZwhD,IAAczhD,YAAOokB,KAAPpkB,CAAH,iDAIX4wD,IAAgB5wD,IAAOC,IAAV,qHAOb6pD,IAAa9pD,YAAO+pD,KAAP/pD,CAAH,8DCWRyjQ,QA9Bf,YAM0B,IALtB59P,EAKqB,EALrBA,MACA0kB,EAIqB,EAJrBA,SACA07C,EAGqB,EAHrBA,OACAgH,EAEqB,EAFrBA,UACA/nD,EACqB,EADrBA,SAEA,OACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAe/jB,YAAU,qBAAzB,SACI,cAAC,IAAD,MAEJ,cAAC,IAAD,UACI,cAAC,IAAD,CACI9C,IAAK6mB,EACL+kC,YAAY,SACZnkC,aAAcyE,EACd1kB,MAAOA,EACPlD,SAAS,OACTjE,OAAO,OACPqtD,WAAW,EACXkhB,UAAWA,EACXhH,OAAQA,EACR/hE,SAAS,8BCiBdw/P,I,4CC/CArvK,IDGf,YAAyF,IAAxDxuF,EAAuD,EAAvDA,MAAO0kB,EAAgD,EAAhDA,SAAUo5O,EAAsC,EAAtCA,OAAQz+O,EAA8B,EAA9BA,SAChDY,EAAe91B,uBACjB,SAACq1B,GACGA,EAAEolC,UACF,IAAM5kD,EAAQwf,EAAEgwB,OAAOxvC,MACvB0kB,EAAS1kB,KAEb,CAAC0kB,IASCq5O,EAAgB5zQ,uBAClB,SAACiqD,GACG,IAAM5E,EAAS4E,EAAMuuB,cACjB2vC,GAAWl+D,KACX0pN,IACAtuN,EAAO2hM,UAGf,CAAC2sB,IAGCE,EAAa7zQ,uBAAY,WACtB6V,GACD89P,MAEL,CAACA,EAAQ99P,IAEZ,OACI,cAAC,IAAD,CACIA,MAAOA,EACP0kB,SAAUzE,EACVmgD,OAAQ49L,EACR52L,UAAW22L,EACX1+O,SAAUA,KErCTqB,IAAYvmB,IAAOC,IAAV,2OAUTq0B,IAAQt0B,IAAOC,IAAV,+IAIL,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,0BAIjDmuJ,IAAa9jQ,IAAOC,IAAV,8FAMV6pD,IAAa9pD,YAAO+pD,KAAP/pD,CAAH,wEACN,SAAAE,GAAK,OAAIA,EAAMy1G,WAAa,cAAgB,iBAC/C,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aAGzCqtJ,IAAgBhjQ,YAAOs6P,IAAPt6P,CAAH,iGAKb+jQ,IAAe/jQ,YAAOc,IAAPd,CAAH,kGAKZgkQ,IAAiBhkQ,IAAOC,IAAV,wJAQdgkQ,IAAgBjkQ,IAAOC,IAAV,2HAObikQ,IAAclkQ,IAAOC,IAAV,6GAMXkkQ,IAAiBnkQ,IAAOC,IAAV,iIAOdmkQ,IAAcpkQ,IAAOC,IAAV,6PCUTokQ,QAlEf,YAaqC,IAZjClgQ,EAYgC,EAZhCA,MACAuD,EAWgC,EAXhCA,UACA48P,EAUgC,EAVhCA,UACA3uJ,EASgC,EAThCA,WACA20B,EAQgC,EARhCA,cACAi6H,EAOgC,EAPhCA,gBACA1xQ,EAMgC,EANhCA,WACA2xQ,EAKgC,EALhCA,aACAC,EAIgC,EAJhCA,aACAC,EAGgC,EAHhCA,SACAlC,EAEgC,EAFhCA,QACAt9O,EACgC,EADhCA,SAEA,OACI,cAAC,IAAD,UACKq/O,EACG,eAACP,IAAD,WACI,cAAC,IAAD,CACI9+O,SAAUA,EACVrf,MAAOhT,EACP03B,SAAUm6O,EACVf,OAAQc,IAEZ,eAACR,IAAD,aACOpxQ,GAAc,qCACb,cAACqxQ,IAAD,CACI9/P,QAASo+P,EACTrhQ,YAAU,4BAFd,mBAMA,cAACgjQ,IAAD,OAEJ,cAACC,IAAD,CACIhgQ,QAASqgQ,EACTtjQ,YAAU,4BAFd,SAII,cAACkzD,GAAA,EAAD,CAAOr5D,KAAK,iBAIxB0M,EACA,qCACI,cAAC,IAAD,CAAejJ,MAAO,MACtB,cAACslQ,IAAD,CAAc1/P,KAAM,QAGxB,qCACI,cAAC,IAAD,CACIsxG,WAAYA,EACZx0G,YAAA,UAAc0rE,oBAAU1oE,GAAxB,iBAFJ,SAIKA,IAEJmgQ,GACG,cAACR,IAAD,CAAY1/P,QAASogQ,EAAcrjQ,YAAU,qBAA7C,SACI,cAAC,IAAD,CAAYw0G,WAAYA,GAAc20B,YCHnDq6H,I,ICtEAA,IDWf,YAQiC,IAAD,EAP5BC,EAO4B,EAP5BA,SACAzgQ,EAM4B,EAN5BA,MACAuD,EAK4B,EAL5BA,UACA48P,EAI4B,EAJ5BA,UACA3uJ,EAG4B,EAH5BA,WACA20B,EAE4B,EAF5BA,cACAo6H,EAC4B,EAD5BA,SAC4B,YACWnB,MAAuBqB,UADlC,QAC+C,GAAnE/xQ,EADoB,EACpBA,WAAYssQ,EADQ,EACRA,eACd0F,EAAkB3F,IAA+B0F,GACjDz7O,E1BRkC,SAAC+H,GACzC,IAAM7vB,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC6C,GAChBwO,EAAS29P,IAA0B9tO,EAAKr+B,MACzC,CAACq+B,EAAK7vB,I0BGayjQ,CAA6BF,GAC7CG,EAAiB7pJ,GAAgBroH,GAJX,EAKCykH,KALD,mBAKrBpyF,EALqB,KAKXu0F,EALW,KAOtBurJ,EAAmBh1Q,uBAAY,YAC7Bs0Q,GAAc3uJ,GAAe20B,GAC7Bu6H,GAAgB,KAErB,CAACP,EAAW3uJ,EAAY20B,EAAeu6H,IAEpCI,EAAmBj1Q,uBAAY,WACjC60Q,GAAgB,KACjB,CAACA,IAEEK,EAAcl1Q,uBAAY,WAC5Bm5B,EAAc,IACdswF,MACD,CAACA,EAAUtwF,IAERg8O,EAAoBlnP,mBACtB,kBAAMssC,mBAASm6M,EAAUl6M,QACzB,CAACk6M,IASL,OANAphP,qBAAU,YACAyhP,GAAmBlyQ,IAAekyQ,IAAmBlyQ,GAC3DsyQ,EAAkBtyQ,KAEnB,CAACA,IAGA,cAAC,IAAD,CACIsR,MAAOA,EACPuD,UAAWA,EACX48P,UAAWA,EACX3uJ,WAAYA,EACZ20B,cAAeA,EACfi6H,gBAAe,OAAEpF,QAAF,IAAEA,KACjBtsQ,WAAU,OAAEA,QAAF,IAAEA,IAAc,GAC1B2xQ,aAAcQ,EACdP,aAAcQ,EACdP,SAAUv7O,EACVq5O,QAAS0C,EACThgP,SAAUA,KEjETiK,IAAUnvB,IAAOC,IAAV,6ICkBLmlQ,I,YAAAA,IAdf,SAA6BllQ,GAAkC,IACnDmlQ,EAA0BnlQ,EAA1BmlQ,YAAa3hQ,EAAaxD,EAAbwD,SACf4hQ,EAAwBD,EAE9B,OACI,eAAC,IAAD,WACKC,EAAsBV,SACjB,cAAC,IAAD,gBAA4BU,IAC5B,cAAC,IAAD,gBAAkBD,IAH5B,IAIO3hQ,MCbF6iB,IAAYvmB,IAAOC,IAAV,oJAQT47P,IAAoB77P,IAAOC,IAAV,wDAIjBwlE,IAAsBzlE,IAAOC,IAAV,wDC2EjBslQ,QAzEf,SAA8BrlQ,GAAmC,IAEzD+mL,EAQA/mL,EARA+mL,eACAljL,EAOA7D,EAPA6D,QACAyhQ,EAMAtlQ,EANAslQ,sBACA1F,EAKA5/P,EALA4/P,eACAP,EAIAr/P,EAJAq/P,qBACA5pJ,EAGAz1G,EAHAy1G,WACA8vJ,EAEAvlQ,EAFAulQ,mBACAC,EACAxlQ,EADAwlQ,uBAGJ,OACI,cAAC,IAAD,CACIL,YAAa,CACTT,SAAU7F,IAA0Bl4P,YACpC1C,MAAO,cACPmgQ,WAAYlhO,kBAAO,OAAC6jJ,QAAD,IAACA,OAAD,EAACA,EAAgB/0K,OACpCwyP,SAAUe,EACV/9P,UAAW3D,EACX4xG,WAAYA,GAPpB,SAUI,cAAC,IAAD,UACK5xG,EACG,cAAC,IAAD,UAAmB,cAAC,IAAD,MACnBq/B,kBAAO,OAAC6jJ,QAAD,IAACA,OAAD,EAACA,EAAgB/0K,OACxB,cAAC,IAAD,UACI,cAAC,MAAD,CACIvP,SAAU,GACVkB,KACI2hQ,EACMt+O,KACA67O,IAEV/zM,UAAW,CACPvwD,MAAO,GACPC,OAAQ,GACRyuC,aAAc,GAElBjpC,SAAU,kBAZd,SAcKshQ,EACG,oBACA1F,EACA,sBAEA,sBAAM3+P,YAAU,kCAAhB,qDArBZ,OA4BA8lL,QA5BA,IA4BAA,OA5BA,EA4BAA,EAAgB/0K,MAAMjR,KAAI,SAAAmS,GAAI,OAC1B,cAAC,GAAD,CAEI0S,aAAc,kBACV4/O,EAAuBtyP,EAAK9d,eAEhCqV,QAAS40P,IAAyBnsP,EAAK9d,aACvC+O,KAAM,GACNZ,MAAO2P,EAAK3f,KACZyQ,SAAS,0BACTN,SAAU+xG,GARLviG,EAAK9d,sBCtEzBqwQ,IAAsD,CAC/DpG,qBAAsB,KACtB5pJ,YAAY,GCwBHiwJ,IAA2B,kBACpCtsP,aAAY,SAAAxX,GAAK,OAAIA,EAAM+jQ,4BCwEhBC,I,gBAAAA,IAjFf,WAAuC,IAAD,EAC1BhG,EAAmBG,MAAnBH,eAD0B,EAER7jJ,KAAlB9pH,EAF0B,EAE1BA,KAAM4R,EAFoB,EAEpBA,QACRgiQ,EAAqB7qJ,GAAgB4kJ,GAHT,EAKW8F,MAArCrG,EAL0B,EAK1BA,qBAAsB5pJ,EALI,EAKJA,WACtB9iH,GAN0B,UAMX0wQ,MAAuBxE,IAA0Bl4P,oBANtC,QAMsD,IAAhFhU,WACFgyQ,EAAkB3F,IAA+BH,IAA0Bl4P,aAC3Em/P,EAA0BvG,MAC1BwG,EhCtByB,WAC/B,IAAM5kQ,EAAWO,cAEjB,OAAO5R,uBACH,SAACuvQ,GACGl+P,EAASi+P,IAAiBC,MAE9B,CAACl+P,IgCesB6kQ,GACrBC,EAAgBtD,MAEhB2C,EAAwBvnP,mBAC1B,kBAAMmlB,kBAAO,OAACjxC,QAAD,IAACA,OAAD,EAACA,EAAM+f,UAAYrf,GAAcA,EAAW8f,OAAS,IAClE,QAACxgB,QAAD,IAACA,OAAD,EAACA,EAAM+f,MAAOrf,IAGZuzQ,EAA+Bp2Q,uBAAY,SAACsF,GAC1CA,EACA2wQ,EAAmB3wQ,GAEnB0wQ,MAEL,CAACA,EAAyBC,IAEvBI,EAAwBr2Q,uBAAY,SAACsF,GAA2B,IAAD,EACjE6wQ,EAAcrD,IAAD,iBAA+BxtQ,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAc1F,kBAA7C,QAA2D,IACxEw2Q,EAA6B9wQ,KAC9B,CAAC6wQ,EAAeC,IAEnBzD,IAAsBG,KAA8B,SAAAxtQ,GAChD,IAAMmK,EAAKnK,GAAgBA,EAAe,MACxBiqQ,IAAyB9/P,GAAO8/P,IAAyB9/P,GAEvE2mQ,EAA6B3mQ,MAIrC,IAAMu8H,EAA4BD,IAC7B+jI,GAAkB,GAAGlwQ,YAGpB02Q,EAAiBroP,mBACnB,kBAAM6hP,EAAiB9jI,EAA4B,OACnD,CAACA,EAA2B8jI,IAG1ByG,EAAev2Q,uBAAY,SAAC6C,GAChB,OAAdyzQ,QAAc,IAAdA,KAAc,6BACPvvO,KADO,IAEVlkC,kBAEL,CAACyzQ,IAeJ,OAbAhjP,qBAAU,WACFw8O,IAGIiG,IACAM,OAAsBt1Q,GACtB8zQ,GAAgB,IAEN,OAAdyB,QAAc,IAAdA,KAAiBvvO,QAGtB,CAAC+oO,IAGA,cAAC,IAAD,CACI74E,eAAgB90L,EAChB4R,QAASA,EACTyhQ,sBAAuBA,EACvB1F,eAAgBA,EAChBP,qBAAsBA,EACtB5pJ,WAAYA,EACZ8vJ,mBAAoBc,EACpBb,uBAAwBW,KC9FvBtvO,IAAoC,CAC7ClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,KACTL,MAAO,IACPC,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGN4zP,IAA+B,OCT/BjgP,IAAYvmB,IAAOC,IAAV,2HAOT47P,IAAoB77P,IAAOC,IAAV,wDAIjBwlE,IAAsBzlE,IAAOC,IAAV,wDAIQD,YAAOknB,KAAPlnB,CAAH,yHC+CtBymQ,QAlDf,YAEqC,IADjC3G,EACgC,EADhCA,eAAgBp4P,EACgB,EADhBA,UAAW2rO,EACK,EADLA,QAAS19H,EACJ,EADIA,WAAY+wJ,EAChB,EADgBA,aAAcC,EAC9B,EAD8BA,aAE9D,OACI,cAAC,IAAD,CACItB,YAAa,CACTT,SAAU7F,IAA0BqE,YACpCj/P,MAAO,OACPmgQ,WAAW,EACXI,SAAUgC,EACVh/P,YACAiuG,cAPR,SAUI,cAAC,IAAD,UACKjuG,EACG,cAAC,IAAD,UAAmB,cAAC,IAAD,MACnB07B,kBAAO,OAACiwM,QAAD,IAACA,OAAD,EAACA,EAASnhO,OACjB,cAAC,IAAD,UACI,cAAC,MAAD,CACIvP,SAAU,GACVkB,KAAMqjB,KACN8nC,UAAW,CACPvwD,MAAO,GACPC,OAAQ,GACRyuC,aAAc,GAElBjpC,SAAS,WARb,iCAFJ,OAgBAmvO,QAhBA,IAgBAA,OAhBA,EAgBAA,EAASnhO,MAAMjR,KAAI,SAAAmS,GAAI,OACnB,cAAC,GAAD,CAEI0S,aAAc,kBAAM6gP,EAAavzP,EAAK3T,KACtCkL,QAASm1P,IAAmB1sP,EAAK3T,GACjC4E,KAAM,GACNZ,MAAO2P,EAAK3f,KACZyQ,SAAS,mBACTN,SAAU+xG,GANLviG,EAAK3T,YCevBmnQ,IC/DHr+P,ID+DGq+P,IArDf,WACI,IAAMpnH,EAAchlB,KACdqsI,EjCPyB,WAC/B,IAAMxlQ,EAAWO,cAEjB,OAAO5R,uBACH,SAAC8vQ,GACGz+P,EAASw+P,IAAiBC,MAE9B,CAACz+P,IiCAmBylQ,GAClBC,EAAoB5G,MACpBgG,EAAgBtD,MAJkB,EAMXtnJ,KAArBx3G,EANgC,EAMhCA,QAASsvO,EANuB,EAMvBA,QANuB,EAOD4sB,MAA/BH,EAPgC,EAOhCA,eAAgBnqJ,EAPgB,EAOhBA,WAElBqxJ,EAAyBh3Q,uBAAY,SAACyL,GACpCA,EACAorQ,EAAgBprQ,GAEhBsrQ,MAEL,CAACA,EAAmBF,IAEjBI,EAAkBj3Q,uBAAY,SAACyL,GAAqB,IAAD,EACrD0qQ,EAAcK,IAAD,iBAA+B/qQ,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAQ7L,kBAAvC,QAAqD,IAClEo3Q,EAAuBvrQ,KACxB,CAAC0qQ,EAAea,IAEnBrE,IAAsB6D,KAA8B,SAAA/qQ,GAChD,IAAMgE,EAAKhE,GAAUA,EAAS,MACZqkQ,IAAmBrgQ,GAAOqgQ,IAAmBrgQ,GAE3DunQ,EAAuBvnQ,MAI/B,IAAMynQ,EAAmBl3Q,uBAAY,SAAC6C,GAClC2sJ,EAAY,6BACLzoH,KADI,IAEPlkC,kBAEL,CAAC2sJ,IAMJ,OAJAl8H,qBAAU,WACNk8H,EAAYzoH,OACb,CAACyoH,IAGA,cAAC,IAAD,CACIsgH,eAAgBA,EAChBp4P,UAAW3D,EACXsvO,QAASA,EACT19H,WAAYA,EACZ+wJ,aAAcQ,EACdP,aAAcM,KE1DblwO,IAAoC,CAC7ClkC,WAAY,GACZ6V,QAAS,GACT3V,QAAS,KACTL,MAAO,IACPC,OAAQ,EACRwf,WAAY,EACZS,cAAe,GAGNu0P,IAAyB,S,SDV1B5+P,K,8CAAAA,E,+DAAAA,U,KASL,I,gCAAMw5I,IAAsB,SAC/BlmJ,GAD+B,MAEF,CAC7Bb,KAAMuN,IAAQ6+P,sBACdvrQ,YEbSwrQ,IAA4D,CACrEC,gBAAiB,KACjB3xJ,YAAY,GCuBH4xJ,IAA8B,kBACvCjuP,aAAY,SAAAxX,GAAK,OAAIA,EAAM0lQ,wBCRlBC,IAAwB,WACjC,IAAMpmQ,EAAWO,cAEjB,OAAO5R,uBACH,WACIqR,EAAS0gJ,IAAoB,OAEjC,CAAC1gJ,KAIIqmQ,IAAgC,WACzC,IAAMrmQ,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC2lH,GAChBt0G,EJbkC,SACtCs0G,GADsC,MAEF,CACpC36G,KAAMuN,IAAQo/P,8BACdhyJ,cISaiyJ,CAA2BjyJ,MACrC,CAACt0G,KAGKwmQ,IAA8B,WACvC,IAAMC,EAAqBL,MACrBM,EAA+B7I,IAA+BH,IAA0BsE,gBAE9F,OAAOrzQ,uBAAY,WACf83Q,IACAC,GAA6B,KAC9B,CAACD,EAAoBC,KC3CfxhP,IAAYvmB,IAAOC,IAAV,8DAIT47P,IAAoB77P,IAAOC,IAAV,gEAIjBwlE,IAAsBzlE,IAAOC,IAAV,wDAInB+nQ,IAAmBhoQ,IAAOC,IAAV,0KAQhBgoQ,IAAmBjoQ,IAAOC,IAAV,qFAKhBioQ,IAAqBloQ,IAAO0nB,KAAV,0FACjB,SAAAxnB,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aACzC,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,yBAC3C,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,MAAQ,SAG1CwyJ,IAAgBnoQ,IAAOC,IAAV,qMAUb4jB,IAAiB7jB,YAAO8jB,KAAP9jB,CAAH,qDCoEZooQ,QA5Ff,YAEwC,IADpCrkQ,EACmC,EADnCA,QAASsvO,EAC0B,EAD1BA,QAASi0B,EACiB,EADjBA,gBAAiB3xJ,EACA,EADAA,WAAY+wJ,EACZ,EADYA,aAAc2B,EAC1B,EAD0BA,aAAcC,EACxC,EADwCA,YAErEv+O,GAA+B,OAAfu9O,QAAe,IAAfA,OAAA,EAAAA,EAAiB30P,WAAjB,OAA4B0gO,QAA5B,IAA4BA,OAA5B,EAA4BA,EAASh6L,OAC3D,OACI,cAAC,IAAD,CACIgsN,YAAa,CACTT,SAAU7F,IAA0BsE,eACpCl/P,MAAO,QACPmgQ,WAAW,EACXI,SAAUgC,EACVh/P,UAAW3D,EACX4xG,cAPR,SAUI,cAAC,IAAD,UACK5xG,EACG,cAAC,IAAD,UACI,cAAC,IAAD,MAEJq/B,kBAAO,OAACiwM,QAAD,IAACA,OAAD,EAACA,EAASnhO,OACjB,cAAC,IAAD,UACI,cAAC,MAAD,CACIvP,SAAU,GACVkB,KAAMqjB,KACN8nC,UAAW,CACPvwD,MAAO,GACPC,OAAQ,GACRyuC,aAAc,GAElBjpC,SAAS,WARb,iCAcJ,qCACI,eAAC8jQ,IAAD,WACI,cAACC,IAAD,CAAkB9mQ,YAAU,0BAA5B,UACoB,OAAfmmQ,QAAe,IAAfA,OAAA,EAAAA,EAAiB30P,QAAjB,UACQwjM,GACCmxD,EAAgB30P,OAChB,QAHT,aAKK,sBAEV,cAACu1P,IAAD,CACI9jQ,QAASkkQ,EACTnnQ,YACI4oB,EACM,qBACA,mBAEV4rF,WAAYA,EAPhB,SASK5rF,EAAgB,eAAiB,kBAG1C,cAACo+O,IAAD,iBACK90B,QADL,IACKA,OADL,EACKA,EAASnhO,MAAMjR,KAAI,SAAAmS,GAAS,IAAD,EAClBm1P,EAAU,iBACZjB,QADY,IACZA,OADY,EACZA,EAAiB51P,SAAS0B,EAAK3T,WADnB,SAGhB,OACI,cAAC,IAAD,CAEIqmB,aAAc,kBACVuiP,EAAaj1P,EAAK3T,KAEtBkL,QAAS49P,EACTlkQ,KAAM,GACNZ,MAAO2P,EAAK3f,KACZugC,UAAW2hF,EAAa1xH,IAAUC,OAAOO,UAAYR,IAAUC,OAAOkB,MACtE8uC,YAAa,CACTD,WAAYs0O,EACN,OACA,UAEVrkQ,SAAS,4BACTN,SAAU+xG,EACVxhF,0BAA2BlwC,IAAUC,OAAOQ,YAfvC0uB,EAAK3T,iBCGnC+oQ,ICtFHjgQ,IDsFGigQ,IAzEf,WACI,IAAMhpH,EAAchlB,KACdunB,EHR4B,WAClC,IAAM1gJ,EAAWO,cAEjB,OAAO5R,uBACH,SAACs3Q,GACGjmQ,EAAS0gJ,IAAoBulH,MAEjC,CAACjmQ,IGCuBq+I,GACtBooH,EAAqBL,MAHgB,EAIdlsJ,KAArBx3G,EAJmC,EAInCA,QAASsvO,EAJ0B,EAI1BA,QAJ0B,EAKHk0B,MAAhCD,EALmC,EAKnCA,gBAAiB3xJ,EALkB,EAKlBA,WACnBwwJ,EAAgBtD,MAEhB4F,EAA0Bz4Q,uBAAY,SAAC6L,GACrCA,EAAQ8W,OACRovI,EAAoBlmJ,GAEpBisQ,MAEL,CAACA,EAAoB/lH,IAElBipF,EAAmBh7O,uBAAY,SAAC6L,GAClC,IAAMmiE,EAAaniE,EAAQ3I,KAAK,KAChCizQ,EAAcgB,IAAwBnpM,GACtCyqM,EAAwB5sQ,KACzB,CAACsqQ,EAAesC,IAEbvB,EAAmBl3Q,uBACrB,SAAC6C,GACG2sJ,EAAY,6BAAKzoH,KAAN,IAA2BlkC,kBAE1C,CAAC2sJ,IAGCkpH,EAAmB14Q,uBACrB,SAACyL,GACG,IAAMI,EAAO,OAAGyrQ,QAAH,IAAGA,IAAmB,GAC7BqB,EAAa9sQ,EAAQ6V,SAASjW,GAC9BI,EAAQsX,QAAO,SAAA1T,GAAE,OAAIA,IAAOhE,KAC5BI,EAAQmiH,OAAOviH,GACrBuvO,EAAiB29B,KAErB,CAACrB,EAAiBt8B,IAGhB49B,EAAkB54Q,uBAAY,WAC5B2lH,IACA2xJ,IAAkC,OAAfA,QAAe,IAAfA,OAAA,EAAAA,EAAiB30P,WAAjB,OAA4B0gO,QAA5B,IAA4BA,OAA5B,EAA4BA,EAASh6L,OACxD2xL,EAAiB,IACVqI,GACPrI,EAAiBqI,EAAQnhO,MAAMjR,KAAI,SAAAmS,GAAI,OAAIA,EAAK3T,UAErD,CAACk2G,EAAY09H,EAASi0B,EAAiBt8B,IAa1C,OAXA23B,IAAsBwE,KAAwB,SAAAtrQ,GAC1C,IAAMwX,GAAa,OAAPxX,QAAO,IAAPA,OAAA,EAAAA,EAAS8W,QAAS9W,EAAQghD,MAAM,KAAK57C,KAAI,SAAAxB,GAAE,OAAIsW,OAAOtW,MAAO,GACpEkzB,kBAAQtf,EAAKi0P,IACdmB,EAAwBp1P,MAIhCiQ,qBAAU,WACNk8H,EAAYzoH,OACb,CAACyoH,IAGA,cAAC,IAAD,CACIz7I,QAASA,EACTsvO,QAASA,EACTi0B,gBAAiBA,EACjB3xJ,WAAYA,EACZ+wJ,aAAcQ,EACdmB,aAAcK,EACdJ,YAAaM,KEnFZC,IAA0B,U,SDE3BtgQ,K,+CAAAA,U,KAQL,I,oDEWMugQ,IAAsBn/O,mBAC/BkkF,GAAkB,CAAEx8F,YAAa,iBADFsY,EAf8B,WAGxC,IAFrB7nB,EAEoB,uDAFZ4rG,GAAuB,CAAEiI,YAAY,GAAS,gBACtDl7G,EACoB,uCACpB,OAAQA,EAAOO,MACX,KAAKuN,IAAQwgQ,sBACT,OAAO,6BACAjnQ,GADP,IAEI6zG,WAAYl7G,EAAOk7G,aAE3B,QACI,OAAO7zG,MCfNykB,IAAYvmB,IAAOC,IAAV,8DAIT47P,IAAoB77P,IAAOC,IAAV,gEAIjBwlE,IAAsBzlE,IAAOC,IAAV,wDAInB+nQ,IAAmBhoQ,IAAOC,IAAV,iKAQhBgoQ,IAAmBjoQ,IAAOC,IAAV,qFAKhBioQ,IAAqBloQ,IAAO0nB,KAAV,0FACjB,SAAAxnB,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aACzC,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,yBAC3C,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,MAAQ,SAG1CwyJ,IAAgBnoQ,IAAOC,IAAV,qMC9Bb+oQ,IAAiBhpQ,IAAOC,IAAV,uFAKd4jB,IAAiB7jB,YAAO8jB,KAAP9jB,CAAH,mDAIdumB,IAAYvmB,IAAOC,IAAV,qHAOT+jB,IAAiBhkB,IAAOC,IAAV,+FAMdgkB,IAAgBjkB,IAAOC,IAAV,mGAMbu8O,IAAYx8O,IAAO+zB,MAAV,iOACT,SAAA7zB,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,0BAE3C,SAAAz1G,GAAK,OAAIA,EAAMqoQ,WAAa,OAAS,YAK1C,SAAAroQ,GAAK,OAAIA,EAAMmkB,YAAc,UAAY,aC8BxC4kP,QAxDf,YAU+B,IAT3BxlQ,EAS0B,EAT1BA,MACA4gB,EAQ0B,EAR1BA,YACA3gB,EAO0B,EAP1BA,SACA6kQ,EAM0B,EAN1BA,WACAzuB,EAK0B,EAL1BA,oBACAlsK,EAI0B,EAJ1BA,OACA+nC,EAG0B,EAH1BA,WACA7D,EAE0B,EAF1BA,SACAtpF,EAC0B,EAD1BA,iBAEA,OACI,qCACI,eAAC,IAAD,CACIpkB,QAAS,SAAAihB,GACLA,EAAEC,kBACFkD,EAAiB/kB,EAAMhE,KAE3B0B,YAAU,oBALd,UAOI,cAAC,IAAD,UACKkjB,GACG,cAAC,IAAD,CAAeljB,YAAA,4BAAgCysE,EAAS,WAAa,YAAtD,UAAf,SACKA,EACG,cAACroD,GAAA,EAAD,IAEA,cAACC,GAAA,EAAD,QAKhB,cAAC,IAAD,CACI7a,QAAS49P,GAAczuB,EACvBlvO,QAASkvO,EACTh0N,aAAcgsF,EACdztG,KAAM,GACN0hB,OAAO,mBACP7hB,SAAS,6BACTN,SAAU+xG,EACVxhF,0BAA2BlwC,IAAUC,OAAOQ,aAEhD,cAAC,IAAD,CACI6jR,WAAYA,GAAczuB,EAC1BnkI,WAAYA,EACZtxF,YAAaA,EACbsB,UAAU,EACV9f,MAAOpC,EAAMhQ,KACb0Q,MAAOV,EAAMhQ,KACb0N,YAAU,gCAGfuC,GAAY,cAACslQ,IAAD,UAAiBtlQ,QCN7BwlQ,QArDf,SAASA,EAAT,GAQ2B,IAPvBzlQ,EAOsB,EAPtBA,MACAoQ,EAMsB,EANtBA,UACAs1P,EAKsB,EALtBA,WACAvgQ,EAIsB,EAJtBA,eACA+sG,EAGsB,EAHtBA,WACAntF,EAEsB,EAFtBA,iBACA4gP,EACsB,EADtBA,SAEMhkP,EAAqBjP,eAErBoyP,EAAa3/P,EAAe8I,SAASjO,EAAMhE,IAC3Cq6O,EAAsBlxO,EAAe8I,UAAUjO,EAAMhE,IACrDmuE,EAASu7L,EAAWz3P,SAASjO,EAAMhE,IACnC4kB,IAAgB5gB,EAAMC,UAAYD,EAAMC,SAASiP,OAAS,EAE1D2/F,EAAetiH,uBAAY,WAC7Bo5Q,EACIhkP,EAAmB3hB,EAAOmF,EAAgBiL,MAE/C,CAACA,EAAWuR,EAAoB3hB,EAAOmF,EAAgBwgQ,IAE1D,OACI,mCACI,cAAC,IAAD,CACI3lQ,MAAOA,EACP4gB,YAAaA,EACbkkP,WAAYA,EACZzuB,oBAAqBA,EACrBlsK,OAAQA,EACR+nC,WAAYA,EACZ7D,SAAUQ,EACV9pF,iBAAkBA,EARtB,SAUKnE,GAAeupD,GACZnqE,EAAMC,SAAUzC,KAAI,SAAC+kB,GAAD,OAChB,cAACkjP,EAAD,CAEIzlQ,MAAOuiB,EACPnS,UAAWA,EACXs1P,WAAYA,EACZvgQ,eAAgBA,EAChB4f,iBAAkBA,EAClB4gP,SAAUA,EACVzzJ,WAAYA,GAPP3vF,EAAWvmB,YCsE7B4pQ,QA5Ff,YAa2B,IAZvBtlQ,EAYsB,EAZtBA,QACAvS,EAWsB,EAXtBA,OACAqiB,EAUsB,EAVtBA,UACAs1P,EASsB,EATtBA,WACAvgQ,EAQsB,EARtBA,eACAmhB,EAOsB,EAPtBA,cACAu/O,EAMsB,EANtBA,WACA3zJ,EAKsB,EALtBA,WACAntF,EAIsB,EAJtBA,iBACA4gP,EAGsB,EAHtBA,SACAG,EAEsB,EAFtBA,YACA7E,EACsB,EADtBA,SAEA,OACI,cAAC,IAAD,CACIW,YAAa,CACTT,SAAU7F,IAA0BuE,OACpCn/P,MAAO,SACPmgQ,WAAW,EACX3uJ,aACA20B,cAAelnG,kBAAQ5xC,KAAY83Q,EACnC5E,SAAUA,EACVh9P,UAAW3D,GARnB,SAWI,cAAC,IAAD,UACKA,EACG,cAAC,IAAD,UACI,cAAC,IAAD,MAEJq/B,kBAAQ5xC,GACR,cAAC,IAAD,UACI,cAAC,MAAD,CACImR,SAAU,GACVkB,KAAMylQ,EAAapiP,KAAiBP,KACpCqoC,UAAW,CACPvwD,MAAO,GACPC,OAAQ,GACRyuC,aAAc,GAElBjpC,SAAS,YARb,SAUKolQ,EAAa,oBAAsB,oBAI5C,qCACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAkBnoQ,YAAU,2BAA5B,UACmB,OAAdyH,QAAc,IAAdA,OAAA,EAAAA,EAAgB+J,QAAhB,UACQwjM,GACCvtM,EAAe+J,OACf,QAHT,aAKK,sBAEV,cAAC,IAAD,CACIvO,QAASmlQ,EACTpoQ,YACI4oB,EACM,sBACA,oBAEV4rF,WAAYA,EAPhB,SASK5rF,EAAgB,eAAiB,kBAG1C,cAAC,IAAD,UACKv4B,EAAOyP,KAAI,SAAAwC,GACR,OACI,cAAC,IAAD,CACIoQ,UAAWA,EAEXpQ,MAAOA,EACP0lQ,WAAYA,EACZvgQ,eAAgBA,EAChB+sG,WAAYA,EACZyzJ,SAAUA,EACV5gP,iBAAkBA,GANb/kB,EAAMhE,iBCapC+pQ,ICzGHjhQ,IDyGGihQ,IApFf,WAAmC,IAAD,IAC8B7+O,eAA1C/hB,EADY,EACtByL,SAAqC80P,EADf,EACIv+O,UAC1B+qF,ENCRr8F,aAAY,SAAAxX,GAAK,OAAIA,EAAM2nQ,gBMDnB9zJ,WAFsB,EAGJziG,eAAlB/gB,EAHsB,EAGtBA,KAAM4R,EAHgB,EAGhBA,QACNlR,GAJsB,UAIP0wQ,MAAuBxE,IAA0BuE,eAJ1C,QAIqD,IAA3EzwQ,WACF8xB,EAAiB7R,eACjB42P,EAAoB12P,eACpB22P,EAAiBr2P,eACjB4V,EAAS1V,eACT2yP,EAAgBtD,MATQ,EAWU1/O,mBAAmB,IAX7B,mBAWvBqG,EAXuB,KAWTC,EAXS,KAaxBmgP,EAAkB3rP,mBAAQ,WAC5B,IAAM/e,EAASyqB,mBACXxS,aAAY,OAACtkB,QAAD,IAACA,IAAc,IAC3BmkB,KAFW2S,CAGb3T,aAAU,OAAC7jB,QAAD,IAACA,OAAD,EAACA,EAAM+f,QAEnB,GAAIhT,EAAOyT,OAAS,EAAG,CACnB,IACMiX,EAD+BC,aAAY3qB,GACK+B,KAAI,SAACmS,GAAD,OAAeA,EAAK3T,MAC9EgqB,EAAgBG,GAGpB,OAAO1qB,IACR,QAAC/M,QAAD,IAACA,OAAD,EAACA,EAAM+f,MAAOrf,IAEXk3B,EAAgBnhB,EAAe+J,SAAW6W,EAAa7W,OACvD22P,IAAez2Q,GAAcA,EAAW8f,OAAS,EAEjDk3P,EAAoB75Q,uBAAY,SAACi+B,GACnC,IAAM+vC,EAAa/vC,EAAS/6B,KAAK,KACjCizQ,EAAc0C,IAAyB7qM,GACvC90C,EAAO+E,KACR,CAAC/E,EAAQi9O,IAEN2D,EAAkB95Q,uBAAY,WAC5B2lH,IAEA5rF,GACA4/O,IACAE,EAAkB,KAGdA,EAAkBrgP,MAM3B,CAACmsF,EAAY5rF,EAAe4/O,EAAgBE,EAAmBh3Q,EAAY22B,IAExE+8O,EAAev2Q,uBAAY,SAAConB,GAC1BA,GACAsyP,MAEL,CAACA,IASJ,OAPA/G,IAAsBkG,KAAyB,SAAA56O,GAC3C,IAAM5a,GAAc,OAAR4a,QAAQ,IAARA,OAAA,EAAAA,EAAUtb,QAASsb,EAAS4uB,MAAM,KAAK57C,KAAI,SAAAxB,GAAE,OAAIsW,OAAOtW,MAAO,GACtEkzB,kBAAQ/pB,EAAgByK,IACzB6V,EAAO7V,MAKX,cAAC,IAAD,CACItP,QAASA,EACTvS,OAAQo4Q,EACR/1P,UAAW1hB,EAAK+f,MAChBi3P,WAAYA,EACZvgQ,eAAgBA,EAChBmhB,cAAeA,EACfu/O,WAAYA,EACZ3zJ,WAAYA,EACZntF,iBAAkB7D,EAClBykP,SAAUS,EACVN,YAAaO,EACbpF,SAAU6B,M,SCpGVh+P,K,0BAAAA,E,4BAAAA,E,4CAAAA,E,6CAAAA,U,KAWL,I,QC0BMwhQ,IAAsB,kBAC/BzwP,aAAY,SAAAxX,GAAK,OAAIA,EAAMkoQ,gBC9BlBC,IAAgB,WACzB,IAAM5oQ,EAAWO,cAEjB,OAAO5R,uBACH,SAACqxB,GACGhgB,EFFc,SACtBggB,GADsB,MAEF,CACpBrmB,KAAMuN,IAAQ2hQ,YACd7oP,QEFiB8oP,CAAW9oP,MAExB,CAAChgB,KAII+oQ,IAAiB,WAC1B,IAAM/oQ,EAAWO,cAEjB,OAAO5R,uBACH,SAACqxB,EAAcF,GACX9f,EFDe,SACvBggB,EACAF,GAFuB,MAGF,CACrBnmB,KAAMuN,IAAQ8hQ,aACdhpP,OACAF,SELiBmpP,CAAYjpP,EAAMF,MAE/B,CAAC9f,KAIIkpQ,IAAuB,WAChC,IAAMlpQ,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EFCuB,CAC3BrG,KAAMuN,IAAQiiQ,yBEDX,CAACnpQ,KAGKopQ,IAAwB,WACjC,IAAMppQ,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC2lH,GAChBt0G,EFC0B,SAC9Bs0G,GAD8B,MAEF,CAC5B36G,KAAMuN,IAAQmiQ,qBACd/0J,cELag1J,CAAmBh1J,MAC7B,CAACt0G,KC3CKklB,IAAYvmB,IAAOC,IAAV,8TAWT,SAAAC,GAAK,OACVA,EAAMqoQ,WACA,oBACAroQ,EAAMy1G,WACF,mBACA,0BAGJ,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aACpC,SAAAz1G,GAAK,OACfA,EAAMqoQ,WACCroQ,EAAMy1G,WAAa,mBAAqB,sBACzC,uBAIJ,SAAAz1G,GAAK,OAAKA,EAAMy1G,YAAez1G,EAAMqoQ,WAA+C,GAAlC,mCAI/CqC,IAAY5qQ,IAAOC,IAAV,2JAOJ,SAAAC,GAAK,OACfA,EAAMqoQ,WACA,oBACCroQ,EAAMy1G,WAAa,mBAAqB,0BCXxCk1J,I,IAAAA,IA1Bf,YAEwB,IADpB1mQ,EACmB,EADnBA,MAAOwxG,EACY,EADZA,WAAY4yJ,EACA,EADAA,WAAYv2M,EACZ,EADYA,UAAWo3M,EACvB,EADuBA,SAE1C,OACI,eAAC,IAAD,CACIzzJ,WAAYA,EACZ4yJ,WAAYA,EACZnkQ,QAASglQ,EACTjoQ,YACIonQ,EACM,iBACAv2M,EACI,gBACA,aATlB,UAYK7tD,EACA6tD,GAAa,cAAC44M,IAAD,CACVrC,WAAYA,EACZ5yJ,WAAYA,EACZm1J,YAAU,gCC1BbC,IAAS,CAClB,MAAO,MAAO,MAAO,MAAO,MAAO,MACnC,MAAO,MAAO,MAAO,MAAO,MAAO,OCA1BxkP,IAAYvmB,IAAOC,IAAV,qJCwBP+qQ,QArBf,YAK4B,IAJxBC,EAIuB,EAJvBA,gBACAC,EAGuB,EAHvBA,gBACAC,EAEuB,EAFvBA,eACAC,EACuB,EADvBA,cAEA,OACI,cAAC,IAAD,UACKL,IAAO9pQ,KAAI,SAACkD,EAAOjD,GAAR,OACR,cAAC,IAAD,CACIiD,MAAOA,EACPwxG,WAAYs1J,EAAgB/pQ,GAC5BqnQ,WAAY2C,EAAgBhqQ,GAC5BkoQ,SAAU,kBAAMgC,EAAclqQ,IAC9B8wD,UAAWm5M,EAAejqQ,WCuB/BmqQ,I,YAAAA,IAtCf,YAMwB,IALpBC,EAKmB,EALnBA,aACAC,EAImB,EAJnBA,cACAC,EAGmB,EAHnBA,YACA71J,EAEmB,EAFnBA,WACAyzJ,EACmB,EADnBA,SAEMqC,EAAcxtP,mBAAQ,kBAAM,IAAIkC,MAAOmB,gBAAe,IACtDoqP,EAAeztP,mBAAQ,kBAAM,IAAIkC,MAAOiB,aAAY,IAEpD6pP,EAAkBj7Q,uBAAY,SAACmxB,GACjC,OAAOqqP,EAAcC,GAAgBD,IAAgBC,GAAetqP,EAAQuqP,GAAiB/1J,IAC9F,CAAC61J,EAAa71J,EAAY+1J,EAAcD,IAErCP,EAAkBl7Q,uBAAY,SAACmxB,GACjC,OAAOA,IAAUoqP,GAAiBC,IAAgBF,IACnD,CAACE,EAAaD,EAAeD,IAE1BH,EAAiBn7Q,uBAAY,SAACmxB,GAChC,OAAOA,IAAUuqP,GAAgBF,IAAgBC,IAClD,CAACC,EAAcF,EAAaC,IAEzBE,EAAoB37Q,uBAAY,SAACmxB,GAC9B8pP,EAAgB9pP,IACjBioP,EAASjoP,KAEd,CAAC8pP,EAAiB7B,IAErB,OACI,cAAC,IAAD,CACI6B,gBAAiBA,EACjBC,gBAAiBA,EACjBC,eAAgBA,EAChBC,cAAeO,KChBZC,IAlBcxtQ,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBAAMY,EAAE,mBAAmB0zB,OAAO,eAAe+wE,eAAa,aCM/D6nK,IAlBeztQ,sBAC1B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLC,UAAWA,EACXG,MAAM,KACNC,OAAO,KACPF,QAAQ,YACRa,KAAK,OACLV,MAAM,6BAPV,SASI,sBAAMY,EAAE,eAAe0zB,OAAO,eAAe+wE,eAAa,aCb7Dz9E,IAAYvmB,IAAOC,IAAV,wGAMT+jB,IAAiBhkB,IAAOC,IAAV,uFAEb,SAAAC,GAAK,OAAIA,EAAMyhQ,YAAc,UAAY,aAC1C,SAAAzhQ,GAAK,OAAIA,EAAMyhQ,YAAc,sBAAwB,sBAGrDmK,IAAO9rQ,IAAOC,IAAV,qHAGJ,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,0BCqB/Co2J,QA7Bf,YAO2B,IANvBT,EAMsB,EANtBA,aACAU,EAKsB,EALtBA,gBACAC,EAIsB,EAJtBA,gBACAt2J,EAGsB,EAHtBA,WACAu2J,EAEsB,EAFtBA,OACAC,EACsB,EADtBA,OAEA,OACI,eAAC,IAAD,WACI,cAAC,IAAD,CACIxK,YAAasK,EACb7nQ,QAAS+nQ,EACThrQ,YAAU,mBAHd,SAKI,cAAC,IAAD,MAEJ,cAAC2qQ,IAAD,CAAM3qQ,YAAU,oBAAoBw0G,WAAYA,EAAhD,SAA6D21J,IAC7D,cAAC,IAAD,CACI3J,YAAaqK,EACb5nQ,QAAS8nQ,EACT/qQ,YAAU,mBAHd,SAKI,cAAC,IAAD,UCMDirQ,I,QAAAA,IAlCf,YAKuB,IAJnBd,EAIkB,EAJlBA,aACAe,EAGkB,EAHlBA,QACA12J,EAEkB,EAFlBA,WACAprF,EACkB,EADlBA,SAEMkhP,EAAcxtP,mBAAQ,kBAAM,IAAIkC,MAAOmB,gBAAe,IACtD0qP,EAAkBV,EAAeG,IAAgB91J,EACjDs2J,EAAkBX,GAAgBe,IAAY12J,EAE9C22J,EAAat8Q,uBAAY,WACvBi8Q,GACA1hP,EAAS+gP,EAAe,KAE7B,CAACW,EAAiB1hP,EAAU+gP,IAEzBiB,EAAav8Q,uBAAY,WACvBg8Q,GACAzhP,EAAS+gP,EAAe,KAE7B,CAACU,EAAiBzhP,EAAU+gP,IAE/B,OACI,cAAC,IAAD,CACIA,aAAcA,EACdU,gBAAiBA,EACjBC,gBAAiBA,EACjBt2J,WAAYA,EACZw2J,OAAQG,EACRJ,OAAQK,KChCPC,IAA8B,OCC9BjmP,IAAYvmB,IAAOC,IAAV,8JAQTwsQ,IAAyBzsQ,IAAOC,IAAV,wDCoCpBysQ,QApCf,YAO0B,IANtBnB,EAMqB,EANrBA,cACAD,EAKqB,EALrBA,aACAE,EAIqB,EAJrBA,YACA71J,EAGqB,EAHrBA,WACAg3J,EAEqB,EAFrBA,aACAvB,EACqB,EADrBA,cAEA,OACI,cAAC,IAAD,CACI/F,YAAa,CACTlhQ,MAAO,QACPwxG,cAHR,SAMI,eAAC,IAAD,WACI,cAAC,IAAD,CACI21J,aAAcE,EACda,QF5BiB,KE6BjB12J,WAAYA,EACZprF,SAAUoiP,IAEd,cAACF,IAAD,UACI,cAAC,IAAD,CACInB,aAAcA,EACdC,cAAeA,EACfC,YAAaA,EACb71J,WAAYA,EACZyzJ,SAAUgC,YCSnBwB,IC5CHrkQ,ID4CGqkQ,IAtCf,WAAwB,IAAD,IAC8C7C,MAAzDuB,EADW,EACXA,aAAcC,EADH,EACGA,cAAeC,EADlB,EACkBA,YAAa71J,EAD/B,EAC+BA,WAC5Cw0J,EAAaF,MACbK,EAAcF,MACdjE,EAAgBtD,MAEhB4I,EAAcxtP,mBAAQ,kBAAM,IAAIkC,MAAOmB,gBAAe,IACtDurP,EAAoB,iBAAGrB,QAAH,IAAGA,IAAeF,SAAlB,QAAkCG,EAEtDE,EAAoB37Q,uBAAY,SAACmxB,GACnCglP,EACIqG,IACAzrP,KAAM,IAAIZ,KAAK0sP,EAAsB1rP,EAAO,IAAIgB,OAAO,eAE3DmoP,EAAYuC,EAAsB1rP,KACnC,CAAC0rP,EAAsBvC,EAAanE,IAWvC,OATAxD,IAAsB6J,KAA6B,SAAA3mQ,GAC/C,GAAIA,EAAO,CACP,IAAMoa,EAAOc,KAAMlb,IACfoa,EAAKkvL,WAAclvL,EAAKoB,SAAWiqP,GAAgBrrP,EAAKkB,UAAYoqP,GACpEjB,EAAYrqP,EAAKoB,OAAQpB,EAAKkB,aAMtC,cAAC,IAAD,CACImqP,aAAcA,EACdC,cAAeA,EACfC,YAAaqB,EACbl3J,WAAYA,EACZg3J,aAAcxC,EACdiB,cAAeO,M,SCvCfpjQ,K,sCAAAA,E,qCAAAA,U,KASL,I,YCcMukQ,IAAoB,kBAC7BxzP,aAAY,SAAAxX,GAAK,OAAIA,EAAMirQ,cCrBlBC,IAAqB,WAC9B,IAAM3rQ,EAAWO,cAEjB,OAAO5R,uBACH,SAAC+8Q,GACG1rQ,EFCmB,SAC3B0rQ,GAD2B,MAEF,CACzB/xQ,KAAMuN,IAAQ0kQ,kBACdF,aELiBG,CAAgBH,MAE7B,CAAC1rQ,KAII8rQ,IAAoB,WAC7B,IAAM9rQ,EAAWO,cAEjB,OAAO5R,uBAAY,WACfqR,EFCoB,CACxBrG,KAAMuN,IAAQ6kQ,qBEDX,CAAC/rQ,K,WCpBKsnF,IAAwB3oF,IAAOC,IAAV,+EAKrByoF,IAA0B1oF,IAAOC,IAAV,y7DAqEvBotQ,IAAYrtQ,IAAOC,IAAV,uQAIR,qBAAE01G,WAA6B,UAAW,aAC3C,qBAAEA,WAA6B,mBAAoB,yB,WCpCjD23J,QAtCf,YAKyB,IAJrBP,EAIoB,EAJpBA,UACAQ,EAGoB,EAHpBA,iBACA53J,EAEoB,EAFpBA,WACA63J,EACoB,EADpBA,UAEM3hJ,GAAqB,OAATkhJ,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,SAAX,OAAoB2kL,QAApB,IAAoBA,OAApB,EAAoBA,EAAW1kL,KAA/B,UAAwCtnE,KAAM,IAAIZ,KAAK4sP,EAAU3kL,QAAQjmE,OAAO,YAAhF,cAAiGpB,KAAM,IAAIZ,KAAK4sP,EAAU1kL,MAAMlmE,OAAO,aAAgB,2BAEzK,OAAO,cAAC,IAAD,CACHkjP,YAAa,CACTlhQ,MAAO,aACP0nH,aAHD,SAKH,eAACnjC,IAAD,WACI,cAACC,IAAD,UACI,cAAC,MAAD,CACI9iF,MAAOknQ,GAAa,CAAE3kL,MAAO,KAAMC,IAAK,MACxCviE,aAAcynP,EACdxlL,aAAa,EACbC,cAAc,EACdC,gBAAgB,MAGxB,eAAColL,IAAD,CACIjpQ,QAAS,SAACihB,GACFswF,IACJtwF,EAAEC,kBACFkoP,MAEJ73J,WAAYA,EACZx0G,YAAU,0BAPd,UASI,cAACuoE,IAAA,EAAD,IATJ,iBCkBG+jM,QArCf,WAA4B,IAChBV,EAAcD,MAAdC,UACFG,EAAkBF,MAClBU,EAAsBP,MACtBhH,EAAgBtD,MAChB8K,ElEYH,WACH,IAAM71P,EAAWC,cACXH,EAAUW,cAEhB,OAAOvoB,uBACH,SAAC+tE,GACG,IAAM4rC,EAAc,IAAI7C,gBAAgBhvF,EAAShjB,QACjD60G,EAAYr4G,OAAOysE,GAGnBnmD,EAAQjoB,QAAQ,CAAEmF,OAAQ60G,EAAY/5G,eAE1C,CAACgoB,EAASE,EAAShjB,SkExBA84Q,GAEjBL,EAAmBv9Q,uBAAY,SAACiwB,GAClCkmP,EACI7M,IADS,UAENv4O,KAAMd,EAAKmoE,OAAQjmE,OAAO,cAFpB,YAEqCpB,KAAMd,EAAKooE,KAAMlmE,OAAO,gBAE1E+qP,EAAgBjtP,KACjB,CAACitP,EAAiB/G,IAEfqH,EAAYx9Q,uBAAY,WAC1B09Q,IACAC,EAAerU,OAChB,CAACoU,EAAqBC,IAEnBh4J,KAAwB,OAATo3J,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,SAAX,OAAoB2kL,QAApB,IAAoBA,OAApB,EAAoBA,EAAW1kL,MAYpD,OAXAs6K,IAAsBrJ,KAAuB,SAAAzzP,GACzC,GAAIA,EAAO,CAAC,IAAD,EACcA,EAAMg3C,MAAM,KAD1B,mBACAurC,EADA,KACOC,EADP,KAED4hD,EAAYlpH,KAAMqnE,GAAOpnE,SACzBkpH,EAAUnpH,KAAMsnE,GAAKwlL,MAAM,KAAK7sP,SACjC2R,kBAAQs3G,EAAD,OAAY8iI,QAAZ,IAAYA,OAAZ,EAAYA,EAAW3kL,QAAWz1D,kBAAQu3G,EAAD,OAAU6iI,QAAV,IAAUA,OAAV,EAAUA,EAAW1kL,MACtE6kL,EAAgB,CAAE9kL,MAAO6hD,EAAW5hD,IAAK6hD,QAMjD,cAAC,IAAD,CAAgB6iI,UAAWA,EAAWS,UAAWA,EAAWD,iBAAkBA,EAAkB53J,WAAYA,KCjC9Gm4J,IAA6D,CAC/DC,mBAAoB,cAAC,IAAD,IACpBC,sBAAuB,cAAC,IAAD,IACvBnnQ,YAAa,cAAC,IAAD,IACby8P,OAAQ,cAAC,IAAD,IACR2K,MAAO,cAAC,IAAD,IACPC,KAAM,cAAC,IAAD,KAaKC,I,oBAAAA,IAVf,SAAiCjuQ,GAAsC,IAC3DkuQ,EAAeluQ,EAAfkuQ,WAER,OACIN,IAA2BM,IACvB,+ECvBCj/O,IAAUnvB,IAAOC,IAAV,gSAMO,SAAAC,GAAK,OAAIA,EAAMmuQ,gBAK7BC,IAA0BtuQ,IAAOC,IAAV,mIAOvBsuQ,IAAuBvuQ,IAAOC,IAAV,0DAIpBuuQ,IAAgBxuQ,IAAOw8B,GAAV,0JAQbiyO,IAAwBzuQ,IAAOC,IAAV,gECenByuQ,QApCf,SAA4BxuQ,GAAiC,IAErDyuQ,EAOAzuQ,EAPAyuQ,cACAC,EAMA1uQ,EANA0uQ,iBACAC,EAKA3uQ,EALA2uQ,eACAC,EAIA5uQ,EAJA4uQ,iBACA96C,EAGA9zN,EAHA8zN,UACAitC,EAEA/gQ,EAFA+gQ,iBACAoN,EACAnuQ,EADAmuQ,aAGJ,OACI,eAAC,IAAD,CAASA,aAAcA,EAAvB,UACI,cAACC,IAAD,UACKK,EAAc1tQ,KAAI,WAAiBC,GAAjB,IAAGktQ,EAAH,EAAGA,WAAH,OACf,cAACG,IAAD,UACI,cAAC,IAAD,CAAeH,WAAYA,KADJltQ,QAKnC,gCACI,cAACstQ,IAAD,IACA,cAACC,IAAD,UACI,cAAC/L,IAAD,CACIt9P,KAAM0pQ,EACN96C,UAAWA,EACX30H,SAAUuvK,EACVpM,QAASqM,EACT5N,iBAAkBA,aCT3B8N,I,IAAAA,IAxBf,SAAkC7uQ,GAAuC,IAEjEyuQ,EAMAzuQ,EANAyuQ,cACAG,EAKA5uQ,EALA4uQ,iBACAD,EAIA3uQ,EAJA2uQ,eACAD,EAGA1uQ,EAHA0uQ,iBACA3N,EAEA/gQ,EAFA+gQ,iBACAoN,EACAnuQ,EADAmuQ,aAEE39I,EAAYp3G,YAAY3R,MAE9B,OACI,cAAC,IAAD,CACIgnQ,cAAeA,EACfC,iBAAkBA,EAClBC,eAAgBA,EAChB76C,WAAoB,OAATtjG,QAAS,IAATA,OAAA,EAAAA,EAAWngI,QAAS,GAC/Bu+Q,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAcA,KCvBbW,IAA+D,CACxE,CACIZ,WAAY,sBAEhB,CACIA,WAAY,gBCLPa,IAAmCjvQ,IAAOC,IAAV,wFC0C9BivQ,QAtCf,SAAqChvQ,GAA0C,IAEvE2uQ,EAIA3uQ,EAJA2uQ,eACAD,EAGA1uQ,EAHA0uQ,iBACAE,EAEA5uQ,EAFA4uQ,iBACA7N,EACA/gQ,EADA+gQ,iBAGJ,OACI,cAAC,GAAD,CACI98P,MAAM,UACNmlH,SAAS,sBACTuC,UACI,cAACojJ,IAAD,CAAkC9tQ,YAAU,uCAA5C,6DAIJmtH,cAAc,oBACdvC,WAAS,EACTkC,gBAAgB,QAChBvH,cAAc,SACd0F,eAAe,IACfE,cAAc,EACd0B,aAAa,EACb9pH,SAAS,sBAfb,SAiBI,cAAC,IAAD,CACIyqQ,cAAeK,IACfH,eAAgBA,EAChBD,iBAAkBA,EAClBE,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAa,aC8Ddc,I,IAAAA,IApFf,WAA8C,IAAD,EAErC3O,MADIW,EADiC,EACjCA,aAAcF,EADmB,EACnBA,iBAAkBQ,EADC,EACDA,eAElC2N,EAA6B/yI,KAC7BgzI,ElFc8B,WACpC,IAAMC,EAA0BnP,MAC1BoP,EAA4BrQ,IAA+BH,IAA0BqE,aAE3F,OAAOpzQ,uBAAY,WACfs/Q,IACAC,GAA0B,KAC3B,CAACD,EAAyBC,IkFrBCC,GACxBlP,EAA0BF,MAC1BqP,ErFY8B,WACpC,IAAMzJ,EAA0BvG,MAC1BiQ,EAA4BxQ,IAA+BH,IAA0Bl4P,aAE3F,OAAO7W,uBAAY,WACfg2Q,IACA0J,GAA0B,KAC3B,CAAC1J,EAAyB0J,IqFnBCC,GACxB/P,EAA0BF,MACxBI,EAAmBG,MAAnBH,eACAP,EAAyBqG,MAAzBrG,qBACAptQ,EAAS8pH,KAAT9pH,KACFylB,EAAUW,cAEVs2P,EAAiB7+Q,uBACnB,SAAC4/Q,GACGjjP,QAAQo7B,UAAUz8B,MAAK,WACnB8jP,IACAC,IACAI,OAGCG,GACDh4P,EAAQjoB,QAAQpG,IAAOmF,QAAQE,8BAGvC,CAACwgR,EAA4BC,EAAuBI,EAAuB73P,IAGzEk3P,EAA8C7wP,mBAAQ,WAQxD,IAPA,IAAM4xP,EAAY,CACd5qC,QAAS,kBAAMg8B,GACfr9P,SAAU,kBAAOk8P,IAAmBP,GACpCx7P,QAAS,kBAAMo9P,GACf2O,OAAQ,kBAAM1sO,kBAAO,OAACjxC,QAAD,IAACA,OAAD,EAACA,EAAM+f,SAGhC,MAAkCmqB,OAAO6pB,QAAQ2pN,GAAjD,eAA6D,CAAC,IAAD,sBAAjD99Q,EAAiD,KACzD,IAAIujG,EADqD,QAErD,OAAOvjG,EAIf,MAAO,YACR,CACCkvQ,EACAnB,EACAP,EACA4B,EAJD,OAKChvQ,QALD,IAKCA,OALD,EAKCA,EAAM+f,QAGJ69P,EAAwC//Q,uBAAY,WAClD8vQ,GAAkBP,GAClBkC,EAAelJ,IAAWoB,oBAAqB,CAC3C3zM,KAAM85M,EACN/pQ,WAAYwpQ,MAGrB,CAACkC,EAAgBlC,EAAsBO,IAgB1C,OAdAx8O,qBAAU,WAGN,OAFA8rP,IAEO,WACHP,GAAe,MAGpB,IAEHvrP,qBAAU,WACNg9O,EAAwBa,GACxBvB,EAAwBuB,KACzB,CAACvB,EAAyBU,EAAyBa,IAGlD,cAAC,IAAD,CACI0N,eAAgBA,EAChBD,iBAAkBmB,EAClBjB,iBAAkBA,EAClB7N,iBAAkBA,KC7FjB+O,IAA0D,CACnE,CACI5B,WAAY,yBAEhB,CACIA,WAAY,WCLPnL,IAAYjjQ,IAAOC,IAAV,wFCsCPgwQ,QAjCf,YAEiC,IAD7BpB,EAC4B,EAD5BA,eAAgBD,EACY,EADZA,iBAAkBE,EACN,EADMA,iBAAkB7N,EACxB,EADwBA,iBAEpD,OACI,cAAC,GAAD,CACI98P,MAAM,UACNmlH,SAAS,gBACTuC,UACI,cAAC,IAAD,CAAW1qH,YAAU,wCAArB,yEAIJmtH,cAAc,oBACdxC,UAAWviI,IAAOmF,QAAQC,gBAC1B+3H,cAAc,SACduH,gBAAgB,QAChB7B,eAAe,IACfE,cAAc,EACd0B,aAAa,EACb9pH,SAAS,uBAfb,SAiBI,cAAC,IAAD,CACIyqQ,cAAeqB,IACfnB,eAAgBA,EAChBD,iBAAkBA,EAClBE,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAa,aC3BhB6B,IAAuB,WAChC,IAAMtqI,EAAepyH,eACf28P,EAAwBjR,IAA+BH,IAA0BuE,QAEvF,OAAOtzQ,uBAAY,WACf41I,EAAa,IACbuqI,GAAsB,KACvB,CAACvqI,EAAcuqI,KAGTC,IAAyB,WAClC,IAAM/uQ,EAAWO,cAEjB,OAAO5R,uBAAY,SAAC2lH,GAChBt0G,E5CX2B,SAC/Bs0G,GAD+B,MAEF,CAC7B36G,KAAMuN,IAAQwgQ,sBACdpzJ,c4COa06J,CAAoB16J,MAC9B,CAACt0G,KCNR,SAASivQ,MAAgC,IAAD,EACuB9P,MAAnDW,EAD4B,EAC5BA,aAAcF,EADc,EACdA,iBAAkBQ,EADJ,EACIA,eADJ,EAEWC,MAAvCC,EAF4B,EAE5BA,YAAaI,EAFe,EAEfA,sBACbuF,EAAoBC,MAApBD,gBACSiJ,EAAmBh1J,KAA5Bx3G,QACSysQ,EAAoBt9P,eAA7BnP,QACU6E,EAAmB+hB,eAA7BtW,SACFo8P,EAA2B5I,MAC3BD,EAA6BF,MAC7BgJ,EAAoBR,MACpBG,EAAsBD,MACtBx4P,EAAUW,cAEVo4P,EAAqB3gR,uBAAY,WACnCygR,IACAC,IACA94P,EAAQjoB,QAAQpG,IAAOmF,QAAQG,wBAChC,CAAC6hR,EAAmBD,EAA0B74P,IAE3Ck3P,EAA8C7wP,mBAAQ,WACxD,OAAIgjP,EACO,UAGPsP,GAAkBC,GAAmBrP,EAC9B,WAGP,OAACmG,QAAD,IAACA,OAAD,EAACA,EAAiB30P,SAAW/J,EAAe+J,OAI3CgvP,EAIE,UAHI,SAJA,aAQZ,CAACV,EAAkBsP,EAAgBC,EAAiBrP,EAApD,OAAkEmG,QAAlE,IAAkEA,OAAlE,EAAkEA,EAAiB30P,OAAQ/J,EAAe+J,OAAQgvP,IAE/GiP,EAAkB5gR,uBAAY,WAChC,IAAI,OAACs3Q,QAAD,IAACA,OAAD,EAACA,EAAiB30P,UAAU,OAAC/J,QAAD,IAACA,OAAD,EAACA,EAAgB+J,QACjD,MAAO,CACH6lB,MAAK,OAAE8uO,QAAF,IAAEA,IAAmB,GAC1B91Q,QAAsB,OAAdoX,QAAc,IAAdA,OAAA,EAAAA,EAAgB+J,QACV/J,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KACjCmJ,KAEnB,CAACA,EAAgB0+P,IAEduJ,EAAuB7gR,uBAAY,WACrC,IAAMT,EAASqhR,IACXrhR,GACAkyQ,EAAelJ,IAAWsB,eAAgBtqQ,KAE/C,CAACkyQ,EAAgBmP,IAsBpB,OApBAttP,qBAAU,WACN,OAAO,WACHmtP,IACAC,OAGL,IAEHptP,qBAAU,WACN,IAAM/zB,EAASqhR,IACXrhR,GACAwyQ,EAAsBxJ,IAAWsB,eAAgBtqQ,KAEtD,CAACwyQ,EAAuB6O,IAE3BttP,qBAAU,WACNskP,EAA2BzG,GAC3BkP,EAAoBlP,KACrB,CAACkP,EAAqBzI,EAA4BzG,IAGjD,cAAC,IAAD,CACI0N,eAAgB8B,EAChB/B,iBAAkBiC,EAClB/B,iBAAkBA,EAClB7N,iBAAkBA,IAaf6P,I,IAAAA,IARf,WACI,OACI,cAAC,KAAkB7iM,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,gBAAlD,SACI,cAACi/P,IAAD,OCvGCS,IAAgE,CACzE,CACI3C,WAAY,yBAEhB,CACIA,WAAY,UAEhB,CACIA,WAAY,SCRPnL,IAAYjjQ,IAAOC,IAAV,wFCsCP+wQ,QAjCf,YAEuC,IADnCnC,EACkC,EADlCA,eAAgBD,EACkB,EADlBA,iBAAkBE,EACA,EADAA,iBAAkB7N,EAClB,EADkBA,iBAEpD,OACI,cAAC,GAAD,CACI98P,MAAM,UACNmlH,SAAS,yBACTuC,UACI,cAAC,IAAD,CAAW1qH,YAAU,sCAArB,uEAIJmtH,cAAc,oBACdxC,UAAWviI,IAAOmF,QAAQC,gBAC1B+3H,cAAc,SACduH,gBAAgB,QAChB7B,eAAe,IACfE,cAAc,EACd0B,aAAa,EACb9pH,SAAS,qBAfb,SAiBI,cAAC,IAAD,CACIyqQ,cAAeoC,IACflC,eAAgBA,EAChBD,iBAAkBA,EAClBE,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAa,aChChB9qO,IAAc,aAEd0tO,IAAqD,CAC9D,CACI7C,WAAY,UCcpB,SAAS8C,MAAsC,IAAD,EACiB1Q,MAAnDW,EADkC,EAClCA,aAAcF,EADoB,EACpBA,iBAAkBQ,EADE,EACFA,eADE,EAEKC,MAAvCC,EAFkC,EAElCA,YAAaI,EAFqB,EAErBA,sBACbuF,EAAoBC,MAApBD,gBACSiJ,EAAmBh1J,KAA5Bx3G,QACSysQ,EAAoBt9P,eAA7BnP,QACU6E,EAAmB+hB,eAA7BtW,SACA04P,EAAcD,MAAdC,UACF0D,EAA2B5I,MAC3BD,EAA6BF,MAC7BgJ,EAAoBR,MACpBiB,EAAuBhE,MACvBkD,EAAsBD,MACtBx4P,EAAUW,cAEVo9F,IAAc,OAAC2xJ,QAAD,IAACA,OAAD,EAACA,EAAiB30P,UAAW/J,EAAe+J,WAC9C,OAATo6P,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,SAAX,OAAoB2kL,QAApB,IAAoBA,OAApB,EAAoBA,EAAW1kL,MAElCsoL,EAAqB3gR,uBAAY,WACnCygR,IACAC,IACAS,IACAv5P,EAAQjoB,QAAQpG,IAAOmF,QAAQI,+BAChC,CAAC4hR,EAAmBD,EAA0BU,EAAsBv5P,IAEjEk3P,EAA8C7wP,mBAAQ,WACxD,OAAIgjP,EACO,UAGPsP,GAAkBC,GAAmBrP,EAC9B,UAGPxrJ,EACO,WAGNgsJ,EAIE,UAHI,WAIZ,CAACV,EAAkBsP,EAAgBC,EAAiBrP,EAAcxrJ,EAAYgsJ,IAE3EiP,EAAkB5gR,uBAAY,WAChC,IAAI2lH,EACJ,MAAO,CACHn9E,MAAK,OAAE8uO,QAAF,IAAEA,IAAmB,GAC1B91Q,QAAsB,OAAdoX,QAAc,IAAdA,OAAA,EAAAA,EAAgB+J,QACV/J,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KACjCmJ,EACdkhO,WAAoB,OAATijC,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,QAASrnE,KAAM,IAAIZ,KAAJ,OAAS4sP,QAAT,IAASA,OAAT,EAASA,EAAW3kL,QAAQjmE,OAAOohB,KACxEymM,SAAkB,OAAT+iC,QAAS,IAATA,OAAA,EAAAA,EAAW1kL,MAAOtnE,KAAM,IAAIZ,KAAJ,OAAS4sP,QAAT,IAASA,OAAT,EAASA,EAAW1kL,MAAMlmE,OAAOohB,QAEvE,CAAC36B,EAAgB0+P,EAAiByF,EAAWp3J,IAE1Ck7J,EAAuB7gR,uBAAY,WACrC,IAAMT,EAASqhR,IACXrhR,GACAkyQ,EAAelJ,IAAWuB,qBAAsBvqQ,KAErD,CAACkyQ,EAAgBmP,IAuBpB,OArBAttP,qBAAU,WACN,OAAO,WACHmtP,IACAC,IACAS,OAGL,IAEH7tP,qBAAU,WACN,IAAM/zB,EAASqhR,IACXrhR,GACAwyQ,EAAsBxJ,IAAWuB,qBAAsBvqQ,KAE5D,CAACwyQ,EAAuB6O,IAE3BttP,qBAAU,WACNskP,EAA2BzG,GAC3BkP,EAAoBlP,KACrB,CAACkP,EAAqBzI,EAA4BzG,IAGjD,cAAC,IAAD,CACI0N,eAAgB8B,EAChB/B,iBAAkBiC,EAClB/B,iBAAkBA,EAClB7N,iBAAkBA,IAaf6P,I,IAAAA,IARf,WACI,OACI,cAAC,KAAkB7iM,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,gBAAlD,SACI,cAAC6/P,IAAD,OCpHCjO,IAAYjjQ,IAAOC,IAAV,wFCsCPmxQ,QAjCf,YAE4B,IADxBvC,EACuB,EADvBA,eAAgBD,EACO,EADPA,iBAAkBE,EACX,EADWA,iBAAkB7N,EAC7B,EAD6BA,iBAEpD,OACI,cAAC,GAAD,CACI98P,MAAM,UACNmlH,SAAS,iBACTuC,UACI,cAAC,IAAD,CAAW1qH,YAAU,kCAArB,sEAIJmtH,cAAc,oBACdxC,UAAWviI,IAAOmF,QAAQC,gBAC1B+3H,cAAc,SACduH,gBAAgB,QAChB7B,eAAe,IACfE,cAAc,EACd0B,aAAa,EACb9pH,SAAS,iBAfb,SAiBI,cAAC,IAAD,CACIyqQ,cAAesC,IACfpC,eAAgBA,EAChBD,iBAAkBA,EAClBE,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAa,aC8DdgD,I,oFAAAA,IAjFf,WAAoC,IAAD,EAC4B7Q,MAAnDW,EADuB,EACvBA,aAAcF,EADS,EACTA,iBAAkBQ,EADT,EACSA,eADT,EAEgBC,MAAvCC,EAFuB,EAEvBA,YAAaI,EAFU,EAEVA,sBAFU,EAGSgI,MAAhCuB,EAHuB,EAGvBA,aAAcC,EAHS,EAGTA,cAChB+F,EAAoB/G,MACpBI,EAAqBF,MACrBhwO,EAAUnhB,YAAYkhB,MACtB5iB,EAAUW,cAEVo4P,EAAqB3gR,uBAAY,WACnCshR,IACA15P,EAAQjoB,QAAQpG,IAAOmF,QAAQK,kBAChC,CAACuiR,EAAmB15P,IAEjBk3P,EAA8C7wP,mBAAQ,WACxD,OAAIgjP,EACO,UAGPE,EACO,UAGkB,qBAAlBoK,EACA,WAGN5J,EAIE,UAHI,WAIZ,CAACV,EAAkBE,EAAcoK,EAAe5J,IAE7CiP,EAAkB5gR,uBAAY,WAChC,GAA6B,qBAAlBu7Q,EAAX,CACA,IAAMzhC,EAAY/oN,KAAM,IAAIZ,KAAKmrP,EAAeC,EAAe,IACzDvhC,EAAUF,EAAUl1N,IAAI,EAAG,SACjC,GAAI,OAAC6lB,QAAD,IAACA,OAAD,EAACA,EAASh7B,GACd,MAAO,CACHlM,UAAWknC,EAAQh7B,GACnBqqO,UAAWA,EAAU3nN,OAAOohB,KAC5BymM,QAASA,EAAQ7nN,OAAOohB,SAE7B,QAAC9I,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAI8rQ,EAAeD,IAE1BuF,EAAuB7gR,uBAAY,WACrC,IAAMT,EAASqhR,IACXrhR,GACAkyQ,EAAelJ,IAAWwB,QAASxqQ,KAExC,CAACkyQ,EAAgBmP,IAoBpB,OAlBAttP,qBAAU,WACN,OAAO,WACHguP,OAGL,IAEHhuP,qBAAU,WACN,IAAM/zB,EAASqhR,IACXrhR,GACAwyQ,EAAsBxJ,IAAWwB,QAASxqQ,KAE/C,CAACwyQ,EAAuB6O,IAE3BttP,qBAAU,WACNqnP,EAAmBxJ,KACpB,CAACwJ,EAAoBxJ,IAGpB,cAAC,IAAD,CACI0N,eAAgB8B,EAChB/B,iBAAkBiC,EAClB/B,iBAAkBA,EAClB7N,iBAAkBA,KC/DfsQ,IAzBWnzQ,sBACtB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,mBAAG2wD,YAAU,mBAAb,SACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,+6BAA+6BF,KAAK,mBAEx+B,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCC7BiyQ,IAlBMpzQ,sBACjB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,qBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBAAM4wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yaAAyaF,KAAK,sBCc/doyQ,IA1BQrzQ,sBACnB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,oBAAG2wD,YAAU,mBAAmBC,YAAU,UAAUC,YAAU,UAAUpwD,KAAK,eAA7E,UACI,sBAAME,EAAE,iPACR,sBAAMA,EAAE,uNAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,kBAAkB5zB,EAAE,4BCOzDmyQ,IAzBMtzQ,sBACjB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBACID,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAM,OACNC,OAAO,OACPC,MAAM,6BACNC,WAAW,+BAPf,UASI,mBAAG2wD,YAAU,mBAAb,SACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,soBAAsoBF,KAAK,mBAE/rB,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAO8zB,UAAU,wBAAwB5zB,EAAE,4BCjBjEozJ,IAAa3yJ,IAAOC,IAAV,gJAOV69P,IAAc99P,IAAO0nB,KAAV,uDAIX6nL,IAAevvM,IAAOC,IAAV,sGAMZuvM,IAAexvM,IAAOC,IAAV,gLAOZovH,IAAiBrvH,YAAOkrC,UAAPlrC,CAAH,iwBAqCdyvM,IAAiBzvM,IAAOC,IAAV,4HAOdyvM,IAAa1vM,IAAOC,IAAV,2ECpEVooG,IAAaroG,YAAOmuM,IAAPnuM,CAAH,mDAIVuwD,IAAUvwD,IAAOC,IAAV,iHAMP0lG,IAAiB3lG,IAAOC,IAAV,4qCAwDd+6P,IAAYh7P,IAAOC,IAAV,yIAOTu0C,IAASx0C,IAAOC,IAAV,kOCtEN0xQ,IAAmB10N,WAAaqhD,MAAM,CAC/C7qG,KAAMwpD,WACDG,SAAS,4BACTF,IAP8B,GAEC,6BAQ3B00N,IAA4B,uCAE5BC,IAAiB,gBACzBD,IAA4B,6BCbpB5mN,IAAoBhrD,IAAOC,IAAV,gEAKjBgrD,IAAuBjrD,IAAOC,IAAV,4HACpB,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAO4C,SCoC1BgrR,IAtCM,SAAC,GAUF,IACZ1mN,EAVJC,EASe,EATfA,KACAr4D,EAQe,EARfA,MACAkf,EAOe,EAPfA,MACAzO,EAMe,EANfA,MACAG,EAKe,EALfA,SACAlF,EAIe,EAJfA,OACAiE,EAGe,EAHfA,SACAuB,EAEe,EAFfA,SACGhE,EACY,2FAETN,EAAQqsD,YAAMZ,EAAKa,OAAQl5D,EAAMS,MACjC04D,EAAQF,YAAMZ,EAAKe,QAASp5D,EAAMS,MAMxC,OAJA23D,EAAee,GAASvsD,GACpB,cAACqrD,IAAD,UAAuBrrD,IAIvB,eAAC,IAAD,CAAmBuB,YAAW+C,EAA9B,UACI,cAAC,GAAD,6BACQlR,GADR,IAEIA,MAAOA,EACPkf,MAAOA,EACPzO,MAAOA,EACPG,SAAUA,EACVlF,OAAQA,EACRiE,SAAUA,EACV/C,MAAOusD,GAASvsD,EAChBsE,SAAUA,GACNhE,IAEPkrD,MCrCA7kC,IAAYvmB,IAAOC,IAAV,yDAITmkB,IAAQpkB,IAAO+zB,MAAV,ugBAIG,SAAA7zB,GAAK,OAAIA,EAAMspC,OAAN,UAAkB,EAA0B,IAAtBtpC,EAAMspC,OAAO72B,OAAnC,MAAsD,UAK5D,SAAAzS,GAAK,OAAIA,EAAM6xQ,UAAY,qBAAuB,sBAK9C,SAAA7xQ,GAAK,OAAIA,EAAM6xQ,UAAY,qBAAuB,sBACpE,SAAA7xQ,GAAK,MAA6B,kBAAlBA,EAAMy0H,QAAb,yBACaz0H,EAAMspC,OAAN,UACX,EAA8D,KAAzDtpC,EAAMy0H,QAAQ/kI,WAAW+iB,OAASzS,EAAMspC,OAAO72B,QADzC,gBAEX,GAAyC,IAAnCzS,EAAMy0H,QAAQ/kI,WAAW+iB,OAFpB,MADb,KAKL,MAaDq/P,IAAkBhyQ,IAAOC,IAAV,mIAQf63O,IAAU93O,IAAOC,IAAV,0IAGA,SAAAC,GAAK,OAAIA,EAAM+xQ,UAAY,MAAQ,UAE1C,SAAA/xQ,GAAK,OAAIA,EAAMgyQ,oBAAsB,qBAAuB,sBAG5DC,IAASnyQ,IAAOC,IAAV,2OAQU,SAAAC,GAAK,OAAIA,EAAMgyQ,oBAAsB,qBAAuB,sBAG5E/wM,IAAQnhE,IAAOC,IAAV,mIAOLT,IAAQQ,IAAOC,IAAV,qICvELmyQ,IAA2B,SAACvsQ,GAAiE,IAAlDwsQ,EAAiD,uDAA7B,GAAIC,EAAyB,uDAAN,EACzFC,EAAe1lM,oBAAUhnE,GAC/B,GAAI0sQ,EAAa5/P,QAAU0/P,EACvB,OAAOE,EAEX,IAAMC,EAAQD,EAAa11N,MAAM,KACjC,OAAO21N,EAAMjxP,MAAM,EAAG+wP,GAAUp/Q,KAAK,MC0D1Bu/Q,QAtDf,YAY8B,IAX1Bz/Q,EAWyB,EAXzBA,MACAkyB,EAUyB,EAVzBA,SACAwtP,EASyB,EATzBA,gBACAR,EAQyB,EARzBA,oBACA1oO,EAOyB,EAPzBA,OACA/lC,EAMyB,EANzBA,MACAsuQ,EAKyB,EALzBA,UACAnyQ,EAIyB,EAJzBA,MACAgE,EAGyB,EAHzBA,SACA2mB,EAEyB,EAFzBA,SACArmB,EACyB,EADzBA,SAEMyuQ,EAAwC,kBAApBD,EAC1B,OACI,eAAC,IAAD,WACI,cAAC,IAAD,6BACQ1/Q,GADR,IAEIqL,IAAK6mB,EACLyvG,QAAS+9I,EACTlpO,OAAQA,EACRuoO,UAAWA,EACXnuQ,SAAUA,EACV2mB,SAAUA,EACVppB,YAAW+C,GAAQ,UAAOA,EAAP,aAEvB,eAAC8tQ,IAAD,WACKW,GAAc,cAAC,IAAD,CACXT,oBAAqBA,EACrBD,YAAazoO,EACbroC,YAAW+C,GAAQ,UAAOA,EAAP,YAHR,SAKVwuQ,IAGJlpO,GACG,cAAC2oO,IAAD,CACID,oBAAqBA,EACrB/wQ,YAAW+C,GAAQ,UAAOA,EAAP,WAFvB,SAIKslC,OAIZuoO,GACG,cAAC,IAAD,CAAO5wQ,YAAA,UAAcixQ,IAAyBxyQ,GAAvC,UAAP,SAA+DA,IAElE6D,IAAUsuQ,GACP,cAAC,IAAD,CAAO5wQ,YAAW+C,GAAQ,UAAOA,EAAP,UAA1B,SAAoDT,QCRrDmvQ,QA/Cf,YAU0B,IAAD,IATrBvnN,EASqB,EATrBA,KACAr4D,EAQqB,EARrBA,MACA0yB,EAOqB,EAPrBA,UACAqmC,EAMqB,EANrBA,UACAviB,EAKqB,EALrBA,OACA/lC,EAIqB,EAJrBA,MACAG,EAGqB,EAHrBA,SACAivQ,EAEqB,EAFrBA,eACA3uQ,EACqB,EADrBA,SAEMtE,EAAQqsD,YAAMZ,EAAKa,OAAQl5D,EAAMS,MACjCq/Q,IAAc7mN,YAAMZ,EAAKe,QAASp5D,EAAMS,MACxCi/Q,EAAkBhtP,EAAYjT,KAAKyqC,IAAIx3B,GAAS,UAAG1yB,EAAM6S,aAAT,aAAG,EAAa8M,QAAQ,QAAK5hB,EAC7EmhR,IAAwBxsP,GAAaA,GAAS,UAAG1yB,EAAM6S,aAAT,aAAG,EAAa8M,QAC9Do/P,GAAae,GAAaZ,MAA0BtyQ,EACpDslB,EAAWC,iBAAyB,MAEpCW,EAAe91B,uBAAY,SAACq1B,GAAsC,IAAD,EAC7D0tP,EAAW,UAAG1tP,EAAEgwB,cAAL,aAAG,EAAUxvC,MACxBA,EAAQgtQ,EAAiBA,EAAeE,GAAeA,EAC7D1nN,EAAK66C,cAAclzG,EAAMS,KAAMoS,KAChC,CAAC7S,EAAMS,KAAM43D,EAAMwnN,IAQtB,OANAvvP,qBAAU,WACFyoC,GAAa7mC,EAAS6K,SACtB7K,EAAS6K,QAAQs8B,UAEtB,CAACN,IAGA,cAAC,IAAD,CACI2mN,gBAAiBA,EACjB1/Q,MAAOA,EACPkyB,SAAUA,EACVskB,OAAQA,EACR/lC,MAAOA,EACPyuQ,oBAAqBA,EACrBH,UAAWA,EACXnyQ,MAAOA,EACPgE,SAAUA,EACV2mB,SAAUzE,EACV5hB,SAAUA,KC2CP8uQ,QA5Ef,YAM6B,IALzBr0K,EAKwB,EALxBA,QACAQ,EAIwB,EAJxBA,cACA8zK,EAGwB,EAHxBA,kBACA5zK,EAEwB,EAFxBA,SACA6zK,EACwB,EADxBA,sBAEA,OACI,cAAC,IAAD,CACI70Q,IAAKsgG,EACLQ,cAAeA,EACfE,SAAUA,EACVC,iBAAkBqyK,IAClBpkK,SAAU2lK,EALd,SAOK,YAA6D,IAA1D9zQ,EAAyD,EAAzDA,OAAQ8vM,EAAiD,EAAjDA,MAAOC,EAA0C,EAA1CA,QAAS5vG,EAAiC,EAAjCA,aAAcz5E,EAAmB,EAAnBA,aACtC,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAW3kB,YAAU,qBAArB,kBACA,cAAC,IAAD,CACI1N,KAAK,OACL87F,UAAWqjL,IACXltP,UAAW,GACXhnB,OAAO,OACPkF,SAAU27F,EACVr7F,SAAS,0BAGjB,eAAC,IAAD,WACI,cAAC,IAAD,CAAW/C,YAAU,sBAArB,2BACA,cAAC,IAAD,CACI1N,KAAK,eACL87F,UAAWqjL,IACXl0Q,OAAO,OACPkF,UAAU,EACVM,SAAS,2BAGjB,eAAC,IAAD,WACI,cAAC,IAAD,CAAW/C,YAAU,sBAArB,2BACA,cAAC,IAAD,CACInG,KAAK,OACLkX,MAAO+gQ,EACPptQ,MAAOzG,EAAOxL,QACd27F,UAAWuiL,IACXvnP,SAAUzE,EACVpnB,OAAQ,GACRmC,QAAQ,WACRpN,KAAK,UACL6K,UAAU,iBACV4F,SAAS,iCAIrB,cAAC,IAAD,UACI,cAAC,IAAD,CACIzF,MAAM,QACNC,OAAO,OACPkF,UAAWsrM,IAAUC,GAAW5vG,EAChCt7F,aAAa,QACbD,YAAa,GACbD,QAASw7F,EACTr7F,SAAS,eAPb,4BC0DbivQ,I,gBAAAA,IArHf,YAA4E,IAAD,EAAjD14O,EAAiD,EAAjDA,QAAS24O,EAAwC,EAAxCA,gBACzBz0K,EAAUx5E,iBAAY,MAD2C,EAE/BhC,qBAF+B,mBAEhEkwP,EAFgE,KAElDC,EAFkD,KAGjEzqB,E3rB4BCvvO,YAAY1U,qBAAWwtJ,K2rB5BgBjgK,KACxCohR,Ev4B4DyB,WAC/B,IAAMlyQ,EAAWO,cACX47B,EAAiBnmC,eACvB,OAAOrH,uBACH,SAACiyH,EAAoB1uH,GAAuB,IAAD,EACvC8N,EAAS8gD,gBACT,IAAMroB,EAAM,UAAGmoF,EAAU1jF,MAAK,SAAAvqC,GAAI,OAAIA,EAAKP,OAAS4R,KAAWC,wBAAnD,aAAG,EAAgE7F,GAC/E,IAAKq6B,EACD,OAAOuoB,aAA0B,GAAD,OAAIh9C,KAAWC,cAAf,gCAEpC,IAAM/V,EAA4B,CAC9BwC,OAAO,GAAD,OAAK2rC,KAAWtqC,OAAhB,YAA0BsqC,KAAWC,SAC3CtF,MAAOyB,EAAOlqC,WACdkuC,UAAWvqC,EAAU3D,WACrBkD,KAAM,WACNJ,MAAO,IACPC,OAAQ,GAEZ,OAAO6qC,EAAejuC,GACjB+7B,MAAK,SAACma,GAEH,OADApkC,EAAS+gD,aAA0B3c,EAAIvzB,QAChCuzB,KAEVja,OAAM,SAAC5rB,GAGJ,OAFAyB,EAASghD,aAA0BziD,IACnCwB,YAAcC,EAAUzB,EAAO,SACxB,aAGnB,CAACyB,EAAUm8B,Iu4BzFUg2O,GACnBvxJ,EAAYpB,KACZqB,EAAgBpB,KAChB2yJ,EAAuBjgR,eACvBkgR,EAAqB//Q,eACrB2uD,Ev4BwF2B,WACjC,IAAMjhD,EAAWO,cACjB,OAAO5R,uBAAY,WACfqR,EAASihD,kBACV,CAACjhD,Iu4B5FuBsyQ,GACrB7hQ,EAAcnQ,cAEdsxQ,EAAoBh1P,mBAAQ,WAC9B,GAAK4qO,EAAL,CACA,IAAM+qB,EAAY,CAAEngR,KRRS,mBQQoBoS,MAAO,MAClDguQ,EAAYhrB,EAAc5nP,KAAI,SAAA6yQ,GAAK,MAAK,CAC1CrgR,KAAMqgR,EAAMn1O,UAAY,IAAMm1O,EAAMj1O,SACpCh5B,MAAOiuQ,EAAMr0Q,OAEjB,MAAO,CAACm0Q,GAAW51J,OAAO61J,MAC3B,CAAChrB,IAEE1pJ,EAAgBlhF,mBAAQ,WAAO,IAAD,EAChC,MAAO,CACHxqB,KAAMgnC,EAAQhnC,KACdsgR,aAAct5O,EAAQu5O,UAAR,UAAuBv5O,EAAQu5O,UAA/B,kBAA2D,GACzEpgR,SAAU,UAAC6mC,EAAQqkO,aAAT,aAAC,EAAer/P,MAAO,OAACwzQ,QAAD,IAACA,OAAD,EAACA,EAAmB10O,MAAK,SAAAnrB,GAAI,OAAIA,EAAKvN,QAAU40B,EAAQqkO,MAAOr/P,OAC1Fg7B,EAAQqkO,MAAMr/P,GACd,QAEX,CAACg7B,EAAQhnC,KAAMgnC,EAAQqkO,MAAOrkO,EAAQu5O,UAAWf,IAE9CgB,EAA4BjkR,uBAAY,SAACoP,GAC3C,IAAM8sD,EAAiC,GAIvC,OAHI9sD,EAAO3L,QAAP,OAAgB4/Q,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAcr1M,cAC9B9R,EAAOz4D,KAAO4/Q,EAAazzQ,OAExBssD,IACR,CAACmnN,IAEEa,EAAclkR,uBAAY,SAACq1B,EAAgBjmB,GAC7C,OAAOimB,EAAEzkB,SACL,KAAKgxQ,IACD0B,EAAgB,CACZt1M,WAAY5+D,EAAO3L,KACnBmM,MAAOiyQ,IAAkBD,OAE7B,MACJ,QACI9/P,EAAYuT,EAAEzkB,QAAS,SAG/B+9F,EAAQ5uE,QAAQywE,eAAc,GAC9B7B,EAAQ5uE,QAAQokP,iBACjB,CAACriQ,IAEE+sF,EAAe7uG,uBAAY,SAACoP,GAAsC,IAAD,IACxC,UAAAq7B,EAAQhnC,YAAR,eAAc6S,iBAAkBlH,EAAO3L,KAAK6S,cACjEmtQ,EAAqBh5O,EAAQh7B,GAAKL,EAAO3L,MACzCk5B,QAAQo7B,WAETz8B,MAAK,WAAO,IAAD,OACgB,UAACmP,EAAQqkO,aAAT,aAAC,EAAer/P,KAClC,UAAAg7B,EAAQqkO,aAAR,eAAer/P,MAAOL,EAAOxL,UAC3BwL,EAAOxL,SAET8/Q,EAAmBj5O,EAAQh7B,GAAKL,EAAOxL,SACvC+4B,QAAQo7B,WAETz8B,MAAK,WACFqzE,EAAQ5uE,QAAQywE,eAAc,GAC9B7B,EAAQ5uE,QAAQqkP,UAAUh1Q,GAC1Bg0Q,OAEH5nP,OAAM,SAACnG,GACJ6uP,EAAY7uP,EAAGjmB,SAG1BosB,OAAM,SAACnG,GACJ6uP,EAAY7uP,EAAGjmB,QAExB,CAACq7B,EAASy5O,EAAad,EAAiBK,EAAsBC,IAyBjE,OAvBApwP,qBAAU,WAAO,IAAD,GACR,OAAC2+F,QAAD,IAACA,GAAD,UAACA,EAAWjkE,YAAZ,aAAC,EAAiBrrC,SAClBuvG,MAEL,QAACD,QAAD,IAACA,GAAD,UAACA,EAAWjkE,YAAZ,aAAC,EAAiBrrC,OAAQuvG,IAE7B5+F,qBAAU,WAAO,IAAD,GACZ,OAAI2+F,QAAJ,IAAIA,GAAJ,UAAIA,EAAWjkE,YAAf,aAAI,EAAiBrrC,SACjB4gQ,EAAiBtxJ,EAAUjkE,KAAMvjB,EAAQh7B,MAE9C,CAAC8zQ,EAAkB94O,EAAQh7B,GAA3B,OAA+BwiH,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAWjkE,OAE7C16B,qBAAU,WACNq7E,EAAQ5uE,QAAQqkP,UAAUj1K,KAC3B,CAACA,IAEJ77E,qBAAU,WACN,OAAO,WACHg/B,OAGL,IAGC,cAAC,IAAD,CACIq8C,QAASA,EACTQ,cAAeA,EACf8zK,kBAAmBA,EACnB5zK,SAAUR,EACVq0K,sBAAuBe,KC1HtB1tP,IAAYvmB,IAAOC,IAAV,uEAKTo0Q,IAAUr0Q,IAAOC,IAAV,+GAMP8pN,IAAU/pN,IAAOC,IAAV,oICXPq0Q,IAASt0Q,IAAOC,IAAV,oFCuCJs0Q,QAlCf,YAEmC,IAD/B7gH,EAC8B,EAD9BA,UAEA,OACI,mCACKA,EAAa,qCACV,cAAC,GAAD,CACIA,UAAWA,EACXK,eAAe,EACfpwJ,MAAO,CAAEhB,SAAU,OAAQsxB,WAAY,SAAUjxB,MAAO,uBAAwBtE,OAAQ,UAE5F,eAAC41Q,IAAD,WACI,uBAAMnzQ,YAAU,yBAAhB,UAA0CuyJ,EAAU8gH,WAApD,iBADJ,iBAEI,uBAAMrzQ,YAAU,sBAAhB,UAAuCuyJ,EAAU+gH,QAAjD,2BAFJ,iBAGI,uBAAMtzQ,YAAU,0BAAhB,UAA2CuyJ,EAAUghH,YAArD,wBAEA,qCACJ,cAACpwK,GAAA,EAAD,CACIzjG,QAAQ,OACR8C,MAAO,CAAEyU,WAAY,oBACrB3Z,MAAO,IACPC,OAAQ,KAEZ,cAAC4lG,GAAA,EAAD,CACIzjG,QAAQ,OACR8C,MAAO,CAAEyU,WAAY,oBACrB3Z,MAAO,IACPC,OAAQ,WCXbi2Q,QAjBf,YAE+B,IAD3BphR,EAC0B,EAD1BA,UAEM4gK,EAAiB7B,KACjB8B,EAAsB70C,KAM5B,OAJAj8F,qBAAU,WACN8wI,EAAoB7gK,KACrB,CAACA,EAAW6gK,IAGX,cAAC,IAAD,CACIV,UAAWS,EAAehiK,QCmBvByiR,QAhCf,YAI+B,IAH3BrhR,EAG0B,EAH1BA,UACA8/J,EAE0B,EAF1BA,qBACAD,EAC0B,EAD1BA,oBAEA,OACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAsB7/J,UAAWA,IACjC,eAAC8gR,IAAD,CAASlzQ,YAAU,YAAnB,0BACO,2CADP,qGAGA,eAAC,IAAD,WACI,cAAC,IAAD,CACIzC,OAAO,OACPjE,OAAQ44J,EACRnvJ,SAAS,8BAHb,kCAOA,cAAC,IAAD,CACIxF,OAAO,OACPmC,QAAQ,UACRpG,OAAQ24J,EACRlvJ,SAAS,4BAJb,uCCWD2wQ,I,4BAAAA,IA1Bf,YAE2B,IADvBp6O,EACsB,EADtBA,QAEM7iB,EAAUW,cACV3Q,EAAU0R,YAAY3R,MAEtB6rJ,EAA2BxjK,uBAAY,WACpC4X,GACLu6G,GAAU,4CAAD,OACuCv6G,EAAQ+2B,UAD/C,YAC4D/2B,EAAQi3B,SADpE,eACmFpE,EAAQhnC,SAErG,CAACgnC,EAAS7yB,IAEP2rJ,EAA0BvjK,uBAAY,WACxC4nB,EAAQH,KAAKluB,IAAOsE,eACrB,CAAC+pB,IAEJ,OACI,cAAC,IAAD,CACIrkB,UAAWknC,EAAQh7B,GACnB4zJ,qBAAsBG,EACtBJ,oBAAqBG,K,WC3BpBhtI,IAAYvmB,IAAOC,IAAV,iLAMR,SAAAC,GAAK,OAAIA,EAAM40Q,UAAY,oBAAsB,UAGlD7S,IAAWjiQ,IAAOC,IAAV,4HAOR80Q,IAAW/0Q,IAAOiS,EAAV,4MAURk7D,IAAYC,cAAW,iBAAO,CACvC4nM,oBAAqB,CACjB7nO,aAAc,YAKTqH,IAASx0C,IAAOC,IAAV,+SAaNy1H,IAAa11H,IAAOC,IAAV,8RAaVg1Q,IAAiBj1Q,IAAOC,IAAV,kJAQdkvB,IAAUnvB,IAAOC,IAAV,qMCXLi1Q,QA/Cf,YAOkC,IAAD,EAN7Bz6O,EAM6B,EAN7BA,QACA06O,EAK6B,EAL7BA,eACAxzK,EAI6B,EAJ7BA,aACAuqK,EAG6B,EAH7BA,OACAttK,EAE6B,EAF7BA,gBACAw2K,EAC6B,EAD7BA,WAEMpnM,EAAUb,MACV2nM,IAAc5I,EAEpB,OAAO,eAAC,IAAD,WACH,eAAC,IAAD,CAAW4I,UAAWA,EAAtB,UACI,cAAC71K,IAAA,cAAD,CACIL,gBAAiBA,EACjB0C,aAAY,OAAE7mE,QAAF,IAAEA,OAAF,EAAEA,EAAS6R,QACvB4yD,aAAoB,OAAPzkE,QAAO,IAAPA,GAAA,UAAAA,EAAShnC,YAAT,eAAe04C,OAAO,GAAGC,gBAAiB,GACvDloC,SAAS,eACT5F,UAAW0vE,EAAQgnM,oBACnBvyK,aC/BqB,QDgCrBb,aAAcwzK,EACdn0K,YAAY,EACZU,aAAcA,IAElB,cAAC,IAAD,CAAUxgG,YAAU,oBAApB,kDAGCg0Q,GACG,cAACJ,IAAD,CACI7zO,KAAK,6FACLmU,OAAO,SACPl0C,YAAU,0BAHd,2BASP2zQ,GACG,cAAC,IAAD,UACI,cAAC,IAAD,CAAY1wQ,QAAS8nQ,EAAQ/qQ,YAAU,cAAvC,SACI,cAAC8zQ,IAAD,UAAgB,cAACjiN,GAAA,EAAD,cERrBqiN,I,oCAAAA,IAtCf,YAK6B,IAJzB56O,EAIwB,EAJxBA,QACA06O,EAGwB,EAHxBA,eACAjJ,EAEwB,EAFxBA,OACAkH,EACwB,EADxBA,gBACwB,EACgBjwP,oBAAS,GADzB,mBACjBw+E,EADiB,KACH2zK,EADG,KAElBC,Ej5B2I0B,WAChC,IAAMx1M,EAAcC,eACdw1M,EAAoB3hR,eACpBie,EAAcnQ,cAQnB,OAAO3R,uBACJ,SAACuD,EAAmB2sE,GAChB,OAAOH,EAAYG,GACd50C,MAAK,SAAC/4B,GACH,OAAOijR,EAAkBjiR,EAAWhB,MAEvCi5B,OAAM,SAAC5rB,GAEJ,OADAkS,EAAYlS,EAAMgB,QAAS,SACpB+rB,QAAQC,OAAOhtB,QAGlC,CAACmgE,EAAay1M,EAAmB1jQ,Ii5BjKX2jQ,GACpBC,EAAoB5hR,cAEpB8qG,EAAkB5uG,uBAAY,SAACm1G,IAC7B,OAAC1qE,QAAD,IAACA,OAAD,EAACA,EAASh7B,MACd61Q,GAAgB,GAChBC,EAAkB96O,EAAQh7B,GAAI0lG,GACzB75E,KAAK8nP,MACX,QAAC34O,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAI2zQ,EAAiBmC,IAE5BH,EAAaplR,uBAAY,YACvB,OAACyqC,QAAD,IAACA,OAAD,EAACA,EAASh7B,MACd61Q,GAAgB,GAChBI,EAAiB,OAACj7O,QAAD,IAACA,OAAD,EAACA,EAASh7B,IACtB6rB,KAAK8nP,MACX,QAAC34O,QAAD,IAACA,OAAD,EAACA,EAASh7B,GAAIi2Q,EAAmBtC,IAMpC,OAJA9vP,qBAAU,WACNgyP,GAAgB,KACjB,CAAC76O,IAEG,cAAC,IAAD,CACHA,QAASA,EACT06O,eAAgBA,EAChBxzK,aAAcA,EACdyzK,WAAYA,EACZx2K,gBAAiBA,EACjBstK,OAAQA,KClCHyJ,IAA0D,CACnE,CACIliR,KAAM,WACNoS,MAAO,YAEX,CACIpS,KAAM,iBACNoS,MAAO,mBCVFwiG,IAAaroG,YAAOmuM,IAAPnuM,CAAH,mDAIVuwD,IAAUvwD,IAAOC,IAAV,sIAOP0lG,IAAiB3lG,IAAOC,IAAV,0rCAuDd+6P,IAAYh7P,IAAOC,IAAV,uLASTu0C,IAASx0C,IAAOC,IAAV,kO,wBCnEb21Q,IAAuB51Q,IAAOC,IAAV,8oFA2ET,SAAAC,GAAK,OAAIA,EAAMI,MAAMpc,OAAOO,aAkCvB,SAAAyb,GAAK,OACfA,EAAM0D,SAAW3f,IAAUC,OAAOQ,WAAawb,EAAM8C,SAI3C,SAAA9C,GAAK,OACfA,EAAM0D,SAAW3f,IAAUC,OAAOQ,WAAa,aAE7C,SAAAwb,GAAK,OACHA,EAAM0D,SAAW3f,IAAUC,OAAOQ,WAAawb,EAAM8C,SAI/Dm+D,IAAQnhE,IAAOC,IAAV,gGAEEhc,IAAUC,OAAOO,WAIjBoxR,IAWR,SAAC,GAWC,IAVHnjQ,EAUE,EAVFA,IACAwqC,EASE,EATFA,IACAr3C,EAQE,EARFA,MACA0kB,EAOE,EAPFA,SACAvnB,EAME,EANFA,MACAS,EAKE,EALFA,MACA4hG,EAIE,EAJFA,KACAzhG,EAGE,EAHFA,SACAkyQ,EAEE,EAFFA,YACA5xQ,EACE,EADFA,SAEM6xQ,EAAW1wK,EClKQ,SAASx/F,GAClC,OAAI4M,KAAKqpI,MAAMj2I,KAAWA,EAAc,EACjCA,EAAMjW,WAAWitD,MAAM,KAAK,GAAGlqC,QAAU,EDgKxBqjQ,CAAc3wK,GAAQ,EAC9C,OACI,eAACuwK,IAAD,CACIhyQ,SAAUA,EACVZ,MAAOA,GAAgB/e,IAAUC,OAAOI,YAF5C,UAIKmf,GAAS,cAAC,IAAD,CAAOtC,YAAW+C,GAAQ,UAAOA,EAAP,UAA1B,SAAoDT,IAC9D,sBAAMtC,YAAW+C,GAAQ,UAAOA,EAAP,WAAzB,SACI,cAAC,MAAD,CACIN,SAAUA,EACV8uF,SAAUx1C,EACV+4N,SAAUvjQ,EACV6X,SAAUA,EACV1kB,MAAOA,EACPw/F,KAAMA,EACN6wK,gBAAgB,EAChBJ,YAAW,OAAEA,QAAF,IAAEA,IAAgB,SAAAjwQ,GAAK,gBAAOA,EAAMygD,QAAQyvN,aElL9DI,IAAuB,SAACtwQ,EAAe7K,GAChD,OAAOA,GACH,IAAK,MACD,MAAO,gBACX,IAAK,MACD,MAAO,cACX,QACI,MAAO,KAINo7Q,IAAwB,SAACvwQ,EAAe7K,GACjD,OAAOA,GACH,IAAK,MACD,MAAO,MACX,IAAK,MACD,MAAO,OACX,QACI,MAAO,KCGJq7Q,IAlBMj4Q,sBACjB,WAA+BC,GAAS,IAArCC,EAAoC,EAApCA,UAAWG,EAAyB,EAAzBA,MAAOC,EAAkB,EAAlBA,OACjB,OACI,qBACIL,IAAKA,EACLG,QAAQ,YACRF,UAAWA,EACXG,MAAK,OAAEA,QAAF,IAAEA,IAAS,GAChBC,OAAM,OAAEA,QAAF,IAAEA,IAAU,GAClBC,MAAM,6BACNC,WAAW,+BAPf,SASI,sBAAM4wD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,4gBAA4gBF,KAAK,sBCbpkBknB,IAAYvmB,IAAOC,IAAV,ugBAOM,SAAAC,GAAK,OAAIA,EAAMo2Q,UAAY,mBAAqB,sBAgB/Dp0B,IAAaliP,IAAOC,IAAV,8NAIV,SAAAC,GAAK,OAAIA,EAAMs0G,SAAW,sBAAwB,sBACjD,SAAAt0G,GAAK,OAAIA,EAAMs0G,UAAYt0G,EAAMkE,QAAU,UAAY,aC4CtDmyQ,QAlEf,YAa8B,IAZ1B1wQ,EAYyB,EAZzBA,MACAywQ,EAWyB,EAXzBA,UACAE,EAUyB,EAVzBA,QACAzkR,EASyB,EATzBA,OACA0kR,EAQyB,EARzBA,QACAC,EAOyB,EAPzBA,SACAxyQ,EAMyB,EANzBA,SACAqmB,EAKyB,EALzBA,SACAosP,EAIyB,EAJzBA,aACAC,EAGyB,EAHzBA,cACAC,EAEyB,EAFzBA,OACA5nG,EACyB,EADzBA,OAEA,OACI,eAAC,IAAD,CAAWqnG,UAAWA,EAAtB,UACI,cAACvwM,GAAA,EAAD,CACI7oB,IAAK,IACLgpB,QAAS,EACTj5B,UAAU,QACVgd,YAAY,qEACZpkD,MAAOA,EACPvH,UAAU,uBACVm7D,aAAcx1E,IAAUC,OAAOQ,WAC/Bkf,SAAqB,YAAX7R,EACVw4B,SAAU,SAAAlF,GAAC,OAAIkF,EAASlF,EAAEgwB,OAAOxvC,QACjCmgE,QAAS,kBAAM2wM,GAAa,IAC5B1wM,OAAQ,kBAAM0wM,GAAa,IAC3BzyQ,SAAUA,IAEF,YAAXnS,GAAwB,mCACrB,eAAC,IAAD,CACIyiH,SAAUgiK,EACVpyQ,QAASyyQ,EACT11Q,YAAW+C,GAAQ,UAAOA,EAAP,WAHvB,UAKI,cAAC,IAAD,IAAS,+CAGL,eAAXnS,GAA2B,mCACxB,eAAC,IAAD,CACIyiH,UAAU,EACVrzG,YAAW+C,GAAQ,UAAOA,EAAP,eAFvB,UAII,cAAC,KAAD,CAASG,KAAM,KAAM,sDAGjB,YAAXtS,GAAwB,mCACrB,eAAC,IAAD,CACIyiH,UAAU,EACVpwG,QAAS6qK,EACT9tK,YAAW+C,GAAQ,UAAOA,EAAP,SAHvB,UAKI,cAAC,GAAD,IAAc,6CAGtB,uBACII,IAAKmyQ,EACLp4Q,IAAKq4Q,EACLI,aAAcF,EACdG,QAAS9nG,QCoCV+nG,QAnGf,YAM0B,IALtB9iR,EAKqB,EALrBA,SACAg2D,EAIqB,EAJrBA,aACAyrD,EAGqB,EAHrBA,WACAzxG,EAEqB,EAFrBA,SACA+yQ,EACqB,EADrBA,SACqB,EACa9zP,oBAAS,GADtB,mBACdmzP,EADc,KACHK,EADG,OAEKxzP,qBAFL,mBAEdtd,EAFc,KAEPwkD,EAFO,OAGOlnC,mBAA4B,WAHnC,mBAGdpxB,EAHc,KAGNmlR,EAHM,OAIS/zP,qBAJT,mBAIdszP,EAJc,KAILU,EAJK,KAKfT,EAAWvxP,iBAAyB,MAEpCiyP,EAAW,OAAGvxQ,QAAH,IAAGA,IAASqkD,EACvBssN,EAAUY,EAAY99O,OAAO3mB,OAAS,IAAMgjG,EAO5Cm7D,EAAa9gL,uBAAY,WAC3B0mR,EAAS3mP,QAAS8gJ,QAClB6lG,EAAS3mP,QAASghJ,YAAc,EAChCmmG,EAAU,aACX,IAQGpxP,EAAe91B,uBAAY,SAACqnR,GAC9BhtN,EAASgtN,GACTvmG,IACAqmG,OAAWpmR,KACZ,CAAC+/K,IAOEwmG,EAAoBtnR,uBAAY,WAClC0mR,EAAS3mP,QAAS4gJ,OAClBumG,EAAU,aACX,IAOGxmG,EAAa1gL,uBAAY,WACtBwmR,IACDC,EACAa,KAEAJ,EAAU,cACVjzG,GAA4B,CACxB1pK,KAAM68Q,EACNlzG,UAAWhwK,EAASgwK,UACpBE,gBAAiBlwK,EAASqjR,WAC1BpzG,QAASjwK,EAAS2wK,QACnBv5I,MAAK,SAAAk1C,GACJ,IAAM9/B,EAAME,IAAIC,gBAAgB2/B,GAChC22M,EAAWz2O,UAGpB,CAAC81O,EAASC,EAASa,EAAmBF,EAAaljR,IAWtD,OATAovB,qBAAU,WACN2zP,EAAoB,YAAXllR,KACV,CAACklR,EAAUllR,IAEduxB,qBAAU,WACNwtJ,IACAqmG,OAAWpmR,KACZ,CAAC+/K,EAAY58K,IAGZ,cAAC,IAAD,CACI2R,MAAOuxQ,EACPd,UAAWA,EACXE,QAASA,EACTzkR,OAAQA,EACR0kR,QAASA,EACTC,SAAUA,EACVxyQ,SAAUA,EACVqmB,SAAUzE,EACV6wP,aAAcA,EACdC,cAAeU,EACfT,OAAQnmG,EACRzB,OAAQ6B,KCmCL0mG,QA/Gf,YAWmC,IAV/BxjR,EAU8B,EAV9BA,KACAyjR,EAS8B,EAT9BA,WACAr4Q,EAQ8B,EAR9BA,OACAs4Q,EAO8B,EAP9BA,kBACA/hK,EAM8B,EAN9BA,WACAgiK,EAK8B,EAL9BA,SACAC,EAI8B,EAJ9BA,aACA1xK,EAG8B,EAH9BA,cACA2xK,EAE8B,EAF9BA,QACAC,EAC8B,EAD9BA,eAEA,OACI,qCACI,eAAC,IAAD,WACI,eAAC9c,IAAD,CAAW75P,YAAU,cAArB,UACK42Q,qBAAW/jR,GADhB,cAGA,cAAC,IAAD,CACIke,MAAOulQ,EACP5xQ,MAAOzG,EAAOylK,MACdt1E,UAAWuiL,IACXvnP,SAAU,SAAClF,GAAD,OAAsC6gF,EAAc0xK,EAAa,SAAUvyP,EAAEgwB,OAAOxvC,QAC9FnH,OAAQ,GACRmC,QAAQ,WACRpN,KAAMmkR,EAAa,SACnBt5Q,UAAU,iBACVsF,SAAU+xG,EACVzxG,SAAS,sBAGjB,eAAC+2P,IAAD,WACI,cAACC,IAAD,CAAuB/5P,YAAU,0BAAjC,qCAGA,cAACg6P,IAAD,CACI3mJ,SAAUmjK,EACVvzQ,QAASyzQ,EACT12Q,YAAU,oBAHd,2BAQJ,eAACi6P,IAAD,WACI,eAACJ,IAAD,WACI,sBAAM75P,YAAU,kBAAhB,uBACA,cAACk6P,IAAD,UACI,cAAChqM,IAAA,EAAD,CACI92D,KAAM,eAAC+gQ,IAAD,WACF,cAACC,IAAD,4BACA,cAACC,IAAD,oJACA,cAACD,IAAD,0BACA,cAACC,IAAD,4MAEJlqM,eAAe,EACfptD,SAAS,2BAIrB,cAAC,IAAD,CACIwO,IAAK,EACLwqC,IAAK,EACLr3C,MAAOzG,EAAO8kK,UACd35I,SAAU,SAAA1kB,GAAK,OAAIqgG,EAAc0xK,EAAa,aAAc/xQ,IAC5Dw/F,KAAM,IACNzhG,SAAU+xG,EACVzxG,SAAS,mBACT4xQ,YAAaK,SAGrB,eAAC/a,IAAD,WACI,eAACJ,IAAD,WACI,sBAAM75P,YAAU,mBAAhB,8CACA,cAACk6P,IAAD,UACI,cAAChqM,IAAA,EAAD,CACI92D,KAAM,eAAC+gQ,IAAD,WACF,cAACC,IAAD,kBACA,cAACC,IAAD,kGACA,cAACD,IAAD,mBACA,cAACC,IAAD,yLAEJlqM,eAAe,EACfptD,SAAS,4BAIrB,cAAC,IAAD,CACIwO,IAAK,EACLwqC,IAAK,EACLr3C,MAAOzG,EAAOm4Q,WACdhtP,SAAU,SAAA1kB,GAAK,OAAIqgG,EAAc0xK,EAAa,cAAe/xQ,IAC7Dw/F,KAAM,IACNzhG,SAAU+xG,EACVzxG,SAAS,oBACT4xQ,YAAaM,SAGrB,eAAC3a,IAAD,WACI,cAACT,IAAD,CAAW75P,YAAU,oBAArB,yBACA,cAAC,IAAD,CACIjN,SAAUkL,EACV8qD,aAAcwtN,EACd/hK,WAAYA,EACZzxG,SAAS,oBACT+yQ,SAAUa,WChDfE,I,YAAAA,IAzEf,YAU+B,IAT3BhkR,EAS0B,EAT1BA,KACAikR,EAQ0B,EAR1BA,OACAC,EAO0B,EAP1BA,kBACAC,EAM0B,EAN1BA,iBACAT,EAK0B,EAL1BA,kBACAt4Q,EAI0B,EAJ1BA,OACAu2G,EAG0B,EAH1BA,WACAzP,EAE0B,EAF1BA,cACA4xK,EAC0B,EAD1BA,eAEMH,GAAYhiK,IACVv2G,EAAOm4Q,aAAeW,GACnB94Q,EAAO8kK,YAAci0G,GAC1BC,EAA0B,aAATpkR,EAAsBm+K,GAA4BC,GAEnEqlG,EAAax5P,mBAAQ,WACvB,OAAOg6P,EACFh3Q,KAAI,SAAA4jK,GACD,MAAO,CACHpxK,KAAMoxK,EAAMpxK,MAAQoxK,EAAMwzG,WAAaD,EAAiB,aAAe,IACvEvyQ,MAAOg/J,EAAMwzG,aAGpBvlR,MAAK,SAACwlR,EAAOC,GACV,OAAID,EAAMzyQ,QAAUuyQ,GACR,EAERG,EAAM1yQ,QAAUuyQ,GAGbE,EAAM7kR,MAAQ8kR,EAAM9kR,KAFhB,GAE4B,OAEhD,CAAC2kR,EAAgBH,IAQdL,EAAe5nR,uBACjB,SAACyD,GAAD,gBAAqBO,EAArB,YAA6BP,KAC7B,CAACO,IAQCwkR,EAAcxoR,uBAAY,WACvB2nR,IACLzxK,EAAc0xK,EAAa,aAAcO,GACzCjyK,EAAc0xK,EAAa,cAAeM,MAC3C,CAACP,EAAUO,EAAmBC,EAAkBP,EAAc1xK,IAEjE,OACI,cAAC,IAAD,CACIlyG,KAAMA,EACNyjR,WAAYA,EACZr4Q,OAAQA,EACRs4Q,kBAAmBA,EACnB/hK,WAAYA,EACZgiK,SAAUA,EACVC,aAAcA,EACd1xK,cAAeA,EACf2xK,QAASW,EACTV,eAAgBA,KCvEfW,IAAiBz4Q,YAAOskG,KAAPtkG,CAAH,gKAOd04Q,IAAgB14Q,IAAOC,IAAV,sFAEX,SAAAC,GAAK,OAAIA,EAAMkvB,WAGjBupP,IAAuB34Q,IAAOC,IAAV,gKAKlB,SAAAC,GAAK,OAAIA,EAAMkvB,WCuCfwpP,QArDf,WACI,OACI,qCACI,cAACH,IAAD,CACIh6Q,MAAO,GACPkF,MAAO,CAAEw9C,UAAW,MAAOhU,aAAc,SAE7C,cAACurO,IAAD,CAAetpP,QAAQ,sBAAvB,SACI,cAACqpP,IAAD,CAAgBh6Q,MAAO,QAE3B,eAACk6Q,IAAD,CAAsBvpP,QAAQ,aAA9B,UACI,cAACqpP,IAAD,CAAgBh6Q,MAAO,MACvB,cAACg6Q,IAAD,CAAgBh6Q,MAAO,QAE3B,cAACg6Q,IAAD,CACIh6Q,MAAO,GACPkF,MAAO,CAAEw9C,UAAW,UAExB,cAACs3N,IAAD,CACIh6Q,MAAO,IACPkF,MAAO,CAAEw9C,UAAW,UAExB,cAACs3N,IAAD,CACIh6Q,MAAO,IACPkF,MAAO,CAAEw9C,UAAW,UAExB,cAACs3N,IAAD,CACIh6Q,MAAO,IACPkF,MAAO,CAAEw9C,UAAW,UAExB,cAACs3N,IAAD,CACIh6Q,MAAO,GACPkF,MAAO,CAAEw9C,UAAW,OAAQhU,aAAc,SAE9C,eAACurO,IAAD,CAAetpP,QAAQ,sBAAvB,UACI,cAACqpP,IAAD,CAAgBh6Q,MAAO,MACvB,cAACg6Q,IAAD,CACIh6Q,MAAO,IACPkF,MAAO,CAAEw9C,UAAW,UAExB,cAACs3N,IAAD,CACIh6Q,MAAO,IACPkF,MAAO,CAAEw9C,UAAW,UAExB,eAACw3N,IAAD,CAAsBvpP,QAAQ,aAA9B,UACI,cAACqpP,IAAD,CAAgBh6Q,MAAO,KACvB,cAACg6Q,IAAD,CAAgBh6Q,MAAO,eCwD5Bo6Q,QArFf,YAU2B,IATvBl6K,EASsB,EATtBA,QACA3qG,EAQsB,EARtBA,KACAikR,EAOsB,EAPtBA,OACAa,EAMsB,EANtBA,kBACAC,EAKsB,EALtBA,UACArxQ,EAIsB,EAJtBA,UACAsxQ,EAGsB,EAHtBA,aACAlB,EAEsB,EAFtBA,eACAz4K,EACsB,EADtBA,SAEA,OACI,cAAC,IAAD,CACIhhG,IAAKsgG,EACLQ,cAAe25K,EACfz5K,SAAUA,EAHd,SAKK,YAA8D,IAA3DjgG,EAA0D,EAA1DA,OAAQ8vM,EAAkD,EAAlDA,MAAOC,EAA2C,EAA3CA,QAAS5vG,EAAkC,EAAlCA,aAAc2G,EAAoB,EAApBA,cACtC,OACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAW/kG,YAAU,aAArB,kBACA,cAAC,GAAD,CACI+Q,MAAOyjQ,IACP9vQ,MAAO7R,EACP0K,OAAQ,GACR6rB,SAAU,SAAClF,GAAD,OAAsC2zP,EAAa3zP,EAAEgwB,OAAOxvC,QACtEvH,UAAU,iBACVsF,UAAWm1Q,GAAax5K,EACxBr7F,SAAS,qBAGhBwD,GAAa,cAAC,IAAD,KACZA,GACE,qCACI,qBAAK/D,MAAO,CAAEm+F,QAAkB,aAAT9tG,EAAsB,QAAU,QAAvD,SACI,cAAC,IAAD,CACIA,KAAMA,EACNikR,OAAQA,EACRC,kBxpB7DK,IwpB8DLC,iBxpB/DI,GwpBgEJT,kBb9DA,wMa+DAt4Q,OAAQA,EAAOkzK,SACf38D,YAAaojK,GAAax5K,EAC1B2G,cAAeA,EACf4xK,eAAgBA,MAGxB,qBAAKn0Q,MAAO,CAAEm+F,QAAkB,mBAAT9tG,EAA4B,QAAU,QAA7D,SACI,cAAC,IAAD,CACIA,KAAMA,EACNikR,OAAQA,EACRC,kBxpBtEA,IwpBuEAC,iBxpBxED,GwpByECT,kBb1EL,2Oa2EKt4Q,OAAQA,EAAOmzK,eACf58D,YAAaojK,GAAax5K,EAC1B2G,cAAeA,EACf4xK,eAAgBA,YAMpC,cAAC,IAAD,UACI,cAAC,IAAD,CACIr5Q,MAAM,QACNC,OAAO,OACPkF,UAAWsrM,IAAUC,GAAW5vG,EAChCt7F,aAAa,QACbD,YAAa,GACbD,QAASw7F,EACTr7F,SAAS,eAPb,4BCkBb+0Q,QA9Ff,YAAyD,IAAjC1lR,EAAgC,EAAhCA,UAAgC,EAC5B4vB,mBAA4B,YADA,mBAC7CnvB,EAD6C,KACvCklR,EADuC,OAExB/1P,mBAAsB,IAFE,mBAE7C80P,EAF6C,KAErCkB,EAFqC,OAGXhnH,KAA3B/2H,EAHsC,EAG5CjpC,KAAqB4R,EAHuB,EAGvBA,QACvB4/K,EAAoBtkE,KAJ0B,EAKDl8F,oBAAS,GALR,mBAK9Ci2P,EAL8C,KAK1BC,EAL0B,KAM9C16K,EAAUx5E,iBAAY,MACtBrT,EAAcnQ,cACd23Q,EAA6BrlR,eAE7B6kR,EAAoB76P,mBAAQ,WAC9B,IAAMm2J,EAAoB/B,GAAiCj3I,GAC3D,MAAO,CACHk3I,SAAU,CACNzN,MAAOuP,EAAkB9B,SAASnO,QAClCD,UAAWkQ,EAAkB9B,SAASpO,UACtCqzG,WAAYnjG,EAAkB9B,SAASlO,iBAE3CmO,eAAgB,CACZ1N,MAAOuP,EAAkB7B,eAAepO,QACxCD,UAAWkQ,EAAkB7B,eAAerO,UAC5CqzG,WAAYnjG,EAAkB7B,eAAenO,oBAGtD,CAAChpI,IAEE0+L,EAAmB9pO,uBAAY,SAACgE,GAClCklR,EAAQllR,KACT,IAQG6qG,EAAe7uG,uBAAY,SAACoP,GAC9B,IAAMjN,EAA+B,CAAC,CAClCoB,YACAS,KAAM,WACNmwK,QAAS/kK,EAAOkzK,SAASzN,MACzBX,UAAW9kK,EAAOkzK,SAASpO,UAC3BE,gBAAiBhlK,EAAOkzK,SAASilG,WACjC5zQ,MAAO,GACR,CACCpQ,YACAS,KAAM,iBACNmwK,QAAS/kK,EAAOmzK,eAAe1N,MAC/BX,UAAW9kK,EAAOmzK,eAAerO,UACjCE,gBAAiBhlK,EAAOmzK,eAAeglG,WACvC5zQ,MAAO,IAEX,OAAO21Q,EAA2BnnR,GAC7Bm5B,MAAK,WACFqzE,EAAQ5uE,QAAQqkP,UAAUh1Q,GAC1Bu/F,EAAQ5uE,QAAQywE,eAAc,MAEjCh1E,OAAM,SAACnG,GACJvT,EAAYuT,EAAEzkB,QAAS,SACvB+9F,EAAQ5uE,QAAQywE,eAAc,QAEvC,CAACjtG,EAAW+lR,EAA4BxnQ,IAkB3C,OAhBAwR,qBAAU,WACNqgK,EAAkBpwL,GAClBixK,KACKl5I,MAAK,SAAAgT,GACF66O,EAAU76O,EAAS25O,WAEtBzsP,OAAM,SAAAnG,GACHvT,EAAY,uBAAwB,cAG7C,IAEHwR,qBAAU,WACNq7E,EAAQ5uE,QAAQqkP,UAAU0E,KAC3B,CAACA,IAGA,cAAC,IAAD,CACIn6K,QAASA,EACT3qG,KAAMA,EACNikR,OAAQA,EACRa,kBAAmBA,EACnBC,WAAYK,EACZ1xQ,UAAW3D,EACXi1Q,aAAcl/C,EACdg+C,eAAgBuB,EAChBh6K,SAAUR,KCiCP06K,QAhHf,YAK8B,IAJ1B9+O,EAIyB,EAJzBA,QACAzK,EAGyB,EAHzBA,QACAojP,EAEyB,EAFzBA,gBACAoG,EACyB,EADzBA,2BAEMC,KAAmB,OAACh/O,QAAD,IAACA,OAAD,EAACA,EAASh7B,IAEnC,OACI,cAAC,GAAD,CACIszJ,aACI,eAAC,IAAD,WACI,sBAAM5xJ,YAAU,+BAAhB,8BACCs4Q,GACG,eAAC3b,IAAD,4BAEI,sBAAM38P,YAAU,2BAAhB,SAA4Cs5B,EAAShnC,aAKrEu8B,QAASA,EACTvxB,MAAO,IACPyF,SAAS,yBAdb,SAgBI,eAAC,IAAD,WACI,eAAC,IAAD,WACI,eAAC,IAAD,CACIuoC,GAAI+sO,EAA2BjwR,IAAOyB,iBAAiBC,MACvD0pH,gBAAiB,YACjB6b,OAAK,EACLrvH,YAAU,cAJd,UAMI,cAAC,IAAD,UAAgB,cAAC,IAAD,MANpB,aASA,eAAC,IAAD,CACIsrC,GAAI+sO,EAA2BjwR,IAAOyB,iBAAiBE,MACvDypH,gBAAiB,YACjBxzG,YAAU,WAHd,UAKI,cAAC,IAAD,UAAgB,cAAC,IAAD,MALpB,UAQA,eAAC,IAAD,CACIsrC,GAAI+sO,EAA2BjwR,IAAOyB,iBAAiBG,YACvDwpH,gBAAiB,YACjBxzG,YAAU,qBAHd,UAKI,cAAC,IAAD,UAAgB,cAAC,IAAD,MALpB,oBAQA,eAAC,IAAD,CACIsrC,GAAI+sO,EAA2BjwR,IAAOyB,iBAAiBI,OACvDupH,gBAAiB,YACjBxzG,YAAU,YAHd,UAKI,cAAC,IAAD,UAAgB,cAAC,IAAD,MALpB,iBASJ,cAAC,IAAD,UACI,eAAC,IAAD,WACI,cAAC,GAAD,CACIzR,KAAMnG,IAAOyB,iBAAiBC,KAC9BulI,OAAK,EAFT,SAIKipJ,GACG,cAAC,IAAD,CACIh/O,QAASA,EACT24O,gBAAiBA,MAI7B,cAAC,GAAD,CACI1jR,KAAMnG,IAAOyB,iBAAiBE,KAC9BslI,OAAK,EAFT,SAIKipJ,GACG,cAAC,IAAD,CACIh/O,QAASA,EACT24O,gBAAiBA,MAI7B,cAAC,GAAD,CACI1jR,KAAMnG,IAAOyB,iBAAiBG,WAC9BqlI,OAAK,EAFT,SAIKipJ,GACG,cAAC,IAAD,CACIh/O,QAASA,MAIrB,cAAC,GAAD,CACI/qC,KAAMnG,IAAOyB,iBAAiBI,MAC9BolI,OAAK,EAFT,SAIKipJ,GACG,cAAC,IAAD,CACIlmR,UAAWknC,EAASh7B,kBCrEzCi6Q,I,IAAAA,IA9Cf,YAG0B,IAAD,MAFrBloH,EAEqB,EAFrBA,eACAD,EACqB,EADrBA,UAEM92H,EAAUnhB,YAAYkhB,MACtB5yB,EAAU0R,YAAY3R,MACtB85G,EAAatC,KACbvnG,EAAUW,cACVF,EAAY,oBAAGT,EAAQE,SAAShW,aAApB,aAAG,EAAwBuW,oBAA3B,kBAA2CT,EAAQE,SAAShW,aAA5D,aAA2C,EAAwBsW,WAE/ElW,EAAclS,uBAAY,WACxBwhK,GAAkBn5I,EAClBT,EAAQjoB,QAAQ0oB,EAAagkC,UAE7BzkC,EAAQjoB,QAAQ4hK,KAErB,CAACC,EAAgBD,EAAW35I,EAASS,IAElCmhQ,EAA6BxpR,uBAAY,SAAC2tE,GAC5C,MAAO,CACHthB,SAAUshB,EACV77D,MAAO,CAAEsW,WAAYC,MAE1B,CAACA,IAEEshQ,EAAc3pR,uBAChB,kBAAMyxH,EAAW75G,EAASrU,aAC1B,CAACkuH,EAAY75G,IASjB,OANA0b,qBAAU,YACN,OAAI1b,QAAJ,IAAIA,OAAJ,EAAIA,EAASrU,YACTomR,MAEL,CAACl4J,EAAYk4J,EAAb,OAA0B/xQ,QAA1B,IAA0BA,OAA1B,EAA0BA,EAASrU,YAGlC,cAAC,IAAD,CACIknC,QAASA,EACT24O,gBAAiBuG,EACjB3pP,QAAS9tB,EACTs3Q,2BAA4BA,KChD3BI,IAA0D,CACnE,CACIxL,WAAY,yBAEhB,CACIA,WAAY,UAEhB,CACIA,WAAY,SCRPnL,IAAYjjQ,IAAOC,IAAV,wFCsCP45Q,QAjCf,YAEiC,IAD7BhL,EAC4B,EAD5BA,eAAgBD,EACY,EADZA,iBAAkBE,EACN,EADMA,iBAAkB7N,EACxB,EADwBA,iBAEpD,OACI,cAAC,GAAD,CACI98P,MAAM,UACNmlH,SAAS,uBACTuC,UACI,cAAC,IAAD,CAAW1qH,YAAU,wCAArB,uEAIJmtH,cAAc,oBACdxC,UAAWviI,IAAOmF,QAAQC,gBAC1B+3H,cAAc,SACduH,gBAAgB,QAChB7B,eAAe,IACfE,cAAc,EACd0B,aAAa,EACb9pH,SAAS,uBAfb,SAiBI,cAAC,IAAD,CACIyqQ,cAAeiL,IACf/K,eAAgBA,EAChBD,iBAAkBA,EAClBE,iBAAkBA,EAClB7N,iBAAkBA,EAClBoN,aAAa,aCd7B,SAASyL,MAAgC,IAAD,EACuBtZ,MAAnDW,EAD4B,EAC5BA,aAAcF,EADc,EACdA,iBAAkBQ,EADJ,EACIA,eADJ,EAEWC,MAAvCC,EAF4B,EAE5BA,YAAaI,EAFe,EAEfA,sBACbuF,EAAoBC,MAApBD,gBACSiJ,EAAmBh1J,KAA5Bx3G,QACSysQ,EAAoBt9P,eAA7BnP,QACU6E,EAAmB+hB,eAA7BtW,SACA04P,EAAcD,MAAdC,UACF0D,EAA2B5I,MAC3BD,EAA6BF,MAC7BgJ,EAAoBR,MACpBiB,EAAuBhE,MACvBkD,EAAsBD,MACtBx4P,EAAUW,cAEVo9F,IAAc,OAAC2xJ,QAAD,IAACA,OAAD,EAACA,EAAiB30P,UAAW/J,EAAe+J,WAC9C,OAATo6P,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,SAAX,OAAoB2kL,QAApB,IAAoBA,OAApB,EAAoBA,EAAW1kL,MAElCsoL,EAAqB3gR,uBAAY,WACnCygR,IACAC,IACAS,IACAv5P,EAAQjoB,QAAQpG,IAAOmF,QAAQM,wBAChC,CAAC0hR,EAAmBD,EAA0BU,EAAsBv5P,IAEjEk3P,EAA8C7wP,mBAAQ,WACxD,OAAIgjP,EACO,UAGPsP,GAAkBC,GAAmBrP,EAC9B,UAGPxrJ,EACO,WAGNgsJ,EAIE,UAHI,WAIZ,CAACV,EAAkBsP,EAAgBC,EAAiBrP,EAAcxrJ,EAAYgsJ,IAE3EiP,EAAkB5gR,uBAAY,WAChC,IAAI2lH,EACJ,MAAO,CACHn9E,MAAK,OAAE8uO,QAAF,IAAEA,IAAmB,GAC1B91Q,QAAsB,OAAdoX,QAAc,IAAdA,OAAA,EAAAA,EAAgB+J,QACV/J,EAAeuK,QAAO,SAAA1T,GAAE,OAAIA,EAAK,KACjCmJ,EACdkhO,WAAoB,OAATijC,QAAS,IAATA,OAAA,EAAAA,EAAW3kL,QAASrnE,KAAM,IAAIZ,KAAJ,OAAS4sP,QAAT,IAASA,OAAT,EAASA,EAAW3kL,QAAQjmE,OAAOohB,KACxEymM,SAAkB,OAAT+iC,QAAS,IAATA,OAAA,EAAAA,EAAW1kL,MAAOtnE,KAAM,IAAIZ,KAAJ,OAAS4sP,QAAT,IAASA,OAAT,EAASA,EAAW1kL,MAAMlmE,OAAOohB,QAEvE,CAAC36B,EAAgB0+P,EAAiByF,EAAWp3J,IAE1Ck7J,EAAuB7gR,uBAAY,WACrC,IAAMT,EAASqhR,IACXrhR,GACAkyQ,EAAelJ,IAAWyB,cAAezqQ,KAE9C,CAACkyQ,EAAgBmP,IAuBpB,OArBAttP,qBAAU,WACN,OAAO,WACHmtP,IACAC,IACAS,OAGL,IAEH7tP,qBAAU,WACN,IAAM/zB,EAASqhR,IACXrhR,GACAwyQ,EAAsBxJ,IAAWyB,cAAezqQ,KAErD,CAACwyQ,EAAuB6O,IAE3BttP,qBAAU,WACNskP,EAA2BzG,GAC3BkP,EAAoBlP,KACrB,CAACkP,EAAqBzI,EAA4BzG,IAGjD,cAAC,IAAD,CACI0N,eAAgB8B,EAChB/B,iBAAkBiC,EAClB/B,iBAAkBA,EAClB7N,iBAAkBA,IAaf8Y,I,YAAAA,IARf,WACI,OACI,cAAC,KAAkB9rM,SAAnB,CAA4BpoE,MAAO,CAAEwL,YAAa,gBAAlD,SACI,cAACyoQ,IAAD,OClGGE,IAjBc57Q,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACZ,oBAAGkwD,YAAU,mBAAmBlwD,KAAK,UAArC,UACI,sBAAME,EAAE,mTACR,sBAAMA,EAAE,sOACR,sBAAMA,EAAE,kPAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCOjB06Q,IAjBoB77Q,sBAC/B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACR,oBAAGkwD,YAAU,mBAAmBlwD,KAAK,UAArC,UACI,sBAAME,EAAE,iTACR,sBAAMA,EAAE,sOACR,sBAAMA,EAAE,mPAEZ,+BACI,0BAAUE,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCMrB26Q,IAhBY97Q,sBACvB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACR,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,gbAAgbF,KAAK,cAEjc,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCOjB46Q,IAhBkB/7Q,sBAC7B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OACI,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACR,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,gbAAgbF,KAAK,cAEjc,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCMjB66Q,IAfah8Q,sBACxB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACZ,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,ylBAAylBF,KAAK,cAE1mB,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCOjB86Q,IAfmBj8Q,sBAC9B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACR,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,ylBAAylBF,KAAK,cAE1mB,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCOrB+6Q,IAfcl8Q,sBACzB,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACZ,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,kcAAkc0zB,OAAO,UAAU+wE,eAAa,MAAMC,oBAAkB,SAEpgB,+BACI,0BAAUxkG,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCOjBg7Q,IAfoBn8Q,sBAC/B,WAAgBC,GAAS,IAAtBC,EAAqB,EAArBA,UACC,OAAQ,sBAAKA,UAAWA,EAAWK,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAA9G,UACR,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMhwD,EAAE,kcAAkc0zB,OAAO,UAAU+wE,eAAa,MAAMC,oBAAkB,SAEpgB,+BACI,0BAAUxkG,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BCXvBi7Q,IAAmB,CAAC,CAC7B/mR,KAAM,iBACNoS,MAAO,QACT,CACEpS,KAAM,uOACNoS,MAAO,uBACR,CACCpS,KAAM,wQACNoS,MAAO,0BACR,CACCpS,KAAM,iRACNoS,MAAO,gBACR,CACCpS,KAAM,2PACNoS,MAAO,iBACR,CACCpS,KAAM,uSACNoS,MAAO,qBCfE0gB,IAAYvmB,IAAOC,IAAV,4nCAgDTq0B,IAAQt0B,IAAOC,IAAV,+JAQL6wD,IAAiB9wD,IAAOC,IAAV,oDCFZw6Q,I,gCCtDAA,IDQf,YAAqH,IAAD,IAA3Ft2Q,EAA2F,EAA3FA,MAAOu2Q,EAAoF,EAApFA,QAASnwP,EAA2E,EAA3EA,SAAU1kB,EAAiE,EAAjEA,MAAO3B,EAA0D,EAA1DA,SAAUsvL,EAAgD,EAAhDA,WAAYmnF,EAAoC,EAApCA,aACtEpc,EAAyBf,MAE/B,OAAO,eAAC,IAAD,WACH,cAAC,IAAD,UACI,eAAC,IAAD,CAAgBr8P,YAAA,UAAc+C,EAAd,UAAhB,UACKC,EACD,cAACk3P,IAAD,UACI,cAAChqM,IAAA,EAAD,CACIqL,SAAS,MACTjiE,OAAQ,kBAAM8jQ,EAAuB,GAAD,OAAIoc,EAAJ,WACpCpgR,KAAM,cAAC+gQ,IAAD,UACF,cAACE,IAAD,UAAiBkf,MAErBppN,eAAe,EACfptD,SAAQ,UAAKA,EAAL,qBAKtBsvL,EAGE,cAAC,IAAD,CACIr0F,cAAe,CAAE96D,OAAQ,IACzBg7D,SAAU,aAFd,SAII,cAAC,IAAD,CACIntF,MAAOsoQ,IACP30Q,MAAOA,EACP0pF,UAAWuiL,IACXvnP,SAAU,SAAClF,GAAD,OAAsCkF,EAASlF,EAAEgwB,OAAOxvC,QAClEnH,OAAQ,GACRmC,QAAQ,WACRpN,KAAM,SACN6K,UAAU,sBACV4F,SAAQ,UAAKA,EAAL,aACRy9D,aAAa,MACbkwH,eAAgB,SAACz+K,GAAD,OAA2C,sBAAK9U,UAAU,YAAf,UAA2B,4BAAmB,SAAf8U,EAAKvN,MAAmBuN,EAAKvN,MAAQ,IAAMuN,EAAK3f,OAA/E,IAAyG,SAAf2f,EAAKvN,OAAoBuN,EAAK3f,aAjB3L,sBAAK6K,UAAU,YAAY6C,YAAW+C,EAAW,QAAjD,UAA0D,4BAAc,SAAV2B,EAAmBA,EAAQ,IAA3B,UAAiC20Q,IAAiBj8O,MAAK,SAACnrB,GAAD,OAAUvN,IAAUuN,EAAKvN,gBAAhF,aAAiC,EAAuDpS,OAAtJ,IAA2K,SAAVoS,IAAA,UAAoB20Q,IAAiBj8O,MAAK,SAACnrB,GAAD,OAAUvN,IAAUuN,EAAKvN,gBAAnE,aAAoB,EAAuDpS,aE7B3O8yB,IAAYvmB,IAAOC,IAAV,wtBAOM,SAAAC,GAAK,OAAIA,EAAMo2Q,UAAY,mBAAqB,sBAwB/DhiP,IAAQt0B,IAAOC,IAAV,+JAQL6wD,IAAiB9wD,IAAOC,IAAV,4DAId26Q,IAAe56Q,IAAO0nB,KAAV,6DAIZmzP,IAAoB76Q,IAAOC,IAAV,sDAIjB66Q,IAAkB96Q,IAAOC,IAAV,sLAGtB,SAAAC,GAAK,OAAIA,EAAMy1G,YAAc,2BAQtBolK,IAAgB/6Q,IAAOC,IAAV,kMAOb,SAAAC,GAAK,OAAKA,EAAMkjC,QAAgC,mBAAtB,uBAG1BszN,IAAc12P,IAAO0nB,KAAV,sFCETszP,QApEf,YAA0L,IAAhK72Q,EAA+J,EAA/JA,MAAO8lD,EAAwJ,EAAxJA,YAAagxN,EAA2I,EAA3IA,WAAYC,EAA+H,EAA/HA,UAAWR,EAAoH,EAApHA,QAASnwP,EAA2G,EAA3GA,SAAU1kB,EAAiG,EAAjGA,MAAOkmD,EAA0F,EAA1FA,UAAW7nD,EAA+E,EAA/EA,SAAUsvL,EAAqE,EAArEA,WAAYxtH,EAAyD,EAAzDA,QAAS2vC,EAAgD,EAAhDA,WAAYglK,EAAoC,EAApCA,aAAoC,EACnJx3P,oBAAS,GAD0I,mBAC9KmzP,EAD8K,KACnKK,EADmK,OAE/IxzP,mBAAS,IAFsI,mBAE9Kg4P,EAF8K,KAEjKC,EAFiK,KAG/K7c,EAAyBf,MAO/B,OAJAl6O,qBAAU,WACN83P,EAAeF,EAAY,iCAA+B,MAC3D,CAACA,IAEG,eAAC,IAAD,CAAW5E,UAAWA,EAAtB,UACH,cAAC,IAAD,UACI,eAAC,IAAD,CAAgBn1Q,YAAA,UAAc+C,EAAd,UAAhB,UACI,iCAAOC,EACN82Q,GACG,cAACL,IAAD,CAAcz5Q,YAAA,UAAc+C,EAAd,aAAd,4BAGJ,cAACm3P,IAAD,UACI,cAAChqM,IAAA,EAAD,CACI52D,OAAQ,kBAAM8jQ,EAAuB,GAAD,OAAIoc,EAAJ,WACpCpgR,KAAM,cAAC+gQ,IAAD,UACF,cAACE,IAAD,UAAiBkf,MAErBppN,eAAe,EACfptD,SAAQ,UAAKA,EAAL,qBAKtBsvL,EAAsK,cAACsnF,IAAD,CAAiBnlK,WAAYA,EAA7B,SACpK,cAACklK,IAAD,UACI,cAAC90M,GAAA,EAAD,CACI7oB,IA7BJ,IA8BIgpB,QAAS,GACTj5B,UAAU,QACVgd,YAAaA,EACbpkD,MAAOA,EACPvH,UAAS,2BAAwB68Q,EAAc,UAAY,IAC3D5wP,SAAU,SAAAlF,GACiB,KAAnBA,EAAEgwB,OAAOxvC,OApCrB,MAoCqCwf,EAAEgwB,OAAOxvC,MAAM8M,QACxCsoQ,GAAiC,KAAnB51P,EAAEgwB,OAAOxvC,OAAgBu1Q,EAAe,kCArClE,MAsCY/1P,EAAEgwB,OAAOxvC,MAAM8M,QAAkByoQ,EAAe,4BAEhDA,EAAe,IAGnB7wP,EAASlF,EAAEgwB,OAAOxvC,QAEtBogE,OAAQ,kBAAM0wM,GAAa,IAC3B3wM,QAAS,SAAC3gD,GACF,IAAIgyP,EAAMhyP,EAAEgwB,OAAOxvC,MACnBwf,EAAEgwB,OAAOxvC,MAAQ,GACjBwf,EAAEgwB,OAAOxvC,MAAQwxQ,EACV,OAAPrxM,QAAO,IAAPA,KAAU3gD,GACVsxP,GAAa,IAErBzyQ,SAAQ,UAAKA,EAAL,YACR6nD,UAAWA,EACX+Z,gBAAgB,OAEhBK,mBAAsBg1M,EAAc,eAAC,IAAD,sBAAiBA,EAAjB,YAA+CpqR,GAD/E,sBA9BD,cAACgqR,IAAD,CAAe33O,SAAUv9B,EAAO1E,YAAW+C,EAAW,QAAtD,SAAgE2B,GAAgB,4DCHxFw1Q,QA7Bf,YAA+G,IAAnFv1P,EAAkF,EAAlFA,aAAcw1P,EAAoE,EAApEA,aAAc9nF,EAAsD,EAAtDA,WAAYznI,EAA0C,EAA1CA,UAAW4uN,EAA+B,EAA/BA,aAC3E,OAAO,qCACH,cAAC,IAAD,CAAgBx2Q,MAAM,+EACrBu2Q,QAAQ,yRACLO,YAAY,EACZznF,WAAYA,EACZvpI,YAAY,iZACZ1/B,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,eAAgBuxP,IAChDxxQ,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcC,aAAcxvN,UAAWA,EAC9C4uN,aAAY,UAAKA,EAAL,SACZz2Q,SAAS,kBACb,cAAC,IAAD,CAAgBC,MAAM,gFAClBu2Q,QAAQ,6MACRO,YAAY,EACZznF,WAAYA,EACZmnF,aAAY,UAAKA,EAAL,YACZ1wN,YAAY,kaACZ1/B,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,mBAAoBuxP,IAAMxxQ,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcE,iBAAkBt3Q,SAAS,YAC9G,cAAC,IAAD,CAAeC,MAAM,6BACjBu2Q,QAAQ,0PACRnwP,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,cAAeuxP,IAC/CxxQ,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcG,YACrBv3Q,SAAS,eACTy2Q,aAAY,UAAKA,EAAL,WACZnnF,WAAYA,QCnBTkoF,QARf,YAAiI,IAAvG51P,EAAsG,EAAtGA,aAAcw1P,EAAwF,EAAxFA,aAAcK,EAA0E,EAA1EA,mBAAoBnoF,EAAsD,EAAtDA,WAAYznI,EAA0C,EAA1CA,UAAW4uN,EAA+B,EAA/BA,aAC7F,OAAO,cAAC,IAAD,CAAgBx2Q,MAAM,2FAA2Fu2Q,QAAQ,6HAA6HO,YAAY,EAAMznF,WAAYA,EACvR0nF,UAAS,OAAES,QAAF,IAAEA,OAAF,EAAEA,EAAoBjqQ,SAAS,WACxCipQ,aAAY,UAAKA,EAAL,YACZ1wN,YAAY,wVACZ1/B,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,UAAWuxP,IAAMxxQ,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcM,QAAS7vN,UAAWA,EAAW7nD,SAAS,aCQvG23Q,QAbf,YAAkI,IAAvG/1P,EAAsG,EAAtGA,aAAcw1P,EAAwF,EAAxFA,aAAc9nF,EAA0E,EAA1EA,WAAYmoF,EAA8D,EAA9DA,mBAAoB5vN,EAA0C,EAA1CA,UAAW4uN,EAA+B,EAA/BA,aAC9F,OAAO,cAAC,IAAD,CAAgBx2Q,MAAM,sDAAsDu2Q,QAAQ,iMACnFO,YAAY,EACZznF,WAAYA,EACZmnF,aAAY,UAAKA,EAAL,aACZ1wN,YAAY,qWACZ1/B,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,WAAYuxP,IAC5C6D,UAAS,OAAES,QAAF,IAAEA,OAAF,EAAEA,EAAoBjqQ,SAAS,YACxC7L,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcQ,SAAU/vN,UAAWA,EAAW7nD,SAAS,cCE3D63Q,I,4BAAAA,IAVf,YAAmI,IAAvGj2P,EAAsG,EAAtGA,aAAcw1P,EAAwF,EAAxFA,aAAc9nF,EAA0E,EAA1EA,WAAYmoF,EAA8D,EAA9DA,mBAAoB5vN,EAA0C,EAA1CA,UAAW4uN,EAA+B,EAA/BA,aAC/F,OAAO,cAAC,IAAD,CAAgBx2Q,MAAM,mDAAmDu2Q,QAAQ,sPACpFO,YAAY,EACZznF,WAAYA,EACZmnF,aAAY,UAAKA,EAAL,cACZO,UAAS,OAAES,QAAF,IAAEA,OAAF,EAAEA,EAAoBjqQ,SAAS,aACxCu4C,YAAY,wUACZ1/B,SAAU,SAAC8sP,GAAD,OAASvxP,EAAa,YAAauxP,IAAMxxQ,MAAK,OAAEy1Q,QAAF,IAAEA,OAAF,EAAEA,EAAcU,UAAWjwN,UAAWA,EAAW7nD,SAAS,eCI7G+3Q,IAKP,CACE,CACI1hR,KAAM,YACNsJ,KAAMy2Q,IACN4B,WAAY3B,IACZ9mR,KAAM,aAEV,CACI8G,KAAM,WACNsJ,KAAMu2Q,IACN8B,WAAY7B,IACZ5mR,KAAM,YAEV,CACI8G,KAAM,UACNsJ,KAAMq2Q,IACNgC,WAAY/B,IACZ1mR,KAAM,WAEV,CACI8G,KAAM,WACNsJ,KAAMm2Q,IACNkC,WAAYjC,IACZxmR,KAAM,cAIL0oR,IAAkB,CAC3B,UAAaJ,IACb,SAAYF,IACZ,QAAWH,IACX,UAAaL,KAGJe,IAAsB,CAC/Bj4Q,MAAO,WACPs3Q,YAAa,OACb,UAAa,GACb,SAAY,GACZ,QAAW,GACX,aAAgB,GAChB,iBAAoB,IAIXY,IAAY,CACrB,YAAe,SACf,UAAa,YACb,SAAY,WACZ,QAAW,UACX,aAAgB,OAChB,iBAAoB,WAGXC,IAAiD,CAAC,YAAa,WAAY,WCvE3E/sE,IAAevvM,IAAOC,IAAV,sGAMZuvM,IAAexvM,IAAOC,IAAV,+SAWZovH,IAAiBrvH,IAAOC,IAAV,0oBAOd,SAAAC,GAAK,OAAIA,EAAMs0G,SAAW,uBAA0B,sBA6B3D,SAAAt0G,GAAK,OAAIA,EAAMs0G,UAAN,sVAoBFi7F,IAAiBzvM,IAAOC,IAAV,gIAOdyvM,IAAa1vM,IAAOC,IAAV,yLASVq0B,IAAQt0B,IAAOC,IAAV,sDAILu0C,IAASx0C,IAAOC,IAAV,+SC+EJs8Q,I,oNC5KAA,IDWf,YAGyB,IAAD,MAFpB/qH,EAEoB,EAFpBA,eACAD,EACoB,EADpBA,UACoB,EACgBpuI,mBAA6B,aAD7C,mBACbq5P,EADa,KACDC,EADC,OAEoBt5P,mBAAuBi5P,KAF3C,mBAEbd,EAFa,KAECoB,EAFD,OAGgCv5P,qBAHhC,mBAGbw4P,EAHa,KAGOgB,EAHP,KAIdpe,EAAyBf,MACzBgB,EAAY/sO,aAAaC,QAAQ,aAEjC9Z,EAAUW,cACVzG,EAAcnQ,cAEdi7Q,E1tBLH,WACH,IAAM9sR,EAAOC,eACb,OAAOC,uBACH,SAACsrR,GAAD,OACIxrR,EAAKG,KAAL,aAAwBqrR,GAAc,KAC1C,CAACxrR,I0tBAkB+sR,GACjBxkQ,EAAY,oBAAGT,EAAQE,SAAShW,aAApB,aAAG,EAAwBuW,oBAA3B,kBAA2CT,EAAQE,SAAShW,aAA5D,aAA2C,EAAwBsW,WAMrFkL,qBAAU,kBAAMi7O,EAAuB,gCAA+B,IAEtE,IAAMue,EAASzgP,OAAOtrB,KAAKorQ,KACrBj6Q,EAAclS,uBAAY,WACxBwhK,GAAkBn5I,EAClBT,EAAQjoB,QAAQ0oB,EAAagkC,UAE7BzkC,EAAQjoB,QAAQ4hK,GAEpBgtG,EAAuB,iCAExB,CAAC/sG,EAAgBD,EAAW35I,EAASS,IAElC0kQ,EAAc,WAChB,IAAM31D,EAA+B,GAOrC,OANAk1D,IAAsB1mQ,SAAQ,SAACxC,GACvBA,IAASopQ,GAAuC,MAAb,OAAZlB,QAAY,IAAZA,OAAA,EAAAA,EAAeloQ,KACtCg0M,EAAI3vM,KAAKrE,OAIjB,OAAIg0M,QAAJ,IAAIA,OAAJ,EAAIA,EAAKz0M,SACLgqQ,GAAyB,OAAHv1D,QAAG,IAAHA,OAAA,EAAAA,EAAKz0M,QAASy0M,OAAMr2N,IACnC,IAEP4rR,OAAsB5rR,IAEnB,IAGLisR,EAAiB,SAAC33K,GACpB,GAAK03K,IAAL,CAIA,IAAM77Q,EAAQ47Q,EAAOtlQ,QAAQglQ,GAC7BC,EAAcK,EAAO57Q,EAAQmkG,MA8B3BkF,EAAYtsF,mBAAQ,kBAAMk+P,IAAgBK,KAAa,CAACA,IAE9D,OAAQ,cAAC,GAAD,CACJzpH,aACI,cAACJ,GAAD,UACI,cAAC,IAAD,CAAOxxJ,YAAU,8BAAjB,+BAGR6uB,QAAS9tB,EACTzD,MAAO,IACPyF,SAAS,wBARL,SAUJ,eAAC,IAAD,WACI,cAAC,IAAD,UACI,8BACK+3Q,IAAch7Q,KAAI,SAAC08D,GAChB,IAAM62C,EAAWgoK,IAAe7+M,EAAMlqE,KACtC,OAAO,eAAC,IAAD,CACH0N,YAAA,UAAcw8D,EAAMlqE,KAApB,QACA2Q,QAAS,WACA24Q,KAGLN,EAAc9+M,EAAMlqE,OAExB+gH,SAAUA,EARP,UAWH,eAAC,IAAD,WAAgB,cAAC72C,EAAMu+M,WAAP,CAAkB59Q,UAAU,aAAa,cAACq/D,EAAM95D,KAAP,CAAYvF,UAAU,YAC9Eq/D,EAAMpjE,OAHFojE,EAAMlqE,aAQ3B,eAAC,IAAD,WACI,cAAC82G,EAAD,CAAWzkF,aA1GF,SAACoL,EAA4BrrB,GAC9C62Q,EAAgBpB,EAAY,6BAAQA,GAAR,mBAAuBpqP,EAAMrrB,IAA7B,gBAA0CqrB,EAAMrrB,KAyG7By1Q,aAAcA,EAAcvvN,WAAW,EAAMynI,YAAY,EAAMmoF,mBAAoBA,EAAoBhB,aAAc,0BAC5J,eAAC,IAAD,WACoC,IAA/BmC,EAAOtlQ,QAAQglQ,IAAqB,cAAC,IAAD,CACjC/9Q,MAAM,QACNC,OAAO,OACPuF,aAAa,QACbD,YAAa,GACbE,SAAS,kBACTrD,QAAQ,UACR8C,MAAO,CAAE86D,YAAa,QACtBhkE,OAAQ,kBAAMuiR,GAAgB,IARG,sBAYpCF,EAAOtlQ,QAAQglQ,GAAcM,EAAOnqQ,OAAS,GAAK,cAAC,IAAD,CAC/ClU,MAAM,QACNC,OAAO,OACPuF,aAAa,QACbD,YAAa,GACbE,SAAS,cACTzJ,OAAQ,kBAAMuiR,EAAe,IANkB,kBAUlDF,EAAOtlQ,QAAQglQ,KAAgBM,EAAOnqQ,OAAS,GAAK,cAAC,IAAD,CACjDlU,MAAM,QACNC,OAAO,OACPuF,aAAa,QACbD,YAAa,GACbE,SAAS,gBACTzJ,OA5FC,WACjB6gR,GAAgBsB,EAAetB,GAAchwP,MAAK,SAACm+N,GAC/C33O,EAAY,4BAA6B,WAEzCysP,EAAuB,gCACvBA,EAAuB,4BAEvB+c,GAAgBj/O,OAAO6pB,QAAQo1N,GAAc1lQ,SAAQ,YAAmB,IAAD,mBAAhBsb,EAAgB,KACnE,GADmE,OACrDkrP,IAAoBlrP,GAA0C,CACxE,IAAM+rP,EAAQZ,IAAUnrP,GACxB+rP,GAAS1e,EAAuB,yBAAD,OAA0B0e,EAA1B,gBAIvCrlQ,EAAQH,KAAR,UAAgBluB,IAAO0F,UAAUjD,OAAO2D,QACpC,cACA85P,EAAShqP,GAAG7P,cAEF,OAAd4uQ,GAAsB/sO,aAAaI,QAC/B,YACA,WAELrG,OAAM,SAACnG,GACNvT,EAAYuT,EAAEzkB,QAAS,aA+DsC,gCE3J5Ds8Q,IAAW9+Q,sBACpB,WACI,OAAQ,sBAAKO,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxF,UACJ,mBAAGkwD,YAAU,mBAAb,SACI,sBAAMC,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,yPAAyPF,KAAK,cAElT,+BACI,0BAAUI,GAAG,aAAb,SACI,sBAAMJ,KAAK,OAAOE,EAAE,4BC6DzB49Q,IA1DM,WAAsB,IAAD,EACRh6P,mBAAiB,IADT,mBACjCmb,EADiC,KACvB8+O,EADuB,KAElCC,EAAYl4P,iBAAyB,MACrCm4P,EAAoBn4P,iBAAsB,MAG1Cub,EADS4D,eACIi5O,oBAEbC,EAAkB,SAAlBA,IACJ,IAAMC,EAAY,IAAIzuB,UAAUtuN,GAChC28O,EAAUttP,QAAU0tP,EAEpBA,EAAUjjO,iBAAiB,QAAQ,WACjC4iO,EAAY,UACsB,OAA9BE,EAAkBvtP,UACpButP,EAAkBvtP,QAAU,SAIhC0tP,EAAUjjO,iBAAiB,WAAW,SAACP,GACrCmjO,EAAYnjO,EAAM9nD,SAGpBsrR,EAAUjjO,iBAAiB,SAAS,SAACP,GAC9BqjO,EAAkBvtP,UACrButP,EAAkBvtP,QAAU,EAC1BytP,SAKFE,EAAkB,WACY,OAA9BJ,EAAkBvtP,UACpButP,EAAkBvtP,QAAU,MAEJ,OAAtBstP,EAAUttP,SACZstP,EAAUttP,QAAQu/N,SAItBhsO,qBAAU,WAGR,OAFAk6P,IAEO,WACLE,OAGD,IAQH,MAAO,CAAEC,YANW,SAAC/8Q,GACfy8Q,EAAUttP,SAAWstP,EAAUttP,QAAQ2/N,aAAeV,UAAU4uB,MAClEP,EAAUttP,QAAQ8tP,KAAKlsP,KAAKG,UAAUlxB,KAIpB09B,WAAUo/O,oBCjErBl3J,IAAkBxmH,IAAOC,IAAV,sMASfqnE,IAAStnE,IAAOC,IAAV,wGAMNq0B,IAAQt0B,IAAOC,IAAV,kJAQLmnH,IAAWpnH,IAAOC,IAAV,gGAMR69Q,IAAgB99Q,IAAOC,IAAV,sEAKb89Q,IAAmB/9Q,IAAOC,IAAV,sLAEF,SAAAC,GAAK,OAAIA,EAAM89Q,WAAa,GAAK,OAM/ClD,IAAkB96Q,IAAOC,IAAV,2FAKfuxL,IAAmBxxL,IAAOC,IAAV,0MACF,SAAAC,GAAK,OAAIA,EAAM89Q,WAAa,GAAK,OAQ/CptN,IAAgB5wD,IAAOC,IAAV,2IAQbg+Q,IAAmBj+Q,IAAOC,IAAV,4JAQhBi+Q,IAAiBl+Q,IAAOC,IAAV,0EAEb,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aAGzCwoK,IAAYn+Q,IAAOC,IAAV,iIAOTm+Q,IAAYp+Q,IAAOC,IAAV,qGAMTyyJ,IAAc1yJ,IAAOC,IAAV,oJAQXu0C,IAASx0C,IAAOC,IAAV,+HAQNwtE,IAAkBztE,IAAOC,IAAV,4RAiBfgiQ,IAAWjiQ,IAAOC,IAAV,6GAMRsmB,IAAYvmB,IAAOC,IAAV,kGAMTo+Q,IAAwBr+Q,IAAOC,IAAV,oHAInB,SAAAC,GAAK,OAAIA,EAAMxB,OAAN,sBAA8BwB,EAAMxB,OAAS,GAA7C,+BAGX4/Q,IAAUt+Q,IAAOC,IAAV,gFAKPs+Q,IAAav+Q,IAAOC,IAAV,8LAQVu+Q,IAAsBx+Q,IAAOC,IAAV,mDAInBw+Q,IAAcz+Q,IAAOC,IAAV,+YAqBXy+Q,IAAM1+Q,YAAOurC,KAAPvrC,CAAH,kKAQH2+Q,IAAU3+Q,IAAOC,IAAV,oDAIP2+Q,IAAS5+Q,IAAOC,IAAV,6EAKN4+Q,IAAU7+Q,IAAOgoB,EAAV,+LAYP82P,IAAU9+Q,IAAOC,IAAV,mPAYP8+Q,IAAmB/+Q,IAAOC,IAAV,iIAOhB++Q,IAAWh/Q,IAAOC,IAAV,oIAORg/Q,IAAej/Q,IAAOC,IAAV,8GAMZiiP,IAAaliP,IAAOC,IAAV,uQAKC,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,oBAAsB,0BAC5D,SAAAz1G,GAAK,OAAKA,EAAMy1G,YAAc,aAG3B,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,oBAAsB,0BAKtDupK,IAAmBl/Q,IAAOC,IAAV,+SAkBhBk/Q,IAAWn/Q,IAAOC,IAAV,wJAQRm/Q,IAAap/Q,IAAOC,IAAV,iTAIL,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,oBAAsB,0BAEjD,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,MAAQ,UAU1C0pK,IAAmBr/Q,YAAOwD,IAAPxD,CAAH,sKAUhBs/Q,IAAgBt/Q,IAAOC,IAAV,2OAGb,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,mBAAqB,yBAShD,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,UAAY,aAGzC4pK,IAAmBv/Q,IAAOC,IAAV,iLAQhBu/Q,IAAax/Q,IAAOC,IAAV,mDAIV6iK,IAAiB9iK,IAAOC,IAAV,qVAedw/Q,IAAWz/Q,IAAOC,IAAV,mDAIRy/Q,IAAsB1/Q,IAAOC,IAAV,2bAmBnB0/Q,IAAU3/Q,IAAO0nB,KAAV,4WAoBPk4P,IAAc5/Q,IAAOC,IAAV,qWAIA,SAAAC,GAAK,OAAIA,EAAMy1G,WAAa,oBAAsB,0BASpD,SAAAz1G,GAAK,OAAIA,EAAMy1G,WAAa,oBAAsB,0B,WC7YzDkqK,IATWzhR,sBACtB,YAA4B,IAA1BE,EAAyB,EAAzBA,UAAW4F,EAAc,EAAdA,SACT,OACI,qBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAOf,UAAWA,EAAW6C,YAAW+C,EAAhI,SACI,sBAAMsrD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,mLAAmLF,KAAK,iBCKzOygR,IATS1hR,sBACpB,YAA4B,IAA1BE,EAAyB,EAAzBA,UAAW4F,EAAc,EAAdA,SACT,OACI,qBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAOf,UAAWA,EAAW6C,YAAW+C,EAAhI,SACI,sBAAMsrD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,mLAAmLF,KAAK,iBCElP2rD,IAAoBhrD,IAAOC,IAAV,uDAIjBy2P,IAAc12P,IAAOC,IAAV,sFAKXylE,IAAyB1lE,IAAOC,IAAV,maAUf,SAAAC,GAAK,OAAIA,EAAMzB,OAAS,UAIb,SAAAyB,GAAK,OAAIA,EAAM0D,SAAW,OAAW1D,EAAM6/Q,UAAiC,qBAArB,sBAC7D,SAAA7/Q,GAAK,OAAIA,EAAM0D,SAAW,mBAAqB,UAUpDgvJ,IAAiB5yJ,IAAOC,IAAV,oEAKdg/Q,IAAej/Q,IAAOC,IAAV,uDAIZ+/Q,IAAiBhgR,IAAOC,IAAV,kGAOdggR,IAAgBjgR,IAAOC,IAAV,6KAYpB0lE,IAAiB3lE,YAAO4lE,KAAP5lE,CAAH,0XAMF,SAAAE,GAAK,OAAIA,EAAM+sC,aACpB,SAAA/sC,GAAK,OAAIA,EAAM0D,UAAa,sBAenCiiE,IAAgB7lE,IAAOC,IAAV,2JAMD,SAAAC,GAAK,OAAIA,EAAM0D,SAAW,SAAW,aA4IxCs8Q,IA1GV,SAAC,GAsBC,IArBHltR,EAqBE,EArBFA,MACA6S,EAoBE,EApBFA,MACAjC,EAmBE,EAnBFA,SACAs5C,EAkBE,EAlBFA,IACA6O,EAiBE,EAjBFA,UACAxhC,EAgBE,EAhBFA,SACAy7C,EAeE,EAfFA,QACAC,EAcE,EAdFA,OACAgH,EAaE,EAbFA,UACAhjB,EAYE,EAZFA,YACAtkC,EAWE,EAXFA,SACA2zC,EAUE,EAVFA,QACAC,EASE,EATFA,sBACAC,EAQE,EARFA,kBACAt1D,EAOE,EAPFA,SACA5F,EAME,EANFA,UACA0xB,EAKE,EALFA,QACA80B,EAIE,EAJFA,QACAm2N,EAGE,EAHFA,WACA/0M,EAEE,EAFFA,QACAznE,EACE,EADFA,MASU0hR,GAAsB,OAALt6Q,QAAK,IAALA,OAAA,EAAAA,EAAO8M,UAAWuqC,EAEzC,OACI,eAAC,IAAD,WACI,eAACwoB,IAAD,CACIpnE,UAAWA,EACXyhR,UAAWI,GAAkBlF,EAC7B95Q,YAAA,UAAc+C,EAAd,cACAzF,MAAOA,EACPmF,SAAUA,EALd,UAOI,cAAC,IAAD,2BACIiC,MAAOA,EACPm1C,OApBO,CACnBorB,KAAM,EACNC,WAAY,KACZC,cAAe,QACf3jE,SAAU,SAiBM3P,GAHR,IAIIi3D,YAAaA,EACb/M,IAAKA,EACL3yB,SAAUA,EACVy7C,QACI,SAAC3gD,GACG,IAAIgyP,EAAMhyP,EAAEgwB,OAAOxvC,MACnBwf,EAAEgwB,OAAOxvC,MAAQ,GACjBwf,EAAEgwB,OAAOxvC,MAAQwxQ,EACV,OAAPrxM,QAAO,IAAPA,KAAU3gD,IAGlB4gD,OAAQA,EACRriE,SAAUA,EACVmoD,UAAWA,EACXpmC,SAAUA,EACVhjB,SAAU,OACV22D,QAASA,EACT4M,QAASA,GAAW,EACpBjyC,WAAYslC,EACZtsB,UAAWusB,EACXt1D,SAAUA,EACV+oE,UAAWA,KAEZj9C,EAAU,qCACT,cAAC,IAAD,UACI,cAAC,IAAD,CAAQnvB,QAAQ,UAAUvC,UAAU,eAAe7D,OAAQu1B,EAAS9rB,SAAQ,UAAKA,EAAL,eAA5E,SACI,cAAC,IAAD,UAAgB,cAACquJ,GAAD,UAGxB,cAAC,IAAD,CAAQ93J,OAAQqqD,EAASjkD,QAAQ,UAAUvC,UAAU,eAAe4F,SAAQ,UAAKA,EAAL,eAA5E,SAAyG,cAAC87Q,IAAD,UAAgB,cAAC7hR,IAAA,EAAD,WAEzH,mCACIyF,GAAsB,KAAViC,EACR,cAACo6Q,IAAD,UAAe,cAAC,IAAD,CAAU3hR,UAAU,WAAW4F,SAAQ,UAAKA,EAAL,kBACtD,cAAC+7Q,IAAD,CAAe77Q,QAAS0gD,EAAxB,SAAiC,cAAC,IAAD,CAAYxmD,UAAU,kBAAkB4F,SAAQ,UAAKA,EAAL,uBAKhGg5C,GACG,eAAC,IAAD,CAAe/7C,YAAW+C,GAAQ,UAAOA,EAAP,YAA2BN,SAAUA,EAAvE,UACKiC,EAAQA,EAAM8M,OAAS,IAD5B,IACkCuqC,EAC7BijO,GACG,qCACI,sBAAMh/Q,YAAA,UAAc+C,EAAd,aAAN,oBACA,cAAC,IAAD,CAAa/C,YAAA,UAAc+C,EAAd,iBAAb,yCAIJ+2Q,GACA,qCACI,sBAAM95Q,YAAA,UAAc+C,EAAd,aAAN,oBACA,cAAC,IAAD,CAAa/C,YAAA,UAAc+C,EAAd,kBAAb,uCC1NjBk8Q,IATchiR,sBACzB,WAAkCC,GAAQ,EAAvCC,UAAuC,EAA5BC,OAA6B,IAArB2F,EAAoB,EAApBA,SAClB,OACI,qBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAO8B,YAAW+C,EAA1G,SACR,sBAAMsrD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,6WAA6WF,KAAK,iBCKvZghR,IATYjiR,sBACvB,YAA8B,IAA3BE,EAA0B,EAA1BA,UAAW4F,EAAe,EAAfA,SACV,OAAQ,sBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAOf,UAAWA,EAAW6C,YAAW+C,EAAhI,UACJ,sBAAMsrD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,2RAA2RF,KAAK,YAChV,sBAAME,EAAE,wKAAwKF,KAAK,eCKpLihR,IAA+B5tP,IAAM/tB,eAC9C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS+gR,MACZ,OAAOjnQ,YAAY1U,qBAAW07Q,MCnB3B,IAAME,IAAe,CACxBxE,UAAW,YACXF,SAAU,WACVF,QAAS,UACTL,aAAc,YACdC,iBAAkB,oBAClBC,YAAa,qBAGJgF,IAAiB,2FAEjBC,IAAgC,SAACv8Q,EAAek+J,EAAqDC,GAC9G,IAAMq+G,EAAwBt+G,EAAaphK,KAAI,gBAAGjN,EAAH,EAAGA,KAAMuG,EAAT,EAASA,KAAT,iBAAwBvG,EAAKo4C,cAA7B,aAA+C7xC,MAAQrH,KAAK,QAE3G,MADuB,UAAMiR,EAAN,kBAAqBw8Q,EAArB,kBAAoDr+G,ICVxE,IAUQs+G,IAVexiR,sBAC1B,WAAkCC,GAAS,IAAxCC,EAAuC,EAAvCA,UAAmB4F,GAAoB,EAA5B3F,OAA4B,EAApB2F,UAClB,OAAQ,sBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAO8B,YAAW+C,EAAU5F,UAAWA,EAA/H,UACJ,sBAAMG,MAAM,KAAKC,OAAO,KAAKmxK,GAAG,IAAIxwK,KAAK,YACzC,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,0hBAA0hBF,KAAK,eCI5kBwhR,ICTHt4Q,IDSGs4Q,IAPf,WACI,OAAO,eAAC5C,IAAD,CAAkB98Q,YAAU,6BAA5B,UACH,cAAC,IAAD,CAAuB+C,SAAS,0BAChC,cAAC,IAAD,CAAM/C,YAAU,wBAAhB,sCEKO2/Q,IATsB1iR,sBACjC,WAAkCC,GAAQ,EAAvCC,UAAuC,EAA5BC,OAA6B,IAArB2F,EAAoB,EAApBA,SAClB,OACI,qBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAO8B,YAAW+C,EAA1G,SACR,sBAAMsrD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,6WAA6WF,KAAK,kB,SDL1ZkJ,K,wCAAAA,E,4CAAAA,E,4CAAAA,E,8CAAAA,E,kDAAAA,E,kDAAAA,E,iCAAAA,U,KEuBL,IAAMw4Q,IAAwB,WACjC,IAAM1/Q,EAAWO,cACXwgK,EAAiBlD,KACjBptJ,EAAcnQ,cACdq/Q,EAAqB7hH,KAM3B,OAAOnvK,uBAAY,SAACivK,GAEhB,OADA59J,EFvBG,CACHrG,KAAMuN,IAAQ04Q,qBEuBP7+G,EAAenD,GACjB3zI,MAAK,SAACn5B,GACCA,GACA6uR,EAAmB/hH,GAAY3zI,MAAK,SAAC3qB,GACjC,IAAMugR,EAAE,6BAAQ/uR,GAAR,IAAcwO,QAASA,GAAW,OAC1CU,EFxBjB,SAA4BlP,GAC/B,MAAO,CACH6I,KAAMuN,IAAQ44Q,qBACdhvR,QEqByBivR,CAAmBF,UAIvC11P,OAAM,SAAC5rB,GACJyB,EFtBT,SAA4BzB,GAC/B,MAAO,CACH5E,KAAMuN,IAAQ84Q,qBACdzhR,SEmBiB0hR,CAAmB1hR,EAAMgB,UAClCkR,EAAYlS,EAAMgB,QAAS,cAEpC,CAACS,EAAU+gK,EAAgBtwJ,EAAakvQ,KAIlCO,IAA2B,WACpC,IAAMlgR,EAAWO,cACX4/Q,E1uBgBH,WACH,IAAM1xR,EAAOC,eACb,OAAOC,uBACH,SAACivK,EAAoBq8G,GAArB,OACIxrR,EAAK+B,IAAL,qBAAuBotK,GAAcq8G,GAAc,KACvD,CAACxrR,I0uBrBqB2xR,GACpB3vQ,EAAcnQ,cACd+/Q,EAAgBtiH,KAEtB,OAAOpvK,uBACH,SAACivK,EAAYwqF,EAAU14O,EAAqB/V,GACxCqG,EF7BD,CACHrG,KAAMuN,IAAQo5Q,wBE6BV,IAAMT,EAAK,CACP/8Q,MAAOslP,EAAStlP,MAChBs3Q,YAAahyB,EAASgyB,YACtB,UAAahyB,EAASuyB,UACtB,SAAYvyB,EAASqyB,SACrB,QAAWryB,EAASmyB,QACpB,aAAgBnyB,EAAS8xB,aACzB,iBAAoB9xB,EAAS+xB,kBAEjC,OAAOgG,EAAkBviH,EAAYiiH,GAChC51P,MAAK,SAAAn5B,GAGF,GAFAkP,EFpCb,SAA+BlP,GAClC,MAAO,CACH6I,KAAMuN,IAAQq5Q,wBACdzvR,QEiCqB0vR,CAAsB,6BAAKp4B,GAAat3P,KAEpC,YAAT6I,EAAoB,CACpB,IAAI4wK,EAAM,GACN76J,IACA66J,EAAMvvI,OAAO6pB,QAAQn1C,GAAMsG,QAAO,SAACumD,EAAD,GAAwB,IAAD,mBAAhB1sC,EAAgB,KAAXrrB,EAAW,KAErD,OAAO+3D,EAAG,iBADK4iN,IAAatvP,GAClB,gBAA2BrrB,GAAmB,SAAVA,EAAmBA,EAAQ,MAA/D,SACX,KAGP67Q,EAAc,CAAEziH,aAAY1kK,KAAMqxK,IAEtC,OAAOz5K,KAEVq5B,OAAM,SAAC5rB,GACJyB,EF7Cb,SAA+BzB,GAClC,MAAO,CACH5E,KAAMuN,IAAQu5Q,wBACdliR,SE0CqBmiR,CAAsBniR,EAAMgB,UACrCkR,EAAYlS,EAAMgB,QAAS,cAGvC,CAACS,EAAUyQ,EAAa0vQ,EAAmBE,KAQtCM,IAA0B,WACnC,IAAM3gR,EAAWO,cAKjB,OAAO5R,uBAAY,WACfqR,EFxDG,CACHrG,KAAMuN,IAAQ05Q,mBEwDf,CAAC5gR,KClGO6gR,IATa9jR,sBACxB,WAAkCC,GAAS,IAAxCC,EAAuC,EAAvCA,UAAmB4F,GAAoB,EAA5B3F,OAA4B,EAApB2F,UAClB,OAAQ,qBAAKvF,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAO8B,YAAW+C,EAAU5F,UAAWA,EAA/H,SACJ,sBAAMkxD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,iiBAAiiBF,KAAK,iBCmXnlB8iR,QAvVf,YAAwP,IAAhOhhB,EAA+N,EAA/NA,aAAcihB,EAAiN,EAAjNA,YAAaC,EAAoM,EAApMA,cAAe1sK,EAAqL,EAArLA,WAAY2sK,EAAyK,EAAzKA,eAAyK,EAC7M/B,MAAxB92B,EADqO,EAC3Ot3P,KAAgBuV,EAD2N,EAC3NA,UAElB66Q,EAAcnjH,KACdojH,E5uBqFH,WACH,IAAM1yR,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OACInvK,EAAKG,KAAL,oBAAuBgvK,EAAvB,oBAAgDluK,GAAW,KAC/D,CAACjB,I4uB1FyB2yR,GACxBr1E,EF0EiC,WACvC,IAAMhyK,EAAgB+2H,KAA+BhgK,KAC/CmhL,EAAe5O,KACfxwK,EAAWm+K,GAAiCj3I,GAClD,OAAOprC,sBAAW,yCAAC,WAAOiC,GAAP,wBAAAggB,EAAA,sDACTywQ,EAAgB,GADP,eAEEzwR,GAFF,gEAEN+kL,EAFM,QAGLC,EAA6B,aAAdD,EAAKhjL,KACpBE,EAASo+K,SACTp+K,EAASq+K,eALJ,KAOXmwG,EAPW,UAOcpvG,EACrB0D,EAAKz8K,KACL08K,EACA,CAAEtS,QAAS,WAAYh5F,OAAQ15E,EAAMulB,QAAQw/J,KAVtC,yBAOGv/J,KAPH,wLAaRirQ,GAbQ,gEAAD,sDAef,CAACxuR,IE7FkByuR,GAChB/qQ,EAAUW,cANmO,EAOrN4K,mBAAS,IAP4M,mBAO5OviB,EAP4O,KAOnOgiR,EAPmO,KAQ7Oh7Q,EAAU0R,YAAY3R,MACtBk7Q,EAAuB19P,iBAAuB,MAC9CuxP,EAAWvxP,iBAAgC,MAC3C29P,EAAc39P,iBAAuB,MACrC49P,EAAiB59P,iBAAuB,MAZqM,EAavMhC,mBAAiB,GAbsL,mBAa5O6/P,EAb4O,KAa5NC,EAb4N,OAc3M9/P,oBAAS,GAdkM,mBAc5O+/P,EAd4O,KAc9NC,EAd8N,KAe7O5kB,EAAyBf,MAEzB4lB,EAAmBpzR,uBAAY,WACjC,GAAI6yR,EAAqB9yP,QAAS,CAC9B,IAAMme,EAAY20O,EAAqB9yP,QACjCszP,EAAWP,EAAY/yP,QAE7B,GAAIme,GAAam1O,EAAU,CACvB,IAAMC,EAAkBp1O,EAAUqnD,UAAYrnD,EAAU9d,aAClDmzP,EAAiBF,EAASjoO,UAAYioO,EAASjzP,aAItC+yP,IAAfhiB,KAFmBoiB,EAAiB,IAAMD,QAKnD,CAACniB,IAEEliG,EAAahhJ,mBAAQ,yBAAMwrO,QAAN,IAAMA,OAAN,EAAMA,EAAUhqP,KAAI,CAACgqP,IAC1ChvN,EAAUnhB,YAAYkhB,MACtB1oB,EAAcnQ,cAnC+N,EAoC/MwhB,mBAA0C,MApCqK,mBAoC5OqgQ,EApC4O,KAoChOC,EApCgO,OAqC7MtgQ,mBAAiF,MArC4H,mBAqC5OugQ,EArC4O,KAqC/NC,EArC+N,KAsC7OhgG,EAAoBtkE,KACpBwhE,EAA0B7wL,uBAC5B,wBAAa,OAAP4X,QAAO,IAAPA,OAAA,EAAAA,EAASrU,aAAc4S,aAAY,UAACyB,EAAQ5T,YAAT,aAAC,EAAcP,OAASkwL,EAAiB,OAAC/7K,QAAD,IAACA,OAAD,EAACA,EAASrU,aAE5F,CAACowL,EAAD,OAAoB/7K,QAApB,IAAoBA,OAApB,EAAoBA,EAASrU,YAG3BqwR,EAAoB,YACd,OAARn6B,QAAQ,IAARA,OAAA,EAAAA,EAAUhqP,KAAM8iR,EAAY,CAAEtjH,WAAYwqF,EAAShqP,GAAG7P,WAAY2K,KAAMqG,IAAW0qB,MAAK,WACpFs3P,EAAW,IACXrkB,EAAuB,4CAA6C,CAAEslB,eAAgBjjR,EAAQ+R,aAIhGmxQ,GAAU7lQ,mBAAQ,WACpB,OAAe,OAARwrO,QAAQ,IAARA,OAAA,EAAAA,EAAUqV,MAAMr/P,OAAhB,OAAuBmI,QAAvB,IAAuBA,OAAvB,EAAuBA,EAASnI,MACxC,QACCmI,QADD,IACCA,OADD,EACCA,EAASnI,GADV,OACcgqP,QADd,IACcA,OADd,EACcA,EAAUqV,MAAMr/P,KAIjC6jB,qBAAU,WAAQu9J,MAA6B,CAACijG,KAEhDxgQ,qBAAU,WAAO,OAAO,WAAO,IAAD,EAC1B,UAAAozP,EAAS3mP,eAAT,SAAkB8gJ,WAClB,IAGJ,IAOMkzG,GAAqB,SAACC,IAChB,OAARv6B,QAAQ,IAARA,OAAA,EAAAA,EAAUhqP,KAAM+iR,EAAsB,CAAEvjH,WAAYwqF,EAAShqP,GAAG7P,aACtD2uQ,EAAVylB,EAAiC,8BAAwD,+BAmBvFC,GAAe,SAACC,IP9GnB,SAAyB3pR,EAAcivJ,GAC1C,IAAMhpF,EAAO,IAAI1/B,KAAK,CAACvmC,GAAO,CAAES,KAAM,eAChC0lC,EAAME,IAAIC,gBAAgB2/B,GAE1Bz/B,EAAOC,SAASC,cAAc,KAEpCF,EAAKG,KAAOR,EACZK,EAAK4/B,SAAW6oF,EAChBxoH,SAASI,KAAKC,YAAYN,GAE1BA,EAAKO,QAELN,SAASI,KAAKw/B,YAAY7/B,GAE1BH,IAAIogC,gBAAgBtgC,GOkGhByjP,CADqB16B,EAAWi3B,IAA6B,OAACj3B,QAAD,IAACA,OAAD,EAACA,EAAUtlP,MAAO+/Q,EAAqB7hH,cAAkC,OAApB6hH,QAAoB,IAApBA,OAAA,EAAAA,EAAsB5hH,UAAW,IAAM,GAC1I,4BAA6BmnF,QAA7B,IAA6BA,OAA7B,EAA6BA,EAAUtlP,QACtD2N,EAAY,gBAAiB,WAC7BysP,EAAuB,8BAGrB7pF,GAAY1kL,uBAAY,SAACqyK,EAAkC+hH,GAC7DC,KACA9lB,EAAuB,mCACvB,OAAIilB,QAAJ,IAAIA,OAAJ,EAAIA,EAAaY,KACbT,EAAe,CAAElkR,GAAI2kR,EAAgBryR,OAAQ,YAC7CuyR,GAAc,OAACd,QAAD,IAACA,OAAD,EAACA,EAAaY,MAE5BT,EAAe,CAAElkR,GAAI2kR,EAAgBryR,OAAQ,eAC7Cq7M,EAAc/qC,GAAc/2I,MAAK,SAACn5B,GAC9BsxR,GAAc,SAACc,GAAD,oBAAC,gBAAmBA,GAApB,mBAA+BH,EAAiBjyR,OAC9DwxR,EAAe,CAAElkR,GAAI2kR,EAAgBryR,OAAQ,YAC7CuyR,GAAenyR,SAIxB,CAACi7M,EAAeo2E,EAAYE,IAEzBY,GAAiBt0R,uBAAY,SAACw0R,GAA0C,IAA3BC,EAA0B,uDAAN,EACnE,GAAIA,GAAqBD,EAAM7xQ,OAC3BgxQ,EAAe,UADnB,CAKA,IAAMe,EAAYF,EAAMC,GAClBpwG,EAAWzzI,IAAIC,gBAAgB6jP,GAC/Bp1G,EAAQ,IAAIq1G,MAAMtwG,GACxB/E,EAAMo0C,QAAU,WAChBgzD,EAAS3mP,QAAUu/I,EAEnBA,EAAMqB,OAAOrlJ,MAAK,kBAAMq4P,GAAe,SAACY,GAAD,OAAeA,GAAQ,6BAASA,GAAT,IAAmBK,aAAct1G,UAAW9jJ,OAAM,SAAA5rB,GAAK,OAAIyxB,QAAQzxB,MAAM,uBAAwBA,MAE/J0vK,EAAMsC,QAAU,WACZhxI,IAAIogC,gBAAgBqzG,GACpBiwG,GAAeE,EAAOC,EAAoB,OAE/C,IAEGJ,GAAmB,WACO,aAAb,OAAXX,QAAW,IAAXA,OAAA,EAAAA,EAAa3xR,UACT2xR,EAAYkB,cACZlB,EAAYkB,aAAa/zG,QAE7B8yG,EAAe,QAIjBkB,GAAqB,SAACtqR,GACxB,IAAMuqR,EAAYvqR,EAAK5K,QAAQ8wR,IAAgB,MAAM5jO,MAAM,MAAM1pC,QAAO,SAACkkQ,GAAD,OAASA,KAC3E0N,EAAUxqR,EAAK69D,MAAMqoN,KAC3B,IAAKsE,EAAS,MAAO,CAAC,mCAAGxqR,KAEzB,IAAMyqR,EAA2B,GAMjC,OALAF,EAAUlvQ,SAAQ,SAACqvQ,EAAc/jR,GAC7B6jR,GAAWC,EAASvtQ,KAAK,4BAAgBstQ,EAAQ7jR,IAAhBA,IACjC8jR,EAASvtQ,KAAK,mCAAGwtQ,QAGdD,GAkCX,OA/BA1hQ,qBAAU,WACN,IAAK5b,IAAD,OAAc06Q,QAAd,IAAcA,OAAd,EAAcA,EAAazvQ,UAAWuwQ,GAAgBL,EAAqB9yP,QAAS,CACpF,IAAMszP,EAAWP,EAAY/yP,QAC7B,GAAIszP,EAAU,CACV,IAAM6B,EAAc7B,EAASjoO,UAC7BynO,EAAqB9yP,QAAQgiG,SAAS,CAAEvrD,IAAK0+M,EAAa5wG,SAAU,WACpE6uG,GAAgB,OAGzB,CAACz7Q,EAAW06Q,EAAac,IAE5B5/P,qBAAU,WACN,IAAM6hQ,EAAcpC,EAAehzP,QAE7Bq1P,EAAiB,IAAIC,gBAAe,SAAAn/N,GAAY,IAAD,iBAC/BA,GAD+B,IACjD,2BAA2B,CAAC,IAAnBo/N,EAAkB,QACvBrC,EAAkBqC,EAAMC,YAAY7mR,SAFS,kCAUrD,OAJIymR,GACAC,EAAeI,QAAQL,GAGpB,WACCA,GACAC,EAAeK,UAAUN,MAGlC,CAACvkR,IAEG6oP,KAAY,OAAC24B,QAAD,IAACA,OAAD,EAACA,EAAazvQ,QAC7B,eAACsrQ,IAAD,WACI,cAAC,IAAD,CAAuB/5Q,SAAS,kBAChC,cAAC,IAAD,CAAM/C,YAAU,mBAAhB,iCAEF,mCACGuG,EAAY,cAAC,IAAD,IACT,eAAC22Q,IAAD,CAAuBhgR,IAAKwkR,EAAsBnkR,OAASolR,GAAgBd,GAAL,GAAqB5+M,SAAUg/M,EAArG,UACI,gCACKhB,IAAW,OAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAanhR,KAAI,SAACykR,GAC+C,IAAD,EAA5E,MAAyB,iBAArBA,EAAY1qR,MAA2B0qR,EAAYrjH,aAAa1vJ,OACzD,cAAC4rQ,IAAD,CAAYp9Q,YAAU,yBAAtB,SACH,eAACq9Q,IAAD,WACA,cAACQ,IAAD,CAAU79Q,YAAU,oBAApB,SAAyC4f,KAAM2kQ,EAAY1pI,WAAW75H,OAAO,uBAD7E,UAECujQ,EAAYrjH,oBAFb,aAEC,EAA0BphK,KAAI,SAACmS,EAAMlS,GAClC,OAAO,eAACu9Q,IAAD,WAEe,gBAAdrrQ,EAAKpf,KACD,cAAC,GAAD,CACImxG,MAAO1qE,EAAQ8R,MAAQ9R,EAAQ6R,QAC/B74C,KAAMgnC,EAAQhnC,KACdyQ,SAAQ,2BACR5F,UAAS,uBAAkBm8B,EAAQ8R,MAAQ9R,EAAQ6R,UAAY,eAEnE,cAAC,IAAD,CACIpoC,SAAQ,eACR5F,UAAU,kBAGtB,gCACI,cAACsgR,IAAD,CAAQz9Q,YAAA,UAAciS,EAAKpf,KAAnB,UAAR,SACmB,aAAdof,EAAKpf,KAAsB,YAAc,gBAE9C,eAAC6qR,IAAD,CAAS19Q,YAAA,UAAciS,EAAKpf,KAAnB,SAAT,UACKof,EAAK7Y,MACJmrR,EAAYC,YAAczkR,IAAUwkR,EAAYrjH,aAAa1vJ,OAAS,GAAK,cAACgtQ,IAAD,gBAK5F+F,EAAYC,YAAc,eAAC1G,IAAD,YACX,OAAXyE,QAAW,IAAXA,OAAA,EAAAA,EAAajkR,MAAOimR,EAAYjmR,IAAM,cAAC,IAAD,CAAY0B,YAAU,WAAWw0G,YAAamuK,GAAS1/Q,QAAS,kBAAM0/Q,IAAWpvG,GAAUgxG,EAAYrjH,aAAcqjH,EAAYjmR,KAAjI,SAAsI,cAAC,GAAD,CAAUnB,UAAU,gBACrL,OAAXolR,QAAW,IAAXA,OAAA,EAAAA,EAAajkR,MAAOimR,EAAYjmR,IAA8B,aAAb,OAAXikR,QAAW,IAAXA,OAAA,EAAAA,EAAa3xR,SAAwB,cAAC,IAAD,CAAYoP,YAAU,WAAWw0G,YAAamuK,GAAS1/Q,QAASigR,GAAhE,SAAkF,cAAClF,IAAD,OAClJ,OAAXuE,QAAW,IAAXA,OAAA,EAAAA,EAAajkR,MAAOimR,EAAYjmR,IAA8B,gBAAb,OAAXikR,QAAW,IAAXA,OAAA,EAAAA,EAAa3xR,SAA2B,eAACmtR,IAAD,CAAkB/9Q,YAAU,cAAciD,QAASigR,GAAnD,UAAqE,cAACrhQ,IAAA,EAAD,CAChJ3e,KAAM,KACR,cAAC,IAAD,CAAc/F,UAAU,mBACxBwlR,GAEI,eAAC,GAAD,CAAchvK,YAAa,IAAKU,UAAU,EAAOtxG,SAAS,gBAAgBd,OAAQ,cAACg8Q,IAAD,UAAY,cAAC,GAAD,CAAM9gR,UAAU,WAAW4F,SAAS,gBAAlI,UACE,cAAC,GAAD,CAAYA,SAAS,mBAAmBE,QAAS,WAC7CwT,EAAQH,KAAR,UAAgBluB,IAAO6C,iBAAiBF,WAAWF,OAAO2D,QACtD,eACA,OAFJ,uBAGgBsvK,EAHhB,sBAGwCymH,EAAYjmR,GAAG7P,aACvD2uQ,EAAuB,qCAL3B,8BASA,cAAC,GAAD,CAAYr6P,SAAS,kBAAkBE,QAAS,WAC5CwT,EAAQH,KAAR,UAAgBluB,IAAO6C,iBAAiBC,UAAUL,OAAO2D,QACrD,cACA,OAFJ,uBAGgBsvK,EAHhB,sBAGwCymH,EAAYjmR,GAAG7P,aACvD2uQ,EAAuB,oCAL3B,6BASA,cAAC,GAAD,CAAYr6P,SAAS,mBAAmBE,QAAS,kBAAM6/Q,GAAayB,IAApE,0BAGA,cAAC,GAAD,CAAYxhR,SAAS,cAAcE,QAAS,kBAxLlE,SAAC8/Q,GACnB,IAAM0B,EAAen8B,EAAWi3B,IAA6B,OAACj3B,QAAD,IAACA,OAAD,EAACA,EAAUtlP,MAAO+/Q,EAAqB7hH,cAAkC,OAApB6hH,QAAoB,IAApBA,OAAA,EAAAA,EAAsB5hH,UAAW,IAAM,GACnJljI,EAA2BC,aAAoBumP,GACrDrnB,EAAuB,kCACV,WAATn/N,IACIA,EACAttB,EACI,0BACA,WAGJA,EAAY,8BAA+B,UA6KuC+zQ,CAAcH,IAAhE,kCAvBJ,cAACtG,IAAD,CAAYzpK,YAAamuK,GAAzB,SAAkC,cAAC,GAAD,CAAMxlR,UAAU,WAAW4F,SAAS,uBApCvBwhR,EAAYjmR,IAoElD,YAArBimR,EAAY1qR,KACL,cAACukR,IAAD,CAAkBp+Q,YAAU,oBAA5B,SACH,eAACq+Q,IAAD,WACA,cAACR,IAAD,CAAU79Q,YAAU,eAApB,SAAoC4f,KAAM2kQ,EAAY1pI,WAAW75H,OAAO,uBACxE,eAACs8P,IAAD,WACI,cAACC,IAAD,CACI92Q,QAAO,OAAE6hP,QAAF,IAAEA,OAAF,EAAEA,EAAUqV,MACnB/6P,QAAS2D,EACTrD,KAAK,UACLH,SAAS,qBACT5F,UAAU,uBAEd,gCACI,cAACsgR,IAAD,CAAQz9Q,YAAU,sBAAlB,UACa,OAARsoP,QAAQ,IAARA,OAAA,EAAAA,EAAUqV,MAAMngO,WAAY,KAA5B,OAAkC8qN,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAUqV,MAAMjgO,YAEvD,cAACggP,IAAD,CAAS19Q,YAAU,eAAnB,SACK0jR,GAAmBa,EAAYnrR,kBAhBYmrR,EAAYjmR,IAuBnD,UAArBimR,EAAY1qR,KACL,cAAC,IAAD,CAAgBmG,YAAU,oBAA1B,SACH,eAACs+Q,IAAD,WACA,cAACT,IAAD,CAAU79Q,YAAU,aAApB,SAAmC4f,KAAM2kQ,EAAY1pI,WAAW75H,OAAO,uBACvE,eAACw8P,IAAD,WACI,cAAC,IAAD,CAAaz6Q,SAAS,aAAa5F,UAAU,eAC7C,eAACmgR,IAAD,CAAangR,UAAU,aAAvB,UACI,gCACI,cAACsgR,IAAD,CAAQz9Q,YAAU,cAAlB,uCAGA,cAAC09Q,IAAD,CAAS19Q,YAAU,aAAnB,oGAIJ,eAACu+Q,IAAD,WACI,cAAC,IAAD,CAAQ18Q,MAAO,UAAWY,UAAWkgR,GAASrlR,MAAM,QAAQyF,SAAS,YAAY5F,UAAU,YAAY7D,OAAQ,kBAAMspR,IAAmB,IAAxI,uBACA,cAAC,IAAD,CAAQ/gR,MAAO,kBAAmBnC,QAAQ,UAAU+C,UAAWkgR,GAASrlR,MAAM,QAAQyF,SAAS,aAAa5F,UAAU,aAAaqF,MAAO,CAAEiwB,WAAY,QAAUn5B,OAAQ,kBAAM4nR,KAAhL,iCAhB0CqD,EAAYjmR,IAuBnE,iCAEX,qBAAKpB,IAAKykR,OAGbgB,IAAW,cAAChF,IAAD,CAASzgR,IAAK0kR,EAAd,SACR,eAAChE,IAAD,WACC5d,EACG,cAACmd,IAAD,UACI,eAACgB,IAAD,CAAe3pK,WAAY2sK,EAAgBnhR,YAAU,sBAAsBiD,QAAS,WAAO+8P,IAAiBmhB,GAAkBD,GAAc,IAA5I,UAAoJ,cAACzC,IAAD,CAAaz+Q,YAAU,uBAAuBw0G,WAAY2sK,EAA1D,SAA0E,0BAA9N,uBAGJ,cAAChE,IAAD,UACI,eAACgB,IAAD,CAAe3pK,WAAYA,EAAYx0G,YAAU,iBAAiBiD,QAAS,kBAAO+8P,IAAiBxrJ,GAAcouK,MAAjH,UAAwIpuK,EAAa,cAAC,IAAD,CAAuBzxG,SAAS,oBAAuB,cAAC,IAAD,CAAeA,SAAS,oBAApO,mBAGR,cAAC,IAAD,CAAsBg5C,IAAK,IAAKt5C,SAAU+xG,EAAYzvC,QAAS,EAAGrgE,MAAOjF,EAAS44D,kBAAmB,OAAQjvC,SAAU,SAAClF,GAAD,OAAOu9P,EAAWv9P,EAAEgwB,OAAOxvC,QAAQonE,UA7QlJ,SAAC5nD,GACX,UAAVA,EAAE6L,KAAoB7L,EAAEygQ,WACxBzgQ,EAAEkmJ,iBACFq4G,MA0QsM1/Q,SAAS,UAAU4gD,QAAS8+N,EAAmB35N,YAAY,8CChXvQ8yM,IAAiB,CACnB,CACIgpB,YAAa,GACbC,eAAgB,IAChBhpB,WAAY,CAAC,IAAI,IAAI,MAEzB,CACI+oB,YAAa,IACbC,eAAgB,GAChBhpB,WAAY,CAAC,IAAI,IAAI,MAEzB,CACI+oB,YAAa,IACbC,eAAgB,GAChBhpB,WAAY,CAAC,IAAI,IAAI,OAgBdipB,QAZf,WACI,OAAO,mCAAGlpB,IAAe97P,KAAI,WAA4CC,GAAW,IAArD6kR,EAAoD,EAApDA,YAAaC,EAAuC,EAAvCA,eAAgBhpB,EAAuB,EAAvBA,WACxD,OAAO,eAACN,IAAD,CAAmCv7P,YAAU,4BAA7C,UACH,cAAC07P,IAAD,CAAcp+P,MAAOsnR,EAAarnR,OAAQ,GAAIyC,YAAU,mCACxD,cAAC07P,IAAD,CAAcp+P,MAAOunR,EAAgBtnR,OAAQ,EAAGyiD,UAAW,OAAQhgD,YAAU,mCAErE67P,EAAW/7P,KAAI,SAACxC,EAAOyC,GAAR,OAAkB,cAAC27P,IAAD,CAAcp+P,MAAOA,EAAOC,OAAQ,EAAeyC,YAAU,kCAAjBD,QAJtDA,SCM5BglR,QAlBf,YAAkP,IAA1NvK,EAAyN,EAAzNA,mBAAoBnoF,EAAqM,EAArMA,WAAY1tK,EAAyL,EAAzLA,aAAcqgQ,EAA2K,EAA3KA,OAC1Dz+Q,EAAc64Q,MAAd74Q,UACR,OAAO,cAAC,IAAD,UAECA,EAAY,cAAC,IAAD,IAAmB,qCAC3B,cAAC,IAAD,CAAUvG,YAAU,iBAApB,uBACA,cAACilR,IAAD,CAAkBtgQ,aAAcA,EAAcw1P,aAAc6K,EAAQ3yF,WAAYA,EAAYznI,WAAW,EAAO4vN,mBAAoBA,EAAoBhB,aAAc,oBACpK,cAAC,IAAD,CAAUx5Q,YAAU,iBAApB,sBACA,cAACklR,IAAD,CAAiBvgQ,aAAcA,EAAcw1P,aAAc6K,EAAQ3yF,WAAYA,EAAYmoF,mBAAoBA,EAAoBhB,aAAc,oBACjJ,cAAC,IAAD,CAAUx5Q,YAAU,gBAApB,qBACA,cAAC,IAAD,CAAgB2kB,aAAcA,EAAcw1P,aAAc6K,EAAQ3yF,WAAYA,EAAYmoF,mBAAoBA,EAAoBhB,aAAc,oBAChJ,cAAC,IAAD,CAAUx5Q,YAAU,kBAApB,sBACA,cAACmlR,IAAD,CAAkBxgQ,aAAcA,EAAcw1P,aAAc6K,EAAQ3yF,WAAYA,EAAYmnF,aAAc,0B,WCT3G4L,IATiBnoR,sBAC5B,WAAwBC,GAAQ,EAA7BC,UAA6B,EAAlBC,OACV,OAAQ,qBAAKI,MAAM,6BAA6BF,MAAM,KAAKC,OAAO,KAAKF,QAAQ,YAAYa,KAAK,OAAxF,SACZ,sBAAMmwD,YAAU,UAAUC,YAAU,UAAUlwD,EAAE,2ZAA2ZF,KAAK,iBCQrcmnR,QAXf,WACI,OAAO,eAAC1pB,IAAD,CAAyB37P,YAAU,2BAAnC,UACH,eAAC,IAAD,WACI,cAAC07P,IAAD,CAAcp+P,MAAO,IAAKC,OAAQ,GAAIyC,YAAU,kCAChD,cAACo5P,IAAD,CAAe97P,MAAO,GAAIC,OAAQ,GAAIyC,YAAU,sCAEpD,cAAC07P,IAAD,CAAcp+P,MAAO,IAAKC,OAAQ,EAAGyC,YAAU,sCC2DxCslR,QArDf,YAAkE,IAAD,IAAvC9wK,EAAuC,EAAvCA,WAChB/9F,EAAUW,cAD6C,EAEvBgoQ,MAAxB92B,EAF+C,EAErDt3P,KAAgBuV,EAFqC,EAErCA,UAClBg/Q,EAAiBnF,MAHsC,EAI7Bp+P,mBAAoC,IAJP,mBAItDwjQ,EAJsD,KAI5ChlG,EAJ4C,KAKvD48E,EAAyBf,MAEzBopB,EAAgB,WAClBjlG,EAAY,KAaVklG,EAAwC,KAAtBF,EAAQ,MAEhC,OAAO,cAAC,IAAD,eAAwC51R,IAAtB41R,EAAQ,MAC7B,qCACI,cAAC,IAAD,CAAeviR,QAAS,WACpBwT,EAAQH,KAAKluB,IAAO0F,UAAUC,oBAC/BiS,YAAU,cAFb,SAE2B,cAAC,GAAD,MAEvBuG,EAAY,cAAC,IAAD,IAAqB,eAAC,IAAD,WACjC,eAAC,IAAD,WACI,sBAAMvG,YAAU,iBAAhB,gBAAkCsoP,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAUtlP,QAC5C,cAAC+5Q,IAAD,CAAgB95Q,QAAS,kBAAOuxG,IAAD,OAAe8zI,QAAf,IAAeA,OAAf,EAAeA,EAAUtlP,QAASw9K,EAAY,CAAE,aAAS8nE,QAAT,IAASA,OAAT,EAASA,EAAUtlP,SAAUwxG,WAAYA,EAAYx0G,YAAA,mBAApI,SACMw0G,EAAoC,cAACzuB,IAAA,EAAD,IAAvB,cAAC,IAAD,SAGvB,cAAC,IAAD,UACKuiK,GACG,qCAAE,cAACsS,IAAD,CAAW56P,YAAU,sBAArB,UACW,OAARsoP,QAAQ,IAARA,GAAA,UAAAA,EAAUqV,aAAV,eAAiBngO,WAAY,KAA7B,OAAmC8qN,QAAnC,IAAmCA,GAAnC,UAAmCA,EAAUqV,aAA7C,aAAmC,EAAiBjgO,YADzD,UAGI,sBAAM19B,YAAU,qBAAhB,SAAsC4f,KAAK,OAAC0oO,QAAD,IAACA,OAAD,EAACA,EAAU1c,aAAa5qN,OAAO,kCAQ9F,cAAC,IAAD,CAAsB1jB,MAAO,QAASy+C,IAAK,GAAIr3C,MAAO8gR,EAAQ,MAAWp8P,SAAU,SAAClF,GAAD,OAAOs8J,EAAY,CAAE,MAASt8J,EAAEgwB,OAAOxvC,SAAUkmD,WAAW,EAAM/7B,QAAS42P,EAAe9hO,QAtCxJ,WACrB2kM,GAAYk9B,EAAQ,OAAaD,EAAc,OAACj9B,QAAD,IAACA,OAAD,EAACA,EAAUhqP,GAAG7P,WAAd,aAAC,gBACzC65P,GADwC,IAE3CtlP,MAAOwiR,EAAQ,SAChBr7P,MAAK,WACJs7P,IACAroB,EAAuB,qCAgC6Kr6P,SAAS,SAAS+2Q,WAAY4L,OC5C/NC,QAhBf,YAA4F,IAAhE92P,EAA+D,EAA/DA,QAAS9rB,EAAsD,EAAtDA,SAEjC,OAAO,cAAC,GAAD,CACH8rB,QAAS,aACTvxB,MAAO,IACPyF,SAAUA,EACV8uJ,WAAW,EAJR,SAMH,eAACmrH,IAAD,CAAWh9Q,YAAU,aAArB,UACI,cAAC,IAAD,CAAaA,YAAU,eAAvB,qCACA,cAACi9Q,IAAD,CAAWj9Q,YAAU,aAArB,yPACA,cAAC,IAAD,CAAQN,QAAQ,UAAUpG,OAAQu1B,EAAS9rB,SAAS,gBAApD,0BCkUG6iR,IC/UAA,ID4Bf,WAAyB,IAAD,EACZ9nH,EAAuCh7B,cAAvCg7B,WACF+nH,EAAcjG,MACdC,EAAqB7hH,KACrB8nH,EAAgBjF,MAChB7jB,EAAoBn/F,KACpBltJ,EAAcnQ,cACdulR,EnvByEH,WACH,IAAMp3R,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OACInvK,EAAKG,KAAL,oBAAuBgvK,EAAvB,0BAAsDluK,GAAW,KACrE,CAACjB,ImvB9EoBq3R,GACnBC,EnvBkGH,WACH,IAAMt3R,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OACInvK,EAAKG,KAAL,oBAAuBgvK,EAAvB,eAA2CluK,GAAW,KAC1D,CAACjB,ImvBvGoBu3R,GARL,EASgClkQ,qBAThC,mBASbw4P,EATa,KASOgB,EATP,KAUd+J,EAAiBnF,MACjBj1K,EAA8BvzF,eAXhB,EAY+BokQ,MAA3C7+O,EAZY,EAYZA,SAAUq/O,EAZE,EAYFA,YAAaD,EAZX,EAYWA,gBACzBhtR,EAAQ+gC,aAAaC,QAAQ,SAbf,EAcgBvO,oBAAS,GAdzB,mBAcbqwK,EAda,KAcD8zF,EAdC,KAepBh+O,YAAiB,eACjB,IAAMk1N,EAAY/sO,aAAaC,QAAQ,aAhBnB,EAkBoBvO,oBAAkB,GAlBtC,mBAkBbg+O,EAlBa,KAkBCC,EAlBD,OAmBgBj+O,oBAAkB,GAnBlC,mBAmBbokQ,EAnBa,KAmBAC,EAnBA,OAoBwBrkQ,oBAAkB,GApB1C,mBAoBbm/P,EApBa,KAoBGmF,EApBH,OAqBgBtkQ,oBAAkB,GArBlC,mBAqBbukQ,EArBa,KAqBDC,EArBC,OAsBkBxkQ,qBAtBlB,mBAsBbi/P,EAtBa,KAsBAwF,GAtBA,KAuBdhwQ,GAAUW,cACVgmP,GAAyBf,MAxBX,GA0BsBr6O,oBAAkB,GA1BxC,qBA0Bb0kQ,GA1Ba,MA0BEC,GA1BF,MA2BdlgR,GAAU0R,YAAY3R,MACtBogR,GnvBuGH,WACH,IAAMj4R,EAAOC,eACb,OAAOC,uBACH,gBAAEivK,EAAF,EAAEA,WAAF,OACInvK,EAAKG,KAAL,oBAAuBgvK,EAAvB,iBAA6CluK,GAAW,KAC5D,CAACjB,ImvB5GqBk4R,GA5BN,GA6B0B7kQ,mBAA8B,IAAM,MA7B9D,qBA6Bb8kQ,GA7Ba,MA6BIC,GA7BJ,SAmCkB3H,MAAxB92B,GAnCM,GAmCZt3P,KAAgBuV,GAnCJ,GAmCIA,UAExB4b,qBAAU,WACQ,SAAdk7O,GAAwBspB,IAAiB,KAC1C,CAACtpB,IAEJ,IAAMslB,GAAU7lQ,mBAAQ,WACpB,OAAe,OAARwrO,SAAQ,IAARA,QAAA,EAAAA,GAAUqV,MAAMr/P,OAAhB,OAAuBmI,SAAvB,IAAuBA,QAAvB,EAAuBA,GAASnI,MACxC,QAACmI,SAAD,IAACA,QAAD,EAACA,GAASnI,GAAV,OAAcgqP,SAAd,IAAcA,QAAd,EAAcA,GAAUqV,MAAMr/P,KAEjC6jB,qBAAU,YACDokQ,IAAe,OAAC9/Q,SAAD,IAACA,QAAD,EAACA,GAASnI,MAAO,OAACgqP,SAAD,IAACA,QAAD,EAACA,GAAUqV,MAAMr/P,MAAa,OAAPmI,SAAO,IAAPA,QAAA,EAAAA,GAASnI,OAAT,OAAgBgqP,SAAhB,IAAgBA,QAAhB,EAAgBA,GAAUqV,MAAMr/P,MACxF8+P,GAAuB,kCACvBopB,GAAc,MAEnB,CAAC7D,GAASvlB,GAAV,OAAkC32P,SAAlC,IAAkCA,QAAlC,EAAkCA,GAASnI,GAA3C,OAA+CgqP,SAA/C,IAA+CA,QAA/C,EAA+CA,GAAUqV,MAAMr/P,GAAIioR,IAEtE,IAAMS,GAAalqQ,mBAAQ,WACvB,SAAQ,OAACmkQ,QAAD,IAACA,OAAD,EAACA,EAAazvQ,UACvB,CACCyvQ,IAGEgG,GAAap4R,uBAAY,WAC3BgxR,EAAmB,CAAE/hH,eAAc3zI,MAAK,SAAC3qB,GACjCA,IACAinR,GAAejnR,GACXA,EAAQgS,QAA+C,UAArChS,EAAQA,EAAQgS,OAAS,GAAG3X,MAC9CwsR,GAAa,GACbpmB,GAAgB,IAEhBomB,GAAa,SAI1B,CAACvoH,EAAYuoH,EAAcxG,IAE9B19P,qBAAU,WACNikQ,GAAehpB,GAAuB,oCAEvC,CAACgpB,IAEJ,IAAMc,GAAUpqQ,mBAAQ,WAAO,IAAD,IAC1B,OAAO/X,aAAW,OAAC0B,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,OAASwS,aAAkB,OAAC2B,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,QAC9E,QAACmU,SAAD,IAACA,IAAD,UAACA,GAAS5T,YAAV,aAAC,EAAeP,OAEnB6vB,qBAAU,WACN0jQ,EAAY,CAAE/nH,eACdmpH,OAED,CAACnpH,EAAY+nH,IAEhB,IAkBMsB,GAAwBt4R,uBAAY,YAC9B,OAARy5P,SAAQ,IAARA,QAAA,EAAAA,GAAUhqP,KAAMynR,EAAiB,CAAEjoH,WAAYwqF,GAAShqP,GAAG7P,aAC3D2uQ,GAAuB,8BAExB,CAACoe,EAAuBuK,EAAkBz9B,GAAU33O,IAMjDuwQ,GAAgBryR,uBAAY,SAACu4R,GAC/Bd,GAAkB,GACTlpB,GAATgqB,EAAgC,kCAA2D,iCACnF,OAAR9+B,SAAQ,IAARA,QAAA,EAAAA,GAAUhqP,KAAMsoR,GAAkB,CAAE9oH,WAAYwqF,GAAShqP,GAAG7P,aAAc07B,MAAK,WAC3E88P,KACAhnB,GAAgB,GAChBqmB,GAAkB,QAGvB,QAACh+B,SAAD,IAACA,QAAD,EAACA,GAAUhqP,GAAIsoR,KAEZS,GAAmBx4R,uBACrB,WACIs8G,EAA4B,CACxB7+D,WAAY,kBACZ/E,YACI,yHACJiF,kBAAmB,QACnBC,iBAAkB,SAClBC,UAAW,YACC,OAAR47M,SAAQ,IAARA,QAAA,EAAAA,GAAUhqP,KAAM2nR,EAAiB,CAAEnoH,WAAYwqF,GAAShqP,GAAG7P,aAAc07B,MAAK,WAC1E88P,KACA7pB,GAAuB,6BAG/Br6P,SAAU,qBAIlB,CAACooG,EAA6B86K,EAAkB39B,GAAUu9B,IAG9D1jQ,qBAAU,WACN,GAAiB,WAAbgb,GAAyB2gI,GAAc6kH,GACvCpzR,GAASitR,EAAY,CAAE1jO,MAAO,eAAgB9nD,KAAMzB,SAEpD,IACI,IAAM+3R,EAAiB92P,KAAKC,MAAM0M,GAOlC,GAN4B,SAAxBmqP,EAAeztR,MACf2iR,EAAY,CACR,MAAS,QACT,KAAO,YAAP,OAAoB1+G,KAGA,qBAAxBwpH,EAAeztR,KAA6B,CAC5C,IAAM0tR,EAAWD,EAAet2R,KACV,iBAAlBu2R,EAAS1tR,MACTomQ,GAAiBsnB,EAAS/C,YAER,iBAAlB+C,EAAS1tR,MAA2B0tR,EAAS/C,YAC7CpnB,GAAuB,oCAEL,UAAlBmqB,EAAS1tR,OACTwsR,GAAa,GACbpmB,GAAgB,IAEpBwmB,IAAe,SAAC1jO,GACZ,IAAMykO,EAAmB,aAAQzkO,GAAa,IAExC0kO,EAAoB1kO,EAAYA,EAAU0nB,WAAU,SAACx4D,GACvD,OAAOA,EAAK3T,KAAOipR,EAASjpR,OAC1B,EAMN,OAL2B,IAAvBmpR,EACAD,EAAoBC,GAAqBF,EAEzCC,EAAoBlxQ,KAAKixQ,GAEtBC,MAIjB,MAAOtjQ,OAGd,CAACiZ,EAAU5tC,EAAOuuK,EAAY2oH,GAAgBJ,EAAcpmB,EAAiB0iB,KAEhFxgQ,qBAAU,WACN,OAAO,WACH2jQ,IACAvJ,OAGL,IAEH,IAgCMmL,GAAgB,WAClBvB,GAAc,GACdY,GAAmB,MACnBvL,OAAsB5rR,IAG1B,OAAO,eAAC,GAAD,CAAau4H,SAAS,cAAc0E,aAAa,EAAO9pH,SAAS,WAAWgqH,YAAU,EAAC9B,eAAe,MAAMj/E,aAAa,MAAzH,UACH,eAAC,IAAD,WACI,cAAC,IAAD,CAAgBwoE,YAAamuK,IAAW3iB,GAAgB3tE,IACxD,eAACsqF,IAAD,WACI,eAACC,IAAD,CAAkBC,WAAYt2Q,IAAao8Q,GAA3C,UACI,cAAC,IAAD,CAAcnI,mBAAoBA,EAAoBwK,OAAM,6BAAO18B,IAAaw+B,IAAmBz0F,WAAYA,EAAY1tK,aAnNtH,SAACoL,EAA4BrrB,GAC9CqiR,GAAmB,6BAAKD,IAAN,mBAAwB/2P,EAAMrrB,QAmNnC4jP,IAAY,cAAC,IAAD,UAELj2D,EACI,qCACI,cAAC,IAAD,CAAQ/0L,MAAM,QAAQhE,OAhDlC,WAChB,GAAIwtR,GAAiB,CACjB,IAAM7gE,EAA+B,GACrCk1D,IAAsB1mQ,SAAQ,SAACxC,GAAU,IAAD,EACgB,MAAhD,uCAAKq2O,IAAaw+B,WAAlB,eAAsC70Q,KACtCg0M,EAAI3vM,KAAKrE,OAGjB,OAAIg0M,QAAJ,IAAIA,OAAJ,EAAIA,EAAKz0M,SACLgqQ,GAAyB,OAAHv1D,QAAG,IAAHA,OAAA,EAAAA,EAAKz0M,QAASy0M,OAAMr2N,GAC1C+gB,EAAY,0CAA2C,WAEvD6qQ,OAAsB5rR,GAEtBk3R,IAAmB5rP,OAAO6pB,QAAQ+hO,IAAiBryQ,SAAQ,YAAmB,IAAD,mBAAhBsb,EAAgB,KACzE,GADyE,OAC3DkrP,IAAoBlrP,GAA0C,CACxE,IAAM+rP,EAAQZ,IAAUnrP,GACxB+rP,GAAS1e,GAAuB,mBAAD,OAAoB0e,EAApB,iBAIvCyJ,EAAc,OAACj9B,SAAD,IAACA,QAAD,EAACA,GAAUhqP,GAAX,aAAC,gBAAmBgqP,IAAaw+B,IAAmBA,GAAiBE,GAAa,eAAYp3R,GAAWu6B,MAAK,WACxHu9P,QAEJtqB,GAAuB,gCACvB4pB,IAAc5pB,GAAuB,wCAAyC,CAACslB,eAAgBxnP,OAAOj9B,OAAO6oR,IAAiB/0R,KAAK,IAAIyf,eAG3Ik2Q,MAoBmE3kR,SAAS,cAApD,kBAGA,cAAC,IAAD,CAAQA,SAAS,gBAAgBzF,MAAM,QAAQoC,QAAQ,UAAUpG,OAAQ,WAAO8jQ,GAAuB,kCAAmCsqB,MAA1I,uBAIJ,sCACMV,IACE,cAAC,IAAD,CAAQ1pR,MAAM,QAAQhE,OAAQ6tR,GAAuBpkR,SAAS,kBAA9D,+BAIJ,cAAC,IAAD,CAAQA,SAAS,sBAAsBzF,MAAM,QAAQmF,SAAUu9P,GAAgBomB,EAAa1mR,QAAQ,UAAUpG,OAAQ,WAAO8jQ,GAAuB,gCAAiC+oB,GAAc,IAAnM,0BAGCa,IACG,cAAC,GAAD,CAAcxyK,WAAYwrJ,GAAgBomB,EAAazyK,YAAa,IAAKY,UAAW,eAAgBF,UAAU,EAAOtxG,SAAS,gBAAgB6wG,WAAY,EAAG3xG,OAAQ,cAACi8Q,IAAD,CAAkBz7Q,SAAUu9P,GAAgBomB,EAAarjR,SAAS,uBAAuBzF,MAAM,OAAOoC,QAAQ,UAA9G,SAAwH,cAAC,GAAD,CAAMvC,UAAU,WAAW4F,SAAS,gBAAjU,SACI,cAAC,GAAD,CAAYA,SAAS,eAAeE,QA1JtD,WAClBokR,MAyJgGlnN,aAAa,EAAzE,6BAS5B,cAAC,IAAD,CAAkB08M,WAAYt2Q,IAAao8Q,GAA3C,SACI,cAAC,IAAD,CAAcnuK,WAAYwrJ,GAAgBomB,GAAe/zF,EAAY2tE,aAAcA,EAAcihB,YAAaA,EAAaC,cAAeA,GAAeC,eAAgBA,SAGhL74B,KAAaq6B,IAAW,eAAC,IAAD,YAEhBuE,IAAW,qCACR,cAACnL,IAAD,CAAUh5Q,SAAS,cACnB,cAAC,IAAD,CAAU/C,YAAU,YAApB,qFAKJknR,IACA,cAAC,IAAD,CAAQ5tR,OAzMA,WACpBgvP,IAAY0U,EAAkB,CAC1Bl/F,WAAYwqF,GAAShqP,GAAG7P,WACxBuU,MAAO+sI,GAAyBu4G,GAAStlP,SAC1CmnB,MAAK,SAACm+N,GACL8U,GAAuB,6BACvBzsP,EAAY,+BAAgC,WAC5C8F,GAAQjoB,QAAR,UAAmBpG,IAAO0F,UAAUjD,OAAO2D,QACvC,cACA85P,EAAShqP,GAAG7P,cAEF,OAAd4uQ,GAAsB/sO,aAAaI,QAC/B,YACA,YA4LqCpzB,MAAM,QAAQyF,SAAS,mBAAxD,qCAOR2jR,IAAiB,cAAC,IAAD,CAAmB3jR,SAAS,sBAAsB8rB,QAAS,WACxE83P,IAAiB,GACjBvpB,GAAuB,8BACvB9sO,aAAaI,QACT,YACA,gBE1TdkgE,IAAKhyE,EAAQ,IAyDJ+oQ,IAvDO,WAAO,IAAD,EAClBlxQ,EAAwBW,cACxB/C,EAAI,UAAGoC,EAAQE,SAAShW,aAApB,aAAG,EAAwB0T,KAC/B1D,EAAcnQ,cACdonR,EAAuB74R,cACvB6rD,EAAamrD,KAKb8hL,EAA4Bh5R,uBAAY,WAC1C4nB,EAAQH,KAAKluB,IAAOE,WAAWC,SAChC,CAACkuB,IAoCJ,OAbA0L,qBAAU,WAAO,IAAD,EACN2lQ,EAAOtoP,OAAO7oB,SAASmxQ,KACvBC,EAAW,UAAGn3L,IAAGngE,MAAMq3P,GAAME,oBAAlB,QAAkC,KAC/CD,EAxBkB,SAACA,EAAkBntO,GACzCgtO,EAAqB,CAAEr4R,MAAOw4R,IACzB59P,MAAK,SAACgT,GACH,IAAM7lC,EAAO6lC,EAAS7lC,KACtBgjD,aAAahjD,EAAM6lC,EAAS5tC,OAC5BorD,aACIlkC,EACAmkC,EACAtjD,EACA6lC,EAAS5tC,MACT8kB,MAIPgW,OAAM,WACH1Z,EAAY,4DAAmD,SAC/Dk3Q,OASJI,CAAkBF,EAAantO,IAE/BjqC,EAAY,4DAAmD,SAC/Dk3Q,OAEL,CAACA,EAA2BjtO,IAE/BzS,YAAiB,kBAGb,cAAC01D,EAAA,EAAD,CAAkBzqD,aAAc,IAAKF,mBAAoB,IAAzD,SACI,2BCqYGg1O,IAjXO,WAAO,IAAD,EACc1xQ,cAAhCK,EADkB,EAClBA,aAAcC,EADI,EACJA,cACdxf,EAAO6gB,YAAY3R,KAAiBgrB,WACpCg0G,EAAcrtH,YAAYotH,GAAgB/zG,WAC1C7a,EAAWC,cACX1W,EAAWO,cACX29D,EAA8BC,eAC9B8pN,EAAuBjtP,OAAOtrB,KAAKxnB,IAAO6E,mBA2ChD,OAzCAk1B,qBAAU,WACN,GACIqjH,EAAYz1G,MAAQ8M,KAAajxC,MAAM0G,MACvCkzI,EAAYz1G,MAAQ8M,KAAanxC,SAAS4G,KAC5C,CACE,IAAM81R,EACF5iJ,EAAYz1G,MAAQ8M,KAAajxC,MAAM0G,KACjCuqC,KAAajxC,MAAM0G,KACnBuqC,KAAanxC,SAAS4G,KAChC4N,EAASoxD,aAAwB82N,EAAS5iJ,EAAYp3I,SCzGjC,IAAC8sD,EAAkBne,ED6GvCpmB,EAASukC,SAAS3qC,SAASssB,KAAa9wC,QAAQuG,OAChDqkB,EAASukC,SAAS3qC,SAASssB,KAAajxC,MAAM0G,OAE/C4N,EAASsxD,gBChHatW,EDmHHvkC,EAASukC,UCnHYne,EDmHtB,OAAoByoG,QAApB,IAAoBA,OAApB,EAAoBA,EAAazoG,cClH1CvrB,QAIVurB,EAAarpB,MAAK,SAACzB,GAAD,OAAkBipC,EAAS3qC,SAAS0B,OD+GrD/R,EAASkxD,kBAGd,CAAClxD,EAAUyW,EAASukC,WAEvB/4B,qBAAU,YExHwB,WAIlC,IAHA,IAAI03B,EAAS,GACPwuO,EAAQ,oBAEd,MAA2BntP,OAAO6pB,QAAQ/jD,KAA1C,eAAmD,CAAC,IAAD,sBAAvC+uB,EAAuC,KAAlCrrB,EAAkC,KAC/Cm1C,GAAM,eAAY9pB,EAAZ,aAAoBrrB,EAApB,QAGV,IAAM4jR,EAAW,iBAAazuO,EAAb,KAEX0uO,EAAQ1oP,SAASwmD,eAAegiM,GAChCv2E,EAAOjyK,SAASiyK,KAEtB,GAAIy2E,EACAA,EAAM72E,UAAY42E,MACf,CACH,IAAM9lR,EAAQq9B,SAASC,cAAc,SAErCt9B,EAAMlE,GAAK+pR,EACX7lR,EAAMkvM,UAAY42E,EAClBx2E,EAAK02E,QAAQhmR,IFqGbimR,KACD,IAEHtmQ,qBAAU,YACE,OAAJ7qB,QAAI,IAAJA,OAAA,EAAAA,EAAMgH,OAAM,OAAChH,QAAD,IAACA,OAAD,EAACA,EAAM4wG,sBACnB9pC,EAA4B,CAAE9mE,SAAQ,KAG3C,QAACA,QAAD,IAACA,OAAD,EAACA,EAAMgH,GAAI8/D,IAGdj8C,qBAAU,WACN2Y,KAAQ4f,IAAI6X,KAAYC,YAAaptD,KAAc,cACpD,IAGC,gCACI,cAAC,IAAD,IACA,cAAC,GAAD,IACA,eAAC,IAAD,CAAQuR,SAAUE,EAAlB,UACI,cAAC,GAAD,CACItoB,KAAMnG,IAAOE,WAAWC,MACxB8mI,OAAK,EACLjhC,UAAWqY,KAEf,cAAC,GAAD,CACIl4G,KAAMnG,IAAOE,WAAWE,eACxB6mI,OAAK,EACLjhC,UAAW0Z,KAEf,cAAC,GAAD,CACIv5G,KAAMnG,IAAOE,WAAWG,eACxB4mI,OAAK,EACLjhC,UAAWu5L,MAEf,cAAC,GAAD,CACIp5R,KAAMnG,IAAOE,WAAWI,oBACxB2mI,OAAK,EACLjhC,UAAW2rI,MAEf,cAAC,GAAD,CACIxrO,KAAMnG,IAAOE,WAAWK,qBACxB0mI,OAAK,EACLjhC,UAAW+vI,MAEf,cAAC,IAAD,CACI5vO,KAAMnG,IAAOE,WAAWQ,cACxBumI,OAAK,EACLjhC,UAAWy+H,KAEf,cAAC,IAAD,CAAOt+N,KAAMnG,IAAOE,WAAWS,OAAQqlG,UAAWs6L,KAClD,cAAC,IAAD,CAAOn6R,KAAMnG,IAAOE,WAAWU,SAAUolG,UAAWu6L,cACpD,cAAC,IAAD,CACIp6R,KAAMnG,IAAOE,WAAWW,aACxBmlG,UAAWw6L,kBAEf,cAAC,IAAD,CACIr6R,KAAMnG,IAAOE,WAAWa,gBACxBkmI,OAAK,EACLjhC,UAAWy6L,KAEf,cAAC,IAAD,CACIt6R,KAAMnG,IAAOE,WAAWY,eACxBmmI,OAAK,EACLjhC,UAAW06L,KAEf,cAAC,IAAD,CACIv6R,KAAMnG,IAAOE,WAAWc,WACxBglG,UAAW8hK,MAEf,cAAC,IAAD,CACI3hQ,KAAMnG,IAAOE,WAAWe,eACxB+kG,UAAWqiK,MAEf,cAAC,IAAD,CACIliQ,KAAMnG,IAAOE,WAAWO,kBACxBulG,UAAWojK,MAEf,cAAC,IAAD,CACIjjQ,KAAMnG,IAAOE,WAAWgB,eACxB8kG,UAAW26L,MAEf,cAAC,IAAD,CAAOx6R,KAAMnG,IAAOC,QAASgnI,OAAK,EAACjhC,UAAWgnC,KAC9C,cAAC,IAAD,CAAO7mI,KAAMnG,IAAO0E,QAASuiI,OAAK,EAACjhC,UAAW2vG,KAC9C,cAAC,IAAD,CAAOxvM,KAAMnG,IAAOyE,MAAOwiI,OAAK,EAACjhC,UAAWsvG,KAC5C,cAAC,IAAD,CAAOnvM,KAAMnG,IAAOwE,QAASyiI,OAAK,EAACjhC,UAAWwvG,KAC9C,cAAC,IAAD,CAAOrvM,KAAMnG,IAAO2E,OAAQsiI,OAAK,EAACjhC,UAAW46L,KAC7C,cAAC,IAAD,CACIz6R,KAAMnG,IAAO4E,mBACbohG,UAAWk+J,MAEf,cAAC,GAAD,CAAc/9P,KAAMnG,IAAOgC,SAAUgkG,UAAWstD,KAChD,cAAC,GAAD,CAAcntJ,KAAMnG,IAAOmB,QAAS6kG,UAAWogC,KAC/C,cAAC,GAAD,CACIjgI,KAAMnG,IAAOE,WAAWM,6BACxBymI,OAAK,EACLjhC,UAAW+vI,MAEf,cAAC,GAAD,CACI5vO,KAAMnG,IAAOuB,kBACbykG,UAAWirI,MAEf,cAAC,GAAD,CACI9qO,KAAMnG,IAAOwB,6BACbwkG,UAAW09I,MAEf,cAAC,GAAD,CACIv9O,KAAMnG,IAAOqC,YACb4kI,OAAK,EACLjhC,UAAW6vH,KAEf,cAAC,GAAD,CACI1vN,KAAMnG,IAAOsC,oBAAoBC,eAAeC,IAChDykI,OAAK,EACLjhC,UAAW8vH,KAEf,cAAC,GAAD,CACI3vN,KAAMnG,IAAOsC,oBAAoBC,eAAeE,OAChDwkI,OAAK,EACLjhC,UAAW++J,MAEf,cAAC,GAAD,CACI5+P,KAAMnG,IAAOsC,oBAAoBC,eAAeG,WAChDukI,OAAK,EACLjhC,UAAW6oK,MAEf,cAAC,GAAD,CACI1oQ,KAAMnG,IAAOsC,oBAAoBK,WAAWH,IAC5CykI,OAAK,EACLjhC,UAAWqrH,KAEf,cAAC,GAAD,CACIlrN,KAAMnG,IAAOsC,oBAAoBK,WAAWF,OAC5CwkI,OAAK,EACLjhC,UAAWq7H,KAEf,cAAC,GAAD,CACIl7N,KAAMnG,IAAOsC,oBAAoBK,WAAWD,WAC5CukI,OAAK,EACLjhC,UAAW+oK,MAEf,cAAC,GAAD,CAAc5oQ,KAAMnG,IAAO4C,QAASojG,UAAWovG,KAC/C,cAAC,GAAD,CACIjvM,KAAMnG,IAAOkD,YACb8iG,UAAWk2I,MAEf,cAAC,GAAD,CACI/1O,KAAMnG,IAAOkE,MACb+iI,OAAK,EACLjhC,UAAWo6G,KAEf,cAAC,GAAD,CACIj6M,KAAMnG,IAAOiE,gBADjB,SAGI,cAAC,IAAD,MAEJ,cAAC,GAAD,CACIkC,KAAMnG,IAAOoE,iBACb4hG,UAAWiiI,KAEf,cAAC,GAAD,CACI9hO,KAAMnG,IAAOqE,uBACb4iI,OAAK,EACLjhC,UAAWiiI,GACX/mH,UAAW,CAAEzvG,KAAM,gBAEvB,cAAC,GAAD,CACItL,KAAMnG,IAAOmE,iBACb6hG,UAAW42G,KAEf,cAAC,GAAD,CACIz2M,KAAMnG,IAAOuE,OACbyhG,UAAWy5I,MAEf,cAAC,GAAD,CAAct5O,KAAMnG,IAAOyD,YAAYC,cAAeujI,OAAK,EAA3D,SACI,cAAC,IAAD,MAEJ,cAAC,GAAD,CAAc9gI,KAAMnG,IAAOyD,YAAYE,QAASsjI,OAAK,EAArD,SACI,cAAC,IAAD,MAEJ,cAAC,GAAD,CACI9gI,KAAMnG,IAAOyD,YAAYH,SACzB0iG,UAAW66L,MAEf,cAAC,GAAD,CACI16R,KAAMnG,IAAO+D,iBADjB,SAGI,cAAC,IAAD,MAEHg8R,EAAqBroR,KAAI,SAAAiwB,GAAG,OACzB,cAAC,GAAD,CACIxhC,KAAMnG,IAAO6E,kBAAkB8iC,GADnC,SAGI,cAAC,IAAD,CAAUub,GAAI,CAAE4P,SAAU9yD,IAAOqC,oBAGzC,cAAC,GAAD,CACI8D,KAAMnG,IAAOmF,QAAQC,gBACrB6hI,OAAK,EACLjhC,UAAWsrK,MAEf,cAAC,GAAD,CACInrQ,KAAMnG,IAAO0F,UAAUC,kBACvBshI,OAAK,EACLjhC,UAAW0uK,MAEf,cAAC,GAAD,CACIvuQ,KAAMnG,IAAO0F,UAAUjD,OACvBwkI,OAAK,EACLjhC,UAAWw3L,MAEf,cAAC,GAAD,CACIr3R,KAAMnG,IAAOmF,QAAQE,2BACrB2gG,UAAW86L,MAEf,cAAC,GAAD,CACI36R,KAAMnG,IAAOmF,QAAQG,qBACrB0gG,UAAW+6L,MAEf,cAAC,GAAD,CACI56R,KAAMnG,IAAOmF,QAAQI,4BACrBygG,UAAWg7L,MAEf,cAAC,GAAD,CACI76R,KAAMnG,IAAOmF,QAAQK,eACrBwgG,UAAW8pK,MAEf,cAAC,GAAD,CACI3pQ,KAAMnG,IAAOmF,QAAQM,qBACrBugG,UAAWi7L,MAEf,cAAC,GAAD,CAAcj7L,UAAW+iC,QAE7B,eAAC,IAAD,CAAQx6G,SAAUG,GAAiBD,EAAnC,UACI,cAAC,GAAD,CAActoB,KAAMnG,IAAO8B,aAAaC,SAAUklI,OAAK,EAAvD,SACI,cAAC,GAAD,CACI+gC,UAAWhoK,IAAOuE,OAClB0jK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAO6C,iBAAiBC,UAAUL,OACxCwkI,OAAK,EAFT,SAII,cAAC,GAAD,CACI+gC,UAAWhoK,IAAO6C,iBAAiBC,UAAUN,IAC7CylK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAO6C,iBAAiBF,WAAWF,OACzCwkI,OAAK,EAFT,SAII,cAAC,GAAD,CACI+gC,UAAWhoK,IAAO6C,iBAAiBF,WAAWH,IAC9CylK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAO6C,iBAAiBE,YAAYN,OAC1CwkI,OAAK,EAFT,SAII,cAAC,GAAD,CACI+gC,UAAWhoK,IAAO6C,iBAAiBE,YAAYP,IAC/CylK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAOyD,YAAYK,eAAe1B,mBACxC6kI,OAAK,EAFT,SAII,cAAC,IAAD,CACI+gC,UAAWhoK,IAAOwD,MAClBykK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAO6C,iBAAiBE,YAAYC,iBAC1CikI,OAAK,EAFT,SAII,cAAC,IAAD,CACI+gC,UAAWhoK,IAAO6C,iBAAiBE,YAAYP,IAC/CylK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAO6C,iBAAiBE,YAAYE,aAC1CgkI,OAAK,EAFT,SAII,cAAC,IAAD,CACI+gC,UAAWhoK,IAAOwD,MAClBykK,iBAAkBv5I,MAG1B,cAAC,GAAD,CAAcvoB,KAAMnG,IAAOyD,YAAYI,YAAvC,SACI,cAAC,IAAD,CACImkK,UAAWhoK,IAAOyD,YAAYC,cAC9BukK,iBAAkBv5I,MAG1B,cAAC,GAAD,CAAcvoB,KAAMnG,IAAOyD,YAAYG,SAAvC,SACI,cAACs9R,IAAD,CACIl5H,UAAWhoK,IAAOyD,YAAYC,cAC9BukK,iBAAkBv5I,MAG1B,cAAC,GAAD,CACIvoB,KAAMnG,IAAOgE,qBACbijI,OAAK,EAFT,SAII,cAAC,IAAD,CACI+gC,UAAWhoK,IAAOiE,gBAClBgkK,iBAAkBv5I,MAG1B,cAAC,GAAD,CAAcvoB,KAAMnG,IAAOyB,iBAAiBC,KAA5C,SACI,cAAC,IAAD,CACIsmK,UAAWhoK,IAAOqC,YAClB4lK,iBAAkBv5I,MAG1B,cAAC,GAAD,CAAcvoB,KAAMnG,IAAO0F,UAAUE,aAArC,SACI,cAAC,IAAD,CACIoiK,UAAWhoK,IAAO0F,UAAUC,kBAC5BsiK,iBAAkBv5I,SAI9B,cAACqlF,EAAA,EAAD,IACA,cAAC,IAAD,Q,WGjcCotL,IAAiC,CAC1CtoR,QAAS,CACLgoG,YAAa,QACbugL,WAAY,MACZpmP,aAAc,iBACdqmP,gBAAiB,iBACjBC,gBAAiB,sDACjBC,sBAAuB,iBACvBC,wBAAyB,iBACzBr2N,UAAW,GACXC,SAAU,GACVq2N,kBACI,wDACJC,sBAAuB,2BACvBC,iBAAkB,iBAClB3N,oBAAqB,iBACrB4N,eAAgB,2EAChB9mH,gBAAiB,oCAErB+mH,MAAO,CACH7mP,aAAa,WAAD,OAAa45B,cAAa,MAA1B,SACZysN,gBAAgB,WAAD,OAAazsN,cAAa,OACzC2sN,sBAAuB,yBACvBC,wBAAyB,yBACzBG,iBAAkB,YAClB3N,oBAAoB,SAAD,OAAWp/M,cAAa,OAC3CgtN,eAAgB,4EAEpBE,IAAK,CACD9mP,aAAa,WAAD,OAAa45B,cAAa,MAA1B,SACZysN,gBAAgB,WAAD,OAAazsN,cAAa,OACzC2sN,sBAAuB,mCACvBC,wBAAyB,oCACzBG,iBAAkB,YAClB3N,oBAAoB,SAAD,OAAWp/M,cAAa,OAC3CgtN,eAAgB,4EAEpBG,KAAM,CACF/mP,aAAc,sCACdqmP,gBAAiB,qCACjBE,sBAAuB,oCACvBC,wBAAyB,qCACzBC,kBACI,yDACJE,iBAAkB,YAClB3N,oBAAqB,kCACrB4N,eAAgB,4EAEpBI,KAAM,CACFhnP,aAAc,iCACdqmP,gBAAiB,gCACjBE,sBAAuB,+BACvBC,wBAAyB,gCACzBC,kBACI,yDACJE,iBAAkB,YAClB3N,oBAAqB,6BACrB4N,eAAgB,6EC3CjB,IAAMK,IAER,SAAC,GAAD,IAAGt5Q,EAAH,EAAGA,MAAOxO,EAAV,EAAUA,SAAV,OACD,mCACKwO,EAAM03B,UAAUvyB,QACb,SAACspF,EAAMvtF,EAAMyyJ,GAAb,OACI,cAACzyJ,EAAKknD,QAAQ2T,SAAd,CAAiCpoE,MAAOuN,EAAKvN,MAA7C,SACK86F,GADuBklE,KAIhCniK,M,wBCTL,SAAS+nR,IACZ7mP,GAEA,GAAIA,GAAWA,EAAQvtB,OACnB,OAAOutB,EAAQvtB,QACX,SAACnY,EAAQwsR,GAAT,OACIA,EAAO14R,OAAS04R,EAAO9qR,QAAvB,6BACW1B,GADX,mBACoBwsR,EAAO14R,MAAQ04R,EAAO9qR,UACpC1B,IACV,ICZL,IAAMysR,IAAb,WAGI,WAAYnlO,GAA8B,0BAFzBA,aAEwB,EACrCrqB,KAAKqqB,QAAUA,EAJvB,4CAOI,SACIniB,EACA30C,EACAyC,EACA4uE,EACA6qN,EACAC,GACa,IAAD,OACZ,OAAOphM,MAAM,CACTpmD,OAAQA,EACR08B,aAAcA,EACdrgC,IAAKvE,KAAKqqB,QAAQzK,WAAW+vO,YAAY,CACrCp8R,OACAk8R,OACAh5R,MAAOi5R,EAAc15R,OAAOpB,IAEhCoB,KAAMA,EACNqyC,QAASrI,KAAKsI,oBAEbnZ,MAAK,SAACgT,GACH,OAAIyiC,EACOziC,EAEAA,EAASnsC,QAGvBq5B,OAAM,SAAC5rB,GACJ,IAAImsR,EACJ,GAAInsR,EAAM0+B,SAAU,CAChB,IAAI19B,EAAU,GACd,OAAQhB,EAAM0+B,SAASvsC,QACnB,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACD6O,EAAUhB,EAAM0+B,SAASnsC,KAAKyO,QAC9B,MACJ,QACIA,EAAU,mBAElBmrR,EAAc,CACVxyR,KAAMqG,EAAM0+B,SAASvsC,OACrB6O,UACA+jC,UAAW/kC,EAAM0+B,SAASnsC,KACpByN,EAAM0+B,SAASnsC,KAAKoH,KACpB,EACNqrC,QAAShlC,EAAM0+B,SAASnsC,KAAKyyC,QAC7BonP,WAAYP,IACR7rR,EAAM0+B,SAASnsC,KAAKyyC,eAI5BmnP,EADOnsR,EAAMukC,QACC,CACV5qC,KAAM,EACNqH,QAAS,kCAGC,CACVrH,KAAM,EACNqH,QAAS,oBAIjB,MADA,EAAK4lD,QAAQY,QAAQ2kO,GACfA,OAxEtB,iBA4EI,SACIr8R,EACAyC,EACA4uE,EACA6qN,GAEA,OAAOzvP,KAAKgI,QAAQ,MAAOz0C,EAAMyC,EAAM4uE,EAAc6qN,GAAM,KAlFnE,kBAqFI,SAAKl8R,EAAcyC,EAAYy5R,GAC3B,OAAOzvP,KAAKgI,QAAQ,OAAQz0C,EAAMyC,OAAMpB,EAAW66R,KAtF3D,oBAyFI,SAAOl8R,EAAcyC,EAAYy5R,GAC7B,OAAOzvP,KAAKgI,QAAQ,SAAUz0C,EAAMyC,OAAMpB,EAAW66R,KA1F7D,iBA6FI,SAAIl8R,EAAcyC,EAAWy5R,GACzB,OAAOzvP,KAAKgI,QAAQ,MAAOz0C,EAAMyC,OAAMpB,EAAW66R,KA9F1D,mBAiGI,SAAMl8R,EAAcyC,EAAWy5R,GAC3B,OAAOzvP,KAAKgI,QAAQ,QAASz0C,EAAMyC,OAAMpB,EAAW66R,KAlG5D,6BAqGI,WACI,IACIK,EAAS,CAAEhnP,OAAQ9I,KAAKqqB,QAAQ0lO,cAChCx7R,EAAQyrC,KAAKqqB,QAAQ2lO,WACrBrnP,EAAgBp0C,EAAQ,CAAEq0C,cAAe,OAASr0C,GAAU,GAChE,OAAO,0CAJW,CAAE,eAAgB,qBAM7Bo0C,GACAmnP,OA7Gf,KCQA,SAASG,IAAoB1rP,GACzB,OAAOqxD,YAAYrxD,GAGvB,SAAS2rP,IAAiB3rP,GACtB,IAAM4rP,EAAWF,IAAoB1rP,GAAK9tC,MACpCA,EAAsB,GAK5B,OAJAypC,OAAOtrB,KAAKu7Q,GAAUrrR,KAAI,SAAAiwB,GAEtB,OADAt+B,EAAMs+B,GASd,SACIA,EACArrB,GAEA,GAAI9E,MAAMC,QAAQ6E,GAAQ,CACtB,IAAM3G,EAAS2G,EAAMsN,QAAO,SAAAo5Q,GAAC,QAAMA,KACnC,OAAOrtR,EAAOyT,OAASzT,EAAO,QAAKnO,EAEvC,OAAO8U,EAjBU2mR,CAAet7P,EAAKo7P,EAASp7P,IACnCA,KAEJ,CACHwP,MACA9tC,SAmBD,SAAS65R,IAAsB/rP,GAClC,OAAO2rP,IAAiB3rP,GAAK9tC,MAO1B,SAAS85R,IACZhsP,EACAjtC,EACAoS,GACF,MAEoCumR,IAAoB1rP,GAAzCisP,EAFf,EAEUjsP,IAAgB9tC,EAF1B,EAE0BA,MACxBA,EAAMa,GAAQoS,EACd,IAAM+mR,EAAc76L,aAAan/F,GACjC,OAAO+5R,GAAaC,EAAW,WAAOA,GAAgB,IAGnD,SAASC,IAAoBnsP,EAAakuF,GAAW,IAAD,EACrBw9J,IAAoB1rP,GAAzCisP,EAD0C,EAC/CjsP,IAAgB9tC,EAD+B,EAC/BA,MACxBypC,OAAOtrB,KAAK69G,GAAK3tH,KAAI,SAAAiwB,GACjB,IAAMq7P,EAAI39J,EAAI19F,GAEd,OADAt+B,EAAMs+B,GAAoB,mBAANq7P,GAAgC,kBAANA,GAAmBA,EAAgBA,OAAZx7R,EAC9DmgC,KAEX,IAAM07P,EAAc76L,aAAan/F,GACjC,OAAO+5R,GAAaC,EAAW,WAAOA,GAAgB,IAYnD,SAASE,MACZ,OAAOnsP,OAAO7oB,SAAW6oB,OAAO7oB,SAASopB,KAAO,GCrF7C,IAAM6rP,IAAb,WAGI,WAAYvmO,GAAoC,0BAF/BA,aAE8B,EAC3CrqB,KAAKqqB,QAAUA,EAJvB,oDAOI,SAAgBwmO,GACZ,OAAOC,IAAS9wP,KAAKqqB,QAAQ0mO,eAAgBF,KARrD,2BAWI,SAAcA,GACV,OAAOC,IAAS9wP,KAAKqqB,QAAQ2mO,aAAcH,KAZnD,yBAeI,SAAYA,GAIR,OAAOC,IAHYD,EAAEpB,KACfzvP,KAAKqqB,QAAQ4mO,aACbjxP,KAAKqqB,QAAQ6mO,WACJ,aAAC,gBAAiBL,GAAlB,IAAqB9wO,UAAU,SAnBtD,KAuBA,SAAS+wO,IAASK,EAAiBN,GAC/B,IAAIt9R,EAAOs9R,EAAEt9R,MAAQ,GACrB,GAAIA,GAAQs9R,EAAEz9R,OACV,IAAK,IAAIkE,KAAQu5R,EAAEz9R,OACfG,EAAO69R,IAAa79R,EAAM+D,EAAMu5R,EAAEz9R,OAAOkE,IAGjD,IAAMyL,EAAW8tR,EAAE9wO,SACbsxO,IAAa,CAACF,EAAS59R,IACvB89R,IAAa,CAAC99R,IACpB,OAAOs9R,EAAEp6R,MAAQi6R,IAAoB3tR,EAAQ8tR,EAAEp6R,OAASsM,EAG5D,SAASquR,IAAa79R,EAAcmuE,EAAeh4D,GAC/C,OAAOojE,IAAEt5E,QAAQD,EAAV,WAAoBmuE,GAASh4D,GAGxC,SAAS2nR,IAAaC,GAKlB,OAJaA,EACRt6Q,QAAO,SAAAgyJ,GAAC,QAAMA,KACdlkK,KAAI,SAAAkkK,GAAC,OAAIl8F,IAAE3vC,KAAK6rI,EAAG,QACnBjyK,KAAK,KACM,I,sBCjDPw6R,IAGT,WAAYlnO,GAAkC,IAAD,iCAF5BA,aAE4B,OAI7CwsJ,cAAgB,WACZ,OAAO,EAAKxsJ,QAAQmnO,oBALqB,KAQ7C56E,SAAW,WACP,OAAO,EAAKvsJ,QAAQonO,eARpBzxP,KAAKqqB,QAAUA,GCTVqnO,IAAb,kDACqB3xP,QAAUzK,aAD/B,wCAGI,SAAIP,GACA,IAAM9d,EAAO+oB,KAAKD,QAAQxK,QAAQR,GAElC,OAAI9d,EACOue,KAAKC,MAAMxe,GAEX,OATnB,iBAaI,SAAI8d,EAAa/+B,GAEb,OADAgqC,KAAKD,QAAQrK,QAAQX,EAAKS,KAAKG,UAAU3/B,IAClCgqC,KAAKD,QAAQxK,QAAQR,KAfpC,mBAkBI,WACI,OAAOiL,KAAKD,QAAQjT,UAnB5B,oBAsBI,SAAOiI,GACH,OAAkC,OAA9BiL,KAAKD,QAAQxK,QAAQR,KACrBiL,KAAKD,QAAQE,WAAWlL,IACjB,OAzBnB,KCyBM48P,IAAkB,CACpBvkS,IAAOE,WAAWC,MAClBH,IAAOE,WAAWK,qBAAqB6F,QAAQ,eAAgB,IAC/DpG,IAAOE,WAAWY,eAClBd,IAAOE,WAAWG,gBAGtB,SAASmkS,MACLrpP,eACyBopP,IAAgBj5Q,MACrC,SAAA8oD,GAAK,OAAgD,IAA5Ch9B,OAAO7oB,SAASukC,SAAS7kC,QAAQmmD,QAG1Ch9B,OAAO7oB,SAASopB,KAAO33C,IAAOE,WAAWC,OC/B1C,IAAMskS,IAA2Bt7P,IAAM/tB,eAC1C,WACI,MAAM,IAAInF,MAAM,sBCAjB,IAAMyuR,IACTv7P,IAAM/tB,eAA2C,WAC7C,MAAM,IAAInF,MAAM,sBAGjB,SAAS0uR,MACZ,OAAO50Q,YAAY1U,qBAAWqpR,MCA3B,IAAME,IAA6Bz7P,IAAM/tB,eAC5C,WACI,MAAM,IAAInF,MAAM,sBAIjB,SAAS4uR,MACZ,OAAO90Q,YAAY1U,qBAAWupR,MC6G3B,SAASE,IACZ/zN,EACAz0D,GAEA,MAAO,CACHy0D,UACAz0D,SC/HYy0B,QACW,cAA7BqG,OAAO7oB,SAASw2Q,UAEe,UAA7B3tP,OAAO7oB,SAASw2Q,UAEhB3tP,OAAO7oB,SAASw2Q,SAASl2N,MACvB,2D,eCfOm2N,IAAkB,kBAClBC,IAA0B,0BAC1BC,IAA0B,0BCcvC,IC4CmE35N,I,ID5C7DttD,IAAuC,CACzCknR,UAAW,CACP1wO,KAAM,GACNt2C,WAAW,EACXwkD,OAAQ,KA2CDyiO,IAvCwD,WAGzC,IAF1B7sR,EAEyB,uDAFjB0F,IACR/M,EACyB,uCACzB,OAAQA,EAAOO,MACX,KAAKuzR,IACD,MAAO,CACHG,UAAU,6BACH5sR,EAAM4sR,WADJ,IAELhnR,WAAW,KAGvB,KAAK8mR,IACD,IAAMI,EAAkBn0R,EAAOtI,KAAK8O,KAAI,SAAC4tR,GAAD,MAAoB,CACxDhpR,MAAOgpR,EAASpvR,GAChBhM,KAAMo7R,EAASp7R,SAEnB,MAAO,CACHi7R,UAAW,CACP1wO,KAAM4wO,EACN1iO,OAAQ,GACRxkD,WAAW,IAGvB,KAAK+mR,IACD,MAAO,CACHC,UAAW,CACP1wO,KAAK,aAAKl8C,EAAM4sR,UAAU1wO,MAC1Bt2C,WAAW,EACXwkD,OAAQzxD,EAAOmF,QAG3B,QACI,OAAOkC,IEiDbgtR,IAAgCphL,GAClCY,GACI,CACIk/H,YAAa,CACTn5N,SAAU,GACVo5F,MAAO,KAGf,SAEJ,SAqISshL,IAAkBplQ,mBAC3BkkF,GAAkB,CAAEx8F,YAAa,UACjCm9F,GAAiB,CAAEn9F,YAAa,UAFLsY,EAnHsC,WAGnD,IAFd7nB,EAEa,uDAFLgtR,IACRr0R,EACa,uCACb,OAAQA,EAAOO,MACX,KAAKuN,GAAQyuH,gBACT,OAAO,6BACAl1H,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ2uH,wBACT,OAAO,6BACAp1H,GADP,IAEIuxO,QAAS54O,EAAOtI,KAChB4R,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ6uH,wBACT,OAAO,6BACAt1H,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQizH,2BACT,IAAM8rI,EAAe,aAAQxlQ,EAAMwxO,sBAAwB,IAErD07C,EAAoB1nB,EAAgB17L,WACtC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgB,UAQtC,OANIuzR,GAAqB,EACrB1nB,EAAgBp4J,OAAO8/K,EAAmB,GAE1C1nB,EAAgB7vP,KAAKhd,EAAOgB,QAGzB,6BACAqG,GADP,IAEIwxO,qBAAsBg0B,IAE9B,KAAK/+P,GAAQ8yH,gCACT,OAAO,6BACAv5H,GADP,IAEIwxO,qBACI74O,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOoB,QAAU,KAEhE,KAAK0M,GAAQi5H,0BACT,OAAO,gBACA1/H,GAEX,KAAKyG,GAAQk5H,4BACT,OAAO,6BACA3/H,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEPr7O,KAAMsI,EAAOtI,SAGzB,KAAKoW,GAAQo5H,4BACT,OAAO,6BACA7/H,GADP,IAEIlC,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQw5H,mBACT,IAAM0rC,EAAiB,aAAO3rK,EAAM0rO,YAAYn5N,UAChD,OAAO,6BACAvS,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEPn5N,SAAUxL,aACN4kK,EACAhzK,EAAOqnI,cAKvB,KAAKv5H,GAAQ45H,6BACT,OAAO,6BACArgI,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEPn5N,SAAU5Z,EAAOynI,cAI7B,KAAK35H,GAAQk6H,4BACT,OAAO,6BACA3gI,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEP//H,MAAO3rG,EAAM0rO,YAAYn5N,aAIrC,KAAK9L,GAAQ85H,6BACT,OAAO,6BACAvgI,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEPn5N,SAAUvS,EAAM0rO,YAAY//H,OAAS,OAIjD,KAAKllG,GAAQg6H,oCACT,OAAO,6BACAzgI,GADP,IAEI0rO,YAAY,6BACL1rO,EAAM0rO,aADF,IAEPn5N,SAAU,OAItB,QACI,OAAOvS,MASbmtR,IAAuBvhL,GACzB,CACIv7G,UAAMpB,EACNqkB,eAAgB,GAChBm+H,cAAe,GACf+7F,iBAAav+O,EACbgT,SAAS,EACT+xO,kBAAc/kP,GAElB,YA2RSm+R,IAAkBvlQ,mBAC3BkkF,GAAkB,CAAEx8F,YAAa,aADNsY,EAhQqC,WAG/C,IAFjB7nB,EAEgB,uDAFRmtR,IACRx0R,EACgB,uCAChB,OAAQA,EAAOO,MACX,KAAKuN,GAAQgwH,yBACT,OAAO,6BACAz2H,GADP,IAEIiC,SAAS,IAGjB,KAAKwE,GAAQiwH,2BACT,OAAO,6BACA12H,GADP,IAEI3P,KAAMsI,EAAOtI,KACb4R,SAAS,IAGjB,KAAKwE,GAAQmwH,2BACT,OAAO,6BACA52H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQ6xH,2BACT,OAAO,6BACAt4H,GADP,IAEIiC,SAAS,EACTurO,YAAa70O,EAAOurD,OAG5B,KAAKz9C,GAAQmuH,yBACT,OAAO,6BACA50H,GADP,IAEIg0O,aAAct6H,GAAiBzsE,cAGvC,KAAKxmC,GAAQquH,2BACT,IAAM5wE,EAAY,gBAAQlkD,EAAM3P,MAEhC,OADA6zD,EAAKy1H,WAAY,IAAIt7J,MAAOgvQ,cACrB,6BACArtR,GADP,IAEI3P,KAAK,gBACE6zD,GAEP8vL,aAAct6H,GAAiB5uH,UAC/B0iP,YAAa70O,EAAOurD,OAG5B,KAAKz9C,GAAQuuH,2BACT,OAAO,6BACAh1H,GADP,IAEIg0O,aAAct6H,GAAiBu6H,MAC/Bn2O,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQwsI,wBACT,IAAM/uF,EAAI,6BACHlkD,EAAM3P,MADH,IAENspL,WAAW,IAAIt7J,MAAOgvQ,gBAE1B,OAAO,6BACArtR,GADP,IAEI3P,KAAM6zD,EACN8vL,kBAAc/kP,EACdu+O,YAAatpL,IAGrB,KAAKz9C,GAAQ2sP,yBACT,OAAO,6BACApzP,GADP,IAEIg0O,kBAAc/kP,IAGtB,KAAKwX,GAAQgyH,iBACT,IAAMv0E,EAAY,gBAAQlkD,EAAM3P,MAGhC,OAFA6zD,EAAKvyD,KAAOgH,EAAOoL,MAEZ,6BACA/D,GADP,IAEI3P,KAAK,gBACE6zD,KAKf,KAAKz9C,GAAQuxH,iBAAmB,IAAD,QACNs1J,EAAuBttR,EAApCozD,YACFm6N,EAAqB,CACvBh2O,MAAK,iBAAE+1O,QAAF,IAAEA,OAAF,EAAEA,EAAoB/1O,aAAtB,QAA+B,EACpCnnC,MAAK,iBACDk9Q,QADC,IACDA,GADC,UACDA,EAAoBl9Q,aADnB,aACD,EAA2BjR,KAAI,SAAAmS,GAAI,OAC/BA,EAAK3T,KAAOhF,EAAOmC,WAAnB,6BACWwW,GADX,IACiBvW,WAAYpC,EAAOoC,aAC9BuW,YAJT,QAKI,IAECk8Q,EAAgBxtR,EAAtB3P,KACF6oP,EAAM,OAAGo0C,QAAH,IAAGA,GAAH,UAAGA,EAAoBl9Q,aAAvB,aAAG,EAA2BqsB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOhF,EAAOmC,cACtE0yO,EAAcggD,EAElB,GAAIt0C,GAAUs0C,EACV,GAAI70R,EAAOoC,WAAY,CAAC,IAAD,EAEF,EADX0yR,EAAU,UAAGD,EAAY7gO,eAAf,aAAG,EAAqBlwB,MAAK,SAAAnrB,GAAI,OAAIA,EAAK3T,KAAOu7O,EAAOv7O,MACxE,IAAK8vR,EACDjgD,EAAW,6BACJggD,GADI,IAEP7gO,SAAS,UAAC6gO,EAAY7gO,eAAb,QAAwB,IAAIuvD,OAAO,CACxCv+G,GAAIu7O,EAAOv7O,GACXhH,KAAMuiP,EAAOviP,KACbgjN,UAAU,UAInB,CAAC,IAAD,EACH6zB,EAAW,6BACJggD,GADI,IAEP7gO,QAAO,UAAE6gO,EAAY7gO,eAAd,aAAE,EAAqBt7C,QAAO,SAAAC,GAAI,OAAIA,EAAK3T,KAAOu7O,EAAOv7O,QAK5E,OAAO,6BACAqC,GADP,IAEI3P,KAAMm9O,EACNp6K,YAAam6N,IAGrB,KAAK9mR,GAAQinR,mCACT,OAAO,6BACA1tR,GADP,IAEIsT,eAAgB3a,EAAOob,WAG/B,KAAKtN,GAAQknR,kCACT,OAAO,6BACA3tR,GADP,IAEIyxI,cAAe94I,EAAOob,WAG9B,KAAKtN,GAAQywH,mCACT,OAAO,6BACAl3H,GADP,IAEIiC,SAAS,IAGjB,KAAKwE,GAAQ0wH,qCAAuC,IAAD,EAC/C,OAAO,6BACAn3H,GADP,IAEIiC,SAAS,EACT81O,UAAgB,OAANp/O,QAAM,IAANA,OAAA,EAAAA,EAAQg7C,aACZh7C,EAAOtI,KACPsI,EAAO9H,OAAS,IAAhB,UAAqBmP,EAAM+3O,gBAA3B,aAAqB,EAAgB3nO,OAArC,6BAEOzX,EAAOtI,MAFd,IAGI+f,MAAOpQ,EAAM+3O,SAAS3nO,MAAM8rG,OAAOvjH,EAAOtI,KAAK+f,SAEnDzX,EAAOtI,OAGrB,KAAKoW,GAAQ4wH,qCACT,OAAO,6BACAr3H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQgxH,iCACT,OAAO,6BACAz3H,GADP,IAEIiC,SAAS,IAGjB,KAAKwE,GAAQixH,mCAAqC,IAAD,EAC7C,OAAO,6BACA13H,GADP,IAEIiC,SAAS,EACTmxD,aAAmB,OAANz6D,QAAM,IAANA,OAAA,EAAAA,EAAQg7C,aACfh7C,EAAOtI,KACPsI,EAAO9H,OAAS,IAAhB,UAAqBmP,EAAMozD,mBAA3B,aAAqB,EAAmBhjD,OAAxC,6BAEOzX,EAAOtI,MAFd,IAGI+f,MAAOpQ,EAAMozD,YAAYhjD,MAAM8rG,OAC3BvjH,EAAOtI,KAAK+f,SAGpBzX,EAAOtI,OAIrB,KAAKoW,GAAQmxH,mCACT,OAAO,6BACA53H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQwyH,mCAAqC,IAAD,EAC7C,IAAKj5H,EAAM+3O,SAAU,OAAO/3O,EAC5B,IAAM+3O,EAAQ,6BACP/3O,EAAM+3O,UADC,IAEV3nO,MAAK,UAAEpQ,EAAM+3O,gBAAR,aAAE,EAAgB3nO,MAAMjR,KAAI,SAAAmS,GAAS,IAAD,EACrC,OAAIA,EAAK3T,KAAOhF,EAAOpL,OACZ,6BACA+jB,GADP,IAEI5hB,OAAM,UAAE4hB,EAAK5hB,cAAP,aAAE,EAAa2hB,QACjB,SAAA1P,GAAK,OAAIA,IAAUhJ,EAAOlG,aAG/B6e,OAGf,OAAO,6BACAtR,GADP,IAEI+3O,aAGR,KAAKtxO,GAAQ2yH,gCACT,IAAKp5H,EAAMozD,YAAa,OAAOpzD,EAC/B,IAAMozD,EAAW,6BACVpzD,EAAMozD,aADI,IAEbhjD,MAAOpQ,EAAMozD,YAAYhjD,MAAMjR,KAAI,SAAAmS,GAAS,IAAD,EACvC,OAAIA,EAAK3a,KAAKgH,KAAOhF,EAAOpL,OACjB,6BACA+jB,GADP,IAEI5hB,OAAM,UAAE4hB,EAAK5hB,cAAP,aAAE,EAAa2hB,QACjB,SAAA5e,GAAO,OAAIA,IAAYkG,EAAOlG,aAGnC6e,OAGf,OAAO,6BACAtR,GADP,IAEIozD,gBAGR,KAAK3sD,GAAQ0xH,uBACT,OAAO,6BACAn4H,GADP,IAEI3P,UAAMpB,EACNmkE,iBAAankE,EACb8oP,cAAU9oP,EACVqkB,eAAgB,GAChBm+H,cAAe,GACf+7F,iBAAav+O,EACbgT,SAAS,EACT+xO,kBAAc/kP,IAGtB,QACI,OAAO+Q,MAQb4tR,IAA2C,GAkC3CC,IAA6C,GAsC7CC,IAA0BliL,GAC5B,CACIumJ,YAAa,GACbj2M,KAAM,CACF9rC,MAAO,GACPmnC,MAAO,GAEXt1C,SAAS,EACTnE,MAAO,MAEX,eAkESiwR,IAAqBlmQ,mBAEhCkkF,GAAkB,CAAEx8F,YAAa,gBAFDsY,EAtD2C,WAGrD,IAFpB7nB,EAEmB,uDAFX8tR,IACRn1R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,GAAQkvH,oBACT,OAAO,6BACA31H,GADP,IAEIiC,SAAS,IAGjB,KAAKwE,GAAQmvH,sBACT,OAAO,6BACA51H,GADP,IAEI3P,KAAMsI,EAAOtI,KACb4R,SAAS,IAGjB,KAAKwE,GAAQqvH,sBACT,OAAO,6BACA91H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQwvH,gBACT,OAAO,6BACAj2H,GADP,IAEI3P,UAAMpB,IAGd,KAAKwX,GAAQ04H,0BACT,OAAO,6BACAn/H,GADP,IAEIiC,SAAS,EACTnE,MAAO,OAEf,KAAK2I,GAAQ24H,4BACT,OAAO,6BACAp/H,GADP,IAEIiC,SAAS,EACTi6C,KAAMvjD,EAAOtI,OAErB,KAAKoW,GAAQ64H,4BACT,OAAO,6BACAt/H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,MAUb0F,IAAyCkmG,GAC3C,CACI/iG,QAAS,IAEb,uBA6HSmlR,IAA4BnmQ,mBAEvCkkF,GAAkB,CAAEx8F,YAAa,wBAFMsY,EA1GrC,WAG4B,IAF5B7nB,EAE2B,uDAFnB0F,IACR/M,EAC2B,uCAC3B,OAAQA,EAAOO,MACX,KAAKuN,GAAQ0vH,6BACT,OAAO,gBACAn2H,GAGX,KAAKyG,GAAQ2vH,+BACT,OAAO,6BACAp2H,GADP,IAEIisI,SAAUtzI,EAAOtI,OAGzB,KAAKoW,GAAQ6vH,+BACT,OAAO,6BACAt2H,GADP,IAEIlC,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQ0zH,kCACT,OAAO,6BACAn6H,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ2zH,oCACT,OAAO,6BACAp6H,GADP,IAEI3P,KAAK,6BACEsI,EAAOoP,aADV,IAEAqI,MAAOzX,EAAOoP,YAAYqI,QAE9BnO,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ4zH,oCACT,OAAO,6BACAr6H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQq3H,sBACT,IAAM3vB,EAAW,aAAOnuG,EAAM6I,SAExBulG,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEI6I,QAASslG,IAGjB,KAAK1nG,GAAQk3H,mBACT,OAAO,6BACA39H,GADP,IAEI6I,QACIlQ,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAO+kI,WAAa,KAEnE,KAAKj3H,GAAQ6S,kCACT,IAAM1Q,EAAqB,aACnB5I,EAAM08C,qBAAuB,IAG/BuxO,EAA0BrlR,EAAsBkhE,WAClD,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAO4pD,SAQtC,OANI0rO,GAA2B,EAC3BrlR,EAAsBwkG,OAAO6gL,EAAyB,GAEtDrlR,EAAsB+M,KAAKhd,EAAO4pD,OAG/B,6BACAviD,GADP,IAEI08C,oBAAqB9zC,IAE7B,KAAKnC,GAAQ8S,uCACT,OAAO,6BACAvZ,GADP,IAEI08C,oBACI/jD,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOkmI,OAAS,KAE/D,KAAKp4H,GAAQ+zH,mCACT,OAAO,6BACAx6H,GADP,IAEI3P,KAAM,CACFknD,MAAO,EACPnnC,MAAO,IAEXnO,SAAS,EACTnE,MAAO,KAEf,QACI,OAAOkC,MAUbkuR,IAA2C,GA2F3CC,IAAsD,GA8CtDC,IAAoD,GAqCpDC,IAA2CziL,GAC7C,GACA,eAmGS0iL,IAAqBzmQ,mBAEhCkkF,GAAkB,CAAEx8F,YAAa,gBAFDsY,EAvF2C,WAGrD,IAAD,EAFnB7nB,EAEmB,uDAFXquR,IACR11R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,GAAQ00H,sCACT,OAAO,6BACAn7H,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ20H,wCACT,OAAO,6BACAp7H,GADP,IAEI3P,MAAY,OAANsI,QAAM,IAANA,OAAA,EAAAA,EAAQg7C,aACRh7C,EAAOvC,MACPuC,EAAO9H,OAAS,IAAhB,UAAqBmP,EAAM3P,YAA3B,aAAqB,EAAY+f,OAAjC,6BAEOzX,EAAOvC,OAFd,IAGIga,MAAOpQ,EAAM3P,KAAK+f,MAAM8rG,OAAOvjH,EAAOvC,MAAMga,SAEhDzX,EAAOvC,MAEb6L,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ60H,wCACT,OAAO,6BACAt7H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQ61H,gCACT,IAAMiyJ,EAAevuR,EAAM86I,OAAN,aAAmB96I,EAAM86I,QAAU,GAExD,OADAyzI,EAAa54Q,KAAKhd,EAAO0jI,YAClB,6BACAr8H,GADP,IAEI86I,OAAQyzI,IAGhB,KAAK9nR,GAAQ+nR,wBAA0B,IAAD,IAC5BC,EAAY,UAAGzuR,EAAM3P,YAAT,aAAG,EAAY+f,MAAMjR,KAAI,SAAA4L,GACvC,IAE0C,EAFtCy2B,EAAUz2B,EAAQy2B,QAElB7oC,EAAO4yD,SAAS37C,SAAS7E,EAAQpN,MACjC6jC,EAAO,UAAG7oC,EAAO6oC,eAAV,aAAqBvyC,GAGhC,OAAO,6BACA8b,GADP,IAEIy2B,eAIR,OAAO,6BACAxhC,GADP,IAEI3P,KAAM2P,EAAM3P,KAAN,6BAAkB2P,EAAM3P,MAAxB,IAA8B+f,MAAK,OAAEq+Q,QAAF,IAAEA,IAAF,UAAkBzuR,EAAM3P,YAAxB,aAAkB,EAAY+f,QAAUpQ,EAAM3P,OAG/F,KAAKoW,GAAQ63H,0CACT,IAAMvvD,EAAe,aAAQ/uE,EAAM+sG,eAAiB,IAE9CI,EAAoBp+B,EAAgBjF,WACtC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOpL,UAQtC,OANI4/G,GAAqB,EACrBp+B,EAAgBq+B,OAAOD,EAAmB,GAE1Cp+B,EAAgBp5D,KAAKhd,EAAOpL,QAGzB,6BACAyS,GADP,IAEI+sG,cAAeh+B,IAGvB,KAAKtoE,GAAQ03H,8CACT,OAAO,6BACAn+H,GADP,IAEI+sG,cACIp0G,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOlD,QAAU,KAEhE,QACI,OAAOuK,MAQN0uR,IAAkBC,2BAAgB,CAC3CzlJ,gBArIA,WAGwB,IAFxBlpI,EAEuB,uDAFfouR,IACRz1R,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAKuN,GAAQmoR,sBACT,OAAO,6BACA5uR,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQw3H,wBACT,OAAO,6BACAj+H,GADP,IAEI3P,KAAMsI,EAAOqkI,SACbzzH,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,GAAQooR,wBACT,OAAO,6BACA7uR,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IA+Gf/E,YA1QA,WAGmB,IAFnB+E,EAEkB,uDAFVkuR,IACRv1R,EACkB,uCAClB,OAAQA,EAAOO,MACX,KAAKuN,GAAQk0H,mCACT,OAAO,6BACA36H,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQm0H,qCACT,OACI56H,EAAM3P,MACN2P,EAAM3P,KAAKQ,SAAW8H,EAAOvC,MAAMvF,QACX,IAAxB8H,EAAOvC,MAAMvF,OAEN,6BACAmP,GADP,IAEI3P,KAAK,6BACEsI,EAAOvC,OADV,IAEAga,MAAOpQ,EAAM3P,KAAOsI,EAAOvC,MAAMga,MAAQ,KAE7CnO,SAAS,EACTnE,MAAO,KAGJ,6BACAkC,GADP,IAEI3P,KAAK,6BACEsI,EAAOvC,OADV,IAEAga,MAAOzX,EAAOvC,MAAMga,QAExBnO,SAAS,EACTnE,MAAO,KAGnB,KAAK2I,GAAQo0H,qCACT,OAAO,6BACA76H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQi1H,sBACT,OAAO,gBACA17H,GAEX,KAAKyG,GAAQk1H,wBACT,OAAO,6BACA37H,GADP,IAEIiC,SAAS,EACThO,WAAY0E,EAAO1E,WACnB6J,MAAO,KAEf,KAAK2I,GAAQm1H,wBACT,OAAO,6BACA57H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAGtB,KAAK2I,GAAQs1H,0BACT,OAAOmyJ,IACX,KAAKznR,GAAQ61H,gCACT,IAAMiyJ,EAAevuR,EAAM86I,OAAN,aAAmB96I,EAAM86I,QAAU,GAExD,OADAyzI,EAAa54Q,KAAKhd,EAAO0jI,YAClB,6BACAr8H,GADP,IAEI86I,OAAQyzI,IAGhB,QACI,OAAOvuR,IAmMf2jP,OApLA,WAGyB,IAFzB3jP,EAEwB,uDAFhBmuR,IACRx1R,EACwB,uCACxB,OAAQA,EAAOO,MACX,KAAKuN,GAAQq2H,6BACT,OAAO,6BACA98H,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQy2H,+BACT,OAAO,6BACAl9H,GADP,IAEI+8H,WAAYpkI,EAAOokI,WACnBC,SAAUrkI,EAAOqkI,SACjBC,cAAetkI,EAAOskI,cACtBh7H,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ22H,+BACT,OAAO,6BACAp9H,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQ82H,yBACT,MAAO,CACHt7H,SAAS,GAEjB,QACI,OAAOjC,MCp8Bb0F,IAAqC,GCgB9BopR,IAAwC,CACjDz+R,KAAM,CACFgS,MAAO,GACPukC,YAAa,GACbqV,aAAc,GACdhsD,OAAQ6/C,KAAkB/C,MAC1B0vH,OAAQ,CACJC,cAAe,KACfnoK,WAAY,KACZ9C,UAAW,KACXtB,MAAO,IAEX22C,SAAUC,MAEd9kC,SAAS,EACT06J,KAAM,OACN7+J,MAAO,IHlBL4H,IAA+B,CACjCrV,KAAM,CACF+f,MAAO,GACPxf,MAAO,EACPC,OAAQ,EACRigB,cAAe,EACfT,WAAY,EACZyc,iBAAa79B,GAEjBsjB,SAAU,GACVo5F,MAAO,GACP1pG,SAAS,EACTnE,MAAO,MIOLixR,IAA4CnjL,GAC9CY,GACI,CACI3jG,QAAS,IAEb,eAEJ,eAGEmmR,IAAgDpjL,GAClDY,GJfqC,SACrCX,EACAt8F,GAEA,IAAMu8F,OACkC78G,IAApCosN,GAAmB9rM,GACb,CAAC6rM,IADP,uBAGcC,GAAmB9rM,IAHjC,CAIU6rM,KAGd,OAAO,6BACAvvG,GADP,IAEI+vG,WAAY9vG,EAAOv2F,QAAO,SAACumD,EAAqCtsD,GAE5D,OADAssD,EAAItsD,GAASg4C,oBAAU9hD,KAChBo2D,IACR,MIDHmzN,CACI,CACIpmR,QAAS,IAEb,eAEJ,eAEJ,eA4FSqmR,IAAqBrnQ,mBAC9BkkF,GAAkB,CAAEx8F,YAAa,gBACjCm9F,GAAiB,CAAEn9F,YAAa,gBAFFsY,EAhF2C,WAGrD,IAAD,EAFnB7nB,EAEmB,uDAFX+uR,IACRp2R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,GAAQiuM,mCACT,OAAO,6BACA10M,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQuuM,qCACT,IAAMzkM,EAAS,UAAGvQ,EAAM3P,YAAT,aAAG,EAAY+f,MAC9B,OAAO,6BACApQ,GADP,IAEI3P,KACKkgB,EAAD,6BAGa5X,EAAOo7M,aAHpB,IAIU3jM,MAAOzX,EAAOo7M,YAAY3jM,QAH9BzX,EAAOo7M,YAKjB9xM,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQwuM,qCACT,OAAO,6BACAj1M,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQ4vM,wBACT,IAAMloG,EAAW,aAAOnuG,EAAM6I,SAExBulG,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEI6I,QAASslG,IAGjB,KAAK1nG,GAAQyvM,sBACT,OAAO,6BACAl2M,GADP,IAEI6I,QACIlQ,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOL,aAAe,KAErE,KAAKmO,GAAQ0oR,uCACT,OAAInvR,EAAM3P,KACC,6BACA2P,GADP,IAEI3P,KAAK,6BACE2P,EAAM3P,MADT,IAEA+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAAC4zM,GAAD,aACxBA,EAAWp1M,KAAOhF,EAAOgF,GAAzB,6BAEao1M,GAFb,IAGU2H,WAAU,UAAE3H,EAAW2H,kBAAb,aAAE,EAAuBrpM,QAC/B,SAAA5e,GAAO,OAAIA,IAAYkG,EAAOlG,aAGtCsgN,SAKX/yM,EAEf,QACI,OAAOA,MA4KNovR,IAAuBvnQ,mBAChCkkF,GAAkB,CAAEx8F,YAAa,kBACjCm9F,GAAiB,CAAEn9F,YAAa,mBJvQ+ByjD,IIwQ1C,CAACzjD,YAAa,iBJxQ+C,SAClFy8F,GADkF,OAEjF,SAAChsG,EAAUisG,GACZ,IAAIC,EAAWlsG,EACPuP,EAAgByjD,IAAhBzjD,YAEF5W,EAAS+yG,GAAkB,GAAD,OAAIn8F,EAAJ,eAA8B08F,GACxDz8F,EAAQ7W,EAAOkX,OAErB,IAAKL,EACD,OAAOw8F,EAAYE,EAAUvzG,GAKjC,OAAQA,EAAOO,MACX,IAAK,iBACDgzG,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAU,GACVzJ,QAAS,SAIrB,MACJ,IAAK,gBACDojG,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIFm8F,MAAM,aAAK3rG,EAAM47M,WAAWpsM,GAAO+C,gBAI/C,MACJ,IAAK,kBACD,IAAIo6F,EAAoB,aAAO3sG,EAAM47M,WAAWpsM,GAAO+C,UAEvDo6F,EAAuB5lG,aACnB4lG,EACAh0G,EAAOgF,IAGXuuG,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAUo6F,QAItB,MACJ,IAAK,0BAEDT,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAU5Z,EAAO4Y,UAI7B,MAEJ,IAAK,qBACD,IAAM86F,EAAkB1zG,EAAO81L,aAE/BviF,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAU85F,QAItB,MACJ,IAAK,uBACDH,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAU,SAItB,MACJ,IAAK,yBACD25F,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAUvS,EAAM47M,WAAWpsM,GAAOm8F,YAI9C,MAEJ,IAAK,iBACDO,EAAQ,6BACDA,GADC,IAEJ0vG,WAAW,6BACJ57M,EAAM47M,YADH,mBAELpsM,EAFK,6BAGCxP,EAAM47M,WAAWpsM,IAHlB,IAIF+C,SAAU,GACVo5F,MAAO,GACP7iF,UAAW,SAO/B,OAAOkjF,EAAYE,EAAUvzG,MIoIGkvB,EA5DiD,WAG1E,IAAD,EAFN7nB,EAEM,uDAFEgvR,IACRr2R,EACM,uCACN,OAAQA,EAAOO,MACX,KAAKuN,GAAQmwM,4BACT,OAAO,6BACA52M,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQqwM,8BACT,IAAMvmM,EAAS,UAAGvQ,EAAM3P,YAAT,aAAG,EAAY+f,MAE9B,OAAO,6BACApQ,GADP,IAEI3P,KAAOkgB,EAAD,6BAGO5X,EAAOk+M,gBAHd,IAIIzmM,MAAOzX,EAAOk+M,eAAezmM,QAHjCzX,EAAOk+M,eAKb50M,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQswM,8BACT,OAAO,6BACA/2M,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQ8vM,4BAET,IAAMpoG,EAAW,aAAOnuG,EAAM6I,SAExBulG,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEI6I,QAASslG,IAGjB,KAAK1nG,GAAQgwM,0BACT,OAAO,6BACAz2M,GADP,IAEI6I,QACIlQ,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOL,aAAe,KAErE,QACI,OAAO0H,MCvRbqvR,IAAkC,CACpChxR,MAAM,EACN4D,SAAS,EACTi5M,aAAa,EACbh+F,eAAgB,GAChB5pG,eAAgB,GAChBs+E,qBAAsB,GACtBr/E,SAAU,GACV6qG,kBAAkB,EAClB8jE,yBAA0B,IAmOxBouG,IAA8C,CAChDv+R,WAAY,IAgCVw+R,IAAgD,GChThD7pR,IAAoB,CACtB9W,MAAO,ICKE4gS,IAA4C,CACrDzgP,SAAU,CACN1sC,MAAO,GACPukC,YAAa,GACbqV,aAAc,GACdhsD,OAAQ++C,KAAiBjC,MACzB0vH,OAAQ,CACJC,cAAe,KACfnoK,WAAY,KACZ9C,UAAW,KACXtB,MAAO,KAGfwuO,eAAgB,GAChB18N,SAAS,EACTnE,MAAO,ICvBE2xR,IAAkC,CAC3Cp/R,UAAMpB,EACN6O,MAAO,KACPmE,SAAS,EACTupO,aAAa,GCsBXkkD,IAAwB9jL,GAC1BY,GACIK,GACI,CACI5qG,SAAS,GAEb,aAEJ,aAEJ,aAiJS0tR,IAAmB9nQ,mBAG5BkkF,GAAkB,CAAEx8F,YAAa,cACjCm9F,GAAiB,CAAEn9F,YAAa,cAChCu9F,GAAuB,CAAEv9F,YAAa,cALVsY,EAnI8C,WAGxD,IAFlB7nB,EAEiB,uDAFT0vR,IACR/2R,EACiB,uCACjB,OAAQA,EAAOO,MACX,KAAKuN,KAAQmqC,yBACT,OAAO,6BACA5wC,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQqqC,2BACT,IAAM8+O,EACFj3R,EAAOtI,MAAQsI,EAAOtI,KAAK+f,MAAMS,OAC3BlY,EAAOtI,KAAK+f,MAAMjR,KAAI,SAACmS,EAAMlS,GACzB,IAAMywR,IACAv+Q,EAAK7iB,OACP2Q,EAAQzG,EAAOtI,KAAK+f,MAAMS,OAAS,GACnClY,EAAOtI,KAAK+f,MACPqP,MAAMrgB,EAAQ,GACdiS,QAAO,SAAA1a,GAAI,OAAIA,EAAKlI,QAAU6iB,EAAK7iB,SACnCoiB,OAAS,EACZ45I,IACAn5I,EAAK7iB,QACNi8J,YAAwBp5I,EAAK7iB,OAC5B87J,GAAsBj5I,EAAKurB,UAC3B2tH,GAAqBl5I,EAAKurB,UAC1BizP,GAAiBx+Q,EAAK0mB,OAE5B,OAAO,6BACA1mB,GADP,IAEIy+Q,SAAS,EACTvoI,eACIqoI,GACAplI,GACAF,GACAC,GACAslI,OAGZ,GACV,OAAO,6BACA9vR,GADP,IAEI3P,KAAK,6BACEsI,EAAOtI,MADV,IAEA+f,MAAOw/Q,IAEX3tR,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQuqC,2BACT,OAAO,6BACAhxC,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQ+qC,yBACT,OAAO,6BACAxxC,GADP,IAEIgwR,eAAe,IAEvB,KAAKvpR,KAAQirC,2BACT,OAAO,6BACA1xC,GADP,IAEIkkM,WAAYvrM,EAAOtI,KACnBkZ,WAAY5Q,EAAO4Q,WACnBymR,eAAe,IAEvB,KAAKvpR,KAAQkrC,2BACT,OAAO,6BACA3xC,GADP,IAEIlC,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQyqC,mBACT,IAAM0+O,EACFj3R,EAAOtI,MAAQsI,EAAOtI,KAAK+f,MAAMS,OAC3BlY,EAAOtI,KAAK+f,MAAMjR,KAAI,SAACmS,EAAMlS,GACzB,IAAMywR,IACAv+Q,EAAK7iB,OACP2Q,EAAQzG,EAAOtI,KAAK+f,MAAMS,OAAS,GACnClY,EAAOtI,KAAK+f,MACPqP,MAAMrgB,EAAQ,GACdiS,QAAO,SAAA1a,GAAI,OAAIA,EAAKlI,QAAU6iB,EAAK7iB,SACnCoiB,OAAS,EACZ45I,IACAn5I,EAAK7iB,QACNi8J,YAAwBp5I,EAAK7iB,OAC5B87J,GAAsBj5I,EAAKurB,UAC3B2tH,GAAqBl5I,EAAKurB,UAC1BizP,GAAiBx+Q,EAAK0mB,OAE5B,OAAO,6BACA1mB,GADP,IAEIy+Q,SAAS,EACTvoI,eACIqoI,GACAplI,GACAF,GACAC,GACAslI,OAGZ,GACV,OAAO,6BACA9vR,GADP,IAEI3P,KAAK,6BACEsI,EAAOtI,MADV,IAEA+f,MAAOw/Q,MAInB,KAAKnpR,KAAQ2qC,sCACT,OAAO,6BACApxC,GADP,IAEI3P,KAAK,6BACEsI,EAAOtI,MADV,IAEA+f,MAAOzX,EAAOtI,KAAOsI,EAAOtI,KAAK+f,MAAQ,OAIrD,KAAK3J,KAAQ6qC,kBACT,OAAO,6BACAtxC,GADP,IAEIiC,SAAS,EACT5R,UAAMpB,IAGd,QACI,OAAO+Q,MCrJNiwR,IAzBT,WAGuB,IAFvBjwR,EAEsB,uDAFd0F,KACR/M,EACsB,uCACtB,OAAQA,EAAOO,MACX,IAAK,oBACD,OAAO,6BACA8G,GADP,IAEIiC,SAAS,IAEjB,IAAK,sBACD,MAAO,CACH5R,KAAMsI,EAAOyE,OACb6E,SAAS,GAEjB,IAAK,sBACD,OAAO,6BACAjC,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,ICnBb0F,IAA+B,CACjCw2C,KAAM,GACNj6C,SAAS,GC8CPiuR,IAA0DtkL,GAE9D,GAAI,sBAkIOukL,IAA4BtoQ,mBAEvCkkF,GAAkB,CAAEx8F,YAAa,uBAFMsY,EAlHM,WAGhB,IAAD,EAF1B7nB,EAE0B,uDAFlBkwR,IACRv3R,EAC0B,uCAC1B,OAAQA,EAAOO,MACX,KAAKuN,KAAQmR,kCACT,OAAO,6BACA5X,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQqR,oCACT,IAAMvH,EAAS,UAAGvQ,EAAM3P,YAAT,aAAG,EAAY+f,MAC9B,OAAO,6BACApQ,GADP,IAEI3P,KACKkgB,EAAD,6BAGa5X,EAAOoP,aAHpB,IAIUqI,MAAOzX,EAAOoP,YAAYqI,QAH9BzX,EAAOoP,YAMjB9F,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQuR,oCACT,OAAO,6BACAhY,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQyR,oCACT,OAAO,6BACAlY,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ2R,sCACT,OAAO,6BACApY,GADP,IAEIq0F,SAAU17F,EAAOoP,YACjB9F,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ6R,sCACT,OAAO,6BACAtY,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQuS,oCACT,OAAO,6BACAhZ,GADP,IAEI+Y,oBAAqBpgB,EAAOogB,sBAEpC,KAAKtS,KAAQyS,6CACT,OAAO,6BACAlZ,GADP,IAEIowR,4BAA6Bz3R,EAAOogB,sBAE5C,KAAKtS,KAAQ2S,wCACT,OAAO,6BACApZ,GADP,IAEIjP,WAAY4H,EAAOoL,QAE3B,KAAK0C,KAAQ6S,kCACT,IAAM60F,EAAW,aAAQnuG,EAAM08C,qBAAuB,IAEhD0xD,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEI08C,oBAAqByxD,IAE7B,KAAK1nG,KAAQ8S,uCACT,OAAO,6BACAvZ,GADP,IAEI08C,oBACI/jD,EAAOkQ,SAAWlQ,EAAOmQ,QACnBnQ,EAAOiQ,sBACP,KAElB,KAAKnC,KAAQ4pR,wCACT,OAAO,6BACArwR,GADP,IAEI3P,KAAM,CACF+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAACmS,GAAD,OACxBA,EAAK3T,KAAOhF,EAAOgF,GAAnB,6BAEa2T,GAFb,IAGU5hB,OACI4hB,EAAK5hB,QACL4hB,EAAK5hB,OAAO2hB,QACR,SAAC1P,GAAD,OACIA,EAAMhE,KAAOhF,EAAOlG,aAGpC6e,QAItB,QACI,OAAOtR,MA6CbswR,IAAsD1kL,GAE1D,GAAI,oBAkFO2kL,IAA0B1oQ,mBAErCkkF,GAAkB,CAAEx8F,YAAa,qBAFIsY,EAxEM,WAGhB,IAFzB7nB,EAEwB,uDAFhBswR,IACR33R,EACwB,uCACxB,OAAQA,EAAOO,MACX,KAAKuN,KAAQgT,+BACT,OAAO,6BACAzZ,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQmT,iCACT,OAAO,6BACA5Z,GADP,IAEI3P,KAAMsI,EAAOghB,UACb1X,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQqT,iCACT,OAAO,6BACA9Z,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQ8T,+BACT,IAAM4zF,EAAW,aAAQnuG,EAAMi9C,mBAAqB,IAE9CmxD,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEIi9C,kBAAmBkxD,IAE3B,KAAK1nG,KAAQiU,oCACT,OAAO,6BACA1a,GADP,IAEIi9C,kBACItkD,EAAOkQ,SAAWlQ,EAAOmQ,QACnBnQ,EAAO8hB,oBACP,KAElB,KAAKhU,KAAQ+pR,sCACT,OAAO,6BACAxwR,GADP,IAEI3P,KAAM,CACF+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAACmS,GAAD,OACxBA,EAAK3T,KAAOhF,EAAOgF,GAAnB,6BAEa2T,GAFb,IAGU5hB,OACI4hB,EAAK5hB,QACL4hB,EAAK5hB,OAAO2hB,QACR,SAAC1P,GAAD,OACIA,EAAMhE,KAAOhF,EAAOlG,aAGpC6e,QAItB,QACI,OAAOtR,MA6CbywR,IAAwD7kL,GAE5D,GAAI,qBAmGO8kL,IAA2B7oQ,mBAEtCkkF,GAAkB,CAAEx8F,YAAa,sBAFKsY,EAtFM,WAGhB,IAF1B7nB,EAEyB,uDAFjBywR,IACR93R,EACyB,uCACzB,OAAQA,EAAOO,MACX,KAAKuN,KAAQmU,gCACT,OAAO,6BACA5a,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQsU,kCACT,OAAO,6BACA/a,GADP,IAEI3P,KAAMsI,EAAOmiB,WACb7Y,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQwU,kCACT,OAAO,6BACAjb,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQkqR,yCACT,OAAO,gBACA3wR,GAEX,KAAKyG,KAAQmqR,2CACT,OAAO,6BACA5wR,GADP,IAEIqQ,WAAY1X,EAAOmiB,WAAWzK,aAEtC,KAAK5J,KAAQoqR,2CACT,OAAO,6BACA7wR,GADP,IAEIlC,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQiV,gCACT,IAAMyyF,EAAW,aAAQnuG,EAAMu9C,oBAAsB,IAE/C6wD,EAAkBD,EAAYrkC,WAChC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOgF,MAQtC,OANIywG,GAAmB,EACnBD,EAAYf,OAAOgB,EAAiB,GAEpCD,EAAYx4F,KAAKhd,EAAOgF,IAGrB,6BACAqC,GADP,IAEIu9C,mBAAoB4wD,IAE5B,KAAK1nG,KAAQoV,qCACT,OAAO,6BACA7b,GADP,IAEIu9C,mBACI5kD,EAAOkQ,SAAWlQ,EAAOmQ,QACnBnQ,EAAOijB,qBACP,KAElB,KAAKnV,KAAQqqR,uCACT,OAAO,6BACA9wR,GADP,IAEI3P,KAAM,CACF+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAACmS,GAAD,OACxBA,EAAK3T,KAAOhF,EAAOgF,GAAnB,6BAEa2T,GAFb,IAGU5hB,OACI4hB,EAAK5hB,QACL4hB,EAAK5hB,OAAO2hB,QACR,SAAC1P,GAAD,OACIA,EAAMhE,KAAOhF,EAAOlG,aAGpC6e,QAItB,QACI,OAAOtR,M,WC3Lb+wR,IAAapC,2BAA0B,CACzC7oR,QAASG,KACT+1B,UCvP+B,WAA8B,IAA7Bh8B,EAA4B,uDAApB,GAAIrH,EAAgB,uCAC5D,OAAQA,EAAOO,MACX,KAAKwsH,GACD,OAAO,6BACA1lH,GADP,IAEIgxR,kBAAmB,GACnBC,qBAAqB,IAE7B,KAAKtrK,GACD,OAAO,6BACA3lH,GADP,IAEIkxR,aAAcv4R,EAAOtI,KACrB2gS,kBAAmB,GACnBC,qBAAqB,IAE7B,KAAKrrK,GACD,OAAO,6BACA5lH,GADP,IAEIgxR,kBAAmBr4R,EAAOmF,MAC1BmzR,qBAAqB,IAE7B,KAAKprK,GACD,OAAO,6BACA7lH,GADP,IAEImoH,0BAA0B,EAC1BgpK,0BAAsBliS,IAE9B,KAAK62H,GACD,MAAO,CACHoC,gBAAiBvvH,EAAOtI,KACxB83H,0BAA0B,EAC1BgpK,0BAAsBliS,GAE9B,KAAK82H,GACD,OAAO,6BACA/lH,GADP,IAEImoH,0BAA0B,EAC1BgpK,qBAAsBx4R,EAAOmF,QAErC,QACI,OAAOkC,IDgNf24B,QAASE,KACTziC,MAAO82G,GACP42I,KPpQuB,WAAwC,IAAvC9jP,EAAsC,uDAA9B0F,IAAc/M,EAAgB,uCAC9D,OAAQA,EAAOO,MACX,KAAKovE,MACD,OAAO,6BACAtoE,GADP,IAEIpR,MAAO+J,EAAO/J,QAEtB,QACI,OAAOoR,IO6Pf+2J,a7hCjE2E,WAGvD,IAFpB/2J,EAEmB,uDAFXstG,GACR30G,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,KAAQ4C,kBACT,OAAO,6BACArJ,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQiB,oBACT,OAAO,6BACA1H,GADP,IAEI3P,KAAMsI,EAAOhC,KACb4S,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQkB,oBACT,OAAO,6BACA3H,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,I6hC2CfymP,eZqUA,WAGoB,IAFpBzmP,EAEmB,uDAFX6tR,IACRl1R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,GAAQ2qR,oBACT,OAAO,6BACApxR,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQqyH,sBACT,OAAO,6BACA94H,GADP,IAEI3P,KAAMsI,EAAOurD,KACb36C,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,GAAQ4qR,sBACT,OAAO,6BACArxR,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IY3Vfm7M,aZ+R2E,WAGvD,IAFpBn7M,EAEmB,uDAFX4tR,IACRj1R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,GAAQqzH,kBACT,OAAO,6BACA95H,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ+uH,oBACT,OAAO,6BACAx1H,GADP,IAEI3P,KAAMsI,EAAOurD,KACb36C,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,GAAQszH,oBACT,OAAO,6BACA/5H,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IYrTfrJ,K7hC7BuB,WAA4C,IAA3CqJ,EAA0C,uDAAlCutG,GAAkB50G,EAAgB,uCAClE,OAAQA,EAAOO,MACX,KAAKoO,KACD,MAAO,CACH3B,UAAM1W,EACN2W,WAAW,EACX9H,MAAO,MAEf,KAAKyJ,KACD,MAAO,CACH5B,KAAK,gBACEhN,EAAOtI,MAEduV,WAAW,EACX9H,MAAO,MAEf,KAAK0J,KACD,MAAO,CACH7B,UAAM1W,EACN2W,WAAW,EACX9H,MAAOnF,EAAOmF,OAEtB,KAAK2J,KACD,OAAO,6BACAzH,GADP,IAEIlC,MAAO,OAEf,KAAK4J,KACD,MAAO,CACH/B,KAAK,6BACE3F,EAAM2F,MACNhN,EAAOtI,MAEdyN,MAAO,MAEf,KAAK6J,KACD,OAAO,6BACA3H,GADP,IAEIlC,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,I6hCXf0d,YAAaiwF,GACbz6C,YAAa86C,GACb00F,mB7hCyIA,WAGyB,IAFzB1iM,EAEwB,uDAFhB8tG,GACRn1G,EACwB,uCACxB,OAAQA,EAAOO,MACX,KAAKuN,KAAQ6D,6BACT,OAAO,6BACAtK,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQgE,+BACT,OAAO,6BACAzK,GADP,IAEI3P,KAAMsI,EAAO6R,WACbjB,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQkE,+BACT,OAAO,6BACA3K,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,I6hC/Jfg2J,uB7hCgUA,WAG+B,IAF/Bh2J,EAE8B,uDAFtBquG,GACR11G,EAC8B,uCAC9B,OAAQA,EAAOO,MACX,KAAKuN,KAAQ6qR,+BACT,OAAO,6BACAtxR,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQ8qR,iCACT,OAAO,6BACAvxR,GADP,IAEI3P,KAAMsI,EAAOoP,YACb9F,SAAS,IAEjB,KAAKwE,KAAQ+qR,iCACT,OAAO,6BACAxxR,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,I6hCrVf+uC,SxxBhM2B,WAGN,IAFrB/uC,EAEoB,uDAFZw8J,GACR7jK,EACoB,uCACpB,OAAQA,EAAOO,MACX,KAAKuN,GAAQ43J,qBACT,OAAO,6BACAr+J,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ63J,uBACT,MAAO,CACH34J,KAAK,6BACE3F,EAAM2F,MACNhN,EAAOtI,MAEd4R,SAAS,EACT06J,KAAM,SACNvyG,OAAQ,IAEhB,KAAK3jD,GAAQ+3J,uBACT,OAAO,6BACAx+J,GADP,IAEIiC,SAAS,EACT06J,KAAM,QACNvyG,OAAQzxD,EAAOmF,QAEvB,KAAK2I,GAAQo4J,4BACT,OAAO,gBACA7+J,GAEX,KAAKyG,GAAQw4J,8BACT,IAAMwyH,EAAezxR,EAAM2F,KAAK82J,OAAOtsK,MAAMgP,KACzC,SAAC+1K,GACG,GAAIA,EAAKv3K,KAAOhF,EAAOtI,KAAK2uK,aAAc,CACtC,IAAM0yH,EAAO,gBAAQx8G,GAKrB,OAJAw8G,EAAQn/G,SAAW55K,EAAOtI,KAAKmsC,SAASoC,IACxC8yP,EAAQ90G,QAAUjkL,EAAOtI,KAAKmsC,SAAS7+B,GACvC+zR,EAAQ5vK,SACJnpH,EAAOtI,KAAKmsC,SAASm1P,SAAStxQ,OAAOyhG,SAClC4vK,EAEP,OAAOx8G,KAKnB,OAAO,6BACAl1K,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFC,cAAe+0H,EACVtyR,KAAI,SAAChP,GAAD,OACDA,EAAM2xH,SAAW3xH,EAAM2xH,SAAW,KAErCvsG,QAAO,SAACpF,EAAG8E,GAAJ,OAAU9E,EAAI8E,IAAG,GAC7B9kB,MAAOshS,MAGf90H,KAAM,aAEd,KAAKl2J,GAAQy4J,8BACT,OAAO,6BACAl/J,GADP,IAEIoqD,OAAQzxD,EAAOmF,MACf6+J,KAAM,UAEd,KAAKl2J,GAAQg3J,mBACT,IAAMm0H,EAAiB,gBAAQ5xR,EAAM2F,KAAK82J,QAE1C,OADAm1H,EAAkBzhS,MAAMwlB,KAAKhd,EAAOtI,MAC7B,6BACA2P,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,gBACAm1H,KAGXj1H,KAAM,WACNvyG,OAAQ,KAEhB,KAAK3jD,GAAQ61J,mBACT,OAAO,6BACAt8J,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFtsK,MAAOwI,EAAOtI,KAAK8O,KACf,SAAC+1K,EAAkB91K,GACf,OAAO,6BAAK81K,GAAZ,IAAkBt6G,SAAUx7D,WAK5Cu9J,KAAM,WACNvyG,OAAQ,KAEhB,KAAK3jD,GAAQs3J,mBACT,OAAO,6BACA/9J,GADP,IAEI28J,KAAM,WACNh3J,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFtsK,MAAO6P,EAAM2F,KAAK82J,OAAOtsK,MAAMgP,KAC3B,SAAC+1K,GACG,OAAIA,EAAKv3K,KAAOhF,EAAOilK,OACZ,6BACAsX,GADP,IAEIz8K,KAAME,EAAOoL,MACb64K,QAAS,EACTrK,cAAUtjL,IAGPimL,WAOnC,KAAKzuK,GAAQo3J,mBACT,IAAMg0H,EAAc,aAAO7xR,EAAM2F,KAAK82J,OAAOtsK,OACvC2hS,EAAiB,aAChBD,EAAexgR,QACd,SAAC6jK,GAAD,OAAsBA,EAAKv3K,KAAOhF,EAAOtI,SAG3CiyL,EAAewvG,EAChBzgR,QAAO,SAAC6jK,GAAD,OAAsBA,EAAK3C,YAClCpzK,KAAI,SAAC+1K,GAAD,OAAsBA,EAAKpzD,YACpC,OAAO,6BACA9hH,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFC,cACI4lB,EAAazxK,OAAS,EAChByxK,EAAa/sK,QAAO,SAACpF,EAAG8E,GAAJ,OAAU9E,EAAI8E,KAClC,EACV9kB,MAAO2hS,MAGfn1H,KAAM,WACNvyG,OAAQ,KAEhB,KAAK3jD,GAAQy3J,mBACT,OAAO,6BACAl+J,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFtsK,MAAO,OAGfwsK,KAAM,WACNvyG,OAAQ,KAEhB,KAAK3jD,GAAQ64J,gBACT,IAAMyd,EAAoB,gBAAQ/8K,EAAM2F,MAExC,OADAo3K,EAAgBpkL,EAAOzH,OAASyH,EAAOtI,KAChC,6BACA2P,GADP,IAEI2F,KAAK,gBACEo3K,GAEPpgB,KAAMhkK,EAAO0mK,OAASr/J,EAAM28J,KAAO,aAE3C,KAAKl2J,GAAQu5J,4BACT,IAAM+xH,EAAQ,aAAO/xR,EAAM2F,KAAK82J,OAAOtsK,OACvC,OAAO,6BACA6P,GADP,IAEI2F,KAAK,6BACE3F,EAAM2F,MADT,IAEA82J,OAAO,6BACAz8J,EAAM2F,KAAK82J,QADZ,IAEFtsK,MAAO4hS,EAAS5yR,KAAI,SAAA+1K,GAChB,OAAIA,EAAKv3K,KAAOhF,EAAOilK,OACZ,6BACAsX,GADP,IAEInV,SAAUpnK,EAAOonK,WAGdmV,SAKvBvY,KAAM,WACNvyG,OAAQ,KAGhB,KAAK3jD,GAAQk5J,yBACT,OAAO,6BACA3/J,GADP,IAEIqkL,UAAWx0J,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAM2F,SAGnD,KAAKc,GAAQo5J,2BACT,OAAO,6BACA7/J,GADP,IAEI2F,KAAMkqB,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAMqkL,YACtC1nB,KAAM,SAGd,KAAKl2J,GAAQg5J,eACT,OAAO,6BACAjD,IADP,IAEI72J,KAAK,6BACE62J,GAAqB72J,MADxB,IAEA82J,OAAO,6BACAD,GAAqB72J,KAAK82J,QAD3B,IAEFtsK,MAAO,SAKvB,KAAKsW,GAAQurR,qBACT,OAAO,6BACAhyR,GADP,IAEI28J,KAAMhkK,EAAOoL,QAGrB,KAAKogL,KAAgBhqK,gCACjB,OAAO,6BACAna,GADP,IAEI28J,KAAM,YAGd,QACI,OAAO38J,IwxB3Cf6vC,UVxN4B,WAGV,IAFlB7vC,EAEiB,uDAFT8uR,IACRn2R,EACiB,uCACjB,OAAQA,EAAOO,MACX,KAAKuN,GAAQwhM,sBACT,OAAO,6BACAjoM,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQyhM,wBACT,MAAO,CACH73M,KAAK,6BACE2P,EAAM3P,MACNsI,EAAOtI,MAEd4R,SAAS,EACT06J,KAAM,SACN7+J,MAAO,IAEf,KAAK2I,GAAQ2hM,wBACT,OAAO,6BACApoM,GADP,IAEIiC,SAAS,EACT06J,KAAM,QACN7+J,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQ8hM,6BACT,OAAO,gBACAvoM,GAEX,KAAKyG,GAAQ+hM,+BACT,IAAMipF,EAAezxR,EAAM3P,KAAKosK,OAAQtsK,MAAMgP,KAC1C,SAAC+1K,GACG,GAAIA,EAAKv3K,KAAOhF,EAAOtI,KAAK2uK,aAAc,CACtC,IAAM0yH,EAAO,gBAAQx8G,GAKrB,OAJAw8G,EAAQn/G,SAAW55K,EAAOtI,KAAKmsC,SAASoC,IACxC8yP,EAAQ90G,QAAUjkL,EAAOtI,KAAKmsC,SAAS7+B,GACvC+zR,EAAQ5vK,SACJnpH,EAAOtI,KAAKmsC,SAASm1P,SAAStxQ,OAAOyhG,SAClC4vK,EAEP,OAAOx8G,KAInB,OAAO,6BACAl1K,GADP,IAEI3P,KAAK,6BACE2P,EAAM3P,MADT,IAEAosK,OAAO,6BACAz8J,EAAM3P,KAAKosK,QADZ,IAEFC,cAAe+0H,EACVtyR,KAAI,SAAChP,GAAD,OACDA,EAAM2xH,SAAW3xH,EAAM2xH,SAAW,KAErCvsG,QAAO,SAACpF,EAAG8E,GAAJ,OAAU9E,EAAI8E,IAAG,GAC7B9kB,MAAOshS,MAGf90H,KAAM,aAEd,KAAKl2J,GAAQgiM,+BACT,OAAO,6BACAzoM,GADP,IAEIlC,MAAOnF,EAAOmF,MACd6+J,KAAM,UAEd,KAAKl2J,GAAQmiM,8BACT,IAAMgpF,EAAiB,gBAAQ5xR,EAAM3P,KAAKosK,QAE1C,OADAm1H,EAAkBzhS,MAAMwlB,KAAKhd,EAAOtI,MAC7B,6BACA2P,GADP,IAEI3P,KAAK,6BACE2P,EAAM3P,MADT,IAEAosK,OAAO,gBACAm1H,KAGXj1H,KAAMhkK,EAAO0mK,OAASr/J,EAAM28J,KAAO,WACnC7+J,MAAO,KAEf,KAAK2I,GAAQ2iM,8BACT,OAAO,6BACAppM,GADP,IAEI3P,KAAK,6BACE2P,EAAM3P,MADT,IAEAosK,OAAO,6BACAz8J,EAAM3P,KAAKosK,QADZ,IAEFtsK,MAAOwI,EAAOtI,KAAK8O,KACf,SAAC+1K,EAAkB91K,GACf,OAAO,6BAAK81K,GAAZ,IAAkBt6G,SAAUx7D,WAK5Cu9J,KAAM,WACN7+J,MAAO,KAEf,KAAK2I,GAAQwiM,8BACT,OAAO,6BACAjpM,GADP,IAEI28J,KAAM,WACNtsK,KAAK,6BACE2P,EAAM3P,MADT,IAEAosK,OAAO,6BACAz8J,EAAM3P,KAAKosK,QADZ,IAEFtsK,MAAO6P,EAAM3P,KAAKosK,OAAOtsK,MAAMgP,KAC3B,SAAC+1K,GACG,OAAIA,EAAKv3K,KAAOhF,EAAOilK,OACZ,6BACAsX,GADP,mBAEKv8K,EAAOzH,MAAQyH,EAAOtI,OAGpB6kL,WAOnC,KAAKzuK,GAAQsiM,8BACT,IAAM8oF,EAAc,aAAO7xR,EAAM3P,KAAKosK,OAAOtsK,OACvC2hS,EAAiB,aAChBD,EAAexgR,QACd,SAAC6jK,GAAD,OAAsBA,EAAKv3K,KAAOhF,EAAOtI,SAG3CiyL,EAAewvG,EAChBzgR,QAAO,SAAC6jK,GAAD,OAAsBA,EAAK3C,YAClCpzK,KAAI,SAAC+1K,GAAD,OAAsBA,EAAKpzD,YACpC,OAAO,6BACA9hH,GADP,IAEI3P,KAAK,6BACE2P,EAAM3P,MADT,IAEAosK,OAAO,6BACAz8J,EAAM3P,KAAKosK,QADZ,IAEFC,cACI4lB,EAAazxK,OAAS,EAChByxK,EAAa/sK,QAAO,SAACpF,EAAG8E,GAAJ,OAAU9E,EAAI8E,KAClC,EACV9kB,MAAO2hS,MAGfn1H,KAAM,WACN7+J,MAAO,KAEf,KAAK2I,GAAQ6iM,iBACT,IAAMjN,EAAiB,gBAAQr8L,EAAM3P,MAErC,OADAgsM,EAAa1jM,EAAOzH,OAASyH,EAAOtI,KAC7B,6BACA2P,GADP,IAEI3P,KAAK,gBACEgsM,GAEP1/B,KAAMhkK,EAAO0mK,OAASr/J,EAAM28J,KAAO,aAE3C,KAAKl2J,GAAQojM,0BACT,OAAO,6BACA7pM,GADP,IAEIiyR,UAAWpiQ,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAM3P,SAGnD,KAAKoW,GAAQsjM,4BACT,OAAO,6BACA/pM,GADP,IAEI3P,KAAMw/B,KAAKC,MAAMD,KAAKG,UAAUhwB,EAAMiyR,YACtCt1H,KAAM,SAGd,KAAKl2J,GAAQgjM,gBACT,OAAO,6BACAqlF,KADP,IAEIz+R,KAAK,6BACEy+R,IAAsBz+R,MADzB,IAEAosK,OAAO,6BACAqyH,IAAsBz+R,KAAKosK,QAD5B,IAEFtsK,MAAO,SAKvB,KAAKg0L,KAAgB7oK,kCACjB,OAAO,6BACAtb,GADP,IAEI28J,KAAM,YAGd,QACI,OAAO38J,IU2Bf/L,WAAYgvL,GACZ1e,OzwBpP8D,WAG5C,IAFlBvkK,EAEiB,uDAFOmkK,GACxBxrK,EACiB,uCACjB,OAAQA,EAAOO,MACX,KAAKuN,GAAQg+J,sBACT,OAAO,6BACAzkK,GADP,IAEI/P,OAAQ,WACRm0K,SAAUzrK,EAAOtI,KACjB49B,QAASt1B,EAAOtI,KAAK,GACrBsiI,KAAMh6H,EAAOtI,KAAK,KAE1B,KAAKoW,GAAQm+J,WACT,OAAO,6BACA5kK,GADP,IAEI/P,OAAQ,SACRg+B,QAASt1B,EAAOqmK,aAChBrsC,KAAM,OAEd,KAAKlsH,GAAQs+J,WACT,OAAO,6BACA/kK,GADP,IAEI/P,OAAQ,MACRg+B,QAAS,OAEjB,KAAKxnB,GAAQ2+J,sBACT,OAAO,6BACAplK,GADP,IAEIqkK,UAAW1rK,EAAOqmK,eAE1B,KAAKv4J,GAAQ8+J,qBACT,OAAO,6BACAvlK,GADP,IAEIqkK,WAAW,IAEnB,KAAK59J,GAAQg/J,QACT,IAAMysH,EAAclyR,EAAMokK,SACtBl4D,EAAQ,gBAAQlsG,GAWpB,MAVqB,aAAjBA,EAAM/P,SACNiiS,EAAY5uD,QACZp3H,EAAQ,6BACDlsG,GADC,IAEJ/P,OAAQiiS,EAAY,GAAK,WAAa,MACtC9tH,SAAU8tH,EACVjkQ,QAASikQ,EAAY,GAAKA,EAAY,GAAK,KAC3Cv/J,KAAMu/J,EAAY,GAAKA,EAAY,GAAK,QAGzChmL,EACX,KAAKzlG,GAAQy+J,eACT,OAAO,gBACAf,IAEX,QACI,OAAOnkK,IywB8LfC,SAAUolF,MACVkwK,aAAcC,IACdR,aAAcC,IACd1Q,mBAAoB4rC,IACpB1rC,0BDpFA,WAGkC,IAFlCzkP,EAEiC,uDAFzB,GACRrH,EACiC,uCACjC,OAAQA,EAAOO,MACX,KAAKuN,KAAQ+R,iCACT,OAAO,6BACAxY,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQkS,mCACT,OAAO,6BACA3Y,GADP,IAEI3P,KAAMsI,EAAO+f,kBACbnP,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQoS,mCACT,OAAO,6BACA7Y,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IC8Df2kP,iBAAkB4rC,IAClB1rC,wBDuCA,WAGgC,IAFhC7kP,EAE+B,uDAFvB,GACRrH,EAC+B,uCAC/B,OAAQA,EAAOO,MACX,KAAKuN,KAAQuT,8BACT,OAAO,6BACAha,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQ0T,gCACT,OAAO,6BACAna,GADP,IAEI3P,KAAMsI,EAAOuhB,gBACb3Q,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQ4T,gCACT,OAAO,6BACAra,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IC7Df+kP,kBAAmB2rC,IACnBzrC,yBDmLA,WAGiC,IAFjCjlP,EAEgC,uDAFxB,GACRrH,EACgC,uCAChC,OAAQA,EAAOO,MACX,KAAKuN,KAAQ0U,gCACT,OAAO,6BACAnb,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQ6U,kCACT,OAAO,6BACAtb,GADP,IAEI3P,KAAMsI,EAAO0iB,iBACb9R,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQ+U,kCACT,OAAO,6BACAxb,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,ICzMfmyR,OAAQtF,IACR7vJ,SAAU0xJ,IACVjrC,YAAa6qC,IACbpwF,SlpBpRmE,WAGlD,IAFjBl+L,EAEgB,uDAFRk/L,GACRvmM,EACgB,uCAChB,OAAQA,EAAOO,MACX,IAAK,4BACD,OAAO,6BACA8G,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,IAAK,8BACD,IAAMzN,EAAgC,CAClC+f,MAAOzX,EAAO8mM,aAAapkK,gBAE/B,OAAO,6BACAr7B,GADP,IAEI3P,OACA8uM,OAAO,EACPl9L,SAAS,EACTnE,MAAO,KAEf,IAAK,8BACD,OAAO,6BACAkC,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmG,UAEtB,IAAK,sBACD,OAAO,6BACAkB,GADP,IAEIuS,SAAU0sL,GAAa,GAAD,oBAAKj/L,EAAMuS,UAAX,CAAqB5Z,EAAOgF,QAE1D,IAAK,wBACD,IAAMwwG,EAAW,aAAOnuG,EAAMuS,UACxB6/Q,EAAWjkL,EAAYrkC,WAAU,SAAA/sE,GAAC,OAAIA,IAAMpE,EAAOgF,MAIzD,OAHkB,IAAdy0R,GACAjkL,EAAYf,OAAOglL,EAAU,GAE1B,6BACApyR,GADP,IAEIuS,SAAU47F,IAElB,IAAK,+BACD,OAAO,6BACAnuG,GADP,IAEIuS,SAAU5Z,EAAO4Y,MAEzB,IAAK,0BACD,OAAO,6BACAvR,GADP,IAEIuS,SAAUvS,EAAM3P,KAAK+f,MAAMjR,KAAI,SAAApC,GAAC,OAAIA,EAAEY,QAE9C,IAAK,4BACD,OAAO,6BACAqC,GADP,IAEIuS,SAAU,KAElB,IAAK,qBACD,OAAO,6BACAvS,GADP,IAEI2rG,MAAO3rG,EAAMuS,WAErB,IAAK,wBACD,OAAO,6BACAvS,GADP,IAEIm/L,OAAO,IAEf,QACI,OAAOn/L,IkpBgNfswL,QlrBvRgE,WAGhD,IAFhBtwL,EAEe,uDAFPowL,GACRz3L,EACe,uCACf,OAAQA,EAAOO,MACX,KAAKuN,GAAQgqL,qBACT,OAAO,6BACAzwL,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQiqL,uBACT,OAAO,6BACA1wL,GADP,IAEI3P,KAAMsI,EAAO23L,QACbruL,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQkqL,uBACT,OAAO,6BACA3wL,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,IkrB+Pf+zM,YAAam7E,IACb5pC,kBT/FA,WAA0E,IAAzEtlP,EAAwE,uDAAhE,GAAIrH,EAA4D,uCACzE,OAAQA,EAAOO,MACX,KAAKuN,GAAQksM,6BACT,OAAO,6BACA3yM,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQwsM,+BACT,OAAO,6BACAjzM,GADP,IAEI8iC,QAAQ,gBACDnqC,EAAOo6M,YAEdC,OAAO,gBACAr6M,EAAOq6M,QAEd/wM,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQosM,+BACT,OAAO,6BACA7yM,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQmvM,8BACT,OAAO,6BACA51M,GADP,IAEI8iC,QAAS9iC,EAAM8iC,QAAN,6BACF9iC,EAAM8iC,SADJ,IAEL4yK,WAAY/8M,EAAOq6M,OAAO70L,OAC1Bne,EAAM8iC,QACVkwK,OAAO,gBACAr6M,EAAOq6M,QAEd/wM,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQsvM,aACT,OAAO,6BACA/1M,GADP,IAEIgzM,OAAO,6BACAhzM,EAAMgzM,QADP,mBAEDr6M,EAAOzH,MAAQyH,EAAOoL,UAGnC,QACI,OAAO/D,ISgDfyqN,qBTwCA,WAAgF,IAA/EzqN,EAA8E,uDAAtE,GAAIrH,EAAkE,uCAC/E,OAAQA,EAAOO,MACX,KAAKuN,GAAQ2uM,mCACT,OAAO,6BACAp1M,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ0rM,qCACT,OAAO,6BACAnyM,GADP,IAEIkyM,cAAev5M,EAAOu5M,cACtB7hM,WAAY1X,EAAO0X,WACnBpO,SAAS,IAEjB,KAAKwE,GAAQ4uM,qCACT,OAAO,6BACAr1M,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IS3Dfs7M,cAAe8zE,IACfp2E,mBTpIA,WAA4E,IAA3Eh5M,EAA0E,uDAAlE,GAAIrH,EAA8D,uCAC3E,OAAQA,EAAOO,MACX,KAAKuN,GAAQ4rM,kCACT,OAAO,6BACAryM,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ8rM,oCACT,OAAO,6BACAvyM,GADP,IAEI3P,KAAMsI,EAAOu5M,cACb3oM,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,GAAQgsM,oCACT,OAAO,6BACAzyM,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,ISiHfqkP,gBX3RyE,WAGjD,IAFxBrkP,EAEuB,uDAFf0F,IACR/M,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAKuN,GAAQq8J,uBACT,IAAMuvH,EAAU3uH,GACZ1jK,EAAMrH,EAAOkqK,SAAW7iK,EAAMrH,EAAOkqK,SAASxyK,KAAO,GACrD,CAAEsN,GAAIhF,EAAOkxE,SAEjB,OAAO,6BACA7pE,GADP,mBAEKrH,EAAOkqK,QAFZ,6BAGW7iK,EAAMrH,EAAOkqK,UAHxB,IAIQ8O,YAAY,EACZthL,KAAMgiS,MAIlB,KAAK5rR,GAAQu8J,yBACT,OAAO,6BACAhjK,GADP,mBAEKrH,EAAOkqK,QAFZ,6BAGW7iK,EAAMrH,EAAOkqK,UAHxB,IAIQxyK,KAAMyzK,GACF9jK,EAAMrH,EAAOkqK,SAASxyK,KACtBsI,EAAOkxE,OACP,QACAlxE,EAAOoqK,WAKvB,KAAKt8J,GAAQy8J,yBACT,IAAMmvH,EAAU/3P,GAAWt6B,EAAMrH,EAAOkqK,SAASxyK,KAAM,CACnDsN,GAAIhF,EAAOkxE,SAEf,OAAO,6BACA7pE,GADP,mBAEKrH,EAAOkqK,QAFZ,6BAGW7iK,EAAMrH,EAAOkqK,UAHxB,IAIQ8O,WAAY0gH,EAAQxhR,OAAS,EAC7B/S,MAAOnF,EAAOmF,MACdzN,KAAMgiS,MAIlB,KAAK5rR,GAAQ68J,uBACT,IAAM+uH,EAAU/3P,GAAWt6B,EAAMrH,EAAOkqK,SAASxyK,KAAM,CACnDsN,GAAIhF,EAAOkxE,SAEf,OAAO,6BACA7pE,GADP,mBAEKrH,EAAOkqK,QAFZ,6BAGW7iK,EAAMrH,EAAOkqK,UAHxB,IAIQ8O,WAAY0gH,EAAQxhR,OAAS,EAC7BxgB,KAAMgiS,MAGlB,QACI,OAAOryR,IWgOf0lP,qBAAsBvsN,KACtBzpC,ORhO6D,WAG9C,IAFfsQ,EAEc,uDAFOqvR,IACrB12R,EACc,uCACd,OAAQA,EAAOO,MACX,KAAKuN,KAAQutB,0BACT,OAAO,6BACAh0B,GADP,IAEI3B,MAAM,IAEd,KAAKoI,KAAQwtB,2BACT,OAAO,6BACAj0B,GADP,IAEI3B,MAAM,IAEd,KAAKoI,KAAQytB,oBACT,OAAO,6BACAl0B,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQ0tB,sBACT,IAAMm+P,EAAU,6BACT35R,EAAOtI,MADE,IAEZ+f,MAAOzX,EAAOtI,KAAK+f,QAEvB,OAAO,6BACApQ,GADP,IAEIiC,SAAS,EACT60G,cAAen+G,EAAO5H,WAChB4H,EAAOtI,KAAK+f,MAAMjR,KAAI,SAACwC,GAAD,OAAkBA,EAAMhE,MAC9C,GACNtN,KAAMiiS,IAGd,KAAK7rR,KAAQ2tB,sBACT,OAAO,6BACAp0B,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQ8rR,6BACT,OAAO,gBACAvyR,GAEX,KAAKyG,KAAQ+rR,+BACT,IAAMF,EAAU,6BACT35R,EAAOtI,MADE,IAEZ+f,MAAOzX,EAAOtI,KAAK+f,QAEvB,OAAO,6BACApQ,GADP,IAEIq0F,SAAUi+L,IAGlB,KAAK7rR,KAAQgsR,+BACT,OAAO,6BACAzyR,GADP,IAEIlC,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQ2sB,4BACT,IAAIs/P,EAAY3rR,aACZ/G,EAAMk9G,eACNvkH,EAAOlG,SAEX,OAAO,6BACAuN,GADP,IAEIk9G,eAAgBw1K,IAGxB,KAAKjsR,KAAQ4sB,mCACT,IAAIq/P,EAAY3rR,aACZ/G,EAAM4xF,qBACNj5F,EAAOlG,SAEX,OAAO,6BACAuN,GADP,IAEI4xF,qBAAsB8gM,IAG9B,KAAKjsR,KAAQ6sB,yBACT,IAAIo/P,EAAYriO,aAAcrwD,EAAMk9G,eAAgBvkH,EAAOlG,SAE3D,OAAO,6BACAuN,GADP,IAEIk9G,eAAgBw1K,IAGxB,KAAKjsR,KAAQI,oBACT,IAAIC,EAAiBC,aACjB/G,EAAMuS,SACN5Z,EAAOlG,SAGX,OAAO,6BACAuN,GADP,IAEIuS,SAAUzL,EACVs2G,kBAAkB,IAG1B,KAAK32G,KAAQQ,oBACT,OAAO,6BACAjH,GADP,IAEIuS,SAAU,GACV6qG,kBAAkB,IAG1B,KAAK32G,KAAQqsB,kBACT,OAAO,6BACA9yB,GADP,IAEIuS,SAAU5Z,EAAOjJ,SAGzB,KAAK+W,KAAQwsB,oBACT,OAAO,6BACAjzB,GADP,IAEIsT,eAAgB,KAGxB,KAAK7M,KAAQssB,kBACT,OAAO,6BACA/yB,GADP,IAEIsT,eAAgB3a,EAAOjJ,SAG/B,KAAK+W,KAAQitB,kBACT,IAAK1zB,EAAM3P,KAAM,OAAO2P,EACxB,IAAI0yR,EAAS,aACN1yR,EAAM3P,KAAK+f,MACTiB,QACG,SAAC1P,GAAD,OACIA,EAAMhE,IACNgE,EAAMC,UACND,EAAMC,SAASiP,OAAS,KAE/B1R,KAAI,SAACwC,GAAD,OAAkBA,EAAMhE,OAGrC,OAAO,6BACAqC,GADP,IAEIk9G,eAAgBw1K,IAGxB,KAAKjsR,KAAQktB,uBACT,OAAO,6BACA3zB,GADP,IAEIk9G,eAAgBvkH,EAAOwzB,WAG/B,KAAK1lB,KAAQ8sB,oBACT,OAAO,6BACAvzB,GADP,IAEIk9G,eAAgB,KAGxB,KAAKz2G,KAAQgtB,0BACT,OAAO,6BACAzzB,GADP,IAEI4xF,qBAAsB,KAG9B,KAAKnrF,KAAQotB,kBACT,OAAK7zB,EAAM3P,KACJ,6BACA2P,GADP,IAEIk9G,eAAgB,KAHIl9G,EAM5B,KAAKyG,KAAQysB,yBACT,OAAO,6BACAlzB,GADP,IAEIk7M,aAAa,IAGrB,KAAKz0M,KAAQC,2BACT,OAAO,6BACA1G,GADP,IAEIk7M,aAAa,EACb99F,kBAAkB,IAG1B,KAAK32G,KAAQ0sB,2BACT,OAAO,6BACAnzB,GADP,IAEIk7M,aAAa,EACbp9M,MAAOnF,EAAOmF,QAGtB,KAAK2I,KAAQosB,+BACT,OAAO,6BACA7yB,GADP,IAEIkhL,yBAA0BvoL,EAAOjJ,SAGzC,QACI,OAAOsQ,IQ+Bf6lP,aRlBA,WAGqB,IAFrB7lP,EAEoB,uDAFOsvR,IAC3B32R,EACoB,uCACpB,OAAQA,EAAOO,MACX,KAAKuN,KAAQstB,uBACT,OAAO,6BACA/zB,GADP,IAEIjP,WAAY4H,EAAOoL,QAE3B,KAAK0C,KAAQqtB,kBACT,OAAO,6BACA9zB,GADP,IAEIg3G,cAAe,CACXr5G,GAAIhF,EAAOi0B,SAAWj0B,EAAOi0B,QAAQjvB,GACrC2F,KAAM3K,EAAOi0B,SAAWj0B,EAAOi0B,QAAQtpB,QAGnD,QACI,OAAOtD,IQAf+sB,eAAgBkjQ,IAChB7wI,cE5SA,WAGsB,IAFtBp/I,EAEqB,uDAFb0F,GACR/M,EACqB,uCACrB,OAAQA,EAAOO,MACX,IAAK,mBACD,OAAO,6BACA8G,GADP,IAEIiC,SAAS,IAEjB,IAAK,qBACD,MAAO,CACH5R,KAAMsI,EAAOyE,OACb6E,SAAS,GAEjB,IAAK,qBACD,OAAO,6BACAjC,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IFwRfykE,oBG7SA,WAG4B,IAF5BzkE,EAE2B,uDAFnB0F,KACR/M,EAC2B,uCAC3B,OAAQA,EAAOO,MACX,IAAK,yBACD,OAAO,6BACA8G,GADP,IAEIiC,SAAS,IAEjB,IAAK,2BACD,MAAO,CACH5R,KAAMsI,EAAOyE,OACb6E,SAAS,GAEjB,IAAK,2BACD,OAAO,6BACAjC,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,IHyRfi1F,cRUA,WAGsB,IAFtBj1F,EAEqB,uDAFOuvR,IAC5B52R,EACqB,uCACrB,OAAQA,EAAOO,MACX,KAAKuN,KAAQ4tB,mBACT,OAAO,gBACAr0B,GAEX,KAAKyG,KAAQ8tB,qBACT,OAAO,6BACAv0B,GADP,IAEI3P,KAAMsI,EAAO27B,aACb/qB,WAAY5Q,EAAO4Q,aAE3B,KAAK9C,KAAQ+tB,qBACT,OAAO,gBACAx0B,GAEX,QACI,OAAOA,IQ7BfkzN,KItS4D,WAG/C,IAFblzN,EAEY,uDAFJ,GACRrH,EACY,uCACZ,OAAQA,EAAOO,MACX,KAAKuN,GAAQwsN,kBACT,OAAO,6BACAjzN,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,GAAQ0sN,oBACT,IAAM5iN,EAAYvQ,EAAM3P,MAAQ2P,EAAM3P,KAAK+f,MAC3C,MAAO,CACH/f,KAC2B,IAAvBsI,EAAOu6N,KAAKriO,QAAiB0f,EAA7B,6BAGa5X,EAAOu6N,MAHpB,IAIU9iN,MAAOzX,EAAOu6N,KAAK9iN,QAHvBzX,EAAOu6N,KAMjBjxN,SAAS,EACTnE,MAAO,IAGf,KAAK2I,GAAQ2sN,oBACT,OAAO,6BACApzN,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,GAAQqsN,oBACT,MAAO,CACHziO,UAAMpB,EACNgT,SAAS,EACTnE,MAAO,IAGf,QACI,OAAOkC,IJ+PfkmP,YNjR8B,WAGV,IAFpBlmP,EAEmB,uDAFXwvR,IACR72R,EACmB,uCACnB,OAAQA,EAAOO,MACX,KAAKuN,IAAQi6N,iCACT,OAAO,6BACA1gO,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,IAAQk6N,mCACT,MAAO,CACH5xL,SAAS,6BACF/uC,EAAM+uC,UACNp2C,EAAOtI,MAEdsuO,eAAgB,GAChB18N,SAAS,EACTnE,MAAO,IAEf,KAAK2I,IAAQo6N,mCACT,OAAO,6BACA7gO,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,IAAQu6N,0BACT,IAAMrC,EAAc,aAAO3+N,EAAM2+N,gBAEjC,OADAA,EAAehpN,KAAKhd,EAAO4mO,YACpB,6BACAv/N,GADP,IAEI2+N,eAAgBA,IAExB,KAAKl4N,IAAQ06N,mBACT,OAAO,6BACAnhO,GADP,IAEI6+N,UAAWlmO,EAAOkmO,YAE1B,KAAKp4N,IAAQ66N,kBACT,OAAO,6BACAthO,GADP,IAEI2+N,eAAgB,GAChBE,eAAW5vO,IAEnB,QACI,OAAO+Q,IMqOf2lO,O7hCiVyB,WAGV,IAAD,EAFd3lO,EAEc,uDAFNsuG,GACR31G,EACc,uCACd,OAAQA,EAAOO,MACX,KAAKuN,KAAQwF,sBACT,OAAO,6BACAjM,GADP,IAEIiC,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ0F,8BACT,IAAMoE,EAAS,UAAGvQ,EAAM3P,YAAT,aAAG,EAAY+f,MAC9B,OAAO,6BACApQ,GADP,IAEI3P,KAC2B,IAAvBsI,EAAOtI,KAAKQ,QAAiB0f,EAA7B,6BAGa5X,EAAOtI,MAHpB,IAIU+f,MAAOzX,EAAOtI,KAAK+f,QAHvBzX,EAAOtI,KAKjB4R,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ4F,8BACT,OAAO,6BACArM,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQqG,4BACT,IAAM6lR,EAAgB,aAAQ3yR,EAAMwuG,gBAAkB,IAEhDokL,EAAqBD,EAAiB7oN,WACxC,SAACx4D,GAAD,OAAkBA,IAAS3Y,EAAOrC,WAOtC,OALIs8R,GAAsB,EACtBD,EAAiBvlL,OAAOwlL,EAAoB,GAE5CD,EAAiBh9Q,KAAKhd,EAAOrC,SAE1B,6BACA0J,GADP,IAEIwuG,eAAgBmkL,IAExB,KAAKlsR,KAAQwG,gCACT,OAAO,6BACAjN,GADP,IAEIwuG,eACI71G,EAAOkQ,SAAWlQ,EAAOmQ,QAAUnQ,EAAOqU,SAAW,KAEjE,KAAKvG,KAAQ0G,6BACT,OAAO,6BACAnN,GADP,IAEIgtG,kBAAkB,IAE1B,KAAKvmG,KAAQ4G,+BACT,OAAO,6BACArN,GADP,IAEIq7B,eAAgB1iC,EAAOtI,KACvB28G,kBAAkB,IAE1B,KAAKvmG,KAAQ8G,+BACT,OAAO,6BACAvN,GADP,IAEIlC,MAAOnF,EAAOmF,MACdkvG,kBAAkB,IAE1B,KAAKvmG,KAAQgH,4BACT,OAAO,6BACAzN,GADP,IAEIitG,iBAAiB,IAEzB,KAAKxmG,KAAQkH,8BACT,OAAO,6BACA3N,GADP,IAEI8kO,cAAensO,EAAOtI,KACtB48G,iBAAiB,IAEzB,KAAKxmG,KAAQoH,8BACT,OAAO,6BACA7N,GADP,IAEIlC,MAAOnF,EAAOmF,MACdmvG,iBAAiB,IAGzB,QACI,OAAOjtG,I6hCxafizD,UAAW08N,IACX5pD,c7hCqbA,WAGsB,IAFtB/lO,EAEqB,uDAFbyuG,GACR91G,EACqB,uCACrB,OAAQA,EAAOO,MACX,KAAKuN,KAAQ8F,4BACT,OAAO,6BACAvM,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQiG,8BACT,OAAO,6BACA1M,GADP,IAEI3P,KAAMsI,EAAO8T,MACblD,WAAY5Q,EAAO4Q,WACnBtH,SAAS,IAEjB,KAAKwE,KAAQmG,8BACT,OAAO,6BACA5M,GADP,IAEIiC,SAAS,IAEjB,QACI,OAAOjC,I6hC3cfmoO,OLhT8D,WAG5D,IAFFnoO,EAEC,uDAFOyvR,IACR92R,EACC,uCACD,OAAQA,EAAOO,MACX,KAAKuN,IAAQohO,qBACT,OAAO,6BACA7nO,GADP,IAEIiC,SAAS,EACTnE,MAAO,OAEf,KAAK2I,IAAQ2hO,uBACT,IAAM73N,EAAYvQ,EAAM3P,MAAQ2P,EAAM3P,KAAK+f,MAC3C,OAAO,6BACApQ,GADP,IAEI3P,KACKkgB,EAAD,6BAGa5X,EAAOwvO,QAHpB,IAIU/3N,MAAQzX,EAAOwvO,OAAO/3N,QAH1BzX,EAAOwvO,OAMjBlmO,SAAS,EACTnE,MAAO,OAEf,KAAK2I,IAAQ4hO,uBACT,OAAO,6BACAroO,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,IAAQosR,uBACT,OAAO,6BACA7yR,GADP,IAEI3P,UAAMpB,EACNgT,SAAS,EACTnE,MAAO,OAEf,KAAK2I,IAAQiiO,0BACT,OAAO,6BACA1oO,GADP,IAEIwrO,aAAa,IAErB,KAAK/kO,IAAQghO,4BACT,OAAO,6BACAznO,GADP,IAEIwrO,aAAa,EACb1tO,MAAOnF,EAAOmF,QAElB,KAAK2I,IAAQsiO,yBAA2B,IAAD,EAC3BzwO,EAAyBK,EAAzBL,aAAcc,EAAWT,EAAXS,OAEtB,OAAO,UAAA4G,EAAM3P,YAAN,eAAY+f,MAAMS,QAAlB,6BAEM7Q,GAFN,IAGG3P,KAAK,6BACE2P,EAAM3P,MADT,IAEA+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAAAmS,GAAI,OAC5BA,EAAK3T,KAAOrF,EAAZ,6BAEagZ,GAFb,IAGUq3N,cAAevvO,IAEnBkY,OAGdk6N,aAAa,IAdhB,6BAiBMxrO,GAjBN,IAkBGwrO,aAAa,IAG3B,KAAK/kO,IAAQmiO,4BAA8B,IAAD,EAC9BtwO,EAAiBK,EAAjBL,aAER,OAAO,UAAA0H,EAAM3P,YAAN,eAAY+f,MAAMS,QAAlB,6BAEM7Q,GAFN,IAGG3P,KAAK,6BACE2P,EAAM3P,MADT,IAEA+f,MAAOpQ,EAAM3P,KAAK+f,MAAMjR,KAAI,SAAAmS,GAAI,OAC5BA,EAAK3T,KAAOrF,EAAZ,6BAEagZ,GAFb,IAGUq3N,mBAAe15O,IAEnBqiB,OAGdk6N,aAAa,IAdhB,6BAiBMxrO,GAjBN,IAkBGwrO,aAAa,IAG/B,QACI,OAAOxrO,IK8Mf02B,MAAOu2P,IACP75N,YAAa26N,IACb56N,SAAUi6N,IACV/5N,oBAAqB26N,IACrBz3P,MF7S6D,WAG3C,IAFlBv2B,EAEiB,uDAFT0F,IACR/M,EACiB,uCACjB,OAAQA,EAAOO,MACX,KAAKuN,GAAQy4G,sBACT,OAAO,6BACAl/G,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,GAAQ04G,wBACT,MAAO,CACHjjE,KAAMvjD,EAAOtI,KACb4R,SAAS,GAGjB,KAAKwE,GAAQ44G,wBACT,OAAO,6BACAr/G,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,IEuRfq8M,kBK1TA,WAG0B,IAF1Br8M,EAEyB,uDAFjB0F,GACR/M,EACyB,uCACzB,OAAQA,EAAOO,MACX,IAAK,uBACD,OAAO,6BACA8G,GADP,IAEIiC,SAAS,IAEjB,IAAK,yBACD,MAAO,CACH5R,KAAMsI,EAAOyE,OACb6E,SAAS,GAEjB,IAAK,yBACD,OAAO,6BACAjC,GADP,IAEIiC,SAAS,IAEjB,IAAK,yBACD,OAAO,gBACAyD,IAEX,QACI,OAAO1F,ILkSfylO,e9chTA,WAAyE,IAAxEzlO,EAAuE,uDAA/D0F,IAAc/M,EAAiD,uCACxE,OAAQA,EAAOO,MACX,KAAKuN,GAAQ00I,qBACT,MAAO,CACH75H,MAAM,GAEd,KAAK7a,GAAQonP,qBACT,MAAO,CACHvsO,MAAM,GAGd,QACI,OAAOthB,I8cqSf6kI,Y54BjTqE,WAO7C,IANxB7kI,EAMuB,uDANf,CACJovB,IAAK,GACL3hC,YAAQwB,EACRmtC,aAAc,IAElBzjC,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAKuN,KAAQ+pD,iBACT,MAAO,CACHphC,IAAKz2B,EAAOy2B,IACZ3hC,OAAQkL,EAAOlL,OACf2uC,aAAczjC,EAAOyjC,cAE7B,KAAK31B,KAAQiqD,oBACT,MAAO,CACHthC,IAAK,GACL3hC,YAAQwB,EACRmtC,aAAc,IAGtB,QACI,OAAOp8B,I44B2Rf+kI,qB54BjRgG,WAM/D,IALjC/kI,EAKgC,uDALxB,CACJovB,IAAK,GACL3hC,YAAQwB,GAEZ0J,EACgC,uCAChC,OAAQA,EAAOO,MACX,KAAKuN,KAAQmqD,2BACT,MAAO,CACHxhC,IAAKz2B,EAAOy2B,IACZ3hC,OAAQkL,EAAOlL,QAEvB,KAAKgZ,KAAQqqD,8BACT,MAAO,CACH1hC,IAAK,GACL3hC,YAAQwB,GAGhB,QACI,OAAO+Q,I44B8Pf4uG,a7hCmdA,WAGqB,IAFrB5uG,EAEoB,uDAFZ0uG,GACR/1G,EACoB,uCACpB,OAAQA,EAAOO,MACX,KAAKuN,KAAQsH,0BACT,OAAO,6BACA/N,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQwH,4BACT,OAAO,6BACAjO,GADP,IAEI3P,KAAMsI,EAAOtI,KACb4R,SAAS,EACTnE,MAAO,KAEf,KAAK2I,KAAQ0H,4BACT,OAAO,6BACAnO,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,I6hC1ef+mP,cAAettN,KACfwtN,iBAAkBltN,KAClBi1E,gB7hCkgBA,WAGwB,IAAD,MAFvBhvG,EAEuB,uDAFf6uG,GACRl2G,EACuB,uCACvB,OAAQA,EAAOO,MACX,KAAKuN,KAAQgI,6BACT,OAAO,6BACAzO,GADP,IAEIiC,SAAS,IAEjB,KAAKwE,KAAQkI,+BACT,MAAO,CACHte,KAAMsI,EAAOtI,KACby+G,mBAAe7/G,EACfgT,SAAS,EACTnE,MAAO,IAEf,KAAK2I,KAAQoI,+BACT,OAAO,6BACA7O,GADP,IAEIiC,SAAS,EACTnE,MAAOnF,EAAOmF,QAEtB,KAAK2I,KAAQsI,8BACT,OAAO,6BACA/O,GADP,IAEI8uG,cAAe9uG,EAAM8uG,cACf9uG,EAAM8uG,cAAcoN,OAAOvjH,EAAOtI,MAClCsI,EAAOtI,OAErB,KAAKoW,KAAQyI,gCACT,OAAO,6BACAlP,GADP,IAEI3P,KAAI,UAAE2P,EAAM3P,YAAR,aAAE,EAAY8O,KAAI,SAAAmS,GAAI,iBACtB3Y,EAAOsW,KAAKW,SAAS0B,EAAK8d,KAA1B,6BAEW9d,GAFX,IAGQvN,MAAK,oBAAE/D,EAAM8uG,qBAAR,iBAAE,EAAqBryE,MAAK,SAAAq2P,GAAW,OACjCxhR,EAAK8d,MAAQ0jQ,EAAY1jQ,cAD/B,aAAE,EAEGrrB,aAFL,QAEcuN,EAAKvN,QAE1BuN,KAEVw9F,cAAa,UAAE9uG,EAAM8uG,qBAAR,aAAE,EAAqBz9F,QAAO,SAAAC,GAAI,OAC1C3Y,EAAOsW,KAAKW,SAAS0B,EAAK8d,UAGvC,KAAK3oB,KAAQ2I,gCACT,OAAO,6BACApP,GADP,IAEI8uG,cAAa,UAAE9uG,EAAM8uG,qBAAR,aAAE,EAAqBz9F,QAAO,SAAAC,GAAI,OAC1C3Y,EAAOsW,KAAKW,SAAS0B,EAAK8d,UAGvC,QACI,OAAOpvB,I6hCxjBfmnP,QM5T0B,WAGV,IAFhBnnP,EAEe,uDAFP,CAAE4F,WAAW,GACrBjN,EACe,uCACf,OAAOA,EAAOO,MACV,KAAKuN,IAAQowP,kBACT,OAAO,6BACA72P,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQqwP,oBACT,MAAO,CACHlxP,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQuwP,oBACT,OAAO,6BACAh3P,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,INsSfynP,UO7T4B,WAGV,IAFlBznP,EAEiB,uDAFT,CAAE4F,WAAW,GACrBjN,EACiB,uCACjB,OAAOA,EAAOO,MACV,KAAKuN,IAAQ6zP,oBACT,OAAO,6BACAt6P,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQ8zP,sBACT,MAAO,CACH30P,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQg0P,sBACT,OAAO,6BACAz6P,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,IPuSf2nP,SQtT2B,WAGV,IAFjB3nP,EAEgB,uDAFR,CAAE4F,WAAW,GACrBjN,EACgB,uCAChB,OAAQA,EAAOO,MACX,KAAKuN,IAAQ04Q,mBACT,OAAO,6BACAn/Q,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQ44Q,qBACT,MAAO,CACHz5Q,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQ84Q,qBACT,OAAO,6BACAv/Q,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,KAAK2I,IAAQo5Q,sBACT,OAAO,6BACA7/Q,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQq5Q,wBACT,MAAO,CACHl6Q,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQu5Q,wBACT,OAAO,6BACAhgR,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,KAAK2I,IAAQ05Q,eACT,MAAO,CACHv6Q,WAAW,EACXvV,UAAMpB,EACN6O,MAAO,IAEf,QACI,OAAOkC,IRyQfo+P,wB/NlUA,WAAmD,IAAlDp+P,EAAiD,uDAAzCk+P,IAA8BvlQ,EAAW,uCAClD,OAAQA,EAAOO,MACX,KAAKuN,IAAQw3P,mBACT,OAAO,6BACAj+P,GADP,IAEIg+P,eAAgBrlQ,EAAOqlQ,iBAE/B,KAAKv3P,IAAQ83P,2BACT,OAAO,6BACAv+P,GADP,IAEI6zG,WAAYl7G,EAAOk7G,aAG3B,QACI,OAAO7zG,I+NqTf+jQ,wBlMnUA,WAAmD,IAAlD/jQ,EAAiD,uDAAzC6jQ,IAA8BlrQ,EAAW,uCAClD,OAAQA,EAAOO,MACX,KAAKuN,IAAQi3P,mBACT,OAAO,6BACA19P,GADP,IAEIy9P,qBAAsB9kQ,EAAO8kQ,uBAErC,KAAKh3P,IAAQo3P,2BACT,OAAO,6BACA79P,GADP,IAEI6zG,WAAYl7G,EAAOk7G,aAG3B,QACI,OAAO7zG,IkMsTf0lQ,oBzLpUA,WAAsD,IAArD1lQ,EAAoD,uDAA5CulQ,IAAiC5sQ,EAAW,uCACrD,OAAQA,EAAOO,MACX,KAAKuN,IAAQ6+P,sBACT,OAAO,6BACAtlQ,GADP,IAEIwlQ,gBAAiB7sQ,EAAOoB,UAEhC,KAAK0M,IAAQo/P,8BACT,OAAO,6BACA7lQ,GADP,IAEI6zG,WAAYl7G,EAAOk7G,aAE3B,QACI,OAAO7zG,IyLwTf2nQ,aAAcX,IACd3f,gBSnUkC,WAGV,IAFxBrnP,EAEuB,uDAFf,CAAE4F,WAAW,GACrBjN,EACuB,uCACvB,OAAOA,EAAOO,MACV,KAAKuN,IAAQusO,2BACT,OAAO,6BACAhzO,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQwsO,6BACT,MAAO,CACHrtO,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQ0sO,6BACT,OAAO,6BACAnzO,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,QACI,OAAOkC,IT6Sf0hQ,ahNvUA,WAA+C,IAAD,EAA7C1hQ,EAA6C,uDAArCqhQ,IAA0B1oQ,EAAW,uCACxCo6R,EAAU,UAAG/yR,EAAMrH,EAAOy2B,YAAhB,QAAwB,GACxC,OAAQz2B,EAAOO,MACX,KAAKuN,IAAQ62P,gCACT,OAAO,6BACAt9P,GADP,mBAEKrH,EAAOy2B,IAFZ,6BAGW2jQ,GAHX,IAIQ11B,eAAgB1kQ,EAAO0kQ,mBAGnC,KAAK52P,IAAQ02P,8BACT,OAAO,6BACAn9P,GADP,mBAEKrH,EAAOy2B,IAFZ,6BAGW2jQ,GAHX,IAIQhiS,WAAY4H,EAAO5H,eAI/B,QACI,OAAOiP,IgNmTfkoQ,Y1KzUA,WAA4C,IAA3CloQ,EAA0C,uDAAlC,CAAE6zG,YAAY,GAASl7G,EAAW,uCAC3C,OAAQA,EAAOO,MACX,KAAKuN,IAAQ2hQ,YACT,OAAO,6BACApoQ,GADP,IAEI0pQ,YAAa/wQ,EAAO4mB,OAE5B,KAAK9Y,IAAQ8hQ,aACT,OAAO,6BACAvoQ,GADP,IAEIypQ,cAAe9wQ,EAAO0mB,MACtBmqP,aAAc7wQ,EAAO4mB,OAE7B,KAAK9Y,IAAQiiQ,qBACT,OAAO,6BACA1oQ,GADP,IAEI0pQ,iBAAaz6Q,EACbw6Q,mBAAex6Q,EACfu6Q,kBAAcv6Q,IAEtB,KAAKwX,IAAQmiQ,qBACT,OAAO,6BACA5oQ,GADP,IAEI6zG,WAAYl7G,EAAOk7G,aAE3B,QACI,OAAO7zG,I0KgTfunP,aUpU+B,WAGV,IAFrBvnP,EAEoB,uDAFZ,CAAE4F,WAAW,GACrBjN,EACoB,uCAEpB,OAAOA,EAAOO,MACV,KAAKuN,IAAQ67O,wBACT,OAAO,6BACAtiP,GADP,IAEI4F,WAAW,IAEnB,KAAKa,IAAQ87O,0BACT,MAAO,CACH38O,WAAW,EACXvV,KAAMsI,EAAOtI,KACbyN,MAAO,IAEf,KAAK2I,IAAQg8O,0BACT,OAAO,6BACAziP,GADP,IAEI4F,WAAW,EACX9H,MAAOnF,EAAOmF,QAEtB,KAAK2I,IAAQm8O,oBACT,MAAO,CACHh9O,WAAW,GAEnB,QACI,OAAO5F,IVySfirQ,UxJ3UA,WAAyB,IAAxBjrQ,EAAuB,uDAAf,GAAIrH,EAAW,uCACxB,OAAQA,EAAOO,MACX,KAAKuN,IAAQ0kQ,kBACT,OAAO,6BACAnrQ,GADP,IAEIirQ,UAAWtyQ,EAAOsyQ,YAE1B,KAAKxkQ,IAAQ6kQ,iBACT,OAAO,6BACAtrQ,GADP,IAEIirQ,eAAWh8Q,IAEnB,QACI,OAAO+Q,MwJyUJgzR,IARK,SAAChzR,EAA6BrH,GAK9C,OAJIA,EAAOO,OAASmvE,QAChBroE,OAAQ/Q,GAGL8hS,IAAW/wR,EAAOrH,IWzVhBs6R,IAAcC,YAAH,ogHAWN/wS,IAAUC,OAAOU,SAKjBX,IAAUC,OAAOU,SAQZX,IAAUC,OAAOsC,WAwBhBvC,IAAUC,OAAOC,OCS1B8wS,IA5CmB,WAC9B,IAAMC,EAAcrjR,eACdsjR,EAAa36J,KACb49D,EAAsBj/I,eACtBvxC,EAAU0R,YAAY3R,MACtB22G,EAAY/wF,eAEZwpE,EAAgBhkE,eAChBkqL,EAAevhG,KACf4/E,EAAqB38I,eAgC3B,OA9BA04I,IAAiB,kBAAM69F,MAAe,CAACA,EAAD,OAAcn+L,QAAd,IAAcA,OAAd,EAAcA,EAAe5kG,OAEnEklM,IAAiB,kBAAM89F,MAAc,CAACA,EAAD,OAAal4E,QAAb,IAAaA,OAAb,EAAaA,EAAc9qN,OAEhEklM,IAAiB,kBAAMe,MAAuB,CAC1CA,EAD0C,OAE1CkD,QAF0C,IAE1CA,OAF0C,EAE1CA,EAAoBnpM,OAGxBklM,IAAiB,WAAO,IAAD,GACd,OAACzvL,QAAD,IAACA,GAAD,UAACA,EAASa,oBAAV,aAAC,EAAuBkK,SACzB2rG,EAAU12G,EAAQa,gBAEvB,QAACb,QAAD,IAACA,OAAD,EAACA,EAASa,aAAc61G,IAE3B+4E,IAAiB,WACb,IAAMviI,EAASxwB,eAET8wP,EAAiBn5P,KAAQnrC,IAAI,cAC7BukS,EAAgBvgO,EAAOs1C,YAExBgrL,EAEOziQ,kBAAQyiQ,EAAgBC,KAChCp5P,KAAQqgB,OAAO,cACf3b,OAAO7oB,SAAS6wF,UAHhB1sE,KAAQ4f,IAAI,aAAcw5O,KAK/B,IAGI,OCjDJ,WACH,ItC0F0B30P,EsC1FpB40P,EAAaxI,MADS,EAE4BL,IAAsB6I,GAApE5kS,EAFkB,EAErByrD,EAAc9sD,EAFO,EAEXoQ,GAFW,IAECuoB,EAAG8rC,OAFJ,MAEe,UAFf,EAIxBpjE,IACAurC,KAAQ4f,IAAI,QAASnrD,GACrBurC,KAAQ4f,IAAI,SAAUxsD,GACtB4sC,KAAQ4f,IAAI,cAAeiY,GtCoFLpzB,EsCjFlBgsP,IACIA,IACIA,IAAuB4I,EAAY,KACnC,MAEJ,KtC6ER30P,OAAO/oB,QAAQ29Q,cACf50P,OAAO/oB,QAAQ29Q,aAAa,CAAE7lS,KAAMgxC,GAAO,GAAIA,IsCzE5BzE,KAAQnrC,IAAI,SCJvC0kS,G,QnCoBO,SACHptK,EACAqtK,EACAX,GAEA,IAAMhgO,EAASN,aAAYihO,GAC3B5gO,aAAeC,GAEf,IAAM/Y,EAAyB,IAAIgxO,IAAkB,CACjDI,aAAcr4N,EAAOg2N,sBACrBuC,WAAYv4N,EAAOvwB,aACnB6oP,aAAct4N,EAAO81N,gBACrBsC,eAAgBp4N,EAAOi2N,0BAGrBj7R,EAAa,IAAI67R,IAAY,CAC/B5vO,WAAYA,EACZmwO,aAAcp3N,EAAO61N,WACrBwB,SAAU,kBAAMlwP,KAAQnrC,IAAI,UAAYmrC,KAAQnrC,IAAI,eACpDs2D,QAAS,SAAAxnD,GACL,cAAQA,QAAR,IAAQA,OAAR,EAAQA,EAAOrG,MACX,KAAK,IACDw0R,MACA,MACJ,KAAK,IAEG1hQ,gBACAv8B,EAAKgB,IAAL,gBAAkBy7B,qBAAsBx7B,OAAWA,GAAW,GACzDu6B,MAAK,SAAC7yB,GAAkB,IAAD,EAChBsN,aAAU,UAACtN,EAAKzE,YAAN,aAAC,EAAWP,OACtBs6R,aAS1Bt8P,EAA6B,IAAIo8P,IAEjC6H,EAA2B,IAAIhI,IAAgB,CACjDC,mBAAoB74N,EAAOm2N,sBAC3B2C,cAAe94N,EAAOo2N,mBAWpByK,EoCvFiB,SACvBb,EACAc,GAEA,IAAMC,EAAqBC,2BACvBC,MAAMC,kBAAkBJ,IAQtBK,GAAkCtsQ,EAN1BusQ,YAMkCL,GAEhD,OAAOM,uBAAiBrB,EAAamB,GpCwEvBG,CAAYtB,EARS,CAC/B1sK,YACAt4H,OACA2hC,eACAsqB,aACA25O,gBAKJ,MAAO,CACHttK,YACArsE,aACAjsD,OACA2hC,eACAikQ,cACAC,SmC1EJU,CAAerkL,GAAYsW,eAAgBoiK,IAAYoK,KANvDa,I,IAAAA,MACAvtK,I,IAAAA,UACArsE,I,IAAAA,WACAjsD,I,IAAAA,KACA2hC,I,IAAAA,aACAikQ,I,IAAAA,YAEEY,IAAct1P,SAASwmD,eAAe,QACtC+uM,I/B6GC,SACHnuK,EACArsE,EACAtqB,EACAikQ,GAEA,MAAO,CACHrH,IAAY77K,GAAkB4V,GAC9BimK,IAAYpnL,GAAmBlrD,GAC/BsyO,IAAY7wN,KAAqB/rC,GACjC48P,IAAY37E,GAAoBgjF,GAChCrH,IAAYryK,GAA6BmpI,KACzCkpC,IACInyK,GACAkpI,KAEJipC,IAAYlyK,GAAgCkpI,KAC5CgpC,IACIjyK,GACAkpI,KAEJ+oC,IACI9xK,GACAipI,KAEJ6oC,IAAYnoP,KAA2Bw/M,KACvC2oC,IAAYL,IAA0BroC,KACtC0oC,IAAYjoP,KAAsC2/M,KAClDsoC,IAAY/nP,KAAiCu/M,KAC7CwoC,IACI1nP,KACAq/M,KAEJqoC,IAAYxnP,KAA4BohN,KACxComC,IAAY/9H,GAA+B43F,KAC3CmmC,IAAYtnP,KAAuCohN,KACnDkmC,IAAYpnP,KAAqC6+M,KACjDuoC,IACIlnP,KACA8+M,KAEJooC,IAAYhpH,GAAgC6gF,KAC5CmoC,IACIhwO,KACA+nM,KAEJioC,IACIzvO,KACA4nM,KAEJ6nC,IACInvO,KACA0nM,KAEJynC,IACI5vO,KACA6nM,KAEJ+nC,IACIrvO,KACA0nM,KAEJ2nC,IACI/uO,KACAwnM,KAEJunC,IAAYhiF,GAA+B26C,KAC3CqnC,IAAYn7E,GAAiC+zC,KAC7ConC,IAAYl7E,GAA0C+zC,KACtDmnC,IACI36E,GACAyzC,KAEJknC,IACI76E,GACA8zC,KAEJ+mC,IACIj7E,GACAi0C,KAEJgnC,IACIj7E,GACAi0C,KAEJgnC,IACIn8H,GACAq1F,KAEJ8mC,IAAY57P,KAA4Bg1N,KACxC4mC,IAAYz7P,KAAkC80N,KAC9C2mC,IAAYv7P,KAAmC80N,KAC/CymC,IAAYj8O,KAAiCy1M,KAC7CwmC,IAAYj5D,GAA0B0yB,KACtCumC,IAAY3uD,IAAiCqoB,KAC7CsmC,IAAYjlD,IAA4Bgf,KACxCimC,IAAY/yK,GAA2B+sI,KACvCgmC,IACIxyK,GACAysI,KAEJ+lC,IAAY5yK,GAAsC+sI,KAClD6lC,IAAYvyK,GAAiC2sI,KAC7C4lC,IAAY1yK,GAAyB+sI,KACrC2lC,IAAYztK,GAA+B+nI,KAC3C0lC,IAAYJ,IAA+BC,KAC3CG,IAAYF,IAA4BC,KACxCC,IAAYj8H,GAAmCw2F,KAC/CylC,IAAYh8H,GAAsCy2F,KAClDulC,IAAYr1B,IAA6BhQ,KACzCqlC,IAAY15C,IAAqCuU,KACjDmlC,IAAY1pC,IAAkCyE,KAC9CilC,IAAY5xB,IAA+BnT,KAC3C+kC,IAAY/N,IAA8B92B,M+B9NDgtC,CAC7CpuK,IACArsE,IACAtqB,IACAikQ,KACFz0R,KAAI,SAAA89J,GAAC,O1C/BHzkG,E0C+BmBykG,EAAEzkG,Q1C9BrBz0D,E0C8B8Bk5J,EAAEl5J,M1C5BzB,CACHy0D,UACAz0D,SAND,IACHy0D,EACAz0D,K0CgCJ4wR,IAAS1iM,OACL,cAAC,IAAD,CAAU4hM,MAAOA,IAAjB,SACI,eAAC,gBAAD,WACI,cAACZ,IAAD,IACA,cAAC,IAAD,CAAez0R,MAAOrc,IAAtB,SACI,cAAC,IAAD,CAAsBiuB,MAAOqkR,IAA7B,SACI,cAACryP,GAAA,EAAY+pC,SAAb,CAAsBpoE,MAAO/V,IAA7B,SACQ,eAAC,IAAD,CAAyB26J,MAAOisI,IAAhC,UACI,cAAC,IAAD,IACA,cAAC,IAAD,kBAO5BJ,K9BgFE,kBAAmBviO,WACrBA,UAAU4iO,cAAc11F,MAAM31K,MAAK,SAAAsrQ,GACjCA,EAAaC,kB","file":"static/js/main.a8b66cdd.chunk.js","sourcesContent":["export const Variables = {\n Colors: {\n white: '#ffffff',\n softBlue: '#4aa9e2',\n skyBlueTwo: '#4aa9e2',\n darkSkyBlue: '#4aa9e2',\n mainBlue: '#4aa9e2',\n darkSkyBlueTwo15Full: '#e4f2fb',\n steelGrey: '#6d7f8c',\n cloudyBlue: '#b1c0cb',\n whiteFive: '#f8f8f8',\n paleGrey: '#e1e8ee',\n tomato: '#ec513d',\n brown: '#a47200',\n topaz: '#15cba9',\n greenTwo: '#15cba9',\n darkGreen: '#066150',\n dark: '#222431',\n darkTwo: '#171923',\n black: '#212121',\n transparent: 'transparent',\n // give list below\n backgroundGray: '#f4f6f7',\n backgroundDark: '#181923',\n lightGray: '#ebf1f3',\n lighterGray: '#f6f6f6',\n iconGray: '#9aa6b6',\n iconGrayBg: '#f2f2f2',\n coolGray: '#9da2a8',\n labelGray: '#0000008a',\n hoverGray: '#77777740',\n primaryBlue: '#1eb0ff',\n dodgerBlue: '#3fbcff',\n primaryRed: '#fe5c6c',\n validGreen: '#51d76a',\n softerBlue: '#73bbe5',\n cornflowerBlue: '#5faad6',\n skyBlue: '#5cc7ff',\n coolBlue: '#4893bf',\n whiteTwo: '#f4f4f4',\n whiteThree: '#e2e2e2',\n whiteSix: '#f7f8f9',\n paleGreyTwo: '#f7f8f9',\n blackTwo: '#000000',\n blackThree: '#323232',\n darkThree: 'rgb(34 36 49)',\n coral: '#fa6653',\n salmon: '#ff7a69',\n paleRed: '#e55340',\n fadedRed: '#e14a59',\n fadedRedMobile: '#cb3a48',\n fadedRedTwoMobile: '#e14a59',\n lightMint: '#72dbc8',\n green: '#72dbc8',\n lightBlueGray: '#d2dfe6',\n windowsBlue: '#3d93c7',\n lightBlue: '#5eb7ed',\n blueyGray: '#99a9b4',\n steelGrey40: 'rgba(109, 127, 140, 0.4)',\n blueyGreyTwo: '#a5b5c0',\n battleshipGrey: '#64717b',\n darkerGray: '#626365',\n transparentSoftBlueTwo: 'rgba(74,169,226,0.5)',\n darkSkyBlueTwo: '#409ed6',\n darkSkyBlueThree: '#31a4e9',\n darkSkyBlue15: 'rgba(74, 169, 226, 0.15)',\n darkSkyBlue50: 'rgba(74, 169, 226, 0.5)',\n cloudyBlue15: 'rgba(177, 192, 203, 0.15)',\n blackTwo5: 'rgba(0, 0, 0, 0.05)',\n macaroniAndCheese: '#f5ba33',\n macaroniAndCheeseOpaque: 'rgba(245, 186, 51, 0.24)',\n },\n Breaks: {\n sm: '576px',\n md: '768px',\n ld: '992px',\n xl: '1200px',\n },\n BreakPoints: {\n mid: 1368,\n small: 768,\n smaller: 640,\n responsiveLg: 1920,\n responsiveMd: 1440,\n responsiveSm: 1024,\n responsiveSmPlus: 1245,\n },\n Spacing: 8,\n Fonts: {\n manrope: 'Manrope',\n },\n} as const;\n","import { useRouteMatch } from 'react-router-dom';\r\n\r\nconst ROUTES = {\r\n LANDING: '/',\r\n AUTH_PAGES: {\r\n LOGIN: '/login',\r\n INTERNAL_LOGIN: '/internal/login',\r\n AUTH0_CALLBACK: '/auth0-callback',\r\n MOBILE_NUMBER_LOGIN: '/mobile-number/login',\r\n MOBILE_NUMBER_VERIFY: '/mobile-number/verify/:phoneNumber',\r\n VERIFY_MOBILE_NUMBER_PRIVATE: '/number/:actionType/:phoneNumber',\r\n ADD_MOBILE_NUMBER: '/add-mobile-number',\r\n TRAINEE_LOGIN: '/trainee-login',\r\n LOGOUT: '/logout',\r\n REGISTER: '/register',\r\n REGISTRATION: '/registration',\r\n RESET_PASSWORD: '/reset',\r\n FORGOT_PASSWORD: '/forgot',\r\n ONBOARDING: '/onboarding/:role',\r\n INVALID_INVITE: '/invalid-invite',\r\n TRAINEE_SPLASH: '/trainee-splash/:userName'\r\n },\r\n PROFILE: '/users/:userId',\r\n PROFILE_SETTINGS: {\r\n SECURITY: '/users/:userId/security',\r\n NOTIFICATIONS: '/users/:userId/notifications',\r\n },\r\n ORGANIZATION_LOGS: '/logs',\r\n ORGANIZATION_ASSESSMENT_LOGS: '/ai-assessment',\r\n COMPANY_SETTINGS: {\r\n ROOT: '/company',\r\n LOGO: '/company/logo',\r\n USER_LIMIT: '/company/user-limit',\r\n VOICE: '/company/voice',\r\n },\r\n ACTION_ITEMS: {\r\n NEW_USER: '/drafts/:draftId',\r\n },\r\n PROGRESS: '/progress',\r\n PROGRESS_PAGES: {\r\n PRACTIS_SETS: '/progress/practis-sets',\r\n PRACTIS_SETS_DETAILS: '/progress/practis-sets/:practisSetId',\r\n TRAINEE_INVITATION: '/progress/practis-sets/:practisSetId/invite',\r\n },\r\n SUBMISSIONS: '/feed',\r\n SUBMISSION_SETTINGS: {\r\n ACCURACY_TESTS: {\r\n ALL: '/feed/accuracy',\r\n SINGLE: '/feed/accuracy/submission/:submissionId',\r\n OLD_SINGLE: '/feed/accuracy/:submissionId',\r\n },\r\n CHALLENGES: {\r\n ALL: '/feed/challenges',\r\n SINGLE: '/feed/challenges/submission/:submissionId',\r\n OLD_SINGLE: '/feed/challenges/:submissionId',\r\n }\r\n },\r\n LIBRARY: '/library',\r\n LIBRARY_SETTINGS: {\r\n SCENARIOS: {\r\n ALL: '/library/scenarios',\r\n SINGLE: '/library/scenarios/:scenarioId',\r\n },\r\n PRACTISSETS: {\r\n ALL: '/library/practis-sets',\r\n SINGLE: '/library/practis-sets/:practisSetId',\r\n QUICK_ASSIGNMENT:\r\n '/library/practis-sets/:practisSetId/quick-assignment',\r\n ASSIGN_USERS: '/library/practis-sets/:practisSetId/assign-users',\r\n },\r\n CHALLENGES: {\r\n ALL: '/library/challenges',\r\n SINGLE: '/library/challenges/:challengeId',\r\n },\r\n },\r\n TELEPROMTER: '/telepromter/:scenarioId',\r\n TELEPROMTER_PAGES: {\r\n PLAYBACK: '/telepromter/:scenarioId/playback',\r\n COMPLETED: '/telepromter/:scenarioId/completed',\r\n TRAINING: '/telepromter/:scenarioId/train',\r\n EXIT: '/telepromter/:scenarioId/exit',\r\n },\r\n TEAMS: '/teams',\r\n TEAMS_PAGES: {\r\n LIST_OF_TEAMS: '/teams',\r\n MEMBERS: '/teams/:teamId/members',\r\n NEW_TEAM: '/teams/new',\r\n MANAGE_TEAM: '/teams/:teamId/members/manage',\r\n TRAINING: '/teams/:teamId/training',\r\n TRAINING_PAGES: {\r\n PRACTIS_SETS: '/teams/:teamId/training/practis-sets',\r\n PRACTIS_SETS_DETAILS:\r\n '/teams/:teamId/training/practis-sets/:practisSetId',\r\n TRAINEE_INVITATION:\r\n '/teams/:teamId/training/practis-sets/:practisSetId/invite',\r\n },\r\n },\r\n OVERDUE_LEARNERS: '/overdue-learners',\r\n TRAINEE_DETAILS_REPS: '/user/performance/:userId/enrollments/:enrollmentId/scenario/:scenarioId',\r\n TRAINEE_DETAILS: '/user/performance/:userId/enrollments/:enrollmentId',\r\n USERS: '/users',\r\n USER_INVITATIONS: '/invitations',\r\n USER_PERFORMANCE: '/user/performance/:userId',\r\n INVITATION_PERFORMANCE: '/invitation/performance/:userId',\r\n INVITATIONS: '/invitations',\r\n DRAFTS: '/drafts',\r\n PRIVACY: '/privacy',\r\n TERMS: '/terms',\r\n SUPPORT: '/support',\r\n Health: '/health',\r\n BROKEN_SHARED_LINK: '/broken-shared-link',\r\n MOBILE_DEEP_LINKS: {\r\n PRACTIS_SET_INVITATION: '/practis-set-invitation',\r\n SUBMISSIONS: '/submissions',\r\n V2_SUBMISSIONS: '/v2/submissions',\r\n CHALLENGE_FEEDBACK: '/challenge-feedback',\r\n V2_CHALLENGE_FEEDBACK: '/v2/challenge-feedback',\r\n PRACTIS_SET_DETAILS: '/practis-set-details',\r\n },\r\n REPORTS: {\r\n LIST_OF_REPORTS: '/reports',\r\n PRACTIS_SET_SUMMARY_REPORT: '/reports/practis-set-summary',\r\n USER_ACTIVITY_REPORT: '/reports/user-activity',\r\n TEAM_LEADER_ACTIVITY_REPORT: '/reports/team-leader-activity',\r\n BILLING_REPORT: '/reports/billing',\r\n TRAINING_TIME_REPORT: '/reports/training-time',\r\n },\r\n ROLEPLAYS: {\r\n LIST_OF_ROLEPLAYS: '/roleplays',\r\n NEW_ROLEPLAY: '/roleplay/create',\r\n SINGLE: '/roleplay/:roleplayId',\r\n }\r\n};\r\n\r\nexport default ROUTES;\r\n\r\nexport const MEID = 'me';\r\n\r\nexport function useUserIdMatch(): number | 'me' {\r\n const {\r\n params: { userId },\r\n } = useRouteMatch<{ userId?: string }>();\r\n return userId && userId !== MEID ? parseInt(userId) : (userId as 'me');\r\n}\r\n\r\nexport function replaceUserId(path: string, userId: number | 'me') {\r\n return path.replace(':userId', userId.toString());\r\n}\r\n\r\nexport function isMe(userId: number | 'me') {\r\n return userId === MEID;\r\n}\r\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n LoginApiParams,\n ForgotPasswordApiParams,\n LoginByPhoneCodeApiParams,\n ResetPasswordApiParams,\n GetPhoneCodeApiParams,\n RegistrationApiParams,\n GetAccessTokenApiParams,\n AuthTypeApiParams,\n AuthZeroTokenTypeApiParams,\n} from './types';\n\n/**\n * @function useAuthTypeApi\n * @returns { AuthTypeApiParams }\n */\nexport function useAuthTypeApi(): AuthTypeApiParams {\n const http = useHttp();\n return useCallback(params => http.post('auth/get-auth-type', params, true), [http]);\n}\n\n/**\n * @function useAuthZeroTokenTypeApi\n * @returns { AuthZeroTokenTypeApiParams }\n */\nexport function useAuthZeroTokenTypeApi(): AuthZeroTokenTypeApiParams {\n const http = useHttp();\n return useCallback(params => http.post('auth/authZero/token', params, true), [http]);\n}\n\n/**\n * @function useLoginApi\n * @returns { LoginApiParams }\n */\nexport function useLoginApi(): LoginApiParams {\n const http = useHttp();\n return useCallback(params => http.post('auth/login', params, true), [http]);\n}\n\n/**\n * @function useRegistrationApi\n * @returns { RegistrationApiParams }\n */\nexport function useRegistrationApi(): RegistrationApiParams {\n const http = useHttp();\n return useCallback(params => http.post('auth/signup', params, true), [http]);\n}\n\n/**\n * @function useLoginByPhoneCodeApi\n * @returns { LoginByPhoneCodeApiParams }\n */\nexport function useLoginByPhoneCodeApi(): LoginByPhoneCodeApiParams {\n const http = useHttp();\n return useCallback(\n params => http.post('/auth/phone/confirm', params, true),\n [http],\n );\n}\n\n/**\n * @function useForgotPasswordApi\n * @returns { ForgotPasswordApiParams }\n */\nexport function useForgotPasswordApi(): ForgotPasswordApiParams {\n const http = useHttp();\n return useCallback(\n (email: string): any => http.post(`auth/password/forgot`, { email }, true),\n [http],\n );\n}\n\n/**\n * @function useResetPasswordApi\n * @returns { ResetPasswordApiParams }\n */\nexport function useResetPasswordApi(): ResetPasswordApiParams {\n const http = useHttp();\n return useCallback(\n (password: string, token: string) =>\n http.post('auth/password/reset', { password, token }, true),\n [http],\n );\n}\n\n/**\n * @function useGetPhoneCodeApi\n * @returns { GetPhoneCodeApiParams }\n */\nexport function useGetPhoneCodeApi(): GetPhoneCodeApiParams {\n const http = useHttp();\n return useCallback(\n (phone: string) =>\n http.post('auth/phone', { phone }, true),\n [http],\n );\n}\n\n/**\n * @function useGetAccessTokenApi\n * @returns { GetAccessTokenApiParams }\n */\nexport function useGetAccessTokenApi(): GetAccessTokenApiParams {\n const http = useHttp();\n return useCallback(\n code =>\n http.get(`/auth/google/code`, { code }, undefined, true),\n [http],\n );\n}\n\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport { SearchAiLogsApiParams } from './types';\n\n/**\n * @function useSearchAiLogsApi\n * @returns { SearchAiLogsApiParams }\n */\nexport const useSearchAiLogsApi = (): SearchAiLogsApiParams => {\n const http = useHttp();\n return useCallback(\n params =>\n http.get('submissions/assessments', params, undefined, true),\n [http]\n );\n};","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n AssignLinesToChallengeApiParams,\n CreateChallengeApiParams,\n DeleteChallengesApiParams,\n GetChallengeApiParams,\n SearchChallengesApiParams,\n UpdateChallengeInfoApiParams,\n UpdateChallengeLabelsApiParams,\n UpdateChallengeStatusApiParams,\n} from './types';\n\n/**\n * @function useGetChallengeApi\n * @returns { GetChallengeApiParams }\n */\nexport function useGetChallengeApi(): GetChallengeApiParams {\n const http = useHttp();\n return useCallback(\n challengeId =>\n http.get(`challenges/${challengeId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useSearchChallengesApi\n * @returns { SearchChallengesApiParams }\n */\nexport const useSearchChallengesApi = (): SearchChallengesApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.get('challenges', searchParams, undefined, true),\n [http]\n );\n};\n\n/**\n * @function useDeleteChallengesApi\n * @returns { DeleteChallengesApiParams }\n */\n export const useDeleteChallengesApi = (): DeleteChallengesApiParams => {\n const http = useHttp();\n return useCallback(\n (challengeIds) =>\n http.delete('challenges/delete', challengeIds, true),\n [http]\n );\n};\n\n/**\n * @function useAssignChallengeLabelsApi\n * @returns { UpdateChallengeLabelsApiParams }\n */\nexport const useAssignChallengeLabelsApi = (): UpdateChallengeLabelsApiParams => {\n const http = useHttp();\n return useCallback(\n labels => http.post(`challenges/labels`, labels, true),\n [http]\n );\n};\n\n/**\n * @function useDeleteChallengeLabelsApi\n * @returns { UpdateChallengeLabelsApiParams }\n */\n export const useDeleteChallengeLabelsApi = (): UpdateChallengeLabelsApiParams => {\n const http = useHttp();\n return useCallback(\n labels => http.delete(`challenges/labels`, labels, true),\n [http]\n );\n};\n\n/**\n * @function useCreateChallengeApi\n * @returns { CreateChallengeApiParams }\n */\n export const useCreateChallengeApi = (): CreateChallengeApiParams => {\n const http = useHttp();\n return useCallback(\n challengeInfo => http.post(`challenges`, challengeInfo, true),\n [http]\n );\n};\n\n/**\n * @function useUpdateChallengeInfoApi\n * @returns { UpdateChallengeInfoApiParams }\n */\n export const useUpdateChallengeInfoApi = (): UpdateChallengeInfoApiParams => {\n const http = useHttp();\n return useCallback(\n (challengeId, challengeInfo) =>\n http.put(`challenges/${challengeId}`, challengeInfo, true),\n [http]\n );\n};\n\n/**\n * @function useUpdateChallengeStatusApi\n * @returns { UpdateChallengeStatusApiParams }\n */\n export function useUpdateChallengeStatusApi(): UpdateChallengeStatusApiParams {\n const http = useHttp();\n return useCallback(\n (status, challengeIds) =>\n http.put(`challenges/${status}`, challengeIds, true),\n [http]\n );\n}\n\n /**\n * @function useAssignLinesToChallengeApi\n * @returns { AssignLinesToChallengeApiParams }\n */\n export function useAssignLinesToChallengeApi(): AssignLinesToChallengeApiParams {\n const http = useHttp();\n return useCallback(\n (challengeId, lines) => http.post(`challenges/${challengeId}/lines`, lines, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n FileUploadApiParams,\n CreateMediaApiParams,\n VerifyMediaApiParams,\n} from './types';\n\n/**\n * @function useFileUploadApi\n * @returns { FileUploadApiParams }\n */\nexport const useFileUploadApi = (): FileUploadApiParams => {\n const http = useHttp();\n return useCallback(data => http.post('files', data), [http]);\n};\n\n/**\n * @function useCreateMedia\n * @returns { CreateMediaApiParams }\n */\nexport function useCreateMediaApi(): CreateMediaApiParams {\n const http = useHttp();\n return useCallback(mimeType => http.post('media', { mimeType }, true), [http]);\n}\n\n/**\n * @function useVerifyMedia\n * @returns { VerifyMediaApiParams }\n */\nexport function useVerifyMediaApi(): VerifyMediaApiParams {\n const http = useHttp();\n return useCallback(mediaId => http.post(`media/${mediaId}/verify`, undefined, true), [http]);\n}","import { useCallback } from 'react';\nimport { CompanyStatus } from '../../constants/interfaces/Company';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n ActiveDeActivateCompaniesApiParams,\n CreateCompanyApiParams,\n DownloadCompanyUsersReportApiParams,\n GetCompanyApiParams,\n GetCompanyUserStatsApiParams,\n SearchCompaniesApiParams,\n SetCompanyUsersLimitApiParams,\n SetCompanyLogoApiParams,\n DeleteCompanyLogoApiParams,\n SetCompanyOwnerApiParams,\n UpdateCompanyNameApiParams,\n GetCompanyVoiceSettingsApiParams,\n SetCompanyVoiceSettingsApiParams,\n} from './types';\n\n/**\n * @function useSearchCompaniesApi\n * @returns { SearchCompaniesApiParams }\n */\nexport const useSearchCompaniesApi = (): SearchCompaniesApiParams => {\n const http = useHttp();\n return useCallback(\n (searchParams, statuses) => {\n const params = {\n limit: searchParams?.limit ?? 2000,\n offset: searchParams?.offset ?? 0,\n query: searchParams?.searchTerm,\n sort: searchParams?.orderBy\n ? `${searchParams.orderBy.field || 'name'}_${searchParams.orderBy.asc ? 'asc' : 'desc'}`\n : 'name_asc',\n status: statuses?.join(',') || `${CompanyStatus.ACTIVE},${CompanyStatus.DELETED}`\n };\n return http.get('companies', params, undefined, true);\n },\n [http]\n );\n};\n\n/**\n * @function useSearchListCompaniesApi\n * @returns { SearchCompaniesApiParams }\n */\nexport const useSearchListCompaniesApi = (): SearchCompaniesApiParams => {\n const http = useHttp();\n return useCallback(\n (searchParams, statuses) => {\n const params = {\n limit: searchParams?.limit ?? 2000,\n offset: searchParams?.offset ?? 0,\n query: searchParams?.searchTerm,\n sort: searchParams?.orderBy\n ? `${searchParams.orderBy.field || 'name'}_${searchParams.orderBy.asc ? 'asc' : 'desc'}`\n : 'name_asc',\n status: statuses?.join(',') || `${CompanyStatus.ACTIVE},${CompanyStatus.DELETED}`\n };\n return http.get('companies/admin-search', params, undefined, true);\n },\n [http]\n );\n};\n\n/**\n * @function useGetCompanyApi\n * @returns { GetCompanyApiParams }\n */\nexport function useGetCompanyApi(): GetCompanyApiParams {\n const http = useHttp();\n return useCallback(\n companyId =>\n http.get(`companies/${companyId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useCreateCompanyApi\n * @returns { CreateCompanyApiParams }\n */\nexport function useCreateCompanyApi(): CreateCompanyApiParams {\n const http = useHttp();\n return useCallback(\n (name, subdomain) => http.post('companies/create-company', { name, subdomain }, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateCompanyNameApi\n * @returns { UpdateCompanyNameApiParams }\n */\nexport function useUpdateCompanyNameApi(): UpdateCompanyNameApiParams {\n const http = useHttp();\n return useCallback(\n (companyId, name) => http.put(`companies/${companyId}`, { name }, true),\n [http]\n );\n}\n\n/**\n * @function useDownloadCompanyUsersReportApi\n * @returns { DownloadCompanyUsersReportApiParams }\n */\nexport function useDownloadCompanyUsersReportApi(): DownloadCompanyUsersReportApiParams {\n const http = useHttp();\n return useCallback(\n companyId =>\n http.post(`users/export-company-users`, {\n companyId,\n }),\n [http]\n );\n}\n\n/**\n * @function useActivateCompany\n * @returns { ActiveDeActivateCompaniesApiParams }\n */\nexport function useActivateCompanies(): ActiveDeActivateCompaniesApiParams {\n const http = useHttp();\n return useCallback(\n companyIds => http.put(`companies/active`, companyIds, true),\n [http]\n );\n}\n\n/**\n * @function useDeActivateCompanies\n * @returns { ActiveDeActivateCompaniesApiParams }\n */\nexport function useDeActivateCompanies(): ActiveDeActivateCompaniesApiParams {\n const http = useHttp();\n return useCallback(\n companyIds => http.put(`companies/archive`, companyIds, true),\n [http]\n );\n}\n\n/**\n * @function useGetCompanyUserStatsApi\n * @returns { GetCompanyUserStatsApiParams }\n */\nexport function useGetCompanyUserStatsApi(): GetCompanyUserStatsApiParams {\n const http = useHttp();\n return useCallback(\n companyId =>\n http.get(`companies/${companyId}/users-stats`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useSetCompanyUsersLimitApi\n * @returns { SetCompanyUsersLimitApiParams }\n */\nexport function useSetCompanyUsersLimitApi(): SetCompanyUsersLimitApiParams {\n const http = useHttp();\n return useCallback(\n (companyId, usersLimit) =>\n http.post(`companies/${companyId}/set-users-limit`, { usersLimit }, true),\n [http]\n );\n}\n\n/**\n * @function useSetCompanyOwnerApi\n * @returns { SetCompanyOwnerApiParams }\n */\nexport function useSetCompanyOwnerApi(): SetCompanyOwnerApiParams {\n const http = useHttp();\n return useCallback(\n (companyId, ownerId) =>\n http.post(`companies/${companyId}/set-owner`, { ownerId }, true),\n [http]\n );\n}\n\n/**\n * @function useSetCompanyLogoApi\n * @returns { SetCompanyLogoApiParams }\n */\nexport function useSetCompanyLogoApi(): SetCompanyLogoApiParams {\n const http = useHttp();\n return useCallback(\n (companyId, mediaId) =>\n http.post(`companies/${companyId}/update-logo`, { mediaId }, true),\n [http]\n );\n}\n\n/**\n * @function useDeleteCompanyLogoApi\n * @returns { DeleteCompanyLogoApiParams }\n */\nexport function useDeleteCompanyLogoApi(): DeleteCompanyLogoApiParams {\n const http = useHttp();\n return useCallback(\n (companyId) =>\n http.delete(`companies/${companyId}/delete-logo`, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetCompanyVoiceSettingsApi\n * @returns { GetCompanyVoiceSettingsApiParams }\n */\nexport function useGetCompanyVoiceSettingsApi(): GetCompanyVoiceSettingsApiParams {\n const http = useHttp();\n return useCallback(\n (companyId, role) =>\n http.get('voiceSettings', { companyId, role }, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useSetCompanyVoiceSettingsApi\n * @returns { SetCompanyVoiceSettingsApiParams }\n */\nexport function useSetCompanyVoiceSettingsApi(): SetCompanyVoiceSettingsApiParams {\n const http = useHttp();\n return useCallback(\n (settings) =>\n http.post('voiceSettings/update', settings, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport { SearchInvitersApiParams } from './types';\n\n/**\n * @function useSearchInvitersApi\n * @returns { SearchInvitersApiParams }\n */\nexport const useSearchInvitersApi = (): SearchInvitersApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams =>\n http.post('invitations/load-filters-data', searchParams),\n [http]\n );\n};\n\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n AssignedLabelsIdsApiParams,\n AssignLabelsApiParams,\n CreateLabelApiParams,\n DeleteLabelApiParams,\n SearchLabelsApiParams,\n UpdateLabelApiParams,\n} from './types';\n\n\n/**\n * @function useCreateLabelApi\n * @returns { CreateLabelApiParams }\n */\nexport const useCreateLabelApi = (): CreateLabelApiParams => {\n const http = useHttp();\n return useCallback(params => http.post('labels', params), [http]);\n};\n\n/**\n * @function useSearchLabelsApi\n * @returns { SearchLabelsApiParams }\n */\nexport const useSearchLabelsApi = (): SearchLabelsApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('labels/search', searchParams),\n [http]\n );\n};\n\n/**\n * @function useDeleteLabelApi\n * @returns { DeleteLabelApiParams }\n */\nexport const useDeleteLabelApi = (): DeleteLabelApiParams => {\n const http = useHttp();\n return useCallback(labelId => http.delete(`labels/${labelId}`), [http]);\n};\n\n/**\n * @function useUpdateLabelApi\n * @returns { UpdateLabelApiParams }\n */\nexport const useUpdateLabelApi = (): UpdateLabelApiParams => {\n const http = useHttp();\n return useCallback(\n (labelId, params) => http.put(`labels/${labelId}`, params),\n [http]\n );\n};\n\n/**\n * @function useAssignLabelsApi\n * @returns { AssignLabelsApiParams }\n */\nexport const useAssignLabelsApi = (): AssignLabelsApiParams => {\n const http = useHttp();\n return useCallback(\n (\n labels,\n entities,\n deleted,\n entityType,\n selectAll,\n search,\n assignedArea\n ) =>\n http.post(`labels/assign`, {\n labels,\n entities,\n entityType: entityType,\n deleted,\n selectAll,\n search,\n assignedArea,\n }),\n [http]\n );\n};\n\n/**\n * @function useAssignedLabelsIdsApi\n * @returns { AssignedLabelsIdsApiParams }\n */\nexport const useAssignedLabelsIdsApi = (): AssignedLabelsIdsApiParams => {\n const http = useHttp();\n return useCallback(\n (entityIds, assignedArea, entityType, search, selectAll) =>\n http.post(`labels/load-assigned`, {\n entityIds,\n assignedArea,\n entityType,\n search,\n selectAll,\n }),\n [http]\n );\n};\n\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n DeletePractisSetsApiParams,\n GetPractisSetApiParams,\n SearchPractisSetsApiParams,\n UpdatePractisSetApiParams,\n GetPractisSetContentApiParams,\n UpdatePractisSetLabelsApiParams,\n CreateNewPractisSetApiParams,\n AssignPractisSetContentApiParams,\n UpdatePractisSetStatusApiParams,\n} from './types';\n\n/**\n * @function useSearchPractisSetsApi\n * @returns { SearchPractisSetsApiParams }\n */\nexport const useSearchPractisSetsApi = (): SearchPractisSetsApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.get('practisSets', searchParams, undefined, true),\n [http]\n );\n};\n\n/**\n * @function useDeletePractisSetsApi\n * @returns { DeletePractisSetsApiParams }\n */\n export const useDeletePractisSetsApi = (): DeletePractisSetsApiParams => {\n const http = useHttp();\n return useCallback(\n (practisSetIds) =>\n http.delete('practisSets/delete', practisSetIds, true),\n [http]\n );\n};\n\n/**\n * @function useGetPractisSetApi\n * @returns { GetPractisSetApiParams }\n */\nexport function useGetPractisSetApi(): GetPractisSetApiParams {\n const http = useHttp();\n return useCallback(\n practisSetId =>\n http.get(`practisSets/${practisSetId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetPractisSetContentApi\n * @returns { GetPractisSetContentApiParams }\n */\n export function useGetPractisSetContentApi(): GetPractisSetContentApiParams {\n const http = useHttp();\n return useCallback(\n practisSetId =>\n http.get(\n `practisSets/${practisSetId}/content`,\n undefined,\n undefined,\n true\n ),\n [http]\n );\n}\n \n/**\n * @function useAssignPractisSetContentApi\n * @returns { AssignPractisSetContentApiParams }\n */\n export function useAssignPractisSetContentApi(): AssignPractisSetContentApiParams {\n const http = useHttp();\n return useCallback(\n (practisSetId, practisSetContentData) =>\n http.post(\n `practisSets/${practisSetId}/content`,\n practisSetContentData,\n true\n ),\n [http]\n );\n}\n\n/**\n * @function useUpdatePractisSetApi\n * @returns { UpdatePractisSetApiParams }\n */\nexport function useUpdatePractisSetApi(): UpdatePractisSetApiParams {\n const http = useHttp();\n return useCallback(\n (practisSetId, data) => http.put(`practisSets/${practisSetId}`, data, true),\n [http]\n );\n}\n/**\n * @function useAssignPractisSetLabelsApi\n * @returns { UpdatePractisSetLabelsApiParams }\n */\n export function useAssignPractisSetLabelsApi(): UpdatePractisSetLabelsApiParams {\n const http = useHttp();\n return useCallback(\n (practisSetLabels) =>\n http.post('practisSets/labels', practisSetLabels, true),\n [http]\n );\n}\n\n/**\n * @function useDeletePractisSetLabelsApi\n * @returns { UpdatePractisSetLabelsApiParams }\n */\nexport function useDeletePractisSetLabelsApi(): UpdatePractisSetLabelsApiParams {\n const http = useHttp();\n return useCallback(\n (practisSetLabels) =>\n http.delete('practisSets/labels', practisSetLabels, true),\n [http]\n );\n}\n\n/**\n * @function useCreateNewPractisSetApi\n * @returns { CreateNewPractisSetApiParams }\n */\n export function useCreateNewPractisSetApi(): CreateNewPractisSetApiParams {\n const http = useHttp();\n return useCallback(\n practisSet => http.post('practisSets', practisSet, true),\n [http]\n );\n}\n\n/**\n * @function useUpdatePractisSetStatusApi\n * @returns { UpdatePractisSetStatusApiParams }\n */\n export function useUpdatePractisSetStatusApi(): UpdatePractisSetStatusApiParams {\n const http = useHttp();\n return useCallback(\n (status, practisSetIds) =>\n http.put(`practisSets/${status}`, practisSetIds, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n AssignLinesToScenarioApiParams,\n CreateNewScenarioApiParams,\n DeleteScenariosApiParams,\n DownloadScenarioReportApiParams,\n GetScenarioApiParams,\n SearchScenariosApiParams,\n UpdateScenarioApi,\n UpdateScenarioLabelApi,\n UpdateScenarioStatusApiParams,\n} from './types';\n\n\n/**\n * @function useSearchScenariosApi\n * @returns { SearchScenariosApiParams }\n */\nexport const useSearchScenariosApi = (): SearchScenariosApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.get('scenarios', searchParams, undefined, true),\n [http]\n );\n};\n\n/**\n * @function useDeleteScenariosApi\n * @returns { DeleteScenariosApiParams }\n */\n export const useDeleteScenariosApi = (): DeleteScenariosApiParams => {\n const http = useHttp();\n return useCallback(\n (scenarioIds) =>\n http.delete('scenarios/delete', scenarioIds, true),\n [http]\n );\n};\n\n/**\n * @function useDownloadScenarioReportApi\n * @returns { DownloadScenarioReportApiParams }\n */\nexport const useDownloadScenarioReportApi = (): DownloadScenarioReportApiParams => {\n const http = useHttp();\n return useCallback(\n scenarioId => http.get(`scenarios/report/${scenarioId}`, null, 'blob'),\n [http]\n );\n};\n\n/**\n * @function useGetScenarioApi\n * @returns { GetScenarioApiParams }\n */\nexport function useGetScenarioApi(): GetScenarioApiParams {\n const http = useHttp();\n return useCallback(\n scenarioId =>\n http.get(`scenarios/${scenarioId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateScenarioApi\n * @returns { UpdateScenarioApi }\n */\nexport function useUpdateScenarioApi(): UpdateScenarioApi {\n const http = useHttp();\n return useCallback(\n (scenarioId, data) => http.put(`scenarios/${scenarioId}`, data, true),\n [http]\n );\n}\n\n/**\n * @function useAssignScenarioLabelApi\n * @returns { UpdateScenarioLabelApi }\n */\n export function useAssignScenarioLabelApi(): UpdateScenarioLabelApi {\n const http = useHttp();\n return useCallback(\n labels => http.post(`scenarios/labels`, labels, true),\n [http]\n );\n }\n\n /**\n * @function useDeleteScenarioLabelApi\n * @returns { UpdateScenarioLabelApi }\n */\n export function useDeleteScenarioLabelApi(): UpdateScenarioLabelApi {\n const http = useHttp();\n return useCallback(\n labels => http.delete(`scenarios/labels`, labels, true),\n [http]\n );\n}\n\n /**\n * @function useCreateScenarioApi\n * @returns { CreateNewScenarioApiParams }\n */\n export function useCreateScenarioApi(): CreateNewScenarioApiParams {\n const http = useHttp();\n return useCallback(\n (scenarioInfo) => http.post(`scenarios`, scenarioInfo, true),\n [http]\n );\n}\n\n /**\n * @function useAssignLinesToScenarioApi\n * @returns { AssignLinesToScenarioApiParams }\n */\n export function useAssignLinesToScenarioApi(): AssignLinesToScenarioApiParams {\n const http = useHttp();\n return useCallback(\n (scenarioId, lines) => http.post(`scenarios/${scenarioId}/lines`, lines, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateScenarioStatusApi\n * @returns { UpdateScenarioStatusApiParams }\n */\n export function useUpdateScenarioStatusApi(): UpdateScenarioStatusApiParams {\n const http = useHttp();\n return useCallback(\n (status, ScenarioIds) =>\n http.put(`scenarios/${status}`, ScenarioIds, true),\n [http]\n );\n}","import { useCallback } from 'react';\nimport { useHttp } from '../../tools/http/Http';\nimport { GetAuditLogsApiParams, SearchLogsApiParams } from './types';\n\n/**\n * @function useSearchLogsApi\n * @returns { SearchLogsApiParams }\n */\nexport const useSearchLogsApi = (): SearchLogsApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('companies/logs', searchParams),\n [http]\n );\n};\n\n/**\n * @function useSearchAdminLogsApi\n * @returns { SearchLogsApiParams }\n */\nexport function useSearchAdminLogsApi(): SearchLogsApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('admin/logs/search', searchParams),\n [http]\n );\n}\n\n/**\n * @function useGetAuditLogs\n * @returns { GetAuditLogsApiParams }\n */\nexport function useGetAuditLogsApi(): GetAuditLogsApiParams {\n const http = useHttp();\n return useCallback(\n params => http.get('audits', params, undefined, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport { SearchPacingsApiParams } from './types';\n\n/**\n * @function useSearchPacingsApi\n * @returns { SearchPacingsApiParams }\n */\nexport const useSearchPacingsApi = (): SearchPacingsApiParams => {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('pacings/search', searchParams),\n [http]\n );\n};\n\n","import { useCallback } from 'react';\nimport { getSearchSortingValue } from '../../helpers/functions/search-params-helpers';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n AddStagingUsersApiParams,\n AssignFiltersToStagingUsersApiParams,\n AssignTeamsToUserApiParams,\n CreateUserStagingApiParams,\n DeleteStagingApiParams,\n DeleteStagingUsersApiParams,\n DeleteUserApi,\n GetUserReportApiParams,\n InviteStagingUsersApiParams,\n LoadUserRolesApiParams,\n SearchCreatedByUsersListApiParams,\n SearchEditedByUsersListApiParams,\n SearchStagingDraftsApiParams,\n SearchStagingUsersApiParams,\n SearchUsersApiParams,\n UpdateStagingUsersApiParams,\n GetUserFeaturesApiParams,\n DeleteUserLabelsApiParams,\n UpdateUserInfoApiParams,\n UpdateUserPhoneNumberApiParams,\n ConfirmUserPhoneNumberApiParams,\n AssignUserLabelsApiParams,\n UpdateUserPasswordApiParams,\n RevokePendingUsersApiParams,\n GetUserApiParams,\n UpdateUserRoleParams,\n DeleteUserNumberApi,\n GetUserPermissionsApiParams,\n GetUserSettingsApiParams,\n SaveUserSettingsApiParams,\n SetUserPhotoApiParams,\n SearchUserEnrollmentsApiParams,\n ActivateUsersApiParams,\n GetUserPreferencesApiParams,\n UpdateUserPreferencesApiParams,\n CreateUsersApiParams,\n} from './types';\n\n/**\n * @function useGetUserApi\n * @returns { GetUserApiParams }\n */\nexport function useGetUserApi(): GetUserApiParams {\n const http = useHttp();\n return useCallback((userId) =>\n http.get(`users/${userId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateUserRole\n * @returns { UpdateUserRoleParams }\n */\nexport function useUpdateUserRole(): UpdateUserRoleParams {\n const http = useHttp();\n return useCallback((userId, params) =>\n http.put(`users/${userId}/role`, params, true),\n [http]\n );\n}\n\n/**\n * @function useLoadUserRolesApi\n * @returns { LoadUserRolesApiParams }\n */\nexport const useLoadUserRolesApi = (): LoadUserRolesApiParams => {\n const http = useHttp();\n return useCallback(() => http.get('roles'), [http]);\n};\n\n/**\n * @function useSearchUserEnrollmentsApi\n * @returns { SearchUserEnrollmentsApiParams }\n */\nexport function useSearchUserEnrollmentsApi(): SearchUserEnrollmentsApiParams {\n const http = useHttp();\n return useCallback(\n (userId, params) => {\n const searchParams = params || {\n sort: getSearchSortingValue({}, 'assigned', false),\n limit: 10000\n };\n return http.get(`users/${userId}/enrollments`, searchParams, undefined, true);\n },\n [http]\n );\n}\n\n/**\n * @function useSearchUsersApi\n * @returns { SearchUsersApiParams }\n */\nexport function useSearchUsersApi(): SearchUsersApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => http.get('users', searchParams, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useCreateUsersApi\n * @returns { CreateUsersApiParams }\n */\nexport function useCreateUsersApi(): CreateUsersApiParams {\n const http = useHttp();\n return useCallback(\n usersData => http.post('users', usersData, true),\n [http]\n );\n}\n\n\n/**\n * @function useDeleteUserApi\n * @returns { DeleteUserApi }\n */\nexport function useDeleteUserApi(): DeleteUserApi {\n const http = useHttp();\n return useCallback(userIds => http.delete(`/users`, userIds, true), [http]);\n}\n\n/**\n * @function useDeleteUserNumberApi\n * @returns { DeleteUserNumberApi }\n */\nexport function useDeleteUserNumberApi(): DeleteUserNumberApi {\n const http = useHttp();\n return useCallback(userIds => http.delete(`/users/phone`, userIds, true), [http]);\n}\n\n/**\n * @function useGetUserReportApi\n * @returns { GetUserReportApiParams }\n */\nexport function useGetUserReportApi(): GetUserReportApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => {\n return http.get('users/report', searchParams, undefined, true);\n },\n [http]\n );\n}\n\n/**\n * @function useSearchStagingDraftsApi\n * @returns { SearchStagingDraftsApiParams }\n */\nexport function useSearchStagingDraftsApi(): SearchStagingDraftsApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('staging/search', searchParams),\n [http]\n );\n}\n\n/**\n * @function useDeleteStagingApi\n * @returns { DeleteStagingApiParams }\n */\nexport function useDeleteStagingApi(): DeleteStagingApiParams {\n const http = useHttp();\n return useCallback(\n (stagingIds, search, selectAll): Promise<any> =>\n http.delete(`/staging`, {\n stagingIds: stagingIds,\n search,\n selectAll,\n }),\n [http]\n );\n}\n\n/**\n * @function useSearchCreatedByUsersListApi\n * @returns { SearchCreatedByUsersListApiParams }\n */\nexport function useSearchCreatedByUsersListApi(): SearchCreatedByUsersListApiParams {\n const http = useHttp();\n return useCallback(\n searchParams =>\n http.post(`/staging/load-created-filters-data`, searchParams),\n [http]\n );\n}\n\n/**\n * @function useSearchEditedByUsersListApi\n * @returns { SearchEditedByUsersListApiParams }\n */\nexport function useSearchEditedByUsersListApi(): SearchEditedByUsersListApiParams {\n const http = useHttp();\n return useCallback(\n searchParams =>\n http.post(`/staging/load-edited-filters-data`, searchParams),\n [http]\n );\n}\n\n/**\n * @function useAssignTeamsToUserApi\n * @returns { AssignTeamsToUserApiParams }\n */\nexport function useAssignTeamsToUserApi(): AssignTeamsToUserApiParams {\n const http = useHttp();\n return useCallback(\n (userId, addedTeamIds, deletedTeamIds) =>\n http.put(`users/${userId}/manage-teams`, {\n addedTeamIds,\n deletedTeamIds,\n }),\n [http]\n );\n}\n\n/**\n * @function useCreateUserStagingApi\n * @returns { CreateUserStagingApiParams }\n */\nexport function useCreateUserStagingApi(): CreateUserStagingApiParams {\n const http = useHttp();\n return useCallback(\n (name, users) => http.post('staging', { name, users }),\n [http]\n );\n}\n\n/**\n * @function useSearchStagingUsersApi\n * @returns { SearchStagingUsersApiParams }\n */\nexport function useSearchStagingUsersApi(): SearchStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (draftId, searchParams) =>\n http.post(`staging/${draftId}/user/search`, searchParams),\n [http]\n );\n}\n\n/**\n * @function useAddStagingUsersApi\n * @returns { AddStagingUsersApiParams }\n */\nexport function useAddStagingUsersApi(): AddStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (stagingId, users) =>\n http.post(`staging/${stagingId}/user`, { users: users }),\n [http]\n );\n}\n\n/**\n * @function useUpdateStagingUsersApi\n * @returns { UpdateStagingUsersApiParams }\n */\nexport function useUpdateStagingUsersApi(): UpdateStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (stagingId, stagingUserId, user) =>\n http.put(`staging/${stagingId}/user/${stagingUserId}`, user),\n [http]\n );\n}\n\n/**\n * @function useDeleteStagingUsersApi\n * @returns { DeleteStagingUsersApiParams }\n */\nexport function useDeleteStagingUsersApi(): DeleteStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (stagingId, stagingUserIds, search, selectAll) =>\n http.delete(`/staging/${stagingId}/user`, {\n stagingUserIds: stagingUserIds,\n search,\n selectAll,\n }),\n [http]\n );\n}\n\n/**\n * @function useInviteStagingUsersApi\n * @returns { InviteStagingUsersApiParams }\n */\nexport function useInviteStagingUsersApi(): InviteStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (stagingId, stagingUserIds, selectAll, search) =>\n http.post(`/staging/${stagingId}/user/invite`, {\n stagingUserIds: stagingUserIds,\n selectAll: selectAll,\n search,\n }),\n [http]\n );\n}\n\n/**\n * @function useAssignFiltersToStagingUsersApi\n * @returns { AssignFiltersToStagingUsersApiParams }\n */\nexport function useAssignFiltersToStagingUsersApi(): AssignFiltersToStagingUsersApiParams {\n const http = useHttp();\n return useCallback(\n (stagingId, assignFilters) =>\n http.post(`/staging/${stagingId}/user/assign-data`, assignFilters),\n [http]\n );\n}\n\n/**\n * @function useGetUserFeaturesApi\n * @returns { GetUserFeaturesApiParams }\n */\nexport function useGetUserFeaturesApi(): GetUserFeaturesApiParams {\n const http = useHttp();\n return useCallback(\n (userId: number) =>\n http.get(`users/${userId}/features`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useAssignUserLabelsApi\n * @returns { AssignUserLabelsApiParams }\n */\nexport function useAssignUserLabelsApi(): AssignUserLabelsApiParams {\n const http = useHttp();\n return useCallback(\n labels => http.post('users/labels', labels, true),\n [http]\n );\n}\n\n/**\n * @function useDeleteUserLabelsApi\n * @returns { DeleteUserLabelsApiParams }\n */\nexport function useDeleteUserLabelsApi(): DeleteUserLabelsApiParams {\n const http = useHttp();\n return useCallback(\n labels => http.delete('users/labels', labels, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateUserInfo\n * @returns { UpdateUserInfoApiParams }\n */\nexport function useUpdateUserInfo(): UpdateUserInfoApiParams {\n const http = useHttp();\n return useCallback(\n (userId, newUserInfo) => http.put(`users/${userId}`, newUserInfo, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateUserPhoneNumber\n * @returns { UpdateUserPhoneNumberApiParams }\n */\nexport function useUpdateUserPhoneNumber(): UpdateUserPhoneNumberApiParams {\n const http = useHttp();\n return useCallback(\n (userId, phoneNumber) =>\n http.put(`users/${userId}/phone`, { phone: phoneNumber }, true),\n [http]\n );\n}\n\n/**\n * @function useConfirmUserPhoneNumber\n * @returns { ConfirmUserPhoneNumberApiParams }\n */\nexport function useConfirmUserPhoneNumber(): ConfirmUserPhoneNumberApiParams {\n const http = useHttp();\n return useCallback(\n (userId, code) =>\n http.post(`users/${userId}/phone/confirm`, { code }, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateUserPassword\n * @returns { UpdateUserPasswordApiParams }\n */\nexport function useUpdateUserPassword(): UpdateUserPasswordApiParams {\n const http = useHttp();\n return useCallback(\n (userId, password) =>\n http.post(`users/${userId}/password`, password, true),\n [http]\n );\n}\n\n/**\n * @function useRevokePendingUsers\n * @returns { RevokePendingUsersApiParams }\n */\nexport function useRevokePendingUsers(): RevokePendingUsersApiParams {\n const http = useHttp();\n return useCallback(\n userIds => http.post(`users/invite/revoke`, userIds, true),\n [http]\n );\n}\n/**\n * @function useGetUserPermissionsApi\n * @returns { GetUserPermissionsApiParams }\n */\n export function useGetUserPermissionsApi(): GetUserPermissionsApiParams {\n const http = useHttp();\n return useCallback(\n (userId: number) =>\n http.get(`users/${userId}/permissions`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetUserSettingsApi\n * @returns { GetUserSettingsApiParams }\n */\n export function useGetUserSettingsApi(): GetUserSettingsApiParams {\n const http = useHttp();\n return useCallback(\n (userId: number) =>\n http.get(`users/${userId}/settings`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useSaveUserSettingsApi\n * @returns { SaveUserSettingsApiParams }\n */\n export function useSaveUserSettingsApi(): SaveUserSettingsApiParams {\n const http = useHttp();\n return useCallback(\n (userId: number, labels: number[] | null) =>\n http.post(`users/${userId}/settings`, labels, true),\n [http]\n );\n}\n/**\n * @function useSetUserPhotoApi\n * @returns { SetUserPhotoApiParams }\n */\n export function useSetUserPhotoApi(): SetUserPhotoApiParams {\n const http = useHttp();\n return useCallback(\n (userId, mediaId) => http.post(`users/${userId}/picture`, { mediaId }, true), [http]);\n}\n\n/**\n * @function useActivateUsersApi\n * @returns { ActivateUsersApiParams }\n */\nexport function useActivateUsersApi(): ActivateUsersApiParams {\n const http = useHttp();\n return useCallback(\n userIds => http.put(`users/activate`, userIds, true),\n [http]\n );\n}\n\n/**\n * @function useGetUserPreferencesApi\n * @returns { GetUserPreferencesApiParams }\n */\nexport function useGetUserPreferencesApi(): GetUserPreferencesApiParams {\n const http = useHttp();\n return useCallback(\n userId => http.get(`users/${userId}/preferences`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateUserPreferencesApi\n * @returns { UpdateUserPreferencesApiParams }\n */\nexport function useUpdateUserPreferencesApi(): UpdateUserPreferencesApiParams {\n const http = useHttp();\n return useCallback(\n (userId, preferences) => http.patch(`users/${userId}/preferences`, preferences, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n GetSubmissionDetailsApiParams,\n SubmissionActionApiParams,\n RequestSubmissionRedoApiParams,\n SearchSubmissionsApiParams,\n ArchiveSubmissionsApiParams,\n RestoreSubmissionsApiParams,\n GetSubmissionReviewApiParams,\n PerformSubmissionReviewApiParams,\n AddSubmissionFlagApiParams,\n DeleteSubmissionFlagApiParams,\n GetSubmissionIdByOldIdParams,\n GetSubmissionRepLinesParams,\n} from './types';\n\n/**\n * @function useSearchSubmissionsApi\n * @returns { SearchSubmissionsApiParams }\n */\n export function useSearchSubmissionsApi(): SearchSubmissionsApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => http.get('submissions', searchParams, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetSubmissionDetailsApi\n * @returns { GetSubmissionDetailsApiParams }\n */\nexport function useGetSubmissionDetailsApi(): GetSubmissionDetailsApiParams {\n const http = useHttp();\n return useCallback(\n submissionId => http.get(`submissions/${submissionId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useRequestSubmissionRedoApi\n * @returns { RequestSubmissionRedoApiParams }\n */\nexport function useRequestSubmissionRedoApi(): RequestSubmissionRedoApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId, { senderName, text }) =>\n http.put(`submissions/${submissionId}/redo`, {\n senderName,\n text,\n }, true),\n [http]\n );\n}\n\n/**\n * @function usePerformSubmissionActionApi\n * @returns { SubmissionActionApiParams }\n */\nexport function usePerformSubmissionActionApi(): SubmissionActionApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId: number, action: string) =>\n http.post(`submissions/${submissionId}/actions`, { action }, true),\n [http]\n );\n}\n\n/**\n * @function useArchiveSubmissionsApi\n * @returns { ArchiveSubmissionsApiParams }\n */\n export function useArchiveSubmissionsApi(): ArchiveSubmissionsApiParams {\n const http = useHttp();\n return useCallback(\n (submissionsIds) =>\n http.put('submissions/archive', submissionsIds, true),\n [http]\n );\n}\n\n/**\n * @function useRestoreSubmissionsApi\n * @returns { RestoreSubmissionsApiParams }\n */\n export function useRestoreSubmissionsApi(): RestoreSubmissionsApiParams {\n const http = useHttp();\n return useCallback(\n (submissionsIds) =>\n http.put('submissions/active', submissionsIds, true),\n [http]\n );\n}\n\n/**\n * @function useGetSubmissionReviewApi\n * @returns { GetSubmissionReviewApiParams }\n */\nexport function useGetSubmissionReviewApi(): GetSubmissionReviewApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId) =>\n http.get(`submissions/${submissionId}/reviews`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function usePerformSubmissionReviewApi\n * @returns { PerformSubmissionReviewApiParams }\n */\n export function usePerformSubmissionReviewApi(): PerformSubmissionReviewApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId, params) => http.post(`submissions/${submissionId}/reviews`, params, true),\n [http]\n );\n}\n\n/**\n * @function useAddSubmissionFlag\n * @returns { AddSubmissionFlagApiParams }\n */\nexport function useAddSubmissionFlag(): AddSubmissionFlagApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId, type) =>\n http.post(`submissions/${submissionId}/flags`, { type }, true),\n [http]\n );\n}\n\n/**\n * @function useDeleteSubmissionFlag\n * @returns { AddSubmissionFlagApiParams }\n */\nexport function useDeleteSubmissionFlag(): DeleteSubmissionFlagApiParams {\n const http = useHttp();\n return useCallback(\n (submissionId, flagId) =>\n http.delete(`submissions/${submissionId}/flags/${flagId}`, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetSubmissionIdByOldId\n * @returns { GetSubmissionIdByOldIdParams }\n */\nexport function useGetSubmissionIdByOldId(): GetSubmissionIdByOldIdParams {\n const http = useHttp();\n return useCallback(\n (oldSubmissionId, type) =>\n http.get(`submissions/old/${oldSubmissionId}`, { type }, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetSubmissionRepLines\n * @returns { GetSubmissionRepLinesParams }\n */\nexport function useGetSubmissionRepLines(): GetSubmissionRepLinesParams {\n const http = useHttp();\n return useCallback(\n (params) =>\n http.get(`/submissions/rep-log`, params, undefined, true),\n [http]\n );\n}","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n AssignMembersToTeamsApiParams,\n CreateNewTeamApiParams,\n DeleteMembersToTeamsApiParams,\n DeleteTeamsApiParams,\n GetMembersReportApiParams,\n GetPractisSetsReportApiParams,\n GetEnrollmentsReportApiParams,\n GetSingleTeamApiParams,\n MarkTeamAsViewedApiParams,\n SearchPractisSetDetailsUsersApiParams,\n SearchTeamLeadersApiParams,\n SearchTeamMembersApiParams,\n SearchTeamsApiParams,\n SearchTrainingPractisSetsApiParams,\n UpdateLabelsTeamsApiParams,\n UpdateTeamLeaderApiParams,\n UpdateTeamNameApiParams,\n} from './types';\n\n/**\n * @function useSearchTeamsApi\n * @returns { SearchTeamsApiParams }\n */\nexport function useSearchTeamsApi(): SearchTeamsApiParams {\n const http = useHttp();\n return useCallback(searchParams => http.get(`teams`, searchParams, undefined, true), [http]);\n}\n\n/**\n * @function useSearchTeamLeadersApi\n * @returns { SearchTeamLeadersApiParams }\n */\nexport function useSearchTeamLeadersApi(): SearchTeamLeadersApiParams {\n const http = useHttp();\n return useCallback(\n searchParams => http.post('teams/leaders-search', searchParams),\n [http]\n );\n}\n\n/**\n * @function useGetSingleTeamApi\n * @returns { GetSingleTeamApiParams }\n */\nexport function useGetSingleTeamApi(): GetSingleTeamApiParams {\n const http = useHttp();\n return useCallback(\n teamId => http.get(`teams/${teamId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useSearchTrainingPractisSetsApi\n * @returns { SearchTrainingPractisSetsApiParams }\n */\nexport function useSearchTrainingPractisSetsApi(): SearchTrainingPractisSetsApiParams {\n const http = useHttp();\n return useCallback(\n (teamId, searchParams) =>\n http.get(\n `teams/${teamId}/practisSets`,\n searchParams,\n undefined,\n true\n ),\n [http]\n );\n}\n\n/**\n * @function useSearchPractisSetDetailsUsersApi\n * @returns { SearchPractisSetDetailsUsersApiParams }\n */\nexport function useSearchPractisSetDetailsUsersApi(): SearchPractisSetDetailsUsersApiParams {\n const http = useHttp();\n return useCallback(\n (teamId, practisSetId, searchParams) =>\n http.get(\n `teams/${teamId}/practisSets/${practisSetId}/enrollments`,\n searchParams,\n undefined,\n true\n ),\n [http]\n );\n}\n\n/**\n * @function useDeleteTeamsApi\n * @returns { DeleteTeamsApiParams }\n */\nexport function useDeleteTeamsApi(): DeleteTeamsApiParams {\n const http = useHttp();\n return useCallback(\n (teamIds) =>\n http.delete(`teams`, teamIds, true),\n [http]\n );\n}\n\n/**\n * @function useGetMembersReportApi\n * @returns { GetMembersReportApiParams }\n */\nexport function useGetMembersReportApi(): GetMembersReportApiParams {\n const http = useHttp();\n return useCallback(\n (teamId, searchParams) => {\n return http.get(`teams/${teamId}/reports/members`, searchParams, \"blob\", true);\n },\n [http]\n );\n}\n\n/**\n * @function useGetPractisSetsReportApi\n * @returns { GetPractisSetsReportApiParams }\n */\nexport function useGetPractisSetsReportApi(): GetPractisSetsReportApiParams {\n const http = useHttp();\n return useCallback(\n (searchParams, teamId) => {\n return http.get(`teams/${teamId}/reports/practisSets`, searchParams, \"blob\", true);\n },\n [http]\n );\n}\n\n/**\n * @function useGetEnrollmentsReportApi\n * @returns { GetEnrollmentsReportApiParams }\n */\n export function useGetEnrollmentsReportApi(): GetEnrollmentsReportApiParams {\n const http = useHttp();\n return useCallback(\n (searchParams, teamId, psetId) => {\n return http.get(`teams/${teamId}/reports/practisSets/${psetId}/enrollments`, searchParams, \"blob\", true);\n },\n [http]\n );\n}\n\n/**\n * @function useSearchTeamMembersApi\n * @returns { SearchTeamMembersApiParams }\n */\nexport const useSearchTeamMembersApi = (): SearchTeamMembersApiParams => {\n const http = useHttp();\n\n return useCallback(\n (teamId, searchParams) => {\n return http.get(\n `/teams/${teamId}/members`,\n searchParams,\n undefined,\n true\n );\n },\n [http]\n );\n};\n\n/**\n * @function useMarkTeamAsViewedApi\n * @returns { MarkTeamAsViewedApiParams }\n */\nexport function useMarkTeamAsViewedApi(): MarkTeamAsViewedApiParams {\n const http = useHttp();\n return useCallback(\n teamId => http.put(`teams/${teamId}/user/mark-as-viewed`),\n [http]\n );\n}\n\n/**\n * @function useCreateNewTeamApi\n * @returns { CreateNewTeamApiParams }\n */\nexport function useCreateNewTeamApi(): CreateNewTeamApiParams {\n const http = useHttp();\n return useCallback(name => http.post('teams', { name }, true), [http]);\n}\n\n/**\n * @function useAssignMembersToTeamsApi\n * @returns { AssignMembersToTeamsApiParams }\n */\nexport function useAssignMembersToTeamsApi(): AssignMembersToTeamsApiParams {\n const http = useHttp();\n return useCallback(\n members => http.post('teams/members', members, true),\n [http]\n );\n}\n\n\n/**\n * @function useDeleteMembersFromTeamsApi\n * @returns { DeleteMembersToTeamsApiParams }\n */\nexport function useDeleteMembersFromTeamsApi(): DeleteMembersToTeamsApiParams {\n const http = useHttp();\n return useCallback(\n members => http.delete('teams/members', members, true),\n [http]\n );\n}\n\n/**\n * @function useAssignLabelsToTeamsApi\n * @returns { UpdateLabelsTeamsApiParams }\n */\nexport function useAssignLabelsToTeamsApi(): UpdateLabelsTeamsApiParams {\n const http = useHttp();\n return useCallback(\n labels => http.post('teams/labels', labels, true),\n [http]\n );\n}\n/**\n * @function useDeleteLabelsFromTeamsApi\n * @returns { UpdateLabelsTeamsApiParams }\n */\nexport function useDeleteLabelsFromTeamsApi(): UpdateLabelsTeamsApiParams {\n const http = useHttp();\n return useCallback(\n labels => http.delete('teams/labels', labels, true),\n [http]\n );\n}\n/**\n * @function useUpdateTeamNameApi\n * @returns { UpdateTeamNameApiParams }\n */\nexport function useUpdateTeamNameApi(): UpdateTeamNameApiParams {\n const http = useHttp();\n return useCallback(\n (teamId, name) => http.put(`teams/${teamId}`, { name }, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateTeamLeaderApi\n * @returns { UpdateTeamLeaderApiParams }\n */\nexport function useUpdateTeamLeaderApi(): UpdateTeamLeaderApiParams {\n const http = useHttp();\n return useCallback(\n (teamUserId, isTeamLead) =>\n http.put(`teams/members/${teamUserId}`, { isTeamLead }, true),\n [http]\n );\n}\n","import { useCallback } from 'react';\nimport { useHttp } from '../../tools/http/Http';\nimport {\n EnrollPractisSetsToUserApiParams,\n DeleteEnrollmentsParams,\n EnrollmentsDueDateType,\n EnrollmentSearchParams,\n GetEnrollmentsParams,\n GetEnrollmentApiParams,\n GetEnrollmentProgressApiParams,\n GetEnrollmentDailyTrainingApiParams,\n OverdueLearnersSearchParams,\n getOverdueLearnersParams\n} from './types';\n\n\n/**\n * @function useEnrollPractisSetsToUserApi\n * @returns { EnrollPractisSetsToUserApiParams }\n */\n export function useEnrollPractisSetsToUserApi() {\n const http = useHttp();\n return useCallback(\n enrollments => http.post('enrollments', enrollments, true),\n [http]\n ) as EnrollPractisSetsToUserApiParams;\n}\n\n/**\n * @function useDeleteEnrollmentsApi\n * @param { number[] } enrollmentIds\n * @returns { Promise<void> }\n */\n export function useDeleteEnrollmentsApi() {\n const http = useHttp();\n return useCallback(\n (enrollmentIds) =>\n http.delete(`enrollments`, enrollmentIds, true),\n [http]\n ) as DeleteEnrollmentsParams;\n}\n\n/**\n * @function useCreateUpdateEnrollmentDueDate\n * @param { EnrollmentsDueDateType[] } enrollmentDueDates\n * @returns { Promise<void> }\n */\nexport function useCreateUpdateEnrollmentDueDate() {\n const http = useHttp();\n return useCallback(\n (enrollmentDueDates: EnrollmentsDueDateType[]) =>\n http.post(`/enrollments/dueDate`, enrollmentDueDates, true),\n [http]\n );\n}\n\n/**\n * @function useGetEnrollments\n * @param { searchParams[] } EnrollmentSearchParams\n * @returns { Promise<void> }\n */\nexport function useGetEnrollments() {\n const http = useHttp();\n return useCallback(\n (searchParams: EnrollmentSearchParams) => http.get('enrollments', searchParams, undefined, true),\n [http]\n ) as GetEnrollmentsParams;\n}\n\n/**\n * @function useGetEnrollmentApi\n * @returns { GetEnrollmentApiParams }\n */\nexport function useGetEnrollmentApi(): GetEnrollmentApiParams {\n const http = useHttp();\n return useCallback(\n (enrollmentId) =>\n http.get(`/enrollments/${enrollmentId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetEnrollmentProgressApi\n * @returns { GetEnrollmentProgressApiParams }\n */\nexport function useGetEnrollmentProgressApi(): GetEnrollmentProgressApiParams {\n const http = useHttp();\n return useCallback(\n (enrollmentId) =>\n http.get(`/enrollments/${enrollmentId}/progress_status`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetEnrollmentDailyTrainingApi\n * @returns { GetEnrollmentProgressApiParams }\n */\nexport function useGetEnrollmentDailyTrainingApi(): GetEnrollmentDailyTrainingApiParams {\n const http = useHttp();\n return useCallback(\n (enrollmentId) =>\n http.get(`/enrollments/${enrollmentId}/daily_training`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetOverdueLearners\n * @param { searchParams[] } OverdueLearnersSearchParams\n * @returns { getOverdueLearnersParams }\n */\nexport function useGetOverdueLearners() {\n const http = useHttp();\n return useCallback(\n (searchParams: OverdueLearnersSearchParams) => http.get('/enrollments/overdue-users', searchParams, undefined, true),\n [http]\n ) as getOverdueLearnersParams;\n}\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport {\n InviteUsersApiParams,\n ResendInvitationApiParams,\n TestInvitationApiParams,\n UserPerformanceApiParams,\n} from './types';\n\n/**\n * @function useUserPerformanceApi\n * @returns { UserPerformanceApiParams }\n */\nexport function useUserPerformanceApi(): UserPerformanceApiParams {\n const http = useHttp();\n return useCallback(\n (userId, isInvitation) => {\n return isInvitation\n ? http.get(`invitations/${userId}/preview`)\n : http.get(`users/${userId}`, undefined, undefined, true);\n },\n [http]\n );\n}\n\n/**\n * @function useTestInvitationApi\n * @returns { TestInvitationApiParams }\n */\nexport function useTestInvitationApi(): TestInvitationApiParams {\n const http = useHttp();\n return useCallback(\n (code: string): any => http.get(`invitations/${code}`),\n [http]\n );\n}\n\n/**\n * @function useInviteUsers\n * @returns { InviteUsersApiParams }\n */\nexport function useInviteUsers(): InviteUsersApiParams {\n const http = useHttp();\n return useCallback(\n users => http.post(`/users/invite`, users, true),\n [http]\n );\n}\n\n/**\n * @function useResendInvitationApi\n * @returns { ResendInvitationApiParams }\n */\n export function useResendInvitationApi(): ResendInvitationApiParams {\n const http = useHttp();\n return useCallback(\n invitationIds => http.post('/users/invite/resend', invitationIds, true),\n [http]\n );\n}\n\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../tools/http/Http';\nimport { NudgeUsersApiParams, RemindToStartApiParams } from './types';\n\n/**\n * @function useNudgeUsersApi\n * @returns { NudgeUsersApiParams }\n */\nexport function useNudgeUsersApi(): NudgeUsersApiParams {\n const http = useHttp();\n return useCallback(\n nudgeDateList => http.post('nudges/users', nudgeDateList, true),\n [http]\n );\n}\n\n/**\n * @function useRemindToStartApi\n * @returns { RemindToStartApiParams }\n */\nexport function useRemindToStartApi(): RemindToStartApiParams {\n const http = useHttp();\n return useCallback(\n enrollments => http.post('alerts', enrollments, true),\n [http]\n );\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Check = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 -21 512.016 512\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path d=\"m234.667969 469.339844c-129.386719 0-234.667969-105.277344-234.667969-234.664063s105.28125-234.6679685 234.667969-234.6679685c44.992187 0 88.765625 12.8203125 126.589843 37.0976565 7.425782 4.78125 9.601563 14.679687 4.820313 22.125-4.796875 7.445312-14.675781 9.597656-22.121094 4.820312-32.640625-20.972656-70.441406-32.042969-109.289062-32.042969-111.746094 0-202.667969 90.921876-202.667969 202.667969 0 111.742188 90.921875 202.664063 202.667969 202.664063 111.742187 0 202.664062-90.921875 202.664062-202.664063 0-6.679687-.320312-13.292969-.9375-19.796875-.851562-8.8125 5.589844-16.621094 14.378907-17.472656 8.832031-.8125 16.617187 5.589844 17.472656 14.378906.722656 7.53125 1.085937 15.167969 1.085937 22.890625 0 129.386719-105.277343 234.664063-234.664062 234.664063zm0 0\" />\n <path d=\"m261.332031 288.007812c-4.09375 0-8.191406-1.558593-11.304687-4.691406l-96-96c-6.25-6.253906-6.25-16.386718 0-22.636718s16.382812-6.25 22.632812 0l84.695313 84.695312 223.335937-223.339844c6.253906-6.25 16.386719-6.25 22.636719 0s6.25 16.382813 0 22.632813l-234.667969 234.667969c-3.136718 3.113281-7.230468 4.671874-11.328125 4.671874zm0 0\" />\n </g>\n </svg>\n );\n }\n);\n\nexport default Check;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Error = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 -21 512.016 512\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n id=\"a\"\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path\n d=\"M478.309,456.832l-64-128c-2.72-5.408-8.256-8.832-14.304-8.832h-48c-8.832,0-16,7.168-16,16c0,8.832,7.168,16,16,16\n\t\t\th38.112l48,96H41.893l48-96h38.112c8.832,0,16-7.168,16-16c0-8.832-7.168-16-16-16h-48c-6.048,0-11.584,3.424-14.304,8.864\n\t\t\tl-64,128c-2.496,4.96-2.208,10.848,0.704,15.552c2.912,4.704,8.064,7.584,13.6,7.584h448c5.536,0,10.688-2.88,13.632-7.616\n\t\t\tC480.517,467.68,480.773,461.792,478.309,456.832z\"\n />\n <path\n d=\"M367.429,331.776L286.053,34.56C279.941,13.568,261.893,0,240.005,0s-39.968,13.568-46.144,34.816l-81.28,296.96\n\t\t\tc-0.384,1.376-0.576,2.784-0.576,4.224c0,46.656,114.912,48,128,48c13.088,0,128-1.344,128-48\n\t\t\tC368.005,334.56,367.813,333.152,367.429,331.776z M240.005,352c-56.096,0-89.824-11.68-95.52-15.616l80.16-292.864\n\t\t\tC227.749,32.832,237.189,32,240.005,32s12.256,0.832,15.296,11.264l79.776,291.488C326.565,341.408,293.413,352,240.005,352z\"\n />\n <path\n d=\"M345.765,252.672c-3.264-8.192-12.576-12.224-20.768-8.96c-38.272,15.2-131.712,15.2-169.952,0\n\t\t\tc-8.224-3.232-17.472,0.768-20.768,8.96c-3.264,8.192,0.768,17.504,8.96,20.768c22.976,9.12,59.136,14.56,96.768,14.56\n\t\t\tc37.632,0,73.824-5.44,96.8-14.56C345.029,270.208,349.029,260.896,345.765,252.672z\"\n />\n <path\n d=\"M322.213,166.08c-1.952-8.608-10.4-14.016-19.136-12.096c-35.072,7.872-91.104,7.872-126.112,0\n\t\t\tc-8.704-1.888-17.184,3.488-19.136,12.096c-1.92,8.608,3.488,17.184,12.096,19.136c19.776,4.448,44.032,6.784,70.08,6.784\n\t\t\tc26.048,0,50.272-2.336,70.08-6.784C318.725,183.264,324.165,174.72,322.213,166.08z\"\n />\n <path\n d=\"M297.189,75.808c-1.12-8.8-9.312-15.072-17.856-13.92c-22.624,2.816-56.128,2.784-78.624,0\n\t\t\tc-8.864-1.024-16.768,5.12-17.856,13.888c-1.088,8.8,5.12,16.768,13.888,17.856C209.317,95.2,223.877,96,240.005,96\n\t\t\ts30.688-0.8,43.264-2.336C292.069,92.544,298.277,84.576,297.189,75.808z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Error;\n","import React, { memo } from 'react';\nimport styled from 'styled-components';\n\nimport Check from '../../icons/Check';\nimport Error from '../../icons/Error';\nimport { Variables } from '../../../theme/variables';\nimport { ErrorMessagesInterface } from '../ErrorMessages/ErrorMessages';\n\nexport const variantIcon = {\n success: Check,\n error: Error,\n};\n\nconst styleProperties = {\n success: {\n backgroundColor: Variables.Colors.topaz,\n },\n error: {\n backgroundColor: Variables.Colors.tomato,\n },\n};\n\nexport interface Props {\n className?: string;\n message: ErrorMessagesInterface['message'];\n handleClose?: () => void;\n open: boolean;\n variant: keyof typeof variantIcon;\n}\n\nconst SnackbarContainer = styled.div<{\n backgroundColor: string;\n open?: boolean;\n}>`\n box-sizing: border-box;\n min-width: 280px;\n max-width: 550px;\n min-height: 64px;\n background-color: ${props => props.backgroundColor};\n position: absolute;\n left: 24px;\n bottom: 24px;\n display: flex;\n align-items: center;\n visibility: ${props => (props.open ? 'visible' : 'hidden')};\n transition: visibility 1s linear;\n z-index: 99999;\n padding: 20px 24px;\n border-radius: 4px;\n\n @media(max-width:600px) {\n max-width: calc(100vw - 48px);\n height: auto;\n min-height: 64px;\n padding: 3px 18px;\n }\n`;\n\nconst IconWrapper = styled.div`\n width: 16px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n`;\n\nconst StyledIcon = styled.div`\n height: 16px;\n width: 16px;\n color: ${props => props.theme.Colors.white};\n flex: 1;\n`;\n\nconst StyledText = styled.div``;\n\nconst StyledMessageContainer = styled.div`\n font-size: 15px;\n color: ${props => props.theme.Colors.white};\n`;\n\nexport const InfoSnackbar = memo((props: Props) => {\n const { message, variant, open } = props;\n const Icon = variantIcon[variant];\n\n let content;\n\n if (typeof message === 'string') {\n content = message;\n } else if (Array.isArray(message)) {\n content = message.map((text, index) => (\n <StyledText key={index}>{text}</StyledText>\n ));\n } else {\n content = 'unknown message';\n }\n\n return (\n <SnackbarContainer\n backgroundColor={styleProperties[variant].backgroundColor}\n open={open}\n data-test=\"message-box\"\n >\n <IconWrapper>\n <StyledIcon>\n <Icon />\n </StyledIcon>\n </IconWrapper>\n <StyledMessageContainer>{content}</StyledMessageContainer>\n </SnackbarContainer>\n );\n});\n","import { useCallback } from 'react';\nimport { connect, useDispatch } from 'react-redux';\nimport { bindActionCreators, Dispatch } from 'redux';\n\nimport { InfoSnackbar, variantIcon } from '../InfoSnackbar/InfoSnackbar';\nimport { displayMessage, hideMessage } from './store/actions';\nimport { getErrorMessages } from './store/reducers';\nimport { AppState } from '../../../store/reducers';\nimport { CLIENT_SIDE_ERROR_MESSAGE } from './constants';\n\n\nexport const handleMessage = (\n dispatch: Dispatch,\n error: string | Array<string>,\n status: keyof typeof variantIcon = 'error'\n) => {\n const clientSideErrorMessage: string | Array<string> =\n (!Array.isArray(error) && CLIENT_SIDE_ERROR_MESSAGE[error]) ||\n error;\n\n\n dispatch(\n displayMessage({\n message: clientSideErrorMessage,\n status: status,\n })\n );\n setTimeout(() => {\n dispatch(hideMessage());\n }, 5000);\n};\n\nexport const useShowMessage = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (message: string | string[], status: keyof typeof variantIcon) =>\n handleMessage(dispatch, message, status),\n [dispatch]\n );\n};\n\nexport interface ErrorMessagesInterface {\n status: keyof typeof variantIcon | null;\n message: string | Array<string>;\n}\n\nconst ErrorMessages = ({\n messages,\n hideMessage,\n}: {\n messages: ErrorMessagesInterface;\n hideMessage: Function;\n}) => {\n return (\n <>\n {!!messages.status && (\n <InfoSnackbar\n open={!!messages.status}\n variant={messages.status ? messages.status : 'error'}\n message={messages.message}\n handleClose={() => hideMessage()}\n />\n )}\n </>\n );\n};\n\nfunction mapStateToProps(state: AppState) {\n return {\n messages: getErrorMessages(state),\n };\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch) =>\n bindActionCreators(\n {\n hideMessage: hideMessage,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ErrorMessages);\n","import { Variables } from '../../../theme/variables';\nimport { Theme } from './type';\n\nexport const COLORS: Record<\n Theme,\n { light: string; normal: string; dark: string; text: string }\n> = {\n default: {\n light: Variables.Colors.darkSkyBlue,\n normal: Variables.Colors.darkSkyBlueTwo,\n dark: Variables.Colors.coolBlue,\n text: Variables.Colors.white,\n },\n warning: {\n light: Variables.Colors.tomato,\n normal: Variables.Colors.coral,\n dark: Variables.Colors.paleRed,\n text: Variables.Colors.white,\n },\n 'warning-inverse': {\n light: Variables.Colors.tomato,\n normal: Variables.Colors.salmon,\n dark: Variables.Colors.paleRed,\n text: Variables.Colors.white,\n },\n white: {\n light: Variables.Colors.white,\n normal: Variables.Colors.white,\n dark: Variables.Colors.white,\n text: Variables.Colors.black,\n },\n gray: {\n light: Variables.Colors.steelGrey,\n normal: Variables.Colors.battleshipGrey,\n dark: Variables.Colors.darkerGray,\n text: Variables.Colors.white,\n },\n grayLight: {\n light: Variables.Colors.whiteFive,\n normal: Variables.Colors.lightGray,\n dark: Variables.Colors.whiteFive,\n text: Variables.Colors.steelGrey,\n },\n green: {\n light: Variables.Colors.green,\n normal: Variables.Colors.greenTwo,\n dark: Variables.Colors.greenTwo,\n text: Variables.Colors.white,\n },\n};\n","import styled from 'styled-components';\n\nimport { COLORS } from './constants';\nimport { Theme, Variant } from './type';\n\nexport const StyledButtonContent = styled.div<{\n height?: string;\n width?: string;\n fontSize?: number;\n borderRadius?: string;\n hasIcon?: boolean;\n color: Theme;\n}>`\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${props => (props.fontSize ? `${props.fontSize}px` : '13px')};\n font-weight: 500;\n flex: 1;\n padding: 0 16px;\n height: ${props => (props.height ? props.height : '40px')};\n min-width: ${props => (props.width ? props.width : '100px')};\n border-radius: ${props =>\n props.hasIcon ? '0' : props.borderRadius ? props.borderRadius : '4px'};\n\n border-top-left-radius: ${props =>\n props.borderRadius ? props.borderRadius : '4px'};\n border-bottom-left-radius: ${props =>\n props.borderRadius ? props.borderRadius : '4px'};\n box-sizing: border-box;\n`;\n\nexport const StyledButtonIconContainer = styled.div<{\n height?: string;\n color: Theme;\n onlyIcon?: boolean;\n borderRadius?: string;\n}>`\n display: flex;\n width: 40px;\n height: ${props => (props.height ? props.height : '40px')};\n justify-content: center;\n border-radius: ${props =>\n props.onlyIcon\n ? props.borderRadius\n ? props.borderRadius\n : '4px'\n : '0'};\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n background: ${props => COLORS[props.color].light};\n align-items: center;\n & img {\n height: 20px;\n }\n`;\n\nexport const StyledButtonIcon = styled.div<{ buttonSize?: number }>`\n height: ${props => (props.buttonSize ? props.buttonSize : 20)}px;\n width: ${props => (props.buttonSize ? props.buttonSize : 20)}px;\n display: flex;\n justify-content: center;\n`;\n\nexport const StyledButton = styled.button<{\n color: Theme;\n customColor?: string;\n variant?: Variant;\n width?: string;\n buttonSize?: number;\n borderRadius?: string;\n customDisabledColor?: string;\n buttonWidth?: string;\n}>`\n display: flex;\n border: none;\n cursor: pointer;\n padding: 0;\n border-radius: ${props =>\n props.borderRadius ? props.borderRadius : '4px'};\n font-family: Manrope, serif !important;\n height: fit-content;\n ${props => !!props.buttonWidth && `width: ${props.buttonWidth};`}\n &.primary {\n background: ${props =>\n !!props.customColor\n ? props.customColor\n : COLORS[props.color].light};\n color: ${props => COLORS[props.color].text};\n &:hover {\n background: ${props => COLORS[props.color].normal};\n }\n &:active {\n background: ${props => COLORS[props.color].dark};\n }\n &:disabled {\n cursor: default;\n background: ${props =>\n !!props.customDisabledColor\n ? props.customDisabledColor\n : props.theme.Colors.cloudyBlue};\n }\n }\n\n &.inverse {\n background: transparent;\n color: ${props =>\n !!props.customColor\n ? props.customColor\n : COLORS[props.color].light};\n box-shadow: inset 0 0 0 1px\n ${props =>\n !!props.customColor\n ? props.customColor\n : COLORS[props.color].light};\n &:hover {\n background: ${props => COLORS[props.color].light};\n color: ${props => COLORS[props.color].text};\n }\n &:active {\n background: ${props => COLORS[props.color].normal};\n color: ${props => COLORS[props.color].text};\n }\n &:disabled {\n background: transparent;\n color: ${props => props.theme.Colors.cloudyBlue};\n cursor: default;\n box-shadow: inset 0 0 0 1px\n ${props => props.theme.Colors.cloudyBlue};\n }\n }\n\n &.transparent {\n font-weight: bold;\n background: transparent;\n color: ${props => COLORS[props.color].light};\n flex-direction: row-reverse;\n display: flex;\n align-items: center;\n ${StyledButtonContent} {\n padding: 0;\n justify-content: flex-start;\n margin: 0 8px;\n min-width: ${props => (props.width ? props.width : '100px')};\n height: 24px;\n }\n\n ${StyledButtonIconContainer} {\n background: transparent;\n width: ${props => (props.buttonSize ? props.buttonSize : 20)}px;\n height: auto;\n color: ${props => COLORS[props.color].light};\n }\n &:hover,\n &:hover ${StyledButtonIconContainer} {\n color: ${props => COLORS[props.color].normal};\n }\n &:active,\n :active ${StyledButtonIconContainer} {\n color: ${props => COLORS[props.color].dark};\n }\n &:disabled,\n &:disabled ${StyledButtonIconContainer} {\n color: ${props => props.theme.Colors.blueyGray};\n }\n }\n\n &.with-icon {\n background: ${props => COLORS[props.color].normal};\n color: ${props => COLORS[props.color].text};\n &:hover ${StyledButtonIconContainer} {\n background: ${props => COLORS[props.color].normal};\n }\n &:active,\n :active ${StyledButtonIconContainer} {\n background: ${props => COLORS[props.color].dark};\n }\n &:disabled {\n background: ${props => props.theme.Colors.blueyGray};\n cursor: default;\n }\n &:disabled ${StyledButtonIconContainer} {\n background: ${props => props.theme.Colors.cloudyBlue};\n cursor: default;\n }\n }\n`;\n\n","import { forwardRef } from 'react';\n\nimport { Loading } from '../LoadingCopmonent';\nimport { COLORS } from './constants';\nimport {\n StyledButton,\n StyledButtonContent,\n StyledButtonIcon,\n StyledButtonIconContainer,\n} from './style';\nimport { ButtonProps } from './type';\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n label,\n children,\n action,\n height,\n style,\n color,\n disabled,\n icon,\n iconRender,\n loading,\n loadingSize,\n loadingColor,\n variant,\n width,\n className,\n type,\n onlyIcon,\n buttonSize,\n borderRadius,\n fontSize,\n customColor,\n customDisabledColor,\n buttonWidth,\n dataTest\n },\n ref\n ) => {\n return (\n <StyledButton\n ref={ref}\n title={label}\n type={type || 'submit'}\n disabled={disabled || loading}\n onClick={action}\n width={width}\n buttonWidth={buttonWidth}\n style={style}\n variant={variant}\n className={[\n icon || iconRender\n ? variant === 'transparent'\n ? 'transparent'\n : 'with-icon'\n : variant\n ? variant\n : 'primary',\n ].join(' ')}\n color={color ? color : 'default'}\n customColor={customColor}\n customDisabledColor={customDisabledColor}\n buttonSize={buttonSize}\n data-test={dataTest}\n >\n {!onlyIcon && (\n <StyledButtonContent\n hasIcon={!!icon || !!iconRender}\n height={height}\n width={width}\n color={color ? color : 'default'}\n borderRadius={borderRadius}\n fontSize={fontSize}\n className={\n variant\n ? [className, variant].join(' ')\n : `${className} primary`\n }\n >\n {loading ? (\n <Loading\n color={loadingColor ?? COLORS[color ? color : 'default'].dark}\n size={loadingSize ?? 15}\n />\n ) : (\n children || label\n )}\n </StyledButtonContent>\n )}\n {icon && (\n <StyledButtonIconContainer\n color={color ? color : 'default'}\n height={height}\n onlyIcon={onlyIcon}\n borderRadius={borderRadius}\n >\n <img src={icon} alt={'icon'} />\n </StyledButtonIconContainer>\n )}\n {iconRender && (\n <StyledButtonIconContainer\n color={color ? color : 'default'}\n height={height}\n onlyIcon={onlyIcon}\n borderRadius={borderRadius}\n >\n <StyledButtonIcon buttonSize={buttonSize}>\n {iconRender}\n </StyledButtonIcon>\n </StyledButtonIconContainer>\n )}\n </StyledButton>\n );\n }\n);\n\nexport default Button;\n","import { FC, MouseEvent } from 'react';\nimport styled from 'styled-components';\n\nconst StyledButton = styled.div<{\n color?: string;\n disabled?: boolean;\n}>`\n display: flex;\n cursor: pointer;\n height: 40px;\n width: 40px;\n padding: 0;\n border-radius: 4px;\n font-family: Manrope !important;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${props => props.theme.Colors.darkSkyBlue};\n color: ${props => props.theme.Colors.white};\n &:hover {\n background: ${props => props.theme.Colors.cornflowerBlue};\n }\n &:active {\n background: ${props => props.theme.Colors.coolBlue};\n }\n &:disabled {\n background: transparent;\n color: ${props => props.theme.Colors.blueyGray};\n box-shadow: inset 0px 0px 0px 1px\n ${props => props.theme.Colors.blueyGray};\n }\n`;\n\nexport const SmallButton: FC<{\n action?: (e: MouseEvent<HTMLDivElement>) => void;\n disabled?: boolean;\n loading?: boolean;\n icon?: string;\n className?: string;\n}> = ({ children, action, disabled, className }) => {\n return (\n <StyledButton\n disabled={disabled}\n onClick={action}\n className={className}\n >\n {children}\n </StyledButton>\n );\n};\n\nexport default SmallButton;\n","export enum NEW_PERMISSIONS {\r\n LOGIN_WEB = 'LOGIN_WEB',\r\n LOGIN_MOBILE = 'LOGIN_MOBILE',\r\n LOGIN_ADMIN = 'LOGIN_ADMIN',\r\n SIGNUP_WEB = 'SIGNUP_WEB',\r\n SIGNUP_MOBILE = 'SIGNUP_MOBILE',\r\n COMPANY_REPORT = 'COMPANY_REPORT',\r\n LIST_LOGS = 'LIST_LOGS',\r\n MANAGE_RECORDINGS = 'MANAGE_RECORDINGS',\r\n MANAGE_OWN_FILES = 'MANAGE_OWN_FILES',\r\n UPDATE_COMPANY_INFO = 'UPDATE_COMPANY_INFO',\r\n UPDATE_TTS_SETTINGS = 'UPDATE_TTS_SETTINGS',\r\n VIEW_TTS_SETTINGS = 'VIEW_TTS_SETTINGS',\r\n CREATE_PRACTIS_SET = 'CREATE_PRACTIS_SET',\r\n CREATE_SCENARIO = 'CREATE_SCENARIO',\r\n CREATE_CHALLENGE = 'CREATE_CHALLENGE',\r\n UPDATE_PRACTIS_SET = 'UPDATE_PRACTIS_SET',\r\n UPDATE_SCENARIO = 'UPDATE_SCENARIO',\r\n UPDATE_CHALLENGE = 'UPDATE_CHALLENGE',\r\n ARCHIVE_PRACTIS_SET = 'ARCHIVE_PRACTIS_SET',\r\n ARCHIVE_SCENARIO = 'ARCHIVE_SCENARIO',\r\n ARCHIVE_CHALLENGE = 'ARCHIVE_CHALLENGE',\r\n DELETE_PRACTIS_SET = 'DELETE_PRACTIS_SET',\r\n DELETE_SCENARIO = 'DELETE_SCENARIO',\r\n DELETE_CHALLENGE = 'DELETE_CHALLENGE',\r\n COPY_PRACTIS_SET = 'COPY_PRACTIS_SET',\r\n COPY_SCENARIO = 'COPY_SCENARIO',\r\n COPY_CHALLENGE = 'COPY_CHALLENGE',\r\n GENERATE_CHALLENGE = 'GENERATE_CHALLENGE',\r\n PUBLISH_PRACTIS_SET = 'PUBLISH_PRACTIS_SET',\r\n PUBLISH_SCENARIO = 'PUBLISH_SCENARIO',\r\n PUBLISH_CHALLENGE = 'PUBLISH_CHALLENGE',\r\n LIST_PRACTIS_SET = 'LIST_PRACTIS_SET',\r\n LIST_SCENARIO = 'LIST_SCENARIO',\r\n LIST_CHALLENGE = 'LIST_CHALLENGE',\r\n SET_DUE_DATE = 'SET_DUEDATE',\r\n CREATE_INVITATION = 'CREATE_INVITATION',\r\n INVITE_TRAINEE = 'INVITE_TRAINEE',\r\n INVITE_TRAINER = 'INVITE_TRAINER',\r\n INVITE_SUPERVISOR = 'INVITE_SUPERVISOR',\r\n INVITE_CUSTOM_ROLE = 'INVITE_CUSTOM_ROLE',\r\n INVITE_COMPANY_ADMIN = 'INVITE_COMPANY_ADMIN',\r\n UPDATE_INVITATION = 'UPDATE_INVITATION',\r\n DELETE_INVITATION = 'DELETE_INVITATION',\r\n ASSIGN_INVITATION_PRACTIS_SET = 'ASSIGN_INVITATION_PRACTIS_SET',\r\n ASSIGN_INVITATION_TEAM = 'ASSIGN_INVITATION_TEAM',\r\n ASSIGN_INVITATION_LABEL = 'ASSIGN_INVITATION_LABEL',\r\n ASSIGN_INVITATION_ROLE = 'ASSIGN_INVITATION_ROLE',\r\n MANAGE_ROLES = 'MANAGE_ROLES',\r\n CREATE_USER = 'CREATE_USER',\r\n UPDATE_USER = 'UPDATE_USER',\r\n DELETE_USER = 'DELETE_USER',\r\n LIST_USER = 'LIST_USER',\r\n EXPORT_LIST_USER = 'EXPORT_LIST_USER',\r\n LIST_INVITATION = 'LIST_INVITATION',\r\n REVOKE_INVITATION = 'REVOKE_INVITATION',\r\n RESEND_INVITATION = 'RESEND_INVITATION',\r\n VIEW_USER_PERFORMANCE = 'VIEW_USER_PERFORMANCE',\r\n CREATE_LABEL = 'CREATE_LABEL',\r\n UPDATE_LABEL = 'UPDATE_LABEL',\r\n DELETE_LABEL = 'DELETE_LABEL',\r\n MANAGE_PACINGS = 'MANAGE_PACINGS',\r\n ASSIGN_PRACTIS_SET_LABEL = 'ASSIGN_PRACTIS_SET_LABEL',\r\n ASSIGN_SCENARIO_LABEL = 'ASSIGN_SCENARIO_LABEL',\r\n ASSIGN_CHALLENGE_LABEL = 'ASSIGN_CHALLENGE_LABEL',\r\n ASSIGN_USER_LABEL = 'ASSIGN_USER_LABEL',\r\n REMOVE_PRACTIS_SET_LABEL = 'REMOVE_PRACTIS_SET_LABEL',\r\n REMOVE_SCENARIO_LABEL = 'REMOVE_SCENARIO_LABEL',\r\n REMOVE_CHALLENGE_LABEL = 'REMOVE_CHALLENGE_LABEL',\r\n REMOVE_USER_LABEL = 'REMOVE_USER_LABEL',\r\n LIST_SUBMISSION = 'LIST_SUBMISSION',\r\n VIEW_SUBMISSION = 'VIEW_SUBMISSION',\r\n REVIEW_SUBMISSION = 'REVIEW_SUBMISSION',\r\n REQUEST_SUBMISSION_REDO = 'REQUEST_SUBMISSION_REDO',\r\n ARCHIVE_SUBMISSION = 'ARCHIVE_SUBMISSION',\r\n RESTORE_SUBMISSION = 'RESTORE_SUBMISSION',\r\n LIST_ACTIVE_PRACTIS_SET = 'LIST_ACTIVE_PRACTIS_SET',\r\n VIEW_PRACTIS_SET_PROGRESS = 'VIEW_PRACTIS_SET_PROGRESS',\r\n SEND_NUDGE = 'SEND_NUDGE',\r\n EXPORT_LIST_PRACTIS_SET = 'EXPORT_LIST_PRACTIS_SET',\r\n EXPORT_LIST_PRACTIS_SET_USER = 'EXPORT_LIST_PRACTIS_SET_USER',\r\n ASSIGN_ENROLLMENT = 'ASSIGN_ENROLLMENT',\r\n VIEW_USER_PRACTIS_SET_REPORT = 'VIEW_USER_PRACTIS_SET_REPORT',\r\n VIEW_ENROLLMENT = 'VIEW_ENROLLMENT',\r\n VIEW_NOTIFICATION = 'VIEW_NOTIFICATION',\r\n VIEW_SUBMISSION_FEEDBACK = 'VIEW_SUBMISSION_FEEDBACK',\r\n VIEW_PROFILE = 'VIEW_PROFILE',\r\n UPDATE_PROFILE = 'UPDATE_PROFILE',\r\n RECEIVE_PUSH = 'RECEIVE_PUSH',\r\n TRACK_ACTIVITY = 'TRACK_ACTIVITY',\r\n ASSIGN_INVITATION_PERMISSION = 'ASSIGN_INVITATION_PERMISSION',\r\n ASSIGN_USER_PERMISSION = 'ASSIGN_USER_PERMISSION',\r\n RESTORE_PRACTIS_SET = 'RESTORE_PRACTIS_SET',\r\n RESTORE_SCENARIO = 'RESTORE_SCENARIO',\r\n RESTORE_CHALLENGE = 'RESTORE_CHALLENGE',\r\n GROUP_NAME = 'GROUP_NAME',\r\n VIEW_COMPANY = 'VIEW_COMPANY',\r\n REMOVE_INVITATION_LABEL = 'REMOVE_INVITATION_LABEL',\r\n UNASSIGN_ENROLLMENT = 'UNASSIGN_ENROLLMENT',\r\n SAVE_SEARCH_FILTER = 'SAVE_SEARCH_FILTER',\r\n VIEW_LOG_DETAILS = 'VIEW_LOG_DETAILS',\r\n MANAGE_STAGING_USERS = 'MANAGE_STAGING_USERS',\r\n REMOVE_USER_FROM_STAGING = 'REMOVE_USER_FROM_STAGING',\r\n ADD_USER_IN_STAGING = 'ADD_USER_IN_STAGING',\r\n LIST_STAGING = 'LIST_STAGING',\r\n DELETE_STAGING = 'DELETE_STAGING',\r\n UPDATE_STAGING = 'UPDATE_STAGING',\r\n CREATE_STAGING = 'CREATE_STAGING',\r\n VIEW_STAGING = 'VIEW_STAGING',\r\n LIST_TEAM = 'LIST_TEAM',\r\n DELETE_TEAM = 'DELETE_TEAM',\r\n UPDATE_TEAM = 'UPDATE_TEAM',\r\n CREATE_TEAM = 'CREATE_TEAM',\r\n VIEW_TEAM = 'VIEW_TEAM',\r\n REMOVE_TEAM_MEMBER = 'REMOVE_TEAM_MEMBER',\r\n DUPLICATE_TEAM = 'DUPLICATE_TEAM',\r\n ASSIGN_TEAM_LABEL = 'ASSIGN_TEAM_LABEL',\r\n INVITE_USER = 'INVITE_USER',\r\n\r\n // System permissions\r\n ACCESS_ANY_COMPANY = 'ACCESS_ANY_COMPANY',\r\n MANAGE_SYSTEM_FILES = 'MANAGE_SYSTEM_FILES',\r\n UPDATE_SETTINGS = 'UPDATE_SETTINGS',\r\n RUN_MIGRATION = 'RUN_MIGRATION',\r\n TRIGGER_CRON = 'TRIGGER_CRON',\r\n UPDATE_PRACTIS_ADMIN = 'UPDATE_PRACTIS_ADMIN',\r\n DELETE_PRACTIS_ADMIN = 'DELETE_PRACTIS_ADMIN',\r\n CREATE_PRACTIS_ADMIN = 'CREATE_PRACTIS_ADMIN',\r\n CREATE_COMPANY = 'CREATE_COMPANY',\r\n LIST_COMPANY = 'LIST_COMPANY',\r\n LIST_PRACTIS_ADMIN = 'LIST_PRACTIS_ADMIN',\r\n UPDATE_COMPANY = 'UPDATE_COMPANY',\r\n DELETE_COMPANY = 'DELETE_COMPANY',\r\n MANAGE_DICTIONARIES = 'MANAGE_DICTIONARIES',\r\n MANAGE_PERMISSIONS = 'MANAGE_PERMISSIONS',\r\n MANAGE_TIMEZONES = 'MANAGE_TIMEZONES',\r\n MANAGE_DEFAULT_ROLES = 'MANAGE_DEFAULT_ROLES',\r\n MANAGE_SYSTEM_ROLES = 'MANAGE_SYSTEM_ROLES',\r\n ASSIGN_SYSTEM_PERMISSIONS = 'ASSIGN_SYSTEM_PERMISSIONS',\r\n SET_USER_PASSWORD = 'SET_USER_PASSWORD',\r\n}","import { createContext, useContext } from 'react';\n\nexport type HttpMethod = 'get' | 'post' | 'delete' | 'put' | 'patch';\n\nexport interface Http {\n request(method: HttpMethod, path: string, data?: any): Promise<any>;\n get(path: string, data?: any, responseType?: 'blob', isV2?: boolean): Promise<any>;\n post(path: string, data?: any, isV2?: boolean): Promise<any>;\n delete(path: string, data?: any, isV2?: boolean): Promise<any>;\n put(path: string, data?: any, isV2?: boolean): Promise<any>;\n patch(path: string, data?: any, isV2?: boolean): Promise<any>;\n}\n\nexport const HttpContext = createContext<Http>(undefined!);\n\nexport function useHttp() {\n return useContext(HttpContext);\n}\n","export enum TrainingMode {\n SCRIPT = 'script',\n NO_SCRIPT = 'no_script',\n KEYWORDS = 'keywords',\n TEST_YOURSELF = 'test'\n }\n\nexport const trainingModeNames = {\n [TrainingMode.SCRIPT as string]: 'Script',\n [TrainingMode.NO_SCRIPT as string]: 'No Script',\n [TrainingMode.KEYWORDS as string]: 'Keywords',\n [TrainingMode.TEST_YOURSELF as string]: 'Test Yourself',\n};\n\nexport function trainingModeName(mode: TrainingMode | undefined | null): string {\n return !!mode\n ? (trainingModeNames[mode] || mode || '')\n : '';\n}","import { ALL_FILTER_VALUE } from '../interfaces/filters';\nimport { UserWithRole, UserV2 } from '../interfaces/User';\nimport { NEW_PERMISSIONS } from './permissions';\n\nexport * from './TrainingMode';\n\nexport const MAIN_ROLES = {\n COMPANY_ADMIN: 'COMPANY_ADMIN',\n USER: 'USER',\n}\n\nexport const ROLE_NAMES = {\n ...MAIN_ROLES,\n PRACTIS_ADMIN: 'PRACTIS_ADMIN',\n TEAM_LEADER: 'TEAM_LEADER'\n};\n\nexport const ROLE_INVITE_PERMISSIONS = {\n [ROLE_NAMES.USER]: [NEW_PERMISSIONS.INVITE_TRAINEE],\n [ROLE_NAMES.COMPANY_ADMIN]: [NEW_PERMISSIONS.INVITE_COMPANY_ADMIN],\n};\n\nexport const PRACTIS_SET_STATUS_ITEMS: Array<{\n name: string;\n value: string;\n}> = [\n { name: 'Not Started', value: 'PENDING' },\n { name: 'In Progress', value: 'IN_PROGRESS' },\n { name: 'Completed', value: 'COMPLETED' },\n];\n\nexport const PRACTIS_SET_PROGRESS_STATUS_ITEMS: Array<{\n name: string;\n value: string;\n}> = [\n { name: 'Show All', value: ALL_FILTER_VALUE },\n { name: 'Complete', value: 'Complete' },\n { name: 'Incomplete', value: 'Incomplete' },\n];\n\nexport const ENROLLMENT_STATUS: Array<{ name: string; value: string }> = [\n { name: 'Show All', value: ALL_FILTER_VALUE },\n { name: 'In Progress', value: 'IN_PROGRESS' },\n { name: 'Completed', value: 'COMPLETED' },\n { name: 'Pending', value: 'PENDING' },\n];\n\nexport function isUserRole(role?: string): boolean {\n return role === ROLE_NAMES.USER;\n}\n\nexport function isCompanyAdminRole(role?: string): boolean {\n return role === ROLE_NAMES.COMPANY_ADMIN;\n}\n\nexport function isPractisAdminRole(role?: string): boolean {\n return role === ROLE_NAMES.PRACTIS_ADMIN;\n}\n\nexport function isAdminRole(role?: string): boolean {\n return role === ROLE_NAMES.PRACTIS_ADMIN || role === ROLE_NAMES.COMPANY_ADMIN;\n}\n\nexport function isTeamLeader(role?: string): boolean {\n return role === ROLE_NAMES.TEAM_LEADER;\n}\n\nconst rolePermissions = {\n [ROLE_NAMES.USER as string]: [\n ROLE_NAMES.USER,\n ROLE_NAMES.COMPANY_ADMIN,\n ROLE_NAMES.PRACTIS_ADMIN,\n ],\n [ROLE_NAMES.COMPANY_ADMIN as string]: [\n ROLE_NAMES.COMPANY_ADMIN,\n ROLE_NAMES.PRACTIS_ADMIN,\n ],\n [ROLE_NAMES.PRACTIS_ADMIN as string]: [ROLE_NAMES.PRACTIS_ADMIN],\n};\n\nexport function roleViewPermissions(role?: string): string[] {\n if (!role) return [];\n return rolePermissions[role];\n}\n\nexport function userRoleTitle(user: UserWithRole | Partial<UserV2> | undefined): string {\n return user?.role?.title || '';\n}\n\nexport function pendingUserRoleTitle(user: UserWithRole | undefined): string {\n if (user?.role?.name === 'COMPANY_ADMIN') {\n return 'Admin';\n }\n\n return user?.role?.name.replace('_', ' ').toLowerCase() || '';\n}\n\nexport const ASSIGN_LABEL_OPTIONS = {\n USER: 'USER',\n SCENARIO: 'SCENARIO',\n CHALLENGE: 'CHALLENGE',\n PRACTISSET: 'PRACTIS_SET',\n INVITATION: 'INVITATION',\n SUBMISSIONS: 'SUBMISSIONS',\n PRACTIS_SET: 'PRACTIS_SET',\n TEAM: 'TEAM',\n};\n\nexport const LOAD_ASSIGNED_LABELS = {\n PRACTIS_SETS_SCREEN_LIBRARY: 'PRACTIS_SETS_SCREEN_LIBRARY',\n SCENARIOS_SCREEN_LIBRARY: 'SCENARIOS_SCREEN_LIBRARY',\n CHALLENGES_SCREEN_LIBRARY: 'CHALLENGES_SCREEN_LIBRARY',\n USERS_ACTIVE: 'USERS_ACTIVE',\n USERS_PENDING: 'USERS_PENDING',\n TEAMS_SCREEN: 'TEAMS_SCREEN',\n MEMBERS_SCREEN: 'MEMBERS_SCREEN',\n TRAINING_SCREEN: 'TRAINING_SCREEN'\n};\n\nexport const ASSIGNED_AREA_BY_ENTITY = {\n PRACTIS_SET: 'PRACTIS_SETS_SCREEN_LIBRARY',\n SCENARIO: 'SCENARIOS_SCREEN_LIBRARY',\n CHALLENGE: 'CHALLENGES_SCREEN_LIBRARY',\n INVITATION: 'USERS_PENDING',\n USER: 'USERS_ACTIVE'\n}\n\nexport enum PractisWebMode {\n 'WEB_PORTAL',\n 'ADMIN_PORTAL',\n}","import {\n USER_PROFILE,\n USER_PROFILE_SUCCESS,\n USER_PROFILE_FAILURE,\n UPDATE_USER_PROFILE,\n UPDATE_USER_PROFILE_SUCCESS,\n UPDATE_USER_PROFILE_FAILURE,\n RESET_PROFILE_INFORMATION,\n} from './actions';\nimport { AppState } from '../../../store/reducers';\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { ACTIONS } from '../../../features/labels/store/actions';\nimport { toggleItemInArray } from '../../../helpers/functions/array-helpers';\n\nexport interface UserProfileState {\n info?: UserProfile;\n isLoading?: boolean;\n error?: any;\n}\n\nconst initialState: any = {\n info: {},\n isLoading: false,\n error: null,\n};\n\nconst userProfileReducer = (state = initialState, action: any) => {\n switch (action.type) {\n case USER_PROFILE:\n return {\n ...state,\n isLoading: true,\n error: null,\n };\n case USER_PROFILE_SUCCESS:\n return {\n info: {\n ...state.info,\n ...action.data,\n },\n isLoading: false,\n error: null,\n };\n case USER_PROFILE_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error,\n };\n case UPDATE_USER_PROFILE:\n return {\n ...state,\n error: null,\n };\n case UPDATE_USER_PROFILE_SUCCESS:\n return {\n info: {\n ...state.info,\n ...action.data,\n },\n error: null,\n };\n case UPDATE_USER_PROFILE_FAILURE:\n return {\n ...state,\n error: action.error,\n };\n case RESET_PROFILE_INFORMATION:\n return {\n ...initialState,\n };\n case ACTIONS.SAVE_LABEL_FILTERS_SUCCESS:\n return {\n ...state,\n info: {\n ...state.info,\n labelFilters: action.filters,\n },\n };\n case ACTIONS.SELECT_LABEL_FILTER: {\n let selectedLabels = toggleItemInArray(\n state.info.searchFilter,\n action.labelId\n );\n\n return {\n ...state,\n info: {\n ...state.info,\n searchFilter: selectedLabels,\n },\n };\n }\n case ACTIONS.CLEAR_LABEL_FILTERS: {\n return {\n ...state,\n info: {\n ...state.info,\n searchFilter: [],\n },\n };\n }\n default:\n return state;\n }\n};\n\nexport const getProfileState = (state: AppState) => state.profile.info;\nexport const getProfileLoading = (state: AppState) => state.profile.isLoading;\nexport const getProfileError = (state: AppState) => state.profile.error;\n\nexport default userProfileReducer;\n","import { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { PerformanceTrainee } from '../../../constants/interfaces/PerformanceTrainee';\nimport { UserInterface, UserV2 } from '../../../constants/interfaces/User';\nimport { PractisSets, EnrollmentPractisSet } from '../../../constants/interfaces/PractisSets';\nimport { Draft, DraftUser } from '../../../constants/interfaces/Draft';\nimport { UserFeatures } from '../../../constants/interfaces/UserFeatures';\nimport { EnrollmentInterface } from '../../../constants/interfaces/Enrollments';\nimport { UserPreference } from '../../../constants/interfaces/UserPreference';\n\nexport const FETCH_ALL_USERS = 'FETCH_ALL_USERS';\nexport const FETCH_ALL_USERS_SUCCESS = 'FETCH_ALL_USERS_SUCCESS';\nexport const FETCH_ALL_USERS_FAILURE = 'FETCH_ALL_USERS_FAILURE';\nexport const CLEAR_ALL_USERS = 'CLEAR_ALL_USERS';\nexport const FETCH_USER = 'FETCH_USER';\nexport const FETCH_USER_SUCCESS = 'FETCH_USER_SUCCESS';\nexport const FETCH_USER_FAILURE = 'FETCH_USER_FAILURE';\nexport const UPDATE_USER = 'UPDATE_USER_DPR';\nexport const UPDATE_USER_SUCCESS = 'UPDATE_USER_DPR_SUCCESS';\nexport const UPDATE_USER_FAILURE = 'UPDATE_USER_DPR_FAILURE';\n\nexport enum ACTIONS {\n UPDATE_USER_START = 'UPDATE_USER_START',\n UPDATE_USER_SUCCESS = 'UPDATE_USER_SUCCESS',\n UPDATE_USER_FAILURE = 'UPDATE_USER_FAILURE',\n\n SEARCH_USER_INVITATIONS_START = 'SEARCH_USER_INVITATIONS_START',\n SEARCH_USER_INVITATIONS_SUCCESS = 'SEARCH_USER_INVITATIONS_SUCCESS',\n SEARCH_USER_INVITATIONS_FAILURE = 'SEARCH_USER_INVITATIONS_FAILURE',\n UPDATE_USER_INVITATION_START = 'UPDATE_USER_INVITATION_START',\n UPDATE_USER_INVITATION_SUCCESS = 'UPDATE_USER_INVITATION_SUCCESS',\n UPDATE_USER_INVITATION_FAILURE = 'UPDATE_USER_INVITATION_FAILURE',\n\n GET_USER_PERFORMANCE_START = 'GET_USER_PERFORMANCE_START',\n GET_USER_PERFORMANCE_SUCCESS = 'GET_USER_PERFORMANCE_SUCCESS',\n GET_USER_PERFORMANCE_FAILURE = 'GET_USER_PERFORMANCE_FAILURE',\n RESET_USER_PERFORMANCE = 'RESET_USER_PERFORMANCE',\n\n UPDATE_SELECTED_USER_STATE = 'UPDATE_SELECTED_USER_STATE',\n UPDATE_ALL_SELECTED_USERS_STATE = 'UPDATE_ALL_SELECTED_USERS_STATE',\n\n UPDATE_SELECTED_INVITATION_STATE = 'UPDATE_SELECTED_INVITATION_STATE',\n UPDATE_ALL_SELECTED_INVITATIONS_STATE = 'UPDATE_ALL_SELECTED_INVITATIONS_STATE',\n\n USER_LABELS_UPDATED = 'USER_LABELS_UPDATED',\n\n SEARCH_USER_PRACTIS_SETS_START = 'SEARCH_USER_PRACTIS_SETS_START',\n SEARCH_USER_PRACTIS_SETS_SUCCESS = 'SEARCH_USER_PRACTIS_SETS_SUCCESS',\n SEARCH_USER_PRACTIS_SETS_FAILURE = 'SEARCH_USER_PRACTIS_SETS_FAILURE',\n FETCH_PORTABLE_PRACTIS_SETS_START = 'FETCH_PORTABLE_PRACTIS_SETS_START',\n FETCH_PORTABLE_PRACTIS_SETS_SUCCESS = 'FETCH_PORTABLE_PRACTIS_SETS_SUCCESS',\n FETCH_PORTABLE_PRACTIS_SETS_FAILURE = 'FETCH_PORTABLE_PRACTIS_SETS_FAILURE',\n UPDATE_USER_PRACTIS_SETS_SUCCESS = 'UPDATE_USER_PRACTIS_SETS_SUCCESS',\n UPDATE_USER_PRACTIS_SETS_START = 'UPDATE_USER_PRACTIS_SETS_START',\n UPDATE_USER_PRACTIS_SETS_FAILURE = 'UPDATE_USER_PRACTIS_SETS_FAILURE',\n UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE = 'UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE',\n UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE = 'UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE',\n\n SEARCH_STAGING_DRAFTS = 'SEARCH_STAGING_DRAFTS',\n SEARCH_STAGING_DRAFTS_SUCCESS = 'SEARCH_STAGING_DRAFTS_SUCCESS',\n SEARCH_STAGING_DRAFTS_FAILURE = 'SEARCH_STAGING_DRAFTS_FAILURE',\n UPDATE_STAGING_DRAFTS_START = 'UPDATE_STAGING_DRAFTS_START',\n UPDATE_STAGING_DRAFTS_SUCCESS = 'UPDATE_STAGING_DRAFTS_SUCCESS',\n UPDATE_STAGING_DRAFTS_FAILURE = 'UPDATE_STAGING_DRAFTS_FAILURE',\n UPDATE_SELECTED_DRAFT_STATE = 'UPDATE_SELECTED_DRAFT_STATE',\n UPDATE_ALL_SELECTED_DRAFT_STATE = 'UPDATE_ALL_SELECTED_DRAFT_STATE',\n\n FETCH_CREATED_BY_USERS_START = 'FETCH_CREATED_BY_USERS_START',\n FETCH_CREATED_BY_USERS_SUCCESS = 'FETCH_CREATED_BY_USERS_SUCCESS',\n FETCH_CREATED_BY_USERS_FAILURE = 'FETCH_CREATED_BY_USERS_FAILURE',\n FETCH_EDITED_BY_USERS_START = 'FETCH_EDITED_BY_USERS_START',\n FETCH_EDITED_BY_USERS_SUCCESS = 'FETCH_EDITED_BY_USERS_SUCCESS',\n FETCH_EDITED_BY_USERS_FAILURE = 'FETCH_EDITED_BY_USERS_FAILURE',\n\n FETCH_USER_FEATURES_START = 'FETCH_USER_FEATURES_START',\n FETCH_USER_FEATURES_SUCCESS = 'FETCH_USER_FEATURES_SUCCESS',\n FETCH_USER_FEATURES_FAILURE = 'FETCH_USER_FEATURES_FAILURE',\n\n REMOVE_USER_LABEL = 'REMOVE_USER_LABEL',\n REMOVE_PENDING_USER_LABEL = 'REMOVE_PENDING_USER_LABEL',\n\n FETCH_USER_ALL_PRACTIS_SETS = 'FETCH_USER_ALL_PRACTIS_SETS',\n\n FETCH_USER_PREFERENCES_START = 'FETCH_USER_PREFERENCES_START',\n FETCH_USER_PREFERENCES_SUCCESS = 'FETCH_USER_PREFERENCES_SUCCESS',\n FETCH_USER_PREFERENCES_FAILURE = 'FETCH_USER_PREFERENCES_FAILURE',\n\n UPDATE_USER_PREFERENCES_START = 'UPDATE_USER_PREFERENCES_START',\n UPDATE_USER_PREFERENCES_SUCCESS = 'UPDATE_USER_PREFERENCES_SUCCESS',\n UPDATE_USER_PREFERENCES_FAILURE = 'UPDATE_USER_PREFERENCES_FAILURE',\n}\n\nexport function searchUserPractisSetsStart() {\n return {\n type: ACTIONS.SEARCH_USER_PRACTIS_SETS_START as ACTIONS.SEARCH_USER_PRACTIS_SETS_START,\n };\n}\n\nexport function searchUserPractisSetsSuccess(\n practisSets: ListResult<EnrollmentInterface>\n) {\n return {\n type: ACTIONS.SEARCH_USER_PRACTIS_SETS_SUCCESS as ACTIONS.SEARCH_USER_PRACTIS_SETS_SUCCESS,\n practisSets,\n };\n}\n\nexport function searchUserPractisSetsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_USER_PRACTIS_SETS_FAILURE as ACTIONS.SEARCH_USER_PRACTIS_SETS_FAILURE,\n error,\n };\n}\n\nexport function fetchPortablePractisSetsStart() {\n return {\n type: ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_START as ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_START,\n };\n}\n\nexport function fetchPortablePractisSetsSuccess(\n practisSets: ListResult<EnrollmentPractisSet>\n) {\n return {\n type: ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_SUCCESS as ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_SUCCESS,\n practisSets,\n };\n}\n\nexport function fetchPortablePractisSetsFailure(error: string) {\n return {\n type: ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_FAILURE as ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_FAILURE,\n error,\n };\n}\n\nexport function updateTraineeProfilePractisSetCheckedState(id: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE as ACTIONS.UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE,\n id,\n };\n}\n\nexport function updateAllPractisSetsCheckedState(\n selectedPractisSetIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE as ACTIONS.UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE,\n selectedPractisSetIds,\n checked,\n partial,\n };\n}\n\nexport function updateUserPractisSetsStart() {\n return {\n type: ACTIONS.UPDATE_USER_PRACTIS_SETS_START as ACTIONS.UPDATE_USER_PRACTIS_SETS_START,\n };\n}\n\nexport function updateUserPractisSetsSuccess(practisSets: PractisSets) {\n return {\n type: ACTIONS.UPDATE_USER_PRACTIS_SETS_SUCCESS as ACTIONS.UPDATE_USER_PRACTIS_SETS_SUCCESS,\n practisSets,\n };\n}\n\nexport function updateUserPractisSetsFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_USER_PRACTIS_SETS_FAILURE as ACTIONS.UPDATE_USER_PRACTIS_SETS_FAILURE,\n error,\n };\n}\n\nexport function fetchAllUsers() {\n return {\n type: FETCH_ALL_USERS,\n };\n}\n\nexport function fetchAllUsersSuccess(data: ListResult<UserV2>) {\n return {\n type: FETCH_ALL_USERS_SUCCESS,\n data,\n };\n}\n\nexport function fetchAllUsersFailure(error: any) {\n return {\n type: FETCH_ALL_USERS_FAILURE,\n error,\n };\n}\n\nexport function clearAllUsers() {\n return {\n type: CLEAR_ALL_USERS,\n };\n}\n\nexport function updateUserActionStart() {\n return {\n type: ACTIONS.UPDATE_USER_START as ACTIONS.UPDATE_USER_START,\n };\n}\n\nexport function updateUserActionSuccess(\n user: UserInterface,\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_USER_SUCCESS as ACTIONS.UPDATE_USER_SUCCESS,\n user,\n updateType,\n };\n}\n\nexport function updateUserActionFailure(error: any) {\n return {\n type: ACTIONS.UPDATE_USER_FAILURE as ACTIONS.UPDATE_USER_FAILURE,\n error,\n };\n}\n\nexport function fetchUserAction() {\n return {\n type: FETCH_USER,\n };\n}\n\nexport function fetchUserSuccess(data: UserV2) {\n return {\n type: FETCH_USER_SUCCESS,\n data,\n };\n}\n\nexport function fetchUserFailure(error: string) {\n return {\n type: FETCH_USER_FAILURE,\n error,\n };\n}\n\nexport function updateUserAction() {\n return {\n type: UPDATE_USER,\n };\n}\n\nexport function updateUserSuccess(data: any) {\n return {\n type: UPDATE_USER_SUCCESS,\n data,\n };\n}\n\nexport function updateUserFailure(error: any) {\n return {\n type: UPDATE_USER_FAILURE,\n error,\n };\n}\n\nexport function searchInvitationsStart() {\n return {\n type: ACTIONS.SEARCH_USER_INVITATIONS_START as ACTIONS.SEARCH_USER_INVITATIONS_START,\n };\n}\n\nexport function searchInvitationsSuccess(users: ListResult<UserV2>) {\n return {\n type: ACTIONS.SEARCH_USER_INVITATIONS_SUCCESS as ACTIONS.SEARCH_USER_INVITATIONS_SUCCESS,\n users,\n };\n}\n\nexport function searchInvitationsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_USER_INVITATIONS_FAILURE as ACTIONS.SEARCH_USER_INVITATIONS_FAILURE,\n error,\n };\n}\n\nexport function updateInvitationStart() {\n return {\n type: ACTIONS.UPDATE_USER_INVITATION_START as ACTIONS.UPDATE_USER_INVITATION_START,\n };\n}\n\nexport function updateInvitationSuccess(\n invitation: { id: number },\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_USER_INVITATION_SUCCESS as ACTIONS.UPDATE_USER_INVITATION_SUCCESS,\n invitation,\n updateType,\n };\n}\n\nexport function updateInvitationFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_USER_INVITATION_FAILURE as ACTIONS.UPDATE_USER_INVITATION_FAILURE,\n error,\n };\n}\n\nexport function getUserPerformanceStart() {\n return {\n type: ACTIONS.GET_USER_PERFORMANCE_START as ACTIONS.GET_USER_PERFORMANCE_START,\n };\n}\n\nexport function getUserPerformanceSuccess(trainee: PerformanceTrainee) {\n return {\n type: ACTIONS.GET_USER_PERFORMANCE_SUCCESS as ACTIONS.GET_USER_PERFORMANCE_SUCCESS,\n trainee,\n };\n}\n\nexport function getUserPerformanceFailure(error: string) {\n return {\n type: ACTIONS.GET_USER_PERFORMANCE_FAILURE as ACTIONS.GET_USER_PERFORMANCE_FAILURE,\n error,\n };\n}\n\nexport function resetUserPerformanceAction() {\n return {\n type: ACTIONS.RESET_USER_PERFORMANCE as ACTIONS.RESET_USER_PERFORMANCE,\n };\n}\n\nexport function fetchUserAllPractisSetsSuccess(\n data: ListResult<EnrollmentPractisSet>\n) {\n return {\n type: ACTIONS.FETCH_USER_ALL_PRACTIS_SETS as ACTIONS.FETCH_USER_ALL_PRACTIS_SETS,\n data,\n };\n}\n\nexport function updateSelectedUserState(userId: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_USER_STATE as ACTIONS.UPDATE_SELECTED_USER_STATE,\n userId,\n };\n}\n\nexport function updateAllSelectedUsersState(\n userIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_USERS_STATE as ACTIONS.UPDATE_ALL_SELECTED_USERS_STATE,\n userIds,\n checked,\n partial,\n };\n}\n\nexport function updateSelectedInvitationState(invitationId: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_INVITATION_STATE as ACTIONS.UPDATE_SELECTED_INVITATION_STATE,\n invitationId,\n };\n}\n\nexport function updateAllSelectedInvitationsState(\n invitationIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_INVITATIONS_STATE as ACTIONS.UPDATE_ALL_SELECTED_INVITATIONS_STATE,\n invitationIds,\n checked,\n partial,\n };\n}\n\nexport function userLabelsUpdatedAction() {\n return {\n type: ACTIONS.USER_LABELS_UPDATED as ACTIONS.USER_LABELS_UPDATED,\n };\n}\n\nexport function fetchAllDrafts() {\n return {\n type: ACTIONS.SEARCH_STAGING_DRAFTS as ACTIONS.SEARCH_STAGING_DRAFTS,\n };\n}\n\nexport function fetchAllDraftsSuccess(data: any) {\n return {\n type: ACTIONS.SEARCH_STAGING_DRAFTS_SUCCESS as ACTIONS.SEARCH_STAGING_DRAFTS_SUCCESS,\n data,\n };\n}\n\nexport function fetchAllDraftsFailure(error: any) {\n return {\n type: ACTIONS.SEARCH_STAGING_DRAFTS_FAILURE as ACTIONS.SEARCH_STAGING_DRAFTS_FAILURE,\n error,\n };\n}\n\nexport function updateDraftsStart() {\n return {\n type: ACTIONS.UPDATE_STAGING_DRAFTS_START as ACTIONS.UPDATE_STAGING_DRAFTS_START,\n };\n}\n\nexport function updateDraftsSuccess(\n draft: Draft,\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_STAGING_DRAFTS_SUCCESS as ACTIONS.UPDATE_STAGING_DRAFTS_SUCCESS,\n draft,\n updateType,\n };\n}\n\nexport function updateDraftsFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_STAGING_DRAFTS_FAILURE as ACTIONS.UPDATE_STAGING_DRAFTS_FAILURE,\n error,\n };\n}\n\nexport function updateSelectedDraftState(draftId: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_DRAFT_STATE as ACTIONS.UPDATE_SELECTED_DRAFT_STATE,\n draftId,\n };\n}\n\nexport function updateAllSelectedDraftState(\n draftIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_DRAFT_STATE as ACTIONS.UPDATE_ALL_SELECTED_DRAFT_STATE,\n draftIds,\n checked,\n partial,\n };\n}\n\nexport function fetchCreatedByUsersStart() {\n return {\n type: ACTIONS.FETCH_CREATED_BY_USERS_START as ACTIONS.FETCH_CREATED_BY_USERS_START,\n };\n}\n\nexport function fetchCreatedByUsersSuccess(data: Partial<DraftUser>[]) {\n return {\n type: ACTIONS.FETCH_CREATED_BY_USERS_SUCCESS as ACTIONS.FETCH_CREATED_BY_USERS_SUCCESS,\n data,\n };\n}\n\nexport function fetchCreatedByUsersFailure(error: any) {\n return {\n type: ACTIONS.FETCH_CREATED_BY_USERS_FAILURE as ACTIONS.FETCH_CREATED_BY_USERS_FAILURE,\n error,\n };\n}\n\nexport function fetchEditedByUsersStart() {\n return {\n type: ACTIONS.FETCH_EDITED_BY_USERS_START as ACTIONS.FETCH_EDITED_BY_USERS_START,\n };\n}\n\nexport function fetchEditedByUsersSuccess(data: Partial<DraftUser>[]) {\n return {\n type: ACTIONS.FETCH_EDITED_BY_USERS_SUCCESS as ACTIONS.FETCH_EDITED_BY_USERS_SUCCESS,\n data,\n };\n}\n\nexport function fetchEditedByUsersFailure(error: any) {\n return {\n type: ACTIONS.FETCH_EDITED_BY_USERS_FAILURE as ACTIONS.FETCH_EDITED_BY_USERS_FAILURE,\n error,\n };\n}\n\nexport function fetchUserFeaturesStart() {\n return {\n type: ACTIONS.FETCH_USER_FEATURES_START as ACTIONS.FETCH_USER_FEATURES_START\n };\n}\n\nexport function fetchUserFeaturesSuccess(data: UserFeatures) {\n return {\n type: ACTIONS.FETCH_USER_FEATURES_SUCCESS as ACTIONS.FETCH_USER_FEATURES_SUCCESS,\n data\n };\n}\n\nexport function fetchUserFeaturesFailure(error: string) {\n return {\n type: ACTIONS.FETCH_USER_FEATURES_FAILURE as ACTIONS.FETCH_USER_FEATURES_FAILURE,\n error\n };\n}\n\nexport function removeUserLabel(userId: number, labelId: number) {\n return {\n type: ACTIONS.REMOVE_USER_LABEL as ACTIONS.REMOVE_USER_LABEL,\n userId,\n labelId\n };\n}\n\nexport function removePendingUserLabel(userId: number, labelId: number) {\n return {\n type: ACTIONS.REMOVE_PENDING_USER_LABEL as ACTIONS.REMOVE_PENDING_USER_LABEL,\n userId,\n labelId\n };\n}\n\nexport function fetchUserPreferencesStart() {\n return {\n type: ACTIONS.FETCH_USER_PREFERENCES_START as ACTIONS.FETCH_USER_PREFERENCES_START\n };\n}\n\nexport function fetchUserPreferencesSuccess(data: UserPreference[]) {\n return {\n type: ACTIONS.FETCH_USER_PREFERENCES_SUCCESS as ACTIONS.FETCH_USER_PREFERENCES_SUCCESS,\n data\n };\n}\n\nexport function fetchUserPreferencesFailure(error: string) {\n return {\n type: ACTIONS.FETCH_USER_PREFERENCES_FAILURE as ACTIONS.FETCH_USER_PREFERENCES_FAILURE,\n error\n };\n}\n\nexport function updateUserPreferencesStart(data: { key: string, value: unknown }[]) {\n return {\n type: ACTIONS.UPDATE_USER_PREFERENCES_START as ACTIONS.UPDATE_USER_PREFERENCES_START,\n data\n };\n}\n\nexport function updateUserPreferencesSuccess(keys: string[]) {\n return {\n type: ACTIONS.UPDATE_USER_PREFERENCES_SUCCESS as ACTIONS.UPDATE_USER_PREFERENCES_SUCCESS,\n keys\n };\n}\n\nexport function updateUserPreferencesFailure(keys: string[]) {\n return {\n type: ACTIONS.UPDATE_USER_PREFERENCES_FAILURE as ACTIONS.UPDATE_USER_PREFERENCES_FAILURE,\n keys\n };\n}","import { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\n\nimport { useWithLabelsContext } from '../context/useWithLabelsContext';\nimport { encapsulateAction } from '../../../../../../store/helpers/encapsulateAction';\nimport { ActionLabel } from '../actions';\nimport { DEFAULT_LABELS_SCOPE, Scope, WithLabelsScopes } from '../scopes';\n\nexport const useEncapsulatedDispatch = () => {\n const dispatch = useDispatch();\n const { reducerName, scope } = useWithLabelsContext();\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithLabelsContext.Provider props'\n );\n }\n\n const targetScope = (scope || DEFAULT_LABELS_SCOPE) as Scope;\n if (\n targetScope !== DEFAULT_LABELS_SCOPE &&\n !WithLabelsScopes[reducerName]?.includes(targetScope)\n ) {\n throw new Error(\n `Undefined \"${targetScope}\" scope of portableLabels. Please check config (WithLabelsScopes) for \"${reducerName}\" reducer`\n );\n }\n\n return useCallback(\n <T extends ActionLabel>(action: T) => {\n action._scope = targetScope;\n dispatch(encapsulateAction(`${reducerName}/labels/`, action));\n },\n [dispatch, reducerName, targetScope]\n );\n};\n","import { useCallback } from 'react';\n\nimport { useSearchLabelsApi } from './api';\nimport {\n clearAction,\n saveAction,\n searchFailureAction,\n searchSuccessAction,\n selectAllAction,\n deselectAllAction,\n selectLabelsAction,\n toggleCollapseLabelAction,\n toggleCollapseAllLabelsAction,\n searchStartAction,\n resetSelectedAction,\n resetAction,\n resetCollapseAllLabelsAction,\n} from './actions';\n\nimport { useEncapsulatedDispatch } from './helpers/useEncapsulatedDispatch';\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { useDispatch } from 'react-redux';\nimport { usePortableLabelsState } from '../../states';\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { Label } from '../../../../../constants/interfaces/Label';\nimport { unionWith } from 'lodash';\nimport { NOT_AUTHORIZED_ERROR_MESSAGE } from '../../../../../ui/components/ErrorMessages/constants';\n\nexport const useFetchAllLabelsService = () => {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const searchLabels = useSearchLabelsApi();\n return useCallback(\n async () => {\n dispatch(searchStartAction());\n try {\n let sp = { offset: 0, limit: 20, orderBy: { field: \"id\", asc: true } } as SearchParams;\n let data = { items: [] as Label[], totalCount: 0 } as PaginationResult<Label>;\n let pageNum = 0;\n do {\n const prevItems = data.items;\n data = await searchLabels(sp);\n data = sp.offset === 0 || !prevItems\n ? data\n : {\n ...data,\n items: unionWith(\n prevItems,\n data.items,\n (i1, i2) => i1.id === i2.id\n ),\n };\n sp = {\n ...sp,\n offset: Math.min(data.items.length, data.totalCount)\n };\n pageNum++;\n } while(data.items.length < data.totalCount && pageNum < data.numberOfPages);\n dispatch(searchSuccessAction(data));\n } catch(error: any) {\n dispatch(searchFailureAction(error.message));\n error?.message !== NOT_AUTHORIZED_ERROR_MESSAGE &&\n showMessage(error.message, 'error');\n }\n },\n [dispatch, showMessage, searchLabels]\n );\n};\n\nexport const useToggleCollapseLabel = () => {\n const dispatch = useEncapsulatedDispatch();\n \n return useCallback(\n (id: number) => {\n dispatch(toggleCollapseLabelAction(id));\n },\n [dispatch]\n );\n};\n\nexport const useToggleCollapseAllLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n const collapsedLabelsList = usePortableLabelsState().data.items.filter(item => item.children?.length).map(item => item.id);\n return useCallback(\n () => {\n dispatch(toggleCollapseAllLabelsAction(collapsedLabelsList));\n },\n [dispatch, collapsedLabelsList]\n );\n};\n\nexport const useResetCollapseAllLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n return useCallback(\n () => {\n dispatch(resetCollapseAllLabelsAction());\n },\n [dispatch]\n );\n};\n\nexport const useClearLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(clearAction());\n }, [dispatch]);\n};\n\nexport const useSaveLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(saveAction());\n }, [dispatch]);\n};\n\nexport const useSelectLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n return useCallback(\n (ids: number[]) => {\n dispatch(selectLabelsAction(ids));\n },\n [dispatch]\n );\n};\n\nexport const useSelectAllLabels = () => {\n \n const dispatch = useEncapsulatedDispatch();\n const labelsList = usePortableLabelsState().data.items;\n \n return useCallback((selectedList: any) => {\n dispatch(selectAllAction(selectedList));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dispatch, labelsList]);\n};\n\nexport const useDeselectAllLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(deselectAllAction());\n }, [dispatch]);\n};\n\nexport const useResetSelectedLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(resetSelectedAction());\n }, [dispatch]);\n};\n\nexport const useResetLabels = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(resetAction());\n }, [dispatch]);\n};\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../../../../tools/http/Http';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { Label } from '../../../../../constants/interfaces/Label';\n\nexport const useSearchLabelsApi = () => {\n const http = useHttp();\n return useCallback(\n (sp?: SearchParams): Promise<PaginationResult<Label>> =>\n http.post('labels/search', sp),\n [http]\n );\n};\n","import { Action } from 'redux';\n\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { Label } from '../../../../../constants/interfaces/Label';\nimport { Scope } from './scopes';\n\n//region Types\ntype ReturnTypeLabelAction<T extends (...args: any) => any> = ReturnType<T> &\n ActionPayload;\n\ntype ActionPayload = { _scope?: Scope };\n\nexport type ActionLabel<T = any> = Action<T> & ActionPayload;\n\nexport type Actions =\n | ReturnTypeLabelAction<typeof selectAllAction>\n | ReturnTypeLabelAction<typeof deselectAllAction>\n | ReturnTypeLabelAction<typeof resetSelectedAction>\n | ReturnTypeLabelAction<typeof selectLabelsAction>\n | ReturnTypeLabelAction<typeof clearAction>\n | ReturnTypeLabelAction<typeof saveAction>\n | ReturnTypeLabelAction<typeof toggleCollapseLabelAction>\n | ReturnTypeLabelAction<typeof resetAction>\n | ReturnTypeLabelAction<typeof toggleCollapseAllLabelsAction>\n | ReturnTypeLabelAction<typeof resetCollapseAllLabelsAction>;\n//endregion\n\nexport const searchStartAction = (): ActionLabel<'searchStartLabels'> => ({\n type: 'searchStartLabels',\n});\n\nexport const searchSuccessAction = (\n result: PaginationResult<Label>\n): ActionLabel<'searchSuccessLabels'> & {\n result: PaginationResult<Label>;\n} => ({\n type: 'searchSuccessLabels',\n result,\n});\n\nexport const searchFailureAction = (\n message: string\n): ActionLabel<'searchFailureLabels'> & { message: string } => ({\n type: 'searchFailureLabels',\n message,\n});\n\nexport const selectAllAction = (\n allLabels: Label[]\n): ActionLabel<'selectAllLabels'> & { allLabels: Label[] } => ({\n type: 'selectAllLabels',\n allLabels,\n});\n\nexport const deselectAllAction = (): ActionLabel<'deselectAllLabels'> => ({\n type: 'deselectAllLabels',\n});\n\nexport const resetSelectedAction = (): ActionLabel<'resetSelectedLabels'> => ({\n type: 'resetSelectedLabels',\n});\n\nexport const selectLabelsAction = (\n ids: number[]\n): ActionLabel<'selectLabels'> & { ids: number[] } => ({\n type: 'selectLabels',\n ids,\n});\n\nexport const clearAction = (): ActionLabel<'clearLabels'> => ({\n type: 'clearLabels',\n});\n\nexport const saveAction = (): ActionLabel<'saveLabels'> => ({\n type: 'saveLabels',\n});\n\nexport const resetAction = (): ActionLabel<'resetLabels'> => ({\n type: 'resetLabels',\n});\n\nexport const toggleCollapseLabelAction = (\n id: number\n): ActionLabel<'toggleCollapseLabel'> & { id: number } => ({\n type: 'toggleCollapseLabel',\n id,\n});\n\nexport const toggleCollapseAllLabelsAction = (\n ids: number[]\n): ActionLabel<'toggleCollapseAllLabels'> & { ids: number[] } => ({\n type: 'toggleCollapseAllLabels',\n ids,\n});\n\n\nexport const resetCollapseAllLabelsAction = (): ActionLabel<'resetCollapseAllLabels'> & {} => ({\n type: 'resetCollapseAllLabels',\n});","export function searchTree(leaf: any, id: any): any {\n if (leaf.id === id || leaf.id === -id) {\n return leaf;\n } else if (leaf.children != null) {\n let i;\n let result = null;\n for (i = 0; result == null && i < leaf.children.length; i++) {\n result = searchTree(leaf.children[i], id);\n }\n return result;\n }\n return null;\n}\n","import { useCallback } from 'react';\nimport { listToTree } from '../../helpers/functions/list-to-tree';\nimport { searchTree } from '../../helpers/functions/search-tree';\nimport { Label } from '../../constants/interfaces/Label';\nimport { PaginationResult } from '../../constants/interfaces/PaginationResult';\nimport { usePortableLabelsState } from '../portableLabels/store/states';\n\nconst recursiveParent = (label: Label, selected: any, labelsTree: any) => {\n if (label && label.parentId) {\n for (let leaf of labelsTree) {\n const parentLabel = searchTree(leaf, label.parentId);\n\n if (parentLabel) {\n const siblingIds = parentLabel.children.map((x: Label) => x.id);\n\n if (siblingIds.every((x: number) => selected.has(x))) {\n if (!selected.has(parentLabel.id))\n selected.add(parentLabel.id);\n if (selected.has(-parentLabel.id))\n selected.delete(-parentLabel.id);\n } else if (\n siblingIds.every(\n (x: number) => selected.has(x) || selected.has(-x)\n )\n ) {\n selected.delete(parentLabel.id);\n selected.add(-parentLabel.id);\n } else if (\n siblingIds.some(\n (x: number) => selected.has(x) || selected.has(-x)\n )\n ) {\n if (selected.has(parentLabel.id)) {\n selected.delete(parentLabel.id);\n }\n if (!selected.has(-parentLabel.id))\n selected.add(-parentLabel.id);\n } else {\n if (selected.has(parentLabel.id))\n selected.delete(parentLabel.id);\n if (selected.has(-parentLabel.id))\n selected.delete(-parentLabel.id);\n }\n\n recursiveParent(parentLabel, selected, labelsTree);\n }\n }\n }\n};\n\nconst recursiveMarkChildren = (label: Label, selected: any) => {\n if (label && label.children) {\n for (let child of label.children) {\n selected.delete(-child.id);\n selected.add(child.id);\n recursiveMarkChildren(child, selected);\n }\n }\n};\n\nconst recursiveUnmarkChildren = (label: Label, selected: any) => {\n if (label && label.children) {\n for (let child of label.children) {\n selected.delete(child.id);\n selected.delete(-child.id);\n recursiveUnmarkChildren(child, selected);\n }\n }\n};\n\nexport const useCalculatePreSelectedLabels = () => {\n const labelsList = usePortableLabelsState().data;\n\n return useCallback(\n (\n selectedItems: number[],\n entity?: any,\n assignedLabels?: number[]\n ): { preAssignedLabels: number[] } => {\n let preAssignedLabelsSet = new Set<number>(assignedLabels?.length ? assignedLabels: []);\n\n if (!entity) {\n return {\n preAssignedLabels: Array.from(preAssignedLabelsSet),\n };\n }\n\n // the case when assigned labels are not coming from BE \n if (assignedLabels === undefined) {\n let countLabels: any = {};\n const selectedItemEntities = entity.items.filter(\n (item: { id: number }) => selectedItems.includes(item.id)\n );\n \n for (let selectedEntity of selectedItemEntities) {\n if (selectedEntity.labels) {\n selectedEntity.labels.forEach((x: { id: number }) => {\n countLabels[x.id] = (countLabels[x.id] || 0) + 1;\n });\n } else if (selectedEntity.labelIDs) {\n selectedEntity.labelIDs.forEach((x: number) => {\n countLabels[x] = (countLabels[x] || 0) + 1;\n });\n }\n }\n \n for (const labelId in countLabels) {\n if (countLabels.hasOwnProperty(labelId)) {\n if (\n Number(countLabels[labelId]) ===\n selectedItemEntities.length\n ) {\n preAssignedLabelsSet.add(Number(labelId));\n } else {\n preAssignedLabelsSet.add(-Number(labelId));\n }\n }\n }\n \n }\n \n if (labelsList && labelsList.items) {\n const labelsTree = listToTree(labelsList.items);\n\n for (let labelId of Array.from(preAssignedLabelsSet)) {\n for (let leaf of labelsTree) {\n const matchedLabel = searchTree(leaf, labelId);\n if (matchedLabel && matchedLabel.parentId) {\n if (\n !preAssignedLabelsSet.has(matchedLabel.parentId)\n ) {\n preAssignedLabelsSet.add(\n -matchedLabel.parentId\n );\n }\n }\n if (matchedLabel && matchedLabel.parentId) {\n recursiveParent(\n matchedLabel,\n preAssignedLabelsSet,\n labelsTree\n );\n }\n }\n }\n }\n\n const preAssignedLabels = Array.from(preAssignedLabelsSet);\n\n return { preAssignedLabels };\n },\n [labelsList]\n );\n};\nexport const useCalculatePreSelectedLabelsForSingleItem = () => {\n return useCallback(\n (selectedItems: number[], labelsList?: PaginationResult<Label>) => {\n let preAssignedLabelsSet = new Set(selectedItems);\n if (labelsList && labelsList.items) {\n const labelsTree = listToTree(labelsList.items);\n\n for (let labelId of Array.from(preAssignedLabelsSet)) {\n for (let leaf of labelsTree) {\n const matchedLabel = searchTree(leaf, labelId);\n if (matchedLabel && matchedLabel.parentId) {\n if (\n !preAssignedLabelsSet.has(matchedLabel.parentId)\n ) {\n preAssignedLabelsSet.add(\n -matchedLabel.parentId\n );\n }\n }\n if (matchedLabel && matchedLabel.parentId) {\n recursiveParent(\n matchedLabel,\n preAssignedLabelsSet,\n labelsTree\n );\n }\n }\n }\n }\n return Array.from(preAssignedLabelsSet);\n },\n []\n );\n};\n\nexport const useHandleSelectLabels = () => {\n return useCallback((label, selectedLabels, labelsTree) => {\n const newSelectedLabels = new Set([...selectedLabels]);\n\n if (!newSelectedLabels.has(label.id)) {\n newSelectedLabels.delete(-label.id);\n newSelectedLabels.add(label.id);\n } else if (newSelectedLabels.has(-label.id)) {\n newSelectedLabels.delete(-label.id);\n newSelectedLabels.add(label.id);\n } else {\n newSelectedLabels.delete(-label.id);\n newSelectedLabels.delete(label.id);\n }\n\n for (let leaf of labelsTree) {\n const selectedLabel = searchTree(leaf, label.id);\n if (selectedLabel) {\n if (!newSelectedLabels.has(selectedLabel.id)) {\n recursiveUnmarkChildren(selectedLabel, newSelectedLabels);\n newSelectedLabels.delete(-selectedLabel.id);\n if (selectedLabel.parentId) {\n recursiveParent(\n selectedLabel,\n newSelectedLabels,\n labelsTree\n );\n }\n } else {\n if (selectedLabel.children) {\n recursiveMarkChildren(selectedLabel, newSelectedLabels);\n }\n\n if (selectedLabel.parentId) {\n recursiveParent(\n selectedLabel,\n newSelectedLabels,\n labelsTree\n );\n }\n }\n }\n }\n\n return Array.from(newSelectedLabels);\n }, []);\n};\n\nexport const useCalculateDeletedLabels = () => {\n const labelsList = usePortableLabelsState().data;\n\n return useCallback(\n assignedLabels => {\n return (\n labelsList?.items\n .map(x => x.id)\n .filter(\n x =>\n !assignedLabels.includes(x) &&\n !assignedLabels.includes(-x)\n ) ?? []\n );\n },\n [labelsList]\n );\n};\n\n/**\n * @function calculateRemovedLabels\n * @param { number[] } selectedLabelIds \n * @param { number[] } initialSelectedIds \n * @returns { number[] }\n */\nexport const calculateRemovedLabels = (\n selectedLabelIds: number[],\n initialSelectedIds: number[]\n) => {\n return (\n initialSelectedIds?.filter(\n id =>\n !selectedLabelIds.includes(id) &&\n !selectedLabelIds.includes(-id)\n ) ?? []\n );\n};\n\n/**\n * @function calculateAssignedLabels\n * @param { number[] } selectedLabelIds \n * @param { number[] } initialSelectedIds \n * @returns { number[] }\n */\nexport const calculateAssignedLabels = (\n selectedLabelIds: number[],\n initialSelectedIds: number[]\n) => {\n return (\n selectedLabelIds\n ?.filter(\n id =>\n !initialSelectedIds.includes(id) &&\n !initialSelectedIds.includes(-id)\n )\n ?.filter(id => id > 0) ?? []\n );\n};\n\n\nexport const clearSelectedItemIfNotLoaded = (\n selectedList?: number[],\n loadedList?: number[]\n) => {\n if (!selectedList || !loadedList) return selectedList;\n return selectedList.filter((selected: number) => {\n return !loadedList.includes(selected);\n });\n};\n\nexport const mergeLabelArrays = (\n labels: number[],\n selected: number[],\n deleted: number[]\n) => {\n for (let selectedLabel of selected) {\n if (!labels.includes(selectedLabel)) {\n labels.push(selectedLabel);\n }\n }\n\n return labels.filter(label => !deleted.includes(label));\n};\n\nexport const useRenewLabelsStateOnUpdate = () => {\n return useCallback(\n (\n label,\n selectedLabels,\n labelsTree,\n updateType: 'delete' | 'create'\n ) => {\n const newSelectedLabels = new Set([...selectedLabels]);\n for (let leaf of labelsTree) {\n if (updateType === 'create') {\n const selectedLabel = searchTree(leaf, label.id);\n if (selectedLabel && selectedLabel.parentId) {\n recursiveParent(\n selectedLabel,\n newSelectedLabels,\n labelsTree\n );\n }\n } else {\n const selectedLabel = searchTree(leaf, label.parentId);\n if (selectedLabel) {\n recursiveParent(\n selectedLabel && selectedLabel.children[0],\n newSelectedLabels,\n labelsTree\n );\n }\n }\n }\n return Array.from(newSelectedLabels);\n },\n []\n );\n};\n\nconst hasChildren = (label?: Label) => {\n return label && label.children && label.children.length > 0;\n};\n\nfunction compare(a: any, b: any) {\n if (a.name < b.name) {\n return -1;\n }\n if (a.name > b.name) {\n return 1;\n }\n return 0;\n}\n\nexport function sortLabels(nodes: any) {\n nodes.sort(compare);\n nodes.forEach(function (node: any) {\n if (hasChildren(node)) {\n sortLabels(node.children);\n }\n });\n\n return nodes;\n}\n\nexport const filterLabels = (term: string) => (labels: Label[]): Label[] => {\n if (!term) {\n return labels;\n }\n const getNodes = (result: Label[], object: Label) => {\n if (object.name.toLowerCase().indexOf(term.toLowerCase()) !== -1) {\n result.push(object);\n return result;\n }\n if (Array.isArray(object.children)) {\n const children = object.children.reduce(getNodes, []);\n if (children.length) result.push({ ...object, children });\n }\n return result;\n };\n\n return labels.reduce(getNodes, []);\n};\n","import { History, Location } from 'history';\nimport { useHistory as useBaseHistory, useLocation } from 'react-router';\n\nexport enum LocationStateType {\n MODAL = 'MODAL',\n EXTERNAL_URL = 'EXTERNAL_URL',\n}\n\nexport interface LocationState {\n type?: LocationStateType;\n prevLocation?: Location<LocationState>;\n useGoBack?: boolean;\n background?: Location<LocationState>;\n companyId?: any;\n data?: any;\n}\n\nexport function useLocations() {\n const history = useBaseHistory<LocationState>();\n const location = useLocation<LocationState>(); //current location\n const state = location.state;\n\n var rootLocation: Location<LocationState> = location;\n var modalLocation: Location<LocationState> | undefined = undefined;\n\n if (state) {\n if (state.type === LocationStateType.EXTERNAL_URL) {\n history.location = location;\n } else if (\n state.type === LocationStateType.MODAL ||\n !!state.background\n ) {\n rootLocation = findRootLocation(location);\n modalLocation = location;\n }\n }\n\n return {\n rootLocation,\n modalLocation,\n };\n}\n\nexport function findRootLocation(location: Location<LocationState>) {\n var result: Location<LocationState> = location;\n var state: LocationState | undefined = location.state;\n while (!!state) {\n if (state.background) result = state.background;\n else if (state.prevLocation) result = state.prevLocation;\n else break;\n state = result.state;\n }\n return result;\n}\n\nexport function useHistory() {\n return useBaseHistory<LocationState>();\n}\n\nexport function pushModal(\n history: History<LocationState>,\n path: string,\n data?: any,\n) {\n const state = history.location.state;\n return history.push(path, {\n type: LocationStateType.MODAL,\n prevLocation: state?.type === LocationStateType.MODAL\n ? state?.prevLocation \n : state?.background ?? history.location,\n data,\n });\n}\n\nexport function replaceModal(\n history: History<LocationState>,\n path: string,\n data?: any,\n) {\n const state = history.location.state;\n return history.replace(path, {\n type: LocationStateType.MODAL,\n prevLocation: state?.type === LocationStateType.MODAL\n ? state?.prevLocation \n : state?.background ?? history.location,\n data\n });\n}\n\n\n","import { useCallback } from 'react';\nimport { Action } from 'redux';\nimport { useDispatch } from 'react-redux';\n\nimport { ModalDialogInterface } from './types';\nimport { HIDE_MODAL, SHOW_MODAL, UPDATE_LOADING_STATUS } from './constants';\nimport { ConfirmationModalViewProps } from '../types';\n\nexport type ShowModalAction = Action<typeof SHOW_MODAL> & {\n modalOptions: ModalDialogInterface;\n};\n\nexport type UpdateModalLoadingStatusAction = Action<\n typeof UPDATE_LOADING_STATUS\n> & {\n isLoading: boolean;\n};\n\n/**\n * @function showModalDialog\n * @param { ModalDialogInterface } modalOptions\n * @returns { ShowModalAction }\n */\nexport function showModalDialog(\n modalOptions: ModalDialogInterface\n): ShowModalAction {\n return {\n type: SHOW_MODAL,\n modalOptions,\n };\n}\n\nexport type HideModalAction = Action<typeof HIDE_MODAL>;\n\n/**\n * @function hideModalDialog\n * @returns { HideModalAction }\n */\nexport function hideModalDialog(): HideModalAction {\n return {\n type: HIDE_MODAL,\n };\n}\n\n/**\n * @function useHideModalDialog\n * @returns { void }\n */\nexport const useHideModalDialog = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(hideModalDialog());\n }, [dispatch]);\n};\n\n/**\n * @function updateModalDialogLoadingStatus\n * @param { boolean } isLoading\n * @returns { UpdateModalLoadingStatusAction }\n */\nexport function updateModalDialogLoadingStatus(\n isLoading: boolean\n): UpdateModalLoadingStatusAction {\n return {\n type: UPDATE_LOADING_STATUS,\n isLoading,\n };\n}\n\n/**\n * @function useShowConfirmModalDialog\n * @returns { CallableFunction }\n */\nexport const useShowConfirmModalDialog = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (modalProps: ConfirmationModalViewProps) => {\n dispatch(\n showModalDialog({\n modalType: 'CONFIRMATION_MODAL',\n modalProps,\n })\n );\n },\n [dispatch]\n );\n};\n\n/**\n * @function useSetModalDialogLoadingStatus\n * @returns { CallableFunction }\n */\nexport const useSetModalDialogLoadingStatus = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (isLoading: boolean) => {\n dispatch(updateModalDialogLoadingStatus(isLoading));\n },\n [dispatch]\n );\n};\n\nexport type ModalDialogActions =\n | ShowModalAction\n | HideModalAction\n | UpdateModalLoadingStatusAction;\n","import React, { FC } from 'react';\nimport { NEW_PERMISSIONS } from '../../constants/enums/permissions';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../pages/UserProfile/store/reducers';\n\nexport const CheckPermission: FC<{\n permissions?: NEW_PERMISSIONS[];\n alternateContent?: any;\n matchAll?: boolean;\n}> = ({ permissions, children, alternateContent, matchAll }) => {\n const profile = useSelector(getProfileState);\n if (!permissions) return <>{children}</>;\n let hasPermission;\n\n const permissionList =\n profile && profile.permissions ? profile.permissions : [];\n\n if (matchAll) {\n hasPermission = permissions.every(r => permissionList.includes(r));\n } else {\n hasPermission = permissions.some(r => permissionList.includes(r));\n }\n\n if (hasPermission) {\n return <>{children}</>;\n } else {\n return alternateContent ? alternateContent : null;\n }\n};\n","import { ListResult, PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\n\nexport enum ACTIONS {\n SEARCH_LIBRARY_PRACTIS_SETS_START = 'SEARCH_LIBRARY_PRACTIS_SETS_START',\n SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS = 'SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS',\n SEARCH_LIBRARY_PRACTIS_SETS_FAILURE = 'SEARCH_LIBRARY_PRACTIS_SETS_FAILURE',\n\n GET_FULL_LIBRARY_PRACTIS_SETS_START = 'GET_FULL_LIBRARY_PRACTIS_SETS_START',\n GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS = 'GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS',\n GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE = 'GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE',\n\n GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_START = 'GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_START',\n GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_SUCCESS = 'GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_SUCCESS',\n GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_FAILURE = 'GET_TOTAL_LIBRARY_PRACTIS_SETS_COUNT_FAILURE',\n\n UPDATE_LIBRARY_PRACTIS_SET_START = 'UPDATE_LIBRARY_PRACTIS_SET_START',\n UPDATE_LIBRARY_PRACTIS_SET_SUCCESS = 'UPDATE_LIBRARY_PRACTIS_SET_SUCCESS',\n UPDATE_LIBRARY_PRACTIS_SET_FAILURE = 'UPDATE_LIBRARY_PRACTIS_SET_FAILURE',\n\n UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET = 'UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET',\n UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET = 'UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET',\n SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET = 'SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET',\n\n UPDATE_SELECTED_PRACTIS_SET_STATE = 'UPDATE_SELECTED_PRACTIS_SET_STATE',\n UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE = 'UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE',\n UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS = 'UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS',\n\n SEARCH_LIBRARY_SCENARIOS_START = 'SEARCH_LIBRARY_SCENARIOS_START',\n SEARCH_LIBRARY_SCENARIOS_SUCCESS = 'SEARCH_LIBRARY_SCENARIOS_SUCCESS',\n SEARCH_LIBRARY_SCENARIOS_FAILURE = 'SEARCH_LIBRARY_SCENARIOS_FAILURE',\n\n GET_TOTAL_LIBRARY_SCENARIOS_COUNT_START = 'GET_TOTAL_LIBRARY_SCENARIOS_COUNT_START',\n GET_TOTAL_LIBRARY_SCENARIOS_COUNT_SUCCESS = 'GET_TOTAL_LIBRARY_SCENARIOS_COUNT_SUCCESS',\n GET_TOTAL_LIBRARY_SCENARIOS_COUNT_FAILURE = 'GET_TOTAL_LIBRARY_SCENARIOS_COUNT_FAILURE',\n\n UPDATE_LIBRARY_SCENARIO_START = 'UPDATE_LIBRARY_SCENARIO_START',\n UPDATE_LIBRARY_SCENARIO_SUCCESS = 'UPDATE_LIBRARY_SCENARIO_SUCCESS',\n UPDATE_LIBRARY_SCENARIO_FAILURE = 'UPDATE_LIBRARY_SCENARIO_FAILURE',\n\n UPDATE_SELECTED_SCENARIO_STATE = 'UPDATE_SELECTED_SCENARIO_STATE',\n UPDATE_ALL_SELECTED_SCENARIOS_STATE = 'UPDATE_ALL_SELECTED_SCENARIOS_STATE',\n UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS = 'UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS',\n\n SEARCH_LIBRARY_CHALLENGES_START = 'SEARCH_LIBRARY_CHALLENGES_START',\n SEARCH_LIBRARY_CHALLENGES_SUCCESS = 'SEARCH_LIBRARY_CHALLENGES_SUCCESS',\n SEARCH_LIBRARY_CHALLENGES_FAILURE = 'SEARCH_LIBRARY_CHALLENGES_FAILURE',\n\n GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START = 'GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START',\n GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS = 'GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS',\n GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE = 'GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE',\n\n UPDATE_LIBRARY_CHALLENGES_START = 'UPDATE_LIBRARY_CHALLENGES_START',\n UPDATE_LIBRARY_CHALLENGES_SUCCESS = 'UPDATE_LIBRARY_CHALLENGES_SUCCESS',\n UPDATE_LIBRARY_CHALLENGES_FAILURE = 'UPDATE_LIBRARY_CHALLENGES_FAILURE',\n\n UPDATE_SELECTED_CHALLENGE_STATE = 'UPDATE_SELECTED_CHALLENGE_STATE',\n UPDATE_ALL_SELECTED_CHALLENGES_STATE = 'UPDATE_ALL_SELECTED_CHALLENGES_STATE',\n UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS = 'UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS',\n}\n\nexport function searchLibraryPractisSetsStart() {\n return {\n type: ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_START as ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_START,\n };\n}\n\nexport function searchLibraryPractisSetsSuccess(\n practisSets: ListResult<PractisSets>\n) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS as ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS,\n practisSets,\n };\n}\n\nexport function searchLibraryPractisSetsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_FAILURE as ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_FAILURE,\n error,\n };\n}\n\nexport function getFullLibraryPractisSetsStart() {\n return {\n type: ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_START as ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_START,\n };\n}\n\nexport function getFullLibraryPractisSetsSuccess(\n practisSets: ListResult<PractisSets>\n) {\n return {\n type: ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS as ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS,\n practisSets,\n };\n}\n\nexport function getFullLibraryPractisSetsFailure(error: string) {\n return {\n type: ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE as ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE,\n error,\n };\n}\n\nexport function updateLibraryPractisSetStart() {\n return {\n type: ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_START as ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_START,\n };\n}\n\nexport function updateLibraryPractisSetSuccess(\n updatedPractisSet: PractisSets,\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_SUCCESS as ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_SUCCESS,\n updatedPractisSet,\n updateType,\n };\n}\n\nexport function updateLibraryPractisSetFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_FAILURE as ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_FAILURE,\n error,\n };\n}\n\nexport function updateAssignedLibraryPractisSet(assignedPractisSets: number[]) {\n return {\n type: ACTIONS.UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET as ACTIONS.UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET,\n assignedPractisSets,\n };\n}\n\nexport function updateSeparateAssignedLibraryPractisSet(\n assignedPractisSets: number[]\n) {\n return {\n type: ACTIONS.UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET as ACTIONS.UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET,\n assignedPractisSets,\n };\n}\n\nexport function setSearchTermForLibraryPractisSet(value: string) {\n return {\n type: ACTIONS.SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET as ACTIONS.SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET,\n value,\n };\n}\n\nexport function updateLibraryPractisSetCheckedState(id: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE as ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE,\n id,\n };\n}\n\nexport function updateAllPractisSetsCheckedState(\n selectedPractisSetIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE as ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE,\n selectedPractisSetIds,\n checked,\n partial,\n };\n}\n\nexport function updatePractisSetDeleteLabelSuccess(\n labelId: number,\n id: number | string\n) {\n return {\n type: ACTIONS.UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS as ACTIONS.UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS,\n labelId,\n id,\n };\n}\n\nexport function searchLibraryScenariosStart() {\n return {\n type: ACTIONS.SEARCH_LIBRARY_SCENARIOS_START as ACTIONS.SEARCH_LIBRARY_SCENARIOS_START,\n };\n}\n\nexport function searchLibraryScenariosSuccess(scenarios: ListResult<Scenario>) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_SCENARIOS_SUCCESS as ACTIONS.SEARCH_LIBRARY_SCENARIOS_SUCCESS,\n scenarios,\n };\n}\n\nexport function searchLibraryScenariosFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_SCENARIOS_FAILURE as ACTIONS.SEARCH_LIBRARY_SCENARIOS_FAILURE,\n error,\n };\n}\n\nexport function updateLibraryScenarioStart() {\n return {\n type: ACTIONS.UPDATE_LIBRARY_SCENARIO_START as ACTIONS.UPDATE_LIBRARY_SCENARIO_START,\n };\n}\n\nexport function updateLibraryScenarioSuccess(\n updatedScenario: Scenario,\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_SCENARIO_SUCCESS as ACTIONS.UPDATE_LIBRARY_SCENARIO_SUCCESS,\n updatedScenario,\n updateType,\n };\n}\n\nexport function updateLibraryScenarioFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_SCENARIO_FAILURE as ACTIONS.UPDATE_LIBRARY_SCENARIO_FAILURE,\n error,\n };\n}\n\nexport function updateLibraryScenarioCheckedState(id: number) {\n return {\n type: ACTIONS.UPDATE_SELECTED_SCENARIO_STATE as ACTIONS.UPDATE_SELECTED_SCENARIO_STATE,\n id,\n };\n}\n\nexport function updateAllScenarioCheckedState(\n selectedScenarioIds: number[],\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_SCENARIOS_STATE as ACTIONS.UPDATE_ALL_SELECTED_SCENARIOS_STATE,\n selectedScenarioIds,\n checked,\n partial,\n };\n}\n\nexport function updateScenarioDeleteLabelSuccess(\n labelId: number,\n id: number | string\n) {\n return {\n type: ACTIONS.UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS as ACTIONS.UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS,\n labelId,\n id,\n };\n}\n\nexport function searchLibraryChallengesStart() {\n return {\n type: ACTIONS.SEARCH_LIBRARY_CHALLENGES_START as ACTIONS.SEARCH_LIBRARY_CHALLENGES_START,\n };\n}\n\nexport function searchLibraryChallengesSuccess(\n challenges: ListResult<Challenge>\n) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_CHALLENGES_SUCCESS as ACTIONS.SEARCH_LIBRARY_CHALLENGES_SUCCESS,\n challenges,\n };\n}\n\nexport function searchLibraryChallengesFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_LIBRARY_CHALLENGES_FAILURE as ACTIONS.SEARCH_LIBRARY_CHALLENGES_FAILURE,\n error,\n };\n}\n\nexport function getTotalLibraryChallengesCountStart() {\n return {\n type: ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START as ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START,\n };\n}\n\nexport function getTotalLibraryChallengesCountSuccess(\n challenges: PaginationResult<Challenge>\n) {\n return {\n type: ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS as ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS,\n challenges,\n };\n}\n\nexport function getTotalLibraryChallengesCountFailure(error: string) {\n return {\n type: ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE as ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE,\n error,\n };\n}\n\nexport function updateLibraryChallengeStart() {\n return {\n type: ACTIONS.UPDATE_LIBRARY_CHALLENGES_START as ACTIONS.UPDATE_LIBRARY_CHALLENGES_START,\n };\n}\n\nexport function updateLibraryChallengeSuccess(\n updatedChallenge: Challenge,\n updateType: 'create' | 'update' | 'delete' | 'labels'\n) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_CHALLENGES_SUCCESS as ACTIONS.UPDATE_LIBRARY_CHALLENGES_SUCCESS,\n updatedChallenge,\n updateType,\n };\n}\n\nexport function updateLibraryChallengeFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_LIBRARY_CHALLENGES_FAILURE as ACTIONS.UPDATE_LIBRARY_CHALLENGES_FAILURE,\n error,\n };\n}\n\nexport function updateLibraryChallengeCheckedState(id: number | string) {\n return {\n type: ACTIONS.UPDATE_SELECTED_CHALLENGE_STATE as ACTIONS.UPDATE_SELECTED_CHALLENGE_STATE,\n id,\n };\n}\n\nexport function updateAllChallengesCheckedState(\n selectedChallengeIds: any,\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.UPDATE_ALL_SELECTED_CHALLENGES_STATE as ACTIONS.UPDATE_ALL_SELECTED_CHALLENGES_STATE,\n selectedChallengeIds,\n checked,\n partial,\n };\n}\n\nexport function updateChallengeDeleteLabelSuccess(\n labelId: number,\n id: number | string\n) {\n return {\n type: ACTIONS.UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS as ACTIONS.UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS,\n labelId,\n id,\n };\n}\n","import { UserProfile } from '../../../constants/interfaces/User';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport {useLoggedInUserProfileState} from \"../store/states\";\nimport {useMemo} from \"react\";\nimport { isTeamLeader as isTeamLead } from '../../../constants/enums';\n\nexport {\n NEW_PERMISSIONS\n};\n\nexport function hasPermission(user: UserProfile | undefined, permission: NEW_PERMISSIONS) {\n return user?.permissions?.includes(permission) === true;\n}\n\nfunction createLoggedInUserPermissionsHelper(\n loggedInUser: UserProfile | undefined\n) {\n const hasActionPermission = (permission: NEW_PERMISSIONS) =>\n hasPermission(loggedInUser, permission);\n\n const isTeamLeader = () => isTeamLead(loggedInUser?.role?.name);\n\n return {\n isTeamLeader,\n hasActionPermission,\n };\n}\n\nexport function useLoggedInUserPermissionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createLoggedInUserPermissionsHelper(loggedInUser),\n [loggedInUser]\n );\n}\n\n// export function hasPermissionToLoginWeb(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LOGIN_WEB);\n// }\n\n// export function hasPermissionToLoginMobile(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LOGIN_MOBILE);\n// }\n\n// export function hasPermissionToLoginAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LOGIN_ADMIN);\n// }\n\n// export function hasPermissionToSignupWeb(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.SIGNUP_WEB);\n// }\n\n// export function hasPermissionToSignupMobile(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.SIGNUP_MOBILE);\n// }\n\n// export function hasPermissionToCompanyReport(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.COMPANY_REPORT);\n// }\n\n// export function hasPermissionToListLogs(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_LOGS);\n// }\n\n// export function hasPermissionToManageRecordings(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_RECORDINGS);\n// }\n\n// export function hasPermissionToManageOwnFiles(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_OWN_FILES);\n// }\n\n// export function hasPermissionToUpdateCompanyInfo(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_COMPANY_INFO);\n// }\n\n// export function hasPermissionToUpdateTtsSettings(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_TTS_SETTINGS);\n// }\n\n// export function hasPermissionToViewTtsSettings(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_TTS_SETTINGS);\n// }\n\n// export function hasPermissionToCreatePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToCreateScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_SCENARIO);\n// }\n\n// export function hasPermissionToCreateChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_CHALLENGE);\n// }\n\n// export function hasPermissionToUpdatePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToUpdateScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_SCENARIO);\n// }\n\n// export function hasPermissionToUpdateChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_CHALLENGE);\n// }\n\n// export function hasPermissionToArchivePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ARCHIVE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToArchiveScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ARCHIVE_SCENARIO);\n// }\n\n// export function hasPermissionToArchiveChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ARCHIVE_CHALLENGE);\n// }\n\n// export function hasPermissionToDeletePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToDeleteScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_SCENARIO);\n// }\n\n// export function hasPermissionToDeleteChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_CHALLENGE);\n// }\n\n// export function hasPermissionToCopyPractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.COPY_PRACTIS_SET);\n// }\n\n// export function hasPermissionToCopyScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.COPY_SCENARIO);\n// }\n\n// export function hasPermissionToCopyChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.COPY_CHALLENGE);\n// }\n\n// export function hasPermissionToGenerateChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.GENERATE_CHALLENGE);\n// }\n\n// export function hasPermissionToPublishPractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.PUBLISH_PRACTIS_SET);\n// }\n\n// export function hasPermissionToPublishScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.PUBLISH_SCENARIO);\n// }\n\n// export function hasPermissionToPublishChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.PUBLISH_CHALLENGE);\n// }\n\n// export function hasPermissionToListPractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_PRACTIS_SET);\n// }\n\n// export function hasPermissionToListScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_SCENARIO);\n// }\n\n// export function hasPermissionToListChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_CHALLENGE);\n// }\n\n// export function hasPermissionToUpdateDueDate(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_DUE_DATE);\n// }\n\n// export function hasPermissionToCreateInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_INVITATION);\n// }\n\n// export function hasPermissionToInviteTrainee(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_TRAINEE);\n// }\n\n// export function hasPermissionToInviteTrainer(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_TRAINER);\n// }\n\n// export function hasPermissionToInviteSupervisor(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_SUPERVISOR);\n// }\n\n// export function hasPermissionToInviteCustomRole(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_CUSTOM_ROLE);\n// }\n\n// export function hasPermissionToInviteCompanyAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_COMPANY_ADMIN);\n// }\n\n// export function hasPermissionToUpdateInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_INVITATION);\n// }\n\n// export function hasPermissionToDeleteInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_INVITATION);\n// }\n\n// export function hasPermissionToAssignInvitationPractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_INVITATION_PRACTIS_SET);\n// }\n\n// export function hasPermissionToAssignInvitationTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_INVITATION_TEAM);\n// }\n\n// export function hasPermissionToAssignInvitationLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_INVITATION_LABEL);\n// }\n\n// export function hasPermissionToAssignInvitationRole(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_INVITATION_ROLE);\n// }\n\n// export function hasPermissionToManageRoles(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_ROLES);\n// }\n\n// export function hasPermissionToCreateUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_USER);\n// }\n\n// export function hasPermissionToUpdateUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_USER);\n// }\n\n// export function hasPermissionToDeleteUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_USER);\n// }\n\n// export function hasPermissionToListUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_USER);\n// }\n\n// export function hasPermissionToExportListUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.EXPORT_LIST_USER);\n// }\n\n// export function hasPermissionToListInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_INVITATION);\n// }\n\n// export function hasPermissionToRevokeInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REVOKE_INVITATION);\n// }\n\n// export function hasPermissionToResendInvitation(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RESEND_INVITATION);\n// }\n\n// export function hasPermissionToViewUserPerformance(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_USER_PERFORMANCE);\n// }\n\n// export function hasPermissionToCreateLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_LABEL);\n// }\n\n// export function hasPermissionToUpdateLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_LABEL);\n// }\n\n// export function hasPermissionToDeleteLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_LABEL);\n// }\n\n// export function hasPermissionToManagePacings(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_PACINGS);\n// }\n\n// export function hasPermissionToAssignPractisSetLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_PRACTIS_SET_LABEL);\n// }\n\n// export function hasPermissionToAssignScenarioLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_SCENARIO_LABEL);\n// }\n\n// export function hasPermissionToAssignChallengeLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_CHALLENGE_LABEL);\n// }\n\n// export function hasPermissionToAssignUserLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_USER_LABEL);\n// }\n\n// export function hasPermissionToRemovePractisSetLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_PRACTIS_SET_LABEL);\n// }\n\n// export function hasPermissionToRemoveScenarioLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_SCENARIO_LABEL);\n// }\n\n// export function hasPermissionToRemoveChallengeLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_CHALLENGE_LABEL);\n// }\n\n// export function hasPermissionToRemoveUserLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_USER_LABEL);\n// }\n\n// export function hasPermissionToListSubmission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_SUBMISSION);\n// }\n\n// export function hasPermissionToViewSubmission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_SUBMISSION);\n// }\n\n// export function hasPermissionToReviewSubmission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REVIEW_SUBMISSION);\n// }\n\n// export function hasPermissionToRequestSubmissionRedo(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REQUEST_SUBMISSION_REDO);\n// }\n\n// export function hasPermissionToArchiveSubmission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ARCHIVE_SUBMISSION);\n// }\n\n// export function hasPermissionToRestoreSubmission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RESTORE_SUBMISSION);\n// }\n\n// export function hasPermissionToListActivePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_ACTIVE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToViewPractisSetProgress(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_PRACTIS_SET_PROGRESS);\n// }\n\n// export function hasPermissionToSendNudge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.SEND_NUDGE);\n// }\n\n// export function hasPermissionToExportListPractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET);\n// }\n\n// export function hasPermissionToExportListPractisSetUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET_USER);\n// }\n\n// export function hasPermissionToAssignEnrollment(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_ENROLLMENT);\n// }\n\n// export function hasPermissionToViewUserPractisSetReport(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT);\n// }\n\n// export function hasPermissionToViewEnrollment(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_ENROLLMENT);\n// }\n\n// export function hasPermissionToViewNotification(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_NOTIFICATION);\n// }\n\n// export function hasPermissionToViewSubmissionFeedback(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_SUBMISSION_FEEDBACK);\n// }\n\n// export function hasPermissionToViewProfile(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_PROFILE);\n// }\n\n// export function hasPermissionToUpdateProfile(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_PROFILE);\n// }\n\n// export function hasPermissionToReceivePush(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RECEIVE_PUSH);\n// }\n\n// export function hasPermissionToTrackActivity(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.TRACK_ACTIVITY);\n// }\n\n// export function hasPermissionToAssignInvitationPermission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_INVITATION_PERMISSION);\n// }\n\n// export function hasPermissionToAssignUserPermission(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_USER_PERMISSION);\n// }\n\n// export function hasPermissionToRestorePractisSet(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RESTORE_PRACTIS_SET);\n// }\n\n// export function hasPermissionToRestoreScenario(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RESTORE_SCENARIO);\n// }\n\n// export function hasPermissionToRestoreChallenge(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RESTORE_CHALLENGE);\n// }\n\n// export function hasPermissionToGroupName(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.GROUP_NAME);\n// }\n\n// export function hasPermissionToViewCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_COMPANY);\n// }\n\n// export function hasPermissionToRemoveInvitationLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_INVITATION_LABEL);\n// }\n\n// export function hasPermissionToUnassignEnrollment(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UNASSIGN_ENROLLMENT);\n// }\n\n// export function hasPermissionToSaveSearchFilter(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.SAVE_SEARCH_FILTER);\n// }\n\n// export function hasPermissionToViewLogDetails(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_LOG_DETAILS);\n// }\n\n// export function hasPermissionToManageStagingUsers(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_STAGING_USERS);\n// }\n\n// export function hasPermissionToRemoveUserFromStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_USER_FROM_STAGING);\n// }\n\n// export function hasPermissionToAddUserInStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ADD_USER_IN_STAGING);\n// }\n\n// export function hasPermissionToListStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_STAGING);\n// }\n\n// export function hasPermissionToDeleteStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_STAGING);\n// }\n\n// export function hasPermissionToUpdateStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_STAGING);\n// }\n\n// export function hasPermissionToCreateStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_STAGING);\n// }\n\n// export function hasPermissionToViewStaging(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_STAGING);\n// }\n\n// export function hasPermissionToListTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_TEAM);\n// }\n\n// export function hasPermissionToDeleteTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_TEAM);\n// }\n\n// export function hasPermissionToUpdateTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_TEAM);\n// }\n\n// export function hasPermissionToCreateTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_TEAM);\n// }\n\n// export function hasPermissionToViewTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.VIEW_TEAM);\n// }\n\n// export function hasPermissionToRemoveTeamMember(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.REMOVE_TEAM_MEMBER);\n// }\n\n// export function hasPermissionToDuplicateTeam(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DUPLICATE_TEAM);\n// }\n\n// export function hasPermissionToAssignTeamLabel(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_TEAM_LABEL);\n// }\n\n// export function hasPermissionToInviteUser(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.INVITE_USER);\n// }\n\n// // System permissions\n\n// export function hasPermissionToAccessAnyCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ACCESS_ANY_COMPANY);\n// }\n\n// export function hasPermissionToManageSystemFiles(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_SYSTEM_FILES);\n// }\n\n// export function hasPermissionToUpdateSettings(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_SETTINGS);\n// }\n\n// export function hasPermissionToRunMigration(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.RUN_MIGRATION);\n// }\n\n// export function hasPermissionToTriggerCron(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.TRIGGER_CRON);\n// }\n\n// export function hasPermissionToUpdatePractisAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_PRACTIS_ADMIN);\n// }\n\n// export function hasPermissionToDeletePractisAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_PRACTIS_ADMIN);\n// }\n\n// export function hasPermissionToCreatePractisAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_PRACTIS_ADMIN);\n// }\n\n// export function hasPermissionToCreateCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.CREATE_COMPANY);\n// }\n\n// export function hasPermissionToListCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_COMPANY);\n// }\n\n// export function hasPermissionToListPractisAdmin(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.LIST_PRACTIS_ADMIN);\n// }\n\n// export function hasPermissionToUpdateCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.UPDATE_COMPANY);\n// }\n\n// export function hasPermissionToDeleteCompany(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.DELETE_COMPANY);\n// }\n\n// export function hasPermissionToManageDictionaries(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_DICTIONARIES);\n// }\n\n// export function hasPermissionToManagePermissions(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_PERMISSIONS);\n// }\n\n// export function hasPermissionToManageTimezones(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_TIMEZONES);\n// }\n\n// export function hasPermissionToManageDefaultRoles(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_DEFAULT_ROLES);\n// }\n\n// export function hasPermissionToManageSystemRoles(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.MANAGE_SYSTEM_ROLES);\n// }\n\n// export function hasPermissionToAssignSystemPermissions(user: UserInterface | undefined) {\n// return hasPermission(user, NEW_PERMISSIONS.ASSIGN_SYSTEM_PERMISSIONS);\n// }","import { useMemo } from 'react';\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { ROLE_NAMES } from '../../../constants/enums';\nimport { useLoggedInUserProfileState } from \"../store/states\";\n\nexport enum UserRoleLevel {\n NONE = 0,\n USER = 1,\n COMPANY_ADMIN = 2,\n PRACTIS_ADMIN = 3,\n}\n\nconst userRoleLevelMap = {\n [ROLE_NAMES.USER]: UserRoleLevel.USER,\n [ROLE_NAMES.COMPANY_ADMIN]: UserRoleLevel.COMPANY_ADMIN,\n [ROLE_NAMES.PRACTIS_ADMIN]: UserRoleLevel.PRACTIS_ADMIN,\n};\n\nexport function getRoleLevel(roleName: string | undefined): UserRoleLevel {\n return !!roleName\n ? (userRoleLevelMap[roleName] || UserRoleLevel.NONE)\n : UserRoleLevel.NONE;\n}\n\nexport function getUserRoleLevel(user: UserProfile | undefined): UserRoleLevel {\n return getRoleLevel(user?.role?.name);\n}\n\nfunction createUserRolesHelper(\n loggedInUser: UserProfile | undefined\n) {\n const loggedInUserRoleLevel = getUserRoleLevel(loggedInUser);\n\n const canViewRole = (roleName: string | undefined) =>\n loggedInUserRoleLevel >= getRoleLevel(roleName);\n \n return {\n canViewRole,\n };\n}\n\nexport type UserRolesHelper = ReturnType<typeof createUserRolesHelper>;\n\nexport function useLoggedInUserRolesHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createUserRolesHelper(loggedInUser),\n [loggedInUser]\n );\n}\n","import { useMemo } from \"react\";\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { useLoggedInUserProfileState } from \"../store/states\";\nimport {\n hasPermission,\n NEW_PERMISSIONS,\n} from \"./UserPermissionHelpers\";\nimport { getUserRoleLevel, getRoleLevel } from \"./UserRoleHelpers\";\nimport {\n getBulkActionsAvailability,\n getBulkActionAvailabilityItem,\n} from '../../../tools/bulkActions';\n\nexport enum InvitationActions {\n ASSIGN_INVITATION_LABEL,\n RESEND_INVITATION,\n REVOKE_INVITATION,\n}\n\nfunction createInvitationActionsHelper(\n loggedInUser: UserProfile | undefined\n) {\n const loggedInUserRoleLevel = getUserRoleLevel(loggedInUser);\n\n const canAssignInvitationLabel = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.ASSIGN_INVITATION_LABEL);\n\n const canResendInvitation = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.RESEND_INVITATION);\n \n const canRevokeInvitation = (invitation: UserProfile) =>\n loggedInUserRoleLevel >= getRoleLevel(invitation.role?.name)\n && hasRevokeInvitationPermission();\n\n const hasRevokeInvitationPermission = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.REVOKE_INVITATION);\n \n const getBulkActions = (invitations: UserProfile[] | undefined) => {\n const base = getBulkActionsAvailability(\n invitations,\n [\n getBulkActionAvailabilityItem(\n InvitationActions.ASSIGN_INVITATION_LABEL,\n invitations,\n canAssignInvitationLabel\n ),\n getBulkActionAvailabilityItem(\n InvitationActions.RESEND_INVITATION,\n invitations,\n canResendInvitation\n ),\n getBulkActionAvailabilityItem(\n InvitationActions.REVOKE_INVITATION,\n invitations,\n canRevokeInvitation\n ),\n ]\n );\n\n return {\n ...base,\n isBulkActionVisible: (action: InvitationActions) =>\n action === InvitationActions.REVOKE_INVITATION\n ? hasRevokeInvitationPermission()\n : base.isBulkActionVisible(action),\n };\n }\n\n return {\n canAssignInvitationLabel,\n canResendInvitation,\n canRevokeInvitation,\n getBulkActions,\n };\n}\n\nexport type InvitationActionsHelper = ReturnType<typeof createInvitationActionsHelper>;\n\nexport function useInvitationActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createInvitationActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import dayjs from 'dayjs';\nimport { ordinalSuffix } from './number-sufix';\nconst momentTZ = require('moment-timezone');\n\nexport function formatTime(date: any, withSeconds?: boolean) {\n if (!date) return '';\n\n const d = new Date(date);\n var hours = d.getHours();\n const minutes = d.getMinutes();\n const seconds = d.getSeconds();\n var ampm = 'am';\n if (hours > 12) {\n hours -= 12;\n ampm = 'pm';\n }\n const secondsStr = withSeconds ? `:${leadZero(seconds)}` : '';\n return `${hours}:${leadZero(minutes)}${secondsStr} ${ampm}`;\n}\n\nfunction leadZero(value: number) {\n return value < 10 ? `0${value}` : `${value}`;\n}\n\nconst quoteRegEx = /\"/gi;\n\nexport function stringifyDate(date: Date | null | undefined) {\n return date ? JSON.stringify(date).replace(quoteRegEx, '') : undefined;\n}\n\nexport const formatAMPM = (date: Date) => {\n let hours = date.getHours();\n let minutes = date.getMinutes();\n const ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n hours = hours ? hours : 12;\n const formatedMinutes = minutes < 10 ? '0' + minutes : minutes;\n return hours + ':' + formatedMinutes + ' ' + ampm;\n};\n\nexport function formatMMDDYY(date: Date) {\n if (!date) return '';\n const d = dayjs(date).toDate();\n const day = d.getDate();\n const month = d.getMonth() + 1;\n let year = d.getFullYear().toString();\n\n return `${('0' + month).slice(-2)}/${('0' + day).slice(\n -2\n )}/${year.substring(2)}`;\n}\n\nexport const formatHour = (\n date?: number | string | Date\n) => {\n if (!date) return '';\n\n const intDate = new Date(date);\n return formatAMPM(intDate);\n \n};\n\n/**\n * @function formatDate\n * @param { number | string | Date } date \n * @param { boolean } showToday - defines if today should be shown\n * @param { boolean } shouldShowTime - defines if the time should be shown\n * @returns { string }\n */\nexport const formatDate = (\n date?: number | string | Date,\n showToday?: boolean,\n shouldShowTime: boolean = true,\n): string => {\n if (!date) return '';\n\n const intDate = dayjs(date).toDate();\n if (isToday(date) && shouldShowTime) {\n return `${showToday ? 'Today at ' : ''} ${formatAMPM(\n new Date(intDate)\n )}`;\n } else {\n return formatMMDDYY(intDate);\n }\n};\n\n/**\n * @function formatDateWithTimeZone\n * @param { string | Date } date \n * @returns { string }\n */\nexport const formatDateWithTimeZone = (date: string | Date): string => {\n const stringifiedDate = typeof date === 'string' ? date : date.toString();\n const splittedDate = new Date(stringifiedDate);\n\n return dayjs(splittedDate.toDateString()).format('MM/DD/YY');\n};\n\n/**\n * @function getDateWithTZOffset\n * @param { string | null } date \n * @returns { string }\n */\nexport const getDateWithTZOffset = (date: string | null): string | null => {\n if (!date) return null;\n const timezone = momentTZ.tz.guess();\n const dayWithTimezone = momentTZ.tz(date, timezone).startOf(\"day\").format();\n return dayWithTimezone\n}\nexport const formatDateChart = (date?: number | string | Date) => {\n if (!date) return '';\n\n const intDate = new Date(date);\n if (isToday(date)) {\n return `Today`;\n } else {\n return formatMMDDYY(intDate);\n }\n};\n\nexport const isToday = (date: any) => {\n if (!date) return false;\n date = new Date(date);\n const today = new Date();\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n\nconst getShortMonth = (date: Date) => {\n const options: Intl.DateTimeFormatOptions = { month: 'short' };\n return new Intl.DateTimeFormat('en-US', options).format(date);\n};\n\nexport const formatMonDDYear = (date: any) => {\n if (!date) return '';\n date = new Date(date);\n\n return `${getShortMonth(date)} ${ordinalSuffix(\n date.getDate()\n )}, ${date.getFullYear()}\n `;\n};\n\nexport const countDaysBetweenDates = (first: any, second: any) => {\n const diff = Math.abs(\n new Date(second).getTime() - new Date(first).getTime()\n );\n\n const dayDiff = Math.ceil(diff / (1000 * 3600 * 24));\n return dayDiff < 1 ? 1 : dayDiff;\n};\n\nexport const getCopyrightYear = () => {\n return new Date().getFullYear();\n};\n","import React, { memo, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { CircularProgress } from '@material-ui/core';\n\nconst StyledLoadingComponent = styled.div`\n width: 136px;\n height: 40px;\n display: flex;\n position: fixed;\n top: 0;\n left: 50%;\n transform: translate(-50%, 0);\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n overflow: hidden;\n`;\n\nconst LoadingIcon = styled.div`\n width: 40px;\n background: ${props => props.theme.Colors.darkTwo};\n color: ${props => props.theme.Colors.white};\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst LoadingText = styled.div`\n flex: 1;\n background: ${props => props.theme.Colors.dark};\n color: ${props => props.theme.Colors.white};\n font-size: 13px;\n font-weight: 600;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledCircularProgress = styled(CircularProgress)``;\n\nexport const LoadingComponent: React.FC<{ shouldDelay?: boolean }> = memo(({ shouldDelay = true }) => {\n const [show, setShow] = useState(!shouldDelay)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => setShow(true), shouldDelay ? 2000 : 0)\n\n return () => {\n clearTimeout(timeoutId)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (show ?\n <StyledLoadingComponent>\n <LoadingIcon>\n <StyledCircularProgress size={16} color=\"inherit\" />\n </LoadingIcon>\n <LoadingText>Loading...</LoadingText>\n </StyledLoadingComponent>\n : <></>);\n});\n","import React, { FC, useState, useRef } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Input } from '../../../ui/components/input';\r\nimport Checkbox from '../../../ui/components/Checkbox';\r\nimport { Label } from '../../../constants/interfaces/Label';\r\nimport TriangleDown from '../../../ui/icons/TriangleDown';\r\nimport TriangleRight from '../../../ui/icons/TriangleRight';\r\nimport { useHandleSelectLabels } from '../../labels/tools';\r\n\r\nconst StyledLabelListItemContainer = styled.div``;\r\n\r\nconst ChildLabelsContainer = styled.div<{\r\n expanded: boolean;\r\n}>`\r\n display: ${props => (props.expanded ? 'block' : 'none')};\r\n margin-left: 8px;\r\n`;\r\n\r\nconst LabelItemActions = styled.div<{ menuOpen?: boolean }>`\r\n display: flex;\r\n user-select: none;\r\n height: 100%;\r\n width: 40px;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n height: 100%;\r\n`;\r\n\r\nconst LabelNameContainer = styled.div`\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n`;\r\n\r\nconst ArrowContainer = styled.div`\r\n width: 8px;\r\n margin-right: 4px;\r\n cursor: pointer;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n pointer-events: none;\r\n`;\r\n\r\nconst CollapseArrow = styled.div`\r\n height: 8px;\r\n display: flex;\r\n`;\r\n\r\nconst LabelListItemInputContainer = styled.div`\r\n flex: 1;\r\n`;\r\n\r\nconst LabelListItemInput = styled(Input)<{ ref?: any; hasChildren?: boolean; hint?: string; }>`\r\n height: 100%;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n font-size: 13px;\r\n font-weight: 500;\r\n padding: 0 4px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n cursor: ${props => props.hasChildren ? 'pointer' : 'default'};\r\n`;\r\n\r\nconst StyledLabelListItem = styled.div<{\r\n selected?: boolean;\r\n modified?: boolean;\r\n searched?: boolean;\r\n}>`\r\n height: 32px;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n border-radius: 4px;\r\n font-size: 13px;\r\n align-items: center;\r\n display: flex;\r\n justify-content: space-between;\r\n ${LabelListItemInput}, ${ArrowContainer} {\r\n color: ${props =>\r\n props.selected || props.modified || props.searched\r\n ? props.theme.Colors.black\r\n : 'unset'};\r\n }\r\n &:hover ${LabelListItemInput}, :hover ${ArrowContainer} {\r\n color: ${props => props.theme.Colors.black};\r\n }\r\n &:hover {\r\n background: ${props => props.theme.Colors.whiteTwo};\r\n }\r\n`;\r\n\r\nexport const PortableLabelListItem: FC<{\r\n label: Label;\r\n allLabels?: Label[];\r\n openActions: boolean;\r\n toggleOpenActions: (open: boolean) => void;\r\n toggleCollapse: (labelId: number) => void;\r\n labelsCollapseState: number[];\r\n selectedLabels: number[];\r\n setLabelFilters?: (labelIds: number[]) => void;\r\n disableLabels?: boolean;\r\n}> = ({\r\n label,\r\n allLabels,\r\n openActions,\r\n toggleCollapse,\r\n labelsCollapseState,\r\n setLabelFilters,\r\n selectedLabels,\r\n disableLabels,\r\n}) => {\r\n const isLabelSelected = selectedLabels.includes(label.id);\r\n const isLabelPartiallySelected = selectedLabels.includes(-label.id);\r\n const isExpanded = labelsCollapseState.includes(label.id);\r\n const inputRef = useRef<any>(null);\r\n\r\n const hasChildren = (label?: Label) => {\r\n return label && label.children && label.children.length > 0;\r\n };\r\n\r\n const handleSelectLabels = useHandleSelectLabels();\r\n\r\n const handleLabelSelection = () => {\r\n if (setLabelFilters) {\r\n setLabelFilters(\r\n handleSelectLabels(label, selectedLabels, allLabels)\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <StyledLabelListItemContainer data-test=\"label-item-container\">\r\n <StyledLabelListItem\r\n selected={\r\n isLabelSelected ||\r\n isLabelPartiallySelected ||\r\n openActions\r\n }\r\n modified={false}\r\n searched={false}\r\n >\r\n <LabelNameContainer\r\n onClick={e => {\r\n e.stopPropagation();\r\n toggleCollapse(label.id);\r\n }}\r\n data-test=\"label-item-name-container\"\r\n >\r\n <ArrowContainer data-test=\"label-item-arrow-container\">\r\n {hasChildren(label) && (\r\n <CollapseArrow>\r\n {labelsCollapseState.includes(label.id) ? (\r\n <TriangleDown />\r\n ) : (\r\n <TriangleRight />\r\n )}\r\n </CollapseArrow>\r\n )}\r\n </ArrowContainer>\r\n <LabelListItemInputContainer data-test=\"label-item-input-container\">\r\n <LabelListItemInput\r\n ref={inputRef}\r\n height={'auto'}\r\n value={label.name}\r\n colorTheme=\"transparent\"\r\n maxLength={144}\r\n readOnly={true}\r\n hint={label.name}\r\n hasChildren={hasChildren(label)}\r\n />\r\n </LabelListItemInputContainer>\r\n </LabelNameContainer>\r\n <LabelItemActions menuOpen={openActions}>\r\n <StyledCheckbox\r\n checked={\r\n isLabelSelected || isLabelPartiallySelected\r\n }\r\n partial={isLabelPartiallySelected}\r\n handleChange={handleLabelSelection}\r\n size={12}\r\n disabled={disableLabels}\r\n border=\"var(--ps-grey-2)\"\r\n dataTest=\"label-item-checkbox\"\r\n />\r\n </LabelItemActions>\r\n </StyledLabelListItem>\r\n </StyledLabelListItemContainer>\r\n {hasChildren(label) && (\r\n <ChildLabelsContainer\r\n expanded={isExpanded}\r\n >\r\n {label.children!.map((childLabel: Label) => (\r\n <PortableLabelListItemContainer\r\n key={childLabel.id}\r\n label={childLabel}\r\n allLabels={allLabels}\r\n labelsCollapseState={labelsCollapseState}\r\n selectedLabels={selectedLabels}\r\n siblingIds={\r\n label.children &&\r\n label.children.map(label => label.id)\r\n }\r\n disableLabels={disableLabels}\r\n toggleCollapse={toggleCollapse}\r\n setLabelFilters={setLabelFilters}\r\n />\r\n ))}\r\n </ChildLabelsContainer>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nconst PortableLabelListItemContainer: FC<{\r\n label: Label;\r\n allLabels?: Label[];\r\n labelsCollapseState: number[];\r\n selectedLabels: number[];\r\n siblingIds?: number[];\r\n disableLabels?: boolean;\r\n toggleCollapse(labelId: number): void;\r\n setLabelFilters?: (labelIds: number[]) => void;\r\n}> = ({\r\n label,\r\n allLabels,\r\n labelsCollapseState,\r\n selectedLabels,\r\n disableLabels,\r\n toggleCollapse,\r\n setLabelFilters,\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n\r\n return (\r\n <PortableLabelListItem\r\n label={label}\r\n allLabels={allLabels}\r\n openActions={open}\r\n toggleOpenActions={setOpen}\r\n toggleCollapse={toggleCollapse}\r\n labelsCollapseState={labelsCollapseState}\r\n setLabelFilters={setLabelFilters}\r\n selectedLabels={selectedLabels}\r\n disableLabels={disableLabels}\r\n />\r\n );\r\n};\r\n\r\nexport default PortableLabelListItemContainer;\r\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Label } from '../../../constants/interfaces/Label';\nimport PortableLabelListItem from './PortableLabelListItem';\n\nconst StyledLabelsList = styled.div`\n margin-bottom: 16px;\n overflow: auto;\n`;\n\nconst ScrollableLabelContainer = styled.div`\n height: 100%;\n`;\n\nexport const PortableLabelsList: FC<{\n labels: Label[];\n allLabels?: Label[];\n labelsCollapseState: number[];\n selectedLabels: number[];\n disableLabels?: boolean;\n toggleCollapse(labelId: number): void;\n setLabelFilters?: (labelIds: number[]) => void;\n}> = ({\n labels,\n allLabels,\n labelsCollapseState,\n selectedLabels,\n disableLabels,\n setLabelFilters,\n toggleCollapse,\n}) => {\n if (!labels || (labels && labels.length === 0)) return null;\n return (\n <StyledLabelsList>\n <ScrollableLabelContainer>\n {labels &&\n labels.map(label => {\n return (\n <PortableLabelListItem\n allLabels={allLabels}\n key={label.id}\n label={label}\n labelsCollapseState={labelsCollapseState}\n selectedLabels={selectedLabels}\n disableLabels={disableLabels}\n setLabelFilters={setLabelFilters}\n toggleCollapse={toggleCollapse}\n />\n );\n })}\n </ScrollableLabelContainer>\n </StyledLabelsList>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport NoLabels from '../../../ui/icons/NoLabels';\n\nconst Container = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst IconWrapper = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoTeamsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyLabels: FC<{ loading?: boolean }> = ({ loading, children }) => {\n if (loading) {\n return (\n <Container>\n <Loading />\n </Container>\n );\n }\n\n return (\n <Container>\n <StyledEmptyContent>\n <IconWrapper data-test=\"labels-searchbox-no-items-icon\">\n <NoLabels />\n </IconWrapper>\n <NoTeamsTitle data-test=\"labels-searchbox-no-items-text\">No Labels yet</NoTeamsTitle>\n </StyledEmptyContent>\n </Container>\n );\n};\n\nexport default EmptyLabels;\n","import React, { FC } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\r\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\r\n\r\nconst Container = styled.div`\r\n flex-direction: column;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 100px;\r\n`;\r\n\r\nconst SmallContainer = styled.div`\r\n flex-direction: column;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n\r\nconst StyledEmptyContent = styled.div`\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n`;\r\n\r\nconst StyledEmptyContentSmall = styled(StyledEmptyContent)`\r\n flex-direction: row;\r\n align-items: center;\r\n margin: 8px 0;\r\n`;\r\n\r\nconst IconWrapper = styled.div`\r\n width: 32px;\r\n height: 32px;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst NoLabelsTitle = styled.div`\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n font-size: 11px;\r\n font-weight: 600;\r\n font-stretch: normal;\r\n text-align: center;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n`;\r\n\r\nconst StyledEmptyLabelsContent = styled.div`\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n`;\r\n\r\nexport type NoResultType = 'default' | 'min';\r\n\r\nconst NoResults: FC<{ loading?: boolean; version: NoResultType }> = ({\r\n loading,\r\n version,\r\n}) => {\r\n if (version === 'min') {\r\n return (\r\n <SmallContainer>\r\n {loading ? (\r\n <Loading />\r\n ) : (\r\n <StyledEmptyContentSmall>\r\n <StyledEmptyLabelsContent>\r\n <IconWrapper data-test=\"labels-searchbox-empty-result-icon\">\r\n <NoSearchResult />\r\n </IconWrapper>\r\n <NoLabelsTitle data-test=\"labels-searchbox-empty-result-label\">No Labels found</NoLabelsTitle>\r\n </StyledEmptyLabelsContent>\r\n </StyledEmptyContentSmall>\r\n )}\r\n </SmallContainer>\r\n );\r\n }\r\n\r\n return (\r\n <Container>\r\n {loading ? (\r\n <Loading />\r\n ) : (\r\n <StyledEmptyContent>\r\n <IconWrapper data-test=\"labels-searchbox-empty-result-icon\">\r\n <NoSearchResult />\r\n </IconWrapper>\r\n <NoLabelsTitle data-test=\"labels-searchbox-empty-result-label\">No Labels found</NoLabelsTitle>\r\n </StyledEmptyContent>\r\n )}\r\n </Container>\r\n );\r\n};\r\n\r\nexport default NoResults;\r\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { compose } from 'redux';\r\nimport styled, { css } from 'styled-components';\r\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { Label } from '../../../constants/interfaces/Label';\r\nimport { listToTree } from '../../../helpers/functions/list-to-tree';\r\nimport {treeToArray, treeToList} from '../../../helpers/functions/tree-to-list';\r\nimport { filterLabels, sortLabels } from '../../labels/tools';\r\nimport { PortableLabelsList } from './PortableLabelList';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport EmptyLabels from './EmptyLabels';\r\nimport { Variables } from '../../../theme/variables';\r\nimport NoResults, { NoResultType } from './NoResultLabels';\r\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\n//region Types\r\ntype Action = 'clear' | 'select';\r\n\r\nexport type PortableLabelsProps = {\r\n labels?: PaginationResult<Label>;\r\n collapsedList: number[];\r\n selectedList: number[];\r\n onSave?: () => void;\r\n onSelectAll?: (selectedList: number[]) => void;\r\n onDeselectAll?: () => void;\r\n onClearSelected?: () => void;\r\n onToggleCollapse: (labelId: number) => void;\r\n onToggleCollapseAll: () => void;\r\n onSetSelected?: (labelIds: number[]) => void;\r\n filtersTitle?: string;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n showSave?: boolean;\r\n noResultType?: NoResultType;\r\n};\r\n//endregion\r\n\r\n//region Styles\r\nconst StyledCreateLabels = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst CreateLabelsBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst FiltersSavePanel = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst StyledPlainActionsWrapper = styled.div`\r\n padding-right: 14px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.black};\r\n font-weight: 600;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n//endregion\r\n\r\nconst PortableLabels: FC<PortableLabelsProps> = ({\r\n labels,\r\n collapsedList,\r\n selectedList,\r\n disabled,\r\n loading,\r\n onSave,\r\n onClearSelected,\r\n onDeselectAll,\r\n onSelectAll,\r\n onToggleCollapse,\r\n onToggleCollapseAll,\r\n onSetSelected,\r\n filtersTitle,\r\n showSelectActions,\r\n showSearch,\r\n showSave = true,\r\n noResultType = 'min',\r\n}) => {\r\n const actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n > = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n };\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [transformedLabels, setTransformedLabels] = useState(\r\n listToTree(labels && labels.items)\r\n );\r\n const [processedSelectedList, setProcessedSelectedList] = useState<\r\n number[]\r\n >([]);\r\n const [processedIds, setProcessedIds] = useState<any>([]);\r\n\r\n const getPrecessedLabels = useMemo(() => {\r\n const result = compose<Label[]>(\r\n filterLabels(searchTerm),\r\n sortLabels\r\n )(transformedLabels);\r\n\r\n if (result.length > 0) {\r\n const filteredAndSortedLabelsArray = treeToArray(result);\r\n const processedDataIds = filteredAndSortedLabelsArray.map((item: any) => item.id!)\r\n setProcessedIds(processedDataIds);\r\n setProcessedSelectedList(\r\n selectedList.filter(item => processedDataIds.includes(Math.abs(item)))\r\n );\r\n }\r\n\r\n return result;\r\n }, [transformedLabels, searchTerm, selectedList]);\r\n\r\n const isAllSelected = useMemo(\r\n () => selectedList.length === processedIds.length,\r\n [selectedList, processedIds]\r\n );\r\n\r\n const clearHandler = useCallback(() => {\r\n onClearSelected?.();\r\n }, [onClearSelected]);\r\n\r\n const deSelectAllHandler = useCallback(() => {\r\n if (isAllSelected && onDeselectAll) {\r\n onDeselectAll();\r\n } else {\r\n if (searchTerm) {\r\n onSetSelected?.(processedIds);\r\n }\r\n else if (onSelectAll) {\r\n onSelectAll(processedIds);\r\n }\r\n }\r\n }, [onDeselectAll, onSelectAll, onSetSelected, isAllSelected, processedIds, searchTerm]);\r\n\r\n const searchHandler = (value: string) => {\r\n if(!!value){\r\n onToggleCollapseAll();\r\n } else {\r\n // clearHandler(); //FIXME: check if it's needed\r\n }\r\n setSearchTerm(value) \r\n };\r\n\r\n\r\n \r\n \r\n useEffect(() => {\r\n setTransformedLabels(listToTree(treeToList(labels && labels.items)));\r\n }, [labels]);\r\n\r\n const showNoItems = !labels?.totalCount;\r\n const showNoResultsState = !getPrecessedLabels.length;\r\n const showEmptyState = showNoItems || showNoResultsState || loading;\r\n\r\n const selectedLabelsLength = selectedList.filter(id => id > 0).length\r\n\r\n return (\r\n <StyledCreateLabels>\r\n <CreateLabelsBody>\r\n {filtersTitle && (\r\n <FiltersHeader>\r\n <FilterTitle>{filtersTitle}</FilterTitle>\r\n </FiltersHeader>\r\n )}\r\n {showSearch && (\r\n <SearchWrapper data-test=\"labels-searchbox-wrapper\">\r\n <TableSearchInput\r\n onChange={searchHandler}\r\n disabled={showNoItems}\r\n dataTest=\"labels-searchbox-field\"\r\n />\r\n </SearchWrapper>\r\n )}\r\n {showSelectActions && !showNoItems && (\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"labels-selected-caption\">\r\n {selectedLabelsLength > 0\r\n ? `${selectedLabelsLength} ${\r\n selectedLabelsLength > 1\r\n ? ' Labels selected'\r\n : ' Label selected'\r\n }`\r\n : 'No Labels selected'}\r\n </SelectedCaption>\r\n </div>\r\n <StyledPlainActionsWrapper>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n processedSelectedList.length === 0 ||\r\n showNoResultsState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"labels-unselect-all-button\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showNoResultsState}\r\n color={actionConfig.select.color}\r\n colorActive={\r\n actionConfig.select.colorActive\r\n }\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={deSelectAllHandler}\r\n data-test=\"labels-select-all-button\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </StyledPlainActionsWrapper>\r\n </SelectActions>\r\n )}\r\n {showEmptyState ? (\r\n showNoItems ? (\r\n <EmptyLabels loading={loading} />\r\n ) : (\r\n <NoResults version={noResultType} loading={loading} />\r\n )\r\n ) : (\r\n <>\r\n <PortableLabelsList\r\n labels={getPrecessedLabels}\r\n allLabels={labels && labels.items}\r\n labelsCollapseState={collapsedList}\r\n selectedLabels={selectedList}\r\n disableLabels={disabled}\r\n setLabelFilters={onSetSelected}\r\n toggleCollapse={onToggleCollapse}\r\n />\r\n {onSave && showSave && (\r\n <FiltersSavePanel>\r\n <Button\r\n type={'button'}\r\n label={'Save'}\r\n action={() => onSave()}\r\n height={'48px'}\r\n width={'160px'}\r\n />\r\n </FiltersSavePanel>\r\n )}\r\n </>\r\n )}\r\n </CreateLabelsBody>\r\n </StyledCreateLabels>\r\n );\r\n};\r\n\r\nexport { PortableLabels };\r\n","import React, { FC, useEffect } from 'react';\r\n\r\nimport {\r\n useDeselectAllLabels,\r\n useResetCollapseAllLabels,\r\n useResetSelectedLabels,\r\n useSaveLabels,\r\n useSelectAllLabels,\r\n useSelectLabels,\r\n useToggleCollapseAllLabels,\r\n useToggleCollapseLabel,\r\n} from '../store/hors/withLabels/services';\r\nimport { useLabelsState } from '../store/hors/withLabels/states';\r\nimport { PortableLabels, PortableLabelsProps } from './PortableLabels';\r\nimport { usePortableLabelsState } from '../store/states';\r\n\r\ntype Props = Pick<\r\n PortableLabelsProps,\r\n | 'filtersTitle'\r\n | 'onSetSelected'\r\n | 'showSelectActions'\r\n | 'showSearch'\r\n | 'showSave'\r\n> & {\r\n resetSelectedOnUnmount?: boolean;\r\n};\r\n\r\nexport const PortableLabelsWithStore: FC<Props> = ({\r\n onSetSelected,\r\n resetSelectedOnUnmount = true,\r\n ...rest\r\n}) => {\r\n const { selected, collapsed } = useLabelsState();\r\n const { data, loading } = usePortableLabelsState();\r\n const collapseLabelHandler = useToggleCollapseLabel();\r\n const collapseAllLabels = useToggleCollapseAllLabels();\r\n const resetCollapsedLAbels = useResetCollapseAllLabels() \r\n const saveHandler = useSaveLabels();\r\n const select = useSelectLabels();\r\n const selectAll = useSelectAllLabels();\r\n const deselectAll = useDeselectAllLabels();\r\n const resetSelected = useResetSelectedLabels();\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (resetSelectedOnUnmount) {\r\n resetSelected();\r\n }\r\n };\r\n }, [resetSelectedOnUnmount, resetSelected]);\r\n\r\n return (\r\n <PortableLabels\r\n labels={data}\r\n selectedList={selected}\r\n collapsedList={collapsed}\r\n loading={loading}\r\n onToggleCollapse={collapseLabelHandler}\r\n onToggleCollapseAll={collapseAllLabels}\r\n onClearSelected={() => {\r\n resetCollapsedLAbels();\r\n select([])\r\n onSetSelected && onSetSelected([])}}\r\n onSave={saveHandler}\r\n onSetSelected={ids => {\r\n select(ids);\r\n onSetSelected && onSetSelected(ids);\r\n }}\r\n onSelectAll={(selectedList?: number[]) => {\r\n selectAll(selectedList);\r\n onSetSelected &&\r\n onSetSelected(data.items.map(label => label.id));\r\n }}\r\n onDeselectAll={() => {\r\n deselectAll();\r\n onSetSelected && onSetSelected([]);\r\n }}\r\n {...rest}\r\n />\r\n );\r\n};\r\n","import { useDispatch } from 'react-redux';\r\nimport { useCallback } from 'react';\r\nimport {\r\n clearAssignLabelsAction,\r\n clearLabelFilterAction,\r\n closeLabelCreationPanelAction,\r\n collapseAllLabelsAction,\r\n collapseAllTableLabelsAction,\r\n expandAllLabelsAction,\r\n expandLabelFieldByIdAction,\r\n expandMultipleLabelsAction,\r\n modifyLabelNameAction,\r\n openLabelCreationPanelAction,\r\n saveLabelFiltersFailure,\r\n saveLabelFiltersStart,\r\n saveLabelFiltersSuccess,\r\n searchLabelsFailure,\r\n searchLabelsStart,\r\n searchLabelsSuccess,\r\n selectLabelFilterAction,\r\n setAssignLabelsAction,\r\n setEditingLabelAction,\r\n setLabelFilterAction,\r\n setLabelsSearchTerm,\r\n toggleCollapseAssignLabelFieldAction,\r\n toggleCollapseLabelFieldAction,\r\n updateLabelFailure,\r\n updateLabelStart,\r\n updateLabelSuccess,\r\n setPreviouslyAssignedLabels,\r\n} from './actions';\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\r\nimport {\r\n useCreateLabelApi,\r\n useDeleteLabelApi,\r\n useSearchLabelsApi,\r\n useUpdateLabelApi,\r\n} from '../../../api';\r\nimport { MutateLabelsParams } from '../../../api/labels/types';\r\nimport { Label } from '../../../constants/interfaces/Label';\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport { EditingLabels } from './states';\r\nimport { useSaveUserSettingsApi } from '../../../api';\r\nimport { isAuthorized, getCurrentUserId } from '../../../helpers/functions/auth-helpers';\r\n\r\nexport const useCreateLabelService = () => {\r\n const dispatch = useDispatch();\r\n const createLabelApi = useCreateLabelApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (params: MutateLabelsParams) => {\r\n dispatch(updateLabelStart());\r\n return createLabelApi(params)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLabelSuccess(data as Label, 'create'))\r\n );\r\n showMessage('Label created', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLabelFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error.message;\r\n });\r\n },\r\n [dispatch, createLabelApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchLabelsService = () => {\r\n const dispatch = useDispatch();\r\n const searchLabelsApi = useSearchLabelsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp?: SearchParams) => {\r\n dispatch(searchLabelsStart());\r\n return searchLabelsApi(sp)\r\n .then(data => {\r\n dispatch(\r\n searchLabelsSuccess(\r\n data,\r\n sp && sp.searchTerm.length > 0\r\n )\r\n );\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchLabelsFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, searchLabelsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useUpdateLabelService = () => {\r\n const dispatch = useDispatch();\r\n const updateLabelApi = useUpdateLabelApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (labelId: number, params: MutateLabelsParams) => {\r\n dispatch(updateLabelStart());\r\n return updateLabelApi(labelId, params)\r\n .then(data => {\r\n dispatch(\r\n updateLabelSuccess({ id: data.id } as Label, 'update')\r\n );\r\n showMessage('Label updated', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLabelFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error.message;\r\n });\r\n },\r\n [dispatch, updateLabelApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useDeleteLabelService = () => {\r\n const dispatch = useDispatch();\r\n const deleteLabelApi = useDeleteLabelApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (label: Label) => {\r\n dispatch(updateLabelStart());\r\n return deleteLabelApi(label.id)\r\n .then(data => {\r\n dispatch(dispatch(updateLabelSuccess(label, 'delete')));\r\n showMessage('Label deleted', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLabelFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, deleteLabelApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useSaveUserFiltersService\r\n * @description saves labels selected by current user as filters\r\n * @param { number[] | null } labels\r\n * @returns { Promise }\r\n */\r\nexport const useSaveUserFiltersService = () => {\r\n const dispatch = useDispatch();\r\n const saveUserSettingsApi = useSaveUserSettingsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (labels: number[] | null) => {\r\n if (!isAuthorized()) {\r\n showMessage('User is not authorized to perform this action', 'error');\r\n return Promise.reject();\r\n }\r\n dispatch(saveLabelFiltersStart(labels));\r\n return saveUserSettingsApi(getCurrentUserId()!, labels)\r\n .then(data => {\r\n dispatch(saveLabelFiltersSuccess(labels));\r\n dispatch(setLabelFilterAction(labels ?? []));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(saveLabelFiltersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, saveUserSettingsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSelectLabelFilterActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId: number) => {\r\n dispatch(selectLabelFilterAction(labelId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSetPreviouslyAssignedLabelsAction = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labels: number[]) => {\r\n dispatch(setPreviouslyAssignedLabels(labels));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useToggleCollapseLabelFieldService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId: number) => {\r\n dispatch(toggleCollapseLabelFieldAction(labelId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useToggleCollapseAssignLabelFieldService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId: number) => {\r\n dispatch(toggleCollapseAssignLabelFieldAction(labelId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useExpandLabelFieldByIdService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId: number) => {\r\n dispatch(expandLabelFieldByIdAction(labelId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSetLabelFilterActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labels: number[]) => {\r\n dispatch(setLabelFilterAction(labels));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useClearLabelFilterActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(clearLabelFilterAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSetAssignLabelsActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labels: number[]) => {\r\n dispatch(setAssignLabelsAction(labels));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useClearAssignLabelsActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(clearAssignLabelsAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useCollapseAllLabelsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(collapseAllLabelsAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useCollapseAllTableLabelsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(collapseAllTableLabelsAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useExpandAllLabelsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(expandAllLabelsAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useExpandMultipleLabelsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelIds: number[]) => {\r\n dispatch(expandMultipleLabelsAction(labelIds));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useModifyLabelNameActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId, value: string) => {\r\n dispatch(modifyLabelNameAction(labelId, value));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useOpenLabelCreationPanelService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(openLabelCreationPanelAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useCloseLabelCreationPanelService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(closeLabelCreationPanelAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSetLabelsSearchTermService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (value: string) => {\r\n dispatch(setLabelsSearchTerm(value));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSetEditingLabelActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (configs?: EditingLabels) => {\r\n dispatch(setEditingLabelAction(configs));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { Label } from '../../../constants/interfaces/Label';\nimport { useSelector } from 'react-redux';\n\ntype PortableLabelsBaseState = {\n data: PaginationResult<Label>;\n loading: boolean;\n};\n\nexport type PortableLabelsState = PortableLabelsBaseState;\n\nexport const initialState = {\n data: {\n items: [],\n limit: 0,\n offset: 0,\n numberOfPages: 0,\n totalCount: 0,\n lastUpdated: undefined,\n },\n loading: false,\n};\n\nexport const usePortableLabelsState = (): PortableLabelsState => {\n const appState = useSelector(state => state);\n return appState.portableLabels;\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport Popover, { PopoverOrigin } from '@material-ui/core/Popover';\n\nconst Arrow = styled.div<{\n width: number;\n height: number;\n}>`\n position: absolute;\n top: 0;\n left: 7px;\n transform: translateY(-100%);\n width: 38px;\n height: 9px;\n overflow: hidden;\n box-shadow: 0 0 10px -17px rgba(166, 174, 190, 0.5);\n\n :after {\n content: '';\n position: absolute;\n width: 18px;\n height: 36px;\n background: white;\n transform: rotate(45deg);\n top: 0;\n left: 0;\n box-shadow: -1px -1px 10px -2px rgba(166, 174, 190, 0.5);\n }\n`;\n\nconst StyledPopover = styled(Popover)<{\n verticaloffset: number;\n horizontaloffset: number;\n}>`\n && > .MuiPopover-paper {\n overflow: auto;\n margin-top: ${({ verticaloffset }) => verticaloffset}px;\n margin-left: ${({ horizontaloffset }) => horizontaloffset}px;\n }\n && > .MuiPaper-elevation8 {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n overflow: visible;\n }\n`;\n\nconst Wrapper = styled.div<{\n padding?: string;\n}>`\n padding: ${({ padding }) => (padding ? padding : '32px 24px 24px 24px')};\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n background: ${({ theme }) => theme.Colors.white};\n overflow: hidden;\n`;\n\nexport const PopupComponent: FC<{\n triggerRef: any;\n open: boolean;\n onDismiss: () => void;\n arrow?: boolean;\n hideOnOutsideClick?: () => void;\n padding?: string;\n anchorOrigin?: PopoverOrigin;\n transformOrigin?: PopoverOrigin;\n verticalOffset?: number;\n horizontalOffset?: number;\n}> = ({\n triggerRef,\n open,\n onDismiss,\n children,\n arrow = false,\n hideOnOutsideClick,\n padding,\n anchorOrigin,\n transformOrigin,\n verticalOffset,\n horizontalOffset,\n}) => {\n return (\n <StyledPopover\n anchorEl={triggerRef.current}\n open={open}\n onClose={() => {\n if (!hideOnOutsideClick) {\n onDismiss();\n }\n }}\n anchorOrigin={\n anchorOrigin || {\n vertical: 'bottom',\n horizontal: 'right',\n }\n }\n transformOrigin={\n transformOrigin || {\n vertical: 'top',\n horizontal: 'right',\n }\n }\n onClick={e => {\n e.stopPropagation();\n }}\n verticaloffset={verticalOffset ? verticalOffset : 8}\n horizontaloffset={horizontalOffset ? horizontalOffset : 0}\n >\n <Wrapper padding={padding}>\n {arrow && (\n <Arrow\n width={triggerRef?.current?.clientWidth || 0}\n height={triggerRef?.current?.clientHeight || 0}\n />\n )}\n {children}\n </Wrapper>\n </StyledPopover>\n );\n};\n","import React, {\n PropsWithChildren,\n ReactElement,\n ReactNode,\n RefObject,\n useRef,\n useMemo,\n useState,\n useEffect,\n useCallback,\n} from 'react';\nimport { PopoverOrigin } from '@material-ui/core/Popover';\nimport { SingletonPopup } from './helpers/useSingleton';\nimport { useDismiss } from '../../../helpers/hooks/useDismiss';\nimport { PopupComponent } from './PopupComponent';\n\nexport type PopupProps = {\n enabled: boolean;\n enable: () => void;\n disable: () => void;\n show: () => void;\n hide: () => void;\n toggleShown: () => void;\n shown: boolean;\n};\n\ntype Props<T> = {\n content:\n | ReactNode\n | { (props: PopupProps, dismissProps: DismissProps): ReactNode };\n contentWidth?: string;\n padding?: string;\n children: {\n (\n ref: RefObject<T>,\n props: PopupProps,\n dismissProps: DismissProps\n ): ReactElement;\n };\n dismissKey?: string;\n hideOnOutsideClick?: boolean;\n anchorOrigin?: PopoverOrigin;\n transformOrigin?: PopoverOrigin;\n singleton?: SingletonPopup<T>;\n arrow?: boolean;\n verticalOffset?: number;\n horizontalOffset?: number;\n};\n\nexport type DismissProps = {\n dismiss: () => void;\n};\n\n/**\n * Absolute auto positioning Popup component\n * @param children render function with Ref object. Append that object on HTMLElement to trigger Popup\n * @param content content of Popup\n * @param dismissKey first time displaying based on useDismiss hook. Popup will always showing on component mount when the value is not dismissed\n * @param hideOnOutsideClick enable or disable hiding on click pout of content\n * @param arrow render arrow on the edge of content\n * @param padding\n * @param singleton\n * @param anchorPosition\n * @param verticalOffset adjust vertical position\n * @param horizontalOffset adjust horizontal position\n * @constructor\n */\nexport const Popup = <T extends HTMLElement = HTMLElement>({\n children,\n content,\n arrow = false,\n dismissKey,\n hideOnOutsideClick,\n padding,\n anchorOrigin,\n transformOrigin,\n singleton,\n verticalOffset,\n horizontalOffset,\n}: PropsWithChildren<Props<T>>) => {\n const [shown, _setShown] = useState(false);\n\n const shownRef = useRef(shown);\n const setShown = (value: boolean) => {\n shownRef.current = value;\n _setShown(value);\n };\n \n const show = useCallback(() => {\n setShown(true);\n }, []);\n\n const hide = () => {\n setShown(false);\n };\n const toggleShown = () => {\n if (shownRef.current) {\n hide();\n } else {\n show();\n }\n };\n\n const [enabled, setEnabled] = useState(true);\n\n const enable = () => {\n setEnabled(true);\n };\n const disable = () => {\n hide();\n setEnabled(false);\n };\n\n const [dismissed, setDismissed] = useDismiss(dismissKey);\n useEffect(() => {\n if (dismissKey && !dismissed) {\n show();\n }\n }, [dismissKey, dismissed, show]);\n\n const dismissProps = useMemo<DismissProps>(() => {\n return {\n dismiss: setDismissed,\n };\n }, [setDismissed]);\n\n const innerTriggerRef = useRef<T>(null);\n\n const triggerRef = useMemo(() => {\n if (singleton) {\n return singleton.triggerRef;\n }\n return innerTriggerRef;\n }, [singleton]);\n\n const getChildren = () => {\n if (children) {\n return children(\n triggerRef,\n {\n shown,\n toggleShown,\n hide,\n show,\n enabled,\n disable,\n enable,\n },\n dismissProps\n );\n }\n return null;\n };\n\n const getContent = () => {\n if (typeof content === 'function') {\n return content(\n {\n shown,\n toggleShown,\n hide,\n show,\n enabled,\n disable,\n enable,\n },\n dismissProps\n );\n }\n return content;\n };\n\n return (\n <>\n {getChildren()}\n <PopupComponent\n triggerRef={triggerRef}\n open={shown && enabled && !dismissed}\n arrow={arrow}\n padding={padding}\n onDismiss={() => {\n if (!hideOnOutsideClick) {\n setShown(false);\n if (dismissKey) {\n setDismissed();\n }\n }\n }}\n anchorOrigin={\n anchorOrigin || {\n vertical: 'bottom',\n horizontal: 'right',\n }\n }\n transformOrigin={\n transformOrigin || {\n vertical: 'top',\n horizontal: 'right',\n }\n }\n verticalOffset={verticalOffset}\n horizontalOffset={horizontalOffset}\n >\n {getContent()}\n </PopupComponent>\n </>\n );\n};\n","import { useCallback, useMemo, useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { getProfileState } from '../../pages/UserProfile/store/reducers';\n\n/**\n * Manual dismissing (based on local storage)\n * @param key - unique key value\n * @param forCurrentUser - dismiss for current authorized user (from redux storage: profile.id)\n * @return array with 2 items: the first item is a stateful boolean value, the second item is function for dismissing of current key\n */\nexport const useDismiss = (\n key: string | undefined,\n forCurrentUser = true\n): [boolean, () => void] => {\n const dismissKey = 'dismissedItems';\n\n const profile = useSelector(getProfileState);\n\n const itemKey = useMemo(() => {\n if (forCurrentUser && profile?.id !== undefined) {\n return `${key}&userId=${profile.id}`;\n } else if (forCurrentUser && !profile?.id) {\n console.warn(\n \"Cannot get ID of current authorized user. Seems like for now it's a guest user. Please make for sure you are doing good :)\"\n );\n }\n return key;\n }, [key, profile, forCurrentUser]);\n\n const getValue = useCallback((): boolean => {\n if (\n itemKey === undefined ||\n (forCurrentUser && profile?.id === undefined)\n ) {\n return true;\n }\n\n try {\n const dismissedHashString = localStorage.getItem(dismissKey);\n if (dismissedHashString === null) {\n throw new Error();\n }\n const dismissedItemsHash = JSON.parse(dismissedHashString);\n return dismissedItemsHash[itemKey];\n } catch {\n localStorage.setItem(\n dismissKey,\n JSON.stringify({ [itemKey]: false })\n );\n return false;\n }\n }, [itemKey, profile, forCurrentUser]);\n\n const [isDismissed, setDismiss] = useState(getValue());\n\n const onDismissHandler = useCallback(() => {\n if (\n itemKey === undefined ||\n (forCurrentUser && profile?.id === undefined)\n ) {\n return;\n }\n\n try {\n const dismissedHashString = localStorage.getItem(dismissKey);\n if (dismissedHashString === null) {\n throw new Error();\n }\n const dismissedItemsHash = JSON.parse(dismissedHashString);\n dismissedItemsHash[itemKey] = true;\n localStorage.setItem(\n dismissKey,\n JSON.stringify(dismissedItemsHash)\n );\n } catch {\n localStorage.setItem(\n dismissKey,\n JSON.stringify({ [itemKey]: true })\n );\n }\n setDismiss(true);\n }, [setDismiss, itemKey, profile, forCurrentUser]);\n\n // update state when authorized user was changed\n useEffect(() => {\n if (profile?.id !== undefined) {\n setDismiss(getValue());\n }\n }, [profile, setDismiss, getValue]);\n\n return [isDismissed, onDismissHandler];\n};\n","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Label } from '../../../constants/interfaces/Label';\nimport { isEqual } from 'lodash';\n\nexport interface LabelsState {\n open: boolean;\n data?: PaginationResult<Label>;\n fullList?: PaginationResult<Label>;\n collapseLabels: number[];\n assignedLabels: number[];\n collapseAssignLabels: number[];\n selected: number[];\n searchResults?: number[];\n selectedModified: boolean;\n totalCount?: number;\n loading?: boolean;\n saveLoading?: boolean;\n error?: string;\n previouslyAssignedLabels?: number[];\n}\n\nexport type LabelsStateSelector = (state: any) => LabelsState;\n\nexport const LabelsStateSelectorContext = React.createContext<\n LabelsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useLabelsState(): LabelsState {\n return useSelector(useContext(LabelsStateSelectorContext), isEqual);\n}\n\nexport interface EditingLabels {\n id?: number | null;\n mode?: 'edit' | 'new';\n}\n\nexport interface LabelsConfigState {\n searchTerm: string;\n editingLabels?: EditingLabels;\n error?: string;\n}\n\nexport type LabelsConfigStateSelector = (state: any) => LabelsConfigState;\n\nexport const LabelsConfigStateSelectorContext = React.createContext<\n LabelsConfigStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useLabelsConfigState(): LabelsConfigState {\n return useSelector(useContext(LabelsConfigStateSelectorContext));\n}\n\nexport interface UpdatedLabelsState {\n data?: Label;\n updateType?: 'create' | 'update' | 'delete';\n loading?: boolean;\n}\n\nexport type UpdatedLabelsStateSelector = (state: any) => UpdatedLabelsState;\n\nexport const UpdatedLabelsStateSelectorContext = React.createContext<\n UpdatedLabelsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useUpdatedLabelsState(): UpdatedLabelsState {\n return useSelector(useContext(UpdatedLabelsStateSelectorContext));\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Checked = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 5 4\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"none\"\n fillRule=\"evenodd\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n d=\"M176 164.456L177.712 166 180 163\"\n transform=\"translate(-176 -163)\"\n />\n </svg>\n );\n }\n);\n\nexport default Checked;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Dash = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 6 1\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"none\"\n fillRule=\"evenodd\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n d=\"M4 6.5L8 6.5\"\n transform=\"translate(-3 -6)\"\n />\n </svg>\n );\n }\n);\n\nexport default Dash;\n","import { FC, ChangeEvent, CSSProperties, ReactElement } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../theme/variables';\nimport Checked from '../../icons/Checked';\nimport Dash from '../../icons/Dash';\n\nconst checkboxSize = 20;\n\nconst COLORS = {\n background: Variables.Colors.white,\n checkedBackground: Variables.Colors.darkSkyBlue,\n checkedColor: Variables.Colors.white,\n borderColor: Variables.Colors.iconGrayBg,\n partial: {\n checkedBackground: Variables.Colors.steelGrey,\n },\n disabled: {\n background: Variables.Colors.lightBlueGray,\n checkedBackground: Variables.Colors.iconGrayBg,\n checkedColor: Variables.Colors.white,\n },\n};\n\nconst StyledWrapper = styled.label<{ disabled?: boolean }>`\n display: flex;\n flex-direction: row-reverse;\n align-items: center;\n cursor: pointer;\n ${props => props.disabled && 'pointer-events: none'}\n`;\n\nconst StyledLabel = styled.div<{\n color?: string;\n weight?: string;\n size?: number;\n}>`\n font-size: ${props => (!!props.size ? props.size : 13)}px;\n margin-left: 8px;\n color: ${props => (props.color ? props.color : Variables.Colors.labelGray)};\n font-weight: ${props => (props.weight ? props.weight : 'normal')};\n`;\n\nconst SelectedIconContainer = styled.div<{ size: number; marginLeft?: string }>`\n width: ${props => props.size}px;\n max-width: 12px;\n display: flex;\n color: ${props => props.theme.Colors.white};\n ${props => !!props.marginLeft && `margin-left: ${props.marginLeft};`}\n`;\n\nconst PartialIconContainer = styled.div`\n height: 1px;\n min-width: 4px;\n display: flex;\n color: ${props => props.theme.Colors.white};\n`;\n\nconst HiddenCheckbox = styled.input`\n visibility: hidden;\n position: absolute;\n`;\n\nconst StyledCheckbox = styled.div<{\n color?: string;\n background?: string;\n size: number;\n checked?: boolean;\n disabled?: boolean;\n}>`\n cursor: pointer;\n height: ${props => props.size}px;\n width: ${props => props.size}px;\n border: ${({ disabled, checked }) => (disabled && checked ? 0 : 1)}px solid\n ${props =>\n props.disabled\n ? props.theme.Colors.lightBlueGray\n : props.checked\n ? props.background\n : props.theme.Colors.cloudyBlue};\n border-radius: 2px;\n background: ${props => props.background};\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n flex-shrink: 0;\n`;\n\nexport const Checkbox: FC<{\n checked: boolean;\n partial?: boolean;\n handleChange: (e: ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n label?: ReactElement | string;\n color?: string;\n background?: string;\n border?: string;\n size?: number;\n fontColor?: string;\n fontWeight?: string;\n fontSize?: number;\n className?: string;\n labelStyles?: CSSProperties;\n checkedBackground?: string;\n disabledCheckedBackground?: string;\n checkboxMarginLeft?: string;\n dataTest?: string;\n}> = ({\n checked,\n disabled,\n handleChange,\n label,\n background,\n border,\n size,\n partial,\n fontColor,\n fontWeight,\n fontSize,\n className,\n labelStyles,\n checkedBackground,\n disabledCheckedBackground,\n checkboxMarginLeft,\n dataTest,\n}) => {\n return (\n <StyledWrapper className={className} disabled={disabled}>\n <HiddenCheckbox\n type=\"checkbox\"\n checked={checked}\n onChange={e => {\n handleChange(e);\n }}\n data-test={\n dataTest\n && `${dataTest}${partial ? '-partially-checked' : (checked ? '-checked' : '')}`\n }\n />\n {label && (\n <StyledLabel\n color={fontColor}\n weight={fontWeight}\n size={fontSize}\n style={labelStyles}\n data-test={dataTest && `${dataTest}-label`}\n >\n {label}\n </StyledLabel>\n )}\n <StyledCheckbox\n size={size ? size : checkboxSize}\n checked={checked}\n background={\n checked\n ? partial\n ? border || COLORS.partial.checkedBackground\n : disabled\n ? (disabledCheckedBackground ?? COLORS.checkedBackground)\n : (checkedBackground ?? COLORS.checkedBackground)\n : background || COLORS.background\n }\n disabled={disabled}\n data-test={dataTest && `${dataTest}-view`}\n >\n {checked ? (\n partial ? (\n <PartialIconContainer>\n <Dash />\n </PartialIconContainer>\n ) : (\n <SelectedIconContainer\n size={size ? size / 2 : 7}\n marginLeft={checkboxMarginLeft}\n >\n <Checked />\n </SelectedIconContainer>\n )\n ) : (\n ''\n )}\n </StyledCheckbox>\n </StyledWrapper>\n );\n};\n\nexport default Checkbox;\n","import styled from 'styled-components';\n\nexport const Wrapper = styled.div<{\n withoutBorder?: boolean;\n}>`\n position: relative;\n padding: ${props => (props.withoutBorder ? `0px` : `28px 24px 24px 24px`)};\n border: solid ${props => (props.withoutBorder ? `0px` : `1px`)} ${props => props.theme.Colors.paleGrey}; \n border-radius: ${props => (props.withoutBorder ? `0px` : `4px`)};\n background-color: inherit;\n width: 100%;\n ${props =>\n props.withoutBorder &&\n `border-bottom: solid 1px ${props.theme.Colors.paleGrey};`}\n`;\n\nexport const Title = styled.span`\n font-size: 13px;\n font-weight: 500;\n position: absolute;\n top: -10px;\n left: 18px;\n z-index: 1;\n padding: 0 6px;\n font-weight: bold;\n background-color: inherit;\n color: ${props => props.theme.Colors.black};\n`;\n","import { FC, memo } from 'react';\n\nimport { Title, Wrapper } from './style';\nimport { FieldSetProps } from './type';\n\nconst Fieldset: FC<FieldSetProps> = ({\n children,\n title,\n withoutBorder,\n dataTest,\n}) => {\n return (\n <Wrapper withoutBorder={withoutBorder} data-test={dataTest}>\n {title && <Title data-test={`${dataTest}-title`}>{title}</Title>}\n {children}\n </Wrapper>\n );\n};\n\nexport default memo(Fieldset);","import { useSelector } from 'react-redux';\n\nimport { useWithLabelsContext } from './context/useWithLabelsContext';\nimport { LabelsState } from './reducer';\nimport { DEFAULT_LABELS_SCOPE } from './scopes';\n\nexport const useLabelsState = (): LabelsState => {\n const { reducerName, scope } = useWithLabelsContext();\n const appState = useSelector(state => state);\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithLabelsContext.Provider props'\n );\n }\n\n const labelsState: LabelsState | undefined =\n // @ts-ignore\n // TODO implement `_labels?: LabelsState` field into each reducer (create general type)\n // interface GeneralReducer {\n // _labels?: StateWithLabels;\n // _practisSets?: StateWithPractisSets;\n // }\n appState[reducerName]?._labels?.[scope || DEFAULT_LABELS_SCOPE];\n\n if (!labelsState) {\n throw new Error(\n `Wrap your reducer ${reducerName} via \"withLabelsReducer\" HOR`\n );\n }\n\n return labelsState;\n};\n","import { Label } from '../../../constants/interfaces/Label';\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { EditingLabels } from './states';\n\nexport enum ACTIONS {\n OPEN_LABEL_CREATION_PANEL = 'OPEN_LABEL_CREATION_PANEL',\n CLOSE_LABEL_CREATION_PANEL = 'CLOSE_LABEL_CREATION_PANEL',\n\n SET_EDITING_LABEL = 'ADDING_LABELS',\n SET_LABELS_SEARCH_TERM = 'SET_LABELS_SEARCH_TERM',\n\n TOGGLE_COLLAPSE_LABEL_FIELD = 'TOGGLE_COLLAPSE_LABEL_FIELD',\n EXPAND_LABEL_FIELD_BY_ID = 'EXPAND_LABEL_FIELD_BY_ID',\n\n COLLAPSE_ALL_LABELS = 'COLLAPSE_ALL_LABELS',\n EXPAND_ALL_LABELS = 'EXPAND_ALL_LABELS',\n EXPAND_MULTIPLE_LABELS = 'EXPAND_MULTIPLE_LABELS',\n\n COLLAPSE_ALL_TABLE_LABELS = 'COLLAPSE_ALL_TABLE_LABELS',\n\n SELECT_LABEL_FILTER = 'SELECT_LABEL_FILTER',\n SET_LABEL_FILTERS = 'SET_LABEL_FILTERS',\n CLEAR_LABEL_FILTERS = 'CLEAR_LABEL_FILTERS',\n\n SET_ASSIGN_LABELS = 'SET_ASSIGN_LABELS',\n CLEAR_ASSIGN_LABELS = 'CLEAR_ASSIGN_LABELS',\n TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD = 'TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD',\n\n SAVE_LABEL_FILTERS_START = 'SAVE_LABEL_FILTERS_START',\n SAVE_LABEL_FILTERS_SUCCESS = 'SAVE_LABEL_FILTERS_SUCCESS',\n SAVE_LABEL_FILTERS_FAILURE = 'SAVE_LABEL_FILTERS_FAILURE',\n\n SEARCH_LABELS_START = 'SEARCH_LABELS_START',\n SEARCH_LABELS_SUCCESS = 'SEARCH_LABELS_SUCCESS',\n SEARCH_LABELS_FAILURE = 'SEARCH_LABELS_FAILURE',\n\n FETCH_FULL_LABELS_LIST_START = 'FETCH_FULL_LABELS_LIST_START',\n FETCH_FULL_LABELS_LIST_SUCCESS = 'FETCH_FULL_LABELS_LIST_SUCCESS',\n FETCH_FULL_LABELS_LIST_FAILURE = 'FETCH_FULL_LABELS_LIST_FAILURE',\n\n UPDATE_LABEL_START = 'UPDATE_LABEL_START',\n UPDATE_LABEL_SUCCESS = 'UPDATE_LABEL_SUCCESS',\n UPDATE_LABEL_FAILURE = 'UPDATE_LABEL_FAILURE',\n\n MODIFY_LABEL_NAME = 'MODIFY_LABEL_NAME',\n\n SET_PREVIOUSLY_ASSIGNED_LABELS = 'SET_PREVIOUSLY_ASSIGNED_LABELS',\n}\n\nexport function selectLabelFilterAction(labelId: number) {\n return {\n type: ACTIONS.SELECT_LABEL_FILTER as ACTIONS.SELECT_LABEL_FILTER,\n labelId,\n };\n}\n\nexport function setPreviouslyAssignedLabels(labels: number[]) {\n return {\n type: ACTIONS.SET_PREVIOUSLY_ASSIGNED_LABELS as ACTIONS.SET_PREVIOUSLY_ASSIGNED_LABELS,\n labels,\n };\n}\n\nexport function setLabelFilterAction(labels: number[]) {\n return {\n type: ACTIONS.SET_LABEL_FILTERS as ACTIONS.SET_LABEL_FILTERS,\n labels,\n };\n}\n\nexport function clearLabelFilterAction() {\n return {\n type: ACTIONS.CLEAR_LABEL_FILTERS as ACTIONS.CLEAR_LABEL_FILTERS,\n };\n}\n\nexport function setAssignLabelsAction(labels: number[]) {\n return {\n type: ACTIONS.SET_ASSIGN_LABELS as ACTIONS.SET_ASSIGN_LABELS,\n labels,\n };\n}\n\nexport function clearAssignLabelsAction() {\n return {\n type: ACTIONS.CLEAR_ASSIGN_LABELS as ACTIONS.CLEAR_ASSIGN_LABELS,\n };\n}\n\nexport function saveLabelFiltersStart(filters: number[] | null) {\n return {\n type: ACTIONS.SAVE_LABEL_FILTERS_START as ACTIONS.SAVE_LABEL_FILTERS_START,\n filters,\n };\n}\n\nexport function saveLabelFiltersSuccess(filters: number[] | null) {\n return {\n type: ACTIONS.SAVE_LABEL_FILTERS_SUCCESS as ACTIONS.SAVE_LABEL_FILTERS_SUCCESS,\n filters,\n };\n}\n\nexport function saveLabelFiltersFailure(error: string) {\n return {\n type: ACTIONS.SAVE_LABEL_FILTERS_FAILURE as ACTIONS.SAVE_LABEL_FILTERS_FAILURE,\n error,\n };\n}\n\nexport function toggleCollapseLabelFieldAction(labelId: number) {\n return {\n type: ACTIONS.TOGGLE_COLLAPSE_LABEL_FIELD as ACTIONS.TOGGLE_COLLAPSE_LABEL_FIELD,\n labelId,\n };\n}\n\nexport function toggleCollapseAssignLabelFieldAction(labelId: number) {\n return {\n type: ACTIONS.TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD as ACTIONS.TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD,\n labelId,\n };\n}\n\nexport function expandLabelFieldByIdAction(labelId: number) {\n return {\n type: ACTIONS.EXPAND_LABEL_FIELD_BY_ID as ACTIONS.EXPAND_LABEL_FIELD_BY_ID,\n labelId,\n };\n}\n\nexport function collapseAllLabelsAction() {\n return {\n type: ACTIONS.COLLAPSE_ALL_LABELS as ACTIONS.COLLAPSE_ALL_LABELS,\n };\n}\n\nexport function collapseAllTableLabelsAction() {\n return {\n type: ACTIONS.COLLAPSE_ALL_TABLE_LABELS as ACTIONS.COLLAPSE_ALL_TABLE_LABELS,\n };\n}\n\nexport function expandAllLabelsAction() {\n return {\n type: ACTIONS.EXPAND_ALL_LABELS as ACTIONS.EXPAND_ALL_LABELS,\n };\n}\n\nexport function expandMultipleLabelsAction(labelIds: number[]) {\n return {\n type: ACTIONS.EXPAND_MULTIPLE_LABELS as ACTIONS.EXPAND_MULTIPLE_LABELS,\n labelIds,\n };\n}\n\nexport function modifyLabelNameAction(labelId: number, value: string) {\n return {\n type: ACTIONS.MODIFY_LABEL_NAME as ACTIONS.MODIFY_LABEL_NAME,\n labelId,\n value,\n };\n}\n\nexport function setEditingLabelAction(configs?: EditingLabels) {\n return {\n type: ACTIONS.SET_EDITING_LABEL as ACTIONS.SET_EDITING_LABEL,\n configs,\n };\n}\n\nexport function setLabelsSearchTerm(value: string) {\n return {\n type: ACTIONS.SET_LABELS_SEARCH_TERM as ACTIONS.SET_LABELS_SEARCH_TERM,\n value,\n };\n}\n\nexport function openLabelCreationPanelAction() {\n return {\n type: ACTIONS.OPEN_LABEL_CREATION_PANEL as ACTIONS.OPEN_LABEL_CREATION_PANEL,\n };\n}\n\nexport function closeLabelCreationPanelAction() {\n return {\n type: ACTIONS.CLOSE_LABEL_CREATION_PANEL as ACTIONS.CLOSE_LABEL_CREATION_PANEL,\n };\n}\n\nexport function searchLabelsStart() {\n return {\n type: ACTIONS.SEARCH_LABELS_START as ACTIONS.SEARCH_LABELS_START,\n };\n}\n\nexport function searchLabelsSuccess(\n data: PaginationResult<Label>,\n searchTerm?: boolean\n) {\n return {\n type: ACTIONS.SEARCH_LABELS_SUCCESS as ACTIONS.SEARCH_LABELS_SUCCESS,\n data,\n searchTerm,\n };\n}\n\nexport function searchLabelsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_LABELS_FAILURE as ACTIONS.SEARCH_LABELS_FAILURE,\n error,\n };\n}\n\nexport function fetchFullLabelsListStart() {\n return {\n type: ACTIONS.FETCH_FULL_LABELS_LIST_START as ACTIONS.FETCH_FULL_LABELS_LIST_START,\n };\n}\n\nexport function fetchFullLabelsListSuccess(data: PaginationResult<Label>) {\n return {\n type: ACTIONS.FETCH_FULL_LABELS_LIST_SUCCESS as ACTIONS.FETCH_FULL_LABELS_LIST_SUCCESS,\n data,\n };\n}\n\nexport function fetchFullLabelsListFailure(error: string) {\n return {\n type: ACTIONS.FETCH_FULL_LABELS_LIST_FAILURE as ACTIONS.FETCH_FULL_LABELS_LIST_FAILURE,\n error,\n };\n}\n\nexport function updateLabelStart() {\n return {\n type: ACTIONS.UPDATE_LABEL_START as ACTIONS.UPDATE_LABEL_START,\n };\n}\n\nexport function updateLabelSuccess(\n updatedLabel: Label,\n updateType: 'create' | 'update' | 'delete'\n) {\n return {\n type: ACTIONS.UPDATE_LABEL_SUCCESS as ACTIONS.UPDATE_LABEL_SUCCESS,\n updatedLabel,\n updateType,\n };\n}\n\nexport function updateLabelFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_LABEL_FAILURE as ACTIONS.UPDATE_LABEL_FAILURE,\n error,\n };\n}\n","import equal from 'deep-equal';\r\nimport { useCallback, useState } from 'react';\r\nimport { toggleItemInArray } from '../../helpers/functions/array-helpers';\r\nimport { escapeRegExp } from '../../helpers/functions/escape-reg-exp';\r\n\r\nexport interface SearchParams {\r\n searchTerm: string;\r\n companyId?: number;\r\n teamId?: string | number;\r\n teamIds?: number[];\r\n teamLeadIds?: number[];\r\n labelIDs?: number[];\r\n practisSetIDs?: number[];\r\n roleIDs?: number[];\r\n invitersIDs?: number[];\r\n filters?: { field: string; value: string | string[] | number | number[] | boolean }[];\r\n filterByStatus?: string[] | null;\r\n filterByRegistrationStatus?: string[] | null;\r\n completion?: string;\r\n filterByStatusValue?: string;\r\n practisSetId?: number;\r\n orderBy: {\r\n field?: string;\r\n asc?: boolean;\r\n } | null;\r\n limit?: number;\r\n offset: number;\r\n totalCount?: number;\r\n count?: number;\r\n numberOfPages: number;\r\n refreshRate?: number;\r\n startDate?: string;\r\n endDate?: string;\r\n scenarioIds?: number[];\r\n userId?: string | number;\r\n filterByDueDate?: string[] | null;\r\n customFilters?: object;\r\n}\r\n\r\nexport interface SearchQuery {\r\n searchTerm: string;\r\n}\r\n\r\nfunction ifChanged(\r\n prevSearchParams: SearchParams,\r\n newSearchParams: SearchParams\r\n) {\r\n return equal(prevSearchParams, newSearchParams)\r\n ? prevSearchParams\r\n : newSearchParams;\r\n}\r\n\r\nexport const ALL_FILTER_NAME = 'All';\r\nexport const ALL_FILTER_VALUE = '--all--';\r\n\r\nconst ENROLLMENT_OPTIONS = {\r\n [ALL_FILTER_VALUE]: ['ENROLLED', 'PENDING', 'COMPLETED', 'IN_PROGRESS'],\r\n PENDING: ['PENDING'],\r\n ENROLLED: ['ENROLLED'],\r\n COMPLETED: ['COMPLETED'],\r\n IN_PROGRESS: ['IN_PROGRESS'],\r\n};\r\n\r\nconst COMPLETION_OPTIONS = {\r\n [ALL_FILTER_VALUE]: '',\r\n Complete: 'Complete',\r\n Incomplete: 'Incomplete',\r\n};\r\n\r\nexport function useSearchParams(\r\n searchParams: SearchParams,\r\n setSearchParams: (value: (prevState: SearchParams) => SearchParams) => void\r\n) {\r\n const setSearchTerm = useCallback(\r\n (searchTerm: string) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n searchTerm,\r\n offset: 0,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setFilter = useCallback(\r\n (filter: {\r\n field: string;\r\n value: string | number | string[] | number[] | boolean;\r\n }) =>\r\n setSearchParams(prevSearchParams => {\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n filters: [\r\n ...(prevSearchParams.filters\r\n ? prevSearchParams.filters.filter(\r\n f => f.field !== filter.field\r\n )\r\n : []),\r\n ...(filter.value === ALL_FILTER_VALUE ? [] : [filter]),\r\n ].filter(\r\n filter =>\r\n !Array.isArray(filter.value) ||\r\n filter.value.length > 0\r\n ), // TODO: refactor and simplify this logic, remove ALL_FILTER_VALUE when no longer needed in other places\r\n offset: 0,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setOverrideFilter = useCallback(\r\n (filter: { field: string; value: string | number }) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n filters: [\r\n ...(filter.value === ALL_FILTER_VALUE ? [] : [filter]), //TODO: remove ALL_FILTER_VALUE when not needed\r\n ],\r\n offset: 0,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setMultipleFilter = useCallback(\r\n (filter: {\r\n field: string;\r\n value: string | number | string[] | number[] | boolean;\r\n }) => {\r\n setSearchParams(prevSearchParams => {\r\n const prevMatchedFieldFilters = JSON.parse(\r\n JSON.stringify(\r\n prevSearchParams.filters\r\n ? prevSearchParams.filters.filter(\r\n f => f.field === filter.field\r\n )\r\n : []\r\n )\r\n );\r\n\r\n const newMatchedFieldValues =\r\n prevMatchedFieldFilters && prevMatchedFieldFilters[0]\r\n ? prevMatchedFieldFilters[0]['value']\r\n : [];\r\n\r\n const newFilters = {\r\n field: filter.field,\r\n value: toggleItemInArray(\r\n newMatchedFieldValues,\r\n filter.value\r\n ),\r\n };\r\n\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n filters: [\r\n ...(prevSearchParams.filters\r\n ? prevSearchParams.filters.filter(\r\n f => f.field !== filter.field\r\n )\r\n : []),\r\n ...(newFilters.value.length > 0 ? [newFilters] : []),\r\n ],\r\n offset: 0,\r\n });\r\n });\r\n },\r\n [setSearchParams]\r\n );\r\n\r\n const setFilterByStatus = useCallback(\r\n (filterByStatus: 'ENROLLED' | 'PENDING' | typeof ALL_FILTER_VALUE) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n filterByStatus: ENROLLMENT_OPTIONS[filterByStatus],\r\n filterByStatusValue: filterByStatus,\r\n offset: 0,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setCompletion = useCallback(\r\n (\r\n completionStatus:\r\n | 'Complete'\r\n | 'Incomplete'\r\n | typeof ALL_FILTER_VALUE\r\n ) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n completion:\r\n completionStatus === ALL_FILTER_VALUE\r\n ? ''\r\n : COMPLETION_OPTIONS[completionStatus],\r\n offset: 0,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setOrderBy = useCallback(\r\n (field: string) =>\r\n setSearchParams(prevSearchParams => {\r\n const prevOrderBy = prevSearchParams.orderBy;\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n orderBy: prevOrderBy\r\n ? {\r\n ...prevOrderBy,\r\n field,\r\n asc:\r\n field === prevOrderBy.field\r\n ? !prevOrderBy.asc\r\n : true,\r\n }\r\n : {\r\n field,\r\n asc: true,\r\n },\r\n offset: 0,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setLabelIDs = useCallback(\r\n (labels: number[]) =>\r\n setSearchParams(prevSearchParams => {\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n labelIDs: labels,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setPractisSetIDs = useCallback(\r\n (practisSets: number[]) =>\r\n setSearchParams(prevSearchParams => {\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n practisSetIDs: practisSets,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setRoleIDs = useCallback(\r\n (roles: number[]) =>\r\n setSearchParams(prevSearchParams => {\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n roleIDs: roles,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setTeamIDs = useCallback(\r\n (teams: number[]) =>\r\n setSearchParams(prevSearchParams => {\r\n return ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n teamIds: teams,\r\n });\r\n }),\r\n [setSearchParams]\r\n );\r\n\r\n const setLimit = useCallback(\r\n (limit: number) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n limit,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setOffset = useCallback(\r\n (offset: number) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n offset,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const setCustom = useCallback(\r\n (name: keyof SearchParams, value: any) =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, {\r\n ...prevSearchParams,\r\n [name]: value,\r\n offset: 0,\r\n })\r\n ),\r\n [setSearchParams]\r\n );\r\n\r\n const getFilterByValue = useCallback(\r\n (field?: string) => {\r\n if (\r\n searchParams &&\r\n searchParams.filters &&\r\n searchParams.filters.length\r\n ) {\r\n if (!field) {\r\n return (\r\n searchParams.filters[0] && searchParams.filters[0].value\r\n );\r\n }\r\n\r\n const filterValue = searchParams.filters.filter(\r\n filter => field === filter.field\r\n )[0];\r\n\r\n return !!filterValue ? filterValue.value : null;\r\n }\r\n return;\r\n },\r\n [searchParams]\r\n );\r\n\r\n const getCompletionValue = useCallback(() => {\r\n return searchParams.completion;\r\n }, [searchParams]);\r\n\r\n const refreshSearchParams = useCallback(\r\n () =>\r\n setSearchParams(prevSearchParams => ({\r\n ...prevSearchParams,\r\n offset: 0,\r\n refreshRate: Math.random(),\r\n })),\r\n [setSearchParams]\r\n );\r\n\r\n const applyLocalSearch = useCallback(\r\n <T extends { [key: string]: any }>(fields: string[], data: T[]) => {\r\n if (searchParams.searchTerm.length < 1) return data;\r\n return data.filter((item: { [key: string]: number | string }) => {\r\n if (fields.includes('firstName') && fields.includes('lastName')) {\r\n return (\r\n item['firstName'] && item['lastName'] &&\r\n new RegExp(\r\n escapeRegExp(\r\n searchParams.searchTerm\r\n ).trim().toLowerCase()\r\n ).test(`${item['firstName']} ${item['lastName']}`.trim().toLowerCase())\r\n );\r\n }\r\n \r\n return fields\r\n .map((field: string) => {\r\n return (\r\n item[field] &&\r\n new RegExp(\r\n escapeRegExp(\r\n searchParams.searchTerm\r\n ).toLowerCase()\r\n ).test(item[field].toString().toLowerCase())\r\n );\r\n })\r\n .reduce((a, b) => a || b);\r\n });\r\n },\r\n [searchParams.searchTerm]\r\n );\r\n\r\n const applyLocalFiltering = useCallback(\r\n <T extends { [key: string]: any }>(\r\n fields: ('practisSetIDs' | 'labelIDs' | 'roleIDs')[],\r\n data: T[],\r\n statusFilter?: any[] | null,\r\n filterLength?: number | null,\r\n labelFilterLength?: number | null\r\n ) => { \r\n let filteredData: T[] = data;\r\n for (let field of fields) {\r\n const filterParam =\r\n (searchParams[field] && searchParams[field]) || []; \r\n if (field === 'roleIDs') {\r\n if (filterParam.length > 0) {\r\n filteredData = filteredData.filter(item => {\r\n return (\r\n item.roleId && filterParam.includes(item.roleId)\r\n );\r\n });\r\n }\r\n } else {\r\n if (filterParam.length > 0) {\r\n filteredData = filteredData.filter(item => {\r\n return filterParam.some(id => {\r\n return (\r\n item[field] && item[field].indexOf(id) >= 0\r\n );\r\n });\r\n });\r\n }\r\n }\r\n\r\n if(statusFilter && filterLength){\r\n if(labelFilterLength){\r\n filteredData = filteredData.filter(item => {\r\n return filterParam.some(id => {\r\n return (\r\n item[field] && item[field].indexOf(id) >= 0\r\n );\r\n });\r\n }).filter(item => statusFilter!.includes(item.status))\r\n } else {\r\n filteredData = filteredData.filter(item => statusFilter.includes(item.status))\r\n }\r\n } else if (!filterLength){\r\n // filteredData = data;\r\n }\r\n\r\n }\r\n\r\n \r\n return filteredData;\r\n },\r\n [searchParams]\r\n );\r\n\r\n type sortFieldValues<T extends string> = {\r\n [field in T]: string;\r\n };\r\n\r\n const applyLocalSorting = useCallback(\r\n <T extends { [key: string]: any }>(\r\n mapItems: sortFieldValues<string>,\r\n data: T[]\r\n ) => {\r\n let sortableItems = [...data];\r\n if (searchParams.orderBy && searchParams.orderBy.field) {\r\n const sortKey = searchParams.orderBy.field;\r\n const sortDirection = searchParams.orderBy.asc;\r\n\r\n sortableItems.sort((first, second) => {\r\n const a = first[mapItems[sortKey]];\r\n const b = second[mapItems[sortKey]];\r\n\r\n if (a !== Boolean(a)) {\r\n if (a === b) {\r\n return 0;\r\n } else if (!a) {\r\n return 1;\r\n } else if (!b) {\r\n return -1;\r\n }\r\n }\r\n\r\n if (sortDirection) {\r\n return a < b ? -1 : 1;\r\n } else {\r\n return a < b ? 1 : -1;\r\n }\r\n });\r\n }\r\n return sortableItems;\r\n },\r\n [searchParams.orderBy]\r\n );\r\n\r\n return {\r\n searchParams,\r\n setSearchTerm,\r\n setFilter,\r\n setOverrideFilter,\r\n setMultipleFilter,\r\n setFilterByStatus,\r\n setCompletion,\r\n setOrderBy,\r\n setLabelIDs,\r\n setPractisSetIDs,\r\n setRoleIDs,\r\n setTeamIDs,\r\n setLimit,\r\n setOffset,\r\n setCustom,\r\n refreshSearchParams,\r\n getFilterByValue,\r\n getCompletionValue,\r\n applyLocalSearch,\r\n applyLocalFiltering,\r\n applyLocalSorting,\r\n };\r\n}\r\n\r\nexport function useSearchParamsState(initialSearchParams: SearchParams) {\r\n const [searchParams, setSearchParams] = useState(initialSearchParams);\r\n\r\n const setInitial = useCallback(\r\n () =>\r\n setSearchParams(prevSearchParams =>\r\n ifChanged(prevSearchParams, initialSearchParams)\r\n ),\r\n [setSearchParams, initialSearchParams]\r\n );\r\n\r\n return {\r\n ...useSearchParams(searchParams, setSearchParams),\r\n setInitial,\r\n };\r\n}\r\n","import {\n ACTIONS,\n COMPANY_INFO,\n COMPANY_INFO_FAILURE,\n COMPANY_INFO_SUCCESS,\n loadVoiceSettingsFailure,\n loadVoiceSettingsStart,\n loadVoiceSettingsSuccess,\n RESET_COMPANY_INFORMATION,\n fetchCompanyAdminsStart,\n fetchCompanyAdminsSuccess,\n fetchCompanyAdminsFailure,\n fetchCompanyUserStatsStart,\n fetchCompanyUserStatsSuccess,\n fetchCompanyUserStatsFailure,\n clearCompanyAdmins,\n} from './actions';\nimport { AppState } from '../../../store/reducers';\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\nimport { Reducer } from 'redux';\nimport {\n CompanyVoiceSettingsState,\n CompanyAdminsState,\n CompanyUserStatsState,\n} from './states';\n\nexport interface CompanyProfileInterface {\n info: CompanyInterface;\n isLoading?: boolean;\n error?: string;\n}\n\nconst initialState: any = {\n info: {},\n isLoading: false,\n error: '',\n};\n\nconst companyProfileReducer = (state = initialState, action: any) => {\n switch (action.type) {\n case COMPANY_INFO:\n return {\n ...state,\n isLoading: true,\n error: null,\n };\n case COMPANY_INFO_SUCCESS:\n return {\n info: {\n ...action.data,\n },\n isLoading: false,\n error: null,\n };\n case COMPANY_INFO_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error,\n };\n case RESET_COMPANY_INFORMATION:\n return {\n ...initialState,\n };\n default:\n return state;\n }\n};\n\nexport const getCompanyState = (state: AppState) => state.company.info;\nexport const getCompanyLoading = (state: AppState) => state.company.isLoading;\nexport const getCompanyError = (state: AppState) => state.company.error;\n\nexport default companyProfileReducer;\n\nconst initialCompanyVoiceSettingsState: CompanyVoiceSettingsState = {\n data: [],\n loading: false,\n};\n\nexport type CompanyVoiceSettingsAction =\n | ReturnType<typeof loadVoiceSettingsStart>\n | ReturnType<typeof loadVoiceSettingsSuccess>\n | ReturnType<typeof loadVoiceSettingsFailure>;\n\nexport const companyVoiceSettingsReducer: Reducer<\n CompanyVoiceSettingsState,\n CompanyVoiceSettingsAction\n> = (\n state = initialCompanyVoiceSettingsState,\n action: CompanyVoiceSettingsAction\n): CompanyVoiceSettingsState => {\n switch (action.type) {\n case ACTIONS.LOAD_VOICE_SETTINGS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.LOAD_VOICE_SETTINGS_SUCCESS:\n return {\n ...state,\n data: action.voiceSettings,\n loading: false,\n error: '',\n };\n case ACTIONS.LOAD_VOICE_SETTINGS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n default:\n return state;\n }\n};\n\nconst initialCompanyAdminsState: CompanyAdminsState = {\n data: undefined,\n loading: false,\n error: ''\n};\n\nexport type companyAdminsAction =\n | ReturnType<typeof fetchCompanyAdminsStart>\n | ReturnType<typeof fetchCompanyAdminsSuccess>\n | ReturnType<typeof fetchCompanyAdminsFailure>\n | ReturnType<typeof clearCompanyAdmins>;\n\nexport const companyAdminsReducer: Reducer<\n CompanyAdminsState,\n companyAdminsAction\n> = (\n state = initialCompanyAdminsState,\n action: companyAdminsAction\n): CompanyAdminsState => {\n switch (action.type) {\n case ACTIONS.FETCH_COMPANY_ADMINS_START:\n return {\n ...state,\n loading: true\n };\n case ACTIONS.FETCH_COMPANY_ADMINS_SUCCESS:\n return {\n ...state,\n data: action.data,\n loading: false,\n error: ''\n };\n case ACTIONS.FETCH_COMPANY_ADMINS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error\n };\n case ACTIONS.CLEAR_COMPANY_ADMINS:\n return initialCompanyAdminsState;\n default:\n return state;\n }\n};\n\nconst initialCompanyUserStatsState: CompanyUserStatsState = {\n data: undefined,\n loading: false,\n error: ''\n};\n\nexport type companyUserStatsAction =\n | ReturnType<typeof fetchCompanyUserStatsStart>\n | ReturnType<typeof fetchCompanyUserStatsSuccess>\n | ReturnType<typeof fetchCompanyUserStatsFailure>;\n\nexport const companyUserStatsReducer: Reducer<\n CompanyUserStatsState,\n companyUserStatsAction\n> = (\n state = initialCompanyUserStatsState,\n action: companyUserStatsAction\n): CompanyUserStatsState => {\n switch (action.type) {\n case ACTIONS.FETCH_COMPANY_USER_STATS_START:\n return {\n ...state,\n loading: true\n };\n case ACTIONS.FETCH_COMPANY_USER_STATS_SUCCESS:\n return {\n ...state,\n data: action.data,\n loading: false,\n error: ''\n };\n case ACTIONS.FETCH_COMPANY_USER_STATS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error\n };\n default:\n return state;\n }\n};","class StorageClass {\n storage = localStorage;\n\n get(key: string) {\n return this.storage.getItem(key);\n }\n\n set(key: string, value: any) {\n return this.storage.setItem(key, value);\n }\n\n clear() {\n return this.storage.clear();\n }\n\n remove(key: string) {\n return this.storage.removeItem(key);\n }\n}\nconst Storage = new StorageClass();\nObject.freeze(Storage);\n\nexport default Storage;\n","import styled from 'styled-components';\n\nexport const Divider = styled.hr<{ height?: number; hide?: boolean; width?: string; }>`\n width: ${props => props.width ?? '100%'};\n height: ${props => (props.height ? props.height : 1)}px;\n border: none;\n margin: 0;\n flex-shrink: 0;\n background-color: ${props =>\n !props.hide ? props.theme.Colors.paleGrey : 'transparent'};\n`;\n","import { FC, memo } from 'react';\n\nimport { Divider } from './style';\nimport { TableDividerProps } from './type';\n\nconst TableDivider: FC<TableDividerProps> = memo(props => {\n const { height, hide, width} = props;\n\n return <Divider height={height} hide={hide} width={width} />;\n});\n\nexport default TableDivider;\n","import { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n fetchAllDrafts,\n fetchAllDraftsFailure,\n fetchAllDraftsSuccess,\n updateDraftsFailure,\n updateDraftsStart,\n updateDraftsSuccess,\n updateAllSelectedDraftState,\n updateSelectedDraftState,\n fetchCreatedByUsersFailure,\n fetchCreatedByUsersStart,\n fetchCreatedByUsersSuccess,\n fetchEditedByUsersFailure,\n fetchEditedByUsersStart,\n fetchEditedByUsersSuccess,\n} from '../actions';\nimport {\n useSearchStagingDraftsApi,\n useDeleteStagingApi,\n useSearchCreatedByUsersListApi,\n useSearchEditedByUsersListApi,\n} from '../../../../api';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { Draft } from '../../../../constants/interfaces/Draft';\n\nexport const useSearchDraftsService = () => {\n const dispatch = useDispatch();\n const searchStagingApi = useSearchStagingDraftsApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p?: SearchParams) => {\n dispatch(fetchAllDrafts());\n searchStagingApi(p)\n .then(data => {\n dispatch(fetchAllDraftsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchAllDraftsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchStagingApi, showMessage]\n );\n};\n\nexport const useDeleteStagingService = () => {\n const dispatch = useDispatch();\n const deleteStagingApi = useDeleteStagingApi();\n const showMessage = useShowMessage();\n return useCallback(\n (stagingIds: number[], search?: SearchParams, selectAll?: boolean, successCallback?: () => void) => {\n dispatch(updateDraftsStart());\n return deleteStagingApi(stagingIds, search, selectAll)\n .then(data => {\n dispatch(\n updateDraftsSuccess(\n { id: stagingIds.reduce((a, b) => a + b) } as Draft,\n 'delete'\n )\n );\n showMessage(\n `${\n stagingIds.length > 1\n ? 'Invitation drafts has been deleted'\n : 'Invitation draft has been deleted'\n }`,\n 'success'\n );\n\n successCallback?.();\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(updateDraftsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, deleteStagingApi, showMessage]\n );\n};\n\nexport const useUpdateAllSelectedDraftStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (draftIds: number[], checked: boolean, partial?: boolean) => {\n dispatch(updateAllSelectedDraftState(draftIds, checked, partial));\n },\n [dispatch]\n );\n};\n\nexport const useUpdateSelectedDraftStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (draftId: number) => {\n dispatch(updateSelectedDraftState(draftId));\n },\n [dispatch]\n );\n};\n\nexport const useSearchCreatedByUsersService = () => {\n const dispatch = useDispatch();\n const searchCreatedByUsersListApi = useSearchCreatedByUsersListApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p: Partial<SearchParams>) => {\n dispatch(fetchCreatedByUsersStart());\n searchCreatedByUsersListApi(p)\n .then(data => {\n dispatch(fetchCreatedByUsersSuccess(data.createdByUsers));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchCreatedByUsersFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchCreatedByUsersListApi, showMessage]\n );\n};\n\nexport const useSearchEditedByUsersService = () => {\n const dispatch = useDispatch();\n const searchEditedByUsersListApi = useSearchEditedByUsersListApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p: SearchParams) => {\n dispatch(fetchEditedByUsersStart());\n searchEditedByUsersListApi(p)\n .then(data => {\n dispatch(fetchEditedByUsersSuccess(data.lastEditedBy));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchEditedByUsersFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchEditedByUsersListApi, showMessage]\n );\n};","import { SearchParams } from '../../../../constants/interfaces/filters';\nimport { UserV2 } from '../../../../constants/interfaces/User';\nimport {\n searchInvitationsFailure,\n searchInvitationsStart,\n searchInvitationsSuccess,\n updateAllSelectedInvitationsState,\n updateInvitationFailure,\n updateInvitationStart,\n updateInvitationSuccess,\n updateSelectedInvitationState,\n} from '../actions';\nimport { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useResendInvitationApi,\n useSearchUsersApi,\n useRevokePendingUsers,\n} from '../../../../api';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\nimport { UserRoles } from '../../../../pages/ActionPages/NewUser/tools';\nimport { copyTextToClipboard } from '../../../../helpers/functions/copy-to-clipboard';\nimport { setSearchState } from '../../../searchState/store/actions';\nimport { SEARCH_STATE } from '../../../searchState/constants';\nimport { buildRegistrationUrl } from '../../../../helpers/functions/url-helpers';\nimport { \n InviteTextParams,\n buildUserInviteText,\n buildAdminInviteText\n} from '../../../../helpers/functions/invitation-templates';\nimport { SearchUsersParams } from '../../../../api/users/types';\nimport { getSearchSortingValue } from '../../../../helpers/functions/search-params-helpers';\nimport { UserStatus } from '../costants';\n\nexport const useSearchInvitationsService = () => {\n const dispatch = useDispatch();\n const searchUsersApi = useSearchUsersApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p: SearchParams, companyId: number, shouldSetStore = true) => {\n shouldSetStore && dispatch(searchInvitationsStart());\n\n const params: SearchUsersParams = {\n status: UserStatus.PENDING,\n roles: p.roleIDs?.join(','),\n labels: p.labelIDs?.join(','),\n invitedBy: p.invitersIDs?.join(','),\n companies: companyId.toString(),\n limit: p.limit ?? 20,\n offset: p.offset ?? 0,\n query: p.searchTerm,\n sort: getSearchSortingValue(p.orderBy, 'name', true),\n };\n return searchUsersApi(params)\n .then(data => {\n if (shouldSetStore) {\n dispatch(\n setSearchState(\n SEARCH_STATE.PENDING_USERS.name,\n SEARCH_STATE.PENDING_USERS.childrenKeys,\n p\n )\n );\n dispatch(searchInvitationsSuccess(data));\n }\n return data.items;\n })\n .catch((error: ErrorResult) => {\n if (shouldSetStore) {\n dispatch(searchInvitationsFailure(error.message));\n showMessage(error.message, 'error');\n }\n });\n },\n [dispatch, searchUsersApi, showMessage]\n );\n};\n\nexport const useResendInvitationService = () => {\n const dispatch = useDispatch();\n const resendInvitationApi = useResendInvitationApi();\n const showMessage = useShowMessage();\n return useCallback(\n (invitationIds: number[], isRowResend?: boolean, search?: SearchParams, selectAll?: boolean) => {\n dispatch(updateInvitationStart());\n resendInvitationApi(invitationIds)\n .then((response: any) => {\n const error = Object.values(response).find(\n (item: any) => item?.error\n );\n if (invitationIds.length === 1 && error) {\n throw (error as any).error;\n }\n let message = '';\n\n if (isRowResend) {\n message = 'Invite has been sent';\n } else {\n message =\n invitationIds.length > 1\n ? `${\n selectAll\n ? search?.limit\n : invitationIds.length\n } Invites have been sent`\n : '1 Invite has been sent';\n }\n showMessage(message, 'success');\n dispatch(\n updateInvitationSuccess(\n { id: invitationIds[0] },\n 'update'\n )\n );\n })\n .catch((error: ErrorResult) => {\n dispatch(updateInvitationFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, resendInvitationApi, showMessage]\n );\n};\n\n/**\n * @function useCopyInviteTextService - copies user/admin invite text to a clipboard\n * @param { UserV2 } invitation\n * @param { CompanyInterface } company\n * @returns { void }\n */\nexport const useCopyInviteTextService = () => {\n const showMessage = useShowMessage();\n return useCallback(\n (invitation: UserV2, company: CompanyInterface) => {\n if (!invitation.invitationCode || !company.name) {\n showMessage('Invalid invitation data', 'error');\n return;\n }\n const inviteTextParams: InviteTextParams = {\n name: invitation.firstName,\n inviter: invitation.invitedBy\n ? `${invitation.invitedBy.firstName} ${invitation.invitedBy.lastName}`\n : 'Someone',\n companyName: company.name,\n registrationUrl: buildRegistrationUrl(invitation.invitationCode),\n };\n const inviteText: string = invitation.role?.name === UserRoles.USER\n ? buildUserInviteText(inviteTextParams)\n : buildAdminInviteText(inviteTextParams);\n const copy: 'silent' | boolean = copyTextToClipboard(inviteText);\n\n if (copy !== 'silent') {\n if (copy) {\n showMessage(\n 'Invite text has been copied',\n 'success'\n );\n } else {\n showMessage('Could not copy to clipboard', 'error');\n }\n }\n },\n [showMessage]\n );\n};\n\nexport const useRevokeInvitationService = () => {\n const dispatch = useDispatch();\n const revokeInvitationApi = useRevokePendingUsers();\n const showMessage = useShowMessage();\n return useCallback(\n (invitationIds: number[], successCallback?: () => void) => {\n dispatch(updateInvitationStart());\n revokeInvitationApi(invitationIds)\n .then(() => {\n successCallback?.();\n })\n .catch((error: ErrorResult) => {\n dispatch(updateInvitationFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, revokeInvitationApi, showMessage]\n );\n};\n\nexport const useUpdateAllSelectedInvitationsStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (invitationIds: number[], checked: boolean, partial?: boolean) => {\n dispatch(\n updateAllSelectedInvitationsState(\n invitationIds,\n checked,\n partial\n )\n );\n },\n [dispatch]\n );\n};\n\nexport const useUpdateSelectedInvitationStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (invitationId: number) => {\n dispatch(updateSelectedInvitationState(invitationId));\n },\n [dispatch]\n );\n};","export interface InviteTextParams {\n name: string;\n inviter: string;\n companyName: string;\n registrationUrl: string;\n}\n\n/**\n * @function buildUserInviteText - builds invite text of regular user\n * @param { InviteTextParams } params\n * @returns { string }\n */\nexport const buildUserInviteText = (params: InviteTextParams): string => `\nHi ${ params.name }\n \n${ params.inviter } at ${ params.companyName } invited you to join the Practis learning platform.\n \nJoin Now: ${ params.registrationUrl }\n \nNeed help? Watch the Registration & App Tutorial: https://vimeo.com/732000505/7f9448c420 or email support: support@gopractis.com.\n\nWhat is Practis?\nPractis is a role-playing app that prepares you for customer interactions by simulating a variety of real-world situations. Level up your communication skills and sales aptitude. We'll see you at the top!\n`;\n \n/**\n * @function buildAdminInviteText - builds invite text of admin user\n * @param { InviteTextParams } params\n * @returns { string }\n */\nexport const buildAdminInviteText = (params: InviteTextParams): string => `\nHi ${ params.name }\n \n${ params.inviter } at ${ params.companyName } invited you to join Practis as an Administrator. \n \nAs an Administrator, you will have full access to the Practis Admin Portal on the web, where learners, content, and training are managed. Note that the learners will only have access to the Practis mobile app, where all the training takes place.\n \nJoin Now: ${ params.registrationUrl }\n\nNeed help? Watch the Registration & App Tutorial: https://vimeo.com/732000505/7f9448c420 or email support: support@gopractis.com.\n \nWhat is Practis?\nPractis combines your company's \"best practice\" messaging with automated role-play and learning science to help customer-facing teams ramp up quickly, retain what they learn, and more consistently deliver results.\n`;","\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { UserInterface } from '../../../../constants/interfaces/User';\n\nimport {\n fetchAllUsers,\n fetchAllUsersFailure,\n fetchAllUsersSuccess,\n updateAllSelectedUsersState,\n updateInvitationSuccess,\n updateSelectedUserState,\n updateUserActionFailure,\n updateUserActionStart,\n updateUserActionSuccess,\n fetchPortablePractisSetsFailure,\n fetchPortablePractisSetsStart,\n fetchPortablePractisSetsSuccess,\n removeUserLabel,\n removePendingUserLabel,\n clearAllUsers,\n} from '../actions';\nimport { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useDeleteUserApi,\n useGetUserReportApi,\n useSearchUsersApi,\n useAssignTeamsToUserApi,\n useDeleteUserLabelsApi,\n useSearchUserEnrollmentsApi,\n} from '../../../../api';\nimport { setSearchState } from '../../../searchState/store/actions';\nimport { SEARCH_STATE } from '../../../searchState/constants';\nimport { SearchUsersParams, ReportUsersParams } from '../../../../api/users/types';\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { findAllChildIds } from '../../../../helpers/functions/tree-helpers';\nimport { getSearchSortingValue } from '../../../../helpers/functions/search-params-helpers';\nimport { UserStatus } from '../costants';\nimport { NudgeData } from '../../../../api/alert/types';\nimport { useNudgeUsersApi } from '../../../../api';\nimport { transformEnrollmentsToPractisSets } from '../helpers';\n\nexport const useSearchUsersService = () => {\n const dispatch = useDispatch();\n const searchUsersApi = useSearchUsersApi();\n const showMessage = useShowMessage();\n return useCallback(\n (\n p: SearchParams,\n userStatuses?: (keyof typeof UserStatus)[],\n companyId?: number,\n shouldSetStore = true\n ) => {\n shouldSetStore && dispatch(fetchAllUsers());\n const params: SearchUsersParams = {\n status: userStatuses?.join(',') || UserStatus.ACTIVE,\n roles: p.roleIDs?.join(','),\n teams: p.teamIds?.join(','),\n labels: p.labelIDs?.join(','),\n companies: companyId ? companyId.toString() : '',\n limit: p.limit ?? 20,\n offset: p.offset ?? 0,\n query: p.searchTerm,\n sort: getSearchSortingValue(p.orderBy, 'name', true),\n };\n return searchUsersApi(params)\n .then(data => {\n if (shouldSetStore) {\n dispatch(\n setSearchState(\n SEARCH_STATE.ACTIVE_USERS.name,\n SEARCH_STATE.ACTIVE_USERS.childrenKeys,\n p\n )\n );\n dispatch(fetchAllUsersSuccess(data));\n }\n\n return data.items;\n })\n .catch((error: ErrorResult) => {\n if (shouldSetStore) {\n dispatch(fetchAllUsersFailure(error.message));\n showMessage(error.message, 'error');\n }\n });\n },\n [dispatch, searchUsersApi, showMessage]\n );\n};\n\nexport const useClearAllUsersService = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(clearAllUsers());\n }, [dispatch]);\n};\n\nexport const useDeleteUserService = () => {\n const dispatch = useDispatch();\n const deleteUserApi = useDeleteUserApi();\n const showMessage = useShowMessage();\n return useCallback(\n (userIds: number[], search?: SearchParams, selectAll?: boolean, successCallback?: () => void) => {\n dispatch(updateUserActionStart());\n return deleteUserApi(userIds)\n .then(data => {\n dispatch(\n updateUserActionSuccess(\n { id: Math.random() } as UserInterface,\n 'delete'\n )\n );\n \n showMessage(\n `${\n userIds.length > 1\n ? `${selectAll ? search?.limit : userIds.length} Users have been deactivated`\n : '1 User has been deactivated'\n }`,\n 'success'\n );\n\n successCallback?.();\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(updateUserActionFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, deleteUserApi, showMessage]\n );\n};\n\nexport const usePractisSetsEnrollmentsService = (userId: string) => {\n const dispatch = useDispatch();\n const searchUserPractisSetsApi = useSearchUserEnrollmentsApi();\n const showMessage = useShowMessage();\n return useCallback(\n (successCallback?: () => void) => {\n dispatch(fetchPortablePractisSetsStart());\n searchUserPractisSetsApi(userId)\n .then(data => {\n const practisSets = transformEnrollmentsToPractisSets(data);\n dispatch(fetchPortablePractisSetsSuccess(practisSets));\n successCallback?.();\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchPortablePractisSetsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchUserPractisSetsApi, showMessage, userId]\n );\n};\n\nexport const useAssignTeamsToUsersService = () => {\n const dispatch = useDispatch();\n const assignTeamsApi = useAssignTeamsToUserApi();\n const showMessage = useShowMessage();\n return useCallback(\n (\n userId: number,\n teams: number[],\n deleted: number[],\n hideMessage = false,\n successCallback?: () => void\n ) => {\n assignTeamsApi(userId, teams, deleted)\n .then(() => {\n dispatch(\n updateUserActionSuccess(\n { id: userId } as UserInterface,\n 'update'\n )\n );\n\n if (!hideMessage) {\n showMessage('Changes have been saved', 'success');\n }\n\n successCallback?.();\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [showMessage, assignTeamsApi, dispatch]\n );\n};\n\nexport const useNudgeTraineesService = () => {\n const nudgeTraineesApi = useNudgeUsersApi();\n const showMessage = useShowMessage();\n return useCallback(\n (nudgeUserData: NudgeData[], successCallback?: () => void) => {\n nudgeTraineesApi(nudgeUserData)\n .then(() => {\n const numberOfUsers = nudgeUserData.length;\n const message =\n numberOfUsers > 1\n ? `${numberOfUsers} Messages were sent successfully`\n : 'Message was sent successfully';\n\n showMessage(message, 'success');\n successCallback?.();\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [showMessage, nudgeTraineesApi]\n );\n};\n\nexport const useGetUsersReportService = () => {\n const getUserReportApi = useGetUserReportApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p: SearchParams, companyId: number, userIds?: number[], totalCount?: number) => {\n if (!userIds && !totalCount)\n throw new Error('Either select users or total count should be specified for report');\n const params: ReportUsersParams = {\n status: UserStatus.ACTIVE,\n roles: p.roleIDs?.join(','),\n teams: p.teamIds?.join(','),\n labels: p.labelIDs?.join(','),\n companies: companyId.toString(),\n users: userIds?.join(','),\n limit: userIds?.length ?? totalCount!,\n offset: 0,\n query: p.searchTerm,\n sort: getSearchSortingValue(p.orderBy, 'name', true)\n };\n return getUserReportApi(params)\n .then((data: any) => {\n const url = window.URL.createObjectURL(\n new Blob([data as any])\n );\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `report.csv`); //or any other extension\n document.body.appendChild(link);\n link.click();\n\n return data;\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [getUserReportApi, showMessage]\n );\n};\n\n/**\n * @description deletes user label including children labels\n * @function useDeleteUserLabelService\n * @param { number } userId\n * @param { number } labelId\n * @param { Function } successCallback\n * @returns { void }\n */\n export const useDeleteUserLabelService = (isPending: boolean = false) => {\n const deleteUserLabelsApi = useDeleteUserLabelsApi();\n const showMessage = useShowMessage();\n const labels = usePortableLabelsState();\n const dispatch = useDispatch();\n return useCallback(\n (userId: number, labelId: number, successCallback?: () => void) => {\n const payload: { userId: number; labelId: number }[] = [\n { userId, labelId },\n ];\n const children: any[] = [];\n findAllChildIds(labels.data.items, labelId, children);\n if (children.length > 0)\n children.forEach(item =>\n payload.push({ userId, labelId: item.id })\n );\n return deleteUserLabelsApi(payload)\n .then(() => {\n if (isPending) {\n dispatch(removePendingUserLabel(userId, labelId));\n dispatch(\n updateInvitationSuccess({ id: labelId }, 'labels')\n );\n } else {\n dispatch(removeUserLabel(userId, labelId));\n dispatch(\n updateUserActionSuccess({ id: labelId }, 'labels')\n );\n }\n\n successCallback?.();\n showMessage('Label removed successfully', 'success');\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [isPending, labels, showMessage, deleteUserLabelsApi, dispatch]\n );\n};\n\nexport const useUpdateAllSelectedUsersStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (userIds: number[], checked: boolean, partial?: boolean) => {\n dispatch(updateAllSelectedUsersState(userIds, checked, partial));\n },\n [dispatch]\n );\n};\n\nexport const useUpdateSelectedUserStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (userId: number) => {\n dispatch(updateSelectedUserState(userId));\n },\n [dispatch]\n );\n};","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { isEmpty } from 'lodash';\nimport dayjs from 'dayjs';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport {\n searchUserPractisSetsStart,\n searchUserPractisSetsFailure,\n searchUserPractisSetsSuccess,\n fetchUserAllPractisSetsSuccess,\n getUserPerformanceStart,\n getUserPerformanceSuccess,\n getUserPerformanceFailure,\n resetUserPerformanceAction,\n updateAllPractisSetsCheckedState,\n updateTraineeProfilePractisSetCheckedState,\n} from '../actions';\nimport { updateDraftUsersFailure } from '../../../../pages/ActionPages/NewUser/store/actions';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useSearchUserEnrollmentsApi,\n useDeleteEnrollmentsApi,\n useUserPerformanceApi,\n useAssignTeamsToUserApi,\n useEnrollPractisSetsToUserApi,\n useAssignLabelsApi,\n useCreateUpdateEnrollmentDueDate,\n useRemindToStartApi,\n} from '../../../../api';\nimport {\n transformEnrollmentsToPractisSets,\n getSearchUserPractisSetsParams\n} from '../helpers';\nimport { DATE_FORMAT } from '../../../../constants/interfaces/DueDates';\nimport { AssignFiltersToUserParams } from '../../types';\nimport { ENROLLMENT_REMIND_TO_START } from '../../../../api/alert/constants';\nimport { RemindToStartEnrollment } from '../../../../api/alert/types';\n\nexport const useSearchUserPractisSetsService = (userId: string) => {\n const dispatch = useDispatch();\n const searchUserPractisSetsApi = useSearchUserEnrollmentsApi();\n const showMessage = useShowMessage();\n return useCallback(\n (searchParams: SearchParams) => {\n if (userId) {\n const params = getSearchUserPractisSetsParams(searchParams);\n dispatch(searchUserPractisSetsStart());\n searchUserPractisSetsApi(userId, params)\n .then(data => {\n dispatch(searchUserPractisSetsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchUserPractisSetsFailure(error.message));\n showMessage(error.message, 'error');\n });\n }\n },\n [dispatch, searchUserPractisSetsApi, showMessage, userId]\n );\n};\n\nexport const useFetchUserAllPractisSets = () => {\n const dispatch = useDispatch();\n const fetchUserPractisSets = useSearchUserEnrollmentsApi();\n \n return useCallback(\n (userId: string) => {\n return fetchUserPractisSets(userId).then(data => {\n const practisSets = transformEnrollmentsToPractisSets(data);\n \n dispatch(fetchUserAllPractisSetsSuccess(practisSets));\n });\n },\n [dispatch, fetchUserPractisSets]\n );\n};\n\nexport const useUnEnrollPractisSetService = () => {\n const unenrollEnrollmentApi = useDeleteEnrollmentsApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n (unEnrolledPractisSetIds: number[]) => {\n return unenrollEnrollmentApi(unEnrolledPractisSetIds).then(() => {\n const message = unEnrolledPractisSetIds.length > 1 ? \n `${unEnrolledPractisSetIds.length} Practis Sets have been unassigned` : \n '1 Practis Set has been unassigned';\n showMessage(message, 'success');\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [unenrollEnrollmentApi, showMessage]\n );\n};\n\nexport const useUserPerformanceService = () => {\n const dispatch = useDispatch();\n const userPerformanceApi = useUserPerformanceApi();\n const showMessage = useShowMessage();\n return useCallback(\n (userId: number) => {\n dispatch(getUserPerformanceStart());\n return userPerformanceApi(userId, false)\n .then(data => {\n dispatch(getUserPerformanceSuccess(data));\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(getUserPerformanceFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, userPerformanceApi, showMessage]\n );\n};\n\nexport const useResetUserPerformanceService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetUserPerformanceAction());\n }, [dispatch]);\n};\n\nexport const useUpdateAllPractisSetsCheckedStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (practisSetIds: number[], checked: boolean, partial?: boolean) => {\n dispatch(\n updateAllPractisSetsCheckedState(\n practisSetIds,\n checked,\n partial\n )\n );\n },\n [dispatch]\n );\n};\n\nexport const useUpdateTraineeProfilePractisSetsCheckedStateService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (practisSetId: number) => {\n dispatch(updateTraineeProfilePractisSetCheckedState(practisSetId));\n },\n [dispatch]\n );\n};\n\nexport const useAssignFiltersToUserService = () => {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const assignTeamsToUserApi = useAssignTeamsToUserApi();\n const enrollPractisSets = useEnrollPractisSetsToUserApi();\n const unEnrollPractisSets = useDeleteEnrollmentsApi();\n const assignLabelsApi = useAssignLabelsApi();\n const updateEnrollmentsDueDate = useCreateUpdateEnrollmentDueDate();\n\n return useCallback(\n (\n userId: number,\n shouldAssignTeams: boolean,\n assignFilters: AssignFiltersToUserParams,\n search?: SearchParams\n ) => {\n return Promise.all([\n shouldAssignTeams &&\n assignTeamsToUserApi(\n userId,\n assignFilters.assignedTeamIDs,\n assignFilters.deletedTeamIDs\n ),\n\n !isEmpty(assignFilters?.assignedPractisSetIDs) &&\n enrollPractisSets(\n assignFilters?.assignedPractisSetIDs?.map(item => ({\n practisSetId: item.practisSetId,\n dueDate: item?.dueDate\n ? dayjs(item.dueDate).format(DATE_FORMAT)\n : null,\n userId\n })),\n ),\n\n !isEmpty(assignFilters?.deletedEnrollmentIds) &&\n unEnrollPractisSets(assignFilters.deletedEnrollmentIds),\n\n assignLabelsApi(\n assignFilters.assignedLabelsIDs,\n [userId],\n assignFilters.deletedLabelIDs,\n 'USER',\n undefined,\n search\n ),\n\n !isEmpty(assignFilters.updatedEnrollments) && updateEnrollmentsDueDate(\n assignFilters.updatedEnrollments\n )\n ])\n .then((datas: any[]) => {\n return datas;\n })\n .catch((error: ErrorResult) => {\n dispatch(updateDraftUsersFailure(error.message));\n showMessage(error.message, 'error');\n return error;\n });\n },\n [\n assignTeamsToUserApi,\n updateEnrollmentsDueDate,\n enrollPractisSets,\n unEnrollPractisSets,\n assignLabelsApi,\n dispatch,\n showMessage,\n ]\n );\n};\n\nexport const useRemindUsersService = () => {\n const remindUsersApi = useRemindToStartApi();\n const showMessage = useShowMessage();\n return useCallback(\n (enrollmentIds: number[]) => {\n const enrollments = enrollmentIds.map(\n enrollmentId =>\n ({\n enrollmentId,\n type: ENROLLMENT_REMIND_TO_START,\n } as RemindToStartEnrollment)\n );\n return remindUsersApi(enrollments)\n .then(() => {\n showMessage('Remind sent successfully!', 'success');\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n });\n },\n [remindUsersApi, showMessage]\n );\n};","import { getConfig } from '../tools/config';\r\nimport Storage from './Storage';\r\nimport { clearAuthData } from '../helpers/functions/auth-helpers';\r\n\r\nconst axios = require('axios');\r\n\r\nexport interface LoginInterface {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport class Http {\r\n static get(path: string, data?: any) {\r\n return this.request('get', path, data);\r\n }\r\n\r\n static getProtected(path: string, data?: any) {\r\n const token = Storage.get('token');\r\n return this.request('get', path, data, token);\r\n }\r\n\r\n static postProtected(path: string, data?: any) {\r\n const token = Storage.get('token') || Storage.get('temp_token');\r\n return this.request('post', path, data, token);\r\n }\r\n\r\n static deleteProtected(path: string, data?: any) {\r\n const token = Storage.get('token');\r\n return this.request('delete', path, data, token);\r\n }\r\n\r\n static post(path: string, data?: any, token?: boolean) {\r\n return this.request('post', path, data, token);\r\n }\r\n\r\n static put(path: string, data: any) {\r\n return this.request('put', path, data);\r\n }\r\n\r\n static putProtected(path: string, data?: any, useTempToken = false) {\r\n const token = useTempToken\r\n ? Storage.get('temp_token')\r\n : Storage.get('token');\r\n return this.request('put', path, data, token);\r\n }\r\n\r\n static request(method: string, path: string, data: any, token?: any) {\r\n return axios({\r\n method: method,\r\n url: `${getConfig().API_BASE_URL}${path}`,\r\n data: data,\r\n headers: this.generateHeaders(token),\r\n })\r\n .then((response: any) => {\r\n return response.data;\r\n })\r\n .catch((error: any) => {\r\n if (error.response) {\r\n let message = '';\r\n switch (error.response.status) {\r\n case 401:\r\n clearAuthData();\r\n message = error.response.data.message;\r\n break;\r\n case 400:\r\n case 403:\r\n case 404:\r\n case 500:\r\n message = error.response.data.message;\r\n break;\r\n default:\r\n message = 'Unexpected Error';\r\n }\r\n return {\r\n status: 'error',\r\n code: error.response.status,\r\n errorCode: error.response.data\r\n ? error.response.data.code\r\n : 0,\r\n message,\r\n details: error.response.data\r\n ? error.response.data.details\r\n : [],\r\n };\r\n } else if (error.request) {\r\n return {\r\n status: 'error',\r\n code: 504,\r\n message: 'Connection Error',\r\n };\r\n } else {\r\n return {\r\n status: 'error',\r\n code: error.response.status,\r\n message: 'Unexpected Error',\r\n };\r\n }\r\n });\r\n }\r\n\r\n static generateHeaders = (token?: any, customHeaders?: Object) => {\r\n let contentType = { 'Content-Type': 'application/json' };\r\n let Client = { Client: 'WEB' };\r\n let authorization = token ? { Authorization: 'JWT ' + token } : {};\r\n let additionalHeaders = customHeaders ? customHeaders : {};\r\n return {\r\n ...contentType,\r\n ...authorization,\r\n ...Client,\r\n ...additionalHeaders,\r\n };\r\n };\r\n}\r\n","import { UserV2, UserInterface } from '../../../../constants/interfaces/User';\nimport { Http } from '../../../../services/Http';\nimport {\n updateUserAction,\n updateUserFailure,\n updateUserSuccess,\n fetchUserAction,\n fetchUserFailure,\n fetchUserSuccess,\n fetchUserFeaturesStart,\n fetchUserFeaturesSuccess,\n fetchUserFeaturesFailure,\n fetchUserPreferencesStart,\n fetchUserPreferencesSuccess,\n fetchUserPreferencesFailure,\n updateUserPreferencesStart,\n updateUserPreferencesSuccess,\n updateUserPreferencesFailure,\n} from '../actions';\nimport { updateUserProfileSuccess } from '../../../../pages/UserProfile/store/actions';\nimport { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useGetUserFeaturesApi,\n useGetUserPreferencesApi,\n useUpdateUserPreferencesApi,\n useGetUserApi,\n} from '../../../../api';\nimport { USER_NOT_FOUND_ERROR_MESSAGE } from '../costants';\nimport { handleMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\n\nexport const useFetchUser = () => {\n const dispatch = useDispatch();\n const getUser = useGetUserApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n (id: number, successCallback?: (response: unknown) => void) => {\n dispatch(fetchUserAction());\n return getUser(id)\n .then((response: UserV2) => {\n dispatch(fetchUserSuccess(response));\n successCallback?.(response);\n return response;\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchUserFailure(error.message));\n if (error.code === 404) {\n showMessage(USER_NOT_FOUND_ERROR_MESSAGE, 'error');\n } else {\n showMessage(error.message, 'error');\n }\n });\n },\n [dispatch, getUser, showMessage]\n );\n};\n\nexport const updateUser = (\n data: UserInterface,\n userId: number,\n self?: boolean,\n successMessage?: string,\n successCallback?: () => void,\n): any => {\n return (dispatch: any) => {\n dispatch(updateUserAction());\n return Http.putProtected(\n `admin/users/${userId}`,\n data\n )\n .then((res: any) => {\n if (res.status === 'error') {\n throw res.message;\n }\n self\n ? dispatch(updateUserProfileSuccess(res))\n : dispatch(updateUserSuccess(res));\n handleMessage(\n dispatch,\n successMessage || 'Profile Updated!',\n 'success'\n );\n successCallback?.();\n return { status: 'success', data: res };\n })\n .catch((error: any) => {\n self\n ? updateUserFailure(error)\n : dispatch(updateUserFailure(error));\n handleMessage(dispatch, error, 'error');\n return { status: 'error', data: error };\n });\n };\n};\n\nexport const useGetUserFeaturesService = () => {\n const dispatch = useDispatch();\n const getUserFeaturesApi = useGetUserFeaturesApi();\n const showMessage = useShowMessage();\n return useCallback(\n (userId: number) => {\n dispatch(fetchUserFeaturesStart());\n return getUserFeaturesApi(userId)\n .then(data => {\n dispatch(fetchUserFeaturesSuccess(data));\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchUserFeaturesFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getUserFeaturesApi, showMessage]\n );\n};\n\n/**\n * @function useGetUserPreferencesService\n * @returns { CallableFunction }\n */\nexport const useGetUserPreferencesService = () => {\n const dispatch = useDispatch();\n const getUserPreferencesApi = useGetUserPreferencesApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { number } userId\n * @returns { Promise }\n */\n return useCallback(\n (userId: number) => {\n dispatch(fetchUserPreferencesStart());\n return getUserPreferencesApi(userId)\n .then(data => {\n dispatch(fetchUserPreferencesSuccess(data));\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchUserPreferencesFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getUserPreferencesApi, showMessage]\n );\n};\n\n/**\n * @function useUpdateUserPreferenceService\n * @returns { CallableFunction }\n */\nexport const useUpdateUserPreferenceService = () => {\n const dispatch = useDispatch();\n const updateUserPreferencesApi = useUpdateUserPreferencesApi()\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { number } userId\n * @param { string } key\n * @param { boolean } value\n * @param { Function } onSuccess\n * @returns { Promise }\n */\n return useCallback(\n (\n userId: number,\n key: string,\n value: boolean,\n onSuccess: () => void\n ) => {\n dispatch(updateUserPreferencesStart([{ key, value }]));\n return updateUserPreferencesApi(userId, { [key]: value })\n .then(() => {\n dispatch(updateUserPreferencesSuccess([key]));\n onSuccess();\n })\n .catch((error: ErrorResult) => {\n dispatch(updateUserPreferencesFailure([key]));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, updateUserPreferencesApi, showMessage]\n );\n};","import { PaginationResult, ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { UserInterface, UserV2 } from '../../../constants/interfaces/User';\r\nimport React, { useContext } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { PerformanceTrainee } from '../../../constants/interfaces/PerformanceTrainee';\r\nimport { PractisSets, EnrollmentPractisSet } from '../../../constants/interfaces/PractisSets';\r\nimport { Draft, DraftUser } from '../../../constants/interfaces/Draft';\r\nimport { StateWithLabels } from '../../portableLabels/store/hors/withLabels';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { selectItemsByIds } from '../../../tools/redux';\r\nimport { UserFeatures } from '../../../constants/interfaces/UserFeatures';\r\nimport { StateWithPractisSets } from '../../portablePractisSets/store/hors/withPractisSets';\r\nimport { EnrollmentInterface } from '../../../constants/interfaces/Enrollments';\r\nimport { UserPreference } from '../../../constants/interfaces/UserPreference';\r\n\r\n\r\nexport function useLoggedInUserProfileState() {\r\n return useSelector(getProfileState);\r\n}\r\n\r\nexport interface UsersState {\r\n list: ListResult<UserV2>;\r\n selectedUsers?: number[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport type UsersStateSelector = (state: any) => UsersState;\r\n\r\nexport const UsersStateSelectorContext = React.createContext<UsersStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUsersState(): UsersState {\r\n return useSelector(useContext(UsersStateSelectorContext));\r\n}\r\n\r\nexport interface UpdateUsersState {\r\n data?: UserInterface;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdateUsersStateStateSelector = (state: any) => UpdateUsersState;\r\n\r\nexport const UpdateUsersStateStateSelectorContext = React.createContext<UpdateUsersStateStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdateUsersState(): UpdateUsersState {\r\n return useSelector(useContext(UpdateUsersStateStateSelectorContext));\r\n}\r\n\r\nexport interface InvitationsState {\r\n data?: ListResult<UserV2>;\r\n selectedInvitations?: number[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport type InvitationsStateSelector = (state: any) => InvitationsState;\r\n\r\nexport const InvitationsStateSelectorContext = React.createContext<InvitationsStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function selectSelectedInvitations(state: InvitationsState): UserV2[] {\r\n return selectItemsByIds<UserV2>(state?.selectedInvitations, state?.data?.items);\r\n}\r\n\r\nexport function useInvitationsState(): InvitationsState {\r\n return useSelector(useContext(InvitationsStateSelectorContext));\r\n}\r\n\r\nexport interface UpdateInvitationState {\r\n data?: { id: number };\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdateInvitationStateStateSelector = (\r\n state: any\r\n) => UpdateInvitationState;\r\n\r\nexport const UpdateInvitationStateStateSelectorContext = React.createContext<UpdateInvitationStateStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdateInvitationsState(): UpdateInvitationState {\r\n return useSelector(useContext(UpdateInvitationStateStateSelectorContext));\r\n}\r\n\r\nexport interface DraftsState {\r\n data?: PaginationResult<Draft>;\r\n draftedUsers?: PaginationResult<DraftUser>;\r\n selectedDrafts?: number[];\r\n createdByUsers?: DraftUser[];\r\n editedByUsers?: DraftUser[];\r\n loading?: boolean;\r\n loadingCreatedBy: boolean,\r\n loadingEditedBy: boolean,\r\n error?: string;\r\n}\r\n\r\nexport type DraftsStateSelector = (state: any) => DraftsState;\r\n\r\nexport const DraftsStateSelectorContext = React.createContext<DraftsStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useDraftsState(): DraftsState {\r\n return useSelector(useContext(DraftsStateSelectorContext));\r\n}\r\n\r\nexport interface UpdatedDraftsState {\r\n data?: Draft;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdateDraftsStateStateSelector = (state: any) => UpdatedDraftsState;\r\n\r\nexport const UpdateDraftsStateStateSelectorContext = React.createContext<UpdateDraftsStateStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdatedDraftsState(): UpdatedDraftsState {\r\n return useSelector(useContext(UpdateDraftsStateStateSelectorContext));\r\n}\r\n\r\nexport type PerformanceState = {\r\n data?: PerformanceTrainee;\r\n practisSets?: ListResult<EnrollmentInterface>;\r\n selectedPractisSets?: number[];\r\n loading?: boolean;\r\n practisSetsLoading?: boolean;\r\n error?: string;\r\n portablePractisSets?: EnrollmentPractisSet[];\r\n portablePractisSetsLoading?: boolean;\r\n};\r\n\r\nexport type UserPerformanceState = PerformanceState & StateWithLabels & StateWithPractisSets;\r\n\r\nexport type UserPerformanceStateSelector = (state: any) => UserPerformanceState;\r\n\r\nexport const UserPerformanceStateSelectorContext = React.createContext<UserPerformanceStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUserPerformanceState(): UserPerformanceState {\r\n return useSelector(useContext(UserPerformanceStateSelectorContext));\r\n}\r\n\r\nexport interface UpdatedUserPractisSetsState {\r\n data?: PractisSets;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdatedUserPractisSetsStateSelector = (\r\n state: any\r\n) => UpdatedUserPractisSetsState;\r\n\r\nexport const UpdatedUserPractisSetsStateSelectorContext = React.createContext<UpdatedUserPractisSetsStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdatedUserPractisSetsState(): UpdatedUserPractisSetsState {\r\n return useSelector(useContext(UpdatedUserPractisSetsStateSelectorContext));\r\n}\r\n\r\nexport interface UserFeaturesState {\r\n data?: UserFeatures;\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport interface UserPreferencesState {\r\n data?: UserPreference[];\r\n pendingValues?: { key: string, value: unknown }[];\r\n loading: boolean;\r\n error?: string;\r\n}","import { DEFAULT_CHALLENGE_TRY_LIMIT } from '../../../challenges/constants';\nimport { GenerateChallengeData } from './types';\n\n// -------- PRACTIS_SET --------\nexport const ASSIGN_LABELS_TO_PRACTIS_SET_ACTION =\n 'ASSIGN_LABELS_TO_PRACTIS_SET_ACTION';\nexport const DELETE_LABELS_FROM_PRACTIS_SET_ACTION =\n 'DELETE_LABELS_FROM_PRACTIS_SET_ACTION';\nexport const GET_PRACTIS_SET_CONTENT_ACTION = 'GET_PRACTIS_SET_CONTENT_ACTION';\nexport const ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION =\n 'ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION';\nexport const UPDATE_PRACTIS_SET_STATUS_ACTION =\n 'UPDATE_PRACTIS_SET_STATUS_ACTION';\nexport const CREATE_PRACTIS_SET_ACTION = 'CREATE_PRACTIS_SET_ACTION';\nexport const UPDATE_PRACTIS_SET_ACTION = 'UPDATE_PRACTIS_SET_ACTION';\n\n// -------- SCENARIO --------\nexport const CREATE_SCENARIO_ACTION = 'CREATE_SCENARIO_ACTION';\nexport const UPDATE_SCENARIO_ACTION = 'UPDATE_SCENARIO_ACTION';\nexport const ASSIGN_LABELS_TO_SCENARIO_ACTION =\n 'ASSIGN_LABELS_TO_SCENARIO_ACTION';\nexport const DELETE_LABELS_FROM_SCENARIO_ACTION =\n 'DELETE_LABELS_FROM_SCENARIO_ACTION';\nexport const ASSIGN_LINES_TO_SCENARIO_ACTION =\n 'ASSIGN_LINES_TO_SCENARIO_ACTION';\nexport const UPDATE_SCENARIO_STATUS_ACTION = 'UPDATE_SCENARIO_STATUS_ACTION';\nexport const DELETE_LINES_FROM_SCENARIO_ACTION =\n 'DELETE_LINES_FROM_SCENARIO_ACTION';\n\n// -------- CHALLENGE --------\nexport const CREATE_CHALLENGE_ACTION = 'CREATE_CHALLENGE_ACTION';\nexport const UPDATE_CHALLENGE_ACTION = 'UPDATE_CHALLENGE_ACTION';\nexport const ASSIGN_LABELS_TO_CHALLENGE_ACTION =\n 'ASSIGN_LABELS_TO_CHALLENGE_ACTION';\nexport const DELETE_LABELS_FROM_CHALLENGE_ACTION =\n 'DELETE_LABELS_FROM_CHALLENGE_ACTION';\nexport const ASSIGN_LINES_TO_CHALLENGE_ACTION =\n 'ASSIGN_LINES_TO_CHALLENGE_ACTION';\nexport const UPDATE_CHALLENGE_STATUS_ACTION = 'UPDATE_CHALLENGE_STATUS_ACTION';\n\nexport const initialGenerateChallengeData: GenerateChallengeData = {\n title: '',\n description: '',\n sourceScenarioId: null,\n lines: [],\n labelIds: [],\n tryLimit: DEFAULT_CHALLENGE_TRY_LIMIT,\n};","import { UserInterface } from './User';\r\nimport { Scenario } from './Scenario';\r\nimport { Challenge } from './Challenge';\r\nimport { EnrollmentStatusEnum } from './Enrollments';\r\nimport { UserInfo } from './UserInfo';\r\n\r\nexport enum PractisSetStatuses {\r\n DRAFT = 'DRAFT',\r\n ACTIVE = 'ACTIVE',\r\n ARCHIVED = 'ARCHIVED',\r\n DELETED = 'DELETED',\r\n}\r\n\r\nexport type PractisSetContent = {\r\n id: number;\r\n uniqueId: string;\r\n type: PractisSetContentEntities;\r\n minRepsCount: number;\r\n position: number;\r\n cover?: {\r\n id: number;\r\n fileUrl: string;\r\n };\r\n challenge?: Challenge;\r\n scenario?: Scenario;\r\n};\r\n\r\n\r\nexport type PractisSetContentEntities = 'CHALLENGE' | 'SCENARIO';\r\nexport type PractisSetStatusType =\r\n | PractisSetStatuses.DRAFT\r\n | PractisSetStatuses.ACTIVE\r\n | PractisSetStatuses.ARCHIVED\r\n | PractisSetStatuses.DELETED;\r\n\r\nexport interface PractisSets {\r\n id?: number;\r\n name: string;\r\n description: string;\r\n updatedAt?: string;\r\n lastTraining?: string;\r\n lastTrainingAt?: string;\r\n createdAt?: string;\r\n enrolledAt?: string;\r\n creatorId?: number;\r\n summary?: string;\r\n totalEnrollmentCount?: number;\r\n acceptedEnrollmentCount?: number;\r\n pendingEnrollmentCount?: number;\r\n inProgressEnrollmentCount?: number;\r\n completedEnrollmentCount?: number;\r\n completionRate?: number;\r\n pacing?: {\r\n id: number;\r\n type: string;\r\n };\r\n scenarioCount: number;\r\n challengeCount: number;\r\n countOfScenarios?: number;\r\n countOfChallenges?: number;\r\n challengesWithSentSubmissionCount?: number;\r\n currentRepsCountTotal?: number;\r\n minRepsCountTotal?: number;\r\n passedScenarioCount?: number;\r\n displayStatus?: EnrollmentStatusEnum;\r\n totalDuration: number | null;\r\n dueDate?: string | null;\r\n status: PractisSetStatusType;\r\n enrollmentStatus?: 'PENDING' | 'ENROLLED' | 'COMPLETED' | '';\r\n progressValue?: number;\r\n creator?: UserInterface;\r\n contentList?: PractisSetContent[];\r\n content: PractisSetContent[];\r\n labels?: any[];\r\n updatedLabels?: number[];\r\n checked?: boolean;\r\n enrollmentId?: number;\r\n trainingStatus?: PractisSetStatusType;\r\n dailyTrainings?: number;\r\n monthlyTrainings?: number;\r\n averageAccuracy?: number;\r\n completedAt?: string;\r\n trainingTime?: number;\r\n minutesPerDay?: number;\r\n totalTimeInMinutes?: number;\r\n lastActivity?: any;\r\n hasOverdue?: boolean;\r\n}\r\n\r\nexport interface PractisSetV2 {\r\n id: number;\r\n name: string;\r\n description: string;\r\n status: string;\r\n companyId: number;\r\n scenarioCount: number;\r\n challengeCount: number;\r\n minRepsCountTotal: number;\r\n totalDuration: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n labels: number[];\r\n creator: UserInfo;\r\n cover: {\r\n id: number;\r\n fileUrl: string;\r\n };\r\n pacing: {\r\n id: number;\r\n type: string;\r\n };\r\n}\r\n\r\nexport interface EnrollmentPractisSet extends PractisSetV2 {\r\n enrollmentId: number;\r\n dueDate: string;\r\n}","export const REFRESH_TEAMS_LIST = 'REFRESH_TEAMS_LIST';\nexport const REFRESH_TEAM_MEMBERS = 'REFRESH_TEAM_MEMBERS';\nexport const REFRESH_TEAM_CONTROLLER = 'REFRESH_TEAM_CONTROLLER';\nexport const REFRESH_TRAINING_PAGE = 'REFRESH_TRAINING_PAGE';\nexport const REFRESH_PENDING_USERS_PAGE = 'REFRESH_PENDING_USERS_PAGE';\nexport const CLEAR_PAGING = 'CLEAR_PAGING';\n\nexport enum EventNameList {\n REFRESH_TEAMS_LIST = 'REFRESH_TEAMS_LIST',\n REFRESH_TEAM_CONTROLLER = 'REFRESH_TEAM_CONTROLLER',\n REFRESH_TEAM_MEMBERS = 'REFRESH_TEAM_MEMBERS',\n REFRESH_TRAINING_PAGE = 'REFRESH_TRAINING_PAGE',\n REFRESH_PENDING_USERS_PAGE = 'REFRESH_PENDING_USERS_PAGE',\n CLEAR_PAGING = 'CLEAR_PAGING',\n}","import { isEmpty } from 'lodash';\nimport { useCallback, useEffect } from 'react';\n\nimport { isAdminPortal } from '../functions/general';\nexport const PRACTIS_ADMIN_SUFFIX = 'Practis Admin Portal';\nexport const PRACTIS_WEB_SUFFIX = 'Practis';\n\nexport default function useHtmlPageTitle(\n title?: string,\n dependencies?: (string | undefined)[]\n) {\n const isItAdminPortal = isAdminPortal();\n\n const suffix = isItAdminPortal ? PRACTIS_ADMIN_SUFFIX : PRACTIS_WEB_SUFFIX;\n\n const generateHtmlTitle = useCallback(() => {\n let htmlTitle = suffix;\n\n if (!isEmpty(dependencies)) {\n for (const dependency of dependencies!.reverse()) {\n // the dependency can be a string of multiple values\n // that each of them can be undefined.\n // ex: `${enrollment?.user.firstName} ${enrollment?.user.lastName}`\n // result: 'undefined undefined'\n if (dependency && !dependency.includes('undefined')) {\n htmlTitle = `${dependency} - ${htmlTitle}`;\n }\n }\n }\n\n if (title) {\n htmlTitle = `${title} - ${htmlTitle}`;\n }\n\n return htmlTitle;\n }, [dependencies, suffix, title]);\n\n useEffect(() => {\n const htmlTitle = generateHtmlTitle();\n\n document.title = htmlTitle;\n }, [dependencies, generateHtmlTitle]);\n}","export * from './Tooltip';\n","export enum BulkActionAvailability {\n UNAVAILABLE_FOR_ALL,\n AVAILABLE_FOR_SOME,\n AVAILABLE_FOR_ALL,\n}\n\nexport interface BulkActionAvailabilityItem<TAction> {\n action: TAction;\n availability: BulkActionAvailability;\n}\n\nexport function getBulkActionAvailability<TItem>(\n items: TItem[] | undefined,\n canPerformAction: (item: TItem) => boolean\n): BulkActionAvailability {\n if (!!items?.length) {\n const availableFor = items.filter(canPerformAction);\n if (availableFor.length === items.length) {\n return BulkActionAvailability.AVAILABLE_FOR_ALL;\n }\n else if (availableFor.length > 0 && availableFor.length < items.length) {\n return BulkActionAvailability.AVAILABLE_FOR_SOME;\n }\n }\n return BulkActionAvailability.UNAVAILABLE_FOR_ALL;\n}\n\nexport function getBulkActionAvailabilityItem<TItem, TAction>(\n action: TAction,\n items: TItem[] | undefined,\n canPerformAction: (item: TItem) => boolean\n): BulkActionAvailabilityItem<TAction> {\n return {\n action,\n availability: getBulkActionAvailability(items, canPerformAction),\n };\n}\n\nexport function getBulkActionsAvailability<TItem, TAction extends string | number>(\n items: TItem[] | undefined,\n actions: BulkActionAvailabilityItem<TAction>[]\n) {\n const actionsMap = getBulkActionsMap(actions);\n \n const areItemsEmpty = () =>\n !items?.length;\n\n const areBulkActionsDisabled = () =>\n areItemsEmpty()\n || actions.every(a => a.availability !== BulkActionAvailability.AVAILABLE_FOR_ALL);\n \n const isBulkActionVisible = (action: TAction) =>\n actionsMap[action]?.availability === BulkActionAvailability.AVAILABLE_FOR_ALL\n || actionsMap[action]?.availability === BulkActionAvailability.AVAILABLE_FOR_SOME;\n\n const isBulkActionDisabled = (action: TAction) =>\n actionsMap[action]?.availability === BulkActionAvailability.AVAILABLE_FOR_SOME\n || actionsMap[action]?.availability === BulkActionAvailability.UNAVAILABLE_FOR_ALL;\n\n return {\n areItemsEmpty,\n areBulkActionsDisabled,\n isBulkActionVisible,\n isBulkActionDisabled,\n };\n}\n\nfunction getBulkActionsMap<TAction extends string | number>(\n actions: BulkActionAvailabilityItem<TAction>[]\n) {\n return actions.reduce((result, a) => {\n result[a.action] = a;\n return result;\n }, {} as Record<TAction, BulkActionAvailabilityItem<TAction>>);\n}\n","export const SEARCH_STATE = {\n ACCURACY: {\n name: '/feed/accuracy',\n childrenKeys: ['/feed/accuracy', 'teams/training/practis-sets', 'user/performance/']\n },\n SUBMISSIONS: {\n name: '/feed/challenges',\n childrenKeys: ['/feed/challenges', 'library/challenges/', 'teams/training/practis-sets', 'user/performance/']\n },\n TEAMS: {\n name: '/teams',\n childrenKeys: ['/members']\n },\n MEMBERS: {\n name: '/members',\n childrenKeys: ['user/performance/', 'teams/training/practis-sets/'],\n parentKey: ['/teams']\n },\n TRAINING: {\n name: '/training/practis-sets',\n childrenKeys: ['/training/practis-sets/', 'teams/training/practis-sets/'],\n parentKey: ['/teams']\n },\n PRACTIS_SET_DETAILS: {\n name: '/training/practis-sets/',\n childrenKeys: ['user/performance/']\n },\n ACTIVE_USERS: {\n name: '/users',\n childrenKeys: ['user/performance/', 'teams/training/practis-sets/', '/users/']\n },\n PENDING_USERS: {\n name: '/invitations',\n childrenKeys: ['invitation/performance/', 'teams/training/practis-sets/']\n },\n \n}","export { default as TableWrapper } from './view';\nexport * from './types';\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const HourGlass = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, width, height }, ref) => {\n return (\n <svg width={width || '11'} height={height || '13'} viewBox=\"0 0 11 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 0h11v13H0V0z\" fill=\"#fff\"/>\n <path d=\"M10.445 3.414V2.36c.33-.173.555-.492.555-.861v-.25c0-.138-.124-.25-.277-.25H1.278C1.124 1 1 1.112 1 1.25v.25c0 .369.225.688.556.86v1.054c0 .99.469 1.939 1.287 2.601L4.06 7l-1.216.985c-.818.662-1.287 1.61-1.287 2.601v1.053c-.33.174-.556.492-.556.861v.25c0 .138.124.25.278.25h9.445c.153 0 .277-.112.277-.25v-.25c0-.369-.225-.688-.555-.86v-1.054c0-.99-.47-1.939-1.288-2.601L7.942 7l1.215-.985c.818-.662 1.288-1.61 1.288-2.601zM8.414 5.272 6.74 6.628A.479.479 0 0 0 6.556 7c0 .142.066.277.184.372l1.674 1.356c.584.473.92 1.15.92 1.858v.914H2.667v-.914c0-.707.335-1.385.92-1.858L5.26 7.372A.479.479 0 0 0 5.445 7a.478.478 0 0 0-.184-.372L3.586 5.272c-.584-.473-.92-1.15-.92-1.858V2.5h6.668v.914c0 .707-.336 1.385-.92 1.858z\" fill=\"#F0A803\"/>\n <path d=\"M7.747 4H4.253c-.1 0-.19.056-.231.142a.229.229 0 0 0 .044.258L5.83 5.938A.26.26 0 0 0 6 6a.26.26 0 0 0 .17-.062L7.934 4.4a.229.229 0 0 0 .044-.258A.254.254 0 0 0 7.747 4zM4.253 12h3.494c.1 0 .19-.084.231-.214a.479.479 0 0 0-.044-.386L6.17 9.093A.217.217 0 0 0 6 9c-.061 0-.122.03-.17.093L4.066 11.4a.479.479 0 0 0-.044.386c.04.13.131.214.231.214z\" fill=\"#F0A803\"/>\n </svg>\n \n );\n }\n);\n\nexport default HourGlass;\n","import { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\n\nexport const StyledAvatarContainer = styled.div<{\n size?: string;\n disabled?: boolean;\n backgroundColor?: string;\n imgBorderRadius?: string;\n}>`\n font-size: ${props => (props.size === 'sm' ? '13px' : '18px')};\n height: 100%;\n width: 100%;\n border-radius: 4px;\n background: ${props =>\n props.backgroundColor\n ? props.backgroundColor\n : props.theme.Colors.whiteFive};\n color: ${props => props.theme.Colors.black};\n opacity: ${props => (props.disabled ? 0.7 : 1)};\n font-weight: bold;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n position: relative;\n\n img {\n height: 100%;\n width: 100%;\n border-radius: ${props =>\n !!props.imgBorderRadius ? props.imgBorderRadius : '4px'};\n object-fit: cover;\n }\n`;\n\nexport const StyledNavLink = styled(NavLink)`\n text-decoration: none;\n color: ${props => props.theme.Colors.dark};\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const CustomPlaceholderContainer = styled.div`\n height: 16px;\n width: 16px;\n align-self: center;\n display: flex;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nexport const CustomNamePlaceholder = styled.div`\n width: 100%;\n height: 100%;\n border-radius: 4px;\n align-items: center;\n justify-content: center;\n display: flex;\n border: 1px solid ${props => props.theme.Colors.cloudyBlue};\n box-sizing: border-box;\n`;\n\nexport const PendingWrapper = styled.div<{\n bottomPosition?: number;\n}>`\n position: absolute;\n pointer-events: all;\n right: 0px;\n bottom: ${props =>\n !!props.bottomPosition ? props.bottomPosition : '-5'}px;\n`;\n","import React, { useMemo } from 'react';\n\nimport HourGlass from '../../icons/HourGlass';\nimport Loading from '../LoadingCopmonent/Loading';\nimport { UserInterface } from '../../../constants/interfaces/User';\nimport { Tooltip } from '../Tooltip';\nimport {\n CustomNamePlaceholder,\n CustomPlaceholderContainer,\n PendingWrapper,\n StyledAvatarContainer,\n StyledNavLink,\n} from './styles';\nimport { AvatarPlaceholderProps } from './types';\n\nconst AvatarPlaceholder = ({\n profile,\n customProfile,\n loading,\n size,\n link,\n disabled,\n className,\n backgroundColor,\n imgBorderRadius,\n customPlaceholder: CustomPlaceholder,\n customWrapper: CustomWrapper,\n iconWidth,\n iconHeight,\n hidePending,\n bottomPosition,\n noHint,\n dataTest\n}: AvatarPlaceholderProps) => {\n const content = useMemo((): React.ReactNode => {\n if (loading) {\n return <Loading />;\n }\n\n if (customProfile) {\n if (customProfile.picture) {\n return (\n <img\n data-test={dataTest}\n src={customProfile.picture}\n alt={`${customProfile.firstName} ${customProfile.lastName}`}\n />\n );\n }\n\n return (\n <CustomNamePlaceholder data-test={dataTest}>\n {customProfile.firstName.charAt(0).toUpperCase()}\n </CustomNamePlaceholder>\n );\n }\n\n if (!profile) {\n return <div />;\n }\n\n const mediaUrl =\n profile.logoUrl ||\n profile.logo ||\n profile.imageUrl ||\n (profile as UserInterface)?.picture;\n\n if (mediaUrl) {\n return (\n <img\n src={mediaUrl}\n alt={'profile'}\n data-test={dataTest}\n />\n );\n }\n\n if (CustomPlaceholder) {\n return (\n <CustomPlaceholderContainer>\n <CustomPlaceholder />\n </CustomPlaceholderContainer>\n );\n }\n\n if (CustomWrapper) {\n if (profile.firstName && profile.lastName) {\n return (\n <CustomWrapper data-test={dataTest}>\n {profile.firstName.charAt(0).toUpperCase()}\n </CustomWrapper>\n );\n }\n if (profile.name) {\n return (\n <CustomWrapper data-test={dataTest}>\n {profile.name.charAt(0).toUpperCase()}\n </CustomWrapper>\n );\n }\n }\n\n if (profile.firstName) {\n return (\n <CustomNamePlaceholder data-test={dataTest}>\n {profile.firstName.charAt(0).toUpperCase()}\n </CustomNamePlaceholder>\n );\n }\n\n if (profile.name) {\n return (\n <CustomNamePlaceholder data-test={dataTest}>\n {profile.name.charAt(0).toUpperCase()}\n </CustomNamePlaceholder>\n );\n }\n\n return null;\n }, [CustomPlaceholder, CustomWrapper, loading, profile, customProfile, dataTest]);\n\n return (\n <StyledAvatarContainer\n size={size}\n disabled={disabled}\n className={className}\n backgroundColor={backgroundColor}\n imgBorderRadius={imgBorderRadius}\n >\n {link ? (\n <StyledNavLink to={link}>{content}</StyledNavLink>\n ) : (\n content\n )}\n\n {!hidePending &&\n (profile?.status === 'PENDING' ||\n customProfile?.status === 'PENDING') &&\n (noHint ? (\n <PendingWrapper bottomPosition={bottomPosition} data-test={dataTest && `${dataTest}-pending-icon`}>\n <HourGlass width={iconWidth} height={iconHeight} />\n </PendingWrapper>\n ) : (\n <Tooltip\n trigger=\"hover\"\n label={'Pending Registration'}\n preset=\"pending-user\"\n dataTest=\"pending-user-tooltip\"\n >\n <PendingWrapper bottomPosition={bottomPosition} data-test={dataTest && `${dataTest}-pending-icon`}>\n <HourGlass width={iconWidth} height={iconHeight} />\n </PendingWrapper>\n </Tooltip>\n ))}\n </StyledAvatarContainer>\n );\n};\n\nexport default AvatarPlaceholder;\n\n","import { motion } from 'framer-motion';\nimport styled from 'styled-components';\nimport { rgba } from 'polished';\n\nexport const StyledConfirmDialogBlacker = styled(motion.div)`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1200;\n background: ${rgba('#232e3a', 0.8)};\n display: flex;\n justify-content: center;\n align-items: center;\n color: var(--ps-black-main);\n`;\n\nexport const StyledConfirmDialog = styled(motion.div)<{\n width?: number;\n height?: number;\n minHeight?: number;\n padding?: string;\n}>`\n width: ${props => props.width || '400'}px;\n height: ${props => props.height ? `${props.height}px` : 'auto'};\n min-height: ${props => `${props.minHeight ?? 200}px`};\n box-shadow: 0 5px 20px -5px rgba(166, 174, 190, 0.5);\n background-color: var(--ps-white-1);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n padding: ${props =>\n !!props.padding ? props.padding : '32px 32px 32px 40px;'};\n`;\n\nexport const StyledTitle = styled.div<{\n marginBottom?: number;\n color?: string;\n}>`\n font-size: 20px;\n font-weight: 800;\n letter-spacing: 0.5px;\n color: ${props =>\n !!props.color ? `${props.color}` : 'var(--ps-black-main)'};\n text-align: left;\n margin-bottom: ${props =>\n !!props.marginBottom ? `${props.marginBottom}px` : '14px'};\n text-align: left;\n font-stretch: normal;\n font-style: normal;\n line-height: 24px;\n letter-spacing: normal;\n`;\n\nexport const StyledDescription = styled.div<{ marginBottom?: number }>`\n color: var(--ps-grey-1);\n font-size: 13px;\n text-align: left;\n margin-bottom: ${props =>\n !!props.marginBottom ? `${props.marginBottom}px` : '0px'};\n white-space: break-spaces;\n`;\n\nexport const StyledActions = styled.div<{ center?: boolean }>`\n display: flex;\n justify-content: ${props => (props.center ? 'center' : 'flex-end')};\n`;\n\nexport const ButtonWrapper = styled.div`\n margin-left: 16px;\n`;","import { FC } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../Button';\n\nimport {\n ButtonWrapper,\n StyledActions,\n StyledConfirmDialog,\n StyledConfirmDialogBlacker,\n StyledDescription,\n StyledTitle,\n} from './styles';\nimport { DialogWrapperProps } from './types';\n\nconst DialogWrapper: FC<DialogWrapperProps> = ({\n modalTitle,\n description,\n dialogType = 'WARNING',\n confirmButtonText,\n cancelButtonText,\n onConfirm,\n onCancel,\n customization,\n children,\n onClickAway,\n isLoading,\n isConfirmDisabled,\n dataTest = 'dialog-wrapper',\n}) => {\n const container = document.querySelector('body') as HTMLElement;\n\n const {\n width = 400,\n height = undefined,\n minHeight = undefined,\n padding = '32px 32px 32px 40px',\n titleMarginBottom = 14,\n descriptionMarginBottom = 30,\n shouldCenterButton = false,\n } = customization || {};\n\n return createPortal(\n <StyledConfirmDialogBlacker onClick={onClickAway}>\n <StyledConfirmDialog\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n width={width}\n height={height}\n minHeight={minHeight}\n padding={padding}\n data-test={dataTest}\n >\n {!!modalTitle && (\n <StyledTitle\n marginBottom={titleMarginBottom}\n color={\n dialogType === 'DANGER'\n ? 'var(--ps-red-main)'\n : undefined\n }\n data-test={dataTest && `${dataTest}-title`}\n >\n {modalTitle}\n </StyledTitle>\n )}\n {!!description ? (\n <StyledDescription\n marginBottom={descriptionMarginBottom}\n data-test={dataTest && `${dataTest}-description`}\n >\n {description}\n </StyledDescription>\n ) : (\n <div>{children}</div>\n )}\n {!!onCancel || !!onConfirm ? (\n <StyledActions center={shouldCenterButton}>\n {!!onCancel && (\n <ButtonWrapper>\n <Button\n height=\"40px\"\n width=\"128px\"\n action={onCancel}\n variant=\"inverse\"\n color={\n dialogType === 'INFO'\n ? 'default'\n : 'warning'\n }\n dataTest={dataTest && `${dataTest}-cancel`}\n >\n {cancelButtonText\n ? cancelButtonText\n : 'Cancel'}\n </Button>\n </ButtonWrapper>\n )}\n {!!onConfirm && (\n <ButtonWrapper>\n <Button\n height=\"40px\"\n width=\"128px\"\n action={onConfirm}\n color={\n dialogType === 'INFO'\n ? 'default'\n : 'warning'\n }\n loading={isLoading}\n disabled={isConfirmDisabled}\n dataTest={dataTest && `${dataTest}-confirm`}\n >\n {confirmButtonText\n ? confirmButtonText\n : 'Yes, Delete'}\n </Button>\n </ButtonWrapper>\n )}\n </StyledActions>\n ) : null}\n </StyledConfirmDialog>\n </StyledConfirmDialogBlacker>,\n container\n );\n};\n\n\n\nexport default DialogWrapper;","export enum UserStatus {\n PENDING = 'PENDING',\n ACTIVE = 'ACTIVE',\n DELETED = 'DELETED',\n}\n\nexport const UserItemsStatusNames = {\n [UserStatus.ACTIVE as string]: 'Registered',\n [UserStatus.DELETED as string]: 'Inactive',\n [UserStatus.PENDING as string]: 'Pending Registration',\n};\n\nexport const USER_NOT_FOUND_ERROR_MESSAGE = 'User can\\'t be found!';","import { find } from 'lodash';\n\nimport { SearchLibraryParams } from '../../../api/types';\nimport { SearchParams } from \"../../../constants/interfaces/filters\";\nimport { getSearchSortingValue } from \"../../../helpers/functions/search-params-helpers\";\n\nexport enum LibraryItemsStatus {\n ACTIVE = 'ACTIVE',\n DRAFT = 'DRAFT',\n ARCHIVED = 'ARCHIVED',\n DELETED = 'DELETED',\n IN_PROGRESS = 'IN_PROGRESS',\n COMPLETED = 'COMPLETED',\n PENDING = 'PENDING',\n}\n\nconst libraryItemsStatusNames = {\n [LibraryItemsStatus.ACTIVE as string]: 'Active',\n [LibraryItemsStatus.DRAFT as string]: 'Draft',\n [LibraryItemsStatus.ARCHIVED as string]: 'Archived',\n [LibraryItemsStatus.DELETED as string]: 'Deleted',\n [LibraryItemsStatus.IN_PROGRESS as string]: 'In Progress',\n [LibraryItemsStatus.COMPLETED as string]: 'Completed',\n [LibraryItemsStatus.PENDING as string]: 'Pending',\n};\n\nexport function libraryItemsStatusName(status?: string): string {\n return (status && libraryItemsStatusNames[status]) || status || '';\n}\n\nexport const LIBRARY_STATUS = {\n ACTIVE: 'active',\n DRAFT: 'draft',\n ARCHIVED: 'archived',\n};\n\nexport const LIBRARY_STATUS_NAMES = {\n [LIBRARY_STATUS.ACTIVE]: 'Active',\n [LIBRARY_STATUS.DRAFT]: 'Draft',\n [LIBRARY_STATUS.ARCHIVED]: 'Archived',\n};\n\nexport const LIBRARY_STATUS_ITEMS: Array<{ name: string; value: string }> = [\n {\n name: LIBRARY_STATUS_NAMES[LIBRARY_STATUS.ACTIVE],\n value: LIBRARY_STATUS.ACTIVE,\n },\n {\n name: LIBRARY_STATUS_NAMES[LIBRARY_STATUS.DRAFT],\n value: LIBRARY_STATUS.DRAFT,\n },\n {\n name: LIBRARY_STATUS_NAMES[LIBRARY_STATUS.ARCHIVED],\n value: LIBRARY_STATUS.ARCHIVED,\n },\n];\n\n/**\n * @function createSearchLibraryParams\n * @param { SearchParams } searhParams\n * @returns { SearchLibraryParams }\n */\n export const createSearchLibraryParams = (\n searchParams: SearchParams\n): SearchLibraryParams => {\n return {\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, ''),\n status: (\n find(searchParams?.filters, { field: 'status' })?.value as string[]\n )\n ?.map(status => status.toUpperCase())\n ?.join(','),\n labels: searchParams?.labelIDs?.join(','),\n companies: searchParams.companyId?.toString()\n };\n};","export enum BulkActionAvailability {\n AVAILABLE_FOR_ALL,\n AVAILABLE_FOR_SOME,\n UNAVAILABLE_FOR_ALL,\n}\n\nexport function canPerformBulkAction<TItem>(items: TItem[] | undefined, canPerformAction: (item: TItem) => boolean): BulkActionAvailability {\n if (!!items?.length) {\n const availableFor = items.filter(canPerformAction);\n if (availableFor.length === items.length) {\n return BulkActionAvailability.AVAILABLE_FOR_ALL;\n }\n else if (availableFor.length > 0 && availableFor.length < items.length) {\n return BulkActionAvailability.AVAILABLE_FOR_SOME;\n }\n }\n return BulkActionAvailability.UNAVAILABLE_FOR_ALL;\n}\n\nexport function bulkAvailabilityToFlags(bulkActionAvailability: BulkActionAvailability) {\n const visibleAvailabilities = [BulkActionAvailability.AVAILABLE_FOR_ALL, BulkActionAvailability.AVAILABLE_FOR_SOME];\n const disabledAvailabilities = [BulkActionAvailability.AVAILABLE_FOR_SOME, BulkActionAvailability.UNAVAILABLE_FOR_ALL];\n return {\n visible: visibleAvailabilities.includes(bulkActionAvailability),\n disabled: disabledAvailabilities.includes(bulkActionAvailability),\n };\n}","import { useMemo } from \"react\";\nimport { PractisSets, PractisSetStatuses } from \"../../../constants/interfaces/PractisSets\";\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\n\nexport enum PractisSetActions {\n EDIT,\n ASSIGN_LABELS,\n DUPLICATE,\n ARCHIVE,\n RESTORE,\n DELETE,\n}\n\nfunction createPractisSetActionsHelper(\n loggedInUser: UserProfile | undefined\n) {\n const canEdit = (practisSet: PractisSets) =>\n practisSet.status !== PractisSetStatuses.DELETED &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.UPDATE_PRACTIS_SET);\n\n const canAssignLabels = (practisSet: PractisSets) =>\n practisSet.status !== PractisSetStatuses.DELETED &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.ASSIGN_PRACTIS_SET_LABEL);\n\n const canAssignUsers = (practisSet: PractisSets) => \n practisSet.status === PractisSetStatuses.ACTIVE &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.ASSIGN_ENROLLMENT);\n\n const canDuplicate = (practisSet: PractisSets) =>\n (practisSet.status === PractisSetStatuses.DRAFT ||\n practisSet.status === PractisSetStatuses.ACTIVE) &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.COPY_PRACTIS_SET);\n\n const canArchive = (practisSet: PractisSets) =>\n (practisSet.status === PractisSetStatuses.DRAFT ||\n practisSet.status === PractisSetStatuses.ACTIVE) &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.ARCHIVE_PRACTIS_SET);\n\n const canRestore = (practisSet: PractisSets) =>\n practisSet.status === PractisSetStatuses.ARCHIVED &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.RESTORE_PRACTIS_SET);\n\n const canDelete = (practisSet: PractisSets) =>\n practisSet.status === PractisSetStatuses.ARCHIVED &&\n hasPermission(loggedInUser, NEW_PERMISSIONS.DELETE_PRACTIS_SET);\n\n const getBulkActions = (practisSets: PractisSets[] | undefined) =>\n getBulkActionsAvailability(practisSets, [\n getBulkActionAvailabilityItem(\n PractisSetActions.ASSIGN_LABELS,\n practisSets,\n canAssignLabels\n ),\n getBulkActionAvailabilityItem(\n PractisSetActions.DUPLICATE,\n practisSets,\n canDuplicate\n ),\n getBulkActionAvailabilityItem(\n PractisSetActions.ARCHIVE,\n practisSets,\n canArchive\n ),\n getBulkActionAvailabilityItem(\n PractisSetActions.RESTORE,\n practisSets,\n canRestore\n ),\n getBulkActionAvailabilityItem(\n PractisSetActions.DELETE,\n practisSets,\n canDelete\n ),\n ]);\n\n return {\n canEdit,\n canAssignUsers,\n canAssignLabels,\n canDuplicate,\n canArchive,\n canRestore,\n canDelete,\n getBulkActions,\n };\n}\n\nexport type PractisSetActionsHelper = ReturnType<typeof createPractisSetActionsHelper>;\n\nexport function usePractisSetActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createPractisSetActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import { Scenario, ScenarioStatuses } from '../../../constants/interfaces/Scenario';\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { useMemo } from 'react';\n\nexport enum ScenarioActions {\n EDIT,\n ASSIGN_LABELS,\n DUPLICATE,\n ARCHIVE,\n RESTORE,\n DELETE,\n GENERATE_CHALLENGE,\n DOWNLOAD_PDF,\n}\n\nfunction createScenarioActionsHelper(loggedInUser: UserProfile | undefined) {\n const canEdit = (scenario: Scenario) =>\n scenario.status !== ScenarioStatuses.DELETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.UPDATE_SCENARIO);\n \n const canAssignLabels = (scenario: Scenario) =>\n scenario.status !== ScenarioStatuses.DELETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ASSIGN_SCENARIO_LABEL);\n \n const canDuplicate = (scenario: Scenario) =>\n (scenario.status === ScenarioStatuses.DRAFT || scenario.status === ScenarioStatuses.ACTIVE)\n && hasPermission(loggedInUser, NEW_PERMISSIONS.COPY_SCENARIO);\n \n const canArchive = (scenario: Scenario) =>\n (scenario.status === ScenarioStatuses.DRAFT || scenario.status === ScenarioStatuses.ACTIVE)\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ARCHIVE_SCENARIO);\n \n const canRestore = (scenario: Scenario) =>\n scenario.status === ScenarioStatuses.ARCHIVED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.RESTORE_SCENARIO);\n \n const canDelete = (scenario: Scenario) =>\n scenario.status === ScenarioStatuses.ARCHIVED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.DELETE_SCENARIO);\n\n const canGenerateChallenge = (scenario: Scenario) =>\n scenario.status !== ScenarioStatuses.DELETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.GENERATE_CHALLENGE);\n\n const canDownloadPdf = (scenario: Scenario) =>\n scenario.status === ScenarioStatuses.DRAFT || scenario.status === ScenarioStatuses.ACTIVE;\n \n const getBulkActions = (scenarios: Scenario[] | undefined) =>\n getBulkActionsAvailability(\n scenarios,\n [\n getBulkActionAvailabilityItem(\n ScenarioActions.ASSIGN_LABELS,\n scenarios,\n canAssignLabels\n ),\n getBulkActionAvailabilityItem(\n ScenarioActions.DUPLICATE,\n scenarios,\n canDuplicate\n ),\n getBulkActionAvailabilityItem(\n ScenarioActions.ARCHIVE,\n scenarios,\n canArchive\n ),\n getBulkActionAvailabilityItem(\n ScenarioActions.RESTORE,\n scenarios,\n canRestore\n ),\n getBulkActionAvailabilityItem(\n ScenarioActions.DELETE,\n scenarios,\n canDelete\n ),\n ]\n );\n\n return {\n canEdit,\n canAssignLabels,\n canDuplicate,\n canArchive,\n canRestore,\n canDelete,\n getBulkActions,\n canGenerateChallenge,\n canDownloadPdf,\n };\n}\n\nexport type ScenarioActionsHelper = ReturnType<typeof createScenarioActionsHelper>;\n\nexport function useScenarioActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createScenarioActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import { useMemo } from \"react\";\nimport { Challenge, ChallengeStatuses } from \"../../../constants/interfaces/Challenge\";\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\n\nexport enum ChallengeActions {\n EDIT,\n ASSIGN_LABELS,\n DUPLICATE,\n ARCHIVE,\n RESTORE,\n DELETE,\n}\n\nfunction createChallengeActionsHelper(loggedInUser: UserProfile | undefined) {\n const canEdit = (challenge: Challenge) =>\n challenge.status !== ChallengeStatuses.DELETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.UPDATE_CHALLENGE);\n \n const canAssignLabels = (challenge: Challenge) =>\n challenge.status !== ChallengeStatuses.DELETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ASSIGN_CHALLENGE_LABEL);\n \n const canDuplicate = (challenge: Challenge) =>\n (challenge.status === ChallengeStatuses.DRAFT || challenge.status === ChallengeStatuses.ACTIVE)\n && hasPermission(loggedInUser, NEW_PERMISSIONS.COPY_CHALLENGE);\n \n const canArchive = (challenge: Challenge) =>\n (challenge.status === ChallengeStatuses.DRAFT || challenge.status === ChallengeStatuses.ACTIVE)\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ARCHIVE_CHALLENGE);\n \n const canRestore = (challenge: Challenge) =>\n challenge.status === ChallengeStatuses.ARCHIVED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.RESTORE_CHALLENGE);\n \n const canDelete = (challenge: Challenge) =>\n challenge.status === ChallengeStatuses.ARCHIVED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.DELETE_CHALLENGE);\n\n const getBulkActions = (challenges: Challenge[] | undefined) =>\n getBulkActionsAvailability(\n challenges,\n [\n getBulkActionAvailabilityItem(\n ChallengeActions.ASSIGN_LABELS,\n challenges,\n canAssignLabels\n ),\n getBulkActionAvailabilityItem(\n ChallengeActions.DUPLICATE,\n challenges,\n canDuplicate\n ),\n getBulkActionAvailabilityItem(\n ChallengeActions.ARCHIVE,\n challenges,\n canArchive\n ),\n getBulkActionAvailabilityItem(\n ChallengeActions.RESTORE,\n challenges,\n canRestore\n ),\n getBulkActionAvailabilityItem(\n ChallengeActions.DELETE,\n challenges,\n canDelete\n ),\n ]\n );\n\n return {\n canEdit,\n canAssignLabels,\n canDuplicate,\n canArchive,\n canRestore,\n canDelete,\n getBulkActions,\n };\n}\n\nexport type ChallengeActionsHelper = ReturnType<typeof createChallengeActionsHelper>;\n\nexport function useChallengeActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createChallengeActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\n\nexport type PermissionsStateSelector = (state: any) => NEW_PERMISSIONS[];\n\nexport const PermissionsStateSelectorContext = React.createContext<\n PermissionsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function usePermissionsState(): NEW_PERMISSIONS[] {\n return useSelector(useContext(PermissionsStateSelectorContext));\n}\n","import { PractisSetV2 } from \"./PractisSets\";\r\nimport { SubmissionV2 } from \"./Reviews\";\r\nimport { Scenario } from \"./Scenario\";\r\nimport { UserInfo } from \"./UserInfo\";\r\n\r\nexport enum EnrollmentStatus {\r\n ENROLLED = 'ENROLLED',\r\n PENDING = 'PENDING',\r\n COMPLETED = 'COMPLETED',\r\n}\r\n\r\nexport enum EnrollmentStatusEnum {\r\n IN_PROGRESS = 'IN_PROGRESS',\r\n PENDING = 'PENDING',\r\n COMPLETED = 'COMPLETED',\r\n}\r\n\r\nexport enum TrainingContentType {\r\n SCENARIO = 'SCENARIO',\r\n CHALLENGE = 'CHALLENGE',\r\n}\r\n\r\nexport interface Enrollments {\r\n id?: number;\r\n userId?: number;\r\n practisSetId?: number;\r\n status?: EnrollmentStatus | '';\r\n progressValue?: number;\r\n enrolledAt?: string;\r\n averageAccuracy?: number;\r\n declinedAt?: string;\r\n createdAt?: string;\r\n completedAt?: string;\r\n submissionsAverageScore?: number;\r\n updatedAt?: string;\r\n progress?: {\r\n id: number;\r\n type: 'CHALLENGE' | 'SCENARIO';\r\n status: 'AVAILABLE' | 'PASSED' | 'UNAVAILABLE';\r\n }[];\r\n daysActive: number;\r\n displayStatus?: EnrollmentStatusEnum | '';\r\n challengesWithSentSubmissionCount?: number | null;\r\n weeklyActiveDays: number;\r\n monthlyActiveDays: number;\r\n totalActiveDays: number;\r\n trainingTime: number;\r\n lastTrainingAt?: string;\r\n lastTraining?: string;\r\n currentRepsCountTotal?: number;\r\n minRepsCountTotal?: number;\r\n passedScenarioCount?: number;\r\n minutesPerDay?: number;\r\n totalTimeInMinutes?: number;\r\n lastActivity?: any;\r\n dueDate?: string;\r\n hasOverdue?: boolean;\r\n}\r\n\r\nexport interface EnrollmentInterface {\r\n id: number;\r\n practisSet: PractisSetV2;\r\n user: UserInfo;\r\n dueDate: string;\r\n status: string;\r\n progress: number;\r\n averageAccuracy: number;\r\n trainingTime: number;\r\n createdAt: string;\r\n startedAt: string;\r\n lastTrainingAt: string;\r\n completedAt: string;\r\n hasOverdue: boolean;\r\n passedScenarioCount: number;\r\n passedChallengeCount: number;\r\n}\r\n\r\nexport interface EnrollmentProgress {\r\n content: {\r\n title: string;\r\n scenarioId?: number;\r\n scenario?: Scenario;\r\n challengeId?: number;\r\n type: string;\r\n minRepsCount: number;\r\n position: number;\r\n cover: {\r\n id: number;\r\n fileUrl: string;\r\n };\r\n };\r\n progress: {\r\n submissions?: SubmissionV2[];\r\n submission?: SubmissionV2;\r\n completedAt?: string;\r\n countReps: number;\r\n countTries?: number;\r\n };\r\n}\r\n\r\nexport interface EnrollmentDailyTraining {\r\n date: string;\r\n timeSpent: number;\r\n}\r\n\r\n","import { PaginationResult } from '../../../../constants/interfaces/PaginationResult';\nimport { DraftUser } from '../../../../constants/interfaces/Draft';\n\nexport enum ACTIONS {\n SEARCH_DRAFT_USERS_START = 'SEARCH_DRAFT_USERS_START',\n SEARCH_DRAFT_USERS_SUCCESS = 'SEARCH_DRAFT_USERS_SUCCESS',\n SEARCH_DRAFT_USERS_FAILURE = 'SEARCH_DRAFT_USERS_FAILURE',\n MODIFY_DRAFT_USERS = 'MODIFY_DRAFT_USERS',\n MODIFY_DRAFT_USERS_WITHOUT_VALIDATION = 'MODIFY_DRAFT_USERS_WITHOUT_VALIDATION',\n RESET_DRAFTS_PAGE = 'RESET_DRAFTS_PAGE',\n\n UPDATE_DRAFT_USERS_START = 'UPDATE_DRAFT_USERS_START',\n UPDATE_DRAFT_USERS_SUCCESS = 'UPDATE_DRAFT_USERS_SUCCESS',\n UPDATE_DRAFT_USERS_FAILURE = 'UPDATE_DRAFT_USERS_FAILURE',\n}\n\nexport function searchDraftUsersStart() {\n return {\n type: ACTIONS.SEARCH_DRAFT_USERS_START as ACTIONS.SEARCH_DRAFT_USERS_START,\n };\n}\n\nexport function searchDraftUsersSuccess(data: PaginationResult<DraftUser>) {\n return {\n type: ACTIONS.SEARCH_DRAFT_USERS_SUCCESS as ACTIONS.SEARCH_DRAFT_USERS_SUCCESS,\n data,\n };\n}\n\nexport function searchDraftUsersFailure(error: any) {\n return {\n type: ACTIONS.SEARCH_DRAFT_USERS_FAILURE as ACTIONS.SEARCH_DRAFT_USERS_FAILURE,\n error,\n };\n}\n\nexport function modifyDraftUsersAction(data: PaginationResult<DraftUser>) {\n return {\n type: ACTIONS.MODIFY_DRAFT_USERS as ACTIONS.MODIFY_DRAFT_USERS,\n data,\n };\n}\n\nexport function modifyDraftUsersWithoutValidationAction(\n data: PaginationResult<DraftUser>\n) {\n return {\n type: ACTIONS.MODIFY_DRAFT_USERS_WITHOUT_VALIDATION as ACTIONS.MODIFY_DRAFT_USERS_WITHOUT_VALIDATION,\n data,\n };\n}\n\nexport function resetDraftsPageAction() {\n return {\n type: ACTIONS.RESET_DRAFTS_PAGE as ACTIONS.RESET_DRAFTS_PAGE,\n };\n}\n\nexport function updateDraftUsersStart() {\n return {\n type: ACTIONS.UPDATE_DRAFT_USERS_START as ACTIONS.UPDATE_DRAFT_USERS_START,\n };\n}\n\nexport function updateDraftUsersSuccess(\n data: Partial<DraftUser>,\n updateType:\n | 'draft-created'\n | 'draft-updated'\n | 'draft-deleted'\n | 'user-invited'\n) {\n return {\n type: ACTIONS.UPDATE_DRAFT_USERS_SUCCESS as ACTIONS.UPDATE_DRAFT_USERS_SUCCESS,\n data,\n updateType,\n };\n}\n\nexport function updateDraftUsersFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_DRAFT_USERS_FAILURE as ACTIONS.UPDATE_DRAFT_USERS_FAILURE,\n error,\n };\n}\n","import { UserInterface } from './User';\nimport { Script } from './Script';\n\nexport enum ScenarioStatuses {\n DRAFT = 'DRAFT',\n ACTIVE = 'ACTIVE',\n ARCHIVED = 'ARCHIVED',\n DELETED = 'DELETED',\n}\n\nexport type Status =\n | ScenarioStatuses.DRAFT\n | ScenarioStatuses.ACTIVE\n | ScenarioStatuses.ARCHIVED\n | ScenarioStatuses.DELETED;\n\nexport interface Scenario {\n uniqueId?: string;\n id?: number;\n scriptId?: number;\n title: string;\n type?: 'SCENARIO';\n description: string;\n instructions: string;\n createdAt?: string;\n updatedAt?: string;\n companyId?: string;\n creatorId?: number;\n status: Status;\n script: Script;\n creator?: UserInterface;\n checked?: boolean;\n labels?: any[];\n updatedLabels?: number[];\n minRepsCount?: number;\n}\n","import styled from 'styled-components';\nimport { isAdminPortal } from '../../../helpers/functions/general';\nimport PractisAdminPlatformLogo from '../../icons/PractisAdminPlatformLogo';\nimport PractisLogo from '../../icons/PractisLogo';\n\nexport const StyledLogoContainer = styled.div<{ width: number, marginBottom?: number }>`\n width: ${props => props.width}px;\n max-width: 100%;\n margin: 0 auto;\n margin-bottom: ${props => `${props.marginBottom ?? 57}px`};\n`;\n\nexport const StyledLogo = styled(isAdminPortal() ? PractisAdminPlatformLogo : PractisLogo)`\n width: 100%;\n color: ${props => props.theme.Colors.white};\n`;","import { AuthLogoProps } from './types';\nimport {\n StyledLogoContainer,\n StyledLogo\n} from './styles';\n\nfunction AuthLogoView({ width, marginBottom }: AuthLogoProps) {\n return (\n <StyledLogoContainer\n width={width ? width : 153}\n marginBottom={marginBottom}\n data-test=\"practis-logo\"\n >\n <StyledLogo />\n </StyledLogoContainer>\n );\n}\n\nexport default AuthLogoView;\n","import AuthLogoView from './view';\n\nexport default AuthLogoView;","import styled from 'styled-components';\n\nexport const BackgroundWrapper = styled.div`\n height: 100vh;\n width: 100%;\n position: fixed;\n background: var(--ps-graphite-1);\n overflow: auto;\n z-index: 1;\n`;\n\nexport const BackgroundImage = styled.img`\n max-height: 90%;\n max-width: 100%;\n right: 0;\n bottom: 0;\n position: fixed;\n z-index: 1;\n`;\n\nexport const PageContainer = styled.div`\n position: relative;\n z-index: 2;\n height: 100vh;\n overflow: auto;\n box-sizing: border-box;\n`\n\nexport const LogoContainer = styled.div<{\n desktopMinWidth: number;\n heightToShowScroll: number\n}>`\n height: 44px;\n\n @media(max-width:767px) {\n padding-top: 24px;\n }\n @media(min-width:768px) {\n padding-top: 56px;\n }\n @media(min-width: ${props => props.desktopMinWidth}px) {\n padding-top: 48px;\n }\n @media(max-height: ${props => props.heightToShowScroll}px) {\n padding-bottom: 20px;\n }\n`\n\nexport const PageContent = styled.div<{\n desktopMinWidth: number;\n heightToShowScroll: number;\n contentWidth?: number;\n}>`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n margin: 0 auto;\n box-sizing: border-box;\n ${props => props.contentWidth && `width: ${props.contentWidth}px;`};\n \n @media(max-width:767px) {\n height: calc(100vh - 69px);\n padding-bottom: 69px;\n }\n @media(min-width: 768px) {\n height: calc(100vh - 101px);\n padding-bottom: 101px;\n }\n @media(min-width: ${props => props.desktopMinWidth}px) {\n height: calc(100vh - 93px);\n padding-bottom: 93px;\n }\n @media(max-height: ${props => props.heightToShowScroll}px) {\n height: auto!important;\n padding-bottom: 142px;\n }\n`;\n\nexport const Footer = styled.div`\n position: absolute;\n bottom: 24px;\n display: flex;\n`;\n\nexport const FooterLink = styled.a`\n font-size: 13px;\n color: var(--ps-grey-1);\n text-decoration: none;\n`;\n\nexport const FooterLinkSeparator = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n padding: 0 3px;\n`;","import authBackground from '../../../assets/images/auth-background.png';\nimport authBackground2x from '../../../assets/images/auth-background2x.png';\nimport authBackground3x from '../../../assets/images/auth-background3x.png';\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../theme/variables';\nimport AuthLogo from '../AuthLogo';\nimport { LoginAuthWrapperProps } from './types';\nimport {\n BackgroundWrapper,\n BackgroundImage,\n PageContainer,\n LogoContainer,\n PageContent,\n Footer,\n FooterLink,\n FooterLinkSeparator,\n} from './styles';\n\nfunction LoginAuthWrapperView({\n desktopMinWidth = 1024,\n heightToShowScroll = 500,\n contentWidth,\n hideLogo,\n hideFooter,\n children\n}: LoginAuthWrapperProps) {\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n\n return <>\n <BackgroundWrapper>\n <BackgroundImage\n src={authBackground}\n srcSet={`${authBackground2x} 2x, ${authBackground3x} 3x`}\n />\n </BackgroundWrapper>\n <PageContainer>\n <LogoContainer desktopMinWidth={desktopMinWidth} heightToShowScroll={heightToShowScroll}>\n {!hideLogo && <AuthLogo width={isMobile ? 110 : 141} marginBottom={0} />}\n </LogoContainer>\n <PageContent\n desktopMinWidth={desktopMinWidth}\n heightToShowScroll={heightToShowScroll}\n contentWidth={contentWidth}\n >\n {children}\n {!hideFooter && <Footer>\n <FooterLink\n href=\"https://www.gopractis.com/document-privacy-policy\"\n target=\"_blank\"\n data-test=\"privacy-policy-link\"\n >\n Privacy Policy\n </FooterLink>\n <FooterLinkSeparator>•</FooterLinkSeparator>\n <FooterLink\n href=\"https://www.gopractis.com/document-terms-of-use\"\n target=\"_blank\"\n data-test=\"terms-of-use-link\"\n >\n Terms of Use\n </FooterLink>\n <FooterLinkSeparator>•</FooterLinkSeparator>\n <FooterLink\n href=\"https://www.gopractis.com/document-terms-of-service\"\n target=\"_blank\"\n data-test=\"terms-of-service-link\"\n >\n Terms of Service\n </FooterLink>\n </Footer>}\n </PageContent>\n </PageContainer>\n </>\n}\n\nexport default LoginAuthWrapperView;","import LoginAuthWrapperView from './view'\n\nexport default LoginAuthWrapperView;","import { useCallback } from 'react';\nimport { SearchParams } from '../../constants/interfaces/filters';\n\nconst MIN_CHARACTERS = 0;\n\nexport const useSearchDebounced = (\n searchEntity: (searchParams: SearchParams, isRefreshed?: boolean) => void,\n minChars: number = MIN_CHARACTERS\n) => {\n return useCallback(\n (searchParams?: SearchParams, isRefreshed?: boolean) => {\n if (!searchParams) {\n return searchEntity(null as unknown as SearchParams);\n }\n const searchTermLength = searchParams.searchTerm.length;\n if (searchTermLength > minChars || searchTermLength < 1) {\n return searchEntity(searchParams, isRefreshed);\n }\n },\n [searchEntity, minChars]\n );\n};\n","export const getSearchSortingValue = (\n orderBy: {\n field?: string;\n asc?: boolean;\n } | null,\n defaultField: string,\n isAscByDefault?: boolean) => {\n if (orderBy?.field)\n return `${orderBy.field}_${orderBy.asc ? 'asc' : 'desc'}`;\n if (typeof isAscByDefault === 'undefined')\n return defaultField;\n return `${defaultField}_${isAscByDefault ? 'asc' : 'desc'}`;\n}","import { isEmpty } from 'lodash';\r\n\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport {\r\n getFullLibraryPractisSetsFailure,\r\n getFullLibraryPractisSetsStart,\r\n getFullLibraryPractisSetsSuccess,\r\n searchLibraryChallengesFailure,\r\n searchLibraryChallengesStart,\r\n searchLibraryChallengesSuccess,\r\n searchLibraryPractisSetsFailure,\r\n searchLibraryPractisSetsStart,\r\n searchLibraryPractisSetsSuccess,\r\n searchLibraryScenariosFailure,\r\n searchLibraryScenariosStart,\r\n searchLibraryScenariosSuccess,\r\n setSearchTermForLibraryPractisSet,\r\n updateAllChallengesCheckedState,\r\n updateAllPractisSetsCheckedState,\r\n updateAllScenarioCheckedState,\r\n updateAssignedLibraryPractisSet,\r\n updateLibraryChallengeCheckedState,\r\n updateLibraryChallengeFailure,\r\n updateLibraryChallengeStart,\r\n updateLibraryChallengeSuccess,\r\n updateLibraryPractisSetCheckedState,\r\n updateLibraryPractisSetFailure,\r\n updateLibraryPractisSetStart,\r\n updateLibraryPractisSetSuccess,\r\n updateLibraryScenarioCheckedState,\r\n updateLibraryScenarioFailure,\r\n updateLibraryScenarioStart,\r\n updateLibraryScenarioSuccess,\r\n updateSeparateAssignedLibraryPractisSet,\r\n} from './actions';\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useCallback } from 'react';\r\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\r\nimport {\r\n useDeleteChallengesApi,\r\n useDeletePractisSetsApi,\r\n useDeleteScenariosApi,\r\n useDownloadScenarioReportApi,\r\n useSearchChallengesApi,\r\n useSearchPractisSetsApi,\r\n useSearchScenariosApi,\r\n useDeletePractisSetLabelsApi,\r\n useDeleteScenarioLabelApi,\r\n useDeleteChallengeLabelsApi,\r\n useUpdatePractisSetStatusApi,\r\n useUpdateScenarioStatusApi,\r\n useUpdateChallengeStatusApi,\r\n} from '../../../api';\r\nimport { Scenario } from '../../../constants/interfaces/Scenario';\r\nimport { Challenge } from '../../../constants/interfaces/Challenge';\r\nimport { useHistory } from 'react-router';\r\nimport ROUTES from '../../../routes/routes';\r\nimport { LocationState, pushModal } from '../../../tools/router';\r\nimport { History } from 'history';\r\nimport { fileDownload } from '../../../helpers/functions/file-download';\r\nimport {plural} from \"../../../helpers/functions/plural\";\r\nimport { createSearchLibraryParams } from '../tools';\r\nimport { LibraryEntity } from './types';\r\nimport { usePortableLabelsState } from '../../portableLabels/store/states';\r\nimport { findAllChildIds } from '../../../helpers/functions/tree-helpers';\r\nimport { CREATE_CHALLENGE_ACTION } from '../services/LibraryBulkActionsService/constants';\r\n\r\nexport const useSearchPractisSetsService = () => {\r\n const dispatch = useDispatch();\r\n const searchPractisSetsApi = useSearchPractisSetsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (searchParams: SearchParams, shouldSetStore = true) => {\r\n\r\n const searchPractisSetsParams =\r\n createSearchLibraryParams(searchParams);\r\n\r\n shouldSetStore && dispatch(searchLibraryPractisSetsStart());\r\n return searchPractisSetsApi(searchPractisSetsParams)\r\n .then(data => {\r\n if (shouldSetStore) {\r\n dispatch(searchLibraryPractisSetsSuccess(data));\r\n }\r\n\r\n return data.items;\r\n })\r\n .catch((error: ErrorResult) => {\r\n if (shouldSetStore) {\r\n dispatch(\r\n searchLibraryPractisSetsFailure(error.message)\r\n );\r\n showMessage(error.message, 'error');\r\n }\r\n });\r\n },\r\n [dispatch, searchPractisSetsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetFullPractisSetsService = () => {\r\n const dispatch = useDispatch();\r\n const searchPractisSetsApi = useSearchPractisSetsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (searchParams: SearchParams) => {\r\n const searchPractisSetsParams =\r\n createSearchLibraryParams(searchParams);\r\n\r\n dispatch(getFullLibraryPractisSetsStart());\r\n searchPractisSetsApi(searchPractisSetsParams)\r\n .then(data => {\r\n dispatch(getFullLibraryPractisSetsSuccess(data));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getFullLibraryPractisSetsFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, searchPractisSetsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useUpdateAssignedLibraryPractisSetService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (assignedPractisSets: number[]) => {\r\n dispatch(updateAssignedLibraryPractisSet(assignedPractisSets));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateSeparateAssignedLibraryPractisSetService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (assignedPractisSets: number[]) => {\r\n dispatch(\r\n updateSeparateAssignedLibraryPractisSet(assignedPractisSets)\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSetSearchTermForLibraryPractisSetService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (value: string) => {\r\n dispatch(setSearchTermForLibraryPractisSet(value));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\n/**\r\n * @function useDeletePractisSetsService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useDeletePractisSetsService = () => {\r\n const deletePractisSetsApi = useDeletePractisSetsApi();\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { number[] } practisSetIds\r\n * @param { Function } successCallback\r\n * @returns { Promise }\r\n */\r\n return useCallback(\r\n (practisSetIds: number[], successCallback?: () => void) => {\r\n return deletePractisSetsApi(practisSetIds)\r\n .then(() => {\r\n const message = `${practisSetIds.length} Practis ${plural(practisSetIds.length, 'Set has', 'Sets have')} been deleted`;\r\n showMessage(message, 'success');\r\n\r\n successCallback?.();\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [deletePractisSetsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useArchivePractisSetService = () => {\r\n const dispatch = useDispatch();\r\n const updatePractisSetStatusApi = useUpdatePractisSetStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (practisSetIds: number[]) => {\r\n dispatch(updateLibraryPractisSetStart());\r\n return updatePractisSetStatusApi('archive', practisSetIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryPractisSetSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Practis Set has been archived', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryPractisSetFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updatePractisSetStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useRestorePractisSetService = () => {\r\n const dispatch = useDispatch();\r\n const updatePractisSetStatusApi = useUpdatePractisSetStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (practisSetIds: number[]) => {\r\n dispatch(updateLibraryPractisSetStart());\r\n return updatePractisSetStatusApi('draft', practisSetIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryPractisSetSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Practis Set has been restored', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryPractisSetFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updatePractisSetStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchScenariosService = () => {\r\n const dispatch = useDispatch();\r\n const searchScenariosApi = useSearchScenariosApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (searchParams: SearchParams, shouldSetStore = true) => {\r\n const searchScenariosParams =\r\n createSearchLibraryParams(searchParams);\r\n\r\n shouldSetStore && dispatch(searchLibraryScenariosStart());\r\n\r\n return searchScenariosApi(searchScenariosParams)\r\n .then(data => {\r\n if (shouldSetStore) {\r\n dispatch(searchLibraryScenariosSuccess(data));\r\n }\r\n\r\n return data.items;\r\n })\r\n .catch((error: ErrorResult) => {\r\n if (shouldSetStore) {\r\n dispatch(searchLibraryScenariosFailure(error.message));\r\n showMessage(error.message, 'error');\r\n }\r\n });\r\n },\r\n [dispatch, searchScenariosApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useDeleteScenariosService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useDeleteScenariosService = () => {\r\n const deleteScenariosApi = useDeleteScenariosApi();\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { number[] } scenarioIds\r\n * @param { Function } successCallback\r\n * @returns { Promise }\r\n */\r\n return useCallback(\r\n (scenarioIds: number[], successCallback?: () => void) => {\r\n return deleteScenariosApi(scenarioIds)\r\n .then(data => {\r\n const message = `${scenarioIds.length} ${plural(scenarioIds.length, 'Scenario has', 'Scenarios have')} been deleted`;\r\n showMessage(message, 'success');\r\n\r\n successCallback?.();\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [deleteScenariosApi, showMessage]\r\n );\r\n};\r\n\r\n\r\nexport const useArchiveScenarioService = () => {\r\n const dispatch = useDispatch();\r\n const updateScenarioStatusApi = useUpdateScenarioStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (scenarioIds: number[]) => {\r\n dispatch(updateLibraryScenarioStart());\r\n return updateScenarioStatusApi('archive', scenarioIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryScenarioSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Scenario has been archived', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryScenarioFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updateScenarioStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useRestoreScenarioService = () => {\r\n const dispatch = useDispatch();\r\n const updateScenarioStatusApi = useUpdateScenarioStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (scenarioIds: number[]) => {\r\n dispatch(updateLibraryScenarioStart());\r\n return updateScenarioStatusApi('draft', scenarioIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryScenarioSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Scenario has been restored', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryScenarioFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updateScenarioStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchChallengesService = () => {\r\n const dispatch = useDispatch();\r\n const searchChallengesApi = useSearchChallengesApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (searchParams: SearchParams, shouldSetStore = true) => {\r\n const searchChallengesParams =\r\n createSearchLibraryParams(searchParams);\r\n shouldSetStore && dispatch(searchLibraryChallengesStart());\r\n\r\n return searchChallengesApi(searchChallengesParams)\r\n .then(data => {\r\n if (shouldSetStore) {\r\n dispatch(searchLibraryChallengesSuccess(data));\r\n }\r\n\r\n return data.items;\r\n })\r\n .catch((error: ErrorResult) => {\r\n if (shouldSetStore) {\r\n dispatch(searchLibraryChallengesFailure(error.message));\r\n showMessage(error.message, 'error');\r\n }\r\n });\r\n },\r\n [dispatch, searchChallengesApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useDeleteChallengesService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useDeleteChallengesService = () => {\r\n const deleteChallengesApi = useDeleteChallengesApi();\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { number[] } challengeIds\r\n * @param { Function } successCallback\r\n * @returns { Promise }\r\n */\r\n return useCallback(\r\n (challengeIds: number[], successCallback?: () => void) => { \r\n return deleteChallengesApi(challengeIds)\r\n .then(() => {\r\n const message = `${challengeIds.length} ${plural(challengeIds.length, 'Challenge has', 'Challenges have')} been deleted`;\r\n showMessage(message, 'success');\r\n\r\n successCallback?.();\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [deleteChallengesApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useArchiveChallengeService = () => {\r\n const dispatch = useDispatch();\r\n const updateChallengeStatusApi = useUpdateChallengeStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (challengeIds: number[]) => {\r\n dispatch(updateLibraryChallengeStart());\r\n return updateChallengeStatusApi('archive', challengeIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryChallengeSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Challenge has been archived', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryChallengeFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updateChallengeStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useRestoreChallengeService = () => {\r\n const dispatch = useDispatch();\r\n const updateChallengeStatusApi = useUpdateChallengeStatusApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (challengeIds: number[]) => {\r\n dispatch(updateLibraryChallengeStart());\r\n return updateChallengeStatusApi('draft', challengeIds)\r\n .then(data => {\r\n dispatch(\r\n dispatch(updateLibraryChallengeSuccess(data, 'update'))\r\n );\r\n\r\n showMessage('Challenge has been restored', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateLibraryChallengeFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, updateChallengeStatusApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useGenerateChallengeSuccessCallback = () => {\r\n const dispatch = useDispatch();\r\n const history: History<LocationState> = useHistory();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (responses?: Record<string, unknown>) => {\r\n if (!isEmpty(responses)) {\r\n const createChallengeResponse =\r\n (responses?.[CREATE_CHALLENGE_ACTION] as Challenge) ||\r\n undefined;\r\n\r\n if (createChallengeResponse) {\r\n dispatch(\r\n updateLibraryChallengeSuccess(\r\n createChallengeResponse,\r\n 'update'\r\n )\r\n );\r\n\r\n pushModal(\r\n history,\r\n ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE.replace(\r\n ':challengeId',\r\n createChallengeResponse.id!.toString()\r\n )\r\n );\r\n }\r\n }\r\n showMessage('Challenge generated!', 'success');\r\n },\r\n [dispatch, showMessage, history]\r\n );\r\n};\r\n\r\nexport const useUpdateAllScenarioCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (scenarioIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllScenarioCheckedState(scenarioIds, checked, partial)\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateLibraryScenarioCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (scenarioId: number) => {\r\n dispatch(updateLibraryScenarioCheckedState(scenarioId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateAllChallengeCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (challengeId: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllChallengesCheckedState(challengeId, checked, partial)\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateLibraryChallengeCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (challengeId: number) => {\r\n dispatch(updateLibraryChallengeCheckedState(challengeId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateAllPractisSetsCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (practisSetIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllPractisSetsCheckedState(\r\n practisSetIds,\r\n checked,\r\n partial\r\n )\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateLibraryPractisSetsCheckedStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (practisSetId: number) => {\r\n dispatch(updateLibraryPractisSetCheckedState(practisSetId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useDownloadScenarioReportService = () => {\r\n const downloadScenarioReportApi = useDownloadScenarioReportApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (scenarioId: number | string) => {\r\n downloadScenarioReportApi(scenarioId)\r\n .then((data: Scenario) => {\r\n fileDownload(data);\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [downloadScenarioReportApi, showMessage]\r\n );\r\n};\r\n\r\n\r\n/**\r\n * @function useDeleteLibraryLabelTag\r\n * @returns { CallableFunction }\r\n */\r\nexport const useDeleteLibraryLabelTag = () => {\r\n const showMessage = useShowMessage();\r\n const portableLabels = usePortableLabelsState();\r\n\r\n const deleteLabelsFromPractisSet = useDeletePractisSetLabelsApi();\r\n const deleteLabelsFromScenario = useDeleteScenarioLabelApi();\r\n const deleteLabelsFromChallenge = useDeleteChallengeLabelsApi();\r\n\r\n /**\r\n * @function getEntityItemLabels\r\n * @param { number[] } labelIds\r\n * @returns { Label[] }\r\n */\r\n const getEntityItemLabels = useCallback(\r\n (labelIds: number[]) => {\r\n return (\r\n portableLabels.data?.items?.filter(label =>\r\n labelIds.includes(label.id)\r\n ) || []\r\n );\r\n },\r\n [portableLabels]\r\n );\r\n\r\n /**\r\n * @dev Use this to delete label tags from 'practisSet' | 'scenario' | 'challenge' pages.\r\n * @param { number } labelId\r\n * @param { entityData } LibraryEntity\r\n * @param { Function | undefined } successCallback\r\n */\r\n return useCallback(\r\n (\r\n labelId: number,\r\n entityData: LibraryEntity,\r\n successCallback?: () => void\r\n ) => {\r\n const deleteLabelFromLibraryActionList = {\r\n practisSet: deleteLabelsFromPractisSet,\r\n scenario: deleteLabelsFromScenario,\r\n challenge: deleteLabelsFromChallenge,\r\n };\r\n\r\n if (!!labelId) {\r\n const { entityName, entityItem } = entityData;\r\n\r\n const labels = getEntityItemLabels(entityItem?.labels || []);\r\n\r\n const entityRemovedLabels = [];\r\n\r\n if (!isEmpty(labels)) {\r\n const currentLabel = labels.find(\r\n label => label.id === labelId\r\n );\r\n\r\n if (!isEmpty(currentLabel)) {\r\n const children: any[] = [];\r\n findAllChildIds(labels, currentLabel!.id, children);\r\n\r\n if (!!children && !!children.length) {\r\n children.forEach(label => {\r\n entityRemovedLabels.push({\r\n [`${entityName}Id`]: entityItem.id,\r\n labelId: label.id,\r\n });\r\n });\r\n }\r\n\r\n entityRemovedLabels.push({\r\n [`${entityName}Id`]: entityItem.id,\r\n labelId,\r\n });\r\n }\r\n\r\n const deleteLabelFromLibraryAction =\r\n deleteLabelFromLibraryActionList[entityName];\r\n\r\n deleteLabelFromLibraryAction(\r\n entityRemovedLabels as any\r\n ).then(() => {\r\n showMessage('Label removed successfully', 'success');\r\n\r\n successCallback?.();\r\n });\r\n }\r\n }\r\n },\r\n [\r\n deleteLabelsFromChallenge,\r\n deleteLabelsFromPractisSet,\r\n deleteLabelsFromScenario,\r\n getEntityItemLabels,\r\n showMessage,\r\n ]\r\n );\r\n};","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoSearchResult = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 50 50\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M28.318 0C17.465 0 8.636 8.83 8.636 19.682c0 4.753 1.693 9.118 4.508 12.523L0 45.349 2.651 48l13.144-13.145c3.405 2.816 7.77 4.509 12.523 4.509C39.171 39.364 48 30.534 48 19.682 48 8.829 39.17 0 28.318 0zm0 35.615c-8.785 0-15.933-7.148-15.933-15.933S19.533 3.749 28.318 3.749s15.933 7.148 15.933 15.933-7.148 15.933-15.933 15.933zm8.947-22.229l-6.296 6.296 6.296 6.296-2.651 2.65-6.296-6.295-6.296 6.296-2.65-2.651 6.295-6.296-6.296-6.296 2.651-2.65 6.296 6.295 6.296-6.296 2.65 2.651z\"\n transform=\"translate(-821 -544) matrix(-1 0 0 1 869 544)\"\n />\n </svg>\n );\n }\n);\n\nexport default NoSearchResult;\n","import { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\n\nimport { useWithPractisSetsContext } from '../context/useWithPractisSetsContext';\nimport { encapsulateAction } from '../../../../../../store/helpers/encapsulateAction';\nimport { ActionPractisSet } from '../actions';\nimport {\n DEFAULT_PRACTIS_SETS_SCOPE,\n Scope,\n WithPractisSetsScopes,\n} from '../scopes';\n\nexport const useEncapsulatedDispatch = () => {\n const dispatch = useDispatch();\n const { reducerName, scope } = useWithPractisSetsContext();\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithPractisSetsContext.Provider props'\n );\n }\n\n const targetScope = (scope || DEFAULT_PRACTIS_SETS_SCOPE) as Scope;\n if (\n targetScope !== DEFAULT_PRACTIS_SETS_SCOPE &&\n !WithPractisSetsScopes[reducerName]?.includes(targetScope)\n ) {\n throw new Error(\n `Undefined \"${targetScope}\" scope of portablePractisSets. Please check config (WithPractisSetsScopes) for \"${reducerName}\" reducer`\n );\n }\n\n return useCallback(\n <T extends ActionPractisSet>(action: T) => {\n action._scope = targetScope;\n dispatch(encapsulateAction(`${reducerName}/practisSets/`, action));\n },\n [dispatch, reducerName, targetScope]\n );\n};\n","import { useCallback } from 'react';\r\n\r\nimport {\r\n clearAction,\r\n saveAction,\r\n searchFailureAction,\r\n searchSuccessAction,\r\n selectAllAction,\r\n deselectAllAction,\r\n selectPractisSetsAction,\r\n searchStartAction,\r\n resetSelectedAction,\r\n resetAction,\r\n selectMultiplePractisSetsAction,\r\n} from './actions';\r\n\r\nimport { useEncapsulatedDispatch } from './helpers/useEncapsulatedDispatch';\r\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\r\nimport { useDispatch } from 'react-redux';\r\nimport { PractisSets } from '../../../../../constants/interfaces/PractisSets';\r\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\r\nimport { unionWith } from 'lodash';\r\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\r\nimport { NOT_AUTHORIZED_ERROR_MESSAGE } from '../../../../../ui/components/ErrorMessages/constants';\r\nimport { useSearchPractisSetsApi } from '../../../../../api';\r\nimport { createSearchLibraryParams } from '../../../../library/tools';\r\n\r\nexport const useFetchAllPractisSetsService = () => {\r\n const dispatch = useDispatch();\r\n const showMessage = useShowMessage();\r\n const searchPractisSets = useSearchPractisSetsApi();\r\n\r\n return useCallback(\r\n async () => {\r\n dispatch(searchStartAction());\r\n try {\r\n let sp = {\r\n offset: 0,\r\n limit: 20,\r\n orderBy: { field: 'updated_at', asc: false },\r\n } as SearchParams;\r\n let data = {\r\n items: [] as PractisSets[],\r\n count: 0,\r\n } as ListResult<PractisSets>;\r\n do {\r\n const searchPractisSetsParams =\r\n createSearchLibraryParams(sp);\r\n\r\n const prevItems = data.items;\r\n data = await searchPractisSets(searchPractisSetsParams);\r\n data =\r\n sp.offset === 0 || !prevItems\r\n ? data\r\n : {\r\n ...data,\r\n items: unionWith(\r\n prevItems,\r\n data.items,\r\n (i1, i2) => i1.id === i2.id\r\n ),\r\n };\r\n sp = {\r\n ...sp,\r\n offset: Math.min(data.items.length, data.count),\r\n };\r\n } while (\r\n data.items.length < data.count\r\n );\r\n dispatch(searchSuccessAction(data));\r\n } catch (error: any) {\r\n dispatch(searchFailureAction(error.message));\r\n error?.message !== NOT_AUTHORIZED_ERROR_MESSAGE &&\r\n showMessage(error.message, 'error');\r\n }\r\n },\r\n [dispatch, showMessage, searchPractisSets]\r\n );\r\n};\r\n\r\nexport const useClearPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(clearAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSavePractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(saveAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSelectPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n return useCallback(\r\n (ids: number) => {\r\n dispatch(selectPractisSetsAction(ids));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSelectMultiplePractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n return useCallback(\r\n (ids: PractisSetWithDueDate[]) => {\r\n dispatch(selectMultiplePractisSetsAction(ids));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSelectAllPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(\r\n (practisSets: PractisSets[]) => {\r\n dispatch(selectAllAction(practisSets));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useDeselectAllPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(deselectAllAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useResetSelectedPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(resetSelectedAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useResetPractisSets = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(resetAction());\r\n }, [dispatch]);\r\n};\r\n","import { Action } from 'redux';\n\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { Scope } from './scopes';\nimport { PractisSets } from '../../../../../constants/interfaces/PractisSets';\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\n\n//region Types\ntype ReturnTypePractisSetAction<\n T extends (...args: any) => any\n> = ReturnType<T> & ActionPayload;\n\ntype ActionPayload = { _scope?: Scope };\n\nexport type ActionPractisSet<T = any> = Action<T> & ActionPayload;\n\nexport type Actions =\n | ReturnTypePractisSetAction<typeof selectAllAction>\n | ReturnTypePractisSetAction<typeof deselectAllAction>\n | ReturnTypePractisSetAction<typeof resetSelectedAction>\n | ReturnTypePractisSetAction<typeof selectPractisSetsAction>\n | ReturnTypePractisSetAction<typeof selectMultiplePractisSetsAction>\n | ReturnTypePractisSetAction<typeof clearAction>\n | ReturnTypePractisSetAction<typeof saveAction>\n | ReturnTypePractisSetAction<typeof resetAction>;\n\n//endregion\n\nexport const searchStartAction = (): ActionPractisSet<'searchStartPractisSets'> => ({\n type: 'searchStartPractisSets',\n});\n\nexport const searchSuccessAction = (\n result: ListResult<PractisSets>\n): ActionPractisSet<'searchSuccessPractisSets'> & {\n result: ListResult<PractisSets>;\n} => ({\n type: 'searchSuccessPractisSets',\n result,\n});\n\nexport const searchFailureAction = (\n message: string\n): ActionPractisSet<'searchFailurePractisSets'> & { message: string } => ({\n type: 'searchFailurePractisSets',\n message,\n});\n\nexport const selectAllAction = (\n allPractisSets: PractisSets[]\n): ActionPractisSet<'selectAllPractisSets'> & {\n allPractisSets: PractisSets[];\n} => ({\n type: 'selectAllPractisSets',\n allPractisSets,\n});\n\nexport const deselectAllAction = (): ActionPractisSet<'deselectAllPractisSets'> => ({\n type: 'deselectAllPractisSets',\n});\n\nexport const resetSelectedAction = (): ActionPractisSet<'resetSelectedPractisSets'> => ({\n type: 'resetSelectedPractisSets',\n});\n\nexport const selectPractisSetsAction = (\n id: number\n): ActionPractisSet<'selectPractisSets'> & { id: number } => ({\n type: 'selectPractisSets',\n id,\n});\n\nexport const selectMultiplePractisSetsAction = (\n ids: PractisSetWithDueDate[]\n): ActionPractisSet<'selectMultiplePractisSets'> & { ids: PractisSetWithDueDate[] } => ({\n type: 'selectMultiplePractisSets',\n ids,\n});\n\nexport const clearAction = (): ActionPractisSet<'clearPractisSets'> => ({\n type: 'clearPractisSets',\n});\n\nexport const saveAction = (): ActionPractisSet<'savePractisSets'> => ({\n type: 'savePractisSets',\n});\n\nexport const resetAction = (): ActionPractisSet<'resetPractisSets'> => ({\n type: 'resetPractisSets',\n});\n","interface Window {\n attachEvent(event: string, listener: EventListener): boolean;\n detachEvent(event: string, listener: EventListener): void;\n}\n\n/**\n * @description -- dispatch an event --\n * ex: onTriggerEvent('fetchUserData')\n *\n * @function onTriggerEvent\n * @param { string } eventName\n */\nexport function onTriggerEvent(eventName: string) {\n let event;\n if (window.CustomEvent) {\n event = new CustomEvent(eventName);\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(eventName, true, true, undefined);\n }\n window.dispatchEvent(event);\n}\n\n/**\n * @description -- to listen to an event\n * @function onListenEvent\n * @param { string } eventName\n * @param { EventListener } handler\n */\nexport function onListenEvent(eventName: string, handler: EventListener) {\n if (window.addEventListener) {\n window.addEventListener(eventName, handler);\n } else {\n (window as unknown as Window).attachEvent('on' + eventName, handler);\n }\n}\n\n/**\n * @description -- to remove event listener\n * @function onRemoveEvent\n * @param { string } eventName\n * @param { EventListener } handler\n */\nexport function onRemoveEvent(eventName: string, handler: EventListener) {\n if (window.removeEventListener) {\n window.removeEventListener(eventName, handler);\n } else {\n (window as unknown as Window).detachEvent('on' + eventName, handler);\n }\n}\n","export { default as Input } from './view';\n","import CSS from 'csstype';\nimport React, { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\n\nconst StyledActionBox = styled.div``;\n\nexport const OutsideActionBox: React.FC<{\n open: boolean;\n toggleOpen?: Function;\n styles?: CSS.Properties;\n className?: string;\n}> = ({ children, open, toggleOpen, styles, className }) => {\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = (event: any) => {\n if (ref.current && !ref.current.contains(event.target)) {\n if (!!toggleOpen) {\n if (open) toggleOpen(false);\n }\n }\n };\n\n const checkIfInView = (element: any) => {\n var offset = ref.current?.offsetTop || 0 - window.scrollY;\n\n if (offset > window.innerHeight) {\n return false;\n }\n return true;\n }\n\n useEffect(() => {\n open && !checkIfInView(ref.current) && ref.current?.scrollIntoView();\n }, [open]);\n\n useEffect(() => {\n document.addEventListener('click', handleClickOutside);\n return () => {\n document.removeEventListener('click', handleClickOutside);\n };\n });\n\n return (\n <StyledActionBox\n ref={ref}\n style={styles ? styles : undefined}\n className={className}\n >\n {open ? children : ''}\n </StyledActionBox>\n );\n};\n\nexport default OutsideActionBox;\n","import { History } from 'history';\nimport { isPractisAdminRole, isUserRole } from '../../constants/enums';\nimport { UrlBuilder } from '../../tools/url/UrlBuilder';\nimport Storage from '../../services/Storage';\nimport { UserInterface, UserV2 } from '../../constants/interfaces/User';\nimport ROUTES from '../../routes/routes';\nimport { isSharedLink } from './url-helpers';\n\n/**\n * @function setAuthToken - saves user token to Storage if needed\n * @param { UserInterface } userInfo\n * @param { string } token\n * @returns { void }\n */ \nexport const setAuthToken = (\n userInfo: UserInterface | UserV2,\n token: string\n) => {\n const isPractisAdmin = isPractisAdminRole(userInfo.role?.name) && !userInfo.companyId;\n const isUser = isUserRole(userInfo.role?.name);\n if (!isPractisAdmin && !isUser)\n Storage.set('token', token);\n Storage.set('userId', userInfo.id);\n}\n\n/**\n * @function redirectAfterLogin - redirects to a proper page after login\n * @param { History } history\n * @param { UrlBuilder } urlBuilder\n * @param { UserInterface } userInfo\n * @param { string } token\n * @returns { void }\n */ \nexport const redirectAfterLogin = (\n history: History,\n urlBuilder: UrlBuilder,\n userInfo: UserInterface | UserV2,\n token: string,\n redirectTo?: Location\n) => {\n if (isPractisAdminRole(userInfo.role?.name) && !userInfo.companyId) {\n window.location.href = urlBuilder.buildAdminUrl(\n {\n absolute: true,\n query: {\n t: token,\n id: userInfo.id,\n p: Storage.get('apiPlatform')\n }\n }\n );\n } else if (isUserRole(userInfo.role?.name)) {\n if (redirectTo && isSharedLink(redirectTo.pathname)) {\n history.push(ROUTES.BROKEN_SHARED_LINK);\n } else {\n history.push(\n `/trainee-splash/${userInfo.firstName}`\n );\n }\n } else {\n history.push(redirectTo ?? ROUTES.SUBMISSIONS);\n }\n}\n\n/**\n * @function isAuthorized - checks if user has a saved token\n * @returns { boolean }\n */ \nexport const isAuthorized = () =>\n !!Storage.get('token') && !!Storage.get('userId');\n\n/**\n * @function getCurrentUserId\n * @returns { number? }\n */ \nexport const getCurrentUserId = () => {\n const userId = Storage.get('userId');\n if (!!userId)\n return parseInt(userId);\n return null;\n}\n\n/**\n * @function clearAuthData\n */\nexport const clearAuthData = () => {\n Storage.remove('token');\n Storage.remove('userId');\n}","/* eslint-disable no-useless-escape */\nexport const validEmailTLDs = [\n '.com',\n '.net',\n '.org',\n '.edu',\n '.gov',\n '.mil',\n '.aero',\n '.asia',\n '.biz',\n '.cat',\n '.coop',\n '.info',\n '.jobs',\n '.mobi',\n '.museum',\n '.name',\n '.pro',\n '.tel',\n '.travel',\n '.ac',\n '.ad',\n '.ae',\n '.af',\n '.ag',\n '.ai',\n '.al',\n '.am',\n '.an',\n '.ao',\n '.aq',\n '.ar',\n '.as',\n '.at',\n '.au',\n '.aw',\n '.ax',\n '.az',\n '.ba',\n '.bb',\n '.bd',\n '.be',\n '.bf',\n '.bg',\n '.bh',\n '.bi',\n '.bj',\n '.bm',\n '.bn',\n '.bo',\n '.br',\n '.bs',\n '.bt',\n '.bv',\n '.bw',\n '.by',\n '.bz',\n '.ca',\n '.cc',\n '.cd',\n '.cf',\n '.cg',\n '.ch',\n '.ci',\n '.ck',\n '.cl',\n '.cm',\n '.cn',\n '.co',\n '.cr',\n '.cu',\n '.cv',\n '.cx',\n '.cy',\n '.cz',\n '.de',\n '.dj',\n '.dk',\n '.dm',\n '.do',\n '.dz',\n '.ec',\n '.ee',\n '.eg',\n '.er',\n '.es',\n '.et',\n '.eu',\n '.fi',\n '.fj',\n '.fk',\n '.fm',\n '.fo',\n '.fr',\n '.ga',\n '.gb',\n '.gd',\n '.ge',\n '.gf',\n '.gg',\n '.gh',\n '.gi',\n '.gl',\n '.gm',\n '.gn',\n '.gp',\n '.gq',\n '.gr',\n '.gs',\n '.gt',\n '.gu',\n '.gw',\n '.gy',\n '.hk',\n '.hm',\n '.hn',\n '.hr',\n '.ht',\n '.hu',\n '.id',\n '.ie',\n '.il',\n '.im',\n '.in',\n '.io',\n '.iq',\n '.ir',\n '.is',\n '.it',\n '.je',\n '.jm',\n '.jo',\n '.jp',\n '.ke',\n '.kg',\n '.kh',\n '.ki',\n '.km',\n '.kn',\n '.kp',\n '.kr',\n '.kw',\n '.ky',\n '.kz',\n '.la',\n '.lb',\n '.lc',\n '.li',\n '.lk',\n '.lr',\n '.ls',\n '.lt',\n '.lu',\n '.lv',\n '.ly',\n '.ma',\n '.mc',\n '.md',\n '.me',\n '.mg',\n '.mh',\n '.mk',\n '.ml',\n '.mm',\n '.mn',\n '.mo',\n '.mp',\n '.mq',\n '.mr',\n '.ms',\n '.mt',\n '.mu',\n '.mv',\n '.mw',\n '.mx',\n '.my',\n '.mz',\n '.na',\n '.nc',\n '.ne',\n '.nf',\n '.ng',\n '.ni',\n '.nl',\n '.no',\n '.np',\n '.nr',\n '.nu',\n '.nz',\n '.om',\n '.pa',\n '.pe',\n '.pf',\n '.pg',\n '.ph',\n '.pk',\n '.pl',\n '.pm',\n '.pn',\n '.pr',\n '.ps',\n '.pt',\n '.pw',\n '.py',\n '.qa',\n '.re',\n '.ro',\n '.rs',\n '.ru',\n '.rw',\n '.sa',\n '.sb',\n '.sc',\n '.sd',\n '.se',\n '.sg',\n '.sh',\n '.si',\n '.sj',\n '.sk',\n '.uk',\n '.us',\n];\n\nexport const validEmailRegex =\n /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n","import { isEmpty } from 'lodash';\n\nimport { validEmailRegex, validEmailTLDs } from './constants';\n\n/**\n * @description to validate an email address and check if it has a valid domain.\n * @function validateEmail\n * @param { string } email\n * @returns { boolean }\n */\nexport function validateEmail(email: string) {\n if (isEmpty(email)) {\n return true;\n }\n\n if (validEmailRegex.test(email)) {\n // Check if the email domain has a valid TLD\n const domain = email.split('@')[1];\n if (isValidDomain(domain)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @function isValidDomain\n * @param { string } domain\n * @returns { boolean }\n */\nexport function isValidDomain(domain: string) {\n for (let i = 0; i < validEmailTLDs.length; i++) {\n if (domain.endsWith(validEmailTLDs[i])) {\n return true;\n }\n }\n return false;\n}\n\n","import * as Yup from 'yup';\n\nimport { validateEmail } from '../../helpers/functions/validation';\n\nexport const INVALID_EMAIL_ERROR = 'Enter a valid Email Address.';\n\nconst RULES = {\n fullName: Yup.string().max(100, `Name is too long, maximum 100 characters`),\n companyName: Yup.string().max(\n 100,\n `Company Name is too long, maximum 100 characters`\n ),\n companyNameRequired: Yup.string()\n .trim()\n .max(100, `Company Name is too long, maximum 100 characters`)\n .required('Company name is required'),\n companyId: Yup.number(),\n ownerId: Yup.number(),\n accountOwnerName: Yup.string().max(\n 100,\n `Owner Name is too long, maximum 100 characters`\n ),\n firstName: Yup.string()\n .trim()\n .max(35, `The First Name shouldn’t be longer than 35 characters.`)\n .required('First name is required'),\n lastName: Yup.string()\n .trim()\n .max(35, `The Last Name shouldn’t be longer than 35 characters.`)\n .required('Last name is required'),\n username: Yup.string()\n .max(100, 'Username is too long, maximum 100 characters')\n .required('Username is required'),\n password: Yup.string()\n .min(8, 'Password must be 8 characters long.')\n .required('The Password field is required.'),\n loginPassword: Yup.string().required('The Password field is required.'),\n confirmPassword: Yup.string()\n .oneOf(\n [Yup.ref('password'), null],\n 'Password and Confirm Password does not match.'\n )\n .required('Password confirm is required.'),\n currentPassword: Yup.string()\n .min(8, 'Current password must be at least 8 characters long.')\n .required('Current password is required.'),\n email: Yup.string()\n .max(255, 'Email Address is too long, maximum 255 characters.')\n .test('is-valid-email', INVALID_EMAIL_ERROR, value => {\n return validateEmail(value);\n })\n .required('The Email Address field is required.'),\n authEmail: Yup.string()\n .max(255, 'Email Address is too long, maximum 255 characters.')\n .email(INVALID_EMAIL_ERROR)\n .required('The Email Address field is required.'),\n phoneNumber: Yup.string().required('Make sure you enter a phone number.'),\n timezoneId: Yup.number(),\n invitationCode: Yup.string(),\n organization: Yup.string().required('Organization is required'),\n title: Yup.string(),\n role: Yup.string().required('Role is required'),\n iconFile: Yup.mixed()\n .test('fileSize', 'File Size is too large', value => value.size <= 10)\n .test('fileType', 'Unsupported File Format', value =>\n ['jpg, png, svg, jpeg'].includes(value.type)\n ),\n scenario: {\n description: Yup.string()\n .required('Description is required')\n .max(500, 'Maximum characters has reached'),\n instructions: Yup.string()\n .required('instructions is required')\n .max(160, 'Maximum characters has reached'),\n },\n};\n\nexport default RULES;\n","import { countParents } from '../../features/labels/config';\n\nexport const listToTree = <\n T extends {\n id: number;\n children?: T[];\n path?: string;\n parentsCount: number;\n parentId: number | null;\n }\n>(\n list?: T[]\n): T[] => {\n if (!list) {\n return [];\n }\n\n const localList: T[] = JSON.parse(JSON.stringify(list));\n const map: Record<number, number> = {};\n const roots = [];\n let node: T;\n\n for (let i = 0; i < localList.length; i += 1) {\n map[localList[i].id] = i;\n localList[i].children = [];\n }\n for (let i = 0; i < localList.length; i += 1) {\n localList[i].parentsCount = countParents(list[i].path || '');\n node = localList[i];\n\n if (node.parentId && localList[map[node.parentId]]) {\n const children = localList[map[node.parentId]].children;\n if (children) {\n children.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n};\n","import { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\nimport React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { createSelectorContext, selectItemsByIds } from '../../../tools/redux';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\n\n\nexport interface LibraryPractisSetsState {\n data?: ListResult<PractisSets>;\n fullList?: ListResult<PractisSets>;\n selectedPractisSets?: number[];\n assignedPractisSets?: number[];\n separateAssignedPractisSets?: number[];\n searchTerm?: string;\n totalCount?: number;\n loading?: boolean;\n error?: string;\n}\n\nexport type LibraryPractisSetsStateSelector = (\n state: any\n) => LibraryPractisSetsState;\n\nexport const LibraryPractisSetsStateSelectorContext = React.createContext<\n LibraryPractisSetsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useLibraryPractisSetState(): LibraryPractisSetsState {\n return useSelector(useContext(LibraryPractisSetsStateSelectorContext));\n}\n\nexport function selectSelectedPractisSets(state: LibraryPractisSetsState): PractisSets[] {\n return selectItemsByIds<PractisSets>(state?.selectedPractisSets, state?.data?.items);\n}\n\nexport interface UpdatedLibraryPractisSetsState {\n data?: PractisSets;\n updateType?: 'create' | 'update' | 'delete' | 'labels';\n loading?: boolean;\n}\n\nexport const UpdatedLibraryPractisSetsSelectorContext = createSelectorContext<\n UpdatedLibraryPractisSetsState\n>();\n\nexport function useUpdatedLibraryPractisSetsState() {\n return useSelector(useContext(UpdatedLibraryPractisSetsSelectorContext));\n}\n\nexport interface LibraryScenariosState {\n data?: ListResult<Scenario>;\n selectedScenarios?: number[];\n totalCount?: number;\n loading?: boolean;\n error?: string;\n}\n\nexport type LibraryScenariosStateSelector = (\n state: any\n) => LibraryScenariosState;\n\nexport const LibraryScenariosStateSelectorContext = React.createContext<\n LibraryScenariosStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useLibraryScenariosState(): LibraryScenariosState {\n return useSelector(useContext(LibraryScenariosStateSelectorContext));\n}\n\nexport function selectSelectedScenarios(state: LibraryScenariosState): Scenario[] {\n return selectItemsByIds<Scenario>(state?.selectedScenarios, state?.data?.items);\n}\n\nexport interface UpdatedLibraryScenariosState {\n data?: Scenario;\n updateType?: 'create' | 'update' | 'delete' | 'labels';\n loading?: boolean;\n}\n\nexport const UpdatedLibraryScenariosSelectorContext = createSelectorContext<\n UpdatedLibraryScenariosState\n>();\n\nexport function useUpdatedLibraryScenariosState() {\n return useSelector(useContext(UpdatedLibraryScenariosSelectorContext));\n}\n\nexport interface LibraryChallengesState {\n data?: ListResult<Challenge>;\n selectedChallenges?: number[];\n totalCount?: number;\n loading?: boolean;\n error?: string;\n}\n\nexport type LibraryChallengesStateSelector = (\n state: any\n) => LibraryChallengesState;\n\nexport const LibraryChallengesStateSelectorContext = React.createContext<\n LibraryChallengesStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useLibraryChallengesState(): LibraryChallengesState {\n return useSelector(useContext(LibraryChallengesStateSelectorContext));\n}\n\nexport function selectSelectedChallenges(state: LibraryChallengesState): Challenge[] {\n return selectItemsByIds<Challenge>(state?.selectedChallenges, state?.data?.items);\n}\n\nexport interface UpdatedLibraryChallengesState {\n data?: Challenge;\n updateType?: 'create' | 'update' | 'delete' | 'labels';\n loading?: boolean;\n}\n\nexport const UpdatedLibraryChallengesStateSelectorContext = createSelectorContext<\n UpdatedLibraryChallengesState\n>();\n\nexport function useUpdatedLibraryChallengesState(): UpdatedLibraryChallengesState {\n return useSelector(\n useContext(UpdatedLibraryChallengesStateSelectorContext)\n );\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const DownArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 512.011 512.011\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fillRule=\"evenodd\" fill=\"currentColor\">\n <g>\n <path\n d=\"M505.755,123.592c-8.341-8.341-21.824-8.341-30.165,0L256.005,343.176L36.421,123.592c-8.341-8.341-21.824-8.341-30.165,0\n\t\t\ts-8.341,21.824,0,30.165l234.667,234.667c4.16,4.16,9.621,6.251,15.083,6.251c5.462,0,10.923-2.091,15.083-6.251l234.667-234.667\n\t\t\tC514.096,145.416,514.096,131.933,505.755,123.592z\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default DownArrow;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const UpArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 512.011 512.011\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fillRule=\"evenodd\" fill=\"currentColor\">\n <g>\n <path\n d=\"M505.755,358.256L271.088,123.589c-8.341-8.341-21.824-8.341-30.165,0L6.256,358.256c-8.341,8.341-8.341,21.824,0,30.165\n\t\t\ts21.824,8.341,30.165,0l219.584-219.584l219.584,219.584c4.16,4.16,9.621,6.251,15.083,6.251c5.462,0,10.923-2.091,15.083-6.251\n\t\t\tC514.096,380.08,514.096,366.597,505.755,358.256z\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default UpArrow;\n","import { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport { PractisSetWithDueDate } from '../../../constants/interfaces/Draft';\nimport { Roles } from '../../../constants/interfaces/Roles';\n\nexport enum UserRoles {\n USER = 'USER',\n COMPANY_ADMIN = 'COMPANY_ADMIN',\n PRACTIS_ADMIN = 'PRACTIS_ADMIN',\n}\n\nexport const InviteRoleItems = [\n {\n name: UserRoles.USER,\n permissions: NEW_PERMISSIONS.INVITE_USER,\n },\n {\n name: UserRoles.COMPANY_ADMIN,\n permissions: NEW_PERMISSIONS.INVITE_COMPANY_ADMIN,\n },\n];\n\nexport const filterInvitationRolesByPermissions = (\n rolesList: Roles[],\n permissions: NEW_PERMISSIONS[]\n) => {\n return rolesList\n .filter(role => {\n return InviteRoleItems.find(\n item =>\n item.name === role.name &&\n permissions.includes(item.permissions)\n );\n })\n .map(role => {\n return {\n value: role.id,\n name: role.title,\n };\n }).reverse();\n};\n\nexport const invitationRoles = (\n rolesList: Roles[]\n) => {\n return rolesList\n .filter(role => {\n return InviteRoleItems.find(\n item =>\n item.name === role.name\n );\n })\n .map(role => {\n return {\n value: role.id,\n name: role.title,\n };\n }).reverse();\n};\n\nexport const getUserRoleNameById = (\n roleId: number | null,\n rolesList: Roles[]\n): string | undefined => {\n if (!roleId || !rolesList.length) return undefined;\n\n const role = rolesList.find(item => item.id === roleId);\n if (!role) return undefined;\n\n return role.title;\n};\n\nexport const getUserRoleIdByName = (\n roleName: string | null,\n rolesList: Roles[]\n): number | undefined => {\n if (!roleName || !rolesList.length) return undefined;\n\n const role = rolesList.find(item => item.title === roleName);\n if (!role) return undefined;\n\n return role.id;\n};\n\nexport enum UserFields {\n firstName = 'firstName',\n lastName = 'lastName',\n email = 'email',\n role = 'role',\n}\n\nconst UserFieldNames = {\n [UserFields.firstName as string]: 'First Name',\n [UserFields.lastName as string]: 'Last Name',\n [UserFields.email as string]: 'Email',\n [UserFields.role as string]: 'Role',\n};\n\nconst UserFieldValuesByName = {\n [UserFieldNames.firstName as string]: UserFields.firstName,\n [UserFieldNames.lastName as string]: UserFields.lastName,\n [UserFieldNames.email as string]: UserFields.email,\n [UserFieldNames.role as string]: UserFields.role,\n};\n\nexport function UserFieldValueByName(name?: string): string {\n return (name && UserFieldValuesByName[name]) || name || '';\n}\n\nexport enum InvitationEmailErrors {\n isEntryInvalid = 'Please edit before selecting',\n emailExistsInSystem = 'User’s email exists in our system',\n}\n\nexport const handleToggleSelectedItems = (array: any, item: any) => {\n let arrayItems = array ? [...array] : [];\n\n if (arrayItems.includes(item)) {\n arrayItems = arrayItems.filter(x => x !== item);\n } else if (arrayItems.includes(-item)) {\n arrayItems = arrayItems.filter(x => x !== -item);\n arrayItems.push(item);\n } else {\n arrayItems.push(item);\n }\n\n return arrayItems;\n};\n\n/**\n * \n * @function handlepsToggleSelectedItems\n * \n * @param { PractisSetWithDueDate } currentSelectedPractisSets \n * \n * @param { number } practisSetIdToToggle \n * \n * @returns { PractisSetWithDueDate[] }\n */\nexport const handleToggleSelectedItemsForPractisSets = (currentSelectedPractisSets: PractisSetWithDueDate[], practisSetIdToToggle: number) => {\n let filteredPractisSetsToReturn = currentSelectedPractisSets ? [...currentSelectedPractisSets] : [];\n\n if (filteredPractisSetsToReturn.map(x => x.practisSetId).includes(practisSetIdToToggle)) {\n filteredPractisSetsToReturn = filteredPractisSetsToReturn.filter(x => x.practisSetId !== practisSetIdToToggle);\n } else if (filteredPractisSetsToReturn.map(x => x.practisSetId).includes(-practisSetIdToToggle)) {\n filteredPractisSetsToReturn = filteredPractisSetsToReturn.filter(x => x.practisSetId !== -practisSetIdToToggle);\n filteredPractisSetsToReturn.push({ practisSetId: practisSetIdToToggle, dueDate: null });\n } else {\n filteredPractisSetsToReturn.push({ practisSetId: practisSetIdToToggle, dueDate: null });\n }\n\n return filteredPractisSetsToReturn;\n};","import { UserInterface } from './User';\nimport { Script } from './Script';\nimport { Submission } from './Reviews';\n\nexport enum ChallengeStatuses {\n DRAFT = 'DRAFT',\n ACTIVE = 'ACTIVE',\n ARCHIVED = 'ARCHIVED',\n DELETED = 'DELETED',\n}\n\nexport type Status =\n | ChallengeStatuses.DRAFT\n | ChallengeStatuses.ACTIVE\n | ChallengeStatuses.ARCHIVED\n | ChallengeStatuses.DELETED;\n\nexport interface Challenge {\n uniqueId?: string;\n id?: number;\n sourceScenarioId?: number | null,\n type?: 'CHALLENGE';\n title: string;\n description: string;\n instructions: string;\n createdAt?: string;\n updatedAt?: string;\n companyId?: string;\n creatorId?: number;\n submissions?: Submission[];\n status: Status;\n scriptId?: number;\n script: Script;\n creator?: UserInterface;\n checked?: boolean;\n minRepsCount?: number | null;\n labels?: any[];\n updatedLabels?: number[];\n tryLimit: number | null;\n}\n\nexport interface ChallengeSubmission {\n id?: number;\n reviewScore?: number;\n reviewedAt?: string;\n submissionId?: number;\n title?: string;\n}","import { motion } from 'framer-motion';\nimport styled from 'styled-components';\nimport { Input } from '../../../../input';\nimport OutsideActionBox from '../../../../OutsideActionBox/OutsideActionBox';\n\nexport const StyledSelectForm = styled.div<{ disabled?: boolean }>`\n box-sizing: border-box;\n position: relative;\n border-radius: 16px;\n cursor: pointer;\n background: ${props => props.theme.Colors.white};\n color: ${props =>\n !!props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n font-weight: 600;\n height: 100%;\n`;\n\nexport const Wrapper = styled.div`\n width: 272px;\n max-height: 432px;\n min-height: 200px;\n display: flex;\n padding: 16px 8px 0 8px;\n background: ${props => props.theme.Colors.white};\n`;\n\nexport const LabelsContainer = styled(motion.div)<{\n displayOver?: boolean;\n topMargin: number;\n left?: string;\n}>`\n padding: 24px;\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n left: ${props =>\n props.displayOver ? '16px' : !!props.left ? props.left : '0'};\n top: ${props => (props.displayOver ? `-${props.topMargin}px` : '8px')};\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n margin-top: 16px;\n width: 100%;\n padding: 0 8px;\n`;\nexport const CancelButtonWrapper = styled.div`\n margin-right: 16px;\n`;\n\nexport const StyledTitle = styled.div`\n font-size: 20px;\n font-weight: bold;\n width: 100%;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport const StyledDescription = styled.div<{ marginTop?: string }>`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n ${props => !!props.marginTop && `margin-top: ${props.marginTop};`}\n width: 100%;\n`;\n\nexport const StyledButtonContainer = styled.div`\n width: 128px;\n height: 40px;\n\n & > button {\n &:active {\n background: ${props => props.theme.Colors.tomato}!important;\n }\n }\n`;\n\nexport const Bold = styled.span`\n font-weight: 800;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const StyledEmptyLabels = styled.div`\n display: flex;\n padding-top: 8px;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const StyledEmptyLabelsContent = styled.div`\n max-width: 140px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const NoLabelsIcon = styled.div`\n width: 30px;\n height: 40px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 16px;\n`;\n\nexport const NoLabelsTitle = styled.div`\n font-weight: bold;\n font-size: 13px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nexport const NoLabelsDescription = styled.div`\n font-size: 11px;\n color: ${props => props.theme.Colors.cloudyBlue};\n width: 100%;\n white-space: break-spaces;\n`;\n\nexport const NudgeUserStyledDescription = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n margin-top: 13px;\n margin-bottom: 4px;\n width: 100%;\n height: 37px;\n`;\n\nexport const NudgeWarningStyledDescription = styled.div`\n font-size: 15px;\n color: ${props => props.theme.Colors.steelGrey};\n margin-top: 18px;\n padding: 0 10px;\n text-align: center;\n`;\n\nexport const StyledFormArea = styled.div`\n width: 416px;\n`;\n\nexport const StyledActions = styled.div<{ marginTop: number }>`\n width: 272px;\n display: flex;\n justify-content: space-between;\n margin-top: ${props => (props.marginTop ? `${props.marginTop}px` : 0)};\n align-self: flex-end;\n`;\n\nexport const StyledInput = styled(Input)`\n font-family: ${props => props.theme.Fonts.manrope};\n border-radius: 4px;\n background-color: ${props => props.theme.Colors.whiteTwo};\n`;\n\nexport const StyledInputContainer = styled.div`\n margin-bottom: 12px;\n`;\n\nexport const TableAssignOptionsStyledSelectForm = styled.div<{\n height?: number;\n error?: boolean;\n variant: string;\n open?: boolean;\n disabled?: boolean;\n}>`\n box-sizing: border-box;\n position: relative;\n border-radius: 4px;\n min-width: 128px;\n cursor: pointer;\n height: ${props => (props.height ? `${props.height}px` : '40px')};\n width: 100%;\n background: ${props => props.theme.Colors.white};\n color: ${props => props.theme.Colors.black};\n box-shadow: inset 0 0 0 ${props => (props.error ? '2px' : '-1px')} ${props => props.theme.Colors.coral};\n \n -webkit-appearance: none;\n border: ${props =>\n props.open\n ? `1px solid ${props.theme.Colors.cloudyBlue}`\n : `1px solid ${props.theme.Colors.whiteFive}`};\n &.is-disabled {\n cursor: default;\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n`;\n\nexport const Container = styled(OutsideActionBox)`\n position: relative;\n`;\n\nexport const IconHolder = styled.div<{ disabled?: boolean }>`\n width: 8px;\n height: 100%;\n display: flex;\n position: absolute;\n right: 15px;\n top: 0;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n`;\n\n","import { CompanyUserStats } from '../../../constants/interfaces/CompanyUserStats';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport { CompanyVoiceSettings } from '../../../constants/interfaces/CompanyVoiceSettings';\n\nexport const COMPANY_INFO = 'FETCH_COMPANY_INFO';\nexport const COMPANY_INFO_SUCCESS = 'FETCH_COMPANY_INFO_SUCCESS';\nexport const COMPANY_INFO_FAILURE = 'FETCH_COMPANY_INFO_FAILURE';\nexport const RESET_COMPANY_INFORMATION = 'RESET_COMPANY_INFORMATION';\n\nexport enum ACTIONS {\n LOAD_VOICE_SETTINGS_START = 'LOAD_VOICE_SETTINGS_START',\n LOAD_VOICE_SETTINGS_SUCCESS = 'LOAD_VOICE_SETTINGS_SUCCESS',\n LOAD_VOICE_SETTINGS_FAILURE = 'LOAD_VOICE_SETTINGS_FAILURE',\n\n FETCH_COMPANY_ADMINS_START = 'FETCH_COMPANY_ADMINS_START',\n FETCH_COMPANY_ADMINS_SUCCESS = 'FETCH_COMPANY_ADMINS_SUCCESS',\n FETCH_COMPANY_ADMINS_FAILURE = 'FETCH_COMPANY_ADMINS_FAILURE',\n CLEAR_COMPANY_ADMINS = 'CLEAR_COMPANY_ADMINS',\n\n FETCH_COMPANY_USER_STATS_START = 'FETCH_COMPANY_USER_STATS_START',\n FETCH_COMPANY_USER_STATS_SUCCESS = 'FETCH_COMPANY_USER_STATS_SUCCESS',\n FETCH_COMPANY_USER_STATS_FAILURE = 'FETCH_COMPANY_USER_STATS_FAILURE',\n}\n\nexport function fetchCompanyInfo() {\n return {\n type: COMPANY_INFO,\n };\n}\n\nexport function fetchCompanyInfoSuccess(data: any) {\n return {\n type: COMPANY_INFO_SUCCESS,\n data,\n };\n}\n\nexport function fetchCompanyInfoFailure(error: any) {\n return {\n type: COMPANY_INFO_FAILURE,\n error,\n };\n}\n\nexport function loadVoiceSettingsStart() {\n return {\n type: ACTIONS.LOAD_VOICE_SETTINGS_START as ACTIONS.LOAD_VOICE_SETTINGS_START,\n };\n}\n\nexport function loadVoiceSettingsSuccess(voiceSettings: CompanyVoiceSettings[]) {\n return {\n type: ACTIONS.LOAD_VOICE_SETTINGS_SUCCESS as ACTIONS.LOAD_VOICE_SETTINGS_SUCCESS,\n voiceSettings,\n };\n}\n\nexport function loadVoiceSettingsFailure(error: string) {\n return {\n type: ACTIONS.LOAD_VOICE_SETTINGS_FAILURE as ACTIONS.LOAD_VOICE_SETTINGS_FAILURE,\n error,\n };\n}\n\nexport function fetchCompanyAdminsStart() {\n return {\n type: ACTIONS.FETCH_COMPANY_ADMINS_START as ACTIONS.FETCH_COMPANY_ADMINS_START,\n };\n}\n\nexport function fetchCompanyAdminsSuccess(data: UserV2[]) {\n return {\n type: ACTIONS.FETCH_COMPANY_ADMINS_SUCCESS as ACTIONS.FETCH_COMPANY_ADMINS_SUCCESS,\n data,\n };\n}\n\nexport function fetchCompanyAdminsFailure(error: any) {\n return {\n type: ACTIONS.FETCH_COMPANY_ADMINS_FAILURE as ACTIONS.FETCH_COMPANY_ADMINS_FAILURE,\n error,\n };\n}\n\nexport function clearCompanyAdmins() {\n return {\n type: ACTIONS.CLEAR_COMPANY_ADMINS as ACTIONS.CLEAR_COMPANY_ADMINS,\n };\n}\n\n\nexport function fetchCompanyUserStatsStart() {\n return {\n type: ACTIONS.FETCH_COMPANY_USER_STATS_START as ACTIONS.FETCH_COMPANY_USER_STATS_START,\n };\n}\n\nexport function fetchCompanyUserStatsSuccess(data: CompanyUserStats) {\n return {\n type: ACTIONS.FETCH_COMPANY_USER_STATS_SUCCESS as ACTIONS.FETCH_COMPANY_USER_STATS_SUCCESS,\n data,\n };\n}\n\nexport function fetchCompanyUserStatsFailure(error: string) {\n return {\n type: ACTIONS.FETCH_COMPANY_USER_STATS_FAILURE as ACTIONS.FETCH_COMPANY_USER_STATS_FAILURE,\n error,\n };\n}\n\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Pencil = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 12 12\"\n className={className}\n width=\"12\"\n height=\"12\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n fill=\"none\"\n >\n <path \n fillRule=\"evenodd\"\n clipRule=\"evenodd\" \n d=\"M11.364.636a2.173 2.173 0 0 0-3.072 0l-.307.307-.614.614-2.765 2.765L.614 8.313 0 11.385.613 12l3.073-.615.613-.614.615-.613 2.764-2.765.614-.614 3.072-3.072a2.172 2.172 0 0 0 0-3.071zM4.299 9.543l2.765-2.765.614-.614 2.15-2.15L7.987 2.17 5.22 4.935 2.456 7.7l1.843 1.843zM1.842 8.314l-.427.427-.46 2.305 2.303-.462.427-.427-1.843-1.843zM8.6 1.557 10.443 3.4l.307-.307a1.305 1.305 0 0 0 0-1.843 1.305 1.305 0 0 0-1.843 0l-.307.307z\" \n fill=\"#6D7F8C\"/>\n </svg>\n );\n }\n);\n\nexport default Pencil;\n","import React, { FC, useCallback, useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nimport Checkbox from '../../../ui/components/Checkbox';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\nimport { handleToggleSelectedItemsForPractisSets } from '../../../pages/ActionPages/NewUser/tools';\nimport Pencil from '../../../ui/icons/Pencil';\nimport { formatDateWithTimeZone } from '../../../helpers/functions/date-convert';\nimport dayjs from 'dayjs';\nimport { PractisSetWithDueDate } from '../../../constants/interfaces/Draft';\nimport { practisSetWithDueDatesArrayToDueDatesKeyValues } from '../tools';\nimport { DueDateType } from '../../../constants/interfaces/DueDates';\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\nimport { EmptyCellDash } from '../../../ui/components/table-wrapper/table/EmptyCellDash';\nimport { DueDateCalendar } from '../../../ui/components/DueDateCalendar';\n\nconst StyledPractisSetsList = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst TopSideList = styled.span``;\n\nconst GeneralList = styled.span``;\n\nconst PractisSetsItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n flex-direction: row;\n`;\n\nconst PractisSetsItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n width: 100%;\n`;\n\nconst Date = styled.div`\n min-width: 56px;\n`;\n\nconst PencilWrapper = styled.div`\n position: flex;\n transform: translateX(-20px);\n padding-left: 6px;\n padding-right: 6px;\n display: none;\n align-items: center;\n justify-content: center;\n\n height: 26px;\n width: 24px;\n\n background: ${({ theme }) => theme.Colors.whiteFive};\n margin-top: -4px;\n right: 8px;\n cursor: pointer;\n`;\n\nconst DueDateContainer = styled.div`\n display: flex;\n flex-direction: row;\n min-width: 68px;\n max-width: 68px;\n font-size: 13px;\n font-family: 'Manrope';\n color: ${({ theme }) => theme.Colors.black};\n padding: 4px 8px;\n height: 26px;\n margin-right: 4px;\n background: transparent;\n\n &:hover {\n background: ${({theme}) => theme.Colors.whiteFive};\n\n ${PencilWrapper} {\n display: flex;\n }\n }\n\n cursor: default;\n border-radius: 2px;\n`\n\nconst StyledEmpty = styled.span`\n color: ${({ theme }) => theme.Colors.cloudyBlue};\n`\n\nexport const PortablePractisSetsList: FC<{\n practisSets?: PractisSets[];\n selectedPractisSets: PractisSetWithDueDate[];\n disabled?: boolean;\n setPractisSetFilters?: (practisSetId: PractisSetWithDueDate[]) => void;\n dueDateAssignments?: DueDateType;\n onUpdateDueDates?: (dueDates?: DueDateType) => void;\n hideDueDates?: boolean;\n}> = ({ practisSets, selectedPractisSets, setPractisSetFilters, hideDueDates }) => {\n \n const [\n isDueDateCalendarVisible,\n setIsDueDateCalendarVisible,\n ] = useState<boolean>(false);\n const [dueDateData, setDueDateData] = useState<any>();\n const [dueDates, setDueDates] = useState<DueDateType>();\n\n useEffect(() => {\n setDueDates(practisSetWithDueDatesArrayToDueDatesKeyValues(selectedPractisSets));\n }, [selectedPractisSets])\n\n /**\n @function getUserDueDate\n @param { number } practisSetId\n @returns { string | null }\n */\n const getUserDueDate = (practisSetId: number) => {\n const practisSet = practisSets?.find((item) => item.id === practisSetId);\n\n return practisSet?.id &&\n (dueDates?.[practisSet.id])\n ? formatDateWithTimeZone(\n dueDates?.[practisSet.id] as string\n )\n : null;\n }\n \n /**\n @function openDueDatePopup\n @param { number } practisSetId\n @returns { void }\n */\n const openDueDatePopup = async(practisSetId: number) => {\n const dueDate = getUserDueDate(practisSetId);\n \n let type = dueDate ? 'SINGLE' : 'NO_DUEDATE';\n\n const data = {\n count: 1,\n type,\n dueDate\n }\n\n setDueDateData({...data, enrollmentIds: practisSetId});\n setIsDueDateCalendarVisible(true);\n };\n\n /**\n * @function updateDueDate\n * \n * @param { string | null } date \n * \n * @returns { void }\n */\n const updateDueDate = async (date: string | null) : Promise<void> => {\n const { enrollmentIds } = dueDateData;\n \n if(date) {\n const changedDueDates: DueDateType = {};\n\n changedDueDates[enrollmentIds] = date\n setDueDates(prevState => ({...prevState, ...changedDueDates}));\n } else {\n setDueDates((prevState) => {\n if (prevState) {\n prevState[enrollmentIds] = null\n }\n\n return prevState\n })\n }\n\n if (isChecked(enrollmentIds)) {\n setPractisSetFilters?.(selectedPractisSets.map(selectedPractisSet => {\n if (selectedPractisSet.practisSetId === enrollmentIds) {\n return {\n ...selectedPractisSet,\n dueDate: date\n }\n } else {\n return selectedPractisSet;\n }\n }));\n } else {\n setPractisSetFilters?.([ ...selectedPractisSets, {\n practisSetId: enrollmentIds,\n dueDate: date\n }])\n }\n\n setIsDueDateCalendarVisible(false);\n };\n\n const isChecked = useCallback(\n (setId?: number) => {\n return (\n !!selectedPractisSets &&\n !!setId &&\n !!selectedPractisSets.filter(x => x.practisSetId === setId).length\n );\n },\n [selectedPractisSets]\n );\n\n const isPartiallyChecked = useCallback(\n (practisSetId?: number) => {\n return (\n !!selectedPractisSets &&\n !!practisSetId &&\n !!selectedPractisSets.filter(x => x.practisSetId === -Number(practisSetId)).length\n );\n },\n [selectedPractisSets]\n );\n\n const changeHandler = (practisSetId?: number) => {\n if (practisSetId && setPractisSetFilters) {\n setPractisSetFilters(\n handleToggleSelectedItemsForPractisSets(selectedPractisSets, practisSetId)\n );\n }\n };\n\n if (!practisSets || (practisSets && practisSets.length === 0)) return null;\n\n const topListPractisSets = practisSets.filter(\n practisSet =>\n practisSet.id && selectedPractisSets.map(ps => Math.abs(ps.practisSetId)).includes(practisSet.id)\n );\n\n const bottomListPractisSets = practisSets.filter(\n practisSet =>\n practisSet.id && !selectedPractisSets.map(ps => Math.abs(ps.practisSetId)).includes(practisSet.id)\n );\n\n return (\n <StyledPractisSetsList>\n {topListPractisSets.length > 0 && (\n <TopSideList>\n {topListPractisSets.map(practisSet => {\n return (\n <PractisSetsItemWrapper\n key={practisSet.id}\n data-test=\"practisset-item-container\"\n >\n <Checkbox\n size={12}\n checked={\n isChecked(practisSet.id) ||\n isPartiallyChecked(practisSet.id)\n }\n partial={isPartiallyChecked(practisSet.id)}\n handleChange={() =>\n changeHandler(practisSet.id)\n }\n dataTest=\"practisset-item-checkbox\"\n />\n <PractisSetsItem\n onClick={() => changeHandler(practisSet.id)}\n data-test=\"practisset-item-title\"\n >\n {practisSet.name}\n </PractisSetsItem>\n {!hideDueDates && (\n <DueDateContainer data-test=\"due-date-container\">\n <Date data-test=\"due-date-value\">\n {practisSet.id &&\n dueDates?.[practisSet.id] ? (\n formatDateWithTimeZone(\n dueDates[\n practisSet.id\n ] as string\n )\n ) : (\n <EmptyCellDash />\n )}\n </Date>\n <PencilWrapper\n onClick={() =>\n practisSet.id &&\n openDueDatePopup(practisSet.id)\n }\n data-test=\"due-date-edit-button\"\n >\n <Pencil />\n </PencilWrapper>\n </DueDateContainer>\n )}\n </PractisSetsItemWrapper>\n );\n })}\n {topListPractisSets.length < practisSets.length && (\n <TableDivider width=\"98%\" />\n )}\n </TopSideList>\n )}\n <GeneralList>\n {bottomListPractisSets.map(practisSet => {\n return (\n <PractisSetsItemWrapper\n key={practisSet.id}\n data-test=\"practisset-item-container\"\n >\n <Checkbox\n size={12}\n checked={\n isChecked(practisSet.id) ||\n isPartiallyChecked(practisSet.id)\n }\n partial={isPartiallyChecked(practisSet.id)}\n handleChange={() =>\n changeHandler(practisSet.id)\n }\n dataTest=\"practisset-item-checkbox\"\n />\n <PractisSetsItem\n onClick={() => changeHandler(practisSet.id)}\n data-test=\"practisset-item-title\"\n >\n {practisSet.name}\n </PractisSetsItem>\n {!hideDueDates && (\n <DueDateContainer data-test=\"due-date-container\">\n <Date data-test=\"due-date-value\">\n <StyledEmpty>\n {practisSet.id &&\n dueDates &&\n dueDates[practisSet.id] ? (\n dayjs(\n dueDates[\n practisSet.id\n ] as string\n ).format('MM/DD/YY')\n ) : (\n <EmptyCellDash />\n )}\n </StyledEmpty>\n </Date>\n <PencilWrapper\n onClick={() =>\n practisSet.id &&\n openDueDatePopup(practisSet.id)\n }\n data-test=\"due-date-edit-button\"\n >\n <Pencil />\n </PencilWrapper>\n </DueDateContainer>\n )}\n </PractisSetsItemWrapper>\n );\n })}\n </GeneralList>\n {isDueDateCalendarVisible && (\n <DueDateCalendar\n data={{...dueDateData, isSubTitleVisible: false}}\n onCancel={() => setIsDueDateCalendarVisible(false)}\n onApply={updateDueDate}\n />\n )}\n </StyledPractisSetsList>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport EmptyBox from '../../../ui/icons/EmptyBox';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\n\nconst StyledEmptyLabels = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyLabelsContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst NoLabelsIcon = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoPractisSetsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyPractisSets: FC<{ loading?: boolean; isEmpty?: boolean }> = ({\n loading,\n isEmpty,\n}) => {\n if (loading) {\n return (\n <StyledEmptyLabels>\n <Loading />\n </StyledEmptyLabels>\n );\n }\n\n return (\n <StyledEmptyLabels>\n <StyledEmptyLabelsContent>\n <NoLabelsIcon data-test=\"practisset-searchbox-empty-result-icon\">\n {isEmpty ? <EmptyBox /> : <NoSearchResult />}\n </NoLabelsIcon>\n <NoPractisSetsTitle data-test=\"practisset-searchbox-empty-result-label\">\n {isEmpty ? 'No Practis Sets yet' : 'No Practis Sets found'}\n </NoPractisSetsTitle>\n </StyledEmptyLabelsContent>\n </StyledEmptyLabels>\n );\n};\n\nexport default EmptyPractisSets;\n","import { FC, useCallback, useMemo, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { PortablePractisSetsList } from './PortablePractisSetsList';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { Variables } from '../../../theme/variables';\r\nimport { compose } from 'redux';\r\nimport { sortLabels } from '../../labels/tools';\r\nimport { filterPractisSets } from '../tools';\r\nimport EmptyPractisSets from './EmptyPractisSets';\r\nimport {\r\n PractisSets,\r\n PractisSetStatuses,\r\n} from '../../../constants/interfaces/PractisSets';\r\nimport { PractisSetWithDueDate } from '../../../constants/interfaces/Draft';\r\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\n//region Types\r\ntype Action = 'clear' | 'select';\r\n\r\nexport type PortablePractisSetsProps = {\r\n practisSets?: ListResult<PractisSets>;\r\n selectedList: PractisSetWithDueDate[];\r\n onSave?: () => void;\r\n onSelectAll?: (practisSets: PractisSets[]) => void;\r\n onDeselectAll?: () => void;\r\n onClearSelected?: () => void;\r\n onSetSelected?: (practisSetIds: PractisSetWithDueDate[]) => void;\r\n filtersTitle?: string;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n showSave?: boolean;\r\n hideDueDates?: boolean;\r\n className?: string;\r\n selectAllWrapperClassName?: string;\r\n};\r\n//endregion\r\n\r\n//region Styles\r\nconst StyledCreatePractisSets = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst CreatePractisSetsBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst FiltersSavePanel = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst DueDatesSelectedCaption = styled(SelectedCaption)`\r\n width: 68px;\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.black};\r\n font-weight: 600;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst StyledPlainActionsWrapper = styled.div`\r\n padding-right: 15px;\r\n`;\r\n//endregion\r\n\r\nconst PortablePractisSets: FC<PortablePractisSetsProps> = ({\r\n practisSets,\r\n selectedList,\r\n disabled,\r\n loading,\r\n onSave,\r\n onClearSelected,\r\n onDeselectAll,\r\n onSelectAll,\r\n onSetSelected,\r\n filtersTitle,\r\n showSelectActions,\r\n showSearch,\r\n showSave = true,\r\n hideDueDates,\r\n className,\r\n selectAllWrapperClassName,\r\n}) => {\r\n const actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n > = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n };\r\n\r\n const clearHandler = useCallback(() => {\r\n onClearSelected?.();\r\n }, [onClearSelected]);\r\n\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const searchHandler = (value: string) => setSearchTerm(value);\r\n const [processedSelectedList, setProcessedSelectedList] = useState<\r\n PractisSetWithDueDate[]\r\n >([]);\r\n\r\n const processedPractisSets = useMemo(() => {\r\n if (practisSets) {\r\n const result = compose<PractisSets[]>(\r\n filterPractisSets(searchTerm, [PractisSetStatuses.ACTIVE]),\r\n sortLabels\r\n )(practisSets.items);\r\n\r\n if (result.length > 0) {\r\n const processedDataIds = result.map(item => item.id!);\r\n setProcessedSelectedList(\r\n selectedList.filter(item =>\r\n processedDataIds.includes(Math.abs(item.practisSetId))\r\n )\r\n );\r\n }\r\n\r\n return result;\r\n } else {\r\n return [];\r\n }\r\n }, [searchTerm, practisSets, selectedList]);\r\n\r\n const isAllSelected = useMemo(\r\n () => selectedList.length === processedPractisSets?.length,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [selectedList.length]\r\n );\r\n\r\n const toggleAllHandler = useCallback(() => {\r\n if (isAllSelected && onDeselectAll) {\r\n onDeselectAll();\r\n } else if (onSelectAll) {\r\n processedPractisSets.forEach(item => {\r\n item.dueDate =\r\n selectedList.find(\r\n ({ practisSetId }) => practisSetId === item.id\r\n )?.dueDate || null;\r\n });\r\n\r\n onSelectAll(processedPractisSets);\r\n }\r\n }, [\r\n onDeselectAll,\r\n onSelectAll,\r\n isAllSelected,\r\n processedPractisSets,\r\n selectedList,\r\n ]);\r\n\r\n const showNoItems = !practisSets?.count;\r\n const showEmptyState = !processedPractisSets.length || loading;\r\n const selectedPractisSetsLength = selectedList.filter(\r\n ps => ps.practisSetId > 0\r\n ).length;\r\n\r\n return (\r\n <StyledCreatePractisSets className={className}>\r\n <CreatePractisSetsBody>\r\n {filtersTitle && (\r\n <FiltersHeader>\r\n <FilterTitle>{filtersTitle}</FilterTitle>\r\n </FiltersHeader>\r\n )}\r\n {showSearch && (\r\n <SearchWrapper data-test=\"practisset-searchbox-wrapper\">\r\n <TableSearchInput\r\n onChange={searchHandler}\r\n disabled={showNoItems}\r\n dataTest=\"practisset-searchbox-field\"\r\n />\r\n </SearchWrapper>\r\n )}\r\n {showSelectActions && !showNoItems && (\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"practisset-selected-caption\">\r\n {selectedPractisSetsLength > 0\r\n ? `${selectedPractisSetsLength} ${\r\n selectedPractisSetsLength > 1\r\n ? ' Practis Sets selected'\r\n : ' Practis Set selected'\r\n }`\r\n : 'No Practis Sets selected'}\r\n </SelectedCaption>\r\n </div>\r\n <StyledPlainActionsWrapper\r\n className={selectAllWrapperClassName}\r\n >\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n processedSelectedList.length === 0 ||\r\n showEmptyState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"practisset-unselect-all-button\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showEmptyState}\r\n color={actionConfig.select.color}\r\n colorActive={\r\n actionConfig.select.colorActive\r\n }\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={toggleAllHandler}\r\n data-test=\"practisset-select-all-button\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </StyledPlainActionsWrapper>\r\n {!hideDueDates && (\r\n <DueDatesSelectedCaption data-test=\"due-dates-column-title\">\r\n Due Dates\r\n </DueDatesSelectedCaption>\r\n )}\r\n </SelectActions>\r\n )}\r\n {showEmptyState ? (\r\n <EmptyPractisSets\r\n loading={loading}\r\n isEmpty={!practisSets?.count}\r\n />\r\n ) : (\r\n <>\r\n <PortablePractisSetsList\r\n practisSets={processedPractisSets}\r\n selectedPractisSets={selectedList}\r\n disabled={disabled}\r\n setPractisSetFilters={onSetSelected}\r\n hideDueDates={hideDueDates}\r\n />\r\n {onSave && showSave && (\r\n <FiltersSavePanel>\r\n <Button\r\n type={'button'}\r\n label={'Save'}\r\n action={() => onSave()}\r\n height={'48px'}\r\n width={'160px'}\r\n />\r\n </FiltersSavePanel>\r\n )}\r\n </>\r\n )}\r\n </CreatePractisSetsBody>\r\n </StyledCreatePractisSets>\r\n );\r\n};\r\n\r\nexport { PortablePractisSets };\r\n","import React, { FC, useEffect } from 'react';\r\n\r\nimport {\r\n useClearPractisSets,\r\n useDeselectAllPractisSets,\r\n useResetSelectedPractisSets,\r\n useSavePractisSets,\r\n useSelectAllPractisSets,\r\n useSelectMultiplePractisSets,\r\n} from '../store/hors/withPractisSets/services';\r\nimport { usePractisSetsState } from '../store/hors/withPractisSets/states';\r\nimport {\r\n PortablePractisSets,\r\n PortablePractisSetsProps,\r\n} from './PortablePractisSets';\r\nimport { usePortablePractisSetsState } from '../store/states';\r\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\r\n\r\ntype Props = Pick<\r\n PortablePractisSetsProps,\r\n | 'filtersTitle'\r\n | 'onSetSelected'\r\n | 'showSelectActions'\r\n | 'showSearch'\r\n | 'showSave'\r\n> & {\r\n resetSelectedOnUnmount?: boolean;\r\n hideDueDates?: boolean;\r\n className?: string;\r\n selectAllWrapperClassName?: string;\r\n};\r\n\r\nexport const PortablePractisSetsWithStore: FC<Props> = ({\r\n onSetSelected,\r\n resetSelectedOnUnmount = true,\r\n hideDueDates,\r\n ...rest\r\n}) => {\r\n const { selected } = usePractisSetsState();\r\n const { data, loading } = usePortablePractisSetsState();\r\n const clearHandler = useClearPractisSets();\r\n const saveHandler = useSavePractisSets();\r\n const select = useSelectMultiplePractisSets();\r\n const selectAll = useSelectAllPractisSets();\r\n const deselectAll = useDeselectAllPractisSets();\r\n const resetSelected = useResetSelectedPractisSets();\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (resetSelectedOnUnmount) {\r\n resetSelected();\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n \r\n\r\n return (\r\n <PortablePractisSets\r\n practisSets={data}\r\n selectedList={selected}\r\n loading={loading}\r\n onClearSelected={() => {\r\n onSetSelected && onSetSelected([]);\r\n clearHandler();\r\n }}\r\n onSave={saveHandler}\r\n onSetSelected={(team) => { \r\n onSetSelected && onSetSelected(team);\r\n select(team);\r\n }}\r\n onSelectAll={(practisSets: PractisSets[]) => {\r\n selectAll(practisSets);\r\n onSetSelected && onSetSelected([]);\r\n }}\r\n onDeselectAll={() => {\r\n deselectAll();\r\n }}\r\n hideDueDates={hideDueDates}\r\n {...rest}\r\n />\r\n );\r\n};\r\n","import { isEmpty, get as lodashGet, chunk } from 'lodash';\n\n/**\n * @function convertObjectToArrayOfValues\n * @param { Record<string, unknown> } object\n * @returns { unknown[] | null }\n */\nexport const convertObjectToArrayOfValues = (\n object: Record<string, unknown>\n): unknown[] | null => {\n if (isEmpty(object)) {\n return null;\n }\n return Object.entries(object)?.map(item => item[1]);\n};\n\n/**\n * @function calculatePercentage\n * @param { number } totalItems\n * @param { number } currentIndex\n * @returns { number }\n */\nexport const calculatePercentage = (\n totalItems: number,\n currentIndex: number\n): number => +((currentIndex * 100) / totalItems).toFixed(0);\n\n/**\n * @description It creates chunks from input options\n * whether the input is offset it creates chunks of\n * offsets.\n * @function handleCreateChunks\n * @param { Record<string, any> } options\n * @param { string } fieldName\n * @returns { Record<string, any>[] | number[] | null }\n */\nexport const handleCreateChunks = (\n options: Record<string, any>,\n fieldName: string,\n itemPerChunk: number\n) => {\n const totalSelectedItems = lodashGet(options, fieldName, null);\n\n if (Array.isArray(totalSelectedItems)) {\n return chunk(totalSelectedItems, itemPerChunk);\n } else if (typeof totalSelectedItems === 'number') {\n const offsetListArray = [0];\n\n for (let i = 1; i < totalSelectedItems / itemPerChunk; i++) {\n offsetListArray.push(offsetListArray[i - 1] + itemPerChunk);\n }\n\n return offsetListArray;\n }\n\n return null;\n};\n\n","import { SET_PERCENTAGE } from './constants';\nimport { SetPercentageAction } from './types';\n\n/**\n * @function setPercentage\n * @param { number } percentage\n * @returns { SetPercentageAction }\n */\nexport function setPercentage(percentage: number): SetPercentageAction {\n return {\n type: SET_PERCENTAGE,\n percentage: percentage,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { cloneDeep, flatten, isEmpty, update as lodashUpdate } from 'lodash';\n\nimport {\n calculatePercentage,\n convertObjectToArrayOfValues,\n handleCreateChunks,\n} from './helpers';\nimport {\n ActionFunctionOptions,\n ChunkRequestActionInterface,\n ChunkRequestsServiceReturnType,\n} from './types';\nimport { ITEM_PER_CHUNK_SIZE } from './constants';\nimport { setPercentage } from '../store/actions';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\n\n/**\n *\n * @param { ActionFunctionType } actionFunction\n * @param { Record<string, unknown> } actionFunctionOptions -- fieldName can be nested. ex: fieldName: 'teams', ex: fieldName: 'teams.addedMembers'\n * @param { Function } onSuccess\n * @param { Function } onError\n * @param { boolean } shouldStopOnError\n * @returns { ChunkRequestsServiceReturnType }\n */\nexport function useChunkRequestsService<ParametersType>(\n actionList: ChunkRequestActionInterface<ParametersType>[],\n onSuccess?: (responses?: Record<string, unknown>) => void,\n onError?: (\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => void,\n shouldStopOnError = true\n): ChunkRequestsServiceReturnType {\n const dispatch = useDispatch();\n\n const [isStopped, setIsStopped] = useState<boolean>(true);\n\n const isStoppedRef = useRef(true);\n const hasErrorRef = useRef(false);\n const responsesRef = useRef<Record<string, unknown>>({});\n const isIterationFinished = useRef(false);\n\n /**\n * @function handleStartAction\n * @returns { void }\n */\n const handleStartAction = (): void => {\n isStoppedRef.current = false;\n responsesRef.current = {};\n isIterationFinished.current = false;\n handleExecuteActions();\n };\n\n /**\n * @function handleStopAction\n * @returns { void }\n */\n const handleStopAction = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n isStoppedRef.current = true;\n\n setTimeout(() => {\n dispatch(setPercentage(0));\n }, 1000);\n });\n }, [dispatch]);\n\n /**\n * @function handleCallAsyncChunks\n * @param { ChunkRequestActionInterface<ParametersType> } chunkedActionList\n * @param { boolean } isFromChildAction\n * @returns { Promise<void> }\n */\n const handleCallAsyncChunks = async (\n chunkedActionList: ChunkRequestActionInterface<ParametersType>[],\n isFromChildAction = false\n ): Promise<void> => {\n if (chunkedActionList) {\n const chunkedActionListLength = chunkedActionList.length;\n\n for (let index = 0; index < chunkedActionListLength; index++) {\n // to stop the loop if action is stopped\n if (isStoppedRef.current) {\n break;\n } else {\n const {\n actionName,\n actionFunction,\n actionFunctionOptions,\n childActionList = [],\n } = chunkedActionList[index];\n\n const actionFunctionParameters =\n convertObjectToArrayOfValues(\n actionFunctionOptions as any\n );\n\n if (actionFunctionParameters) {\n // use apply to change array to accepted parameters\n // of function\n // ex: ['954', {'id': 54, 'name': 'testUser'}] => (954, {'id': 54, 'name': 'testUser'})\n await actionFunction\n ?.apply?.(document, actionFunctionParameters)\n ?.then(async (response: unknown) => {\n // Pass chunked function responses to the\n // final success callback.\n responsesRef.current[actionName] = response;\n\n // In some cases we can have child actions.\n // Child Actions should be invoked after success of main action.\n // We will pass the response of main action to the child actions.\n if (!isEmpty(childActionList)) {\n // create list of chunks for child action.\n const childChunkedActionList =\n handleCreateChunkedActionList(\n childActionList.map(action => {\n const {\n actionFunctionOptions:\n childActionFunctionOptions,\n } = action; // destruct child action object parameters\n\n const {\n parameters:\n childActionParameters,\n fieldName:\n childActionFieldName,\n secondaryFieldName:\n childActionSecondaryFieldName,\n } = childActionFunctionOptions;\n\n // if the passed value is array of arrays, create chunks by it's inner value\n // otherwise create chunks by array itself.\n const childActionFieldNameValue =\n Array.isArray(\n (\n childActionParameters as any\n )[\n childActionFieldName\n ][0]\n )\n ? (\n childActionParameters as any\n )[\n childActionFieldName\n ][index]\n : (\n childActionParameters as any\n )[\n childActionFieldName\n ];\n\n const processedChildActionList =\n {\n ...action,\n actionFunctionOptions: {\n ...childActionFunctionOptions,\n parameters: {\n ...childActionParameters,\n [childActionFieldName]:\n childActionFieldNameValue,\n [childActionSecondaryFieldName!]:\n response, // Passing response to child action functions.\n },\n },\n };\n\n return processedChildActionList;\n })\n );\n\n if (childChunkedActionList) {\n await handleCallAsyncChunks(\n childChunkedActionList,\n true\n );\n }\n }\n\n if (!isFromChildAction && !isStoppedRef.current) {\n dispatch(\n setPercentage(\n calculatePercentage(\n chunkedActionListLength,\n index + 1\n )\n )\n );\n }\n })\n ?.catch((error: ErrorResult) => {\n if (shouldStopOnError) {\n handleStopAction();\n onError?.(error, responsesRef.current);\n hasErrorRef.current = true;\n } else {\n // Do not stop on errors.\n // Calculate percentage.\n dispatch(\n setPercentage(\n calculatePercentage(\n chunkedActionListLength,\n index + 1\n )\n )\n );\n\n onError?.(error, responsesRef.current);\n }\n });\n }\n }\n\n // It's the last iteration of the main loop.\n if (\n Math.abs(index - chunkedActionListLength) === 1 &&\n !isFromChildAction\n ) {\n isIterationFinished.current = true;\n }\n }\n\n // loop is done -- success section\n if (\n !hasErrorRef.current &&\n isIterationFinished.current &&\n !isStoppedRef.current\n ) {\n handleStopAction();\n onSuccess?.(responsesRef.current);\n }\n }\n };\n\n /**\n * @description To create chunked action list to be passes to async callable function.\n * @function handleCreateChunkedActionList\n * @param { ChunkRequestActionInterface<ParametersType>[] } actionList\n * @returns { ChunkRequestActionInterface<ParametersType>[] }\n */\n const handleCreateChunkedActionList = (\n actionList: ChunkRequestActionInterface<ParametersType>[]\n ): ChunkRequestActionInterface<ParametersType>[] => {\n const chunkedActionList = [];\n\n for (const currentAction of actionList) {\n const {\n actionName = '',\n actionFunction = () => {},\n childActionList = [],\n itemPerChunk = ITEM_PER_CHUNK_SIZE,\n } = currentAction || {};\n\n // to not mutate actionFunctionOptions -- as it's ref under the hood\n const clonedActionFunctionOptions = cloneDeep(\n currentAction?.actionFunctionOptions\n );\n\n if (!isEmpty(clonedActionFunctionOptions)) {\n const { parameters, fieldName } =\n clonedActionFunctionOptions as ActionFunctionOptions<ParametersType>;\n\n const chunkedArrayOfSelectedItems = handleCreateChunks(\n parameters as Object,\n fieldName,\n itemPerChunk\n );\n\n const newChunkedAction = chunkedArrayOfSelectedItems?.map(\n (chunkedItem: any) => ({\n ...{ actionName },\n ...{ actionFunction },\n ...{ childActionList },\n itemPerChunk,\n // modify the arguments of action function\n // in every loop to pass chunked argument\n // to the action function.\n actionFunctionOptions: {\n ...(lodashUpdate(\n cloneDeep(parameters) as Object, // Clone parameters for Mutability\n fieldName,\n () => chunkedItem\n ) as ActionFunctionOptions<ParametersType>),\n },\n })\n );\n\n if (newChunkedAction) {\n chunkedActionList.push(newChunkedAction);\n }\n }\n }\n\n return flatten(chunkedActionList);\n };\n\n /**\n * @description -- handle execute multiple actions\n * @function handleExecuteActions\n * @returns { Promise<void> }\n */\n const handleExecuteActions = async (): Promise<void> => {\n // clear error\n hasErrorRef.current = false;\n\n const chunkedActionList = handleCreateChunkedActionList(actionList);\n\n if (!isEmpty(chunkedActionList)) {\n await handleCallAsyncChunks(chunkedActionList);\n }\n };\n\n useEffect(() => {\n if (isStopped) {\n handleStopAction();\n } else {\n handleStartAction();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isStopped]);\n\n useEffect(() => {\n return () => {\n handleStopAction();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n isStopped,\n setIsStopped,\n };\n}","import styled from 'styled-components';\n\nimport Input from '../../../input/view';\nimport Search from '../../../../icons/Search';\n\nexport const Root = styled.div`\n flex: 3;\n height: 40px;\n max-height: 100%;\n width: 100%;\n`;\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n height: 100%;\n overflow: hidden;\n border-radius: 4px;\n background: ${props => props.theme.Colors.whiteFive};\n border: 1px solid ${props => props.theme.Colors.whiteFive};\n\n &:focus-within {\n border: 1px solid ${props => props.theme.Colors.cloudyBlue};\n }\n`;\n\nexport const InputWrapper = styled.div`\n flex: 1;\n`;\nexport const StyledInput = styled(Input)`\n padding: 0;\n`;\nexport const Icon = styled.div`\n width: 40px;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0 12px 0 16px;\n`;\nexport const SearchIcon = styled(Search)<{ disabled?: boolean }>`\n width: 12px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n`;\n\n","import { useState, useCallback, FC, ChangeEvent, memo, useMemo } from 'react';\nimport { debounce } from 'lodash';\nimport { SEARCH_INPUT_DEBOUNCE_DELAY } from '../../../../../constants/variables/component-settings';\n\nimport {\n Container,\n Root,\n Icon,\n InputWrapper,\n SearchIcon,\n StyledInput,\n} from './style';\nimport { TableSearchInputProps } from './types';\n\nconst TableSearchInput: FC<TableSearchInputProps> = memo(props => {\n const { placeholder, initialValue, onChange, disabled, dataTest, debounceDelay } = props;\n const dataTestOrDefault = dataTest || 'table-search-input';\n\n const [value, setValue] = useState(initialValue || '');\n\n const onChangeDebounced = useMemo(\n () => onChange ? debounce(onChange, debounceDelay ?? SEARCH_INPUT_DEBOUNCE_DELAY) : undefined,\n [onChange, debounceDelay]\n );\n\n /**\n * @function changeHandler\n * @returns { void }\n */\n const changeHandler = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n e.persist();\n const value = e.target.value;\n setValue(prevState => {\n onChangeDebounced?.(value);\n return value;\n });\n },\n [onChangeDebounced]\n );\n\n /**\n * @function clearHandler\n * @returns { void }\n */\n const clearHandler = () => {\n setValue('');\n onChange && onChange('');\n };\n\n return (\n <Root data-test={dataTest}>\n <Container>\n <Icon data-test={`${dataTestOrDefault}-icon`}>\n <SearchIcon disabled={disabled} />\n </Icon>\n <InputWrapper>\n <StyledInput\n placeholder={placeholder}\n handleChange={changeHandler}\n value={value}\n fontSize=\"13px\"\n clearInput={clearHandler}\n height=\"38px\"\n disabled={disabled}\n dataTest={dataTestOrDefault}\n />\n </InputWrapper>\n </Container>\n </Root>\n );\n});\n\nexport default TableSearchInput;\n","import { useState, useEffect } from 'react';\n\nfunction getWindowDimensions() {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n}\n\nexport default function useWindowDimensions() {\n const [windowDimensions, setWindowDimensions] = useState(\n getWindowDimensions()\n );\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowDimensions;\n}\n","import styled from 'styled-components';\n\nexport const StyledFormikField = styled.div`\n width: 100%;\n flex: 1;\n`;\n\nexport const StyledErrorContainer = styled.div<{\n padding?: string;\n color?: string;\n}>`\n color: ${props =>\n !!props.color ? props.color : props.theme.Colors.tomato};\n font-weight: 500;\n font-size: 13px;\n padding: ${props => (props.padding ? props.padding : '8px 5px 0 27px')};\n`;\n\nexport const HintContainer = styled.div<{\n padding?: string;\n color?: string;\n}>`\n color: ${props => (!!props.color ? props.color : 'var(--ps-grey-4)')};\n font-weight: 500;\n font-size: 13px;\n padding: ${props => (props.padding ? props.padding : '8px 5px 0 27px')};\n`;\n\n","import { useEffect, useRef } from 'react';\nimport { getIn } from 'formik';\n\nimport { Input } from '../input';\nimport InputPhone from '../input/PhoneInput/PhoneInput';\nimport { InputProps } from './types';\nimport {\n HintContainer,\n StyledErrorContainer,\n StyledFormikField,\n} from './styles';\n\nconst FormikField = ({\n form,\n field,\n type,\n label,\n height,\n fontSize,\n disabled,\n labelProps,\n autoComplete,\n background,\n labelLeftPosition,\n inputPadding,\n fontFamily,\n errorPadding,\n errorColor,\n hasManualError,\n hideError,\n autoFocus,\n customError,\n hint,\n dataTest,\n ...props\n}: InputProps) => {\n let errorContent;\n const error = getIn(form.errors, field.name) || customError;\n const touch = getIn(form.touched, field.name);\n const inputRef = useRef<any>(null);\n\n useEffect(() => {\n if (autoFocus && inputRef && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus]);\n\n errorContent = touch && error && (\n <StyledErrorContainer\n padding={errorPadding}\n color={errorColor}\n data-test={dataTest && `${dataTest}-error`}\n className={'formik-field-error'}\n >\n {error}\n </StyledErrorContainer>\n );\n\n if (type && type === 'phone') {\n return (\n <StyledFormikField>\n <InputPhone\n {...field}\n field={field}\n type={type ? type : 'text'}\n label={label}\n disabled={disabled}\n error={!!errorContent}\n hasManualError={hasManualError}\n background={background}\n height={height}\n fontSize={fontSize}\n dataTest={dataTest}\n {...props}\n />\n {errorContent}\n </StyledFormikField>\n );\n }\n\n return (\n <StyledFormikField>\n <Input\n {...field}\n field={field}\n ref={inputRef}\n inputPadding={inputPadding}\n type={type ? type : 'text'}\n label={label}\n labelLeftPosition={labelLeftPosition}\n labelProps={labelProps}\n disabled={disabled}\n autoComplete={autoComplete}\n error={!!errorContent}\n background={background}\n height={height}\n fontSize={fontSize}\n fontFamily={fontFamily}\n hideError={hideError}\n dataTest={dataTest}\n {...props}\n />\n {!hideError && errorContent}\n {hint && !errorContent && <HintContainer>{hint}</HintContainer>}\n </StyledFormikField>\n );\n};\n\nexport default FormikField;\n","import { useMemo } from \"react\";\nimport { EnrollmentInterface, EnrollmentStatus } from \"../../../constants/interfaces/Enrollments\";\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { UserInfo } from \"../../../constants/interfaces/UserInfo\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\nimport { UserStatus } from '../../users/store/costants';\n\nexport enum ProgressActions {\n VIEW_PRACTIS_SET_REPORT,\n VIEW_PROFILE,\n NUDGE_USER,\n REMIND_TO_START,\n EXPORT_REPORT,\n UNASSIGN_USER,\n SET_DUEDATE\n}\n\nfunction createProgressActionsHelper(loggedInUser: UserProfile | undefined) {\n const canViewPractisSetReport = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.VIEW_ENROLLMENT);\n \n const canViewProfile = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.VIEW_PROFILE);\n \n const canNudgeUser = (user: UserInfo) =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.SEND_NUDGE)\n && user.status === UserStatus.ACTIVE;\n\n const canChangeDueDate = () => \n hasPermission(loggedInUser, NEW_PERMISSIONS.SET_DUE_DATE)\n \n const canRemindToStart = (trainee: EnrollmentInterface) => {\n return trainee.status !== EnrollmentStatus.COMPLETED\n && hasPermission(loggedInUser, NEW_PERMISSIONS.RESEND_INVITATION)\n && trainee.user.status === UserStatus.ACTIVE\n };\n \n const canExportReport = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET_USER);\n \n const canUnassignUser = () =>\n hasPermission(loggedInUser, NEW_PERMISSIONS.UNASSIGN_ENROLLMENT);\n \n const getBulkActions = (trainees?: EnrollmentInterface[]) => {\n const users = trainees?.map(trainee => trainee.user) ?? [];\n return getBulkActionsAvailability(\n trainees,\n [\n getBulkActionAvailabilityItem(\n ProgressActions.NUDGE_USER,\n users,\n canNudgeUser\n ),\n getBulkActionAvailabilityItem(\n ProgressActions.REMIND_TO_START,\n trainees,\n canRemindToStart\n ),\n getBulkActionAvailabilityItem(\n ProgressActions.EXPORT_REPORT,\n users,\n canExportReport\n ),\n getBulkActionAvailabilityItem(\n ProgressActions.UNASSIGN_USER,\n users,\n canUnassignUser\n ),\n getBulkActionAvailabilityItem(\n ProgressActions.SET_DUEDATE,\n users,\n canChangeDueDate\n ),\n ]\n );\n }\n\n return {\n canViewPractisSetReport,\n canViewProfile,\n canNudgeUser,\n canRemindToStart,\n canExportReport,\n canUnassignUser,\n canChangeDueDate,\n getBulkActions,\n };\n}\n\nexport type ProgressActionsHelper = ReturnType<typeof createProgressActionsHelper>;\n\nexport function useProgressActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createProgressActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import {\n EnrollmentStatus,\n EnrollmentStatusEnum,\n} from '../../../constants/interfaces/Enrollments';\nimport { SearchParams } from '../../../constants/interfaces/filters';\nimport { SearchTeamMembersParams, SearchTeamParams } from '../../../api/teams/types';\nimport { dueDateFiltersValues } from '../../../ui/components/DueDateCalendar/constants';\nimport { SearchTrainingPractisSetProgressParams } from '../../../api/teams/types';\nimport { getSearchSortingValue } from '../../../helpers/functions/search-params-helpers';\nimport { userStatusFilters } from '../../../constants/interfaces/User';\n\nconst enrollmentStatusNames = {\n [EnrollmentStatus.ENROLLED as string]: 'Added',\n [EnrollmentStatus.PENDING as string]: 'Pending',\n [EnrollmentStatus.COMPLETED as string]: 'Completed',\n};\n\nconst enrollmentStatuses = {\n [EnrollmentStatusEnum.IN_PROGRESS as string]: 'In Progress',\n [EnrollmentStatusEnum.PENDING as string]: 'Pending',\n [EnrollmentStatusEnum.COMPLETED as string]: 'Completed',\n};\n\nexport function enrollmentStatusName(status?: string): string {\n return (status && enrollmentStatusNames[status]) || status || '';\n}\n\nexport function getEnrollmentStatusName(status?: string): string {\n return (status && enrollmentStatuses[status]) || status || '';\n}\n\n/**\n * @description converts SearchParams to SearchTeamMembersParams\n * @function createSearchTeamMembersParams\n * @param { SearchParams } searchParams\n * @returns { SearchTeamMembersParams }\n */\nexport const createSearchTeamMembersParams = (searchParams: SearchParams) => {\n const overdueFilter = searchParams.filters?.find(f => f.field === 'hasOverdue');\n const params: SearchTeamMembersParams = {\n userStatus: searchParams.filterByRegistrationStatus?.join(','),\n enrollmentStatus: searchParams.filterByStatus?.join(','),\n isOverdue: overdueFilter?.value ? true : undefined,\n labels: searchParams.labelIDs?.join(','),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true)\n };\n return params; \n}\n\n\nexport const createSearchPractisSetDetailsParams = (sp: SearchParams) => {\n const sortFields = {\n 'firstName': 'user_name',\n 'enrollment.createdAt': 'assigned',\n 'enrollment.enrolledAt': 'started',\n 'enrollment.dueDate': 'due_date',\n 'enrollment.trainingTime': 'training_time',\n 'enrollment.lastTraining': 'last_training',\n 'enrollment.progressValue': 'progress',\n 'enrollment.averageAccuracy': 'accuracy',\n }\n const statusValues = Object.values(userStatusFilters) as string[];\n const params: SearchTrainingPractisSetProgressParams = {\n dueDate: sp.filterByDueDate?.map((item) => dueDateFiltersValues[item as keyof typeof dueDateFiltersValues]).join(','),\n userStatus: sp.filterByRegistrationStatus?.join(','),\n enrollmentStatus: (sp.filterByStatus?.length ? sp.filterByStatus?.map((item) => userStatusFilters[item as keyof typeof userStatusFilters]): statusValues).join(','),\n labels: sp.labelIDs?.join(','),\n limit: sp.limit ?? 20,\n offset: sp.offset ?? 0,\n query: sp.searchTerm,\n sort: sp.orderBy\n ? `${sortFields[sp.orderBy.field as keyof typeof sortFields]}_${sp.orderBy.asc ? 'asc' : 'desc'}`\n : 'user_name_asc',\n };\n \n return params;\n}\n\n/**\n * @description converts SearchParams to SearchTeamMembersParams\n * @function createSearchTeamMembersParams\n * @param { SearchParams } searchParams\n * @returns { SearchTeamParams }\n */\n export const createSearchTeamsParams = (p: SearchParams) => {\n const params: SearchTeamParams = {\n labels: p.labelIDs?.join(','),\n teams: p.teamIds?.join(','),\n leaders: p.teamLeadIds?.join(','),\n limit: p.limit ?? 20,\n offset: p.offset ?? 0,\n query: p.searchTerm,\n sort: getSearchSortingValue(p.orderBy, 'default')\n };\n return params; \n}","import { CSSProperties, FC, memo } from 'react';\nimport styled from 'styled-components';\n\nconst StyledNoResults = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst StyledNoResultsContent = styled.div`\n max-width: 300px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst NoResultsTitle = styled.div<{ width?: string; fontSize?: number }>`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: ${props => (props.fontSize ? `${props.fontSize}px` : '15px')};\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n ${props => !!props.width && `width: ${props.width};`}\n`;\n\nconst NoResultsIcon = styled.div`\n width: 48px;\n height: 48px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nexport const EmptyState: FC<{\n icon?: any;\n iconStyle?: CSSProperties;\n width?: string;\n fontSize?: number;\n dataTest?: string;\n}> = memo(({ icon: Icon, iconStyle, width, fontSize, dataTest, children }) => (\n <StyledNoResults>\n <StyledNoResultsContent>\n {Icon && (\n <NoResultsIcon\n data-test={dataTest && `${dataTest}-icon`}\n style={iconStyle}\n >\n <Icon />\n </NoResultsIcon>\n )}\n <NoResultsTitle\n width={width}\n fontSize={fontSize}\n data-test={dataTest && `${dataTest}-label`}\n >\n {children}\n </NoResultsTitle>\n </StyledNoResultsContent>\n </StyledNoResults>\n));","import NoSearchResult from '../../../../icons/NoSearchResult';\nimport { EmptyState } from '../EmptyState';\nimport { NoSearchResultsProps } from './types';\n\nfunction NoSearchResults(\n { entityName, dataTest }: NoSearchResultsProps\n) {\n return <EmptyState icon={NoSearchResult} dataTest={dataTest}>No {entityName} Found</EmptyState>;\n}\n\nexport default NoSearchResults;","import NoSearchResults from './view'\n\nexport default NoSearchResults;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoFiltersIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 43 40\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <g>\n <path\n d=\"M22.857 0v2.98c3.26.658 5.714 3.518 5.714 6.948 0 3.43-2.454 6.29-5.714 6.949V39.71H20V16.877c-3.26-.658-5.715-3.519-5.715-6.949 0-3.43 2.455-6.291 5.715-6.948V0h2.857zM8.57 0v17.162c3.26.657 5.714 3.518 5.714 6.949 0 3.43-2.454 6.29-5.714 6.948v8.651H5.713V31.06C2.454 30.4 0 27.539 0 24.11c0-3.431 2.454-6.293 5.713-6.949V.001h2.858zM7.143 19.857c-2.367 0-4.286 1.904-4.286 4.255 0 2.348 1.919 4.253 4.286 4.253 2.366 0 4.285-1.905 4.285-4.253 0-2.35-1.919-4.255-4.285-4.255zM37.14 0v22.626h-2.856V0h2.856zM21.428 5.674c-2.367 0-4.285 1.904-4.285 4.254 0 2.35 1.918 4.254 4.285 4.254s4.286-1.904 4.286-4.254c0-2.35-1.92-4.254-4.286-4.254zM32.083 40L30 38.137 34.289 33.795 30 29.451 32.083 27.591 36.25 31.81 40.416 27.591 42.5 29.451 38.21 33.795 42.5 38.137 40.416 40 36.25 35.781z\"\n transform=\"translate(-699 -583) translate(636 583) translate(63)\"\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoFiltersIcon;\n","import NoFiltersIcon from '../../../../icons/NoFiltersIcon';\nimport { EmptyState } from '../EmptyState';\nimport { NoFilterResultsProps } from './types';\n\nfunction NoFilterResultsView({\n icon,\n noFilterText,\n width = '169px',\n dataTest\n}: NoFilterResultsProps) {\n return (\n <EmptyState icon={icon || NoFiltersIcon} width={width} dataTest={dataTest}>\n {noFilterText || 'No Results Match the Filter Criteria'}\n </EmptyState>\n );\n}\n\nexport default NoFilterResultsView;","import NoFilterResults from './view';\n\nexport default NoFilterResults;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const EmptyCalendar = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#ggh0pyd7xa)\">\n <path d=\"M42.97 5.452h-6.067v-2.81c0-.435-.18-.853-.499-1.161A1.733 1.733 0 0 0 35.201 1h-.287c-.451 0-.884.173-1.203.481-.32.308-.498.726-.498 1.161v2.81h-18.45v-2.81c0-.435-.18-.853-.499-1.161A1.733 1.733 0 0 0 13.061 1h-.287c-.451 0-.884.173-1.203.481-.32.308-.498.726-.498 1.161v2.81H6.05c-.544 0-1.065.208-1.45.58-.384.37-.6.873-.6 1.398v37.592c0 .524.216 1.028.6 1.398.385.372.906.58 1.45.58h36.9c.544 0 1.065-.208 1.45-.58.384-.37.6-.874.6-1.398V7.43c0-.521-.213-1.021-.593-1.392a2.087 2.087 0 0 0-1.436-.586zm-1.024 2.967v7.726H7.096V8.42h34.85zM7.096 44.032V19.4h34.85v24.632H7.096z\" fill=\"#B1C0CB\"/>\n <path fill=\"#fff\" d=\"M26 28h19v19H26z\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m30 35 3-3 4.5 4.5L42 32l3 3-4.5 4.5L45 44l-3 3-4.5-4.5L33 47l-3-3 4.5-4.5L30 35z\" fill=\"#B1C0CB\"/>\n </g>\n <defs>\n <clipPath id=\"ggh0pyd7xa\">\n <path fill=\"#fff\" transform=\"translate(4 1)\" d=\"M0 0h41v46H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default EmptyCalendar;\n","import EmptyCalendar from '../../../../icons/EmptyCalendar';\nimport { EmptyState } from '../EmptyState';\nimport { NoCalendarResultsProps } from './types';\n\nfunction NoCalendarResultsView({\n icon,\n noResultsText,\n dataTest\n}: NoCalendarResultsProps) {\n return (\n <EmptyState icon={icon || EmptyCalendar} dataTest={dataTest}>\n {noResultsText || 'There is no data for the selected period'}\n </EmptyState>\n );\n}\n\nexport default NoCalendarResultsView;","import NoCalendarResults from './view';\n\nexport default NoCalendarResults;","import styled from 'styled-components';\n\nexport const Td = styled.td<{\n width?: number;\n clickable?: boolean;\n flex?: { display: string; justifyContent: string; alignItems: string };\n}>`\n height: 55px;\n font-size: 13px;\n font-weight: 400;\n padding: 4px 8px 4px 0px;\n ${props => (props.width ? `width: ${props.width}%` : '')};\n &:hover {\n opacity: ${props => (props.clickable ? 0.7 : 1)};\n }\n ${props =>\n props.clickable &&\n `\n cursor: pointer;\n `}\n &:nth-child(1) {\n padding-left: 16px;\n }\n`;\n","import { FC, memo } from 'react';\n\nimport { EmptyCellDash } from '../EmptyCellDash';\nimport { Td } from './style';\nimport { TableCellProps } from './type';\n\nconst TableCell: FC<TableCellProps> = memo(props => {\n const {\n width,\n colSpan,\n className,\n children,\n onClick,\n shouldShowEmptyCell,\n dataTest,\n } = props;\n\n return (\n <Td\n width={width}\n clickable={!!onClick}\n colSpan={colSpan}\n className={className}\n onClick={onClick}\n data-test=\"table-cell\"\n data-test-custom-name={dataTest}\n >\n {!shouldShowEmptyCell ? (\n children\n ) : (\n <EmptyCellDash />\n )}\n </Td>\n );\n});\n\nexport default TableCell;\n","import { KeyboardArrowUp } from '@material-ui/icons';\nimport styled from 'styled-components';\n\nexport const Th = styled.th<{\n width?: number;\n clickable?: boolean;\n disabled?: boolean;\n isMultiple?: boolean;\n}>`\n font-size: 13px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n font-weight: bold;\n padding: ${props =>\n props.isMultiple ? '12px 8px 12px 0' : '23px 8px 23px 0'};\n text-align: left;\n border-bottom: 1px solid ${props => props.theme.Colors.paleGrey};\n ${props => (props.width ? `width: ${props.width}%` : '')};\n`;\n\nexport const Content = styled.div<{ clickable?: boolean }>`\n display: flex;\n align-items: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: ${props => (props.clickable ? 'pointer' : 'default')};\n pointer-events: none;\n`;\n\nexport const Text = styled.div<{ clickable?: boolean }>`\n display: inline-flex;\n pointer-events: all;\n &:hover {\n opacity: ${props => (props.clickable ? 0.7 : 1)};\n }\n &:active {\n opacity: ${props => (props.clickable ? 0.7 : 1)};\n }\n`;\n\nexport const MultiViewText = styled.div`\n display: flex;\n pointer-events: all;\n\n th {\n display: block;\n padding: 10px 0 0;\n border: none;\n text-align: center;\n }\n`;\n\nexport const EmptyIcon = styled(KeyboardArrowUp)`\n visibility: hidden;\n width: 20px;\n height: 20px;\n`;\n\nexport const IconContainer = styled.div<{ clickable?: boolean }>`\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${props => (!props.clickable ? 'default' : 'pointer')};\n pointer-events: ${props => (props.clickable ? 'all' : 'none')};\n`;\n\nexport const IconWrapper = styled.div`\n width: 8px;\n height: 8px;\n display: flex;\n`;\n\nexport const EmptyArea = styled.span`\n width: 20px;\n height: 20px;\n`;\n\nexport const QuestionIconWrapper = styled.div`\n display: flex;\n align-items: center;\n cursor: pointer;\n pointer-events: all;\n`;\n\nexport const TitleContainer = styled.div<{\n disabled?: boolean;\n titleWidth?: number;\n}>`\n text-align: center;\n width: ${({ titleWidth }) => (titleWidth ? `${titleWidth}%` : '70%')};\n margin: 0 auto;\n border-bottom: 1px solid ${props => props.theme.Colors.paleGrey};\n padding-bottom: 4px;\n display: flex;\n justify-content: center;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n`;\n","import { FC, memo } from 'react';\n\nimport { QuestionTooltip } from '../../../../Tooltip/QuestionTooltip';\nimport { MultiViewText, Th, TitleContainer } from './style';\nimport { TableHeaderCellProps } from './type';\n\nconst TableHeaderCellMultiView: FC<TableHeaderCellProps> = props => {\n const {\n width,\n disabled,\n onClick,\n children,\n className,\n title,\n withTooltip,\n tooltipText,\n isHtmlTooltip,\n titleWidth,\n dataTest\n } = props;\n\n return (\n <Th\n width={width}\n clickable={!!onClick}\n className={className}\n disabled={disabled}\n isMultiple\n data-test={dataTest}\n >\n <TitleContainer titleWidth={titleWidth} disabled={disabled}>\n {' '}\n {title}{' '}\n {withTooltip && tooltipText && (\n <div style={{ cursor: 'pointer' }}>\n <QuestionTooltip\n isHtmlContent={isHtmlTooltip}\n text={tooltipText}\n />\n </div>\n )}\n </TitleContainer>\n <MultiViewText>{children}</MultiViewText>\n </Th>\n );\n};\n\nexport default memo(TableHeaderCellMultiView);\n","import { FC, memo } from 'react';\n\nimport DownArrow from '../../../../../icons/DownArrow';\nimport UpArrow from '../../../../../icons/UpArrow';\nimport { QuestionTooltip } from '../../../../Tooltip/QuestionTooltip';\nimport {\n Content,\n EmptyIcon,\n IconContainer,\n IconWrapper,\n QuestionIconWrapper,\n Th,\n Text,\n} from './style';\nimport { TableHeaderCellProps } from './type';\n\nconst TableHeaderCellSingleView: FC<TableHeaderCellProps> = props => {\n const {\n width,\n asc,\n disabled,\n onClick,\n children,\n className,\n tooltipText,\n withTooltip,\n isHtmlTooltip,\n dataTest\n } = props;\n\n /**\n * @function renderArrow\n * @param { boolean | undefined } asc\n * @returns { JSX.Element }\n */\n const renderArrow = (asc?: boolean): JSX.Element => {\n if (typeof asc === 'boolean') {\n return asc ? (\n <IconContainer clickable={true}>\n <IconWrapper data-test=\"table-column-sorting\">\n <UpArrow />\n </IconWrapper>\n </IconContainer>\n ) : (\n <IconContainer clickable={true}>\n <IconWrapper data-test=\"table-column-sorting\">\n <DownArrow />\n </IconWrapper>\n </IconContainer>\n );\n }\n\n return (\n <IconContainer clickable={false}>\n <EmptyIcon />\n </IconContainer>\n );\n };\n return (\n <Th\n width={width}\n clickable={!!onClick}\n className={className}\n disabled={disabled}\n data-test={dataTest}\n >\n <Content\n clickable={!!onClick && !disabled}\n onClick={() => {\n if (!disabled && onClick) {\n onClick();\n }\n }}\n >\n <Text clickable={!!onClick && !disabled} data-test={dataTest && `${dataTest}-text`}>{children}</Text>\n {withTooltip && tooltipText && (\n <QuestionIconWrapper>\n <QuestionTooltip\n isHtmlContent={isHtmlTooltip}\n text={tooltipText}\n dataTest={dataTest && `${dataTest}-tooltip`}\n />\n </QuestionIconWrapper>\n )}\n\n {!!onClick && renderArrow(asc)}\n </Content>\n </Th>\n );\n};\n\nexport default memo(TableHeaderCellSingleView);\n","import { FC, memo } from 'react';\n\nimport TableHeaderCellMultiView from './multi.view';\nimport TableHeaderCellSingleView from './view';\nimport { TableHeaderCellProps } from './type';\n\nconst TableHeaderCellController: FC<TableHeaderCellProps> = props => {\n const { isMultiple, ...rest } = props;\n\n return isMultiple ? (\n <TableHeaderCellMultiView {...rest} />\n ) : (\n <TableHeaderCellSingleView {...rest} />\n );\n};\n\nexport default memo(TableHeaderCellController);\n\n","import styled from 'styled-components';\n\nexport const ListNameWrapper = styled.div<{ minWidth?: string }>`\n position: relative;\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n margin-right: 8px;\n min-width: ${props => props.minWidth ?? '120px'};\n`;\n\nexport const ListItemName = styled.div`\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n width: 100%;\n position: absolute;\n display: flex;\n align-items: center;\n padding: 4px 0;\n`;\n\nexport const StyledText = styled.span`\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n`;\n\nexport const StyledAdditionalInfo = styled.span`\n font-size: 13px;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.black};\n margin-left: 3px;\n`;\n\nexport const StyledIsNew = styled.span`\n width: 39px;\n height: 25px;\n border-radius: 4px;\n border: solid 1px ${props => props.theme.Colors.mainBlue};\n padding: 4px 7px;\n\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.mainBlue};\n margin-left: 9px;\n margin-right: 20px;\n`;\n","import { FC } from 'react';\n\nimport {\n ListItemName,\n ListNameWrapper,\n StyledAdditionalInfo,\n StyledIsNew,\n StyledText,\n} from './styles';\nimport { TableTitleOverflowTextProps } from './types';\n\nconst TableTitleOverflowText: FC<TableTitleOverflowTextProps> = ({\n isCurrent,\n isNew,\n children,\n renderIcon,\n dataTest,\n minWidth\n}) => {\n return (\n <ListNameWrapper minWidth={minWidth}>\n <ListItemName data-test={dataTest}>\n <StyledText\n title={typeof children === 'string' ? children : ''}\n >\n {children}\n </StyledText>\n {isCurrent && (\n <StyledAdditionalInfo>(You)</StyledAdditionalInfo>\n )}\n {renderIcon && renderIcon}\n {isNew && <StyledIsNew>New</StyledIsNew>}\n </ListItemName>\n </ListNameWrapper>\n );\n};\n\nexport default TableTitleOverflowText;\n","import { ALL_FILTER_VALUE } from '../../constants/interfaces/filters';\n\nexport const distinct = (array: any, field: string) => {\n return array.filter(\n (item: any, index: number, arr: any) =>\n arr.findIndex((t: any) => t[field] === item[field]) === index\n );\n};\n\nexport const appendAllFilterValue = (array: any) => {\n return [{ name: 'All', value: ALL_FILTER_VALUE }, ...array];\n};\n\nexport const toggleItemInArray = (array: any, item: any) => {\n let arrayItems = array ? [...array] : [];\n\n if (arrayItems.includes(item)) {\n arrayItems = arrayItems.filter(x => x !== item);\n } else {\n arrayItems.push(item);\n }\n\n return arrayItems;\n};\n\nexport const appendIfEmpty = (array: any, item: any) => {\n let arrayItems = array ? [...array] : [];\n\n if (!arrayItems.includes(item)) {\n arrayItems.push(item);\n }\n\n return arrayItems;\n};\n\nexport const removeItemFromArray = (array: any, item: any) => {\n let arrayItems = array ? [...array] : [];\n\n if (arrayItems.includes(item)) {\n arrayItems = arrayItems.filter(x => x !== item);\n }\n\n return arrayItems;\n};\n\nexport const combineArray = (list: any[], size: number) => {\n const matrix: any = [];\n let i;\n let k;\n\n for (i = 0, k = -1; i < list.length; i++) {\n if (i % size === 0) {\n k++;\n matrix[k] = [];\n }\n\n matrix[k].push(list[i]);\n }\n\n return matrix;\n};","import styled from 'styled-components';\n\nexport const EmptyCellSpan = styled.span`\n color: var(--ps-grey-2);\n`;","import { EMPTY_CELL } from '../../constants';\nimport { EmptyCellSpan } from './styles';\n\nconst EmptyCellDash = () =>\n <EmptyCellSpan data-test=\"empty-dash\">{EMPTY_CELL}</EmptyCellSpan>;\n\nexport default EmptyCellDash;","import { SearchParams } from \"../../../constants/interfaces/filters\";\n\nexport enum ACTIONS {\n SET_SEARCH_STATE = 'SET_SEARCH_STATE',\n DELETE_SEARCH_STATE = 'DELETE_SEARCH_STATE',\n SET_SECONDARY_SEARCH_STATE = 'SET_SECONDARY_SEARCH_STATE',\n DELETE_SECONDARY_SEARCH_STATE = 'DELETE_SECONDARY_SEARCH_STATE',\n}\n\nexport function setSearchState(key: string, childrenKeys: string[], params?: SearchParams ) {\n return {\n type: ACTIONS.SET_SEARCH_STATE as ACTIONS.SET_SEARCH_STATE,\n key,\n params,\n childrenKeys\n };\n}\n\nexport function deleteSearchState() {\n return {\n type: ACTIONS.DELETE_SEARCH_STATE as ACTIONS.DELETE_SEARCH_STATE\n };\n}\n\n\nexport function setSecondarySearchState(key: string, params?: SearchParams) {\n return {\n type: ACTIONS.SET_SECONDARY_SEARCH_STATE as ACTIONS.SET_SECONDARY_SEARCH_STATE,\n key,\n params\n };\n}\n\nexport function deleteSecondarySearchState( params?: SearchParams) {\n return {\n type: ACTIONS.DELETE_SECONDARY_SEARCH_STATE as ACTIONS.DELETE_SECONDARY_SEARCH_STATE,\n params\n };\n}","export enum DueDateFilters {\n NO_DUEDATE = 'NO_DUEDATE',\n OVERDUE = 'OVERDUE',\n ASSIGNED = 'ASSIGNED',\n}\n\nexport type DueDateType = {\n [id: number]: string | null;\n};\n\nexport const DATE_FORMAT = 'YYYY-MM-DD';\n","export const NOT_AUTHORIZED_ERROR_MESSAGE =\n 'You are not authorized to perform this action.';\nexport const TOKEN_EXPIRED = 'Token Expired';\nexport const USER_NOT_FOUND = 'This user wasn’t found.';\nexport const TEAM_NAME_ALREADY_EXISTS = 'Entity \"team:name\" already exists';\nexport const PHONE_ALREADY_EXISTS = 'Entity \"phone:number\" already exists';\nexport const PRACTIS_SET_ALREADY_EXISTED_ERROR_MESSAGE =\n 'Practis Set with this name already exists!';\n\n//Map for client side error messages\nexport const CLIENT_SIDE_ERROR_MESSAGE = {\n [TOKEN_EXPIRED]:\n 'This link has expired. Click “Forgot Password?†again to try again.',\n [USER_NOT_FOUND]:\n \"That account doesn't exist. Enter a different email address.\",\n [TEAM_NAME_ALREADY_EXISTS]: 'Entered name already exists.',\n [PHONE_ALREADY_EXISTS]:\n 'Oops. Someone else already registered with this number',\n [PRACTIS_SET_ALREADY_EXISTED_ERROR_MESSAGE]:\n 'Practis Set with this name already exists!',\n} as Record<string, string>;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ArrowRight = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 9 14\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n d=\"M25 21L32 28 25 35\"\n transform=\"translate(-24 -21)\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default ArrowRight;\n","export function selectItemsByIds<TItem extends { id?: number }>(\n itemIds: number[] | undefined,\n items: TItem[] | undefined\n): TItem[] {\n return !!items?.length && !!itemIds?.length\n ? items.filter(i => i.id && itemIds.includes(i.id))\n : [];\n}\n","import { createContext } from 'react';\n\nexport * from './selectors';\n\nexport function createSelectorContext<TState>() {\n return createContext<(state: any) => TState>(() => {\n throw new Error('Not implemented');\n });\n}\n","import { UserProfile } from '../../../constants/interfaces/User';\n\nexport const USER_PROFILE = \"FETCH_USER_PROFILE\";\nexport const USER_PROFILE_SUCCESS = \"FETCH_USER_PROFILE_SUCCESS\";\nexport const USER_PROFILE_FAILURE = \"FETCH_USER_PROFILE_FAILURE\";\nexport const UPDATE_USER_PROFILE = \"UPDATE_USER_PROFILE\";\nexport const UPDATE_USER_PROFILE_SUCCESS = \"UPDATE_USER_PROFILE_SUCCESS\";\nexport const UPDATE_USER_PROFILE_FAILURE = \"UPDATE_USER_PROFILE_FAILURE\";\nexport const RESET_PROFILE_INFORMATION = \"RESET_PROFILE_INFORMATION\";\n\nexport function fetchUserProfile() {\n return {\n type: USER_PROFILE\n }\n}\n\nexport function fetchUserProfileSuccess(data: UserProfile) {\n return {\n type: USER_PROFILE_SUCCESS,\n data\n }\n}\n\nexport function fetchUserProfileFailure(error: any) {\n return {\n type: USER_PROFILE_FAILURE,\n error\n }\n}\n\nexport function updateUserProfile() {\n return {\n type: UPDATE_USER_PROFILE\n }\n}\n\nexport function updateUserProfileSuccess(data: any) {\n return {\n type: UPDATE_USER_PROFILE_SUCCESS,\n data\n }\n}\n\nexport function updateUserProfileFailure(error: any) {\n return {\n type: UPDATE_USER_PROFILE_FAILURE,\n error\n }\n}\n\nexport function resetProfileInfo() {\n return {\n type: RESET_PROFILE_INFORMATION,\n }\n}","import { PractisWebMode } from '../../constants/enums';\nimport { storageKeys } from '../../constants/variables/general';\nimport Storage from '../../services/Storage';\n\n/**\n * @description To detect the portal mode: 'WEB' | 'ADMIN'\n * @function isAdminPortal\n * @returns { boolean }\n */\nexport function isAdminPortal() {\n const practisWebMode = Storage.get(storageKeys.PRACTIS_WEB);\n if (\n practisWebMode &&\n practisWebMode === String(PractisWebMode['ADMIN_PORTAL'])\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * @description To detect user OS\n * @function getOS\n * @returns { string }\n */\nexport function getOS() {\n const platform = window.navigator.platform;\n const osMap = {\n Mac: 'Mac OS',\n Win: 'Windows',\n Linux: 'Linux',\n };\n const os =\n Object.keys(osMap).find(key => platform.includes(key)) || 'Unknown';\n return os;\n}\n\nexport function isProductionEnvironment () {\n return process.env.REACT_APP_DEV_ENV === 'prod';\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\ntype CloseType = 'thin' | 'solid';\n\nexport const Close = forwardRef<\n SVGSVGElement,\n IconProps & { type?: CloseType }\n>(({ className, shadow, type = 'solid' }, ref) => {\n const iconContent: Record<CloseType, JSX.Element> = {\n solid: (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 492 492\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n width=\"100%\"\n height=\"100%\"\n >\n <path\n d=\"M300.188,246L484.14,62.04c5.06-5.064,7.852-11.82,7.86-19.024c0-7.208-2.792-13.972-7.86-19.028L468.02,7.872\n\t\t\tc-5.068-5.076-11.824-7.856-19.036-7.856c-7.2,0-13.956,2.78-19.024,7.856L246.008,191.82L62.048,7.872\n\t\t\tc-5.06-5.076-11.82-7.856-19.028-7.856c-7.2,0-13.96,2.78-19.02,7.856L7.872,23.988c-10.496,10.496-10.496,27.568,0,38.052\n\t\t\tL191.828,246L7.872,429.952c-5.064,5.072-7.852,11.828-7.852,19.032c0,7.204,2.788,13.96,7.852,19.028l16.124,16.116\n\t\t\tc5.06,5.072,11.824,7.856,19.02,7.856c7.208,0,13.968-2.784,19.028-7.856l183.96-183.952l183.952,183.952\n\t\t\tc5.068,5.072,11.824,7.856,19.024,7.856h0.008c7.204,0,13.96-2.784,19.028-7.856l16.12-16.116\n\t\t\tc5.06-5.064,7.852-11.824,7.852-19.028c0-7.204-2.792-13.96-7.852-19.028L300.188,246z\"\n />\n </g>\n </svg>\n ),\n thin: (\n <svg\n ref={ref}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 12 12\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n d=\"M0 0H12V12H0z\"\n transform=\"translate(-636 -150) translate(636 150)\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n d=\"M10.902 1.098c.116.115.129.295.039.424l-.039.047L6.471 6l4.431 4.431c.13.13.13.341 0 .471-.115.116-.295.129-.425.039l-.046-.039L6 6.471l-4.431 4.431c-.13.13-.341.13-.471 0-.116-.115-.129-.295-.039-.424l.039-.047L5.529 6 1.098 1.569c-.13-.13-.13-.341 0-.471.115-.116.295-.129.425-.039l.046.039L6 5.529l4.431-4.431c.13-.13.341-.13.471 0z\"\n transform=\"translate(-636 -150) translate(636 150)\"\n />\n </g>\n </svg>\n ),\n };\n\n return iconContent[type];\n});\n\nexport default Close;\n","export interface EnvironmentConfig {\n API_BASE_URL: string;\n API_V2_BASE_URL: string;\n API_CLIENT: string;\n ADMIN_PORTAL_BASE_URL: string;\n COMPANY_PORTAL_BASE_URL: string;\n CHATGPT_API_KEY: String;\n NEW_RELIC_LICENSE_KEY: string;\n NEW_RELIC_APP_ID: string;\n APP_VERSION: string;\n COMMIT_ID?: string;\n BUILD_ID?: string;\n S3_FILES_BASE_URL?: string;\n API_SOCKET_ENDPOINT: string;\n googleClientId: string;\n ELEVEN_LABS_KEY: string;\n}\n\nexport interface EnvironmentConfigs {\n default: EnvironmentConfig;\n local: Partial<EnvironmentConfig>;\n dev: Partial<EnvironmentConfig>;\n beta: Partial<EnvironmentConfig>;\n prod: Partial<EnvironmentConfig>;\n [index: string]: Partial<EnvironmentConfig>;\n}\n\nexport function buildConfig(configs: EnvironmentConfigs): EnvironmentConfig {\n const envName = process.env.REACT_APP_DEV_ENV;\n return Object.assign(\n configs.default,\n (envName ? configs[envName] : {}) || {},\n {\n COMMIT_ID: process.env.REACT_APP_COMMIT_ID,\n BUILD_ID: process.env.REACT_APP_BUILD_ID,\n }\n );\n}\n//TODO: [MM]: Refactor: replace everything below with React Context API\n\nvar _config: EnvironmentConfig;\n\nexport function registerConfig(config: EnvironmentConfig) {\n _config = config;\n}\n\nexport function getConfig(): EnvironmentConfig {\n return _config;\n}\n","import { AppState } from '../../../../../store/reducers';\r\n\r\nexport type Scope = typeof DEFAULT_LABELS_SCOPE | string;\r\n\r\nexport const DEFAULT_LABELS_SCOPE = 'primary';\r\n\r\nexport const WithLabelsScopes: Partial<Record<keyof AppState, Scope[]>> = {\r\n draftEdit: ['assignFilters', 'addNewUser', 'editUser'],\r\n performance: ['assignFilters', 'addNewUser', 'editUser'],\r\n teamEdit: [\r\n 'allUsers',\r\n 'teamMembers',\r\n 'defaultTeamMembers',\r\n 'assignTeamMembers',\r\n ],\r\n teams: ['applyLabels', 'assignLabels'],\r\n teamMembers: ['assignLabels'],\r\n practisSetsTraining: ['assignLabels'],\r\n practisSet: ['applyLabels'],\r\n};\r\n","import lodash from 'lodash';\n\nimport { PractisSets, EnrollmentPractisSet } from '../../constants/interfaces/PractisSets';\nimport { useCallback } from 'react';\nimport { PractisSetWithDueDate } from '../../constants/interfaces/Draft';\nimport { DueDateType } from '../../constants/interfaces/DueDates';\n\nexport const filterPractisSets = (term: string, statuses?: string[]) => (\n practisSets: PractisSets[]\n): PractisSets[] => {\n let filteredItems = [...practisSets];\n if (statuses && statuses.length) {\n filteredItems = filteredItems.filter(item =>\n statuses.includes(item.status)\n );\n }\n\n if (!term) {\n return filteredItems;\n }\n\n return filteredItems.filter(\n item => item.name.toLowerCase().indexOf(term.toLowerCase()) !== -1\n );\n};\n\ntype Entity = {\n id: number;\n practisSetIDs: PractisSetWithDueDate[];\n practisSets: PractisSetWithDueDate[];\n roleId: number;\n};\n\nexport const useCalculatePreSelectedPractisSets = () => {\n return useCallback((selectedItems: number[], entity: Entity[]) => {\n let countSelectedItems: Record<number, number> = {};\n let outputArray: number[] = [];\n\n const filteredEntities = entity.filter(entityItem => {\n return selectedItems.includes(entityItem.id);\n });\n for (let entity of filteredEntities) {\n for (let practisSetId of entity.practisSets) {\n countSelectedItems[practisSetId.practisSetId] =\n countSelectedItems[practisSetId.practisSetId] + 1 || 1;\n }\n }\n\n for (const practisSetId in countSelectedItems) {\n if (countSelectedItems[practisSetId] === selectedItems.length) {\n outputArray.push(Number(practisSetId));\n } else {\n outputArray.push(-Number(practisSetId));\n }\n }\n\n return outputArray;\n }, []);\n};\n\n\n/**\n * @function isAllPractisSetHaveEqualDueDates\n * @param { PractisSetWithDueDate[] } practisSets \n * @returns { boolean}\n */\nconst isAllPractisSetHaveEqualDueDates = (\n practisSets: PractisSetWithDueDate[]\n): boolean => {\n const firstPractisSet = practisSets[0];\n\n return practisSets.every(item => item?.dueDate === firstPractisSet.dueDate);\n};\n\n\n/**\n * @function useFindPractisSetDueDate\n * @param { PractisSetWithDueDate[] } selectedPractisSets\n * @param { number } practisSetId\n * @returns { string | null }\n */\nexport const useFindPractisSetDueDate = <T extends Entity>() => {\n return useCallback(\n (\n selectedItems: number[],\n entity: T[],\n practisSetId: number\n ): string | null => {\n const filteredEntities = entity.filter(entityItem => {\n return selectedItems.includes(entityItem.id);\n });\n\n const selectedItemsPractisSets = filteredEntities.map(\n entityItem => entityItem.practisSets\n );\n\n const selectedItemsArray = lodash.flatten(selectedItemsPractisSets);\n\n const filteredSelectedItemsArray = selectedItemsArray?.filter(\n practisSet => practisSet.practisSetId === Math.abs(practisSetId)\n );\n\n // more than one result without same due date\n if (\n filteredSelectedItemsArray?.length > 1 &&\n !isAllPractisSetHaveEqualDueDates(filteredSelectedItemsArray)\n ) {\n return null;\n } else {\n return (\n filteredSelectedItemsArray.find(item => item?.dueDate)\n ?.dueDate ?? null\n );\n }\n },\n []\n );\n};\n\nexport const useCalculateDeletedPractisSets = () => {\n return useCallback((assignedPractisSets: number[], initialPractisSets: number[]) => {\n const deletedPractisSets: number[] = [];\n\n for (let practisSet of initialPractisSets) {\n if (\n !assignedPractisSets.includes(practisSet) &&\n !assignedPractisSets.includes(-practisSet)\n ) {\n deletedPractisSets.push(\n practisSet < 0 ? -practisSet : practisSet\n );\n }\n }\n\n return deletedPractisSets;\n }, []);\n};\n\n/**\n * useCalculateDeletedEnrollments\n * @returns Callable function\n */\nexport const useCalculateDeletedEnrollments = () => {\n return useCallback((enrollmentsData, assignedPractisSets: number[], initialPractisSets: number[]) => {\n const deletedPractisSets: number[] = lodash.xor(assignedPractisSets, initialPractisSets);\n const deletedEnrollmentIds: number[] = []\n \n enrollmentsData.forEach((pset: PractisSets) => {\n if (deletedPractisSets.includes(pset.id as number)) {\n deletedEnrollmentIds.push(pset.enrollmentId as number)\n }\n });\n\n return deletedEnrollmentIds;\n }, []);\n};\n\n/**\n * Returns created and updated enrollments lists with dueDate\n * @param enrollmentsData PractisSets[]\n * @param assignedPractisSets PractisSetWithDueDate[]\n * @param initialPractisSets PractisSetWithDueDate[]\n * @returns addedPractisSets, updatedEnrollments \n */\nexport const calculateCreatedUpdatedEnrollmentIds = (\n enrollmentsData: EnrollmentPractisSet[], \n assignedPractisSets: PractisSetWithDueDate[], \n initialPractisSets: PractisSetWithDueDate[]\n) => {\n const addedPractisSets: PractisSetWithDueDate[] = [];\n const updatedEnrollments = [];\n \n for (let practisSet of assignedPractisSets) {\n const existingItem = initialPractisSets.find(\n item =>\n item.practisSetId === practisSet.practisSetId\n );\n\n if (!existingItem) {\n addedPractisSets.push(practisSet);\n } else if (existingItem.dueDate !== practisSet.dueDate) {\n const enrollmentId = enrollmentsData.find((pset) => pset.id === practisSet.practisSetId)?.enrollmentId;\n updatedEnrollments.push({\n enrollmentId: enrollmentId as number,\n dueDate: practisSet.dueDate\n })\n }\n }\n\n return { addedPractisSets, updatedEnrollments };\n}\n\n/**\n *\n * @function practisSetWithDueDatesArrayToDueDatesKeyValues\n *\n * @param { PractisSetWithDueDate[] } practisSetsWithDueDates\n *\n * @returns { DueDateType }\n */\nexport const practisSetWithDueDatesArrayToDueDatesKeyValues = (\n practisSetsWithDueDates: PractisSetWithDueDate[]\n) => {\n const dueDates: DueDateType = {};\n\n const keys = practisSetsWithDueDates.map(x => x.practisSetId);\n\n keys.forEach(key => {\n dueDates[Math.abs(key)] =\n practisSetsWithDueDates?.filter(x => x.practisSetId === key)[0]\n ?.dueDate ?? '';\n });\n\n return dueDates;\n};\n\n","import styled from 'styled-components';\n\nexport const Tr = styled.tr<{ clickable?: boolean }>`\n ${props =>\n props.clickable &&\n `\n cursor: pointer;\n `}\n\n &.is-default {\n font-weight: 500;\n }\n`;\n\n","import { FC, memo } from 'react';\n\nimport { Tr } from './style';\nimport { TableRowProps } from './type';\n\nconst TableRow: FC<TableRowProps> = memo(props => {\n const { children, className, onClick, innerRef, dataTest, ...rest } = props;\n\n return (\n <Tr\n {...rest}\n className={className}\n ref={innerRef}\n onClick={onClick}\n clickable={!!onClick}\n data-test={dataTest || 'table-row'}\n >\n {children}\n </Tr>\n );\n});\n\nexport default TableRow;\n\n","export const ITEM_PER_CHUNK_SIZE = 20;\n","/* eslint-disable no-useless-escape */\nexport const getBrowserName = (): string => {\n const agent = window.navigator.userAgent.toLowerCase();\n switch (true) {\n case agent.indexOf('edg') > -1:\n return 'edge';\n case agent.indexOf('opr') > -1 && !!(window as any).opr:\n return 'opera';\n case agent.indexOf('chrome') > -1 && !!(window as any).chrome:\n return 'chrome';\n case agent.indexOf('trident') > -1:\n return 'ie';\n case agent.indexOf('firefox') > -1:\n return 'firefox';\n case agent.indexOf('safari') > -1:\n return 'safari';\n default:\n return 'other';\n }\n};\n\n/**\n *\n * @function getBrowserInfo\n * @returns { string }\n */\nfunction getBrowserInfo() {\n const userAgent = navigator.userAgent;\n const browsers = {\n Firefox: /Firefox\\/([\\d\\.]+)/,\n Opera: /(?:Opera|OPR)\\/([\\d\\.]+)/,\n IE: /Trident\\/([\\d\\.]+)/,\n Edge: /Edge\\/([\\d\\.]+)/,\n Chrome: /Chrome\\/([\\d\\.]+)/,\n Safari: /Version\\/([\\d\\.]+)/,\n };\n for (const [browserName, regex] of Object.entries(browsers)) {\n if (regex.test(userAgent)) {\n const browserVersion = userAgent?.match(regex)?.[1] ?? '';\n return `${browserName} ${browserVersion}`;\n }\n }\n return 'Unknown browser';\n}\n\nexport function isFirefox() {\n return getBrowserName() === 'firefox';\n}\n\nexport function isChrome() {\n return getBrowserName() === 'chrome';\n}\n\nexport function isOpera() {\n return getBrowserName() === 'opera';\n}\n\nexport function isEdge() {\n return getBrowserName() === 'edge';\n}\n\nexport function isSafari() {\n return getBrowserName() === 'safari';\n}\n\n/**\n * @description If the user is on a desktop, returns browser name, ele returns phone model\n * @function getDeviceInfo\n * @returns { string | undefined }\n */\nexport function getDeviceInfo() {\n const browserInfo = getBrowserInfo();\n if (\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n ) {\n // user is on a mobile device\n const match = navigator.userAgent.match(\n /(iPhone|iPod|iPad|Android)\\s([\\d_]+)/\n );\n if (match) {\n const [, phoneModel, phoneModelNumber] = match;\n return `${phoneModel} ${phoneModelNumber.replace(\n /_/g,\n '.'\n )}/${browserInfo}`;\n } else {\n return 'Unknown mobile device';\n }\n } else {\n // user is on desktop\n return browserInfo;\n }\n}\n\n/**\n * @function getNetworkConnectionType\n * @returns { string }\n */\nexport function getNetworkConnectionType() {\n const connection =\n (navigator as any)?.connection ||\n (navigator as any)?.mozConnection ||\n (navigator as any)?.webkitConnection;\n\n if (connection) {\n return connection.effectiveType || 'unknown';\n } else {\n return 'unknown';\n }\n}","import { FC, useState } from 'react';\n\nimport { Button } from '../../../../Button';\nimport TextAreaPlaceholderBox from '../../../../TextAreaPlaceholderBox/TextAreaPlaceholderBox';\nimport { Variables } from '../../../../../../theme/variables';\nimport {\n NudgeUserStyledDescription,\n StyledActions,\n StyledContent,\n StyledFormArea,\n StyledInput,\n StyledInputContainer,\n StyledTitle,\n} from './styles';\n\nexport const NudgeUser: FC<{\n title?: string;\n fromUser?: string;\n practisSetName?: string;\n placeholder?: string;\n onSend?(data: any): void;\n onClose?(): void;\n}> = ({ onSend, onClose, title, fromUser, practisSetName, placeholder }) => {\n const [messageData, setMessageData] = useState({\n name: fromUser,\n text: '',\n email: true,\n mobile: true,\n });\n\n const handleMessageDataChange = (key: string, value: any) => {\n setMessageData(prevState => ({ ...prevState, [key]: value }));\n };\n\n return (\n <>\n <StyledTitle data-test=\"nudge-title\">Nudge</StyledTitle>\n <StyledContent>\n <NudgeUserStyledDescription data-test=\"nudge-description\">\n {!!title\n ? title\n : 'Send a direct message to the selected Users'}\n </NudgeUserStyledDescription>\n <StyledFormArea>\n <StyledInputContainer>\n <StyledInput\n type=\"text\"\n name=\"name\"\n inputPadding=\"29px 24px 15px 24px\"\n value={messageData.name}\n label=\"From\"\n labelLeftPosition=\"24px\"\n labelFontWeight={500}\n maxLength={100}\n height=\"40px\"\n handleChange={(e: any) =>\n handleMessageDataChange('name', e.target.value)\n }\n dataTest=\"nudge-from\"\n />\n </StyledInputContainer>\n <TextAreaPlaceholderBox\n value={messageData.text}\n onChange={(e: any) =>\n handleMessageDataChange('text', e.target.value)\n }\n name=\"messageToTrainee\"\n placeholder={\n !!placeholder\n ? placeholder\n : practisSetName\n ? 'Write your message regarding… ' +\n `Practis Set: ${practisSetName || ''}`\n : 'Write a message to the selected user(s)'\n }\n max={200}\n minRows={6}\n fontSize=\"13px\"\n placeholderFontWeight={500}\n padding=\"23px 24px\"\n borderRadius=\"4px\"\n textAreaMinHeight=\"90px\"\n counterColor={Variables.Colors.cloudyBlue}\n dataTest=\"nudge-message\"\n />\n </StyledFormArea>\n <StyledActions marginTop={15}>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n variant=\"inverse\"\n dataTest=\"nudge-cancel\"\n >\n Cancel\n </Button>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={() => !!onSend && onSend(messageData)}\n disabled={\n !messageData.name ||\n !messageData.text ||\n (!messageData.email && !messageData.mobile)\n }\n customDisabledColor={Variables.Colors.cloudyBlue}\n dataTest=\"nudge-send\"\n >\n Send\n </Button>\n </StyledActions>\n </StyledContent>\n </>\n );\n};\n","import { useSelector } from 'react-redux';\n\nimport { useWithPractisSetsContext } from './context/useWithPractisSetsContext';\nimport { PractisSetsState } from './reducer';\nimport { DEFAULT_LABELS_SCOPE } from '../../../../portableLabels/store/hors/withLabels/scopes';\nimport { isObject } from 'lodash';\n\nexport const usePractisSetsState = (): PractisSetsState => {\n const { reducerName, scope } = useWithPractisSetsContext();\n const appState = useSelector(state => state);\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithPractisSetsContext.Provider props'\n );\n }\n\n const labelsState: PractisSetsState | undefined =\n // @ts-ignore\n // TODO implement `_practisSets?: PractisSetsState` field into each reducer (create general type)\n // interface GeneralReducer {\n // ...\n // _practisSets?: StateWithPractisSets;\n // }\n appState[reducerName]?._practisSets?.[scope || DEFAULT_LABELS_SCOPE];\n\n if (labelsState) {\n labelsState.selected = labelsState?.selected.map((item) => isObject(item) ? item : {practisSetId: item, dueDate: null}) || []\n }\n\n if (!labelsState) {\n throw new Error(\n `Wrap your reducer ${reducerName} via \"withPractisSetsReducer\" HOR`\n );\n }\n\n return labelsState;\n};\n","import React, {\n createContext,\n FC,\n RefObject,\n useCallback,\n useContext,\n useMemo,\n useRef,\n} from 'react';\nimport InfiniteScroll from 'react-infinite-scroller';\nimport styled from 'styled-components';\nimport { Loading } from '../LoadingCopmonent';\n\nconst Root = styled.div<{ scrollable?: boolean; height?: number }>`\n overflow-y: ${props => (!!props.scrollable ? 'auto' : 'initial')};\n ${props => (props.height ? `height: ${props.height}px;` : '')}\n`;\n\n\nexport interface ScrollPaginationProps {\n itemsPerPage?: number;\n itemCount?: number;\n totalCount?: number;\n scrollable?: boolean;\n scrollableRef?: RefObject<HTMLElement>;\n scrollableWindow?: boolean; //for storybook\n className?: string;\n height?: number;\n onLimitChange?(limit: number): void;\n onOffsetChange?(offset: number): void;\n onLocalLimitChange?(limit: number): void;\n hideLoading?: boolean;\n}\n\nexport const ScrollPagination: FC<ScrollPaginationProps> = ({\n itemsPerPage,\n itemCount,\n totalCount,\n scrollable,\n scrollableRef,\n scrollableWindow,\n className,\n height,\n children,\n onLimitChange,\n onOffsetChange,\n onLocalLimitChange,\n hideLoading,\n}) => {\n const context = useContext(ScrollPaginationContext);\n const rootRef = useRef<any>();\n const parentRef = useMemo(\n () =>\n (!!scrollable && rootRef?.current) ||\n scrollableRef?.current ||\n context.scrollableRef?.current ||\n null,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n scrollable,\n rootRef?.current,\n scrollableRef?.current,\n context.scrollableRef?.current,\n ]\n );\n const enabled =\n !!parentRef &&\n typeof itemCount === 'number' &&\n typeof totalCount === 'number' &&\n (!!onLimitChange || !!onOffsetChange || !!onLocalLimitChange);\n\n const getScrollParent = useCallback(() => parentRef, [parentRef]);\n\n const handleLoadMore = useCallback(() => {\n if (enabled && itemCount! < totalCount!) {\n const limit = Math.min(totalCount!, itemCount! + itemsPerPage!);\n const offset = Math.min(totalCount!, itemCount!);\n if (onLimitChange) onLimitChange(limit);\n if (onOffsetChange) onOffsetChange(offset);\n if (onLocalLimitChange) onLocalLimitChange(limit);\n }\n }, [\n enabled,\n itemsPerPage,\n itemCount,\n totalCount,\n onLimitChange,\n onOffsetChange,\n onLocalLimitChange,\n ]);\n\n return (\n <Root\n className={className}\n ref={rootRef}\n scrollable={scrollable}\n height={height}\n >\n <InfiniteScroll\n pageStart={0}\n loadMore={handleLoadMore}\n hasMore={enabled && itemCount! < totalCount!}\n loader={hideLoading ? <></> : <Loading key=\"TableScrollPaginationLoader\" />}\n useWindow={!!scrollableWindow}\n getScrollParent={\n !!scrollableWindow ? undefined : getScrollParent\n }\n threshold={100}\n className={className}\n >\n {children}\n </InfiniteScroll>\n </Root>\n );\n};\n\nexport interface ScrollPaginationContextValue {\n scrollableRef?: RefObject<HTMLElement>;\n}\n\nexport const ScrollPaginationContext = createContext<\n ScrollPaginationContextValue\n>({});\n","import { EnrollmentStatus } from \"../interfaces/Enrollments\";\n\nexport const DEV_ENV_URLS: {[key: string]: {[key: string]: string}} = {\n babylon: {'v1': 'api-dev-babylon.gopractis.com', 'v2': 'api-dev-v2-babylon.gopractis.com'},\n rome: {'v1': 'api-dev-rome.gopractis.com', 'v2': 'api-dev-v2-rome.gopractis.com'},\n develop: {'v1': 'api-dev.gopractis.com', 'v2': 'api-dev-v2.gopractis.com'}\n};\n\nexport const statusesMap: Record<\nEnrollmentStatus,\n{ title: string; dataTest?: string }\n> = {\n [EnrollmentStatus.PENDING]: {\n title: 'Not Started',\n dataTest: 'not-started',\n },\n [EnrollmentStatus.ENROLLED]: {\n title: 'In Progress',\n dataTest: 'in-progress',\n },\n [EnrollmentStatus.COMPLETED]: {\n title: 'Completed',\n dataTest: 'completed',\n },\n};\n\nexport const storageKeys = {\n PRACTIS_WEB: 'PRACTIS_WEB',\n};","import {\n resetProfileInfo,\n updateUserProfileSuccess,\n} from '../../UserProfile/store/actions';\nimport { setTokenAction, userLogoutAction } from './actions';\nimport { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n useAuthTypeApi,\n useLoginApi,\n useLoginByPhoneCodeApi,\n useTestInvitationApi,\n} from '../../../api';\nimport { LoginParams, LoginByPhoneCodeParams, AuthTypeParams } from '../../../api/auth/types';\nimport { clearAuthData } from '../../../helpers/functions/auth-helpers';\n\nexport const useTestInvitationService = () => {\n const dispatch = useDispatch();\n const testInvitationApi = useTestInvitationApi();\n return useCallback(\n (code: string, failureCallback?: (errorMessages?: string) => void) => {\n return testInvitationApi(code)\n .then((res: any) => {\n if (res.status === 'error') {\n throw res.message;\n }\n const updateValues = {\n firstName: res.firstName,\n lastName: res.lastName,\n email: res.email,\n invitationCode: res.code,\n role: res.role,\n };\n dispatch(updateUserProfileSuccess(updateValues));\n return updateValues;\n })\n .catch((error: ErrorResult) => {\n failureCallback?.(error?.message);\n });\n },\n [dispatch, testInvitationApi]\n );\n};\n\nexport const useUserLogout = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n clearAuthData();\n dispatch(userLogoutAction());\n }, [dispatch]);\n};\n\nexport const useAuthType = () => {\n const authTypeApi = useAuthTypeApi();\n return useCallback(\n (params: AuthTypeParams) => {\n return authTypeApi(params)\n .catch((error: ErrorResult) => {\n throw error;\n });\n },\n [authTypeApi]\n );\n};\n\nexport const useLogin = () => {\n const loginApi = useLoginApi();\n return useCallback(\n (params: LoginParams) => {\n return loginApi(params)\n .catch((error: ErrorResult) => {\n clearAuthData();\n throw error;\n });\n },\n [loginApi]\n );\n};\n\n/**\n * @function useLoginByPhoneCode\n * @param { LoginByPhoneCodeParams } params \n * @returns { Promise<{ user: UserV2; token: string }> }\n */\nexport const useLoginByPhoneCode = () => {\n const loginByPhoneCodeApi = useLoginByPhoneCodeApi();\n return useCallback(\n (params: LoginByPhoneCodeParams) => {\n return loginByPhoneCodeApi(params)\n .catch((error: ErrorResult) => {\n clearAuthData();\n throw error;\n });\n },\n [loginByPhoneCodeApi]\n );\n};\n\nexport const resetProfile = () => {\n return (dispatch: any) => {\n dispatch(resetProfileInfo());\n };\n};\n\nexport const useResetProfileService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetProfileInfo());\n }, [dispatch]);\n};\n\nexport const useSetTokenService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (token: string) => {\n dispatch(setTokenAction(token));\n },\n [dispatch]\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const QuestionMark = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg \n width=\"16\" \n height=\"17\"\n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8.5\" r=\"8\" fill=\"#F1F1F1\" />\n <path d=\"M6.572 8.768c0-.512.104-.88.312-1.104a.999.999 0 0 1 .288-.204c.112-.048.264-.104.456-.168.128-.04.236-.08.324-.12a.528.528 0 0 0 .204-.132.318.318 0 0 0 .072-.168 1.14 1.14 0 0 0 .024-.264v-2.46c.36.008.68.044.96.108.28.056.524.16.732.312.472.352.708.956.708 1.812 0 .648-.104 1.12-.312 1.416a1.094 1.094 0 0 1-.324.312c-.128.072-.284.14-.468.204l-.6.204c-.096.032-.164.06-.204.084a.192.192 0 0 0-.084.108.553.553 0 0 0-.036.216 4.036 4.036 0 0 0-.012.396v.228h-2.04v-.78zM5.42 4.4c.384-.08.852-.144 1.404-.192l.676-.06c.264-.023.886.004.886.004L8.5 6.056c-.04-.008-.856-.072-.944-.072h-.24c-.344 0-.764.024-1.26.072l-.636.072V4.4zm.972 6.144h2.424V12.5H6.392v-1.956z\" fill=\"#6D7F8C\" fillOpacity=\".72\" />\n </svg>\n );\n }\n);\n\nexport default QuestionMark;\n","import React, {\n FC, memo, ReactNode,\n} from 'react';\nimport styled from 'styled-components';\nimport { Tooltip } from './Tooltip';\nimport QuestionMark from '../../icons/QuestionMark';\n\nconst TooltipHeaderWrapper = styled.div`\n display: flex;\n\n svg{\n max-width: 16px;\n margin-left: 4px;\n\n &:hover{\n circle{\n fill: ${props => props.theme.Colors.whiteThree};\n }\n }\n }\n\n .tooltip{\n padding: 24px !important;\n width: 280px;\n }\n`;\n\nconst FlexWrapper = styled.div`\n display: flex;\n`;\n\nexport const QuestionTooltip: FC<{\n text: ReactNode | string,\n isHtmlContent?: boolean,\n dataTest?: string,\n position?: string;\n action?: () => void;\n}> = memo(({\n text,\n isHtmlContent,\n dataTest,\n action,\n position\n}) => {\n return (\n <>\n <TooltipHeaderWrapper onClick={(e) => {e.stopPropagation(); action?.()}}>\n <Tooltip\n label={text}\n preset={position === 'top' ? 'question-icon-top': 'question-icon'}\n className={`${position === 'top' ? 'top' : ''} tooltip-question`}\n trigger={'click'}\n isHtmlContent={isHtmlContent}\n dataTest={dataTest && `${dataTest}-text`}\n >\n <FlexWrapper data-test={dataTest && `${dataTest}-icon`}>\n <QuestionMark />\n </FlexWrapper>\n </Tooltip>\n </TooltipHeaderWrapper>\n </>\n );\n });","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Tag = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M7 89V79c0-.552.447-1 1-1h10.5l4.5 6-4.5 6H8c-.553 0-1-.448-1-1zm11 0l3.75-5L18 79H8v10h10zm1-5c0 1.105-.895 2-2 2-1.104 0-2-.895-2-2s.896-2 2-2c1.105 0 2 .895 2 2zm-2.999 0c0 .552.447 1 1 1 .552 0 1-.448 1-1s-.448-1-1-1c-.553 0-1 .448-1 1z\"\n transform=\"translate(-311 -294) translate(304 216)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Tag;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TagDisabled = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M14 13V7h-1V3L8-.75 3 3v10h4v.998h6.006L13 14H3c-.552 0-1-.448-1-1V2.5L8-2l6 4.5V13zM8 6c-1.105 0-2-.895-2-2s.895-2 2-2c1.104 0 2 .895 2 2s-.896 2-2 2zm0-3c-.553 0-1 .447-1 1 0 .552.447 1 1 1 .552 0 1-.447 1-1 0-.553-.448-1-1-1zm1.836 10.996l-.832-.749 1.713-1.747-1.713-1.747.832-.749 1.663 1.697 1.664-1.697.832.749-1.713 1.747 1.713 1.747-.832.75-1.664-1.698-1.663 1.697z\"\n transform=\"translate(-318 -294) translate(304 288) rotate(90 12 16)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default TagDisabled;\n","import styled, { css } from 'styled-components';\n\nexport const LabelTagsContainer = styled.div<{ disabled: boolean }>`\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 16px;\n\n ${props =>\n props.disabled &&\n css`\n cursor: default;\n `}\n`;\n\nexport const StyledLabelTag = styled.div<{\n open?: boolean;\n disabled?: boolean;\n isLabelLess?: boolean;\n}>`\n width: 44px;\n height: 24px;\n border-radius: 4px;\n color: ${props => props.theme.Colors.cloudyBlue};\n border: solid 1px\n ${props =>\n props.disabled\n ? props.theme.Colors.paleGrey\n : props.theme.Colors.cloudyBlue};\n background-color: ${props => props.theme.Colors.whiteFive};\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 11px;\n &:hover {\n color: ${props => !props.disabled && props.theme.Colors.darkSkyBlue};\n border: solid 1px\n ${props => !props.disabled && props.theme.Colors.darkSkyBlue};\n }\n ${props =>\n props.open &&\n `\n color: ${props.theme.Colors.darkSkyBlue};\n border: solid 1px ${props.theme.Colors.darkSkyBlue}; \n background-color: ${props.theme.Colors.darkSkyBlue15};\n`}\n ${props =>\n props.disabled &&\n css`\n pointer-events: none;\n border: solid 1px ${props.theme.Colors.paleGrey};\n cursor: default;\n `}\n${props =>\n props.isLabelLess &&\n `\n border: solid 1px ${props.theme.Colors.paleGrey};\n`}\n`;\n\nexport const LabelIconWrapper = styled.div<{ disabled: boolean }>`\n width: 16px;\n height: 12px;\n display: flex;\n\n ${props =>\n props.disabled &&\n css`\n color: ${props => props.theme.Colors.paleGrey};\n `}\n`;\n\nexport const LabelText = styled.div<{ disabled: boolean }>`\n height: 12px;\n display: flex;\n margin-left: 4px;\n line-height: 1.1;\n\n ${props =>\n props.disabled &&\n css`\n opacity: 0.4;\n `}\n`;\n\n","import { FC, useEffect, useState } from 'react';\n\nimport Tag from '../../../../icons/Tag';\nimport { TreeDfsNameMapper } from '../../../../../helpers/classes/TreeDfsNameMapper';\nimport TagDisabled from '../../../../icons/TagDisabled';\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\nimport {\n LabelIconWrapper,\n LabelTagsContainer,\n LabelText,\n StyledLabelTag,\n} from './styles';\n\nexport interface TableLabelTagsProps {\n open?: boolean;\n selectedLabels?: number[];\n toggleOpen?(): void;\n isLabelLess?: boolean;\n className?: string;\n dataTest?: string;\n}\n\nexport const TableLabelTags: FC<TableLabelTagsProps> = ({\n open,\n toggleOpen,\n selectedLabels,\n isLabelLess,\n className,\n dataTest\n}) => {\n const [assignedLabelNames, setAssignedLabelNames] = useState<any>([]);\n const labels = usePortableLabelsState().data;\n const disabled =\n (!assignedLabelNames || assignedLabelNames.length < 1) && !open;\n\n useEffect(() => {\n if (open && assignedLabelNames.length < 1) {\n toggleOpen?.();\n }\n }, [assignedLabelNames, open, toggleOpen]);\n\n useEffect(() => {\n const selectedItems = (selectedLabels || []).map(item =>\n item >= 0 ? item : Math.abs(item)\n );\n\n if (!!labels && labels.items.length > 0 && selectedItems) {\n const treeDfsNameMapper = new TreeDfsNameMapper(\n labels.items,\n selectedItems\n );\n const names = treeDfsNameMapper.getNames();\n setAssignedLabelNames(names);\n }\n }, [labels, selectedLabels]);\n\n return (\n <LabelTagsContainer\n onClick={e => {\n e.stopPropagation();\n if (disabled) return;\n if (toggleOpen) {\n toggleOpen();\n }\n }}\n disabled={disabled}\n className={className}\n >\n <StyledLabelTag\n open={open}\n disabled={disabled}\n isLabelLess={isLabelLess}\n data-test={dataTest || 'table-labels'}\n >\n <LabelIconWrapper disabled={disabled}>\n {isLabelLess ? <TagDisabled /> : <Tag />}\n </LabelIconWrapper>\n <LabelText disabled={disabled}>\n {isLabelLess\n ? ''\n : assignedLabelNames\n ? assignedLabelNames.length\n : 0}\n </LabelText>\n </StyledLabelTag>\n </LabelTagsContainer>\n );\n};\n","import { createContext, useContext } from 'react';\n\nexport interface LocalStorage {\n get(key: string): any;\n set(key: string, data: any): string | null;\n clear(): boolean;\n remove(key: string): boolean;\n}\n\nexport const LocalStorageContext = createContext<LocalStorage>(undefined!);\n\nexport function useLocalStorage() {\n return useContext(LocalStorageContext);\n}\n","export const getPageUrl = (\n route: string,\n params?: Record<string, string | undefined>\n) => {\n if (!params) {\n return route;\n }\n\n return Object.keys(params).reduce((acc, param) => {\n const value = params[param];\n if (value) {\n return acc.replace(`:${param}`, value);\n }\n\n return acc;\n }, route);\n};\n\nexport const replaceUrlQueryParam = (url: string, paramName: string, paramValue: string): string => {\n const nUrl = new URL(url);\n if (!paramValue) {\n nUrl.searchParams.delete(paramName);\n } else {\n nUrl.searchParams.set(paramName, paramValue);\n }\n return nUrl.toString();\n}\n","import ROUTES from '../../routes/routes';\nimport localStorage from '../../services/Storage';\nimport { DEV_ENV_URLS } from '../../constants/variables/general';\n/**\n * @function buildRegistrationUrl - builds url of registration page by invitation code\n * @param { string } code\n * @returns { string }\n */\nexport const buildRegistrationUrl = (code: string): string =>\n `${document.location.origin}${ROUTES.AUTH_PAGES.REGISTRATION}?token=${code}`;\n\nexport const getDevApiUrl = (version: string) => {\n const apiPlatform = (localStorage.get('apiPlatform') || 'develop');\n\n return DEV_ENV_URLS[apiPlatform][version];\n}\n\n/**\n * @function isSharedLink\n * @param { string } url\n * @returns { boolean }\n */\nexport const isSharedLink = (url: string) => {\n var accuracyTestRegex = new RegExp(`${ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.ALL}/\\\\d+`);\n var challengeRegex = new RegExp(`${ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL}/\\\\d+`);\n return !!url.match(accuracyTestRegex)\n || !!url.match(challengeRegex);\n}","import { AppState } from '../../../../../store/reducers';\r\n\r\nexport type Scope = typeof DEFAULT_PRACTIS_SETS_SCOPE | string;\r\n\r\nexport const DEFAULT_PRACTIS_SETS_SCOPE = 'primary';\r\n\r\nexport const WithPractisSetsScopes: Partial<Record<keyof AppState, Scope[]>> = {\r\n draftEdit: ['assignFilters', 'addNewUser', 'editUser'],\r\n performance: ['assignFilters', 'addNewUser', 'editUser'],\r\n};\r\n","export const plural = (count: number, text: string, pluralText?: string, withZero?: boolean) => {\n return count === 1 || (withZero && count === 0) ? text : (pluralText ? pluralText : `${text}s`)\n}","import styled from 'styled-components';\n\nexport const Root = styled.div<{\n width?: number;\n marginRight?: number;\n marginLeft?: number;\n}>`\n display: flex;\n justify-content: center;\n align-content: center;\n align-items: center;\n ${props => props.width && `width: ${props.width}px`};\n flex-shrink: 0;\n ${props => !!props.marginRight && `margin-right: ${props.marginRight}px;`}\n ${props => !!props.marginLeft && `margin-left: ${props.marginLeft}px;`}\n`;\n\n","import { FC, memo } from 'react';\n\nimport { Root } from './style';\nimport { TableToolItemProps } from './type';\n\nconst TableToolItem: FC<TableToolItemProps> = memo(props => {\n const { width, children, className, marginRight, marginLeft } = props;\n\n return (\n <Root\n width={width}\n className={className}\n marginRight={marginRight}\n marginLeft={marginLeft}\n >\n {children}\n </Root>\n );\n});\n\nexport default TableToolItem;\n","import React, { memo } from 'react';\nimport styled from 'styled-components';\nimport { CircularProgress } from '@material-ui/core';\n\nconst StyledLoadingComponent = styled.div<{\n color?: string;\n width: string;\n height: number;\n}>`\n height: ${props => `${props.height}px`};\n display: flex;\n justify-content: center;\n align-items: center;\n align-self: center;\n justify-self: center;\n width: ${props => props.width};\n color: ${props =>\n props.color ? props.color : props.theme.Colors.skyBlueTwo};\n`;\n\nexport const Loading: React.FC<{\n width?: string;\n className?: string;\n color?: string;\n size?: number;\n}> = memo(({ width, color, size = 20, className }) => {\n return (\n <StyledLoadingComponent\n width={width ? width : '100%'}\n className={className}\n color={color}\n height={size}\n >\n <CircularProgress size={`${size}px`} color=\"inherit\" />\n </StyledLoadingComponent>\n );\n});\n\nexport default Loading;\n","\nimport React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PractisAdminPlatformLogo = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg ref={ref}\n viewBox=\"0 0 156 40\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n data-test='practis-logo'>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M125.161 0v3.36h-2.837V0h2.837zm-6.04 20.965v-2.801h-1.666c-1.877 0-2.936-.994-2.936-2.815V8.543h4.602V5.8h-4.602v-3.6l-2.921-.013v3.613h-2.583v2.744h2.583v6.876c0 3.39 2.216 5.546 5.547 5.546h1.976zM44.03 19.52v7.184h-2.993V5.46h2.992v1.834c1.468-1.442 3.233-2.156 5.308-2.156 1.51 0 2.88.364 4.107 1.064a7.484 7.484 0 0 1 2.894 2.913c.691 1.246 1.002 2.646 1.016 4.173.056 4.58-3.472 8.22-8.032 8.164-2.004-.028-3.853-.7-5.293-1.932zm1.398-2.462c.974.995 2.216 1.485 3.726 1.499 2.936.028 5.194-2.283 5.194-5.252 0-2.982-2.258-5.265-5.194-5.265-2.922 0-5.265 2.31-5.237 5.252.029 1.526.508 2.758 1.51 3.767zm18.528 3.902v-8.388c0-2.787 1.411-4.356 3.853-4.356h1.779V5.39h-1.581c-1.779 0-2.993.546-4.009 1.736V5.46l-2.936.014V20.96h2.894zm20.653-1.776c-1.411 1.373-3.105 2.115-5.265 2.115-1.496 0-2.879-.35-4.121-1.05-1.228-.7-2.188-1.68-2.894-2.913-.705-1.247-1.044-2.619-1.058-4.117-.07-4.538 3.557-8.137 8.088-8.08 2.117.027 3.923.728 5.377 2.142v-1.82h3.035v15.516h-3.162v-1.793zm-5.079-.756c-1.51-.028-2.752-.505-3.74-1.485-.988-1.008-1.468-2.24-1.482-3.725-.029-2.913 2.272-5.21 5.222-5.21 2.922 0 5.209 2.27 5.209 5.21 0 2.955-2.287 5.238-5.209 5.21zm27.761-2.955c-1.073 3.795-4.051 5.825-7.72 5.825-1.497 0-2.88-.35-4.122-1.05a7.556 7.556 0 0 1-2.922-2.913c-.706-1.246-1.059-2.619-1.059-4.117 0-1.498.353-2.87 1.045-4.117a7.498 7.498 0 0 1 2.936-2.913c1.242-.7 2.625-1.05 4.121-1.05 3.698 0 6.62 2.016 7.693 5.77h-2.936c-2.202-4.776-9.81-3.404-9.824 2.31-.014 2.885 2.258 5.237 5.067 5.21 2.16-.029 3.797-.953 4.729-2.955h2.992zm17.87 5.49V5.053h-2.837v15.91h2.837zm15.84-4.566c0 3.01-2.554 4.901-6.182 4.901-3.599 0-6.112-2.142-6.239-5.657h2.894c.113 1.792 1.411 2.87 3.43 2.87 2.004 0 3.176-.854 3.176-2.002 0-.504-.156-.854-.452-1.107-.409-.336-.692-.49-1.27-.63a21.426 21.426 0 0 0-1.878-.392 38.583 38.583 0 0 1-1.538-.294 13.576 13.576 0 0 1-1.496-.462 3.494 3.494 0 0 1-.65-.294c-.09-.063-.21-.154-.362-.271a58.513 58.513 0 0 0-.287-.22c-.423-.321-.649-.685-.932-1.245-.239-.49-.352-1.107-.352-1.835 0-2.815 2.498-4.621 5.9-4.621 3.43 0 5.815 2.072 5.914 5.391h-2.823c-.099-1.708-1.214-2.689-3.148-2.689-1.948 0-2.964.799-2.964 1.835 0 .462.155.77.395.952.41.294.678.448 1.242.588.126.027.246.055.358.08.178.04.337.077.475.102l.96.155c1.27.21 2.244.434 2.978.658 1.51.49 2.654 1.554 2.823 3.655l.011.178c.01.152.017.272.017.354z\" fill=\"#fff\" />\n <path d=\"M43.873 39.337c-.507 0-.936-.095-1.287-.286a2.023 2.023 0 0 1-.8-.773 2.15 2.15 0 0 1-.266-1.06c0-.338.056-.64.169-.91.113-.273.286-.507.52-.702.234-.199.537-.361.91-.487.282-.091.611-.173.988-.247.381-.074.793-.14 1.235-.202.446-.065.912-.134 1.398-.208l-.56.319c.005-.485-.103-.843-.325-1.073-.22-.23-.593-.344-1.117-.344-.317 0-.622.074-.917.22-.295.148-.5.402-.617.761l-1.43-.448c.173-.594.502-1.07.987-1.43.49-.36 1.149-.54 1.976-.54.624 0 1.173.102 1.645.306.477.204.83.537 1.06 1 .125.248.201.501.227.761.026.256.039.536.039.839v4.31h-1.371V37.62l.227.247c-.316.507-.687.88-1.111 1.118-.42.234-.947.351-1.58.351zm.312-1.248c.355 0 .659-.062.91-.188s.45-.28.598-.462c.152-.182.254-.353.306-.513.082-.2.127-.427.136-.683.013-.26.02-.47.02-.63l.48.143c-.472.074-.877.139-1.215.195-.338.056-.628.11-.871.162a5.556 5.556 0 0 0-.643.163 1.99 1.99 0 0 0-.462.227 1.009 1.009 0 0 0-.293.3.78.78 0 0 0-.097.396c0 .173.043.327.13.461.087.13.212.234.377.312.169.078.377.117.624.117zM52.215 39.337c-.646 0-1.21-.162-1.69-.487a3.227 3.227 0 0 1-1.118-1.326c-.265-.56-.397-1.19-.397-1.892 0-.71.132-1.343.397-1.898a3.191 3.191 0 0 1 1.137-1.32c.49-.324 1.066-.487 1.73-.487.667 0 1.226.163 1.676.488.455.32.8.76 1.034 1.32.234.558.35 1.191.35 1.897 0 .698-.116 1.329-.35 1.892a2.985 2.985 0 0 1-1.047 1.326c-.463.325-1.038.487-1.722.487zm.24-1.404c.42 0 .759-.095 1.014-.286.26-.195.449-.465.566-.812.121-.347.182-.748.182-1.203 0-.459-.06-.86-.182-1.202-.117-.347-.301-.615-.553-.806-.251-.195-.576-.293-.975-.293-.42 0-.767.104-1.04.312a1.78 1.78 0 0 0-.604.832c-.13.347-.195.733-.195 1.157 0 .43.063.82.188 1.17.13.347.327.622.592.826.264.204.6.305 1.007.305zm1.762 1.21v-4.928h-.195v-4.433h1.58v9.36h-1.385zM65.854 39.142v-4.264c0-.48-.119-.855-.357-1.124-.239-.273-.561-.41-.969-.41a1.31 1.31 0 0 0-.676.176c-.2.113-.357.282-.474.507a1.674 1.674 0 0 0-.176.793l-.695-.41c-.005-.485.104-.912.325-1.28.225-.373.528-.663.91-.871a2.616 2.616 0 0 1 1.274-.312c.775 0 1.369.234 1.78.702.417.464.625 1.075.625 1.833v4.66h-1.567zm-8.443 0v-7.02h1.384V34.3h.195v4.842h-1.58zm4.231 0v-4.244c0-.49-.119-.871-.357-1.144-.239-.273-.564-.41-.975-.41-.399 0-.72.137-.962.41-.239.273-.358.628-.358 1.066l-.702-.468c0-.455.113-.865.338-1.229.226-.364.529-.65.91-.858a2.637 2.637 0 0 1 1.294-.318c.524 0 .962.113 1.313.338.355.22.62.524.793.91.177.381.266.812.266 1.293v4.654h-1.56zM69.246 31.056V29.62h1.567v1.436h-1.567zm0 8.086v-7.02h1.567v7.02h-1.567zM77.615 39.142v-3.38c0-.22-.015-.465-.045-.734a2.537 2.537 0 0 0-.215-.774 1.466 1.466 0 0 0-.494-.617c-.217-.16-.511-.24-.884-.24-.2 0-.396.032-.591.097a1.359 1.359 0 0 0-.533.338c-.156.156-.282.373-.377.65-.096.273-.143.624-.143 1.053l-.93-.397c0-.598.115-1.14.345-1.625a2.766 2.766 0 0 1 1.027-1.157c.45-.29 1.005-.435 1.664-.435.52 0 .949.087 1.287.26.338.173.606.394.806.663.199.269.346.555.442.858.095.303.156.591.182.864.03.27.045.488.045.657v3.92h-1.586zm-4.868 0v-7.02h1.397V34.3h.189v4.842h-1.586zM86.873 39.337c-.684 0-1.258-.162-1.722-.487a2.984 2.984 0 0 1-1.047-1.326c-.234-.563-.35-1.194-.35-1.892 0-.706.116-1.339.35-1.898.234-.559.577-.998 1.027-1.32.455-.324 1.016-.487 1.684-.487.663 0 1.237.163 1.722.488.49.32.87.76 1.138 1.32.269.554.403 1.187.403 1.897 0 .702-.132 1.333-.397 1.892a3.227 3.227 0 0 1-1.118 1.326c-.48.325-1.044.487-1.69.487zm-3.386 2.925v-10.14h1.384v4.927h.195v5.213h-1.58zm3.146-4.329c.407 0 .743-.101 1.007-.305.265-.204.46-.479.585-.826.13-.35.195-.74.195-1.17 0-.424-.065-.81-.195-1.157a1.78 1.78 0 0 0-.604-.832c-.273-.208-.62-.312-1.04-.312-.399 0-.724.098-.975.293-.251.19-.438.46-.56.806a3.722 3.722 0 0 0-.175 1.202c0 .455.059.856.176 1.203.121.347.31.617.565.812.26.191.6.286 1.02.286zM94.611 39.337c-.702 0-1.315-.158-1.84-.474a3.259 3.259 0 0 1-1.221-1.307c-.286-.559-.43-1.2-.43-1.924 0-.736.148-1.382.443-1.937a3.26 3.26 0 0 1 1.228-1.3c.524-.312 1.131-.468 1.82-.468.706 0 1.322.159 1.846.475.524.316.932.754 1.222 1.313.29.555.436 1.194.436 1.917 0 .728-.148 1.372-.442 1.93-.29.556-.698.991-1.222 1.307-.525.312-1.138.468-1.84.468zm0-1.469c.624 0 1.088-.208 1.391-.624.303-.416.455-.953.455-1.612 0-.68-.154-1.222-.461-1.625-.308-.407-.77-.61-1.385-.61-.42 0-.767.095-1.04.285a1.646 1.646 0 0 0-.598.787c-.13.334-.195.721-.195 1.163 0 .68.154 1.225.462 1.632.312.403.769.604 1.371.604zM99.547 39.142v-7.02h1.384v1.71l-.169-.221c.087-.234.202-.446.345-.637a1.92 1.92 0 0 1 .526-.481c.174-.117.364-.208.572-.273.213-.07.429-.11.65-.124.221-.017.436-.008.644.026v1.463a2.01 2.01 0 0 0-.722-.059 1.657 1.657 0 0 0-.728.228 1.647 1.647 0 0 0-.533.448 1.9 1.9 0 0 0-.299.624c-.065.23-.097.48-.097.748v3.568h-1.573zM108.854 39.142a6.401 6.401 0 0 1-1.365.11 3.131 3.131 0 0 1-1.19-.24 1.647 1.647 0 0 1-.799-.734 2.09 2.09 0 0 1-.254-.93 38.23 38.23 0 0 1-.013-1.072v-6.104h1.56v6.013c0 .282.002.529.007.74.008.213.054.387.136.52.156.26.405.406.748.436.342.03.732.013 1.17-.052v1.313zm-4.895-5.791v-1.229h4.895v1.229h-4.895zM112.326 39.337c-.507 0-.936-.095-1.287-.286a2.021 2.021 0 0 1-.799-.773 2.146 2.146 0 0 1-.267-1.06c0-.338.056-.64.169-.91.113-.273.286-.507.52-.702.234-.199.537-.361.91-.487.282-.091.611-.173.988-.247.381-.074.793-.14 1.235-.202.446-.065.912-.134 1.398-.208l-.559.319c.004-.485-.104-.843-.325-1.073-.221-.23-.594-.344-1.118-.344-.317 0-.622.074-.917.22-.295.148-.5.402-.617.761l-1.43-.448c.173-.594.502-1.07.988-1.43.489-.36 1.148-.54 1.976-.54.624 0 1.172.102 1.644.306.477.204.83.537 1.06 1 .125.248.201.501.227.761.026.256.039.536.039.839v4.31h-1.371V37.62l.227.247c-.316.507-.687.88-1.111 1.118-.421.234-.947.351-1.58.351zm.312-1.248c.355 0 .659-.062.91-.188s.451-.28.598-.462c.152-.182.254-.353.306-.513.082-.2.127-.427.136-.683.013-.26.02-.47.02-.63l.481.143c-.473.074-.878.139-1.216.195-.338.056-.628.11-.871.162a5.504 5.504 0 0 0-.643.163c-.182.065-.336.14-.462.227a.997.997 0 0 0-.292.3.78.78 0 0 0-.098.396.83.83 0 0 0 .13.461c.087.13.212.234.377.312.169.078.377.117.624.117zM117.983 39.142v-9.555h1.567v9.555h-1.567z\" fill=\"#B1C0CB\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0 16.89C0 8.668 6.537 2 14.601 2s14.601 6.667 14.601 14.89c0 8.224-6.537 14.891-14.6 14.891H7.38L0 38V16.89zm21.948-.015c0-4.238-3.33-7.674-7.44-7.674-4.109 0-7.44 3.436-7.44 7.674v7.674h7.44c4.068 0 7.374-3.368 7.44-7.547v-.127z\" fill=\"#4AA9E2\" />\n </svg>\n );\n }\n);\n\nexport default PractisAdminPlatformLogo;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PractisLogo = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 156 40\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n data-test='practis-logo'\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n fill=\"#4aa9e2\"\n d=\"M16.526 0C7.399 0 0 7.407 0 16.545V40l8.353-6.91h8.173c9.127 0 16.525-7.407 16.525-16.545C33.051 7.407 25.653 0 16.526 0zm-.106 8c4.651 0 8.421 3.817 8.421 8.526v.141c-.075 4.644-3.816 8.386-8.42 8.386H8v-8.527C8 11.817 11.77 8 16.42 8z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M48.313 34.797V26.78c1.593 1.375 3.64 2.125 5.859 2.157 5.047.062 8.953-4 8.89-9.11-.015-1.703-.359-3.265-1.124-4.656-.766-1.39-1.844-2.469-3.204-3.25-1.359-.781-2.875-1.188-4.547-1.188-2.296 0-4.25.797-5.874 2.407v-2.047H45v23.703h3.313zm5.671-9.094c-1.672-.015-3.047-.562-4.125-1.672-1.109-1.125-1.64-2.5-1.672-4.203-.03-3.281 2.563-5.86 5.797-5.86 3.25 0 5.75 2.548 5.75 5.876 0 3.312-2.5 5.89-5.75 5.86zm16.391 2.688v-9.36c0-3.11 1.563-4.86 4.266-4.86h1.968v-3.155h-1.75c-1.968 0-3.312.609-4.437 1.937v-1.86l-3.25.016v17.282h3.203zm17.031.375c2.39 0 4.266-.828 5.828-2.36v2h3.5V11.094h-3.359v2.031c-1.61-1.578-3.61-2.36-5.953-2.39-5.016-.063-9.031 3.953-8.953 9.015.015 1.672.39 3.203 1.172 4.594.78 1.375 1.843 2.468 3.203 3.25 1.375.781 2.906 1.172 4.562 1.172zm.203-3.203c-1.671-.032-3.046-.563-4.14-1.657-1.094-1.125-1.625-2.5-1.64-4.156-.032-3.25 2.515-5.813 5.78-5.813 3.235 0 5.766 2.532 5.766 5.813 0 3.297-2.531 5.844-5.766 5.813zm22.188 3.203c4.062 0 7.36-2.266 8.547-6.5h-3.313c-1.031 2.234-2.844 3.265-5.234 3.297-3.11.03-5.625-2.594-5.61-5.813.016-6.375 8.438-7.906 10.876-2.578h3.25c-1.188-4.188-4.422-6.438-8.516-6.438-1.656 0-3.188.391-4.563 1.172-1.39.781-2.468 1.86-3.25 3.25-.765 1.39-1.156 2.922-1.156 4.594 0 1.672.39 3.203 1.172 4.594.781 1.39 1.86 2.468 3.234 3.25 1.375.781 2.907 1.172 4.563 1.172zm21.64-.375v-3.125h-1.843c-2.078 0-3.25-1.11-3.25-3.141v-7.594h5.094V11.47h-5.094V7.453l-3.235-.016v4.032h-2.859v3.062h2.86v7.672c0 3.781 2.453 6.188 6.14 6.188h2.188zm6.688-19.641V5h-3.14v3.75h3.14zm0 19.64V10.64h-3.14v17.75h3.14zm10.688.376c4.015 0 6.843-2.11 6.843-5.47 0-.124-.015-.327-.031-.593-.188-2.344-1.453-3.531-3.125-4.078-.813-.25-1.89-.5-3.297-.734l-1.062-.172c-.25-.047-.563-.125-.922-.203-.625-.157-.922-.328-1.375-.657-.266-.203-.438-.547-.438-1.062 0-1.156 1.125-2.047 3.281-2.047 2.141 0 3.375 1.094 3.485 3h3.125c-.11-3.703-2.75-6.016-6.547-6.016-3.766 0-6.531 2.016-6.531 5.157 0 .812.125 1.5.39 2.046.313.625.563 1.032 1.032 1.391.328.25.562.438.718.547.203.125.453.234.72.328.546.203.983.344 1.655.516.5.11 1.078.218 1.703.328.813.14 1.5.281 2.079.437.64.157.953.328 1.406.703.328.282.5.672.5 1.235 0 1.281-1.297 2.234-3.516 2.234-2.234 0-3.672-1.203-3.797-3.203h-3.203c.14 3.922 2.922 6.313 6.906 6.313z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default PractisLogo;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Search = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 20 20\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fillRule=\"evenodd\"\n fill=\"currentColor\"\n d=\"M19.825 19.826c-.232.232-.609.232-.841 0l-5.573-5.572c-1.424 1.23-3.256 1.999-5.285 1.999C3.64 16.253 0 12.615 0 8.126 0 3.638 3.639 0 8.126 0c4.488 0 8.127 3.638 8.127 8.126 0 2.03-.77 3.861-2 5.286l5.572 5.572c.232.232.232.609 0 .842zm-4.823-11.7c0-3.797-3.078-6.876-6.876-6.876-3.797 0-6.876 3.08-6.876 6.876 0 3.798 3.079 6.877 6.876 6.877 3.798 0 6.876-3.078 6.876-6.877z\"\n />\n </svg>\n );\n }\n);\n\nexport default Search;\n","export const SIZES = {\n MIN_WIDTH: 250,\n};\n\nexport const EMPTY_CELL = '—';\n","import { ScrollPaginationProps } from '../../ScrollPagination';\nimport {\n TableConfigurationsType,\n TableEmptyStateConfigurations,\n TableStateValues,\n} from '../types';\n\nexport enum TableViewMode {\n SIMPLE,\n INFINITE_SCROLL,\n}\nexport interface TableProps {\n data?: unknown[];\n tableStates: TableStateValues;\n tableContainerClassName?: string;\n tableInnerClassName?: string;\n cornered?: boolean;\n addOverflow?: boolean;\n tableEmptyStateConfigurations: TableEmptyStateConfigurations;\n configuration: TableConfigurationsType;\n viewMode?: TableViewMode;\n scrollRef?: any;\n scrollPaginationProps?: ScrollPaginationProps;\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const EmptyBox = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n height=\"100%\"\n viewBox=\"0 0 32 32\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M101 12.801v17.066c0 1.177-.895 2.133-2 2.133H75c-1.105 0-2-.956-2-2.133V12.8c-1.105 0-2-.956-2-2.134V2.133C71 .955 71.895 0 73 0h28c1.105 0 2 .955 2 2.133v8.534c0 1.179-.896 2.134-2 2.134zM75 28.8c0 .59.448 1.067 1 1.067h22c.552 0 1-.478 1-1.067V13.866c0-.588-.448-1.064-1-1.064h-5v4.265c0 1.179-.895 2.133-2 2.133h-8c-1.105 0-2-.954-2-2.133v-4.265h-5c-.552 0-1 .476-1 1.064V28.8zM91 16v-3.198h-8V16c0 .588.448 1.066 1 1.066h6c.552 0 1-.478 1-1.066zm10-12.8c0-.588-.448-1.067-1-1.067H74c-.552 0-1 .478-1 1.067v6.4c0 .59.448 1.067 1 1.067h26c.552 0 1-.478 1-1.066V3.2z\"\n transform=\"translate(-424 -1816) translate(353 1816)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default EmptyBox;\n","import { UserV2 } from '../../../constants/interfaces/User';\nimport {\n fetchUserProfile,\n fetchUserProfileFailure,\n fetchUserProfileSuccess,\n updateUserProfile,\n updateUserProfileFailure,\n updateUserProfileSuccess,\n} from './actions';\nimport { useDispatch } from 'react-redux';\nimport {\n useGetUserApi,\n useUpdateUserInfo,\n useUpdateUserPhoneNumber,\n} from '../../../api';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n useShowMessage,\n} from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useRedirectToPhoneVerification } from '../../../helpers/hooks/useRedirectToPhoneVerification';\nimport { MobileNumberVerificationStep } from '../../Auth/AddMobileNumber/types';\nimport {\n updateUserFailure,\n updateUserSuccess,\n} from '../../../features/users/store/actions';\nimport {\n CLIENT_SIDE_ERROR_MESSAGE,\n PHONE_ALREADY_EXISTS\n} from '../../../ui/components/ErrorMessages/constants';\nimport { getCurrentUserId, isAuthorized } from '../../../helpers/functions/auth-helpers';\nimport {\n useGetUserPermissionsApi,\n useGetUserSettingsApi,\n useSetUserPhotoApi\n} from '../../../api';\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport { useUploadMediaService } from '../../../services/MediaService';\n\n/**\n * @function useGetProfileService\n * @description gets user data, permissions and settings by user id\n * and combine them in user profile\n * @returns { Promise }\n */\nexport const useGetProfileService = () => {\n const dispatch = useDispatch();\n const getUserApi = useGetUserApi();\n const getUserPermissionsApi = useGetUserPermissionsApi();\n const getUserSettingsApi = useGetUserSettingsApi();\n const showMessage = useShowMessage();\n return useCallback(() => {\n if (!isAuthorized())\n return showMessage('User is not authorized to perform this action', 'error');\n const userId = getCurrentUserId()!;\n const requests: Promise<unknown>[] = [\n getUserApi(userId),\n getUserPermissionsApi(userId),\n getUserSettingsApi(userId)\n ];\n dispatch(fetchUserProfile());\n return Promise.all(requests)\n .then((data) => {\n const user = data[0] as UserV2;\n const permissions = data[1] as NEW_PERMISSIONS[];\n const labelFilters = data[2] as number[];\n const userProfile: UserProfile = {\n ...user,\n permissions,\n labelFilters\n };\n dispatch(fetchUserProfileSuccess(userProfile));\n return userProfile;\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchUserProfileFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getUserApi, getUserPermissionsApi, getUserSettingsApi, showMessage]);\n};\n\n/**\n * @description handle update user profile service.\n * if user phone number should be changed it add\n * phone number changes request to the action list.\n * @function useUpdateProfileService\n * @returns { CallableFunction }\n */\nexport const useUpdateProfileService = () => {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n\n const updateUserInfo = useUpdateUserInfo();\n const updateUserPhoneNumber = useUpdateUserPhoneNumber();\n const redirectToPhoneVerification = useRedirectToPhoneVerification();\n\n /**\n * @function callback\n * @param { UserV2 } data\n * @param { number } userId\n * @param { number } roleId\n * @param { boolean } self\n * @param { boolean } shouldShowMessage\n * @param { Function } successCallback\n * @returns { Promise<void> }\n */\n return useCallback(\n (\n data: UserV2,\n userId: number,\n self: boolean,\n shouldShowMessage = true\n ) => {\n dispatch(updateUserProfile());\n const updateUserInfoActionList = [];\n\n updateUserInfoActionList.push(\n updateUserInfo(userId ?? data?.id, {\n firstName: data?.firstName ?? '',\n lastName: data?.lastName ?? '',\n })\n );\n\n if (data?.phoneNumber) {\n updateUserInfoActionList.push(\n updateUserPhoneNumber(\n userId ?? data?.id ?? 0,\n data.phoneNumber\n ).then(() => {\n redirectToPhoneVerification({\n user: { ...data, id: userId },\n verificationStep:\n MobileNumberVerificationStep.VERIFY,\n });\n })\n );\n }\n\n return Promise.all(updateUserInfoActionList)\n .then(() => {\n self\n ? dispatch(updateUserProfileSuccess({ id: userId }))\n : dispatch(updateUserSuccess({ id: userId }));\n shouldShowMessage &&\n showMessage('Profile Updated!', 'success');\n })\n .catch((error: ErrorResult) => {\n self\n ? dispatch(updateUserProfileFailure(error))\n : dispatch(updateUserFailure(error));\n\n shouldShowMessage &&\n showMessage(\n error.errorCode === 409 ? CLIENT_SIDE_ERROR_MESSAGE[PHONE_ALREADY_EXISTS] : error.message,\n 'error'\n );\n });\n },\n [\n dispatch,\n redirectToPhoneVerification,\n showMessage,\n updateUserInfo,\n updateUserPhoneNumber,\n ]\n );\n};\n\n/**\n * @description uploads user photo and sets its media id to user\n * @function useUploadPhotoService\n * @returns { CallableFunction }\n */\nexport const useUploadPhotoService = () => {\n const uploadMedia = useUploadMediaService();\n const setUserPhotoApi = useSetUserPhotoApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { number } userId\n * @param { File } file\n * @returns { Promise<void> }\n */\n return useCallback(\n (userId: number, file: File) => {\n return uploadMedia(file)\n .then((mediaId) => {\n return setUserPhotoApi(userId, mediaId);\n })\n .catch((error) => {\n showMessage(error.message, 'error');\n return Promise.reject(error);\n });\n },\n [uploadMedia, setUserPhotoApi, showMessage]\n );\n};\n\n\n","import axios from 'axios';\n\nexport function fileDownload(response: any, defaultFileName?: string) {\n const octetStreamMime = 'application/octet-stream';\n let fileName = defaultFileName || 'report.csv';\n let contentType = octetStreamMime;\n if (response.headers) {\n const cd = response.headers['content-disposition'];\n\n const regex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const match: any = regex.exec(cd);\n\n contentType = response.headers['content-type'];\n fileName = match[1];\n }\n\n fileName = fileName.replace(/\"/g, '');\n\n try {\n const blob = new Blob([response.data || response], {\n type: contentType,\n });\n\n if (window.navigator && (window.navigator as any).msSaveOrOpenBlob) {\n (window.navigator as any).msSaveOrOpenBlob(blob, fileName);\n } else {\n const elem = window.document.createElement('a');\n elem.href = window.URL.createObjectURL(blob);\n elem.download = fileName;\n document.body.appendChild(elem);\n elem.click();\n document.body.removeChild(elem);\n }\n\n return true;\n } catch (exc) {\n return false;\n }\n}\n\n/**\n * @function handleDownloadVideoFile\n * @param { string } url\n * @param { string } fileName\n * @returns { Promise<void> }\n */\nexport async function handleDownloadVideoFile(\n url: string,\n fileName: string\n): Promise<void> {\n await axios\n .get(url, {\n headers: {\n 'Content-Type': 'video/mp4',\n },\n responseType: 'blob',\n })\n .then(response => {\n if (response.data) {\n const href = window.URL.createObjectURL(response.data);\n const link = document.createElement('a');\n link.href = href;\n link.setAttribute(\n 'download',\n `${fileName.substring(0, 10)}.mp4`\n );\n // Append to html link element page\n document.body.appendChild(link);\n\n // Start download\n link.click();\n\n // Clean up and remove the link\n URL.revokeObjectURL(href);\n link.remove();\n }\n });\n}","import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n height: 100%;\n`;\n\nexport const TableContainer = styled.div`\n width: 100%;\n`;\n\nexport const TableExtendContainer = styled.div`\n border-radius: 16px;\n display: block;\n background: ${props => props.theme.Colors.white};\n`;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Label = styled.div<{ color?: string }>`\n position: absolute;\n top: 0px;\n left: 16px;\n pointer-events: none;\n font-size: 13px;\n -webkit-transition: all 0.18s ease;\n transition: all 0.18s ease;\n display: flex;\n align-items: center;\n height: 100%;\n color: ${props =>\n props.color ? props.color : props.theme.Colors.steelGrey};\n font-weight: normal;\n cursor: pointer;\n`;\n\nexport const SelectLabel: FC<{\n label: string;\n children?: string;\n color?: string;\n dataTest?: string;\n}> = ({ children, label, color, dataTest }) => {\n return <Label color={color} data-test={dataTest}>{children || label}</Label>;\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Tooltip } from '../Tooltip';\n\nconst MenuItem = styled.div<{\n selected?: boolean;\n disabled?: boolean;\n destructive?: boolean;\n}>`\n min-height: 40px;\n color: ${props =>\n !!props.disabled\n ? props.theme.Colors.cloudyBlue\n : !!props.destructive\n ? props.theme.Colors.tomato\n : props.theme.Colors.black};\n border-radius: 4px;\n font-weight: 500;\n font-size: 13px;\n padding: 8px 15px;\n display: flex;\n align-items: center;\n word-break: break-word;\n background: ${props =>\n props.selected\n ? props.theme.Colors.whiteTwo\n : props.theme.Colors.white};\n cursor: ${props => (props.disabled ? `default` : `pointer`)};\n &:hover {\n ${props =>\n !props.disabled && `background: ${props.theme.Colors.whiteTwo};`}\n }\n &:active {\n ${props => !props.disabled && `opacity: 0.7;`}\n }\n`;\n\nexport const SelectMenuItem: FC<{\n forwardedRef?: any;\n name?: string;\n value: string | number;\n children: string;\n onClick: any;\n hideAction: () => void;\n selected?: boolean;\n multiSelect?: boolean;\n disabled?: boolean;\n destructive?: boolean;\n hint?: string;\n dataTest?: string;\n}> = ({\n children,\n onClick,\n value,\n name,\n hideAction,\n selected,\n forwardedRef,\n multiSelect,\n disabled,\n destructive,\n hint,\n dataTest,\n}) => {\n const handleSelectItem = () => {\n if (disabled) return;\n onClick({ target: { value: value, name: name } });\n if (!multiSelect) hideAction();\n };\n\n return !!hint ? (\n <Tooltip label={hint} preset=\"button-icon\">\n <MenuItem disabled={disabled} destructive={destructive} data-test={dataTest}>\n {children}\n </MenuItem>\n </Tooltip>\n ) : (\n <MenuItem\n onClick={handleSelectItem}\n selected={selected}\n disabled={disabled}\n destructive={destructive}\n ref={forwardedRef}\n data-test={dataTest}\n >\n {children}\n </MenuItem>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\n\nconst MenuItem = styled(motion.div)<{\n menuPosition: 'left' | 'right';\n width?: string;\n}>`\n min-width: ${props => (props.width ? props.width : '192px')};\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n ${props => props.menuPosition}: 0;\n top: 8px;\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n max-height: 300px;\n overflow-y: auto;\n padding: 16px;\n`;\n\nconst ANIMATION_SCALE = 5;\n\nexport const SelectMenu: FC<{\n menuPosition?: 'left' | 'right';\n width?: string;\n}> = ({ children, menuPosition, width }) => {\n return (\n <MenuItem\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n menuPosition={menuPosition ? menuPosition : 'right'}\n width={width}\n >\n <ContentArea>{children}</ContentArea>\n </MenuItem>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst StyledSelect = styled.div<{\n height?: number;\n padding?: string;\n fontSize?: string;\n}>`\n width: 100%;\n height: 100%;\n padding: 0 16px;\n box-sizing: border-box;\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n`;\n\nconst StyledSelectValue = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n padding-right: 4px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const SelectInput: FC<{\n children?: any;\n items?: any;\n value?: string | number;\n height?: number;\n padding?: string;\n toggleSelect?: (e?: any) => void;\n fontSize?: string;\n dataTest?: string;\n}> = ({ value, toggleSelect, height, padding, fontSize, dataTest }) => {\n return (\n <StyledSelect\n height={height}\n onClick={toggleSelect}\n padding={padding}\n fontSize={fontSize}\n data-test={dataTest}\n >\n <StyledSelectValue>{value}</StyledSelectValue>\n </StyledSelect>\n );\n};\n","import React, { FC, useRef, useState } from 'react';\nimport { SelectLabel, SelectInput, SelectMenuItem, SelectMenu } from './index';\nimport styled from 'styled-components';\nimport OutsideActionBox from '../OutsideActionBox/OutsideActionBox';\nimport { Variables } from '../../../theme/variables';\nimport UpArrow from '../../icons/UpArrow';\nimport DownArrow from '../../icons/DownArrow';\nimport {\n ALL_FILTER_NAME,\n ALL_FILTER_VALUE,\n} from '../../../constants/interfaces/filters';\n\nconst COLORS: any = {\n light: {\n background: Variables.Colors.whiteFive,\n color: Variables.Colors.steelGrey,\n },\n dark: {\n background: Variables.Colors.darkTwo,\n color: Variables.Colors.whiteTwo,\n },\n gray: {\n background: Variables.Colors.whiteTwo,\n color: Variables.Colors.black,\n },\n transparent: {\n background: Variables.Colors.transparent,\n color: Variables.Colors.steelGrey,\n },\n};\n\nconst StyledSelectForm = styled.div<{\n height?: number;\n error?: boolean;\n variant: string;\n border?: boolean;\n}>`\n box-sizing: border-box;\n position: relative;\n border-radius: 4px;\n min-width: 128px;\n cursor: pointer;\n height: ${props => (props.height ? `${props.height}px` : '40px')};\n width: 100%;\n background: ${props => COLORS[props.variant].background};\n color: ${props => COLORS[props.variant].color};\n box-shadow: inset 0 0 0 ${props => (props.error ? '2px' : '-1px')} ${props => props.theme.Colors.coral};\n -webkit-appearance: none;\n \n border: ${props => (props.border ? 1 : 0)}px solid\n ${props => props.theme.Colors.cloudyBlue};\n &.is-disabled {\n color: ${props => props.theme.Colors.cloudyBlue};\n cursor: default;\n }\n`;\n\nconst Container = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst IconHolder = styled.div`\n width: 8px;\n height: 100%;\n display: flex;\n position: absolute;\n right: 15px;\n top: 0;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const SelectDropdown: FC<{\n label?: string;\n labelColor?: string;\n id?: string;\n items?: Array<any>;\n children?: Array<any>;\n value?: string | number | string[] | number[] | null;\n name?: string;\n defaultValue?: string | number;\n colorTheme?: 'light' | 'dark' | 'gray' | 'transparent';\n onChange?: any;\n disabled?: boolean;\n error?: boolean;\n menuPosition?: 'left' | 'right';\n height?: number;\n fontSize?: string;\n className?: string;\n restrictShowAllName?: boolean;\n openMenuWidth?: string;\n}> = ({\n label,\n labelColor,\n items,\n value,\n onChange,\n name,\n colorTheme,\n menuPosition,\n height,\n fontSize,\n disabled,\n className,\n error,\n restrictShowAllName,\n openMenuWidth,\n}) => {\n const [open, setOpen] = useState(false);\n const selectedRef = useRef(null);\n const multiSelect = Array.isArray(value);\n const findNameByValue = () => {\n if (items) {\n let selectedItems = items.filter(item =>\n Array.isArray(value)\n ? value.includes(item.value as never)\n : item.value === value\n );\n\n if (selectedItems.length < 2) {\n return selectedItems[0] && selectedItems[0].name;\n } else {\n return (\n selectedItems &&\n selectedItems\n .map(item => {\n return item.name;\n })\n .join(', ')\n );\n }\n }\n };\n\n const selectedName = findNameByValue();\n\n return (\n <StyledSelectForm\n variant={colorTheme ? colorTheme : 'light'}\n error={error}\n height={height}\n className={[className, disabled ? 'is-disabled' : undefined].join(\n ' '\n )}\n border={open || (!!value && value !== ALL_FILTER_VALUE)}\n >\n {(label && !value) ||\n (restrictShowAllName &&\n label &&\n !!value &&\n value === ALL_FILTER_VALUE && (\n <SelectLabel label={label} color={labelColor} />\n ))}\n <IconHolder>{open ? <UpArrow /> : <DownArrow />}</IconHolder>\n <SelectInput\n value={\n restrictShowAllName\n ? selectedName === ALL_FILTER_NAME\n ? ''\n : selectedName\n : selectedName\n }\n toggleSelect={() => !disabled && setOpen(!open)}\n height={height}\n fontSize={fontSize}\n />\n\n <Container open={open} toggleOpen={setOpen}>\n <SelectMenu menuPosition={menuPosition} width={openMenuWidth}>\n {items &&\n items.map((item: { value: string; name: string }) => (\n <SelectMenuItem\n forwardedRef={\n (\n Array.isArray(value)\n ? value.includes(\n item.value as never\n )\n : item.value === value\n )\n ? selectedRef\n : null\n }\n key={item.value}\n value={item.value}\n name={name}\n hideAction={() => setOpen(false)}\n onClick={onChange}\n selected={\n Array.isArray(value)\n ? value.includes(item.value as never)\n : item.value === value\n }\n multiSelect={multiSelect}\n >\n {item.name}\n </SelectMenuItem>\n ))}\n </SelectMenu>\n </Container>\n </StyledSelectForm>\n );\n};\n\nexport default SelectDropdown;\n","import { ModalDialogInterface } from './types';\n\nexport const SHOW_MODAL = 'SHOW_MODAL';\nexport const HIDE_MODAL = 'HIDE_MODAL';\nexport const UPDATE_LOADING_STATUS = 'UPDATE_LOADING_STATUS';\n\nexport const initialState: ModalDialogInterface = {\n isLoading: true,\n modalType: null,\n modalProps: null,\n};","export const dfsUpdate = (\n tree: any[],\n id: number,\n field: string,\n value: any\n) => {\n for (let i = 0; i < tree.length; i++) {\n let node = tree[i];\n\n if (!!node && node.id === id) {\n tree[i] = {\n ...node,\n [field]: value,\n };\n\n return i;\n }\n\n const len = node.children.length;\n\n for (let j = 0; j < len; j++) {\n const foundNodeIndex: any = dfsUpdate(\n node.children,\n id,\n field,\n value\n );\n let foundNode = node.children[foundNodeIndex];\n\n if (!!foundNode) {\n node.children[foundNodeIndex] = {\n ...foundNode,\n [field]: value,\n };\n }\n }\n }\n return null;\n};\n\nexport const findAllChildIds = (\n tree: any[],\n rootId: any,\n answer: any[]\n): any => {\n let children = tree.filter(item => item.parentId === rootId);\n\n if (!!children && !!children.length) {\n answer.push(...children);\n for (let i = 0; i < children.length; i++) {\n findAllChildIds(tree, children[i].id, answer);\n }\n }\n};\n","const existsInArray = (list: any[], id: number) => {\n return list.filter(existing => existing && existing.id === id).length > 0;\n};\n\nconst buildFlatArrayParents = (\n item: any,\n combined: any[],\n wholeArray: any[]\n) => {\n if (item.parent) {\n if (!existsInArray(wholeArray, item.parent.id)) {\n combined.push(item.parent);\n }\n buildFlatArrayParents(item.parent, combined, wholeArray);\n }\n return combined;\n};\n\nexport const treeToList = (list?: any[]) => {\n if (!list) return [];\n let flatArray: any = [];\n for (let item of list) {\n if (!existsInArray(flatArray, item.id)) {\n flatArray.push(item);\n }\n\n if (item.parent) {\n flatArray = [\n ...flatArray,\n ...buildFlatArrayParents(item, [], flatArray),\n ];\n }\n if (item.children) {\n for (let child of item.children) {\n if (!existsInArray(flatArray, child.id)) {\n flatArray.push(child);\n }\n }\n }\n }\n\n return flatArray;\n};\n\n// Alternative realization of ^^^ treeToList are missing nodes on 2+ level\nexport const treeToArray = (tree: any[], array: any[] = []): any[] => {\n if (!tree?.length) return [];\n for (let node of tree) {\n if (!existsInArray(array, node.id)) {\n array.push(node);\n if (node.parent) {\n array = treeToArray([node.parent], array);\n }\n if (node.children?.length) {\n array = treeToArray(node.children, array);\n }\n }\n }\n return array;\n};\n","import styled from 'styled-components';\n\nimport { ArrowRight } from '../../../icons/ArrowRight';\n\nexport const Container = styled.div`\n width: webkit-fill-available;\n background-color: ${props => props.theme.Colors.white};\n display: flex;\n align-items: center;\n margin: 16px 8px;\n border-radius: 16px 16px 0 0;\n height: 32px;\n`;\n\nexport const StyledLabel = styled.div`\n font-size: 11px;\n color: ${props => props.theme.Colors.black};\n margin-right: 12px;\n width: 64px;\n white-space: nowrap;\n`;\n\nexport const FilteredByWrapper = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n overflow: auto;\n`;\n\nexport const ScrollIconContainer = styled.div`\n display: flex;\n width: 5px;\n height: 9px;\n`;\n\nexport const ArrowLeft = styled(ArrowRight)`\n transform: scaleX(-1);\n`;\n\nexport const ScrollWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 100%;\n cursor: pointer;\n &:hover {\n opacity: 0.9;\n }\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const StyledFilteredByContainer = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n overflow-y: hidden;\n overflow-x: auto;\n ::-webkit-scrollbar {\n height: 0;\n }\n`;\n\nexport const StyledFilteredByItem = styled.div`\n border-radius: 4px;\n background-color: ${props => props.theme.Colors.darkSkyBlue15};\n font-size: 11px;\n color: ${props => props.theme.Colors.darkSkyBlue};\n border: 1px solid ${props => props.theme.Colors.darkSkyBlue};\n text-align: center;\n padding: 0 12px;\n display: flex;\n height: 32px;\n line-height: 32px;\n text-wrap: nowrap;\n margin: 2px 4px;\n`;\n\nexport const IconHolderForClose = styled.div<{ scaleX?: number }>`\n width: 8px;\n display: flex;\n cursor: pointer;\n color: ${props => props.theme.Colors.darkSkyBlue};\n flex-shrink: 0;\n margin-left: 8px;\n`;\n\n","import { FC } from 'react';\n\nimport ArrowRight from '../../../icons/ArrowRight';\nimport { scrollLeft, scrollRight } from './helper';\nimport Close from '../../../icons/Close';\n\nimport { TableDivider } from '../table-divider';\nimport {\n ArrowLeft,\n Container,\n FilteredByWrapper,\n IconHolderForClose,\n ScrollIconContainer,\n ScrollWrapper,\n StyledFilteredByContainer,\n StyledFilteredByItem,\n StyledLabel,\n} from './style';\nimport { TableHeaderFilterViewProps } from './type';\n\nconst TableHeaderFilterView: FC<TableHeaderFilterViewProps> = props => {\n const {\n onLabelRemove,\n showLeftArrow,\n showRightArrow,\n wrapperRef,\n handleScroll,\n filteredByNames,\n } = props;\n\n return (\n <>\n <Container>\n <StyledLabel>Filtered by:</StyledLabel>\n {showLeftArrow && (\n <ScrollWrapper\n onClick={() => {\n scrollRight(wrapperRef?.current);\n }}\n >\n <ScrollIconContainer>\n <ArrowLeft />\n </ScrollIconContainer>\n </ScrollWrapper>\n )}\n <FilteredByWrapper>\n <StyledFilteredByContainer\n ref={wrapperRef}\n onScroll={e => handleScroll(e)}\n >\n {filteredByNames?.map((item: any) => (\n <StyledFilteredByItem key={item.id}>\n {item.title}\n <IconHolderForClose\n onClick={(e: any) => {\n e.stopPropagation();\n onLabelRemove && onLabelRemove(item);\n }}\n >\n <Close />\n </IconHolderForClose>\n </StyledFilteredByItem>\n ))}\n </StyledFilteredByContainer>\n </FilteredByWrapper>\n {showRightArrow && (\n <ScrollWrapper\n onClick={() => {\n scrollLeft(wrapperRef && wrapperRef.current);\n }}\n >\n <ScrollIconContainer>\n <ArrowRight />\n </ScrollIconContainer>\n </ScrollWrapper>\n )}\n </Container>\n <TableDivider />\n </>\n );\n};\n\nexport default TableHeaderFilterView;\n","const SCROLL_BY = 100;\n\nexport const scrollLeft = (element?: any) => {\n if (element) {\n element.scrollLeft += SCROLL_BY;\n }\n};\n\nexport const scrollRight = (element?: any) => {\n if (element) {\n element.scrollLeft -= SCROLL_BY;\n }\n};\n","import { FC, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { listToTree } from '../../../../helpers/functions/list-to-tree';\nimport {\n useSaveUserFiltersService,\n useSetLabelFilterActionService,\n} from '../../../../features/labels/store/services';\nimport { useHandleSelectLabels } from '../../../../features/labels/tools';\nimport { usePermissionsState } from '../../../../features/permissions/store/state';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\n\nimport { usePortableLabelsState } from '../../../../features/portableLabels/store/states';\nimport { TreeDfsNameMapper } from '../../../../helpers/classes/TreeDfsNameMapper';\nimport { FilteredByNameType, TableHeaderFilterControllerProps } from './type';\nimport { Label } from '../../../../constants/interfaces/Label';\nimport TableHeaderFilterView from './view';\n\nconst TableHeaderFilterController: FC<TableHeaderFilterControllerProps> = props => {\n const { selectedLabels, onRemoveLabel } = props;\n\n const labelsList = usePortableLabelsState().data;\n const setLabelFilters = useSetLabelFilterActionService();\n const handleSelectLabels = useHandleSelectLabels();\n const permissions = usePermissionsState();\n const saveUserFilters = useSaveUserFiltersService();\n const [savingLabels, setSavingLabels] = useState(false);\n const [filteredByNames, setFilteredByNames] = useState<\n FilteredByNameType[]\n >([]);\n const [showLeftArrow, setShowLeftArrow] = useState(false);\n const [showRightArrow, setShowRightArrow] = useState(false);\n\n const wrapperRef = useRef<any>(null);\n\n /**\n * @function handleLabelSelection\n * @param { Label } label\n * @returns { void }\n */\n const handleLabelSelection = (label: Label): void => {\n if (selectedLabels) {\n const labelsTree = listToTree(labelsList?.items);\n setLabelFilters(\n handleSelectLabels(label, selectedLabels, labelsTree)\n );\n setSavingLabels(true);\n }\n };\n\n /**\n * @function setShowNavArrows\n * @returns { void }\n */\n const setShowNavArrows = useCallback(() => {\n const element = wrapperRef?.current;\n if (!element) return;\n const isLeftArrowVisible = element.scrollLeft > 0;\n const isRightArrowVisible = element.scrollWidth > element.clientWidth\n && element.scrollLeft + element.clientWidth <= element.scrollWidth;\n setShowLeftArrow(isLeftArrowVisible);\n setShowRightArrow(isRightArrowVisible);\n }, []);\n\n useEffect(() => {\n const selectedItems = (selectedLabels || []).map(item =>\n item >= 0 ? item : Math.abs(item)\n );\n\n if (!!labelsList && labelsList.items.length > 0 && selectedItems) {\n const treeDfsNameMapper = new TreeDfsNameMapper(\n labelsList.items,\n selectedItems\n );\n\n const names = treeDfsNameMapper.getNames();\n setFilteredByNames(names);\n }\n setTimeout(setShowNavArrows, 0);\n }, [labelsList, selectedLabels, setShowNavArrows]);\n\n useEffect(() => {\n setShowNavArrows();\n window.addEventListener('resize', setShowNavArrows);\n return () => {\n window.removeEventListener('resize', setShowNavArrows);\n };\n }, [setShowNavArrows]);\n\n useEffect(() => {\n if (\n savingLabels &&\n selectedLabels &&\n permissions.includes(NEW_PERMISSIONS.SAVE_SEARCH_FILTER)\n ) {\n saveUserFilters(selectedLabels);\n setSavingLabels(false);\n }\n }, [\n selectedLabels,\n savingLabels,\n setSavingLabels,\n saveUserFilters,\n permissions,\n ]);\n\n if (!selectedLabels || selectedLabels.length < 1) {\n return <></>;\n }\n\n return (\n <TableHeaderFilterView\n onLabelRemove={onRemoveLabel ? onRemoveLabel : handleLabelSelection}\n showLeftArrow={showLeftArrow}\n showRightArrow={showRightArrow}\n wrapperRef={wrapperRef}\n handleScroll={setShowNavArrows}\n filteredByNames={filteredByNames}\n />\n );\n};\n\nexport default TableHeaderFilterController;\n","export enum MobileNumberVerificationStep {\n ENTER = 'enter',\n VERIFY = 'verify'\n}\n\nexport interface AddMobileNumberViewProps {\n userId?: number;\n mobileNumber: string;\n canSkip: boolean;\n currentStep: MobileNumberVerificationStep;\n onMobileNumberChange: (mobileNumber: string) => void;\n onSendCode: () => void;\n onSkip: () => void;\n onVerify: () => void;\n onBackFromVerify: () => void;\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Trash = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 15 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"0.3\"\n d=\"M14.5 3H14v12c0 .552-.448 1-1 1H2c-.552 0-1-.448-1-1V3H.5C.224 3 0 2.776 0 2.5S.224 2 .5 2H5V.5c0-.276.224-.5.5-.5h4c.276 0 .5.224.5.5V2h4.5c.276 0 .5.224.5.5s-.224.5-.5.5zM9 1H6v1h3V1zm4 2H2v11.5c0 .276.224.5.5.5h10c.276 0 .5-.224.5-.5V4v.001V3zm-3 3.5h1v6h-1v-6zm-3-1h1v7H7v-7zm-3 1h1v6H4v-6z\"\n />\n </svg>\n );\n }\n);\n\nexport default Trash;\n","export default __webpack_public_path__ + \"static/media/auth-background.d40723f0.png\";","export default __webpack_public_path__ + \"static/media/auth-background2x.4327ca9e.png\";","export default __webpack_public_path__ + \"static/media/auth-background3x.64a9bf46.png\";","import { useCallback } from 'react';\nimport { useHistory } from 'react-router';\nimport { useGetUserFeaturesService } from '../../features/users/store/services';\nimport { UserInterface, UserV2 } from '../../constants/interfaces/User';\nimport { MobileNumberVerificationStep } from '../../pages/Auth/AddMobileNumber/types';\nimport ROUTES from '../../routes/routes';\n\nexport interface PhoneVerificationParams {\n user: UserInterface | UserV2;\n isNewUser?: boolean;\n verificationStep?: MobileNumberVerificationStep;\n from?: Location\n}\n\nexport const useRedirectToPhoneVerification = () => {\n const history = useHistory();\n const getUserFeatures = useGetUserFeaturesService();\n return useCallback((params: PhoneVerificationParams, cancelIfCanSkip: boolean = false) => {\n getUserFeatures(params.user.id)\n .then((data) => {\n if (cancelIfCanSkip && !!data && !!data.phoneSkip?.allow)\n return;\n history.push(ROUTES.AUTH_PAGES.ADD_MOBILE_NUMBER, params)\n });\n }, [history, getUserFeatures]);\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TriangleDown = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 8 5\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M3.6 4.8l-3-4C.434.58.48.266.7.1.787.035.892 0 1 0h6c.276 0 .5.224.5.5 0 .108-.035.213-.1.3l-3 4c-.166.22-.48.266-.7.1-.038-.028-.072-.062-.1-.1z\"\n />\n </svg>\n );\n }\n);\n\nexport default TriangleDown;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TriangleRight = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 5 8\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4.8 4.067l-4 3c-.22.165-.534.12-.7-.1-.065-.087-.1-.192-.1-.3v-6c0-.276.224-.5.5-.5.108 0 .213.035.3.1l4 3c.22.165.266.479.1.7-.028.038-.062.071-.1.1z\"\n />\n </svg>\n );\n }\n);\n\nexport default TriangleRight;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoLabels = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 24 32\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\">\n <g>\n <g>\n <g>\n <path\n fillRule=\"nonzero\"\n d=\"M24 30.001V17.998h-2V10L12 2.5 2 10v20h8v1.997h12.013l-.012.003H2C.895 32 0 31.105 0 30V9l12-9 12 9v21.001zM12 15.998c-2.209 0-4-1.791-4-4 0-2.21 1.791-4 4-4 2.21 0 4 1.79 4 4 0 2.209-1.79 4-4 4zm0-6.001c-1.105 0-2 .895-2 2 0 1.106.895 2 2 2 1.104 0 2-.894 2-2 0-1.105-.896-2-2-2z\"\n transform=\"translate(-1104 -380) translate(0 184) translate(1029 196) translate(75)\"\n />\n <path\n d=\"M8 32v-2h14V17h2v13c0 1.054-.816 1.918-1.85 1.995L22 32H8z\"\n transform=\"translate(-1104 -380) translate(0 184) translate(1029 196) translate(75)\"\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoLabels;\n","import { Action } from 'redux';\n\nexport const encapsulateAction = <T extends Action>(\n encapsulateTerm: string,\n action: T\n): T => ({ ...action, type: `${encapsulateTerm}${action.type}` });\n","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n width: 100%;\n height: 100%;\n flex: 1;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const EmptyStateContainer: FC = memo(({ children }) => (\n <Container>{children}</Container>\n));\n","import React, { ChangeEventHandler, FocusEventHandler, FC, ReactElement } from 'react';\nimport styled from 'styled-components';\nimport { Textarea } from '../Textarea/Textarea';\nimport { Variables } from '../../../theme/variables';\n\nconst StyledFormikField = styled.div<{ minHeight?: string }>`\n min-height: ${props => (!!props.minHeight ? props.minHeight : '176px')};\n`;\n\nconst StledTextareaContainer = styled.div<{\n height?: string;\n disabled?: boolean;\n color: string;\n background?: string;\n padding?: string;\n borderRadius?: string;\n}>`\n position: relative;\n border-radius: ${props =>\n !!props.borderRadius ? props.borderRadius : '16px'};\n padding: ${props => (!!props.padding ? props.padding : '23px 32px')};\n background: ${props => props.background ?? Variables.Colors.whiteTwo};\n`;\n\nconst StyledTextarea = styled(Textarea)<{\n fontSize?: string;\n fontWeight?: number;\n minHeight?: string;\n}>`\n ${props => (!!props.fontSize ? `font-size: ${props.fontSize};` : '')}\n ${props =>\n !!props.minHeight\n ? `min-height: ${props.minHeight};`\n : ''}\n &::placeholder {\n font-size: ${props => (!!props.fontSize ? props.fontSize : '15px')};\n font-weight: ${props =>\n !!props.fontWeight ? props.fontWeight : '600'};\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n }\n`;\n\nconst StyledCounter = styled.div<{ color?: string, counterPosition?: string }>`\n font-size: 13px;\n text-align: ${props => props.counterPosition ? props.counterPosition : 'right'};\n color: ${props =>\n !!props.color ? props.color : props.theme.Colors.coolGray};\n`;\n\nexport const TextAreaPlaceholderBox: FC<{\n value?: string;\n field?: any;\n form?: { touched: any; errors: any };\n name?: string;\n onChange?: ChangeEventHandler<HTMLTextAreaElement>;\n onFocus?: FocusEventHandler<HTMLTextAreaElement>;\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n max?: number;\n width?: string;\n background?: string;\n color?: string;\n disabled?: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n readOnly?: boolean;\n padding?: string;\n fontSize?: string;\n minRows?: number;\n maxRows?: number;\n borderRadius?: string;\n placeholderFontWeight?: number;\n minHeight?: string;\n counterColor?: string;\n textAreaMinHeight?: string;\n dataTest?: string;\n className?: string;\n counterPosition?: string;\n counterWarningText?: ReactElement\n}> = ({\n field,\n value,\n disabled,\n max,\n background,\n autoFocus,\n color,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n readOnly,\n fontSize,\n minRows,\n maxRows,\n padding,\n borderRadius,\n placeholderFontWeight,\n minHeight,\n counterColor,\n textAreaMinHeight,\n dataTest,\n className,\n counterPosition,\n counterWarningText\n}) => {\n const TextAreaStyles = {\n flex: 1,\n lineHeight: 1.13,\n letterSpacing: '0.4px',\n };\n\n return (\n <StyledFormikField minHeight={minHeight}>\n <StledTextareaContainer\n disabled={disabled}\n color={color ? color : Variables.Colors.white}\n background={background}\n padding={padding}\n borderRadius={borderRadius}\n className={className}\n >\n <StyledTextarea\n value={value}\n styles={TextAreaStyles}\n {...field}\n placeholder={placeholder}\n max={max}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n disabled={disabled}\n autoFocus={autoFocus}\n readOnly={readOnly}\n fontSize={fontSize}\n minRows={minRows}\n maxRows={maxRows}\n fontWeight={placeholderFontWeight}\n minHeight={textAreaMinHeight}\n dataTest={dataTest}\n />\n {max && (\n <StyledCounter color={counterColor} data-test={dataTest && `${dataTest}-counter`} counterPosition={counterPosition}>\n {value ? value.length : '0'}/{max} <span data-test={dataTest && `${dataTest}-error-text`}>{counterWarningText}</span>\n </StyledCounter>\n )}\n </StledTextareaContainer>\n </StyledFormikField>\n );\n};\n\nexport default TextAreaPlaceholderBox;\n","import { useSelector } from 'react-redux';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\n\ntype PortablePractisSetsBaseState = {\n data: ListResult<PractisSets>;\n loading: boolean;\n};\n\nexport type PortablePractisSetsState = PortablePractisSetsBaseState;\n\nexport const initialState = {\n data: {\n items: [],\n limit: 0,\n offset: 0,\n count: 0,\n lastUpdated: undefined,\n },\n loading: false,\n};\n\nexport const usePortablePractisSetsState = (): PortablePractisSetsBaseState => {\n const appState = useSelector(state => state);\n return appState.portablePractisSets;\n};\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n position: relative;\n`;\n\nexport const Wrapper = styled.div<{ top?: number; fontSize?: number }>`\n position: absolute;\n display: flex;\n align-items: center;\n right: 0;\n top: ${({ top }) => (top ? `${top}px` : '-26px')};\n text-align: right;\n font-size: ${({ fontSize }) => (fontSize ? `${fontSize}px` : '13px')};\n font-weight: normal;\n color: ${props => props.theme.Colors.steelGrey};\n display: flex;\n align-items: center;\n line-height: 18px;\n height: 18px;\n`;\n\nexport const ButtonIcon = styled.div<{ disabled?: boolean }>`\n width: 16px;\n height: 16px;\n`;\n\nexport const LabelButton = styled.button`\n background: none;\n display: flex;\n outline: none;\n border: none;\n font-size: 13px;\n font-family: ${props => props.theme.Fonts.manrope};\n font-weight: normal;\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.darkSkyBlue};\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n\n &:hover {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.lightBlue};\n }\n &:active {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.windowBlue};\n }\n\n &:hover ${ButtonIcon} {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.lightBlue};\n }\n &:active ${ButtonIcon} {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.windowBlue};\n }\n\n padding: 0;\n`;\n\nexport const Divider = styled.span`\n width: 1px;\n height: 18px;\n background-color: ${({ theme }) => theme.Colors.paleGrey};\n margin-left: 4px;\n margin-right: 4px;\n`;\n\nexport const ButtonText = styled.span`\n margin-left: 4px;\n line-height: 18px;\n`;\n\nexport const StyledSpan = styled.span`\n padding-left: 4px;\n padding-right: 4px;\n`;\n","import { FC, memo } from 'react';\n\nimport { CheckPermission } from '../../../../../features/permissions';\nimport {\n LabelButton,\n StyledSpan,\n ButtonIcon,\n ButtonText,\n Divider,\n} from '../styles';\nimport { TableRefreshButtonProps } from './type';\n\nconst TableRefreshButton: FC<TableRefreshButtonProps> = memo(props => {\n const { permissions, onPress, disabled, icon, name, dataTest } = props;\n\n return (\n <CheckPermission permissions={permissions}>\n <StyledSpan>\n <LabelButton\n onClick={onPress}\n disabled={disabled}\n data-test={dataTest && `${dataTest}-button`}\n >\n <ButtonIcon data-test={dataTest && `${dataTest}-icon`}>{icon}</ButtonIcon>\n <ButtonText data-test={dataTest && `${dataTest}-text`}>{name}</ButtonText>\n </LabelButton>\n </StyledSpan>\n <Divider />\n </CheckPermission>\n );\n});\n\nexport default TableRefreshButton;\n\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TableRefreshIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 2.5a5.487 5.487 0 0 0-4.131 1.869l1.204 1.204A.25.25 0 0 1 4.896 6H1.25A.25.25 0 0 1 1 5.75V2.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.001 7.001 0 0 1 14.929 7h-1.52A5.502 5.502 0 0 0 8 2.5zM1.07 9a7.001 7.001 0 0 0 12.123 3.693l1.38 1.38a.25.25 0 0 0 .427-.177V10.25a.25.25 0 0 0-.25-.25h-3.646a.25.25 0 0 0-.177.427l1.204 1.204A5.502 5.502 0 0 1 2.591 9H1.07z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n\nexport default TableRefreshIcon;\n","import { FC, memo } from 'react';\n\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport {\n ButtonIcon,\n Container,\n LabelButton,\n StyledSpan,\n Wrapper,\n} from './styles';\nimport { TableRefreshProps } from './types';\nimport { TableRefreshButton } from './table-refresh-button';\nimport TableRefreshIcon from '../../../icons/TableRefresh';\n\nconst TableRefresh: FC<TableRefreshProps> = memo(props => {\n const { lastRefreshed, refreshData, buttons, top, fontSize, dataTest = 'table-timestamp' } =\n props;\n\n return (\n <Container>\n <Wrapper top={top} fontSize={fontSize}>\n {buttons?.map(button => (\n <TableRefreshButton {...button} />\n ))}\n <StyledSpan data-test={dataTest && `${dataTest}-label`}>\n {`Updated`}\n {formatDate(lastRefreshed)}\n </StyledSpan>\n <span>\n <LabelButton\n onClick={refreshData}\n data-test={dataTest && `${dataTest}-refresh`}\n >\n <ButtonIcon>\n <TableRefreshIcon />\n </ButtonIcon>\n </LabelButton>\n </span>\n </Wrapper>\n </Container>\n );\n});\n\nexport default TableRefresh;\n","import styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport Calendar from 'react-calendar';\nimport { Button } from '../Button';\n\nexport const IconHolder = styled.div<{ scaleX?: number; disabled?: boolean }>`\n width: 7px;\n height: 14px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.blackThree\n : props.theme.Colors?.skyBlueTwo};\n transform: scaleX(${props => props.scaleX || 1});\n\n &:hover {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.lightBlue};\n }\n &:active {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.windowBlue};\n }\n`;\n\nexport const Header = styled.div`\n width: 100%;\n height: 103px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n background-color: ${props => props.theme.Colors?.darkSkyBlueThree};\n border-radius: 8px 8px 0px 0px;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n justify-content: space-between;\n padding: 24px;\n`;\n\nexport const Title = styled.div`\n font-size: 24px;\n font-weight: 800;\n color: ${props => props.theme.Colors?.white};\n`;\n\nexport const Subtitle = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors?.white};\n`;\n\nexport const RemoveDateTitle = styled.div<{ disabled?: boolean }>`\n font-size: 13px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.skyBlueTwo};\n display: flex;\n align-items: center;\n font-weight: 500;\n cursor: pointer;\n pointer-events: ${({ disabled }) => (disabled ? 'none' : 'default')};\n\n &:hover {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.lightBlue};\n }\n &:active {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.windowBlue};\n }\n`;\n\nexport const IconContainer = styled.div`\n margin-right: 4px;\n font-size: 5px;\n`;\n\nexport const StyledCalendar = styled(Calendar)`\n width: calc(100% - 30px);\n min-height: 302px;\n margin: 0 auto;\n .react-calendar__navigation {\n height: 32px;\n margin: 22px 0px;\n justify-content: center;\n\n .react-calendar__navigation__label {\n font-size: 18px;\n font-weight: bold;\n background: ${props => props.theme.Colors.white};\n color: ${props => props.theme.Colors.blackThree};\n border: none;\n flex-grow: 0 !important;\n font-family: 'Manrope';\n pointer-events: none;\n margin: 0px 3px;\n }\n\n .react-calendar__navigation__arrow {\n background: ${props => props.theme.Colors.white};\n border: none;\n cursor: pointer;\n\n &[disabled] {\n pointer-events: none;\n opacity: 0.4;\n }\n }\n }\n\n .react-calendar__month-view__weekdays {\n margin-bottom: 12px;\n\n .react-calendar__month-view__weekdays__weekday {\n background: ${props => props.theme.Colors.white};\n color: ${props => props.theme.Colors.blackThree};\n border: none;\n width: 25px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n font-weight: bold;\n font-family: 'Manrope';\n abbr[title] {\n text-decoration: none;\n }\n }\n }\n\n .react-calendar__month-view__days {\n .react-calendar__month-view__days__day {\n background: ${props => props.theme.Colors.white};\n border: none;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n font-weight: 500;\n font-family: 'Manrope';\n padding: 0;\n abbr {\n text-decoration: none;\n color: ${props => props.theme.Colors.black};\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n &:hover {\n background: ${props => props.theme.Colors.whiteFive};\n border-radius: 2px;\n }\n flex-basis: unset !important;\n margin: 0px 7px;\n &:disabled {\n cursor: default;\n pointer-events: none;\n abbr {\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n }\n }\n }\n\n .react-calendar__tile.react-calendar__month-view__days__day.react-calendar__month-view__days__day--neighboringMonth {\n abbr {\n color: #6f7f8a;\n }\n }\n\n .react-calendar__tile.react-calendar__month-view__days__day.react-calendar__month-view__days__day--neighboringMonth:disabled {\n abbr {\n color: white;\n pointer-events: none;\n }\n }\n\n .react-calendar__tile.react-calendar__tile--now.react-calendar__month-view__days__day {\n abbr {\n color: ${props => props.theme.Colors.black};\n border-bottom: 2px solid ${props => props.theme.Colors.black};\n width: 24px;\n height: 20px;\n }\n }\n\n .react-calendar__month-view__days {\n justify-content: space-between;\n }\n\n .react-calendar__tile.react-calendar__tile--active {\n border-radius: 2px;\n background: ${props => props.theme.Colors.skyBlueTwo};\n abbr {\n color: ${props => props.theme.Colors.white};\n }\n &:hover {\n background: ${props => props.theme.Colors.skyBlueTwo};\n cursor: auto;\n }\n &.react-calendar__tile--now abbr {\n color: var(--ps-white-1);\n border-bottom: 2px solid var(--ps-white-1);\n }\n }\n`;\n\nexport const StyledDialogBlacker = styled(motion.div)`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1200;\n background: rgba(35, 46, 58, 0.8);\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const StyledDialog = styled(motion.div)<{\n width?: number;\n padding?: string;\n}>`\n width: ${props => props.width || '390'}px;\n border-radius: 2px;\n box-shadow: 0 5px 20px -5px rgba(166, 174, 190, 0.5);\n background-color: ${props => props.theme.Colors.white};\n border-radius: 8px;\n`;\n\nexport const CancelButton = styled(Button)`\n background: #fff;\n color: #4aa9e2;\n box-shadow: inset 0 0 0 1px #4aa9e2;\n\n &:hover {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.lightBlue};\n }\n &:active {\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.windowBlue};\n }\n`;\n","import React, { FC, useState } from 'react';\nimport { OnChangeDateCallback } from 'react-calendar';\nimport dayjs from 'dayjs';\n\nimport TrashBinIcon from '../../icons/TrashBin';\nimport ArrowRightIcon from '../../icons/ArrowRight';\nimport { Button } from '../Button';\nimport { formatDate, getDateWithTZOffset } from '../../../helpers/functions/date-convert';\nimport {\n IconHolder,\n Header,\n Footer,\n Title,\n Subtitle,\n RemoveDateTitle,\n IconContainer,\n StyledCalendar,\n StyledDialogBlacker,\n StyledDialog,\n CancelButton,\n} from './styles';\nimport { dueDateTitleTypes } from './constants';\nimport { DATE_FORMAT } from '../../../constants/interfaces/DueDates';\nimport { DueDateCalendarProps } from './type';\n\nconst DueDateCalendar: FC<DueDateCalendarProps> = ({\n data,\n onCancel,\n onApply,\n}) => {\n const { count, type, dueDate, isSubTitleVisible } = data || {};\n const [actionsDisabled, setActionsDisabled] = useState(true);\n const [currentDueDate, setCurrentDueDate] = useState<string | null>(\n dueDate ? dayjs(dueDate as Date).format(DATE_FORMAT) : null\n );\n const [currentType, setCurrentType] = useState<string>(type);\n const [activeStartDate, setActiveStartDate] = useState<Date>(new Date());\n\n /**\n * @function handleDueDateChange\n * @param { Date | Date[] } date\n * @returns { void }\n */\n const handleDueDateChange: OnChangeDateCallback = date => {\n setCurrentDueDate(\n date ? dayjs(date as Date).format(DATE_FORMAT) : null\n );\n setCurrentType('SINGLE');\n setActionsDisabled(false);\n };\n\n /**\n * @function handleClose\n * @param { React.MouseEvent } e\n * @returns { void }\n */\n const handleClose = (e: React.MouseEvent): void => {\n e.currentTarget === e.target && onCancel();\n };\n\n /**\n * @function onActiveStartDateChange\n * @param { Date } date\n * @returns { void }\n */\n const onActiveStartDateChange = (date: Date): void => {\n date && setActiveStartDate(date);\n };\n\n const isRemoveDateTitleDisabled =\n !currentDueDate && currentType !== 'MULTIPLE';\n\n const isPrevArrowDisabled =\n activeStartDate.getMonth() === new Date().getMonth();\n\n /**\n * @function getExactDate\n * @param { string } currentDueDate\n * @returns { Date } \n */\n const getExactDate = (currentDueDate: string) => {\n let date = new Date(currentDueDate);\n let userTimezoneOffset = date.getTimezoneOffset() * 60000;\n return new Date(date.getTime() + userTimezoneOffset);\n }\n return (\n <StyledDialogBlacker onClick={handleClose}>\n <StyledDialog initial={{ scale: 0.8 }} animate={{ scale: 1 }}>\n <Header>\n <Title>\n {\n dueDateTitleTypes[\n (currentType ||\n type) as keyof typeof dueDateTitleTypes\n ]\n }\n {currentDueDate\n ? formatDate(currentDueDate, false, false)\n : null}\n </Title>\n {isSubTitleVisible && (\n <Subtitle>\n {`${count} user${\n count > 1 ? 's' : ''\n } will be affected and notified.`}\n </Subtitle>\n )}\n </Header>\n <StyledCalendar\n value={currentDueDate ? getExactDate(currentDueDate) : null} // use it in controlled way\n calendarType={'US'}\n locale=\"en\" // always use US locale\n formatShortWeekday={(_, date) =>\n ['S', 'M', 'T', 'W', 'T', 'F', 'S'][date.getDay()]\n }\n prev2Label={null}\n next2Label={null}\n nextLabel={\n <IconHolder>\n <ArrowRightIcon />\n </IconHolder>\n }\n prevLabel={\n <IconHolder scaleX={-1} disabled={isPrevArrowDisabled}>\n <ArrowRightIcon />\n </IconHolder>\n }\n onChange={handleDueDateChange}\n showNeighboringMonth={true}\n onActiveStartDateChange={date =>\n onActiveStartDateChange(date?.activeStartDate)\n }\n minDate={dayjs().add(1, 'day').startOf('day').toDate()}\n />\n <Footer>\n <RemoveDateTitle\n disabled={isRemoveDateTitleDisabled}\n onClick={() => {\n setCurrentType('NO_DUEDATE');\n setCurrentDueDate(null);\n setActionsDisabled(false);\n }}\n >\n <IconContainer>\n <TrashBinIcon />\n </IconContainer>\n Remove Due Date\n </RemoveDateTitle>\n <CancelButton\n label={'Cancel'}\n height={'40px'}\n width={'86px'}\n style={{ marginLeft: '27px' }}\n action={onCancel}\n />\n <Button\n label={'Apply'}\n height={'40px'}\n width={'86px'}\n disabled={actionsDisabled}\n action={() => onApply(getDateWithTZOffset(currentDueDate))}\n />\n </Footer>\n </StyledDialog>\n </StyledDialogBlacker>\n );\n};\n\nexport default DueDateCalendar;\n","import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n position: absolute;\n width: calc(100% - 48px);\n height: 72px;\n margin-top: -16px;\n z-index: 9;\n display: flex;\n align-items: center;\n padding: 16px;\n color: ${props => props.theme.Colors.steelGrey};\n background: red;\n border-radius: 4px;\n border: solid 1px #eef0f0;\n background: #eef0f0;\n border-radius: 4px;\n`;\n\nexport const SelectedWrapper = styled.div`\n margin-left: 16px;\n color: black;\n font-size: 13px;\n line-height: 19px;\n\n span {\n font-weight: 800;\n }\n`;\n\nexport const SelectAllWrapper = styled.button`\n color: ${props => props.theme.Colors.mainBlue};\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n margin-left: 4px;\n font-size: 13px;\n\n span {\n font-weight: 800;\n }\n\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n`;\n\nexport const ClearWrapper = styled.button`\n color: ${props => props.theme.Colors.mainBlue};\n border: none;\n border-left: 1px solid #cacfcf;\n padding: 1px 0 0 8px;\n margin-left: 8px;\n line-height: 18px;\n font-size: 13px;\n cursor: pointer;\n background: transparent;\n\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n`;\n","import { plural } from '../../../../helpers/functions/plural';\n\nimport {\n Wrapper,\n ClearWrapper,\n SelectAllWrapper,\n SelectedWrapper,\n} from './styles';\nimport { PopupProps } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const SelectAll = <T extends HTMLElement = HTMLElement>({\n totalCount,\n selectedLength,\n itemsPerPage,\n onClearSelecion,\n onSelectAll,\n isSelectAll,\n children,\n style,\n hasAllMembers,\n dataTest\n}: PopupProps) => {\n if (!selectedLength) {\n return null;\n }\n\n const roundToTotal = (count: any) => {\n if (count > totalCount!) {\n return totalCount;\n } else {\n return count;\n }\n };\n\n return (\n <Wrapper style={style}>\n {children}\n <SelectedWrapper>\n {(isSelectAll || selectedLength === totalCount) &&\n totalCount! > 1 &&\n 'All'}\n \n <span data-test={dataTest && `${dataTest}-selected-counter`}>\n {roundToTotal(\n isSelectAll\n ? totalCount! < itemsPerPage\n ? !hasAllMembers\n ? totalCount\n : totalCount! - 1\n : selectedLength < itemsPerPage\n ? totalCount\n : totalCount! - itemsPerPage + selectedLength\n : selectedLength\n )}\n \n {isSelectAll\n ? totalCount && plural(totalCount, 'Item', 'Items')\n : plural(selectedLength, 'Item', 'Items')}\n </span>{' '}\n selected.\n </SelectedWrapper>\n {!isSelectAll && selectedLength !== totalCount && (\n <SelectAllWrapper onClick={onSelectAll} data-test={dataTest && `${dataTest}-select-all`}>\n Select all{' '}\n <span data-test={dataTest && `${dataTest}-select-all-counter`}>\n {!hasAllMembers ? totalCount : totalCount! - 1}{' '}\n {totalCount && plural(totalCount, 'Item', 'Items')}\n </span>\n </SelectAllWrapper>\n )}\n <ClearWrapper onClick={onClearSelecion} data-test={dataTest && `${dataTest}-clear-selection`}>\n Clear Selection\n </ClearWrapper>\n </Wrapper>\n );\n};\n","export const USER_LOGIN = 'USER_LOGIN';\nexport const USER_LOGOUT = 'USER_LOGOUT';\nexport const SET_TOKEN = 'SET_TOKEN';\n\nexport function userLoginAction() {\n return {\n type: USER_LOGIN,\n };\n}\n\nexport function userLogoutAction() {\n return {\n type: USER_LOGOUT,\n };\n}\n\nexport function setTokenAction(token: string) {\n return {\n type: SET_TOKEN,\n token,\n };\n}\n","import { isEmpty } from \"lodash\";\n\nexport const copyTextToClipboard = (text: string) => {\n if(isEmpty(text)) {\n return false\n }\n\n const textArea: any = document.createElement('textarea');\n let successful: 'silent' | boolean = false;\n\n textArea.style.position = 'fixed';\n textArea.style.top = 0;\n textArea.style.left = 0;\n\n textArea.style.width = '2em';\n textArea.style.height = '2em';\n\n textArea.style.padding = 0;\n\n textArea.style.border = 'none';\n textArea.style.outline = 'none';\n textArea.style.boxShadow = 'none';\n\n textArea.style.background = 'transparent';\n\n textArea.value = text;\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n successful = document.execCommand('copy');\n } catch (err) {\n successful = false;\n }\n\n document.body.removeChild(textArea);\n if (!successful) {\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const copyHotkey = isMac ? '⌘C' : 'CTRL+C';\n prompt(`Press ${copyHotkey}`, text);\n successful = 'silent';\n }\n\n return successful;\n};\n","import { EnrollmentInterface } from \"../../../constants/interfaces/Enrollments\";\nimport { SearchParams } from \"../../../constants/interfaces/filters\";\nimport { ListResult } from \"../../../constants/interfaces/PaginationResult\";\nimport { EnrollmentPractisSet } from \"../../../constants/interfaces/PractisSets\";\nimport { userStatusFilters } from \"../../../constants/interfaces/User\";\nimport { getSearchSortingValue } from \"../../../helpers/functions/search-params-helpers\";\nimport { dueDateFiltersValues } from \"../../../ui/components/DueDateCalendar/constants\";\n\nexport const transformEnrollmentsToPractisSets = (data: ListResult<EnrollmentInterface>): ListResult<EnrollmentPractisSet> => {\n const practisSets = data.items?.map((item) => {\n return {...item.practisSet, dueDate: item.dueDate, enrollmentId: item.id}\n });\n\n return { ...data, items: practisSets };\n}\n\nexport const getSearchUserPractisSetsParams = (searchParams: SearchParams) => {\n return {\n status: searchParams.filterByStatus?.map((item) => userStatusFilters[item as keyof typeof userStatusFilters]).join(','),\n dueDate: searchParams.filterByDueDate?.map((item) => dueDateFiltersValues[item as keyof typeof dueDateFiltersValues]).join(','),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'assigned', false)\n };\n}","import styled from 'styled-components';\n\nimport Checkbox from '../../../Checkbox';\n\nexport const CheckboxContainer = styled.div`\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: initial;\n flex-shrink: 0;\n margin-right: 16px;\n`;\n\nexport const StyledCheckbox = styled(Checkbox)`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n`;\n","import { FC } from 'react';\n\nimport { Variables } from '../../../../../theme/variables';\nimport { CheckboxContainer, StyledCheckbox } from './style';\nimport { TableCheckboxProps } from './type';\n\nconst TableCheckbox: FC<TableCheckboxProps> = props => {\n const { checked, partial, disabled, handleCheck, size, dataTest } = props;\n\n return (\n <CheckboxContainer\n onClick={e => {\n e.stopPropagation();\n }}\n >\n <StyledCheckbox\n size={size ? size : 16}\n checked={checked}\n partial={partial}\n disabled={disabled}\n background={Variables.Colors.white}\n handleChange={handleCheck}\n border={Variables.Colors.cloudyBlue}\n dataTest={dataTest}\n />\n </CheckboxContainer>\n );\n};\n\nexport default TableCheckbox;\n","import { ErrorMessagesInterface } from '../ErrorMessages';\nimport { Action } from 'redux';\n\nexport const ADD_MESSAGE = 'ADD_MESSAGE';\nexport const REMOVE_MESSAGE = 'REMOVE_MESSAGE';\n\nexport type DisplayMessageAction = Action<typeof ADD_MESSAGE> & {\n error: ErrorMessagesInterface;\n};\nexport function displayMessage(\n error: ErrorMessagesInterface\n): DisplayMessageAction {\n return {\n type: ADD_MESSAGE,\n error,\n };\n}\n\nexport type HideMessageAction = Action<typeof REMOVE_MESSAGE>;\nexport function hideMessage(): HideMessageAction {\n return {\n type: REMOVE_MESSAGE,\n };\n}\n\nexport type ErrorMessagesActions = DisplayMessageAction | HideMessageAction;\n","import { UserInterface } from \"./User\";\n\nexport interface CompanyInterface {\n id?: number;\n name?: string;\n owner?: UserInterface;\n isSSOEnabled?: boolean;\n isScrimmageEnabled?: boolean;\n ssoConnection?: string;\n ssoDomains?: string[];\n logoUrl?: string;\n logo?: string;\n createdAt?: string;\n updatedAt?: string;\n activatedAt?: string;\n creator?: UserInterface;\n minTrainingScore?: number;\n status?: string;\n usersLimit?: number | null;\n usersCount?: number | null;\n subdomain?: string;\n}\n\nexport enum CompanyStatus {\n ACTIVE = 'ACTIVE',\n DELETED = 'DELETED',\n}\n\nexport const CompanyStatusNames = {\n [CompanyStatus.ACTIVE as string]: 'Active',\n [CompanyStatus.DELETED as string]: 'Inactive',\n};","export const dueDateTitleTypes = {\n MULTIPLE: 'Select Due Date',\n SINGLE: 'Due Date: ',\n NO_DUEDATE: 'No Due Date',\n};\n\nexport const dueDateFiltersValues = {\n 'NO_DUEDATE': 'not_assigned',\n 'OVERDUE': 'overdue',\n 'ASSIGNED': 'assigned'\n}","export const ENROLLMENT_REMIND_TO_START = 'enrollment_remind_to_start';","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TrashBin = forwardRef<SVGSVGElement, IconProps>(() => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M6.5 1.75a.25.25 0 0 1 .25-.25h2.5a.25.25 0 0 1 .25.25V3h-3V1.75zm4.5 0V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75zM4.496 6.675a.75.75 0 1 0-1.492.15l.66 6.6A1.75 1.75 0 0 0 5.405 15h5.19c.9 0 1.652-.681 1.741-1.576l.66-6.6a.75.75 0 0 0-1.492-.149l-.66 6.6a.25.25 0 0 1-.249.225h-5.19a.25.25 0 0 1-.249-.225l-.66-6.6z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n});\n\nexport default TrashBin;\n","export const SEARCH_INPUT_DEBOUNCE_DELAY = 200;","export type TreeDfsItem = {\n id: number;\n title: string;\n};\n\ninterface VisitedBranches {\n [key: number]: boolean | null | undefined;\n}\n\nexport class TreeDfsNameMapper<\n T extends {\n id: number;\n parentId: number | null;\n name: string;\n children?: T[];\n }\n> {\n readonly treeData: T[] = [];\n readonly selectedLabels: number[] = [];\n private visited: VisitedBranches = {};\n private visitedSubTreeVertexes: VisitedBranches = [];\n private answer: TreeDfsItem[] = [];\n private mp: number[] = [];\n private currentAnswer: TreeDfsItem[] = [];\n private subTreeChecker = true;\n\n constructor(public data: T[], public selectedItems: number[]) {\n this.treeData = data;\n this.selectedLabels = selectedItems;\n }\n\n checkSubTreeSelection(id: number) {\n this.visitedSubTreeVertexes[id] = true;\n const itemId = this.treeData.findIndex(item => item.id === id);\n const children = this.treeData[itemId].children || [];\n\n for (let i = 0; i < children.length; i++) {\n let childId = children[i].id;\n\n if (\n this.visited[childId] === null ||\n typeof this.visited[childId] === 'undefined' ||\n !this.visited[childId]\n ) {\n if (!this.selectedLabels.includes(childId)) {\n this.subTreeChecker = false;\n return;\n } else {\n this.checkSubTreeSelection(childId);\n }\n }\n }\n\n return;\n }\n\n dfs(id: number, name = '') {\n const children: T[] = [];\n this.visited[id] = true;\n const itemId = this.treeData.findIndex(item => item.id === id);\n this.visitedSubTreeVertexes = [];\n this.subTreeChecker = true;\n const treeChildren = this.treeData[itemId].children || [];\n\n if (treeChildren.length <= 0 && !this.selectedLabels.includes(id))\n return;\n this.checkSubTreeSelection(id);\n\n if (\n this.subTreeChecker ||\n (treeChildren.length <= 0 && this.selectedLabels.includes(id))\n ) {\n let pathId = this.mp[id];\n let toReverseAnswer = [];\n if (this.selectedLabels.includes(id)) {\n name = this.treeData[itemId].name;\n toReverseAnswer.push(name);\n }\n\n while (pathId !== null && typeof pathId !== 'undefined') {\n // eslint-disable-next-line no-loop-func\n let findIndex = this.treeData.findIndex(el => el.id === pathId);\n name = this.treeData[findIndex].name;\n toReverseAnswer.push(name);\n pathId = this.mp[pathId];\n }\n\n let localAnswer = '';\n for (let i = toReverseAnswer.length - 1; i >= 0; i--) {\n localAnswer += toReverseAnswer[i] + (i === 0 ? '' : '/');\n if (i === 0) {\n this.currentAnswer.push({\n id: id,\n title: localAnswer,\n });\n }\n }\n\n return;\n }\n\n if (treeChildren) {\n for (let j = 0; j < treeChildren.length; j++) {\n children.push(treeChildren[j]);\n }\n }\n\n for (let j = 0; j < children.length; j++) {\n this.mp[children[j].id] = id;\n if (!this.visited[children[j].id]) {\n this.dfs(children[j].id, name);\n }\n }\n return;\n }\n\n getNames() {\n for (let i = 0; i < this.selectedItems.length; i++) {\n if (\n this.visited[this.selectedLabels[i]] === undefined ||\n !this.visited[this.selectedLabels[i]]\n ) {\n this.currentAnswer = [];\n\n let curObj = this.treeData.find(\n item => item.id === this.selectedLabels[i]\n );\n if (!curObj) {\n return this.answer;\n }\n let curObjParId = curObj.parentId;\n while (\n curObjParId !== null &&\n // eslint-disable-next-line no-loop-func\n this.selectedLabels.find(x => x === curObjParId) !== null\n ) {\n curObj = this.treeData.find(\n // eslint-disable-next-line no-loop-func\n item => item.id === curObjParId\n );\n curObjParId = curObj?.parentId || null;\n }\n if (curObj && !this.visited[curObj.id]) {\n this.visited[curObj.id] = true;\n this.dfs(curObj.id, curObj.name);\n if (this.currentAnswer.length <= 0) {\n this.currentAnswer.push({\n id: curObj.id,\n title: curObj.name,\n });\n }\n this.currentAnswer.map(ans => this.answer.push(ans));\n }\n }\n }\n return this.answer;\n }\n}\n","import React, { FC, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { kebabCase } from 'lodash';\n\nimport { TreeDfsNameMapper } from '../../../../../helpers/classes/TreeDfsNameMapper';\nimport { CheckPermission } from '../../../../../features/permissions';\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\nimport Close from '../../../../icons/Close';\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\n\nconst Container = styled.div`\n width: 100%;\n background-color: ${props => props.theme.Colors.white};\n display: flex;\n align-items: center;\n padding-left: 43px;\n min-height: 32px;\n`;\n\nconst FilteredByWrapper = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n overflow: auto;\n`;\n\nconst StyledFilteredByContainer = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n overflow: auto;\n flex-wrap: wrap;\n ::-webkit-scrollbar {\n height: 0;\n }\n`;\n\nconst StyledFilteredByItem = styled.div`\n border-radius: 4px;\n background-color: ${props => props.theme.Colors.darkSkyBlue15};\n font-size: 11px;\n color: ${props => props.theme.Colors.darkSkyBlue};\n border: 1px solid ${props => props.theme.Colors.darkSkyBlue};\n text-align: center;\n padding: 2px 12px;\n display: flex;\n min-height: 32px;\n line-height: 20px;\n text-overflow: ellipsis;\n overflow: hidden;\n margin: 2px 8px 2px 0;\n align-items: center;\n`;\n\nconst IconHolderForClose = styled.div<{ scaleX?: number }>`\n width: 8px;\n display: flex;\n cursor: pointer;\n color: ${props => props.theme.Colors.darkSkyBlue};\n margin-left: 24px;\n`;\n\nconst AssignedLabelList: FC<{\n selectedLabels?: number[];\n onDeleteLabel?(id: number): void;\n hideDeleteButton?: boolean;\n padding?: string;\n deletePermissions?: NEW_PERMISSIONS[];\n colSpan?: number;\n className?: string;\n}> = ({\n selectedLabels,\n onDeleteLabel,\n hideDeleteButton,\n deletePermissions,\n className,\n}) => {\n const [assignedLabelNames, setAssignedLabelNames] = useState<any>([]);\n const labels = usePortableLabelsState().data;\n useEffect(() => {\n const selectedItems = (selectedLabels || []).map(item =>\n item >= 0 ? item : Math.abs(item)\n );\n\n if (!!labels && labels.items.length > 0 && selectedItems) {\n const treeDfsNameMapper = new TreeDfsNameMapper(\n labels.items,\n selectedItems\n );\n const names = treeDfsNameMapper.getNames();\n setAssignedLabelNames(names);\n }\n }, [labels, selectedLabels]);\n\n return (\n <Container className={className} data-test='table-labels-list'>\n <FilteredByWrapper>\n <StyledFilteredByContainer>\n {assignedLabelNames &&\n assignedLabelNames.map((item: any, index: number) => (\n <StyledFilteredByItem key={index} data-test={`table-labels-item-${kebabCase(item.title)}`}>\n {item.title}\n {!hideDeleteButton && onDeleteLabel && (\n <CheckPermission\n permissions={deletePermissions}\n >\n <IconHolderForClose\n onClick={(e: any) => {\n e.stopPropagation();\n onDeleteLabel &&\n onDeleteLabel(item.id);\n }}\n >\n <Close />\n </IconHolderForClose>\n </CheckPermission>\n )}\n </StyledFilteredByItem>\n ))}\n </StyledFilteredByContainer>\n </FilteredByWrapper>\n </Container>\n );\n};\n\nexport default AssignedLabelList;\n","export const DEFAULT_CHALLENGE_TRY_LIMIT = 3;","import React, {\n ChangeEventHandler,\n MouseEventHandler,\n CSSProperties,\n FocusEventHandler,\n KeyboardEvent,\n} from 'react';\nimport styled from 'styled-components';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport { Variables } from '../../../theme/variables';\n\nexport interface TextareaProps {\n label?: string;\n value?: string;\n defaultValue?: string;\n name?: string;\n field?: any;\n autoComplete?: string;\n disabled?: boolean;\n disableUnderline?: boolean;\n placeholder?: string;\n max?: number;\n styles?: CSSProperties;\n onFocus?: FocusEventHandler<HTMLTextAreaElement>;\n onChange?: ChangeEventHandler<HTMLTextAreaElement>;\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n onKeyDown?: (e: KeyboardEvent<HTMLTextAreaElement>) => void;\n autoFocus?: boolean;\n className?: string;\n readOnly?: boolean;\n onMouseUp?: MouseEventHandler<HTMLTextAreaElement>;\n minRows?: number;\n maxRows?: number;\n fontSize?: string;\n dataTest?: string;\n}\n\nconst StyledInput = styled(TextareaAutosize)<{\n color?: string;\n fontSize?: string;\n}>`\n width: 100%;\n resize: none;\n border: none;\n background: transparent;\n color: ${props => props.theme.Colors.black};\n &::placeholder {\n color: ${props => props.theme.Colors.steelGrey};\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n }\n :focus {\n outline: none;\n }\n :disabled {\n background: ${Variables.Colors.backgroundGray};\n }\n`;\n\nexport const Textarea = ({\n field,\n styles,\n disabled,\n autoFocus,\n autoComplete,\n label,\n value,\n defaultValue,\n placeholder,\n max,\n onFocus,\n onBlur,\n onChange,\n className,\n readOnly,\n onMouseUp,\n minRows,\n maxRows,\n fontSize,\n onKeyDown,\n dataTest\n}: TextareaProps) => {\n return (\n <StyledInput\n minRows={minRows ?? 1}\n maxRows={maxRows ?? 150}\n style={styles}\n {...field}\n disabled={disabled}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n label={label}\n defaultValue={defaultValue ? defaultValue : undefined}\n value={value || value === '' ? value : undefined}\n placeholder={placeholder}\n onChange={onChange}\n className={[className, readOnly ? '-view-only' : ''].join(' ')}\n margin=\"normal\"\n maxLength={max}\n onFocus={onFocus}\n onBlur={onBlur}\n readOnly={readOnly}\n onMouseUp={onMouseUp}\n fontSize={fontSize}\n data-test={dataTest}\n onKeyDown={onKeyDown}\n />\n );\n};\n\nexport default Textarea;\n","import styled from 'styled-components';\nimport { makeStyles } from '@material-ui/core';\nimport { motion } from 'framer-motion';\n\nexport const useStyles = makeStyles(theme => ({\n portablePractisSetContainer: {\n height: '350px !important',\n width: '450px !important',\n },\n\n selectAllWrapper: {\n paddingRight: '170px !important',\n },\n}));\n\nexport const HeaderTitle = styled.div`\n width: 336px;\n height: 27px;\n margin: 14px 0;\n font-size: 20px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: left;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nexport const ButtonContainer = styled.div`\n margin-right: 16px;\n`;\n\nexport const Divider = styled.hr<{ margin?: string }>`\n width: 100%;\n height: 1px;\n border: none;\n flex-shrink: 0;\n background-color: ${props => props.theme.Colors.paleGrey};\n margin: ${props => (!!props.margin ? props.margin : '5px 0')};\n`;\n\nexport const PractisSetsContainer = styled(motion.div)<{\n displayOver?: boolean;\n topMargin: number;\n left?: string;\n}>`\n padding: 15px 30px;\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n left: ${props =>\n props.displayOver ? '16px' : !!props.left ? props.left : '0'};\n top: ${props => (props.displayOver ? `-${props.topMargin}px` : '8px')};\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n","import { ReactElement } from 'react';\n\nimport {\n PortablePractisSetsWithStore,\n WithPractisSetsContext,\n} from '../portablePractisSets';\nimport { AssignPractisSetsViewProps } from './type';\nimport {\n Actions,\n ButtonContainer,\n HeaderTitle,\n Divider,\n useStyles,\n} from './styles';\nimport { PopupComponent } from '../../ui/components/Popup';\nimport { Button } from '../../ui/components/Button';\n\nconst AssignPractisSetsView = (\n props: AssignPractisSetsViewProps\n): ReactElement => {\n const {\n triggerRef,\n horizontalOffset,\n verticalOffset,\n isOpen,\n isSaving,\n isApplyButtonDisabled,\n onClose,\n handleApplyPractisSets,\n } = props;\n\n const classes = useStyles();\n\n return (\n <WithPractisSetsContext.Provider\n value={{\n reducerName: 'performance',\n }}\n >\n <PopupComponent\n triggerRef={triggerRef}\n open={isOpen}\n onDismiss={onClose}\n padding=\"10px 24px 24px 24px\"\n horizontalOffset={horizontalOffset}\n verticalOffset={verticalOffset}\n >\n <HeaderTitle data-test=\"assign-practis-sets-header\">Assign Practis Sets and Due Dates</HeaderTitle>\n <PortablePractisSetsWithStore\n showSave={false}\n showSelectActions={true}\n showSearch={true}\n resetSelectedOnUnmount={true}\n className={classes.portablePractisSetContainer}\n selectAllWrapperClassName={classes.selectAllWrapper}\n />\n <Divider />\n <Actions>\n <ButtonContainer>\n <Button\n label={'Cancel'}\n variant={'inverse'}\n action={onClose}\n width={'112px'}\n disabled={isSaving}\n dataTest='cancel-button'\n />\n </ButtonContainer>\n <Button\n label={'Apply'}\n action={handleApplyPractisSets}\n width={'112px'}\n loading={isSaving}\n disabled={isApplyButtonDisabled}\n dataTest='apply-button'\n />\n </Actions>\n </PopupComponent>\n </WithPractisSetsContext.Provider>\n );\n};\n\nexport default AssignPractisSetsView;\n","import { ReactElement } from 'react';\nimport { ClickAwayListener } from '@material-ui/core';\n\nimport {\n PortablePractisSetsWithStore,\n WithPractisSetsContext,\n} from '../portablePractisSets';\nimport { AssignPractisSetsViewProps } from './type';\nimport {\n Actions,\n ButtonContainer,\n HeaderTitle,\n Divider,\n useStyles,\n PractisSetsContainer,\n} from './styles';\nimport { Button } from '../../ui/components/Button';\n\nconst AssignPractisSetsMultipleUsersView = (\n props: AssignPractisSetsViewProps\n): ReactElement => {\n const {\n isOpen,\n isSaving,\n isApplyButtonDisabled,\n onClose,\n handleApplyPractisSets,\n } = props;\n\n const classes = useStyles();\n\n if (!isOpen) return <></>;\n\n return (\n <WithPractisSetsContext.Provider\n value={{\n reducerName: 'performance',\n }}\n >\n <ClickAwayListener onClickAway={onClose}>\n <PractisSetsContainer\n initial={{ scale: 1 / 5 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n topMargin={5}\n >\n <HeaderTitle data-test=\"assign-practis-sets-header\">Assign Practis Sets and Due Dates</HeaderTitle>\n <PortablePractisSetsWithStore\n showSave={false}\n showSelectActions={true}\n showSearch={true}\n resetSelectedOnUnmount={true}\n className={classes.portablePractisSetContainer}\n selectAllWrapperClassName={classes.selectAllWrapper}\n />\n\n <Divider />\n <Actions>\n <ButtonContainer>\n <Button\n label={'Cancel'}\n variant={'inverse'}\n action={onClose}\n width={'112px'}\n disabled={isSaving}\n dataTest='cancel-button'\n />\n </ButtonContainer>\n <Button\n label={'Apply'}\n action={handleApplyPractisSets}\n width={'112px'}\n loading={isSaving}\n disabled={isApplyButtonDisabled}\n dataTest='apply-button'\n />\n </Actions>\n </PractisSetsContainer>\n </ClickAwayListener>\n </WithPractisSetsContext.Provider>\n );\n};\n\nexport default AssignPractisSetsMultipleUsersView;\n","export const SEARCH_USERS_ACTION = 'SEARCH_USERS_ACTION'\nexport const FETCH_USER_ENROLLMENT_ACTION = 'FETCH_USER_ENROLLMENT_ACTION';\nexport const ENROLL_UNENROLL_ACTION = 'ENROLL_UNENROLL_ACTION';\nexport const UPDATE_ENROLLMENT_ACTION = 'UPDATE_ENROLLMENT_ACTION'","import { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport {\n useCreateUpdateEnrollmentDueDate,\n useEnrollPractisSetsToUserApi,\n useGetEnrollments,\n useSearchTeamMembersApi,\n useSearchUsersApi,\n} from '../../../../api';\nimport { EnrollUnenrollParams, UserEnrollmentType } from './types';\nimport {\n EnrollmentsDueDateType,\n EnrollmentType,\n} from '../../../../api/enrollments/types';\nimport { getSearchSortingValue } from '../../../../helpers/functions/search-params-helpers';\nimport { createSearchTeamMembersParams } from '../../../teams/tools';\nimport { PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\nimport { UserStatus } from '../../../users/store/costants';\nimport { SearchUsersParams } from '../../../../api/users/types';\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\nimport { EnrollmentStatus } from '../../../../constants/interfaces/Enrollments';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport {\n ENROLL_UNENROLL_ACTION,\n FETCH_USER_ENROLLMENT_ACTION,\n SEARCH_USERS_ACTION,\n UPDATE_ENROLLMENT_ACTION,\n} from './constants';\nimport { SearchTeamMembersParams } from '../../../../api/teams/types';\n\n/**\n * @function useFetchUserEnrollmentsService\n * @returns { CallableFunction }\n */\nconst useFetchUserEnrollmentsService = () => {\n const getEnrollments = useGetEnrollments();\n\n /**\n * @param { PractisSetWithDueDate[] } selectedPractisSets\n * @param { number[] } userIds\n */\n return useCallback(\n async (\n selectedPractisSets: PractisSetWithDueDate[],\n userIds: number[]\n ) => {\n if (!isEmpty(userIds)) {\n const getEnrollmentSearchParams = {\n users: userIds?.join(','),\n enrollmentStatus: Object.keys(EnrollmentStatus).join(','),\n sort: getSearchSortingValue(null, 'pset_name', true),\n limit: 10000,\n };\n\n const usersEnrollmentsData = await getEnrollments(\n getEnrollmentSearchParams as any\n );\n\n if (!isEmpty(usersEnrollmentsData)) {\n const userEnrollmentResult = selectedPractisSets.reduce(\n (result: UserEnrollmentType[], selectedPractisSet) => {\n const {\n isAlreadyExist,\n isDueDateUpdated,\n enrollmentId,\n } = usersEnrollmentsData.items.reduce(\n (result, item) => {\n if (\n !result.isAlreadyExist &&\n item.practisSet.id ===\n selectedPractisSet.practisSetId\n ) {\n result.isAlreadyExist = true;\n result.enrollmentId = null;\n }\n\n if (\n !result.isDueDateUpdated &&\n item.practisSet.id ===\n selectedPractisSet.practisSetId &&\n item.dueDate !==\n selectedPractisSet.dueDate\n ) {\n result.isDueDateUpdated = true;\n result.enrollmentId = item.id;\n }\n\n return result;\n },\n {\n isAlreadyExist: false,\n isDueDateUpdated: false,\n enrollmentId: null as number | null,\n }\n );\n\n if (!isAlreadyExist) {\n result.push({\n ...selectedPractisSet,\n userId: userIds[0],\n isDueDateUpdated: false,\n });\n }\n\n if (isDueDateUpdated && enrollmentId) {\n result.push({\n enrollmentId,\n dueDate: selectedPractisSet.dueDate,\n isDueDateUpdated: true,\n });\n }\n\n return result;\n },\n []\n );\n\n return userEnrollmentResult;\n }\n }\n },\n [getEnrollments]\n );\n};\n\n/**\n * @function useHandleEnrollmentService\n * @returns { CallableFunction }\n */\nconst useHandleEnrollmentService = () => {\n const enrollPractisSets = useEnrollPractisSetsToUserApi();\n\n /**\n * @param { UserEnrollmentType[] } userEnrollments\n * @returns { Promise<void> }\n */\n return useCallback(\n async (userEnrollments: UserEnrollmentType[]) => {\n const assignedPractisSets = userEnrollments.reduce(\n (\n result: EnrollmentType[],\n { userId, practisSetId, dueDate, isDueDateUpdated }\n ) => {\n if (!isDueDateUpdated) {\n result.push({\n userId: userId!,\n practisSetId: practisSetId!,\n dueDate,\n });\n }\n return result;\n },\n []\n );\n\n if (!isEmpty(assignedPractisSets)) {\n await enrollPractisSets(assignedPractisSets);\n }\n },\n [enrollPractisSets]\n );\n};\n\n/**\n * @function useHandleUpdateEnrollmentService\n * @returns { CallableFunction }\n */\nconst useHandleUpdateEnrollmentService = () => {\n const updateEnrollmentsDueDate = useCreateUpdateEnrollmentDueDate();\n\n /**\n * @param { UserEnrollmentType[] } userEnrollments\n * @returns { Promise<void> }\n */\n return useCallback(\n async (userEnrollments: UserEnrollmentType[]) => {\n const updatedEnrollments = userEnrollments.reduce(\n (\n result: EnrollmentsDueDateType[],\n { enrollmentId, dueDate, isDueDateUpdated }\n ) => {\n if (isDueDateUpdated) {\n result.push({\n enrollmentId: enrollmentId!,\n dueDate,\n });\n }\n return result;\n },\n []\n );\n\n if (!isEmpty(updatedEnrollments)) {\n await updateEnrollmentsDueDate(updatedEnrollments);\n }\n },\n [updateEnrollmentsDueDate]\n );\n};\n\n/**\n * @function useGenerateAllUsersEnrollmentActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateAllUsersEnrollmentActionList() {\n const searchUsersWithTeamApi = useSearchTeamMembersApi();\n const searchUsersApi = useSearchUsersApi();\n const company = useSelector(getCompanyState);\n const handleFetchUserEnrollmentsService = useFetchUserEnrollmentsService();\n const handleEnrollmentService = useHandleEnrollmentService();\n const handleUpdateEnrollmentService = useHandleUpdateEnrollmentService();\n\n /**\n * @function handleSearchUserWithTeamService\n * @param { number } teamId\n * @param { SearchTeamMembersParams } searchParams\n * @param { PractisSetWithDueDate[] } selectedPractisSets\n * @returns { Promise<UserEnrollmentType[] }\n */\n const handleSearchUserWithTeamService = useCallback(\n async (\n teamId: number,\n searchParams: SearchTeamMembersParams,\n selectedPractisSets: PractisSetWithDueDate[]\n ) => {\n if (teamId) {\n const teamMembers = await searchUsersWithTeamApi(\n teamId,\n searchParams\n );\n\n if (!isEmpty(teamMembers)) {\n const userIds = teamMembers.items?.map(\n ({ user }) => user.id\n );\n\n if (!isEmpty(userIds)) {\n return await handleFetchUserEnrollmentsService(\n selectedPractisSets,\n userIds\n );\n }\n }\n }\n },\n [handleFetchUserEnrollmentsService, searchUsersWithTeamApi]\n );\n\n /**\n * @function handleSearchRegisteredUsersService\n * @param { SearchUsersParams } searchParams\n * @param { PractisSetWithDueDate[] } selectedPractisSet\n * @returns { Promise<UserEnrollmentType[] }\n */\n const handleSearchRegisteredUsersService = useCallback(\n async (\n searchParams: SearchUsersParams,\n selectedPractisSets: PractisSetWithDueDate[]\n ) => {\n if (!isEmpty(searchParams)) {\n const registeredUsers = await searchUsersApi(searchParams);\n\n if (!isEmpty(registeredUsers)) {\n const userIds = registeredUsers.items?.map(user => user.id);\n\n if (!isEmpty(userIds)) {\n return await handleFetchUserEnrollmentsService(\n selectedPractisSets,\n userIds\n );\n }\n }\n }\n },\n [handleFetchUserEnrollmentsService, searchUsersApi]\n );\n\n /**\n * @param { EnrollUnenrollParams } EnrollUnenrollParams\n */\n return useCallback(\n ({\n teamId,\n searchParams,\n selectedPractisSets,\n totalUsers,\n }: EnrollUnenrollParams) => {\n let searchUsersActionFunction = null;\n let searchUsersActionParameters = null;\n\n if (teamId) {\n searchUsersActionFunction = handleSearchUserWithTeamService;\n const searchTeamMembersParams = createSearchTeamMembersParams({\n ...searchParams,\n limit: 1,\n offset: totalUsers || 0,\n });\n\n searchUsersActionParameters = {\n teamId,\n searchParams: searchTeamMembersParams,\n selectedPractisSets,\n };\n } else {\n const searchRegisteredUsersParams: SearchUsersParams = {\n status: UserStatus.ACTIVE,\n labels: searchParams?.labelIDs?.join(','),\n roles: searchParams?.roleIDs?.join(','),\n teams: searchParams?.teamIds?.join(','),\n companies: company.id?.toString(),\n limit: 1,\n offset: totalUsers || 0,\n query: searchParams?.searchTerm,\n sort: getSearchSortingValue(\n searchParams?.orderBy,\n 'name',\n true\n ),\n };\n\n searchUsersActionFunction = handleSearchRegisteredUsersService;\n searchUsersActionParameters = {\n searchParams: searchRegisteredUsersParams,\n selectedPractisSets,\n };\n }\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: SEARCH_USERS_ACTION,\n actionFunction: searchUsersActionFunction,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: searchUsersActionParameters,\n fieldName: 'searchParams.offset',\n },\n childActionList: [\n {\n actionName: ENROLL_UNENROLL_ACTION,\n actionFunction: handleEnrollmentService,\n actionFunctionOptions: {\n parameters: {\n data: [],\n },\n fieldName: 'data',\n secondaryFieldName: 'data',\n },\n },\n {\n actionName: UPDATE_ENROLLMENT_ACTION,\n actionFunction: handleUpdateEnrollmentService,\n actionFunctionOptions: {\n parameters: {\n data: [],\n },\n fieldName: 'data',\n secondaryFieldName: 'data',\n },\n },\n ],\n };\n\n return actionList;\n },\n [\n company.id,\n handleEnrollmentService,\n handleSearchRegisteredUsersService,\n handleSearchUserWithTeamService,\n handleUpdateEnrollmentService,\n ]\n );\n}\n\n/**\n * @function useGenerateMultipleUsersEnrollmentActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateMultipleUsersEnrollmentActionList() {\n const handleFetchUserEnrollmentsService = useFetchUserEnrollmentsService();\n const handleEnrollmentService = useHandleEnrollmentService();\n const handleUpdateEnrollmentService = useHandleUpdateEnrollmentService();\n\n /**\n * @param { number[] } selectedUserIds\n * @param { PractisSetWithDueDate[] } selectedPractisSets\n */\n return useCallback(\n (\n selectedUserIds: number[],\n selectedPractisSets: PractisSetWithDueDate[]\n ) => {\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: FETCH_USER_ENROLLMENT_ACTION,\n actionFunction: handleFetchUserEnrollmentsService,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n selectedPractisSets,\n userIds: selectedUserIds,\n },\n fieldName: 'userIds',\n },\n childActionList: [\n {\n actionName: ENROLL_UNENROLL_ACTION,\n actionFunction: handleEnrollmentService,\n actionFunctionOptions: {\n parameters: {\n data: [],\n },\n fieldName: 'data',\n secondaryFieldName: 'data',\n },\n },\n {\n actionName: UPDATE_ENROLLMENT_ACTION,\n actionFunction: handleUpdateEnrollmentService,\n actionFunctionOptions: {\n parameters: {\n data: [],\n },\n fieldName: 'data',\n secondaryFieldName: 'data',\n },\n },\n ],\n };\n\n return actionList;\n },\n [\n handleEnrollmentService,\n handleFetchUserEnrollmentsService,\n handleUpdateEnrollmentService,\n ]\n );\n}","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\n\nimport { useChunkRequestsService } from '../../../../services/ChunkRequestService/hooks';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../ui/components/ModalDialogs/store/actions';\nimport { GeneralBulkActionModalInterface } from '../../../../ui/components/ModalDialogs/types';\nimport {\n useGenerateAllUsersEnrollmentActionList,\n useGenerateMultipleUsersEnrollmentActionList,\n} from './helpers';\nimport { EnrollUnenrollParams } from './types';\n\n/**\n *\n * @description Custom hook to create , update, delete enrollments with chunk service\n * @function useEnrollUnenrollAllUsersBulkActionService\n * @param { EnrollUnenrollParams } EnrollUnenrollParams\n * @param { Number } totalUsersCount\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { Void }\n */\nexport function useEnrollUnenrollAllUsersBulkActionService(\n enrollUnenrollParams: EnrollUnenrollParams,\n totalUsersCount?: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedEnrollments = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const generateEnrollmentActionList =\n useGenerateAllUsersEnrollmentActionList();\n\n const actionList = generateEnrollmentActionList({\n ...enrollUnenrollParams,\n totalUsers: totalUsersCount,\n });\n\n /**\n * @function clearTotalCompletedEnrollments\n * @returns { void }\n */\n const clearTotalCompletedEnrollments = () =>\n (totalCompletedEnrollments.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedEnrollments();\n\n showMessage('Changes have been saved', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult) => {\n if (!error?.message.includes('already exists')) {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Assign Practis Sets and Due Dates',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedEnrollments();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }\n },\n [dispatch, hideModalDialog, isRunning, onErrorCallback]\n );\n\n const { setIsStopped } = useChunkRequestsService(\n [actionList],\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback,\n false // should not stop on error\n );\n\n /**\n * @function handleStopEnrollUnenrollsBulkActionService\n * @returns { void }\n */\n const handleStopEnrollUnenrollsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(`Changes have been saved`, 'success');\n\n clearTotalCompletedEnrollments();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartEnrollUnenrollBulkActionService\n * @returns { void }\n */\n const handleStartEnrollUnenrollBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Assign Practis Sets and Due Dates',\n onStopBulkActionService:\n handleStopEnrollUnenrollsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopEnrollUnenrollsBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartEnrollUnenrollBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}\n\nexport function useEnrollUnrollMultipleUsersBulkActionService(\n selectedUserIds: number[],\n selectedPractisSets: PractisSetWithDueDate[],\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedEnrollments = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const generateMultipleUsersActionList =\n useGenerateMultipleUsersEnrollmentActionList();\n\n const actionList = generateMultipleUsersActionList(\n selectedUserIds,\n selectedPractisSets\n );\n\n /**\n * @function clearTotalCompletedEnrollments\n * @returns { void }\n */\n const clearTotalCompletedEnrollments = () =>\n (totalCompletedEnrollments.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedEnrollments();\n\n showMessage('Changes have been saved', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult) => {\n if (!error?.message.includes('already exists')) {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Assign Practis Sets and Due Dates',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedEnrollments();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }\n },\n [dispatch, hideModalDialog, isRunning, onErrorCallback]\n );\n\n const { setIsStopped } = useChunkRequestsService(\n [actionList],\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback,\n false // should not stop on error\n );\n\n /**\n * @function handleStopEnrollUnenrollsBulkActionService\n * @returns { void }\n */\n const handleStopEnrollUnenrollsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(`Changes have been saved`, 'success');\n\n clearTotalCompletedEnrollments();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartEnrollUnenrollBulkActionService\n * @returns { void }\n */\n const handleStartEnrollUnenrollBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Assign Practis Sets and Due Dates',\n onStopBulkActionService:\n handleStopEnrollUnenrollsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopEnrollUnenrollsBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartEnrollUnenrollBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}","import { FC, memo, useEffect, useState } from 'react';\nimport { isEmpty, isEqual } from 'lodash';\nimport dayjs from 'dayjs';\nimport { PractisSetWithDueDate } from '../../constants/interfaces/Draft';\nimport { usePractisSetsState } from '../portablePractisSets/store/hors/withPractisSets/states';\nimport {\n calculateCreatedUpdatedEnrollmentIds,\n useCalculateDeletedEnrollments,\n} from '../portablePractisSets/tools';\nimport { useUserPerformanceState } from '../users/store/states';\nimport AssignPractisSetsView from './single-users.view';\nimport { AssignPractisSetsControllerProps } from './type';\nimport { DATE_FORMAT } from '../../constants/interfaces/DueDates';\nimport { useSelectMultiplePractisSets } from '../portablePractisSets/store/hors/withPractisSets/services';\nimport AssignPractisSetsMultipleUsersView from './multiple-users.view';\nimport {\n useCreateUpdateEnrollmentDueDate,\n useDeleteEnrollmentsApi,\n useEnrollPractisSetsToUserApi,\n} from '../../api';\nimport { EnrollmentType } from '../../api/enrollments/types';\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n useEnrollUnenrollAllUsersBulkActionService,\n useEnrollUnrollMultipleUsersBulkActionService,\n} from './services/EnrollmentBulkService';\nimport { SearchParams } from '../../constants/interfaces/filters';\n\nconst AssignPractisSetsController: FC<\n AssignPractisSetsControllerProps\n> = props => {\n const {\n isFromBulkAction,\n triggerRef,\n horizontalOffset,\n verticalOffset,\n isOpen,\n onClose,\n users,\n searchQuery,\n isSelectAll,\n successApplyPractisSetsCallback,\n totalCount,\n } = props;\n\n const performanceState = useUserPerformanceState();\n const { selected: selectedPractisSetsState } = usePractisSetsState();\n const setPractisSets = useSelectMultiplePractisSets();\n const enrollPractisSets = useEnrollPractisSetsToUserApi();\n const updateEnrollmentsDueDate = useCreateUpdateEnrollmentDueDate();\n const unEnrollPractisSets = useDeleteEnrollmentsApi();\n const getDeletedEnrollmentIds = useCalculateDeletedEnrollments();\n const showMessage = useShowMessage();\n\n const selectedPractisSets: any[] =\n (performanceState?.portablePractisSets as any)?.map(\n (practisSet: {\n id: any;\n dueDate: dayjs.ConfigType | undefined;\n }): any => {\n return {\n practisSetId: practisSet.id ?? 0,\n dueDate: practisSet?.dueDate\n ? dayjs(practisSet?.dueDate).format(DATE_FORMAT)\n : null,\n };\n }\n ) ?? [];\n\n const [initialPractisSets, setInitialPractisSets] =\n useState<PractisSetWithDueDate[]>(selectedPractisSets);\n\n const [isSaving, setIsSaving] = useState<boolean>(false);\n const [isApplyButtonDisabled, setIsApplyButtonDisabled] = useState(true);\n\n const isMultipleUsersSelected =\n (isFromBulkAction && users?.length !== 1) || users?.length !== 1;\n\n const successCallback = () => {\n successApplyPractisSetsCallback?.();\n onClose();\n setIsSaving(false);\n };\n\n const handleEnrollUnenrollAllUsersBulkActionService =\n useEnrollUnenrollAllUsersBulkActionService(\n {\n searchParams: searchQuery as SearchParams,\n teamId: searchQuery?.teamId || null,\n selectedPractisSets: selectedPractisSetsState,\n users: isSelectAll ? [] : (users as number[]),\n },\n totalCount,\n successCallback\n );\n\n const handleEnrollUnenrollMultipleUsersBulkActionService =\n useEnrollUnrollMultipleUsersBulkActionService(\n users ?? [],\n selectedPractisSetsState,\n successCallback\n );\n\n /**\n * @function handleApplyPractisSets\n * @returns { void }\n */\n const handleApplyPractisSets = (): void => {\n if (!isMultipleUsersSelected) {\n const enrollUnEnrollPromiseChainArray = [];\n const deletedEnrollmentIds = getDeletedEnrollmentIds(\n performanceState.portablePractisSets,\n selectedPractisSetsState.map(\n practisSetWithDueDate => practisSetWithDueDate.practisSetId\n ),\n initialPractisSets.map(\n practisSetWithDueDate => practisSetWithDueDate.practisSetId\n )\n );\n\n const { addedPractisSets, updatedEnrollments } =\n calculateCreatedUpdatedEnrollmentIds(\n performanceState.portablePractisSets!,\n selectedPractisSetsState,\n initialPractisSets\n );\n\n const assignedPractisSets = addedPractisSets.map(item => ({\n practisSetId: item.practisSetId,\n dueDate: item?.dueDate\n ? dayjs(item.dueDate).format(DATE_FORMAT)\n : null,\n userId: users?.[0],\n })) as EnrollmentType[];\n\n if (!isEmpty(assignedPractisSets)) {\n enrollUnEnrollPromiseChainArray.push(\n enrollPractisSets(assignedPractisSets)\n );\n }\n\n if (!isEmpty(deletedEnrollmentIds)) {\n enrollUnEnrollPromiseChainArray.push(\n unEnrollPractisSets(deletedEnrollmentIds)\n );\n }\n\n if (!isEmpty(updatedEnrollments)) {\n enrollUnEnrollPromiseChainArray.push(\n updateEnrollmentsDueDate(updatedEnrollments)\n );\n }\n\n setIsSaving(true);\n\n Promise.all(enrollUnEnrollPromiseChainArray)\n .then(() => {\n showMessage(`Changes have been saved`, 'success');\n successApplyPractisSetsCallback?.();\n })\n .catch(error => {\n showMessage(error, 'error');\n });\n\n onClose();\n setIsSaving(false);\n } else if (\n isFromBulkAction &&\n isSelectAll &&\n users?.length !== totalCount\n ) {\n handleEnrollUnenrollAllUsersBulkActionService();\n } else {\n handleEnrollUnenrollMultipleUsersBulkActionService();\n }\n };\n\n useEffect(() => {\n if (!isMultipleUsersSelected) {\n let practisSetsToSet = selectedPractisSets ?? [];\n setInitialPractisSets(practisSetsToSet);\n setPractisSets(practisSetsToSet);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!isEqual(selectedPractisSetsState, initialPractisSets)) {\n setIsApplyButtonDisabled(false);\n } else {\n setIsApplyButtonDisabled(true);\n }\n }, [initialPractisSets, selectedPractisSetsState]);\n\n useEffect(() => {\n return () => {\n setInitialPractisSets([]);\n setPractisSets([]);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return isFromBulkAction ? (\n <AssignPractisSetsMultipleUsersView\n users={users}\n triggerRef={triggerRef}\n isOpen={isOpen}\n isSaving={isSaving}\n isApplyButtonDisabled={isApplyButtonDisabled}\n onClose={onClose}\n handleApplyPractisSets={handleApplyPractisSets}\n />\n ) : (\n <AssignPractisSetsView\n users={users}\n triggerRef={triggerRef}\n horizontalOffset={horizontalOffset}\n verticalOffset={verticalOffset}\n isOpen={isOpen}\n isSaving={isSaving}\n isApplyButtonDisabled={isApplyButtonDisabled}\n onClose={onClose}\n handleApplyPractisSets={handleApplyPractisSets}\n />\n );\n};\n\nexport default memo(AssignPractisSetsController);","export const en: any = {\n ext: 'ext.',\n country: 'Phone number country',\n phone: 'Phone',\n AC: 'Ascension Island',\n AD: 'Andorra',\n AE: 'United Arab Emirates',\n AF: 'Afghanistan',\n AG: 'Antigua and Barbuda',\n AI: 'Anguilla',\n AL: 'Albania',\n AM: 'Armenia',\n AO: 'Angola',\n AQ: 'Antarctica',\n AR: 'Argentina',\n AS: 'American Samoa',\n AT: 'Austria',\n AU: 'Australia',\n AW: 'Aruba',\n AX: 'Ã…land Islands',\n AZ: 'Azerbaijan',\n BA: 'Bosnia and Herzegovina',\n BB: 'Barbados',\n BD: 'Bangladesh',\n BE: 'Belgium',\n BF: 'Burkina Faso',\n BG: 'Bulgaria',\n BH: 'Bahrain',\n BI: 'Burundi',\n BJ: 'Benin',\n BL: 'Saint Barthélemy',\n BM: 'Bermuda',\n BN: 'Brunei Darussalam',\n BO: 'Bolivia',\n BQ: 'Bonaire, Sint Eustatius and Saba',\n BR: 'Brazil',\n BS: 'Bahamas',\n BT: 'Bhutan',\n BV: 'Bouvet Island',\n BW: 'Botswana',\n BY: 'Belarus',\n BZ: 'Belize',\n CA: 'Canada',\n CC: 'Cocos (Keeling) Islands',\n CD: 'Congo, Democratic Republic of the',\n CF: 'Central African Republic',\n CG: 'Congo',\n CH: 'Switzerland',\n CI: \"Cote d'Ivoire\",\n CK: 'Cook Islands',\n CL: 'Chile',\n CM: 'Cameroon',\n CN: 'China',\n CO: 'Colombia',\n CR: 'Costa Rica',\n CU: 'Cuba',\n CV: 'Cape Verde',\n CW: 'Curaçao',\n CX: 'Christmas Island',\n CY: 'Cyprus',\n CZ: 'Czech Republic',\n DE: 'Germany',\n DJ: 'Djibouti',\n DK: 'Denmark',\n DM: 'Dominica',\n DO: 'Dominican Republic',\n DZ: 'Algeria',\n EC: 'Ecuador',\n EE: 'Estonia',\n EG: 'Egypt',\n EH: 'Western Sahara',\n ER: 'Eritrea',\n ES: 'Spain',\n ET: 'Ethiopia',\n FI: 'Finland',\n FJ: 'Fiji',\n FK: 'Falkland Islands',\n FM: 'Federated States of Micronesia',\n FO: 'Faroe Islands',\n FR: 'France',\n GA: 'Gabon',\n GB: 'United Kingdom',\n GD: 'Grenada',\n GE: 'Georgia',\n GF: 'French Guiana',\n GG: 'Guernsey',\n GH: 'Ghana',\n GI: 'Gibraltar',\n GL: 'Greenland',\n GM: 'Gambia',\n GN: 'Guinea',\n GP: 'Guadeloupe',\n GQ: 'Equatorial Guinea',\n GR: 'Greece',\n GS: 'South Georgia and the South Sandwich Islands',\n GT: 'Guatemala',\n GU: 'Guam',\n GW: 'Guinea-Bissau',\n GY: 'Guyana',\n HK: 'Hong Kong',\n HM: 'Heard Island and McDonald Islands',\n HN: 'Honduras',\n HR: 'Croatia',\n HT: 'Haiti',\n HU: 'Hungary',\n ID: 'Indonesia',\n IE: 'Ireland',\n IL: 'Israel',\n IM: 'Isle of Man',\n IN: 'India',\n IO: 'British Indian Ocean Territory',\n IQ: 'Iraq',\n IR: 'Iran',\n IS: 'Iceland',\n IT: 'Italy',\n JE: 'Jersey',\n JM: 'Jamaica',\n JO: 'Jordan',\n JP: 'Japan',\n KE: 'Kenya',\n KG: 'Kyrgyzstan',\n KH: 'Cambodia',\n KI: 'Kiribati',\n KM: 'Comoros',\n KN: 'Saint Kitts and Nevis',\n KP: 'North Korea',\n KR: 'South Korea',\n KW: 'Kuwait',\n KY: 'Cayman Islands',\n KZ: 'Kazakhstan',\n LA: 'Laos',\n LB: 'Lebanon',\n LC: 'Saint Lucia',\n LI: 'Liechtenstein',\n LK: 'Sri Lanka',\n LR: 'Liberia',\n LS: 'Lesotho',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n LV: 'Latvia',\n LY: 'Libya',\n MA: 'Morocco',\n MC: 'Monaco',\n MD: 'Moldova',\n ME: 'Montenegro',\n MF: 'Saint Martin (French Part)',\n MG: 'Madagascar',\n MH: 'Marshall Islands',\n MK: 'North Macedonia',\n ML: 'Mali',\n MM: 'Burma',\n MN: 'Mongolia',\n MO: 'Macao',\n MP: 'Northern Mariana Islands',\n MQ: 'Martinique',\n MR: 'Mauritania',\n MS: 'Montserrat',\n MT: 'Malta',\n MU: 'Mauritius',\n MV: 'Maldives',\n MW: 'Malawi',\n MX: 'Mexico',\n MY: 'Malaysia',\n MZ: 'Mozambique',\n NA: 'Namibia',\n NC: 'New Caledonia',\n NE: 'Niger',\n NF: 'Norfolk Island',\n NG: 'Nigeria',\n NI: 'Nicaragua',\n NL: 'Netherlands',\n NO: 'Norway',\n NP: 'Nepal',\n NR: 'Nauru',\n NU: 'Niue',\n NZ: 'New Zealand',\n OM: 'Oman',\n PA: 'Panama',\n PE: 'Peru',\n PF: 'French Polynesia',\n PG: 'Papua New Guinea',\n PH: 'Philippines',\n PK: 'Pakistan',\n PL: 'Poland',\n PM: 'Saint Pierre and Miquelon',\n PN: 'Pitcairn',\n PR: 'Puerto Rico',\n PS: 'Palestine',\n PT: 'Portugal',\n PW: 'Palau',\n PY: 'Paraguay',\n QA: 'Qatar',\n RE: 'Reunion',\n RO: 'Romania',\n RS: 'Serbia',\n RU: 'Russia',\n RW: 'Rwanda',\n SA: 'Saudi Arabia',\n SB: 'Solomon Islands',\n SC: 'Seychelles',\n SD: 'Sudan',\n SE: 'Sweden',\n SG: 'Singapore',\n SH: 'Saint Helena',\n SI: 'Slovenia',\n SJ: 'Svalbard and Jan Mayen',\n SK: 'Slovakia',\n SL: 'Sierra Leone',\n SM: 'San Marino',\n SN: 'Senegal',\n SO: 'Somalia',\n SR: 'Suriname',\n SS: 'South Sudan',\n ST: 'Sao Tome and Principe',\n SV: 'El Salvador',\n SX: 'Sint Maarten',\n SY: 'Syria',\n SZ: 'Swaziland',\n TA: 'Tristan da Cunha',\n TC: 'Turks and Caicos Islands',\n TD: 'Chad',\n TF: 'French Southern Territories',\n TG: 'Togo',\n TH: 'Thailand',\n TJ: 'Tajikistan',\n TK: 'Tokelau',\n TL: 'Timor-Leste',\n TM: 'Turkmenistan',\n TN: 'Tunisia',\n TO: 'Tonga',\n TR: 'Turkey',\n TT: 'Trinidad and Tobago',\n TV: 'Tuvalu',\n TW: 'Taiwan',\n TZ: 'Tanzania',\n UA: 'Ukraine',\n UG: 'Uganda',\n UM: 'United States Minor Outlying Islands',\n US: 'United States',\n UY: 'Uruguay',\n UZ: 'Uzbekistan',\n VA: 'Holy See (Vatican City State)',\n VC: 'Saint Vincent and the Grenadines',\n VE: 'Venezuela',\n VG: 'Virgin Islands, British',\n VI: 'Virgin Islands, U.S.',\n VN: 'Vietnam',\n VU: 'Vanuatu',\n WF: 'Wallis and Futuna',\n WS: 'Samoa',\n XK: 'Kosovo',\n YE: 'Yemen',\n YT: 'Mayotte',\n ZA: 'South Africa',\n ZM: 'Zambia',\n ZW: 'Zimbabwe',\n ZZ: 'International',\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport OutsideActionBox from '../../OutsideActionBox/OutsideActionBox';\n\nconst Container = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst DropDownComponent = styled(motion.div)`\n background: ${props => props.theme.Colors.white};\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n width: 256px;\n height: 192px;\n position: absolute;\n border-radius: 8px;\n top: 16px;\n left: -32px;\n z-index: 1000;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n padding: 16px 8px;\n flex: 1;\n overflow: hidden;\n height: 100%;\n box-sizing: border-box;\n`;\n\nconst ScrollableArea = styled.div`\n overflow-y: auto;\n max-height: 295px;\n padding: 0 8px;\n height: 100%;\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteFive};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\n\nexport const CountryList: React.FC<{\n open: boolean;\n toggleOpen: (open: boolean) => void;\n className?: string;\n}> = ({ children, open, toggleOpen, className }) => {\n return (\n <Container\n open={open}\n toggleOpen={toggleOpen}\n styles={{ position: 'relative' }}\n >\n <DropDownComponent\n className={className}\n initial={{ scale: 0.5 }}\n animate={{ scale: 1 }}\n >\n <ContentArea>\n <ScrollableArea>{children}</ScrollableArea>\n </ContentArea>\n </DropDownComponent>\n </Container>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport {\n getCountries,\n getCountryCallingCode,\n // @ts-ignore\n} from 'react-phone-number-input/input';\nimport { en } from './locales';\nimport { Variables } from '../../../../theme/variables';\nimport DownArrow from '../../../icons/DownArrow';\nimport UpArrow from '../../../icons/UpArrow';\nimport { CountryList } from './CountryList';\n\nconst Container = styled.div<{ disabled?: boolean }>`\n ${props =>\n props.disabled &&\n `\n pointer-events: none;\n `}\n`;\n\nconst StyledDropDownList = styled(CountryList)``;\n\nconst ListItem = styled.div`\n height: 32px;\n width: 100%;\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n cursor: pointer;\n padding: 8px 16px;\n border-radius: 4px;\n box-sizing: border-box;\n &:active {\n opacity: 0.7;\n }\n &:hover {\n background: ${props => props.theme.Colors.whiteFive};\n }\n &.--active {\n background: ${props => props.theme.Colors.whiteFive};\n }\n`;\n\nconst ListCountryFlag = styled.div`\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n`;\n\nconst Flag = styled.img`\n width: 100%;\n`;\n\nconst ListCountryNameContainer = styled.div`\n position: relative;\n margin-left: 8px;\n min-width: 90px;\n flex: 1;\n display: flex;\n align-items: center;\n`;\n\nconst ListCountryName = styled.div`\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n width: 100%;\n position: absolute;\n font-size: 13px;\n font-weight: 500;\n color: ${props => props.theme.Colors.black};\n display: flex;\n align-items: center;\n`;\n\nconst ListCountryCode = styled.div`\n width: 32px;\n margin-left: 8px;\n flex-shrink: 0;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst CountrySelectorWrapper = styled.div`\n height: 100%;\n margin-right: 8px;\n display: flex;\n align-items: center;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst FlagContainer = styled.div`\n height: 16px;\n width: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n`;\n\nconst CountryCode = styled.div<{ fontColor: string; fontSize: string }>`\n height: 16px;\n margin-left: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${props => props.fontColor};\n font-size: ${props => props.fontSize};\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n`;\n\nconst ArrowsContainer = styled.div`\n height: 100%;\n margin-left: 4px;\n`;\n\nconst ArrowIcon = styled.div<{ disabled?: boolean }>`\n height: 6px;\n width: 6px;\n display: flex;\n align-items: center;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n`;\n\nconst StyledDownArrow = styled(DownArrow)``;\n\nconst StyledUpArrow = styled(UpArrow)``;\n\nconst countries = getCountries().filter((country: string) => country !== 'US');\ncountries.unshift('US');\n\nconst CountrySelector: FC<{\n open: boolean;\n disabled?: boolean;\n setOpen(open: boolean): void;\n selectedCountry: keyof typeof en;\n setSelectedCountry(country: string): void;\n fontColor?: string;\n fontSize?: string;\n}> = ({\n open,\n disabled,\n setOpen,\n selectedCountry,\n setSelectedCountry,\n fontColor,\n fontSize,\n}) => {\n return (\n <Container disabled={disabled}>\n <CountrySelectorWrapper onClick={() => setOpen(true)}>\n <FlagContainer>\n <Flag\n alt=\"United States\"\n src={`http://purecatamphetamine.github.io/country-flag-icons/3x2/${selectedCountry.toString()}.svg`}\n />\n </FlagContainer>\n <CountryCode\n fontSize={fontSize ? fontSize : '13px'}\n fontColor={\n disabled\n ? Variables.Colors.cloudyBlue\n : fontColor\n ? fontColor\n : Variables.Colors.white\n }\n >\n +{getCountryCallingCode(selectedCountry as any)}\n </CountryCode>\n <ArrowsContainer>\n <ArrowIcon disabled={disabled}>\n {open ? <StyledUpArrow /> : <StyledDownArrow />}\n </ArrowIcon>\n </ArrowsContainer>\n </CountrySelectorWrapper>\n <StyledDropDownList open={open} toggleOpen={setOpen}>\n {countries.map((country: string) => (\n <ListItem\n key={country}\n onClick={() => {\n setSelectedCountry(country);\n setOpen(false);\n }}\n className={\n country === selectedCountry ? '--active' : undefined\n }\n >\n <ListCountryFlag>\n <Flag\n alt={country}\n src={`http://purecatamphetamine.github.io/country-flag-icons/3x2/${country.toString()}.svg`}\n />\n </ListCountryFlag>\n <ListCountryNameContainer>\n <ListCountryName>{en[country]}</ListCountryName>\n </ListCountryNameContainer>\n <ListCountryCode>\n +{getCountryCallingCode(country as any)}\n </ListCountryCode>\n </ListItem>\n ))}\n </StyledDropDownList>\n </Container>\n );\n};\n\nexport default CountrySelector;\n","import styled, { css } from 'styled-components';\n\nexport const Container = styled.div<{\n height: string;\n width: string;\n background: string;\n fontSize: string;\n error?: boolean;\n hasManualError?: boolean;\n}>`\n font-family: 'Manrope';\n position: relative;\n height: ${props => props.height};\n width: ${props => props.width};\n background: ${props => props.background};\n font-size: ${props => props.fontSize};\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n box-shadow: inset 0 0 0 ${props => (props.error || props.hasManualError ? '2px' : '-1px')} var(--ps-red-main); \n \n &.grey-border-on-focus {\n border: solid 1px transparent;\n box-shadow: none;\n\n ${props =>\n (props.error || props.hasManualError) &&\n css`border: solid 1px var(--ps-red-main);`\n }\n\n &:focus-within {\n border: solid 1px var(${props => (props.error || props.hasManualError) ? '--ps-red-main' : '--ps-grey-1'});\n }\n }\n`;\n\nexport const InputWrapper = styled.div<{\n color: string;\n disabled?: boolean;\n fontSize: string;\n useTopPadding: boolean;\n}>`\n padding: ${props => props.useTopPadding ? '10px' : '0px'} 24px 0px 24px;\n height: 100%;\n display: flex;\n align-items: center;\n & > .PhoneInput > input {\n font-family: 'Manrope';\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n border: none;\n background: transparent;\n color: ${props => props.color};\n font-size: ${props => props.fontSize};\n -webkit-appearance: none;\n &:disabled {\n color: ${props => props.theme.Colors.cloudyBlue} !important;\n }\n &::placeholder {\n font-size: ${props => props.fontSize};\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n }\n }\n`;\n\nexport const Label = styled.div<{ color: string }>`\n font-size: 11px;\n color: ${props => props.color};\n margin-bottom: 4px;\n position: absolute;\n padding: 10px 0px 0 24px;\n`;\n\nexport const TrashIconContainer = styled.div`\n color: var(--ps-red-main);\n position: absolute;\n width: 22px;\n height: 24px;\n top: 16px;\n right: 16px;\n cursor: pointer;\n`;\n","import { FC, useState } from 'react';\nimport 'react-phone-number-input/style.css';\nimport Input from 'react-phone-number-input';\nimport { Variables } from '../../../../theme/variables';\nimport CountrySelector from './CountrySelector';\nimport { en } from './locales';\nimport Trash from '../../../../ui/icons/Trash';\nimport { Container, Label, TrashIconContainer, InputWrapper } from './styles';\n\nconst InputPhone: FC<{\n value: number | string;\n onChange(value?: number | string): void;\n label: string;\n placeholder?: string;\n width?: string;\n height?: string;\n background?: string;\n fontColor?: string;\n labelColor?: string;\n disabledLabelColor?: string;\n fontSize?: string;\n className?: string;\n field?: any;\n error?: boolean;\n disabled?: boolean;\n autoFocus?: boolean;\n hasManualError?: boolean;\n dataTest?: string;\n onDeleteNumber?: () => void;\n showDeleteNumberBtn?: boolean;\n}> = ({\n value,\n onChange,\n label,\n placeholder,\n width,\n height,\n background,\n fontColor,\n labelColor,\n disabledLabelColor,\n className,\n fontSize,\n field,\n error,\n disabled,\n autoFocus,\n hasManualError,\n dataTest,\n onDeleteNumber,\n showDeleteNumberBtn\n}) => {\n const [open, setOpen] = useState(false);\n const [selectedCountry, setSelectedCountry] = useState<keyof typeof en>(\n 'US'\n );\n\n const handleCountryChange = (value?: string) => {\n if (value) {\n setSelectedCountry(value);\n onChange();\n }\n };\n\n return (\n <Container\n width={width ? width : '100%'}\n height={height ? height : '56px'}\n background={background ? background : Variables.Colors.darkTwo}\n fontSize={fontSize ? fontSize : '13px'}\n className={className}\n error={error}\n hasManualError={hasManualError}\n data-test={dataTest}\n >\n <Label\n color={\n disabled\n ? disabledLabelColor ?? Variables.Colors.cloudyBlue\n : labelColor ?? Variables.Colors.cloudyBlue\n }\n >\n {label}\n </Label>\n <InputWrapper\n fontSize={fontSize ? fontSize : '13px'}\n color={fontColor ? fontColor : Variables.Colors.white}\n disabled={disabled}\n useTopPadding={!!label}\n >\n <Input\n {...field}\n autoFocus={autoFocus}\n country={selectedCountry}\n countryCallingCodeEditable={false}\n defaultCountry={selectedCountry}\n initialValueFormat=\"national\"\n countrySelectComponent={({ value }) => {\n if (value) {\n setSelectedCountry(value);\n }\n return (\n <CountrySelector\n open={open}\n disabled={disabled}\n setOpen={setOpen}\n fontColor={fontColor}\n fontSize={fontSize ? fontSize : '13px'}\n selectedCountry={selectedCountry}\n setSelectedCountry={handleCountryChange}\n />\n );\n }}\n maxLength={50}\n placeholder={placeholder}\n value={value}\n disabled={disabled}\n onChange={onChange}\n />\n </InputWrapper>\n {showDeleteNumberBtn && \n <TrashIconContainer onClick={e => {\n e.stopPropagation();\n onDeleteNumber && onDeleteNumber()}}\n data-test={dataTest && `${dataTest}-delete`}\n >\n <Trash/>\n </TrashIconContainer>\n }\n </Container>\n );\n};\n\nexport default InputPhone;\n","import styled from 'styled-components';\n\nexport const TBody = styled.tbody`\n color: ${props => props.theme.Colors.black};\n & > tr {\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n & > td {\n &:first-child {\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n }\n &:last-child {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n }\n }\n }\n }\n &:before {\n content: '.';\n display: block;\n line-height: 8px;\n color: transparent;\n }\n`;\n\n\n","import { FC, memo } from 'react';\n\nimport { TBody } from './style';\nimport { TableBodyProps } from './type';\n\nconst TableBody: FC<TableBodyProps> = memo(props => {\n const { children, className, innerRef, ...rest } = props;\n return (\n <TBody className={className} ref={innerRef} {...rest}>\n {children}\n </TBody>\n );\n});\n\nexport default TableBody;\n\n","export const escapeRegExp = (value: String): String => {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\n","import { useCallback } from 'react';\nimport { useLocalStorage } from '../../tools/localStorage/LocalStorage';\n\nexport const countParents = (path: string) => {\n return path\n ? path\n .trim()\n .split('/')\n .filter(x => x).length\n : 0;\n};\n\nexport enum LABELS_CONFIGS {\n LABELS_STATE = 'labels-state',\n SIDE_PANEL = 'side-panel',\n EXPANDED_LABELS = 'expanded-labels',\n}\n\nexport const useGenerateLabelsConfiguration = () => {\n const localStorage = useLocalStorage();\n\n return useCallback(\n (sidePanel: boolean, selectedLabels: number[]) => {\n let savedLabelsState: any = localStorage.get(\n LABELS_CONFIGS.LABELS_STATE\n );\n\n if (savedLabelsState && savedLabelsState) {\n savedLabelsState[LABELS_CONFIGS.SIDE_PANEL] = sidePanel;\n savedLabelsState[\n LABELS_CONFIGS.EXPANDED_LABELS\n ] = selectedLabels;\n } else {\n savedLabelsState = {};\n savedLabelsState = {\n [LABELS_CONFIGS.SIDE_PANEL]: sidePanel,\n [LABELS_CONFIGS.EXPANDED_LABELS]: selectedLabels,\n };\n }\n\n localStorage.set(LABELS_CONFIGS.LABELS_STATE, savedLabelsState);\n },\n [localStorage]\n );\n};\n\nexport const useGetSavedLabelPanelState = () => {\n const localStorage = useLocalStorage();\n\n return useCallback(() => {\n let savedLabelsState: any = localStorage.get(\n LABELS_CONFIGS.LABELS_STATE\n );\n\n if (savedLabelsState) {\n return savedLabelsState[LABELS_CONFIGS.SIDE_PANEL];\n } else {\n return false;\n }\n }, [localStorage]);\n};\n\nexport const useGetSavedLabelExpandedState = () => {\n const localStorage = useLocalStorage();\n\n return useCallback(() => {\n let savedLabelsState: any = localStorage.get(\n LABELS_CONFIGS.LABELS_STATE\n );\n\n if (savedLabelsState) {\n return savedLabelsState[LABELS_CONFIGS.EXPANDED_LABELS];\n } else {\n return false;\n }\n }, [localStorage]);\n};\n","import { CompanyInterface } from './Company';\r\nimport { Enrollments } from './Enrollments';\r\nimport { Label } from './Label';\r\nimport { Roles } from './Roles';\r\nimport { NEW_PERMISSIONS } from '../enums/permissions';\r\nimport { UserInfo } from './UserInfo';\r\n\r\nexport interface UserInterface extends UserWithRole {\r\n id: number;\r\n email?: string;\r\n password?: string;\r\n firstName?: string;\r\n phoneNumber?: string;\r\n phoneNumberVerified?: boolean;\r\n lastName?: string;\r\n picture?: string;\r\n companyId?: number;\r\n isTeamLead?: boolean;\r\n invitationCode?: string;\r\n acceptedEnrollmentCount?: number;\r\n searchFilter?: number[];\r\n totalEnrollmentCount?: number;\r\n pendingEnrollmentCount?: number;\r\n inProgressEnrollmentCount?: number;\r\n completedEnrollmentCount?: number;\r\n lastTrainingAt?: string;\r\n updatedAt?: string;\r\n company?: CompanyInterface;\r\n creator?: UserInterface;\r\n createdAt?: string;\r\n enrollment?: Enrollments;\r\n labels?: Label[];\r\n permissions?: NEW_PERMISSIONS[];\r\n weeklyActiveDays?: number;\r\n monthlyActiveDays?: number;\r\n teamsCount?: number;\r\n averageAccuracy?: number;\r\n status?: string;\r\n registeredAt?: string;\r\n lastActivity?: any;\r\n dueDate?: Date;\r\n roleId?: number;\r\n imageUrl?: string;\r\n}\r\n\r\nexport interface UserWithRole {\r\n role?: Roles;\r\n}\r\n\r\nexport type LeaderDataType = {\r\n isViewed: boolean;\r\n id: number;\r\n isTeamLead: boolean;\r\n user: {\r\n id: number;\r\n firstName: string;\r\n lastName: string;\r\n imageUrl: string\r\n }\r\n}\r\n\r\nexport interface UserV2 extends UserInfo {\r\n companyId: number;\r\n roleId: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n role?: {\r\n id: number;\r\n name: string;\r\n title: string;\r\n };\r\n countEnrollments: number;\r\n countTeams: number;\r\n lastActivity?: string;\r\n labels: number[];\r\n teams?: number[];\r\n registeredAt?: string;\r\n invitedBy?: UserInfo;\r\n invitationCode?: string;\r\n phoneNumber?: string;\r\n phoneNumberVerified: boolean;\r\n}\r\n\r\nexport interface UserProfile extends UserV2 {\r\n permissions?: NEW_PERMISSIONS[];\r\n labelFilters?: number[];\r\n}\r\n\r\nexport const userStatusFilters = {\r\n 'PENDING': 'PENDING', \r\n 'IN_PROGRESS': 'ENROLLED',\r\n 'COMPLETED': 'COMPLETED'\r\n}\r\n\r\nexport interface AdminDataType {\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n roleId: number;\r\n}\r\n","import { ChunkServiceInterface } from './types';\n\nexport const SET_PERCENTAGE = 'SET_PERCENTAGE';\n\nexport const initialState: ChunkServiceInterface = {\n percentage: 0,\n};\n","export const DATE_FORMAT = 'MM/DD/YYYY';\nexport const DATE_TIME_FORMAT = 'MM/DD/YYYY h:mm:ss A';","import React, {\n useRef,\n cloneElement,\n ReactElement,\n RefObject,\n useEffect,\n forwardRef,\n PropsWithChildren,\n CSSProperties,\n ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport styled from 'styled-components';\n\nimport {\n PopupOffset,\n PopupPosition,\n PopupTrigger,\n usePopup,\n} from '../../../helpers/hooks/usePopup';\nimport { getPortalElement } from '../Popup/helpers/getPortalElement';\n\n//region Types\ntype Preset = 'button-icon' | 'dropdown' | 'checkbox-icon' | 'table-item' | 'question-icon' | 'question-icon-top' | 'pending-user';\n\ntype Props<T> = {\n label: ReactNode | string;\n disabled?: boolean;\n className?: string;\n position?: PopupPosition;\n offset?: PopupOffset;\n preset?: Preset;\n children: ReactElement | { (ref: RefObject<T>): ReactElement };\n trigger?: PopupTrigger;\n isHtmlContent?: boolean;\n dataTest?: string;\n style?: CSSProperties;\n};\n//endregion\n\n//region Styles\nconst TooltipLabel = styled.div`\n font-size: 13px;\n display: flex;\n align-items: center;\n padding: 8px 16px;\n min-height: 40px;\n flex-wrap: wrap;\n white-space: nowrap;\n user-select: none;\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n color: ${props => props.theme.Colors.black};\n background: ${props => props.theme.Colors.white};\n`;\n//endregion\n\nconst TooltipContent = forwardRef<\n HTMLDivElement,\n {\n label: ReactNode | string;\n style: CSSProperties;\n className?: string;\n portalElement: HTMLElement;\n isHtmlContent?: boolean;\n dataTest?: string;\n }\n>(({ className, style, label, portalElement, isHtmlContent, dataTest }, ref) => {\n if(isHtmlContent){\n return createPortal(\n <TooltipLabel ref={ref} className={className} style={style} data-test={dataTest}>\n <div style={{width: 264}}>{label}</div>\n </TooltipLabel>,\n portalElement\n );\n } else {\n return createPortal(\n <TooltipLabel ref={ref} className={className} style={style} data-test={dataTest}>\n {label}\n </TooltipLabel>,\n portalElement\n );\n }\n});\n\n/**\n * Can be only one child. Make for sure that child component is forwarded by forwardRef or it's just JSX markup.\n * Ref object can be obtained using render props from Children Prop\n * T - Ref object\n */\nexport const Tooltip = <T extends HTMLElement = HTMLElement>({\n label,\n position = 'right-start',\n offset,\n className,\n children,\n disabled,\n preset,\n trigger,\n isHtmlContent,\n dataTest,\n style: propStyle\n}: PropsWithChildren<Props<T>>): ReactElement => {\n const presetsConfig: Record<\n Preset,\n {\n position: PopupPosition;\n offset: PopupOffset;\n \n }\n > = {\n 'button-icon': {\n position: 'center-right--bottom',\n offset: {\n x: '0px',\n y: '10px',\n },\n },\n dropdown: {\n position: 'center-right--bottom',\n offset: {\n x: '0px',\n y: '4px',\n },\n },\n 'checkbox-icon': {\n position: 'center-right--bottom',\n offset: {\n x: '-8px',\n y: '12px',\n },\n },\n 'table-item': {\n position: 'center-left--bottom',\n offset: {\n x: '9%',\n y: '12px',\n },\n },\n 'question-icon': {\n position: 'center-left--bottom',\n offset: {\n x: '140px',\n y: '22px',\n }\n },\n 'question-icon-top': {\n position: 'center-left--bottom',\n offset: {\n x: '140px',\n y: '-205px',\n }\n },\n 'pending-user': {\n position: 'center-left--bottom',\n offset: {\n x: '160px',\n y: '0px',\n }\n }\n };\n\n const triggerRef = useRef<T>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const portalElement = getPortalElement(triggerRef.current, 'tooltip');\n const { style, shown, enable, disable, enabled } = usePopup(\n triggerRef,\n contentRef,\n portalElement,\n {\n offset: preset ? presetsConfig[preset].offset : offset,\n position: preset ? presetsConfig[preset].position : position,\n trigger: trigger || 'hover',\n }\n );\n\n useEffect(() => {\n if (disabled) {\n disable();\n } else {\n enable();\n }\n }, [disable, disabled, enable]);\n\n const getChildren = () => {\n if (typeof children === 'function') {\n return children(triggerRef);\n }\n if (children) {\n // @ts-ignore\n return cloneElement(children, {\n ref: triggerRef,\n });\n }\n\n return null;\n };\n\n return (\n <>\n {getChildren()}\n {shown && enabled && (\n <TooltipContent\n ref={contentRef}\n className={className}\n style={{...style, ...propStyle}}\n label={label}\n portalElement={portalElement}\n isHtmlContent={isHtmlContent}\n dataTest={dataTest}\n />\n )}\n </>\n );\n};\n","import { createContext } from 'react';\n\nimport { AppState } from '../../../../../../store/reducers';\nimport { DEFAULT_LABELS_SCOPE, Scope } from '../scopes';\n\nexport type WithLabelsContextProps<T = keyof AppState, K = Scope> = {\n reducerName?: T;\n scope?: K;\n};\n\nexport const WithLabelsContext = createContext<WithLabelsContextProps>({\n reducerName: 'portableLabels',\n scope: DEFAULT_LABELS_SCOPE,\n});\n","import { createContext } from 'react';\n\nimport { AppState } from '../../../../../../store/reducers';\nimport { DEFAULT_PRACTIS_SETS_SCOPE, Scope } from '../scopes';\n\nexport type WithPractisSetsContextProps<T = keyof AppState, K = Scope> = {\n reducerName?: T;\n scope?: K;\n};\n\nexport const WithPractisSetsContext = createContext<WithPractisSetsContextProps>(\n {\n reducerName: 'portablePractisSets',\n scope: DEFAULT_PRACTIS_SETS_SCOPE,\n }\n);\n","import { ColorTheme } from './type';\nimport { Variables } from '../../../theme/variables';\n\nexport const Themes: Record<\n ColorTheme,\n {\n background: string;\n color: string;\n labelColor?: string;\n disabledLabelColor?: string;\n }\n> = {\n light: {\n background: Variables.Colors.whiteFive,\n color: Variables.Colors.black,\n },\n lightTwo: {\n background: Variables.Colors.white,\n color: Variables.Colors.black,\n labelColor: Variables.Colors.cloudyBlue,\n disabledLabelColor: Variables.Colors.cloudyBlue,\n },\n dark: {\n background: Variables.Colors.darkTwo,\n color: Variables.Colors.whiteTwo,\n },\n darkTwo: {\n background: Variables.Colors.dark,\n color: Variables.Colors.white,\n },\n darkThree: {\n background: Variables.Colors.darkTwo,\n color: Variables.Colors.whiteTwo,\n labelColor: Variables.Colors.cloudyBlue,\n },\n transparent: {\n background: Variables.Colors.transparent,\n color: Variables.Colors.black,\n },\n};\n\n","export default __webpack_public_path__ + \"static/media/eye.5e81066f.svg\";","export default __webpack_public_path__ + \"static/media/eye-open.73b1590c.svg\";","import styled, { css } from 'styled-components';\n\nimport { Themes } from './constants';\nimport { ColorTheme } from './type';\nimport ShowIcon from '../../../assets/images/eye.svg';\nimport HideIcon from '../../../assets/images/eye-open.svg';\nimport { isSafari } from '../../../helpers/functions/detect-browsers';\n\nexport const Container = styled.div<{\n height: string;\n colorTheme: ColorTheme;\n width?: string;\n hideError?: boolean;\n error?: boolean;\n}>`\n position: relative;\n\n display: flex;\n align-items: center;\n height: ${props => props.height};\n ${props => !!props.width && `width: ${props.width};`}\n\n border-radius: 4px;\n overflow: hidden;\n background-color: ${({ colorTheme }) => Themes[colorTheme].background};\n\n ${props =>\n !props.hideError &&\n css`\n box-shadow: inset 0 0 0 ${props.error ? '2px' : '-1px'}\n ${props.theme.Colors.tomato};\n `};\n -webkit-appearance: none;\n\n .custom-border-container {\n ${props =>\n !props.hideError &&\n css`\n box-shadow: inset 0 0 0 ${props.error ? '1px' : '-1px'}\n ${props.theme.Colors.tomato};\n `};\n\n border-radius: 4px;\n }\n\n &.login-input-container {\n box-sizing: border-box;\n border: solid 1px transparent;\n box-shadow: none;\n\n ${props =>\n !props.hideError && !!props.error &&\n css`border: solid 1px var(--ps-red-main);`\n }\n\n &:focus-within {\n border: solid 1px var(${props => !props.hideError && !!props.error ? '--ps-red-main' : '--ps-grey-1'});\n }\n }\n\n &.login-input-container + div {\n padding: 4px 0 0 0; \n }\n`;\n\nexport const StyledInput = styled.input<{\n height: string;\n colorTheme: ColorTheme;\n error: boolean;\n padding?: string;\n fontSize?: string;\n fontFamily?: string;\n hideError?: boolean;\n}>`\n font-family: ${props => props.fontFamily || props.theme.Fonts.manrope};\n font-size: ${props => (props.fontSize ? props.fontSize : '13px')};\n\n height: ${props => props.height};\n width: 100%;\n flex-grow: 1;\n padding: ${props =>\n !!props.padding ? props.padding : '29px 24px 15px 24px'};\n\n background-color: transparent;\n border: none;\n box-sizing: border-box;\n color: ${props => Themes[props.colorTheme].color};\n\n // hack for built-in-browser autofill\n &:-webkit-autofill,\n &:-webkit-autofill:hover,\n &:-webkit-autofill:focus {\n -webkit-text-fill-color: ${props => Themes[props.colorTheme].color};\n -webkit-box-shadow: 0 0 0px 1000px\n ${props => Themes[props.colorTheme].background} inset;\n transition: background-color 5000s ease-in-out 0s;\n caret-color: ${props => Themes[props.colorTheme].color};\n }\n &:disabled {\n color: ${() => isSafari() ? 'var(--ps-grey-1)' : 'var(--ps-grey-14)'};\n\n &::placeholder {\n font-size: ${props => (props.fontSize ? props.fontSize : '13px')};\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n }\n &::placeholder {\n font-size: ${props => (props.fontSize ? props.fontSize : '13px')};\n color: ${props => props.theme.Colors.steelGrey};\n }\n`;\n\nexport const Label = styled.label<{\n filled: boolean;\n top?: string;\n left?: string;\n fontWeight?: number;\n disabled?: boolean;\n fontSize?: string;\n colorTheme: ColorTheme;\n decreaseLabelFontSize?: boolean;\n}>`\n position: absolute;\n top: ${props => (props.filled ? (props.top ? props.top : '-8px') : '0')};\n left: ${props => props.left || '24px'};\n\n font-size: ${({ fontSize }) => fontSize || '12px'};\n font-weight: ${({ fontWeight, colorTheme }) => {\n if (fontWeight) {\n return fontWeight;\n }\n if (colorTheme === 'lightTwo') {\n return 600;\n }\n\n return 400;\n }};\n\n display: flex;\n align-items: center;\n height: 100%;\n\n transition: all 0.18s ease;\n transform-origin: top left;\n pointer-events: none;\n color: ${props =>\n !!Themes[props.colorTheme].labelColor\n ? Themes[props.colorTheme].labelColor\n : props.theme.Colors.steelGrey};\n ${({ filled }) =>\n filled &&\n css`\n transform: scale(0.9);\n `}\n\n ${StyledInput}:focus ~ & {\n transform: scale(0.9);\n top: -8px;\n ${props =>\n !!props.decreaseLabelFontSize && `font-size: 11px; top: -6px;`}\n }\n &.is-disabled {\n color: ${props =>\n !!Themes[props.colorTheme].disabledLabelColor\n ? Themes[props.colorTheme].disabledLabelColor\n : props.theme.Colors.cloudyBlue};\n }\n\n &.login-input-label {\n font-size: ${props => props.filled ? '11px' : props.fontSize};\n top: ${props => (props.filled ? '-12px' : '0')};\n transform: none;\n }\n ${StyledInput}.login-input:-webkit-autofill ~ & {\n font-size: 11px;\n top: -12px;\n }\n ${StyledInput}.login-input:focus ~ & {\n transform: none;\n font-size: 11px;\n top: -12px;\n }\n`;\n\nexport const ShowPassword = styled.div<{ fontSize?: string }>`\n font-size: ${props => (props.fontSize ? props.fontSize : '11px')};\n font-weight: 600;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n height: 100%;\n padding: 0 24px 0 12px;\n\n cursor: pointer;\n user-select: none;\n color: ${props => props.theme.Colors.darkSkyBlue};\n\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n`;\n\nexport const ClearInput = styled.div<{\n colorTheme: ColorTheme;\n shown: boolean;\n top?: string;\n}>`\n display: ${({ shown }) => (shown ? 'flex' : 'none')};\n flex-basis: 12px;\n flex-shrink: 0;\n align-items: center;\n height: 100%;\n padding: 0 16px 0 12px;\n cursor: pointer;\n box-sizing: content-box;\n color: ${({ colorTheme }) => Themes[colorTheme].color};\n\n &:focus {\n opacity: 0.7;\n }\n`;\n\nexport const PasswordEye = styled.div<{ shouldShowPassword: boolean }>`\n flex-shrink: 0;\n height: 100%;\n width: 48px;\n cursor: pointer;\n user-select: none;\n background-image: ${({ shouldShowPassword }) =>\n shouldShowPassword ? `url(${HideIcon})` : `url(${ShowIcon})`};\n background-repeat: no-repeat;\n background-position: center left;\n`;\n\nexport const EmailPencilWrapper = styled.div`\n cursor: pointer;\n height: 100%;\n width: 48px;\n svg {\n height: 100%;\n width: 20px;\n user-select: none;\n top: 10px;\n }\n`;\n","import { FC, useState, forwardRef } from 'react';\n\nimport Close from '../../icons/Close';\nimport {\n ClearInput,\n Container, EmailPencilWrapper,\n Label,\n PasswordEye,\n ShowPassword,\n StyledInput,\n} from './style';\nimport { InputProps } from './type';\nimport PencilIcon from '../../icons/PencilIcon';\nimport ROUTES from '../../../routes/routes';\nimport { History } from 'history';\nimport { useHistory } from '../../../tools/router';\n\nconst Input: FC<InputProps> = forwardRef(\n (\n {\n type,\n field,\n disabled,\n autoComplete,\n autoFocus,\n height,\n fontSize,\n label,\n value,\n handleChange,\n onBlur,\n maxLength,\n placeholder,\n className,\n colorTheme,\n error,\n readOnly,\n clearInput,\n onKeyPress,\n onKeyDown,\n onFocus,\n labelTopPosition,\n labelLeftPosition,\n inputPadding,\n containerWidth,\n labelFontWeight,\n clearTopPosition,\n labelFontSize,\n fontFamily,\n hideError,\n decreaseLabelFontSize,\n dataTest,\n containerStyle,\n hint,\n },\n ref\n ) => {\n const [showPassword, setShowPassword] = useState(false);\n const history: History<any> = useHistory();\n const clearShown = !!(\n clearInput &&\n value &&\n value.toString().length > 0\n );\n const selectedColorTheme = colorTheme || 'light';\n const inputType = showPassword\n ? true\n : type === 'password-with-eye'\n ? 'password'\n : type;\n\n return (\n <Container\n colorTheme={selectedColorTheme}\n height={height ? height : '56px'}\n width={containerWidth}\n hideError={hideError}\n error={error}\n className={className ? `${className}-container` : ''}\n style={containerStyle}\n >\n <StyledInput\n data-test={dataTest}\n ref={ref}\n {...field}\n fontFamily={fontFamily}\n type={inputType}\n height={height ? height : '56px'}\n fontSize={fontSize}\n disabled={disabled}\n autoComplete={autoComplete}\n className={className && (!!error && !hideError ? `${className} ${className}-with-error` : className)}\n value={value}\n maxLength={maxLength}\n onKeyPress={(e: KeyboardEvent) =>\n onKeyPress && onKeyPress(e)\n }\n onKeyDown={(e: KeyboardEvent) =>\n onKeyDown && onKeyDown(e)\n }\n onChange={\n handleChange\n ? handleChange\n : field\n ? field.onChange\n : undefined\n }\n hideError={hideError}\n autoFocus={autoFocus}\n onBlur={onBlur}\n onFocus={onFocus}\n colorTheme={selectedColorTheme}\n error={error}\n placeholder={placeholder}\n readOnly={readOnly}\n padding={inputPadding}\n title={hint}\n />\n <Label\n filled={!!value}\n top={\n value && decreaseLabelFontSize\n ? '-6px'\n : labelTopPosition\n }\n left={labelLeftPosition}\n htmlFor=\"input\"\n fontWeight={labelFontWeight}\n disabled={disabled}\n fontSize={\n value && decreaseLabelFontSize ? '11px' : labelFontSize\n }\n decreaseLabelFontSize={decreaseLabelFontSize}\n colorTheme={selectedColorTheme}\n className={(className ? `${className}-label ` : '') + (disabled ? 'is-disabled' : '')}\n >\n {label}\n </Label>\n <ClearInput\n colorTheme={selectedColorTheme}\n shown={clearShown}\n top={clearTopPosition}\n onClick={e => {\n e.stopPropagation();\n clearInput && clearInput();\n }}\n data-test={dataTest && `${dataTest}-clear`}\n >\n <Close type=\"thin\" />\n </ClearInput>\n {type === 'password' && (\n <ShowPassword\n onClick={() => setShowPassword(!showPassword)}\n fontSize={fontSize}\n data-test={dataTest ? `${dataTest}-${showPassword ? 'hide' : 'show'}` : null}\n >\n {showPassword ? 'Hide' : 'Show'}\n </ShowPassword>\n )}\n {type === 'password-with-eye' && (\n <PasswordEye\n onClick={() => setShowPassword(!showPassword)}\n shouldShowPassword={showPassword}\n data-test={dataTest ? `${dataTest}-eye` : null}\n />\n )}\n {type === 'email-with-edit-link' && (\n <EmailPencilWrapper onClick={() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }}>\n <PencilIcon/>\n </EmailPencilWrapper>\n )}\n </Container>\n );\n }\n);\n\nexport default Input;\n","import { ADD_MESSAGE, ErrorMessagesActions, REMOVE_MESSAGE } from './actions';\nimport { ErrorMessagesInterface } from '../ErrorMessages';\nimport { AppState } from '../../../../store/reducers';\nimport { Reducer } from 'redux';\n\nconst initialState: ErrorMessagesInterface = {\n status: null,\n message: '',\n};\n\nconst messageReducer: Reducer<ErrorMessagesInterface, ErrorMessagesActions> = (\n state = initialState,\n action\n): ErrorMessagesInterface => {\n switch (action.type) {\n case ADD_MESSAGE:\n return {\n status: action.error.status,\n message: action.error.message,\n };\n case REMOVE_MESSAGE:\n return initialState;\n default:\n return state;\n }\n};\n\nexport const getErrorMessages = (state: AppState) => state.messages;\n\nexport default messageReducer;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PencilIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.085a1.75 1.75 0 0 1 0 2.475l-8.61 8.61c-.21.21-.47.363-.756.445l-3.251.929a.75.75 0 0 1-.927-.927l.929-3.251a1.75 1.75 0 0 1 .445-.757l8.61-8.61zm1.414 1.06a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354l-1.086-1.086zM11.189 6.25 9.75 4.81l-6.286 6.287a.25.25 0 0 0-.064.108l-.558 1.953 1.953-.558a.249.249 0 0 0 .108-.064l6.286-6.286z\" fill=\"#B1C0CB\"/>\n</svg>\n );\n }\n);\n\nexport default PencilIcon;\n","export { default as ImageUploader } from './controller';\nexport * from './types';\n","const ContentContainerId = 'MainScrollableContainer';\n\nexport const getPortalElement = (\n triggerElement: HTMLElement | null,\n type: 'tooltip' | 'popup'\n): HTMLElement => {\n let portal = document.querySelector('body') as HTMLElement;\n\n if (type === 'tooltip') {\n return portal;\n }\n\n const contentContainer = document.getElementById(ContentContainerId);\n\n if (contentContainer && triggerElement?.closest(`#${ContentContainerId}`)) {\n portal = contentContainer;\n }\n return portal;\n};\n","import React, { FC } from 'react';\nimport AvatarPlaceholder from '../../../../../components/AvatarPlaceholder/AvatarPlaceholder';\nimport { UserProfile, UserInterface } from '../../../../../../constants/interfaces/User';\nimport styled from 'styled-components';\n\nconst StyledUserArea = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 56px;\n flex-shrink: 0;\n`;\n\nconst UserProfilePictureSection = styled.div<{ open?: boolean }>`\n height: 38px;\n width: 38px;\n padding: 6px;\n overflow: hidden;\n border-radius: 8px;\n ${props => props.open && `background: var(--ps-graphite-2)`};\n`;\n\nconst MinimizedUserProfileArea: FC<{\n profile: Partial<UserProfile | UserInterface>;\n open?: boolean;\n dataTest?: string;\n}> = ({ profile, open, dataTest }) => {\n return (\n <StyledUserArea>\n <UserProfilePictureSection open={open}>\n <AvatarPlaceholder profile={profile} size={'sm'} dataTest={dataTest} />\n </UserProfilePictureSection>\n </StyledUserArea>\n );\n};\n\nexport default MinimizedUserProfileArea;\n","import { useContext } from 'react';\n\nimport { WithLabelsContextProps, WithLabelsContext } from './context';\n\nexport const useWithLabelsContext = (): WithLabelsContextProps => {\n const context = useContext(WithLabelsContext);\n\n if (!context) {\n throw new Error(\n 'Cannot find WithLabels context provider. Please make a sure that you are located on the children of WithLabelsProvider'\n );\n }\n return context;\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Star = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, viewBox }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox={!!viewBox ? viewBox : '-1 -1 10 10'}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4 6L1.649 7.236 2.098 4.618 0.196 2.764 2.824 2.382 4 0 5.176 2.382 7.804 2.764 5.902 4.618 6.351 7.236z\"\n transform=\"translate(-276 -296) translate(276 296)\"\n />\n </svg>\n );\n }\n);\n\nexport default Star;\n","import { useContext } from 'react';\n\nimport { WithPractisSetsContextProps, WithPractisSetsContext } from './context';\n\nexport const useWithPractisSetsContext = (): WithPractisSetsContextProps => {\n const context = useContext(WithPractisSetsContext);\n\n if (!context) {\n throw new Error(\n 'Cannot find WithPractisSets context provider. Please make a sure that you are located on the children of WithPractisSetsProvider'\n );\n }\n return context;\n};\n","export { default as Subheader } from './view';\nexport * from './types';\n","import Calendar from 'react-calendar';\nimport styled from 'styled-components';\n\nexport const StyledCalendar = styled(Calendar)`\n width: 100%;\n .react-calendar__navigation {\n height: 32px;\n margin-bottom: 22px;\n justify-content: center;\n\n .react-calendar__navigation__label {\n font-size: 20px;\n font-weight: bold;\n background: ${props => props.theme.Colors.white};\n border: none;\n width: 200px;\n flex-grow: 0 !important;\n font-family: 'Manrope';\n pointer-events: none;\n }\n .react-calendar__navigation__arrow {\n background: ${props => props.theme.Colors.white};\n border: none;\n cursor: pointer;\n\n &[disabled] {\n pointer-events: none;\n opacity: 0.4;\n }\n }\n }\n\n .react-calendar__month-view__weekdays {\n margin-bottom: 12px;\n\n .react-calendar__month-view__weekdays__weekday {\n background: ${props => props.theme.Colors.white};\n color: ${props => props.theme.Colors.blackThree};\n border: none;\n width: 25px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n font-weight: 500;\n font-family: 'Manrope';\n abbr[title] {\n text-decoration: none;\n }\n }\n }\n\n .react-calendar__month-view__days {\n .react-calendar__month-view__days__day {\n background: ${props => props.theme.Colors.white};\n border: none;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 4px;\n font-size: 16px;\n font-weight: 500;\n font-family: 'Manrope';\n padding: 0;\n abbr {\n text-decoration: none;\n color: ${props => props.theme.Colors.cloudyBlue};\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n &:disabled {\n background: ${props => props.theme.Colors.lighterGray};\n cursor: default;\n pointer-events: none;\n }\n }\n .react-calendar__tile--active {\n abbr {\n border-radius: 2px;\n background: ${props => props.theme.Colors.softBlue};\n color: ${props => props.theme.Colors.white};\n }\n }\n .react-calendar__tile--range {\n background: ${props => props.theme.Colors.softerBlue};\n abbr {\n border-radius: 2px;\n background: ${props => props.theme.Colors.softerBlue};\n color: ${props => props.theme.Colors.white};\n }\n }\n .react-calendar__tile--rangeStart {\n background: ${props => props.theme.Colors.white};\n abbr {\n border-radius: 2px;\n background: ${props => props.theme.Colors.darkSkyBlue};\n color: ${props => props.theme.Colors.white};\n }\n }\n .react-calendar__tile--rangeEnd {\n background: ${props => props.theme.Colors.white};\n abbr {\n border-radius: 2px;\n background: ${props => props.theme.Colors.darkSkyBlue};\n color: ${props => props.theme.Colors.white};\n }\n }\n\n .react-calendar__month-view__days__day--neighboringMonth {\n visibility: hidden;\n pointer-events: none;\n }\n }\n`;\n\nexport const IconHolder = styled.div<{ scaleX?: number }>`\n width: 7px;\n height: 14px;\n color: ${props => props.theme.Colors.blackThree};\n transform: scaleX(${props => props.scaleX || 1});\n`;","import { PropsWithChildren, ReactElement } from 'react';\nimport { OnChangeDateCallback } from 'react-calendar';\nimport dayjs from 'dayjs';\n\nimport ArrowRightIcon from '../../icons/ArrowRight';\nimport { IconHolder, StyledCalendar } from './styles';\n\nexport type CalendarValue<T extends boolean = false> = T extends true\n ? { start: Date | null; end: Date | null }\n : Date | null | undefined;\n\ntype Props<T extends boolean> = {\n value: CalendarValue<T>;\n handleChange(date: CalendarValue<T>): void;\n selectRange: T;\n restrictPast?: boolean;\n restrictFuture?: boolean;\n};\n\nexport const CustomCalendar = <T extends boolean = false>({\n value,\n handleChange,\n selectRange,\n restrictPast = false,\n restrictFuture = false,\n}: PropsWithChildren<Props<T>>): ReactElement => {\n const getLibraryValue = (): Date | Date[] | null | undefined => {\n if (selectRange) {\n const _value = value as CalendarValue<true>;\n // react-calendar cannot receive an empty array\n const outArray = [_value.start, _value.end]\n .filter(item => item !== null)\n .map(item => dayjs(item as Date | string).toDate());\n\n return outArray.length > 0 ? outArray : null;\n }\n\n const _value = value as CalendarValue<false>;\n\n return _value ? dayjs(_value).toDate() : null;\n };\n\n const transformLibraryToComponentValue = (\n date: Date | Date[]\n ): CalendarValue<true | false> => {\n if (Array.isArray(date) && selectRange) {\n return {\n start: date[0] || null,\n end: date[1] || null,\n };\n }\n return date as CalendarValue<false>;\n };\n\n const changeHandler: OnChangeDateCallback = date => {\n // @ts-ignore\n handleChange(transformLibraryToComponentValue(date));\n };\n\n return (\n <StyledCalendar\n calendarType={'US'}\n formatShortWeekday={(locale, date) =>\n ['S', 'M', 'T', 'W', 'T', 'F', 'S'][date.getDay()]\n }\n prev2Label={null}\n next2Label={null}\n nextLabel={\n <IconHolder data-test='calendar-next-button'>\n <ArrowRightIcon />\n </IconHolder>\n }\n prevLabel={\n <IconHolder scaleX={-1} data-test='calendar-prev-button'>\n <ArrowRightIcon />\n </IconHolder>\n }\n value={getLibraryValue() as any}\n onChange={changeHandler}\n selectRange={selectRange}\n minDate={restrictPast ? new Date() : undefined}\n maxDate={restrictFuture ? new Date() : undefined}\n allowPartialRange={false}\n />\n );\n};\n\nexport default CustomCalendar;\n","import React, {\n cloneElement,\n PropsWithChildren,\n ReactElement,\n RefObject,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport styled, { css } from 'styled-components';\nimport dayjs from 'dayjs';\nimport { createPortal } from 'react-dom';\n\nimport { CalendarValue, CustomCalendar } from './Calendar';\nimport { Button } from '../Button';\nimport { usePopup } from '../../../helpers/hooks/usePopup';\nimport { getPortalElement } from '../Popup/helpers/getPortalElement';\nimport { DATE_FORMAT } from './constants';\n\n\n//region Types\ntype ApiProps<T extends boolean> = {\n defaultApplyContent: ReactElement;\n defaultClearContent: ReactElement;\n setClearOnApply: (state: boolean) => void;\n clear: () => void;\n apply: (skipRestriction?: boolean) => void;\n tempValue: CalendarValue<T>;\n resetComponentValue: () => void;\n value: CalendarValue<T>;\n clearState: boolean;\n disabled: boolean;\n shown: boolean;\n hide: () => void;\n show: () => void;\n};\n\nexport type CalendarPopUpProps<T extends boolean = false> = {\n value: CalendarValue<T>;\n onChange: (value: CalendarValue<T>) => void;\n selectRange: T;\n disabled?: boolean;\n className?: string;\n restrictPast?: boolean;\n restrictFuture?: boolean;\n renderActions?: (props: ApiProps<T>) => ReactElement;\n beforeApply?: (props: ApiProps<T>) => boolean;\n children?:\n | ReactElement\n | {\n (\n ref: RefObject<HTMLDivElement>,\n props: ApiProps<T>\n ): ReactElement;\n };\n dataTest?: string;\n};\n//endregion\n\n//region Styles\nconst StyledCalendarContainer = styled.div`\n display: flex;\n align-items: center;\n flex-direction: column;\n\n width: 432px;\n min-height: 392px;\n padding: 32px;\n\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n background: ${props => props.theme.Colors.white};\n`;\n\nconst StyledCalendarSection = styled.div`\n width: 100%;\n padding: 0 28px 0 28px;\n margin-bottom: 24px;\n`;\n\nconst StyledActionsSection = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n\n & > *:not(:last-child) {\n margin-right: 16px;\n }\n`;\n\nconst Control = styled.div<{ disabled?: boolean; shown: boolean, hasValue?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 216px;\n height: 40px;\n padding: 8px 16px;\n\n color: ${props => props.hasValue ? props.theme.Colors.black : props.theme.Colors.steelGrey};\n border-radius: 4px;\n background-color: ${props => props.theme.Colors.whiteFive};\n\n user-select: none;\n cursor: pointer;\n\n ${({ shown, theme, disabled }) => {\n if (shown && !disabled) {\n return css`\n border: 1px solid ${theme.Colors.cloudyBlue};\n `;\n }\n }}\n\n ${({ disabled }) => {\n if (disabled) {\n return css`\n cursor: default;\n color: ${props => props.theme.Colors.cloudyBlue};\n `;\n }\n }}\n`;\n\nconst DashSeparator = styled.div`\n padding: 0 7.5px;\n`;\n\nconst StyledValue = styled.div`\n font-size: 13px;\n margin: 0;\n`;\n//endregion\n\nexport const CalendarPopup = <T extends boolean = false>({\n value,\n onChange,\n disabled,\n className,\n selectRange,\n restrictPast = false,\n restrictFuture = false,\n renderActions,\n beforeApply,\n children,\n dataTest\n}: PropsWithChildren<CalendarPopUpProps<T>>) => {\n const bodyDOM = document.querySelector('body');\n const contentRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const [clearOnApply, setClearOnApply] = useState(false);\n const [tempValue, setTempValue] = useState<CalendarValue<T>>(value);\n const portalElement = getPortalElement(triggerRef.current, 'popup');\n\n const { shown, hide, show, style, enabled, disable, enable } = usePopup(\n triggerRef,\n contentRef,\n portalElement,\n {\n interactive: true,\n trigger: 'click',\n position: 'bottom-start',\n offset: {\n y: '8px',\n x: '0px',\n },\n }\n );\n\n useEffect(() => {\n setTempValue(value);\n }, [value]);\n\n useEffect(() => {\n if (disabled) {\n disable();\n } else {\n enable();\n }\n }, [disable, disabled, enable]);\n\n const clearHandler = () => {\n if (selectRange) {\n // @ts-ignore\n setTempValue({ start: null, end: null });\n } else {\n // @ts-ignore\n setTempValue(null);\n }\n };\n\n const saveHandler = (skipRestriction: boolean = false) => {\n if (beforeApply) {\n const res = beforeApply(getApiProps());\n if (!res && !skipRestriction) {\n return;\n }\n }\n\n // @ts-ignore\n onChange(clearOnApply ? null : tempValue);\n setClearOnApply(false);\n hide();\n };\n\n const isClearDisabled = (): boolean => {\n if (\n selectRange &&\n (tempValue as CalendarValue<true>).start === null &&\n (tempValue as CalendarValue<true>).end === null\n ) {\n return true;\n }\n if (\n (!selectRange && (tempValue as CalendarValue<true>) === null) ||\n (tempValue as CalendarValue<true>) === undefined\n ) {\n return true;\n }\n\n return false;\n };\n\n const applyContent: ReactElement = (\n <Button\n label={'Apply'}\n height={'48px'}\n width={'128px'}\n action={() => saveHandler()}\n dataTest='apply-button'\n />\n );\n const clearContent: ReactElement = (\n <Button\n label={'Clear'}\n height={'48px'}\n width={'128px'}\n action={clearHandler}\n variant={'inverse'}\n disabled={isClearDisabled()}\n dataTest='clear-button'\n />\n );\n\n const getApiProps = (): ApiProps<T> => ({\n clear: clearHandler,\n apply: saveHandler,\n setClearOnApply: state => {\n setClearOnApply(state);\n },\n tempValue,\n resetComponentValue: () => setTempValue(value),\n value,\n clearState: clearOnApply,\n defaultApplyContent: applyContent,\n defaultClearContent: clearContent,\n disabled: !!disabled,\n hide,\n show,\n shown,\n });\n\n const renderActionsContent = (): ReactElement => {\n if (renderActions) {\n return renderActions(getApiProps());\n }\n\n return (\n <StyledActionsSection data-test=\"calendar-actions-container\">\n {clearContent}\n {applyContent}\n </StyledActionsSection>\n );\n };\n\n const renderContent = () => {\n return (\n <StyledCalendarContainer\n ref={contentRef}\n style={style}\n className={className}\n >\n <StyledCalendarSection>\n <CustomCalendar\n value={tempValue}\n handleChange={date => {\n setTempValue(date);\n }}\n selectRange={selectRange}\n restrictPast={restrictPast}\n restrictFuture={restrictFuture}\n />\n </StyledCalendarSection>\n {renderActionsContent()}\n </StyledCalendarContainer>\n );\n };\n\n const formatDate = (date: Date | string): string =>\n dayjs(date).format('MM/DD/YY');\n\n const renderCustomControl = () => {\n if (typeof children === 'function') {\n return children(triggerRef, getApiProps());\n }\n if (children) {\n // @ts-ignore\n return cloneElement(children, {\n ref: triggerRef,\n });\n }\n };\n\n const renderControl = () => {\n let startCaption = DATE_FORMAT;\n let endCaption = DATE_FORMAT;\n\n if (selectRange && value) {\n const _value = value as CalendarValue<true>;\n if (_value.start) {\n startCaption = formatDate(_value.start);\n }\n if (_value.end) {\n endCaption = formatDate(_value.end);\n }\n\n return (\n <>\n <StyledValue data-test=\"start-date-value\">\n {startCaption}\n </StyledValue>\n <DashSeparator data-test='date-separator'>—</DashSeparator>\n <StyledValue data-test=\"end-date-value\">\n {endCaption}\n </StyledValue>\n </>\n );\n }\n\n const _value = value as CalendarValue<false>;\n if (_value) {\n startCaption = endCaption = formatDate(_value);\n }\n\n return (\n <>\n <StyledValue data-test=\"start-date-value\">\n {startCaption}\n </StyledValue>\n </>\n );\n };\n\n if (!bodyDOM) {\n return null;\n }\n\n const hasNoValue = (!!value && !(value as any)?.start) || !value;\n\n return (\n <>\n {children ? (\n renderCustomControl()\n ) : (\n <Control\n disabled={disabled}\n ref={triggerRef}\n shown={shown}\n hasValue={!hasNoValue}\n data-test={dataTest ?? \"calendar-selector\"}\n >\n {renderControl()}\n </Control>\n )}\n {shown && enabled && createPortal(renderContent(), bodyDOM)}\n </>\n );\n};\n","import { useCallback } from 'react';\nimport Axios from 'axios';\nimport { useCreateMediaApi, useVerifyMediaApi } from '../../api';\nimport { MediaInfo } from '../../constants/interfaces/MediaInfo';\nimport { MAX_FILE_SIZE } from './constants';\n\n/**\n * @description creates media record, uploads file to AWS\n * performs file verification and returns media id\n * @function useUploadMediaService\n * @returns { CallableFunction }\n */\nexport const useUploadMediaService = () => {\n const createMediaApi = useCreateMediaApi();\n const verifyMediaApi = useVerifyMediaApi();\n\n /**\n * @function callback\n * @param { File } file\n * @returns { Promise<number> }\n */\n return useCallback(\n (file: File) => {\n if (file.size > MAX_FILE_SIZE)\n return Promise.reject({ message: 'File size can not exceed 10Mb' });\n\n let mediaId: number;\n return createMediaApi(file.type)\n .then((media: MediaInfo) => {\n mediaId = media.id;\n return Axios.put(media.url, file, { headers: { 'Content-Type': file.type } });\n })\n .then(() => {\n return verifyMediaApi(mediaId);\n })\n .then((verificationResult: MediaInfo) => {\n if (verificationResult.status === 'ACTIVE') {\n return Promise.resolve(mediaId);\n } else {\n return Promise.reject({ message: 'Verification of uploaded media failed' });\n }\n });\n },\n [createMediaApi, verifyMediaApi]\n );\n};","export const MAX_FILE_SIZE = 10485760;","import {\n useState,\n RefObject,\n useEffect,\n useLayoutEffect,\n useRef,\n CSSProperties,\n useMemo,\n} from 'react';\n\nimport useWindowDimensions from './useWindowDimensions';\nimport { useOutsideClick } from './useOutsideClick';\n\n//region Types\nexport type PopupPosition =\n | 'center-right--bottom'\n | 'center-left--bottom'\n | 'center-right--top'\n | 'center-left--top'\n | 'bottom-start'\n | 'bottom-end'\n | 'right-start'\n | 'left-start'\n | 'top-start'\n | 'top-end';\n\nexport type PopupTrigger = 'hover' | 'click';\n\nexport type PopupOffset = { x?: string; y?: string };\n\nexport type PopupConfig = {\n position?: PopupPosition;\n offset?: PopupOffset;\n trigger?: PopupTrigger;\n interactive?: boolean;\n autoBind?: boolean;\n hideOnOutsideClick?: boolean;\n};\n\nexport type PopupProps = {\n enabled: boolean;\n enable: () => void;\n disable: () => void;\n style: CSSProperties;\n show: () => void;\n hide: () => void;\n toggleShown: () => void;\n shown: boolean;\n position: PopupPosition;\n};\n//endregion\n\n//region Config\nconst positionsConfig: Record<\n PopupPosition,\n {\n overflowHorizontal?: PopupPosition;\n overflowVertical?: PopupPosition;\n defaultOffset: PopupOffset;\n }\n> = {\n 'bottom-end': {\n overflowVertical: 'top-end',\n overflowHorizontal: 'bottom-start',\n defaultOffset: {\n x: '0px',\n y: '5px',\n },\n },\n 'bottom-start': {\n overflowVertical: 'top-start',\n overflowHorizontal: 'bottom-end',\n defaultOffset: {\n x: '0px',\n y: '5px',\n },\n },\n 'top-start': {\n overflowVertical: 'bottom-start',\n overflowHorizontal: 'top-end',\n defaultOffset: {\n x: '0px',\n y: '-5px',\n },\n },\n 'top-end': {\n overflowVertical: 'bottom-end',\n overflowHorizontal: 'top-start',\n defaultOffset: {\n x: '0px',\n y: '-5px',\n },\n },\n 'left-start': {\n overflowHorizontal: 'right-start',\n defaultOffset: {\n x: '-5px',\n y: '0px',\n },\n },\n 'right-start': {\n overflowHorizontal: 'left-start',\n defaultOffset: {\n x: '5px',\n y: '0px',\n },\n },\n 'center-right--bottom': {\n overflowHorizontal: 'center-left--bottom',\n overflowVertical: 'center-right--top',\n defaultOffset: {\n x: '0px',\n y: '0px',\n },\n },\n 'center-left--bottom': {\n overflowHorizontal: 'center-right--bottom',\n overflowVertical: 'center-left--top',\n defaultOffset: {\n x: '0px',\n y: '0px',\n },\n },\n 'center-right--top': {\n overflowHorizontal: 'center-left--top',\n overflowVertical: 'center-right--bottom',\n defaultOffset: {\n x: '0px',\n y: '0px',\n },\n },\n 'center-left--top': {\n overflowHorizontal: 'center-right--bottom',\n overflowVertical: 'center-left--bottom',\n defaultOffset: {\n x: '0px',\n y: '0px',\n },\n },\n};\n//endregion\n\n/**\n * Hook for absolute positioning blocks\n * @param triggerRef Element which will be trigger events\n * @param contentRef Element with exiting content\n * @param containerElement\n * @param config \"autoBind\" add event listeners for triggerRef. \"interactive\" - content can be react to user actions\n */\nexport const usePopup = (\n triggerRef: RefObject<HTMLElement>,\n contentRef: RefObject<HTMLElement>,\n containerElement: HTMLElement,\n config?: PopupConfig\n): PopupProps => {\n const targetConfig: Required<PopupConfig> = {\n offset: { x: '0px', y: '0px' },\n position: 'bottom-start',\n trigger: 'hover',\n interactive: false,\n autoBind: true,\n hideOnOutsideClick: true,\n ...config,\n };\n\n const window = useWindowDimensions();\n const containerElementPositionChange = containerElement.getBoundingClientRect();\n\n const bounds = useMemo(() => {\n const containerRects = containerElement.getBoundingClientRect();\n const triggerRects = triggerRef.current?.getBoundingClientRect();\n return {\n top: (triggerRects?.top || 0) - containerRects.top,\n left: (triggerRects ? triggerRects.left : 0) - containerRects.left,\n right:\n (triggerRects ? triggerRects.right : 0) - containerRects.right,\n bottom: (triggerRects?.bottom || 0) - containerRects.bottom,\n height: triggerRects?.height || 0,\n width: triggerRects?.width || 0,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n containerElement,\n containerElementPositionChange,\n triggerRef,\n triggerRef.current,\n window,\n ]);\n\n // Set Handlers\n useEffect(() => {\n const currentTriggerRef = triggerRef?.current;\n\n if (currentTriggerRef && targetConfig.autoBind) {\n switch (targetConfig.trigger) {\n case 'hover':\n currentTriggerRef.addEventListener('mouseenter', show);\n currentTriggerRef.addEventListener('mouseleave', hide);\n break;\n case 'click':\n currentTriggerRef.addEventListener('click', toggleShown);\n break;\n }\n }\n\n return () => {\n if (currentTriggerRef && targetConfig.autoBind) {\n switch (targetConfig.trigger) {\n case 'hover':\n currentTriggerRef.removeEventListener(\n 'mouseenter',\n show\n );\n currentTriggerRef.removeEventListener(\n 'mouseleave',\n hide\n );\n break;\n case 'click':\n currentTriggerRef.removeEventListener(\n 'click',\n toggleShown\n );\n break;\n }\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Positioning\n const [position, setPosition] = useState<PopupPosition>(\n targetConfig.position\n );\n\n const [shown, _setShown] = useState(false);\n // addEventListener doesn't updating on re-rendering\n const shownRef = useRef(shown);\n const setShown = (value: boolean) => {\n shownRef.current = value;\n _setShown(value);\n };\n const show = () => {\n setShown(true);\n };\n const hide = () => {\n setShown(false);\n };\n const toggleShown = () => {\n if (shownRef.current) {\n hide();\n } else {\n show();\n }\n };\n\n useOutsideClick(\n [contentRef, triggerRef],\n hide,\n targetConfig.hideOnOutsideClick\n );\n\n // Detecting when content is out of viewport\n useLayoutEffect(() => {\n if (shown && contentRef.current) {\n const contentRects = contentRef.current.getBoundingClientRect();\n const isOutOfHorizontal =\n contentRects.right > window.width || contentRects.left < 0;\n\n if (\n isOutOfHorizontal &&\n positionsConfig[position].overflowHorizontal\n ) {\n setPosition(\n positionsConfig[position]\n .overflowHorizontal as PopupPosition\n );\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shown]);\n\n const [enabled, setEnabled] = useState(true);\n const enable = () => {\n setEnabled(true);\n };\n const disable = () => {\n hide();\n setEnabled(false);\n };\n\n if (triggerRef.current === null) {\n return {\n style: {\n left: '0px',\n top: '0px',\n },\n shown,\n hide,\n show,\n enabled,\n enable,\n disable,\n toggleShown,\n position,\n };\n }\n\n const getOffset = (): PopupOffset => {\n if (config && config.offset) {\n return {\n x: config.offset.x || positionsConfig[position].defaultOffset.x,\n y: config.offset.y || positionsConfig[position].defaultOffset.y,\n };\n }\n\n return positionsConfig[position].defaultOffset;\n };\n\n const getPositionStyles = (): CSSProperties => {\n const offset = getOffset();\n switch (position) {\n case 'bottom-start':\n return {\n top: `calc(${(bounds.top + bounds.height).toString()}px + ${\n offset.y\n })`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n };\n case 'bottom-end':\n return {\n top: `calc(${(bounds.top + bounds.height).toString()}px + ${\n offset.y\n })`,\n left: `calc(${bounds.left.toString()}px + ${\n bounds.width\n }px + ${offset.x})`,\n transform: 'translateX(-100%)',\n };\n case 'right-start':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${\n bounds.width\n }px + ${offset.x})`,\n };\n case 'left-start':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: 'translateX(-100%)',\n };\n case 'top-start':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: 'translateY(-100%)',\n };\n case 'top-end':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${\n bounds.width\n }px + ${offset.x})`,\n transform: 'translateY(-100%) translateX(-100%)',\n };\n case 'center-right--bottom':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: `translateY(${bounds.height / 2}px) translateX(${\n bounds.width / 2\n }px)`,\n };\n case 'center-left--bottom':\n return {\n top: `calc(${bounds.top.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: `translateY(${\n bounds.height / 2\n }px) translateX(calc(-100% + ${bounds.width / 2}px))`,\n };\n case 'center-right--top':\n return {\n top: `calc(${bounds.bottom.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: `translateY(calc(-100% - ${\n bounds.height / 2\n }px + ${offset.y})) translateX(${bounds.width / 2}px)`,\n };\n case 'center-left--top':\n return {\n top: `calc(${bounds.bottom.toString()}px + ${offset.y})`,\n left: `calc(${bounds.left.toString()}px + ${offset.x})`,\n transform: `translateY(calc(-100% - ${\n bounds.height / 2\n }px + ${offset.y})) translateX(calc(-100% + ${\n bounds.width / 2\n }px))`,\n };\n }\n };\n\n const getAdditionalStyles = (): CSSProperties => {\n const styles: CSSProperties = {\n position: 'absolute',\n zIndex: 1500,\n };\n\n if (!targetConfig.interactive) {\n styles.pointerEvents = 'none';\n }\n\n return styles;\n };\n\n return {\n style: { ...getPositionStyles(), ...getAdditionalStyles() },\n shown,\n hide,\n show,\n enabled,\n enable,\n disable,\n toggleShown,\n position,\n };\n};\n","import { RefObject, useCallback, useEffect, useRef } from 'react';\n\nexport const useOutsideClick = <T extends HTMLElement = HTMLElement>(\n ref: RefObject<T> | RefObject<T>[],\n handler: (e: MouseEvent) => void,\n enabled = true\n) => {\n const savedHandler = useRef(handler);\n\n const clickHandler = useCallback(\n (e: MouseEvent) => {\n if (!enabled) {\n return;\n }\n\n const refs = Array.isArray(ref) ? ref : [ref];\n const contains = !!refs.find(\n item =>\n item.current !== null &&\n item.current.contains(e.target as HTMLElement)\n );\n\n if (!contains) {\n savedHandler.current(e);\n }\n },\n [enabled, ref]\n );\n\n useEffect(() => {\n savedHandler.current = handler;\n });\n\n useEffect(() => {\n const body = document.querySelector('body');\n\n if (body) {\n body.addEventListener('click', clickHandler);\n }\n\n return () => {\n if (body) {\n body.removeEventListener('click', clickHandler);\n }\n };\n }, [ref, handler, clickHandler]);\n};\n","export enum TableAssignOptionTypes {\n ASSIGN_LABELS = 'ASSIGN_LABELS',\n ASSIGN_PRACTIS_SETS = 'ASSIGN_PRACTIS_SETS',\n ASSIGN_PRACTIS_SETS_AND_DUE_DATE= 'ASSIGN_PRACTIS_SETS_AND_DUE_DATE',\n NUDGE = 'Nudge',\n EXPORT = 'EXPORT',\n ARCHIVE = 'ARCHIVE',\n RESTORE = 'RESTORE',\n REMIND = 'REMIND',\n RESEND_INVITES = 'RESEND_INVITES',\n REVOKE = 'REVEOKE',\n REMOVE_PRACTIS_SET = 'REMOVE_PRACTIS_SET',\n DUPLICATE = 'DUPLICATE',\n REMOVE_ITEMS = 'REMOVE_ITEMS',\n DUE_DATES = 'DUE_DATES'\n}\n","import styled from 'styled-components';\nimport { SIZES } from '../constants';\n\nexport const ScrollContainer = styled.div<{ addOverflow?: boolean }>`\n ${props => props.addOverflow && `overflow-y: hidden;`}\n ${props => props.addOverflow && `overflow-x: auto;`}\n transform: rotateZ(180deg);\n direction: rtl;\n display: flex;\n\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteTwo};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\n\nexport const TableInner = styled.table`\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n display: inline-table;\n transform: rotateZ(180deg);\n direction: ltr;\n min-width: ${SIZES.MIN_WIDTH}px;\n\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteTwo};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\n\nexport const TableCont = styled.div`\n display: block;\n border-radius: 8px;\n background: ${props => props.theme.Colors.white};\n position: relative;\n`;\n\nexport const InfiniteTableBodyContainer = styled.div`\n overflow: auto;\n min-height: 100%;\n`;\n\nexport const StyledTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n`;\n","import styled from 'styled-components';\nimport { TableCell } from '../table-cell';\n\nexport const TableCheckboxHeaderCell = styled(TableCell)`\n padding: 0;\n border-bottom: 1px solid ${props => props.theme.Colors.paleGrey};\n`;\n\nexport const StyledCellWrapper = styled.div<{\n width?: number;\n}>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${({ width }) => (width ? `${width}%` : '70%')};\n margin: 0 auto;\n\n th {\n display: flex;\n justify-content: center;\n }\n`;\n","import { FC } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport { TableCheckbox } from '../table-checkbox';\nimport { TableRow } from '../table-row';\nimport { StyledCellWrapper, TableCheckboxHeaderCell } from './style';\nimport { TableHeaderCell } from './table-header-cell';\nimport { TableHeaderProps } from './type';\n\nconst TableHeader: FC<TableHeaderProps> = props => {\n const { headerConfiguration } = props;\n\n const { masterCheckBoxConfig, columns } = headerConfiguration!;\n\n return (\n <thead>\n <TableRow>\n {masterCheckBoxConfig && (\n <TableCheckboxHeaderCell width={0.1} dataTest={masterCheckBoxConfig.dataTest && `${masterCheckBoxConfig.dataTest}-column`}>\n <TableCheckbox\n checked={masterCheckBoxConfig.checked}\n disabled={masterCheckBoxConfig.disabled}\n partial={masterCheckBoxConfig.partial}\n handleCheck={masterCheckBoxConfig.handleCheck}\n size={masterCheckBoxConfig.size}\n dataTest={masterCheckBoxConfig.dataTest && `${masterCheckBoxConfig.dataTest}-input`}\n />\n </TableCheckboxHeaderCell>\n )}\n {!isEmpty(columns) &&\n columns.map(column => {\n const { title, children, subColumns = undefined } = column;\n\n return isEmpty(subColumns) ? (\n <TableHeaderCell key={title} {...column}>\n {children ?? title ?? ''}\n </TableHeaderCell>\n ) : (\n <TableHeaderCell key={title} {...column} isMultiple>\n <StyledCellWrapper\n width={column?.titleWidth}\n className={\n column?.multiHeaderContainerClassName\n }\n >\n {subColumns?.map(subColumn => {\n const { title, ...rest } = subColumn;\n return (\n <TableHeaderCell\n {...rest}\n key={title}\n >\n {title ?? ''}\n </TableHeaderCell>\n );\n })}\n </StyledCellWrapper>\n </TableHeaderCell>\n );\n })}\n </TableRow>\n </thead>\n );\n};\n\nexport default TableHeader;\n","import styled from 'styled-components';\n\nimport { TableCell } from '../table-cell';\n\nexport const TableCheckboxCell = styled(TableCell)`\n padding: 0;\n`;\n\nexport const DefaultTeamIconHolderWrapper = styled.div`\n width: 16px;\n display: flex;\n justify-content: center;\n border-radius: 2px;\n background-color: ${props => props.theme.Colors.macaroniAndCheese};\n`;\n\nexport const DefaultTeamIconHolder = styled.div`\n width: 10px;\n height: 16px;\n display: block;\n color: ${props => props.theme.Colors.white};\n`;\n","import styled from 'styled-components';\n\nimport AvatarPlaceholder from '../../../../../AvatarPlaceholder/AvatarPlaceholder';\n\nexport const StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 200px;\n`;\n\nexport const Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n border-radius: 4px;\n flex-shrink: 0;\n`;\n\nexport const AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nexport const FlexWrapper = styled.div<{ hasMargin: boolean }>`\n display: flex;\n align-items: center;\n margin-left: ${props => (props.hasMargin ? -12 : 0)}px;\n`;\n","import { FC } from 'react';\n\nimport TableTitleOverflowText from '../../../TableTitleOverflowText/TableTitleOverflowText';\nimport { Avatar, AvatarTile, StyledFirstTableContent } from './styles';\nimport { AvatarFieldProps } from './types';\n\nconst AvatarField: FC<AvatarFieldProps> = props => {\n const { row, renderTitle, getAvatarProps, className, dataTest } = props;\n\n return (\n <StyledFirstTableContent className={className}>\n <AvatarTile>\n <Avatar dataTest={dataTest && `${dataTest}-avatar`} {...getAvatarProps?.(row)} />\n <TableTitleOverflowText dataTest={dataTest && `${dataTest}-title`}>\n {renderTitle?.(row)}\n </TableTitleOverflowText>\n </AvatarTile>\n </StyledFirstTableContent>\n );\n};\n\nexport default AvatarField;\n\n","import { FC } from 'react';\nimport { UserProfile } from '../../../../../../../constants/interfaces/User';\n\nimport MinimizedUserProfileArea from '../../../../../../layout/Sidebar/components/ProfileSection/components/MinimizedUserProfileArea';\nimport { FlexWrapper } from './styles';\nimport { AvatarFieldProps } from './types';\n\nconst MinimizedAvatarField: FC<AvatarFieldProps> = props => {\n const { row, renderTitle, getAvatarProps, hasMargin, className, dataTest } = props;\n\n return (\n <FlexWrapper\n hasMargin={hasMargin?.(row) ?? false}\n className={className}\n >\n <MinimizedUserProfileArea\n profile={getAvatarProps?.(row)?.profile ?? {} as Partial<UserProfile>}\n dataTest={getAvatarProps?.(row)?.dataTest ?? (dataTest ? `${dataTest}-avatar` : undefined)}\n />\n <span data-test={dataTest && `${dataTest}-title`}>{renderTitle?.(row)}</span>\n </FlexWrapper>\n );\n};\n\nexport default MinimizedAvatarField;\n\n","import { FC } from 'react';\n\nimport AvatarField from './avatar-field.view';\nimport MinimizedAvatarField from './minimized-avatar-field.view';\nimport { AvatarFieldProps } from './types';\n\nconst AvatarFieldController: FC<AvatarFieldProps> = props => {\n const { isMinimized, ...rest } = props;\n\n return isMinimized ? (\n <MinimizedAvatarField {...rest} />\n ) : (\n <AvatarField {...rest} />\n );\n};\n\nexport default AvatarFieldController;\n\n","import styled from 'styled-components';\n\nexport const STATUS_COLORS: any = {\n ACTIVE: {\n text: 'var(--ps-green-1)',\n background: 'var(--ps-green-2)',\n },\n DELETED: {\n text: 'var(--ps-black-main)',\n background: 'var(--ps-grey-4)',\n },\n PENDING: {\n text: 'var(--ps-orange-1)',\n background: 'var(--ps-orange-2)',\n },\n DRAFT: {\n text: 'var(--ps-blue-1)',\n background: 'var(--ps-white-6)',\n },\n ARCHIVED: {\n text: '#3a3a3a',\n background: '#ebebeb',\n },\n};\n\nexport const Td = styled.td<{\n width?: number;\n clickable?: boolean;\n flex?: { display: string; justifyContent: string; alignItems: string };\n}>`\n height: 55px;\n font-size: 13px;\n font-weight: 400;\n padding: 4px 8px 4px 0px;\n ${props => (props.width ? `width: ${props.width}%` : '')};\n &:hover {\n opacity: ${props => (props.clickable ? 0.7 : 1)};\n }\n ${props =>\n props.clickable &&\n `\n cursor: pointer;\n `}\n &:nth-child(1) {\n padding-left: 16px;\n }\n`;\n\nexport const Text = styled.div<{\n status?: any;\n}>`\n display: inline-block;\n padding: 4px 12px;\n background: ${props =>\n props.status\n ? STATUS_COLORS[props.status.toUpperCase()].background\n : STATUS_COLORS['ARCHIVED'].background};\n color: ${props =>\n props.status\n ? STATUS_COLORS[props.status.toUpperCase()].text\n : STATUS_COLORS['ARCHIVED'].text};\n font-size: 13px;\n border-radius: 100px;\n`;","import { FC, memo } from 'react';\n\nimport { Td, Text } from './styles';\nimport { TableStatusCellProps } from './types';\n\nconst TableStatusCell: FC<TableStatusCellProps> = ({\n width,\n colSpan,\n className,\n children,\n status,\n onClick,\n dataTest\n}) => (\n <Td\n width={width}\n clickable={!!onClick}\n colSpan={colSpan}\n className={className}\n onClick={onClick}\n >\n <Text status={status} data-test={dataTest}> {children}</Text>\n </Td>\n);\n\nexport default memo(TableStatusCell);\n\nexport const TableCellRoot = Td;\n\n","import { FC, memo } from 'react';\n\nimport { TableStatusCell } from './table-status-cell';\nimport { BadgeFieldProps } from './types';\n\nconst BadgeField: FC<BadgeFieldProps> = props => {\n const { row, renderTitle, getBadgeFieldProps } = props;\n return getBadgeFieldProps ? (\n <TableStatusCell {...getBadgeFieldProps(row)}>\n {renderTitle?.(row)}\n </TableStatusCell>\n ) : (\n <></>\n );\n};\n\nexport default memo(BadgeField);\n\n","export const TEXT_FIELD = 'TEXT_FIELD';\nexport const AVATAR_FIELD = 'AVATAR_FIELD';\nexport const BADGE_FIELD = 'BADGE_FIELD';\nexport const CUSTOM_FIELD = 'CUSTOM_FIELD';\nexport const LABEL_TAGS = 'LABEL_TAGS';\nexport const LIST_ACTIONS = 'LIST_ACTIONS';\n\nexport const fieldTypes = {\n TEXT_FIELD,\n AVATAR_FIELD,\n BADGE_FIELD,\n CUSTOM_FIELD,\n LABEL_TAGS,\n LIST_ACTIONS,\n};\n","import { FC } from 'react';\n\nimport { TableLabelTags } from '../../../TableLabelTags';\nimport { LabelTagsProps } from './types';\n\nconst LabelTags: FC<LabelTagsProps> = props => {\n const { row, getLabelTagsProps, className } = props;\n\n return (\n <TableLabelTags {...getLabelTagsProps?.(row)} className={className} />\n );\n};\n\nexport default LabelTags;\n","import { FC } from 'react';\n\nimport { ListActionsFieldProps } from './types';\n\nconst ListActionsField: FC<ListActionsFieldProps> = props => {\n const { row, getListActionsComponent } = props;\n\n return <>{getListActionsComponent?.(row)}</> ?? <></>;\n};\n\nexport default ListActionsField;\n\n","import styled from 'styled-components';\n\nexport const StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 120px;\n`;\n","import { FC } from 'react';\n\nimport TableTitleOverflowText from '../../../TableTitleOverflowText/TableTitleOverflowText';\nimport { StyledFirstTableContent } from './styles';\nimport { OverflowTextFieldProps } from './types';\n\nconst OverFlowTextField: FC<OverflowTextFieldProps> = props => {\n const { row, renderTitle, getTextFieldProps, className, dataTest } = props;\n\n return (\n <StyledFirstTableContent className={className}>\n <TableTitleOverflowText {...getTextFieldProps?.(row)} dataTest={dataTest}>\n {renderTitle?.(row)}\n </TableTitleOverflowText>\n </StyledFirstTableContent>\n );\n};\n\nexport default OverFlowTextField;\n\n","import { FC } from 'react';\n\nimport { TextFieldProps } from './types';\n\nconst TextField: FC<TextFieldProps> = props => {\n const { row, renderTitle, dataTest } = props;\n\n return <span data-test={dataTest}>{renderTitle?.(row)}</span>;\n};\n\nexport default TextField;\n\n","import { FC } from 'react';\n\nimport OverFlowTextField from './overflow-text-field.view';\nimport TextField from './text-field.view';\nimport { TextFieldProps } from './types';\n\nconst TextFieldController: FC<TextFieldProps> = props => {\n const { isOverFlowText, ...rest } = props;\n\n return isOverFlowText ? (\n <OverFlowTextField {...rest} />\n ) : (\n <TextField {...rest} />\n );\n};\n\nexport default TextFieldController;\n\n","import { FC } from 'react';\n\nimport { AvatarField } from './avatar-field';\nimport { BadgeField } from './badge-field';\nimport { fieldTypes } from './constants';\nimport { LabelTags } from './label-tags';\nimport { ListActionsField } from './list-actions-field';\nimport { TextField } from './text-field';\nimport { DynamicTableFieldProps } from './types';\n\nconst DynamicTableField: FC<DynamicTableFieldProps> = props => {\n const {\n fieldType,\n fieldProps,\n currentRowData,\n getCustomFieldComponent,\n } = props;\n\n let component = <div />;\n\n switch (fieldType) {\n case fieldTypes.TEXT_FIELD:\n component = <TextField {...fieldProps} row={currentRowData} />;\n break;\n\n case fieldTypes.AVATAR_FIELD:\n component = <AvatarField {...fieldProps} row={currentRowData} />;\n break;\n case fieldTypes.BADGE_FIELD:\n component = <BadgeField {...fieldProps} row={currentRowData} />;\n break;\n case fieldTypes.CUSTOM_FIELD:\n component = getCustomFieldComponent?.(currentRowData) ?? <div />;\n break;\n case fieldTypes.LABEL_TAGS:\n component = <LabelTags {...fieldProps} row={currentRowData} />;\n break;\n\n case fieldTypes.LIST_ACTIONS:\n component = (\n <ListActionsField {...fieldProps} row={currentRowData} />\n );\n break;\n\n default:\n break;\n }\n\n return component;\n};\n\nexport default DynamicTableField;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\nimport AssignedLabelList from './AssignedLabelList';\n\nconst Tr = styled.tr`\n background: unset !important;\n`;\n\nexport interface TableAssignedLabelTagsProps {\n selectedLabels?: number[];\n onDeleteLabel?(id: number): void;\n hideDeleteButton?: boolean;\n padding?: string;\n deletePermissions?: NEW_PERMISSIONS[];\n colSpan?: number;\n}\n\nconst TableAssignedLabelTags: FC<TableAssignedLabelTagsProps> = ({\n selectedLabels,\n colSpan = 100,\n onDeleteLabel,\n hideDeleteButton,\n deletePermissions,\n}) => {\n return (\n <Tr>\n <td colSpan={colSpan}>\n <AssignedLabelList\n selectedLabels={selectedLabels}\n hideDeleteButton={hideDeleteButton}\n deletePermissions={deletePermissions}\n onDeleteLabel={onDeleteLabel}\n />\n </td>\n </Tr>\n );\n};\n\nexport default TableAssignedLabelTags;\n","import { FC, Fragment } from 'react';\n\nimport { Tooltip } from '../../../Tooltip';\n\nimport { TableBodyWrapperProps } from './types';\nimport { TableBody } from './table-body';\nimport { TableRow } from '../table-row';\nimport { TableCheckbox } from '../table-checkbox';\nimport {\n DefaultTeamIconHolder,\n DefaultTeamIconHolderWrapper,\n TableCheckboxCell,\n} from './styles';\nimport Star from '../../../../icons/Star';\nimport { TableCell } from '../table-cell';\nimport { DynamicTableField } from './dynamic-field';\nimport TableAssignedLabelTags from '../TableLabelTags/TableAssignedLabelTags';\n\nconst TableBodyWrapper: FC<TableBodyWrapperProps> = props => {\n const { data, rowConfig } = props;\n\n const {\n cells,\n onRowClick,\n isRowChecked,\n onRowCheckHandler,\n isLabelTagsOpen,\n getLabelTagsProps,\n getClassName,\n getDataTest,\n dataTest,\n size = undefined,\n shouldShowAllMembers = false,\n } = rowConfig;\n\n return (\n <TableBody>\n {data?.map((row: any) => {\n const dataTestValue = getDataTest?.(row) ?? dataTest;\n return (\n <Fragment key={row?.id}>\n <TableRow\n key={row?.id}\n onClick={\n onRowClick ? () => onRowClick?.(row) : undefined\n }\n className={getClassName?.(row)}\n dataTest={dataTestValue}\n >\n {onRowCheckHandler && isRowChecked && (\n <TableCheckboxCell>\n {shouldShowAllMembers &&\n shouldShowAllMembers?.(row) ? (\n <Tooltip\n label=\"This team cannot be modified\"\n preset=\"checkbox-icon\"\n >\n <DefaultTeamIconHolderWrapper>\n <DefaultTeamIconHolder data-test={dataTestValue && `${dataTestValue}-checkbox-star`}>\n <Star />\n </DefaultTeamIconHolder>\n </DefaultTeamIconHolderWrapper>\n </Tooltip>\n ) : (\n <TableCheckbox\n checked={\n isRowChecked?.(row) ?? false\n }\n handleCheck={e =>\n onRowCheckHandler?.(e, row)\n }\n size={size}\n dataTest={dataTestValue && `${dataTestValue}-checkbox`}\n />\n )}\n </TableCheckboxCell>\n )}\n {cells?.map(cell => (\n <TableCell\n className={cell?.cellClassName}\n shouldShowEmptyCell={cell?.shouldShowEmptyCell?.(\n row\n )}\n width={cell?.width}\n >\n <DynamicTableField\n {...cell}\n currentRowData={row}\n />\n </TableCell>\n ))}\n </TableRow>\n\n {isLabelTagsOpen?.(row) && (\n <TableAssignedLabelTags\n {...getLabelTagsProps?.(row)}\n />\n )}\n </Fragment>\n );\n })}\n </TableBody>\n );\n};\n\nexport default TableBodyWrapper;\n","import { FC, memo } from 'react';\nimport { EmptyStateContainer } from './EmptyStateContainer';\nimport styled from 'styled-components';\n\nconst TableBody = styled.tbody``;\nconst TableEmptyTd = styled.td`\n height: 50vh;\n`;\n\nconst EmptyStateTableWrapper: FC = memo(({ children }) => {\n return (\n <TableBody>\n <tr>\n <TableEmptyTd colSpan={100}>\n <EmptyStateContainer>{children}</EmptyStateContainer>\n </TableEmptyTd>\n </tr>\n </TableBody>\n );\n});\n\nexport default EmptyStateTableWrapper;\n","import { FC } from 'react';\n\nimport {\n EmptyState,\n NoFilterResults,\n NoSearchResults,\n NoCalendarResults\n} from '../../../EmptyStates';\nimport { EmptyStateContainer } from '../../../EmptyStates/components/EmptyStateContainer';\nimport EmptyStateTableWrapper from '../../../EmptyStates/components/EmptyStateTableWrapper';\nimport { EmptyStateWrapperProps } from './type';\n\nconst EmptyStateWrapper: FC<EmptyStateWrapperProps> = props => {\n const {\n tableStates,\n noEntriesOptions,\n noSearchResultsOptions,\n noFilterResultsOptions,\n noCalendarResultsOptions,\n } = props;\n\n return (\n <EmptyStateTableWrapper>\n <EmptyStateContainer>\n {tableStates.showNoEntriesState && (\n <EmptyState icon={noEntriesOptions?.icon} width={noEntriesOptions?.width} dataTest={noEntriesOptions?.dataTest}>\n {noEntriesOptions?.text}\n </EmptyState>\n )}\n {tableStates.showNoSearchResultsState && (\n <NoSearchResults {...noSearchResultsOptions} />\n )}\n {tableStates.showNoFilterResultsState && (\n <NoFilterResults {...noFilterResultsOptions} />\n )}\n {tableStates.showNoCalendarResultsState && (\n <NoCalendarResults {...noCalendarResultsOptions} />\n )}\n </EmptyStateContainer>\n </EmptyStateTableWrapper>\n );\n};\n\nexport default EmptyStateWrapper;\n","import { FC, memo } from 'react';\n\nimport { TableProps } from './type';\nimport { TableCont, ScrollContainer, TableInner } from './style';\nimport { TableHeader } from './table-header';\nimport { TableBodyWrapper } from './table-body-wrapper';\nimport { EmptyStateWrapper } from './empty-state';\n\nconst TableSimpleView: FC<TableProps> = props => {\n const {\n data,\n tableStates,\n addOverflow,\n tableContainerClassName,\n tableInnerClassName,\n tableEmptyStateConfigurations,\n configuration,\n } = props;\n\n const { rowConfig } = configuration;\n\n const {\n shouldShowEmptyState,\n noEntriesOptions,\n noSearchResultsOptions,\n noFilterResultsOptions,\n noCalendarResultsOptions,\n } = tableEmptyStateConfigurations || {};\n\n return (\n <TableCont className={tableContainerClassName}>\n <ScrollContainer addOverflow={addOverflow}>\n <TableInner className={tableInnerClassName}>\n <TableHeader headerConfiguration={configuration} />\n\n {!tableStates.showEmptyState && (\n <TableBodyWrapper data={data} rowConfig={rowConfig} />\n )}\n\n {shouldShowEmptyState && tableStates.showEmptyState && (\n <EmptyStateWrapper\n tableStates={tableStates}\n noEntriesOptions={noEntriesOptions}\n noSearchResultsOptions={noSearchResultsOptions}\n noFilterResultsOptions={noFilterResultsOptions}\n noCalendarResultsOptions={noCalendarResultsOptions}\n />\n )}\n </TableInner>\n </ScrollContainer>\n </TableCont>\n );\n};\n\nexport default memo(TableSimpleView);\n","import { FC, memo } from 'react';\n\nimport { TableProps } from './type';\nimport { InfiniteTableBodyContainer, StyledTable } from './style';\nimport { TableHeader } from './table-header';\nimport { TableBodyWrapper } from './table-body-wrapper';\nimport { TableDivider } from '../table-divider';\nimport { ScrollPagination } from '../../ScrollPagination';\nimport { EmptyStateWrapper } from './empty-state';\n\nconst TableInfiniteScrollView: FC<TableProps> = props => {\n const {\n data,\n tableStates,\n tableContainerClassName,\n scrollPaginationProps,\n scrollRef,\n tableEmptyStateConfigurations,\n configuration,\n } = props;\n\n const { rowConfig } = configuration;\n\n const {\n shouldShowEmptyState,\n noEntriesOptions,\n noSearchResultsOptions,\n noFilterResultsOptions,\n noCalendarResultsOptions,\n } = tableEmptyStateConfigurations || {};\n\n return (\n <>\n <TableHeader headerConfiguration={configuration} />\n <InfiniteTableBodyContainer\n ref={scrollRef}\n className={tableContainerClassName}\n >\n <ScrollPagination {...scrollPaginationProps}>\n <StyledTable>\n {!tableStates.showEmptyState && (\n <TableBodyWrapper\n data={data}\n rowConfig={rowConfig}\n />\n )}\n {shouldShowEmptyState && tableStates.showEmptyState && (\n <EmptyStateWrapper\n tableStates={tableStates}\n noEntriesOptions={noEntriesOptions}\n noSearchResultsOptions={noSearchResultsOptions}\n noFilterResultsOptions={noFilterResultsOptions}\n noCalendarResultsOptions={noCalendarResultsOptions}\n />\n )}\n </StyledTable>\n </ScrollPagination>\n </InfiniteTableBodyContainer>\n <TableDivider />\n </>\n );\n};\n\nexport default memo(TableInfiniteScrollView);\n","import { FC } from 'react';\n\nimport { TableProps, TableViewMode } from './type';\nimport TableSimpleView from './simple.view';\nimport TableInfiniteScrollView from './infinite-scroll.view';\n\nconst TableController: FC<TableProps> = props => {\n const { viewMode, ...rest } = props;\n\n return viewMode === TableViewMode.SIMPLE ? (\n <TableSimpleView {...rest} />\n ) : (\n <TableInfiniteScrollView {...rest} />\n );\n};\n\nexport default TableController;\n\n","import styled, { css } from 'styled-components';\n\nexport const PagerCount = styled.div`\n display: flex;\n align-items: center;\n color: var(--ps-grey-1);\n margin-right: 8px;\n font-size: 13px;\n`;\n\nexport const Button = styled.button<{ disabled: boolean }>`\n width: 40px;\n height: 40px;\n margin: 0 0 0 16px;\n border-radius: 4px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n cursor: ${props => (props.disabled ? 'normal' : 'pointer')};\n flex-shrink: 0;\n background: #fff;\n margin-left: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: ${props => (props.disabled ? '0.6' : '1')};\n\n ${({ disabled }) =>\n !disabled &&\n css`\n &:hover {\n border: solid 1px ${props => props.theme.Colors.cloudyBlue};\n }\n\n &:active {\n border: solid 1px ${props => props.theme.Colors.steelGrey};\n }\n `}\n`;\n\nexport const IconContainer = styled.div`\n width: 6px;\n height: 12px;\n\n path {\n stroke: ${props => props.theme.Colors.steelGrey};\n }\n\n .rotate {\n transform: rotate(180deg);\n }\n`;","import { useState, useEffect } from 'react';\nimport { useHistory, useLocation } from 'react-router';\nimport { onListenEvent, onRemoveEvent } from '../../../../helpers/functions/Events';\nimport { CLEAR_PAGING, EventNameList } from '../../../../helpers/functions/Events/types';\n\nimport ArrowRight from '../../../icons/ArrowRight';\nimport { Button, IconContainer, PagerCount } from './styles';\n\nconst qs = require('query-string');\n\nexport type PagingProps = {\n totalCount: number | undefined;\n itemsPerPage: number;\n onPageChange: (limit: number, offset: number) => void;\n searchOrFiltersApplied: number | boolean | undefined;\n noUrlChange?: boolean;\n dataTest?: string;\n};\n\nexport const Paging = ({\n totalCount,\n itemsPerPage,\n onPageChange,\n searchOrFiltersApplied,\n noUrlChange,\n dataTest = 'table-paging'\n}: PagingProps) => {\n const location = useLocation();\n const history = useHistory();\n const pageFromUrl = qs.parse(location.search).page;\n let [pageNumber, setPageNumber] = useState<number>(\n parseInt(pageFromUrl) || 1\n );\n const [initialized, setInitialized] = useState<boolean>(false);\n const maxValue = Math.ceil(totalCount! / itemsPerPage);\n const pathString = location.pathname.toString();\n\n useEffect(() => {\n if (pageNumber > maxValue && !initialized) {\n if (maxValue > 0) {\n history.push(`${pathString}?page=${maxValue}`);\n setPageNumber(maxValue);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [maxValue]);\n\n useEffect(() => {\n if (initialized || pageNumber > 1) {\n const offset =\n pageNumber === 1 ? 0 : (pageNumber - 1) * itemsPerPage;\n const limit =\n pageNumber === 1 ? itemsPerPage : pageNumber * itemsPerPage;\n !noUrlChange && history.push(`${pathString}?page=${pageNumber}`);\n\n onPageChange(limit, offset);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialized, pageNumber]);\n\n useEffect(() => {\n if (searchOrFiltersApplied) {\n setPageNumber(1);\n if (pageFromUrl) {\n history.push(`${pathString}?page=1`);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [totalCount]);\n\n useEffect(() => {\n if (\n totalCount &&\n itemsPerPage &&\n totalCount! % itemsPerPage === 0 &&\n pageNumber > 1\n ) {\n history.push(`${pathString}?page=${pageNumber - 1}`);\n setPageNumber(pageNumber - 1);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [totalCount, itemsPerPage]);\n\n\n\n useEffect(() => {\n onListenEvent(EventNameList[CLEAR_PAGING], () => setPageNumber(1));\n return () => {\n onRemoveEvent(EventNameList[CLEAR_PAGING], () => setPageNumber(1));\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n \n\n const handlePageChange = (direction: string) => {\n setInitialized(true);\n if (direction === 'next') {\n pageNumber < maxValue\n ? setPageNumber(pageNumber + 1)\n : setPageNumber(maxValue);\n } else if (direction === 'prev') {\n pageNumber < 1\n ? setPageNumber(1)\n : setPageNumber(pageNumber - 1);\n }\n };\n\n const renderCount = () => {\n if (!totalCount && !searchOrFiltersApplied) {\n return null;\n } else if (!totalCount && searchOrFiltersApplied) {\n return <PagerCount data-test={dataTest && `${dataTest}-counter`}>0 Items</PagerCount>;\n }\n\n return (\n <PagerCount data-test={dataTest && `${dataTest}-counter`}>\n {(pageNumber - 1) * itemsPerPage < 1\n ? 1\n : (pageNumber - 1) * itemsPerPage + 1}\n -\n {pageNumber * itemsPerPage < totalCount!\n ? pageNumber * itemsPerPage\n : totalCount}{' '}\n of {totalCount} Items\n </PagerCount>\n );\n };\n\n return (\n <>\n {renderCount()}\n <Button\n onClick={() => handlePageChange('prev')}\n disabled={pageNumber <= 1 || !totalCount}\n data-test={dataTest && `${dataTest}-prev`}\n >\n <IconContainer>\n <ArrowRight className=\"rotate\" />\n </IconContainer>\n </Button>\n <Button\n onClick={() => handlePageChange('next')}\n disabled={pageNumber >= maxValue || !totalCount}\n data-test={dataTest && `${dataTest}-next`}\n >\n <IconContainer>\n <ArrowRight height={12} width={6} />\n </IconContainer>\n </Button>\n </>\n );\n};","import styled from 'styled-components';\n\nimport { Variables } from '../../../../theme/variables';\nimport { SIZES } from '../constants';\n\nexport const Root = styled.div`\n min-width: ${SIZES.MIN_WIDTH}px;\n display: flex;\n justify-content: stretch;\n align-items: stretch;\n padding: 16px 0;\n`;\n\nexport const Wrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: space-between;\n @media (max-width: ${Variables.BreakPoints.responsiveSmPlus}px) {\n flex-direction: column;\n }\n`;\n\nexport const TableToolsLeft = styled.div`\n display: flex;\n`;\n\nexport const TableToolsRight = styled.div`\n flex: 1;\n display: flex;\n justify-content: flex-end;\n @media (max-width: ${Variables.BreakPoints.responsiveSmPlus}px) {\n margin-top: 8px;\n justify-content: flex-start;\n flex-wrap: wrap;\n }\n`;\n\nexport const ItemCount = styled.p`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 13px;\n padding: 0;\n margin: 0;\n`;\n","import { Dispatch, FC, SetStateAction, useCallback, useState } from 'react';\r\nimport { ClickAwayListener } from '@material-ui/core';\r\n\r\nimport { PortableLabels } from '../../../../../../features/portableLabels';\r\nimport { useToggleCollapseAssignLabelFieldService } from '../../../../../../features/labels/store/services';\r\nimport { useLabelsState } from '../../../../../../features/labels/store/states';\r\nimport { Fieldset } from '../../../../Fieldset';\r\nimport { Button } from '../../../../Button';\r\nimport { usePortableLabelsState } from '../../../../../../features/portableLabels/store/states';\r\nimport { useToggleCollapseAllLabels } from '../../../../../../features/portableLabels/store/hors/withLabels/services';\r\nimport {\r\n Actions,\r\n CancelButtonWrapper,\r\n LabelsContainer,\r\n StyledSelectForm,\r\n Wrapper,\r\n} from './styles';\r\n\r\nconst ANIMATION_SCALE = 5;\r\n\r\nexport const AssignLabelOptions: FC<{\r\n disabled?: boolean;\r\n onAssignLabelsSubmit?(): void;\r\n setAssignLabelsAction?(labelIds: number[]): void;\r\n className?: string;\r\n containerLeftPosition?: string;\r\n setShowOptions: Dispatch<SetStateAction<boolean>>;\r\n}> = ({\r\n disabled,\r\n onAssignLabelsSubmit,\r\n setAssignLabelsAction,\r\n className,\r\n containerLeftPosition,\r\n setShowOptions,\r\n}) => {\r\n const [show, setShow] = useState(true);\r\n const onToggleCollapse = useToggleCollapseAssignLabelFieldService();\r\n const onToggleCollapseAll = useToggleCollapseAllLabels();\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState().data;\r\n const [applyDisabled, setApplyDisabled] = useState(true);\r\n\r\n const handleSelectAll = () => {\r\n if (labelsList && setAssignLabelsAction) {\r\n setAssignLabelsAction(labelsList.items.map(label => label.id));\r\n }\r\n setApplyDisabled(false);\r\n };\r\n\r\n const handleClear = () => {\r\n if (labelsList && setAssignLabelsAction) {\r\n setAssignLabelsAction([]);\r\n }\r\n setApplyDisabled(false);\r\n };\r\n\r\n /**\r\n * @function onCloseHandler\r\n * @returns { void }\r\n */\r\n const onCloseHandler = useCallback((): void => {\r\n Promise.resolve().then(() => {\r\n setShow(false);\r\n setShowOptions(false);\r\n });\r\n }, [setShowOptions]);\r\n\r\n const onApplyHandler = useCallback(() => {\r\n onAssignLabelsSubmit && onAssignLabelsSubmit();\r\n onCloseHandler();\r\n }, [onAssignLabelsSubmit, onCloseHandler]);\r\n\r\n if (!show) return <span />;\r\n\r\n const setAssignLabelsAndEnableApply = (labelIds: number[]) => {\r\n if (labelsList && setAssignLabelsAction) {\r\n setAssignLabelsAction(labelIds);\r\n setApplyDisabled(false);\r\n }\r\n };\r\n\r\n return (\r\n <ClickAwayListener onClickAway={onCloseHandler}>\r\n <StyledSelectForm disabled={disabled} className={className}>\r\n <LabelsContainer\r\n initial={{ scale: 1 / ANIMATION_SCALE }}\r\n animate={{ scale: 1 }}\r\n exit={{ scale: 0 }}\r\n topMargin={5}\r\n left={containerLeftPosition}\r\n >\r\n <Wrapper>\r\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\r\n <PortableLabels\r\n labels={labelsList}\r\n collapsedList={labels.collapseAssignLabels}\r\n selectedList={labels.assignedLabels}\r\n onToggleCollapse={onToggleCollapse}\r\n onToggleCollapseAll={onToggleCollapseAll}\r\n onSetSelected={setAssignLabelsAndEnableApply}\r\n onSelectAll={handleSelectAll}\r\n onClearSelected={handleClear}\r\n onSave={onApplyHandler}\r\n showSave={false}\r\n showSearch\r\n showSelectActions\r\n noResultType={'min'}\r\n />\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <CancelButtonWrapper>\r\n <Button\r\n width={'120px'}\r\n action={onCloseHandler}\r\n variant={'inverse'}\r\n dataTest=\"cancel-button\"\r\n >\r\n Cancel\r\n </Button>\r\n </CancelButtonWrapper>\r\n <Button\r\n width={'120px'}\r\n action={() => onApplyHandler()}\r\n disabled={applyDisabled}\r\n dataTest=\"apply-button\"\r\n >\r\n Apply\r\n </Button>\r\n </Actions>\r\n </LabelsContainer>\r\n </StyledSelectForm>\r\n </ClickAwayListener>\r\n );\r\n};\r\n","import { FC, useState } from 'react';\nimport {\n SelectLabel,\n SelectInput,\n SelectMenuItem,\n SelectMenu,\n} from '../../../../SelectDropdown';\n\nimport UpArrow from '../../../../../icons/UpArrow';\nimport DownArrow from '../../../../../icons/DownArrow';\nimport { TableAssignOptionsMenuItem } from '../interfaces/TableAssignOptionsMenuItem';\nimport { Variables } from '../../../../../../theme/variables';\nimport { Tooltip } from '../../../../Tooltip';\nimport { CheckPermission } from '../../../../../../features/permissions';\nimport {\n Container,\n IconHolder,\n TableAssignOptionsStyledSelectForm,\n} from './styles';\n\nexport const TableAssignOptionsSelectDropdown: FC<{\n items?: Array<any>;\n showUpArrow?: boolean;\n onChange?: any;\n disabled?: boolean;\n disabledLabel?: string;\n hideHint?: boolean;\n}> = ({\n items,\n showUpArrow,\n disabled,\n disabledLabel = 'Select one or more items below first',\n hideHint,\n onChange,\n}) => {\n const [show, setShow] = useState(false);\n const selectToggleHandler = () => {\n if (!disabled) {\n setShow(!show);\n }\n };\n\n const render = () => {\n return (\n <TableAssignOptionsStyledSelectForm\n variant=\"light\"\n open={show}\n className={disabled ? 'is-disabled' : undefined}\n disabled={disabled}\n >\n <SelectLabel\n label=\"Action\"\n color={disabled ? Variables.Colors.cloudyBlue : undefined}\n dataTest=\"assign-table-action-label\"\n />\n <IconHolder disabled={disabled}>\n {show || showUpArrow ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n <SelectInput toggleSelect={() => selectToggleHandler()} />\n\n <Container open={show} toggleOpen={setShow}>\n <SelectMenu menuPosition=\"left\" width=\"200px\">\n {items &&\n items.map((item: TableAssignOptionsMenuItem) => {\n return (\n item.show && (\n <CheckPermission\n key={item.name}\n permissions={item.permissions}\n >\n <SelectMenuItem\n key={item.value}\n value={item.value}\n hideAction={() =>\n setShow(false)\n }\n onClick={onChange}\n disabled={item.disabled}\n destructive={item.destructive}\n hint={item.hint}\n dataTest={item.dataTest}\n >\n {item.name}\n </SelectMenuItem>\n </CheckPermission>\n )\n );\n })}\n </SelectMenu>\n </Container>\n </TableAssignOptionsStyledSelectForm>\n );\n };\n\n if (disabled) {\n return !hideHint ? (\n <Tooltip label={disabledLabel} preset={'dropdown'}>\n {render()}\n </Tooltip>\n ) : (\n render()\n );\n }\n\n return render();\n};\n","import {\n Dispatch,\n FC,\n SetStateAction,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport styled from 'styled-components';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport {\n PractisSets,\n PractisSetStatuses,\n} from '../../../../../../constants/interfaces/PractisSets';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../../../constants/interfaces/filters';\nimport { ClickAwayListener } from '@material-ui/core';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { useLibraryPractisSetState } from '../../../../../../features/library/store/states';\nimport {\n useGetFullPractisSetsService,\n useSetSearchTermForLibraryPractisSetService,\n useUpdateAssignedLibraryPractisSetService,\n} from '../../../../../../features/library/store/services';\nimport OutsideActionBox from '../../../../OutsideActionBox/OutsideActionBox';\nimport Checkbox from '../../../../Checkbox';\nimport { Variables } from '../../../../../../theme/variables';\nimport { Button } from '../../../../Button';\nimport { Input } from '../../../../input';\nimport { scrollDown, scrollUp } from '../../../../Select/tools';\nimport { useShowMessage } from '../../../../ErrorMessages/ErrorMessages';\nimport { useSearchDebounced } from '../../../../../../helpers/hooks/useSearch';\nimport UpArrow from '../../../../../icons/UpArrow';\nimport Search from '../../../../../icons/Search';\nimport DownArrow from '../../../../../icons/DownArrow';\n\nconst StyledSelectForm = styled.div<{ disabled?: boolean; minWidth?: string }>`\n box-sizing: border-box;\n position: relative;\n border-radius: 16px;\n ${props => !!props.minWidth && `min-width: ${props.minWidth};`}\n cursor: pointer;\n background: ${props => props.theme.Colors.white};\n color: ${props =>\n !!props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n font-weight: 600;\n height: 100%;\n`;\n\nconst SelectContainer = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst PractisSetsContainer = styled(motion.div)<{\n displayOver?: boolean;\n topMargin: number;\n left?: string;\n}>`\n padding: 18px;\n min-width: 312px;\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n left: ${props =>\n props.displayOver ? '16px' : !!props.left ? props.left : '0'};\n right: ${props => (props.displayOver ? '16px' : '0')};\n top: ${props => (props.displayOver ? `-${props.topMargin}px` : '8px')};\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n\nconst StyledPractisSetsList = styled.div``;\n\nconst ScrollablePractisSetsContainer = styled.div`\n max-height: 312px;\n overflow: auto;\n overflow-y: scroll;\n`;\n\nconst PractisSetItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 8px 0;\n`;\n\nconst PractisSetItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 6px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst StyledButtonContainer = styled.div`\n margin: 21px auto 13px auto;\n width: 264px;\n`;\n\nconst TitleContainer = styled.div`\n margin: 8px 0 15px 7px;\n font-size: 13px;\n font-weight: bold;\n`;\n\nconst SearchInputContainer = styled.div`\n display: flex;\n position: relative;\n align-items: center;\n`;\n\nconst SearchInput = styled(Input)`\n height: 48px;\n border-radius: 8px;\n padding: 0 52px;\n font-size: 13px;\n font-weight: 600;\n background-color: ${props => props.theme.Colors.whiteTwo};\n\n &::placeholder {\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n`;\n\nconst Icon = styled.div`\n width: 64px;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 999;\n`;\nconst SearchIcon = styled(Search)`\n width: 16px;\n color: ${props => props.theme.Colors.battleshipGrey};\n`;\n\nconst ScrollBar = styled.div<{ disabled?: boolean }>`\n height: 25px;\n color: ${props => props.theme.Colors.black};\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n user-select: none;\n &:hover {\n background: ${props => !props.disabled && props.theme.Colors.whiteTwo};\n }\n &:active {\n background: ${props =>\n !props.disabled && props.theme.Colors.whiteThree};\n }\n`;\n\nconst ScrollBarTop = styled(ScrollBar)`\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n`;\n\nconst ScrollBarBottom = styled(ScrollBar)`\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n`;\n\nconst ScrollBarIcon = styled(motion.div)`\n display: flex;\n width: 12px;\n align-items: center;\n`;\n\nconst ANIMATION_SCALE = 5;\n\nexport const AssignPractisSetOptions: FC<{\n practisSets?: ListResult<PractisSets>;\n assignedPractisSets?: number[];\n searchTerm?: string;\n disabled?: boolean;\n title?: string;\n minWidth?: string;\n titlePadding?: string;\n iconRightPosition?: string;\n searchPractisSets(sp?: SearchParams): void;\n setSearchTermForLibraryPractisSetService(value: string): void;\n setAssignPractisSetsAction?(practisSetIds: number[]): void;\n onAssignPractisSetsSubmit?(): void;\n previouslyCheckedPractisSets?: number[];\n className?: string;\n showMessage: any;\n textAlignedLeft?: boolean;\n allowWithoutPreviousData?: boolean;\n containerLeftPosition?: string;\n setShowOptions: Dispatch<SetStateAction<boolean>>;\n}> = ({\n practisSets,\n searchPractisSets,\n searchTerm,\n disabled,\n minWidth,\n assignedPractisSets,\n setAssignPractisSetsAction,\n setSearchTermForLibraryPractisSetService,\n className,\n onAssignPractisSetsSubmit,\n previouslyCheckedPractisSets,\n showMessage,\n allowWithoutPreviousData,\n containerLeftPosition,\n setShowOptions,\n}) => {\n const initialSearchParams: SearchParams = {\n searchTerm: searchTerm || '',\n filters: [],\n orderBy: {},\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n const { searchParams, setSearchTerm } =\n useSearchParamsState(initialSearchParams);\n const [show, setShow] = useState(true);\n const scrollRef = useRef<any>(null);\n const [showScrollUp, setShowScrollUp] = useState(false);\n const [showScrollDown, setShowScrollDown] = useState(true);\n\n useEffect(() => {\n setSearchTerm('');\n setSearchTermForLibraryPractisSetService('');\n }, [setSearchTerm, setSearchTermForLibraryPractisSetService]);\n\n useEffect(() => {\n setSearchTerm(searchTerm || '');\n }, [searchTerm, setSearchTerm]);\n\n useEffect(() => {\n searchPractisSets(searchParams);\n }, [searchPractisSets, searchParams]);\n\n const handleScroll = (e: any) => {\n handleScrollUp(e.target.scrollTop);\n handleScrollDown(e.target);\n };\n\n const handleScrollUp = (top: number) => {\n if (top > 25 && !showScrollUp) {\n setShowScrollUp(true);\n } else if (top <= 25 && showScrollUp) {\n setShowScrollUp(false);\n }\n };\n\n const handleScrollDown = (element: any) => {\n const condition =\n element.scrollTop === element.scrollHeight - element.offsetHeight;\n\n if (condition && showScrollDown) {\n setShowScrollDown(false);\n } else if (!condition && !showScrollDown) {\n setShowScrollDown(true);\n }\n };\n\n const onAssignPractisSets = useCallback(\n (id: any) => {\n let updatedAssignedPractisSets = [];\n if (assignedPractisSets && assignedPractisSets.includes(id)) {\n updatedAssignedPractisSets = assignedPractisSets.filter(\n item => item !== id\n );\n } else {\n updatedAssignedPractisSets = [\n ...(assignedPractisSets || []),\n id,\n ];\n }\n\n setAssignPractisSetsAction &&\n setAssignPractisSetsAction(updatedAssignedPractisSets);\n },\n [assignedPractisSets, setAssignPractisSetsAction]\n );\n\n const handleAssignPractisSets = useCallback(() => {\n const length = allowWithoutPreviousData\n ? (assignedPractisSets || []).length\n : previouslyCheckedPractisSets &&\n previouslyCheckedPractisSets.length &&\n assignedPractisSets &&\n assignedPractisSets.length\n ? assignedPractisSets.length - previouslyCheckedPractisSets.length\n : assignedPractisSets && assignedPractisSets.length\n ? assignedPractisSets.length\n : 0;\n\n if (!!setAssignPractisSetsAction) {\n setAssignPractisSetsAction(assignedPractisSets || []);\n if (showMessage && assignedPractisSets && !!length) {\n showMessage(\n `${\n length > 1\n ? `${length} Practis Sets have been assigned`\n : '1 Practis Set has been assigned'\n }`,\n 'success'\n );\n }\n }\n\n if (!!onAssignPractisSetsSubmit) {\n onAssignPractisSetsSubmit();\n }\n }, [\n assignedPractisSets,\n setAssignPractisSetsAction,\n previouslyCheckedPractisSets,\n showMessage,\n onAssignPractisSetsSubmit,\n allowWithoutPreviousData,\n ]);\n\n const isChecked = useCallback(\n (setId: any) => {\n return (\n (!!assignedPractisSets &&\n !!setId &&\n assignedPractisSets.includes(setId)) ||\n (!allowWithoutPreviousData &&\n !!previouslyCheckedPractisSets &&\n !!setId &&\n previouslyCheckedPractisSets.includes(setId))\n );\n },\n [\n assignedPractisSets,\n previouslyCheckedPractisSets,\n allowWithoutPreviousData,\n ]\n );\n\n const isPreviouslyChecked = useCallback(\n (setId: any) => {\n return (\n !allowWithoutPreviousData &&\n !!previouslyCheckedPractisSets &&\n !!setId &&\n previouslyCheckedPractisSets.includes(setId)\n );\n },\n [previouslyCheckedPractisSets, allowWithoutPreviousData]\n );\n\n /**\n * @function onCloseHandler\n * @returns { void }\n */\n const onCloseHandler = (): void => {\n Promise.resolve().then(() => {\n setShow(false);\n setShowOptions(false);\n });\n };\n\n return (\n <ClickAwayListener onClickAway={onCloseHandler}>\n <StyledSelectForm\n disabled={disabled}\n minWidth={minWidth}\n className={className}\n >\n <SelectContainer open={show && !disabled}>\n <PractisSetsContainer\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n topMargin={5}\n left={containerLeftPosition}\n >\n <StyledPractisSetsList>\n <TitleContainer>Assign Practis Sets</TitleContainer>\n <SearchInputContainer>\n <Icon>\n <SearchIcon />\n </Icon>\n <SearchInput\n placeholder={\n !practisSets ||\n (!!practisSets &&\n !practisSets.items.length)\n ? 'No Practis Sets to Search'\n : 'Search Practics Sets…'\n }\n height={'48px'}\n containerWidth=\"100%\"\n clearTopPosition=\"20px\"\n value={searchTerm}\n handleChange={(e: any) => {\n setSearchTermForLibraryPractisSetService(\n e.target.value\n );\n }}\n disabled={disabled}\n clearInput={() => {\n setSearchTermForLibraryPractisSetService(\n ''\n );\n }}\n />\n </SearchInputContainer>\n {showScrollUp && (\n <ScrollBarTop\n onClick={() => scrollUp(scrollRef.current)}\n disabled={!showScrollUp}\n >\n <AnimatePresence>\n {showScrollUp && (\n <ScrollBarIcon\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n >\n <UpArrow />\n </ScrollBarIcon>\n )}\n </AnimatePresence>\n </ScrollBarTop>\n )}\n <ScrollablePractisSetsContainer\n ref={scrollRef}\n onScroll={handleScroll}\n >\n {practisSets &&\n (practisSets || []).items\n .filter(\n item =>\n item.status ===\n PractisSetStatuses.ACTIVE\n )\n .map(set => (\n <PractisSetItemWrapper key={set.id}>\n <Checkbox\n size={12}\n checked={isChecked(set.id)}\n disabled={isPreviouslyChecked(\n set.id\n )}\n checkedBackground={\n isPreviouslyChecked(\n set.id\n )\n ? Variables.Colors\n .cloudyBlue\n : isChecked(set.id)\n ? Variables.Colors\n .softBlue\n : Variables.Colors\n .white\n }\n border={\n isPreviouslyChecked(\n set.id\n )\n ? Variables.Colors\n .steelGrey\n : Variables.Colors\n .cloudyBlue\n }\n handleChange={(e: any) =>\n onAssignPractisSets(\n set.id\n )\n }\n />\n <PractisSetItem\n disabled={isPreviouslyChecked(\n set.id\n )}\n onClick={() =>\n onAssignPractisSets(\n set.id\n )\n }\n >\n {set.name}\n </PractisSetItem>\n </PractisSetItemWrapper>\n ))}\n </ScrollablePractisSetsContainer>\n <ScrollBarBottom\n onClick={() => scrollDown(scrollRef.current)}\n disabled={!showScrollDown}\n >\n <AnimatePresence>\n {showScrollDown && (\n <ScrollBarIcon\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n >\n <DownArrow />\n </ScrollBarIcon>\n )}\n </AnimatePresence>\n </ScrollBarBottom>\n <StyledButtonContainer>\n <Button\n width=\"264px\"\n height=\"48px\"\n action={() => {\n onCloseHandler();\n handleAssignPractisSets();\n }}\n dataTest='save-button'\n >\n Save\n </Button>\n </StyledButtonContainer>\n </StyledPractisSetsList>\n </PractisSetsContainer>\n </SelectContainer>\n </StyledSelectForm>\n </ClickAwayListener>\n );\n};\n\nconst AssignPractisSetOptionsContainer: FC<{\n title?: string;\n minWidth?: string;\n titlePadding?: string;\n disabled?: boolean;\n iconRightPosition?: string;\n onAssignPractisSetsSubmit?(): void;\n previouslyCheckedPractisSets?: number[];\n className?: string;\n textAlignedLeft?: boolean;\n allowWithoutPreviousData?: boolean;\n containerLeftPosition?: string;\n setShowOptions: Dispatch<SetStateAction<boolean>>;\n}> = ({\n title,\n minWidth,\n titlePadding,\n disabled,\n iconRightPosition,\n onAssignPractisSetsSubmit,\n previouslyCheckedPractisSets,\n className,\n textAlignedLeft,\n allowWithoutPreviousData,\n containerLeftPosition,\n setShowOptions,\n}) => {\n const state = useLibraryPractisSetState();\n\n const setAssignPractisSetsAction =\n useUpdateAssignedLibraryPractisSetService();\n const setSearchTermForLibraryPractisSetService =\n useSetSearchTermForLibraryPractisSetService();\n\n const searchPractisSets = useGetFullPractisSetsService();\n const searchPractisSetsDebounced = useSearchDebounced(searchPractisSets);\n\n const showMessage = useShowMessage();\n\n return (\n <AssignPractisSetOptions\n practisSets={state.fullList}\n assignedPractisSets={state.assignedPractisSets}\n searchTerm={state.searchTerm}\n disabled={disabled}\n title={title}\n minWidth={minWidth}\n titlePadding={titlePadding}\n searchPractisSets={searchPractisSetsDebounced}\n setAssignPractisSetsAction={setAssignPractisSetsAction}\n setSearchTermForLibraryPractisSetService={\n setSearchTermForLibraryPractisSetService\n }\n iconRightPosition={iconRightPosition}\n onAssignPractisSetsSubmit={onAssignPractisSetsSubmit}\n previouslyCheckedPractisSets={previouslyCheckedPractisSets}\n showMessage={showMessage}\n className={className}\n textAlignedLeft={textAlignedLeft}\n allowWithoutPreviousData={allowWithoutPreviousData}\n containerLeftPosition={containerLeftPosition}\n setShowOptions={setShowOptions}\n />\n );\n};\n\nexport default AssignPractisSetOptionsContainer;\n","const SCROLL_BY = 100;\n\nexport const scrollUp = (element: any) => {\n if (element) {\n element.scrollTop -= SCROLL_BY;\n }\n};\n\nexport const scrollDown = (element: any) => {\n if (element) {\n element.scrollTop += SCROLL_BY;\n }\n};\n","import { FC } from 'react';\n\nimport { Button } from '../../../../Button';\nimport {\n NudgeWarningStyledDescription,\n StyledActions,\n StyledContent,\n StyledTitle,\n} from './styles';\n\nexport const NudgeWarning: FC<{\n onProceed?(): void;\n onClose?(): void;\n}> = ({ onProceed, onClose }) => {\n return (\n <>\n <StyledTitle>Reminder</StyledTitle>\n <StyledContent>\n <NudgeWarningStyledDescription>\n Nudge messages will only be sent to selected trainees.\n Selected trainers and admins will not be notified.\n </NudgeWarningStyledDescription>\n <StyledActions marginTop={30}>\n <Button\n width=\"128px\"\n height=\"48px\"\n action={onClose}\n variant=\"inverse\"\n >\n Go Back\n </Button>\n <Button\n width=\"128px\"\n height=\"48px\"\n action={() => !!onProceed && onProceed()}\n >\n Proceed\n </Button>\n </StyledActions>\n </StyledContent>\n </>\n );\n};\n","import { FC } from 'react';\n\nimport { Button } from '../../../../Button';\nimport DialogWrapper from '../../../../DialogWrapper/DialogWrapper';\nimport { Variables } from '../../../../../../theme/variables';\nimport {\n Bold,\n StyledActions,\n StyledButtonContainer,\n StyledContent,\n StyledDescription,\n StyledTitle,\n} from './styles';\n\nexport const BulkActionConfirmation: FC<{\n onProceed?(): void;\n onClose?(): void;\n itemsCount: number;\n}> = ({ onProceed, onClose, itemsCount }) => {\n return (\n <DialogWrapper\n customization={{ width: 400, padding: '30px 32px 40px 40px' }}\n >\n <StyledTitle data-test=\"confirmation-modal-title\">Confirm bulk action</StyledTitle>\n <StyledContent>\n <StyledDescription marginTop=\"9px\" data-test=\"confirmation-modal-description\">\n This action will affect all <Bold>{itemsCount} Items</Bold>.\n Are you sure you want to continue?\n </StyledDescription>\n <StyledActions marginTop={23}>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n color=\"warning\"\n variant=\"inverse\"\n dataTest=\"confirmation-modal-cancel\"\n >\n Cancel\n </Button>\n <StyledButtonContainer>\n <Button\n width=\"128px\"\n height=\"40px\"\n color=\"warning\"\n customColor={Variables.Colors.tomato}\n action={() => !!onProceed && onProceed()}\n dataTest=\"confirmation-modal-confirm\"\n >\n Proceed\n </Button>\n </StyledButtonContainer>\n </StyledActions>\n </StyledContent>\n </DialogWrapper>\n );\n};\n","import {\n Dispatch,\n FC,\n SetStateAction,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { SearchQueryParams } from '../../../../../../api/types';\nimport { AssignPractisSets } from '../../../../../../features/assign-practisSets';\nimport { usePractisSetsEnrollmentsService } from '../../../../../../features/users/store/services';\n\nconst AssignPractisSetsAndDueDateOptions: FC<{\n users?: number[];\n searchQuery?: SearchQueryParams;\n isSelectAll?: boolean;\n successApplyPractisSetsCallback?: () => void;\n setShowOptions: Dispatch<SetStateAction<boolean>>;\n totalCount?: number;\n}> = ({\n users,\n searchQuery,\n isSelectAll,\n successApplyPractisSetsCallback,\n setShowOptions,\n totalCount\n}) => {\n const [\n isAssignPractisSetPopupOpen,\n setIsAssignPractisSetPopupOpen,\n ] = useState(false);\n\n const getUserPractisSets = usePractisSetsEnrollmentsService(\n (users?.[0] as number).toString()\n );\n\n const triggerRef = useRef(null);\n\n /**\n * @function handleCloseAssignPractisSetPopup\n * @returns { void }\n */\n const handleCloseAssignPractisSetPopup = (): void => {\n Promise.resolve().then(() => {\n setIsAssignPractisSetPopupOpen(false);\n setShowOptions(false);\n });\n };\n\n /**\n * @function getUserPractisSetsSuccessCallback\n * @returns { void }\n */\n const getUserPractisSetsSuccessCallback = (): void => {\n setIsAssignPractisSetPopupOpen(true);\n };\n\n useEffect(() => {\n if (users?.length === 1) {\n getUserPractisSets(getUserPractisSetsSuccessCallback);\n } else {\n setIsAssignPractisSetPopupOpen(true);\n }\n }, [getUserPractisSets, users]);\n\n if (!isAssignPractisSetPopupOpen) {\n return <></>;\n }\n\n return (\n <AssignPractisSets\n users={users ?? []}\n searchQuery={searchQuery}\n isSelectAll={isSelectAll}\n successApplyPractisSetsCallback={successApplyPractisSetsCallback}\n triggerRef={triggerRef}\n isOpen={isAssignPractisSetPopupOpen}\n onClose={handleCloseAssignPractisSetPopup}\n isFromBulkAction\n totalCount={totalCount}\n />\n );\n};\n\nexport default AssignPractisSetsAndDueDateOptions;\n","import React, { FC, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n useLabelsConfigState,\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../../../features/labels/store/states';\nimport { useSetAssignLabelsActionService } from '../../../../../features/labels/store/services';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../../constants/interfaces/filters';\nimport { AssignLabelOptions } from './components/AssignLabelOptions';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from '../../../../../pages/CompanySettings/store/reducers';\nimport { getProfileState } from '../../../../../pages/UserProfile/store/reducers';\nimport { TableAssignOptionTypes } from './enums/TableAssignOptionTypes';\nimport OutsideActionBox from '../../../OutsideActionBox/OutsideActionBox';\nimport { TableAssignOptionsSelectDropdown } from './components/TableAssignOptionsSelectDropdown';\nimport { TableAssignOptionsMenuItem } from './interfaces/TableAssignOptionsMenuItem';\nimport { TableAssignOptionsInterface } from './interfaces/TableAssignOptionsInterface';\nimport { TableAssignOptionsContainerInterface } from './interfaces/TableAssignOptionsContainerInterface';\nimport AssignPractisSetOptions from './components/AssignPractisSetOptions';\nimport DialogWrapper from '../../../DialogWrapper/DialogWrapper';\nimport { NudgeUser } from './components/NudgeUser';\nimport { NudgeWarning } from './components/NudgeWarning';\nimport { useLibraryPractisSetState } from '../../../../../features/library/store/states';\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\nimport { BulkActionConfirmation } from './components/BulkActionConfirmation';\nimport AssignPractisSetsAndDueDateOptions from './components/AssignPractisSetsAndDueDateOptions';\n\nconst Container = styled.div`\n width: 100%;\n height: 40px;\n border-radius: 8px;\n background-color: ${props => props.theme.Colors.white};\n display: flex;\n justify-content: space-around;\n align-items: center;\n flex-direction: column;\n`;\n\nconst OptionContainer = styled(OutsideActionBox)`\n position: relative;\n width: 100%;\n`;\n\nconst ContentArea = styled.div`\n max-height: 300px;\n`;\n\nconst TableAssignOptionsMenu: FC<TableAssignOptionsInterface> = ({\n labels,\n practisSets,\n disabled,\n searchTerm,\n updatedLabels,\n company,\n onAssignLabelsSubmit,\n onNudgeSendButtonClicked,\n assignLabelsTitle,\n nudgeFromUser,\n onOpenAssignLabelAction,\n setAssignLabelsAction,\n disabledPractisSets,\n onExportClicked,\n exportButtonDisabled,\n practisSetName,\n showNudgeWarning,\n nudgeButtonDisabled,\n onArchiveSubmissionsSubmit,\n onResendInvitesSubmit,\n onRevokeSubmit,\n onRestoreSubmissionsSubmit,\n onDuplicateSubmit,\n assignLabelsPermissions,\n sendNudgePermissions,\n showExportPermissions,\n assignPractisSetsAndDueDatePermissions,\n assignPractisSetPermissions,\n archivePermissions,\n onUpdateDueDatesSubmit,\n isDueDatesDisabled,\n dueDatesPermissions,\n resendInvitesPermissions,\n revokePermissions,\n removePractisSetPermission,\n onRemovePractisSetSubmit,\n onRemindSubmit,\n showRemindPermission,\n nudgeTitle,\n remindDisabled,\n removeItemsDisabled,\n restorePermissions,\n removeItemTitle,\n duplicateItemTitle,\n duplicateItemPermissions,\n removeItemPermissions,\n onRemoveItemsSubmit,\n disabledLabel,\n hideHint,\n removeItemTooltip,\n isAssignLabelsDisabled,\n isArchiveDisabled,\n isRestoreDisabled,\n isRevokeDisabled,\n isResendDisabled,\n isDuplicateDisabled,\n isSelectAll,\n totalCount,\n selectedItems,\n searchQuery,\n successApplyPractisSetsCallback,\n}) => {\n const initialSearchParams: SearchParams = {\n searchTerm: searchTerm,\n filters: [],\n orderBy: {},\n offset: 0,\n count: 0,\n numberOfPages: 0,\n };\n const { refreshSearchParams } = useSearchParamsState(initialSearchParams);\n\n const [showNudgeDialog, setShowNudgeDialog] = useState(false);\n const [showNudgeWarningDialog, setShowNudgeWarningDialog] = useState(false);\n const [showOptions, setShowOptions] = useState(false);\n const [\n showOptionType,\n setShowOptionType,\n ] = useState<TableAssignOptionTypes>();\n\n const nudgeCloseButtonClicked = () => {\n setShowNudgeDialog(false);\n };\n\n const nudgeOpenButtonClicked = () => {\n if (!disabled && !nudgeButtonDisabled) {\n if (!!showNudgeWarning) {\n setShowNudgeWarningDialog(true);\n } else {\n setShowNudgeDialog(true);\n }\n }\n };\n\n const onNudgeSendClicked = (data: any) => {\n if (onNudgeSendButtonClicked) {\n onNudgeSendButtonClicked(data);\n setShowNudgeDialog(false);\n }\n };\n\n const onNudgeWarningProceed = () => {\n setShowNudgeWarningDialog(false);\n setShowNudgeDialog(true);\n };\n\n useEffect(() => {\n if (updatedLabels) refreshSearchParams();\n }, [updatedLabels, refreshSearchParams, company]);\n\n const TableAssignOptionMenu: Array<TableAssignOptionsMenuItem> = [\n {\n name: 'Due Date',\n value: TableAssignOptionTypes.DUE_DATES,\n permissions: dueDatesPermissions || [],\n show: !!dueDatesPermissions && !!onUpdateDueDatesSubmit,\n disabled: !!disabled || !!isDueDatesDisabled,\n destructive: false,\n dataTest: 'due-date-table-action',\n },\n {\n name: 'Assign Practis Sets',\n value: TableAssignOptionTypes.ASSIGN_PRACTIS_SETS_AND_DUE_DATE,\n permissions: assignPractisSetsAndDueDatePermissions || [],\n show: !!assignPractisSetsAndDueDatePermissions,\n disabled: !!disabled,\n dataTest: 'assign-practis-sets-table-action',\n },\n {\n name: assignLabelsTitle || 'Assign Labels',\n value: TableAssignOptionTypes.ASSIGN_LABELS,\n permissions: assignLabelsPermissions || [],\n show: !!assignLabelsPermissions,\n disabled:\n !!disabled ||\n !labels ||\n (!!labels && !!labels.items && !labels.items.length) ||\n !!isAssignLabelsDisabled,\n dataTest: 'assign-labels-table-action',\n },\n {\n name: 'Practis Set',\n value: TableAssignOptionTypes.ASSIGN_PRACTIS_SETS,\n permissions: assignPractisSetPermissions || [],\n show: !!assignPractisSetPermissions,\n disabled:\n !!disabled ||\n !practisSets ||\n (!!practisSets &&\n !!practisSets.items &&\n !practisSets.items.length),\n dataTest: 'practis-set-table-action',\n },\n {\n name: nudgeTitle || 'Nudge Users',\n value: TableAssignOptionTypes.NUDGE,\n permissions: sendNudgePermissions || [],\n show: !!sendNudgePermissions,\n disabled: !!nudgeButtonDisabled || !!disabled,\n dataTest: 'nudge-users-table-action',\n },\n {\n name: 'Remind to Start',\n value: TableAssignOptionTypes.REMIND,\n permissions: showRemindPermission || [],\n show: !!showRemindPermission,\n disabled: !!disabled || !!remindDisabled,\n dataTest: 'remind-to-start-table-action',\n },\n {\n name: 'Export Report',\n value: TableAssignOptionTypes.EXPORT,\n permissions: showExportPermissions || [],\n show: !!showExportPermissions,\n disabled: !!exportButtonDisabled || !!disabled,\n dataTest: 'export-report-table-action',\n },\n {\n name: 'Resend Invites',\n value: TableAssignOptionTypes.RESEND_INVITES,\n permissions: resendInvitesPermissions || [],\n show: !!resendInvitesPermissions,\n disabled: !!disabled || !!isResendDisabled,\n dataTest: 'resend-invites-table-action',\n },\n {\n name: 'Revoke',\n value: TableAssignOptionTypes.REVOKE,\n permissions: revokePermissions || [],\n show: !!revokePermissions,\n disabled: !!disabled || !!isRevokeDisabled,\n destructive: true,\n hint:\n !!disabled || !!isRevokeDisabled\n ? \"You can't revoke the admins' invitations\"\n : undefined,\n dataTest: 'revoke-table-action',\n },\n {\n name: 'Unassign Practis Sets',\n value: TableAssignOptionTypes.REMOVE_PRACTIS_SET,\n permissions: removePractisSetPermission || [],\n show: !!removePractisSetPermission,\n disabled: !!disabled,\n destructive: true,\n dataTest: 'unassign-practis-sets-table-action',\n },\n {\n name: duplicateItemTitle ? duplicateItemTitle : 'Duplicate',\n value: TableAssignOptionTypes.DUPLICATE,\n permissions: duplicateItemPermissions || [],\n show: !!duplicateItemPermissions,\n disabled: !!disabled || !!isDuplicateDisabled,\n dataTest: 'duplicate-table-action',\n },\n {\n name: 'Restore',\n value: TableAssignOptionTypes.RESTORE,\n permissions: restorePermissions || [],\n show: !!restorePermissions && !!onRestoreSubmissionsSubmit,\n disabled: !!disabled || !!isRestoreDisabled,\n dataTest: 'restore-table-action',\n },\n {\n name: removeItemTitle ? removeItemTitle : 'Delete Items',\n value: TableAssignOptionTypes.REMOVE_ITEMS,\n permissions: removeItemPermissions || [],\n show: !!removeItemPermissions,\n disabled: !!removeItemsDisabled || !!disabled,\n hint: !!removeItemsDisabled ? removeItemTooltip : '',\n destructive: true,\n dataTest: 'delete-table-action',\n },\n {\n name: 'Archive',\n value: TableAssignOptionTypes.ARCHIVE,\n permissions: archivePermissions || [],\n show: !!archivePermissions && !!onArchiveSubmissionsSubmit,\n disabled: !!disabled || !!isArchiveDisabled,\n destructive: true,\n dataTest: 'archive-table-action',\n },\n ];\n\n const performSwitch = (value: string) => {\n switch (value) {\n case TableAssignOptionTypes.ASSIGN_LABELS:\n onAssignLabelsSubmit && onAssignLabelsSubmit();\n break;\n case TableAssignOptionTypes.ASSIGN_PRACTIS_SETS:\n break;\n case TableAssignOptionTypes.NUDGE:\n onNudgeSendClicked && onNudgeSendClicked(payload);\n break;\n case TableAssignOptionTypes.REMIND:\n !!onRemindSubmit && onRemindSubmit();\n break;\n case TableAssignOptionTypes.ARCHIVE:\n !!onArchiveSubmissionsSubmit && onArchiveSubmissionsSubmit();\n break;\n case TableAssignOptionTypes.RESTORE:\n !!onRestoreSubmissionsSubmit && onRestoreSubmissionsSubmit();\n break;\n case TableAssignOptionTypes.RESEND_INVITES:\n !!onResendInvitesSubmit && onResendInvitesSubmit();\n break;\n case TableAssignOptionTypes.REVOKE:\n !!onRevokeSubmit && onRevokeSubmit();\n break;\n case TableAssignOptionTypes.REMOVE_PRACTIS_SET:\n !!onRemovePractisSetSubmit && onRemovePractisSetSubmit();\n break;\n case TableAssignOptionTypes.DUPLICATE:\n !!onDuplicateSubmit && onDuplicateSubmit();\n break;\n case TableAssignOptionTypes.REMOVE_ITEMS:\n !!onRemoveItemsSubmit && onRemoveItemsSubmit();\n break;\n case TableAssignOptionTypes.DUE_DATES:\n !!onUpdateDueDatesSubmit && onUpdateDueDatesSubmit();\n break;\n default:\n setShowOptions(false);\n setPayload(null);\n }\n };\n\n const handleMenuChange = (event: any) => {\n const value =\n event && event.target && event.target.value\n ? event.target.value\n : '';\n if (!value) return;\n\n switch (value) {\n case TableAssignOptionTypes.ASSIGN_LABELS:\n if (labels && labels.items && labels.items.length) {\n onOpenAssignLabelAction?.();\n setShowOptions(true);\n setShowOptionType(value);\n }\n break;\n case TableAssignOptionTypes.ASSIGN_PRACTIS_SETS:\n if (\n practisSets &&\n practisSets.items &&\n practisSets.items.length\n ) {\n setShowOptions(true);\n setShowOptionType(value);\n }\n break;\n case TableAssignOptionTypes.ASSIGN_PRACTIS_SETS_AND_DUE_DATE:\n setShowOptions(true);\n setShowOptionType(value);\n\n break;\n case TableAssignOptionTypes.NUDGE:\n nudgeOpenButtonClicked();\n break;\n case TableAssignOptionTypes.EXPORT:\n !!onExportClicked && onExportClicked();\n break;\n case TableAssignOptionTypes.DUE_DATES:\n !!onUpdateDueDatesSubmit && onUpdateDueDatesSubmit();\n break;\n default:\n if (isSelectAll) {\n setAction(value);\n } else {\n performSwitch(value);\n }\n break;\n }\n };\n\n const [action, setAction] = useState<string | null>(null);\n const [payload, setPayload] = useState<any>(null);\n\n return (\n <Container>\n {!!action && (\n <BulkActionConfirmation\n onClose={() => setAction(null)}\n onProceed={() => {\n performSwitch(action);\n setAction(null);\n }}\n itemsCount={totalCount || 0}\n />\n )}\n <TableAssignOptionsSelectDropdown\n items={TableAssignOptionMenu}\n onChange={handleMenuChange}\n showUpArrow={showOptions}\n disabled={disabled}\n disabledLabel={disabledLabel}\n hideHint={hideHint}\n />\n <OptionContainer open={showOptions}>\n <ContentArea>\n {showOptionType ===\n TableAssignOptionTypes.ASSIGN_LABELS && (\n <AssignLabelOptions\n disabled={disabled}\n onAssignLabelsSubmit={() => {\n onAssignLabelsSubmit && onAssignLabelsSubmit();\n }}\n setAssignLabelsAction={setAssignLabelsAction}\n setShowOptions={setShowOptions}\n />\n )}\n\n {showOptionType ===\n TableAssignOptionTypes.ASSIGN_PRACTIS_SETS && (\n <AssignPractisSetOptions\n disabled={disabledPractisSets}\n setShowOptions={setShowOptions}\n />\n )}\n\n {showOptionType ===\n TableAssignOptionTypes.ASSIGN_PRACTIS_SETS_AND_DUE_DATE && (\n <AssignPractisSetsAndDueDateOptions\n users={selectedItems}\n searchQuery={searchQuery}\n isSelectAll={isSelectAll}\n setShowOptions={setShowOptions}\n successApplyPractisSetsCallback={\n successApplyPractisSetsCallback\n }\n totalCount={totalCount}\n />\n )}\n </ContentArea>\n </OptionContainer>\n\n {showNudgeDialog && (\n <DialogWrapper\n customization={{\n width: 480,\n padding: '31px 32px 32px 40px',\n }}\n >\n <NudgeUser\n fromUser={nudgeFromUser}\n practisSetName={practisSetName}\n onSend={data => {\n if (isSelectAll) {\n setAction(TableAssignOptionTypes.NUDGE);\n setPayload(data);\n nudgeCloseButtonClicked();\n } else {\n onNudgeSendClicked && onNudgeSendClicked(data);\n }\n }}\n onClose={nudgeCloseButtonClicked}\n />\n </DialogWrapper>\n )}\n {showNudgeWarningDialog && (\n <DialogWrapper\n customization={{\n width: 400,\n padding: '36px 32px 35px 32px',\n }}\n >\n <NudgeWarning\n onProceed={onNudgeWarningProceed}\n onClose={() => setShowNudgeWarningDialog(false)}\n />\n </DialogWrapper>\n )}\n </Container>\n );\n};\n\nexport const TableAssignOptionsMenuContainer: FC<TableAssignOptionsContainerInterface> = ({\n disabled,\n renderAdditionalAction,\n onOpenAssignLabelAction,\n onAssignLabelsSubmit,\n onNudgeSendButtonClicked,\n assignLabelsTitle,\n assignLabelsMinWidth,\n hideSelectAll,\n assignedLabelsCount,\n disabledPractisSets,\n assignLabelButtonTitle,\n onExportClicked,\n exportButtonDisabled,\n practisSetName,\n showNudgeWarning,\n nudgeButtonDisabled,\n onArchiveSubmissionsSubmit,\n onUpdateDueDatesSubmit,\n onResendInvitesSubmit,\n onRevokeSubmit,\n onRemindSubmit,\n onRestoreSubmissionsSubmit,\n onDuplicateSubmit,\n assignLabelsPermissions,\n sendNudgePermissions,\n showExportPermissions,\n assignPractisSetsAndDueDatePermissions,\n assignPractisSetPermissions,\n archivePermissions,\n resendInvitesPermissions,\n revokePermissions,\n removePractisSetPermission,\n duplicateItemPermissions,\n onRemovePractisSetSubmit,\n showRemindPermission,\n restorePermissions,\n nudgeTitle,\n remindDisabled,\n removeItemsDisabled,\n removeItemTitle,\n removeItemPermissions,\n onRemoveItemsSubmit,\n disabledLabel,\n hideHint,\n duplicateItemTitle,\n removeItemTooltip,\n isAssignLabelsDisabled,\n isArchiveDisabled,\n isDueDatesDisabled,\n isRestoreDisabled,\n isRevokeDisabled,\n isResendDisabled,\n isDuplicateDisabled,\n isSelectAll,\n dueDatesPermissions,\n totalCount,\n selectedItems,\n searchQuery,\n successApplyPractisSetsCallback,\n}) => {\n const state = useLabelsState();\n const labelsList = usePortableLabelsState().data;\n const practisState = useLibraryPractisSetState();\n const labelsConfigState = useLabelsConfigState();\n const updatedLabels = useUpdatedLabelsState();\n const company = useSelector(getCompanyState);\n const profile = useSelector(getProfileState);\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n\n return (\n <TableAssignOptionsMenu\n labels={labelsList}\n practisSets={practisState.fullList}\n updatedLabels={updatedLabels.data}\n disabled={disabled}\n searchTerm={labelsConfigState.searchTerm}\n renderAdditionalAction={renderAdditionalAction}\n company={company}\n onOpenAssignLabelAction={onOpenAssignLabelAction}\n onAssignLabelsSubmit={onAssignLabelsSubmit}\n nudgeFromUser={\n !!profile ? `${profile.firstName} ${profile.lastName}` : ''\n }\n onNudgeSendButtonClicked={onNudgeSendButtonClicked}\n assignLabelsTitle={assignLabelsTitle}\n assignLabelsMinWidth={assignLabelsMinWidth}\n hideSelectAll={hideSelectAll}\n assignedLabelsCount={assignedLabelsCount}\n setAssignLabelsAction={setAssignLabelsAction}\n disabledPractisSets={disabledPractisSets}\n assignLabelButtonTitle={assignLabelButtonTitle}\n onExportClicked={onExportClicked}\n exportButtonDisabled={exportButtonDisabled}\n practisSetName={practisSetName}\n showNudgeWarning={showNudgeWarning}\n nudgeButtonDisabled={nudgeButtonDisabled}\n onArchiveSubmissionsSubmit={onArchiveSubmissionsSubmit}\n onUpdateDueDatesSubmit={onUpdateDueDatesSubmit}\n onRemindSubmit={onRemindSubmit}\n onRestoreSubmissionsSubmit={onRestoreSubmissionsSubmit}\n onDuplicateSubmit={onDuplicateSubmit}\n assignLabelsPermissions={assignLabelsPermissions}\n sendNudgePermissions={sendNudgePermissions}\n showExportPermissions={showExportPermissions}\n assignPractisSetsAndDueDatePermissions={assignPractisSetsAndDueDatePermissions}\n assignPractisSetPermissions={assignPractisSetPermissions}\n archivePermissions={archivePermissions}\n duplicateItemPermissions={duplicateItemPermissions}\n resendInvitesPermissions={resendInvitesPermissions}\n dueDatesPermissions={dueDatesPermissions}\n revokePermissions={revokePermissions}\n onResendInvitesSubmit={onResendInvitesSubmit}\n onRevokeSubmit={onRevokeSubmit}\n removePractisSetPermission={removePractisSetPermission}\n onRemovePractisSetSubmit={onRemovePractisSetSubmit}\n showRemindPermission={showRemindPermission}\n nudgeTitle={nudgeTitle}\n remindDisabled={remindDisabled}\n restorePermissions={restorePermissions}\n assignedLabels={state.assignedLabels}\n removeItemsDisabled={removeItemsDisabled}\n removeItemTitle={removeItemTitle}\n onRemoveItemsSubmit={onRemoveItemsSubmit}\n removeItemPermissions={removeItemPermissions}\n disabledLabel={disabledLabel}\n hideHint={hideHint}\n duplicateItemTitle={duplicateItemTitle}\n removeItemTooltip={removeItemTooltip}\n isAssignLabelsDisabled={isAssignLabelsDisabled}\n isArchiveDisabled={isArchiveDisabled}\n isDueDatesDisabled={isDueDatesDisabled}\n isRestoreDisabled={isRestoreDisabled}\n isRevokeDisabled={isRevokeDisabled}\n isResendDisabled={isResendDisabled}\n isDuplicateDisabled={isDuplicateDisabled}\n isSelectAll={isSelectAll}\n totalCount={totalCount}\n selectedItems={selectedItems}\n searchQuery={searchQuery}\n successApplyPractisSetsCallback={successApplyPractisSetsCallback}\n />\n );\n};\n\nexport default TableAssignOptionsMenuContainer;\n","import { isEmpty } from 'lodash';\nimport { FC, memo } from 'react';\n\nimport { Paging } from '../PagingNavigation';\nimport { SelectAll } from '../SelectAll';\nimport {\n ItemCount,\n Root,\n TableToolsLeft,\n TableToolsRight,\n Wrapper,\n} from './style';\nimport { TableToolItem } from './table-tool-item';\nimport { TableSearchInput } from './table-search-input';\nimport { TableToolsProps } from './types';\nimport { TableAssignOptionsMenuContainer } from '../table/TableAssignOptionsMenu';\nimport { CalendarPopup, CalendarPopUpProps } from '../../Calendar';\n\nconst TableTools: FC<TableToolsProps> = memo(props => {\n const {\n customization,\n isSelectedItemOptionsVisible,\n selectedItemOptions,\n searchInputOptions,\n filterOptions,\n calendarFilterOptions,\n pagingOptions,\n itemCount,\n itemCountDataTest,\n } = props;\n\n const {\n rootClassName,\n wrapperClassName,\n tableToolsLeftClassName,\n tableToolsRightClassName,\n } = customization || {};\n\n const {\n initialValue,\n onSearchChange,\n isSearchInputDisabled,\n className,\n dataTest = 'table-search-input',\n placeholder = undefined,\n } = searchInputOptions || {};\n\n const { filterComponent = undefined } = filterOptions || {};\n const { calendarPopUpProps = undefined } = calendarFilterOptions || {};\n\n return (\n <Root className={rootClassName}>\n <Wrapper className={wrapperClassName}>\n <TableToolsLeft className={tableToolsLeftClassName}>\n {isSelectedItemOptionsVisible && selectedItemOptions && (\n <SelectAll\n isSelectAll={selectedItemOptions.isSelectAll}\n selectedLength={\n selectedItemOptions?.selectedLength ?? 0\n }\n totalCount={selectedItemOptions.totalCount}\n itemsPerPage={selectedItemOptions.itemsPerPage}\n onClearSelecion={\n selectedItemOptions.onClearSelection\n }\n onSelectAll={selectedItemOptions.onSelectAll}\n style={selectedItemOptions?.style}\n dataTest=\"table\"\n >\n {selectedItemOptions?.bulkActionsConfig && (\n <TableToolItem width={153} marginRight={16}>\n <TableAssignOptionsMenuContainer\n {...selectedItemOptions.bulkActionsConfig}\n />\n </TableToolItem>\n )}\n </SelectAll>\n )}\n {searchInputOptions && (\n <TableToolItem\n width={224}\n marginRight={16}\n className={className}\n >\n <TableSearchInput\n initialValue={initialValue}\n placeholder={placeholder}\n onChange={onSearchChange}\n disabled={isSearchInputDisabled}\n dataTest={dataTest}\n />\n </TableToolItem>\n )}\n {!isEmpty(filterOptions) && (\n <TableToolItem marginRight={16}>\n {filterComponent}\n </TableToolItem>\n )}\n {!isEmpty(calendarFilterOptions) && (\n <TableToolItem marginRight={16}>\n <CalendarPopup\n {...(calendarPopUpProps as CalendarPopUpProps<true>)}\n />\n </TableToolItem>\n )}\n </TableToolsLeft>\n <TableToolsRight className={tableToolsRightClassName}>\n {pagingOptions && (\n <TableToolItem>\n <Paging {...pagingOptions} />\n </TableToolItem>\n )}\n {itemCount && (\n <TableToolItem>\n <ItemCount data-test={itemCountDataTest ?? 'table-selected-item'}>\n {itemCount}\n </ItemCount>\n </TableToolItem>\n )}\n </TableToolsRight>\n </Wrapper>\n </Root>\n );\n});\n\nexport default TableTools;\n\n\n","import { memo } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport { TableContainer, TableExtendContainer, Wrapper } from './styles';\nimport { Table } from './table';\nimport { TableDivider } from './table-divider';\nimport { TableHeaderFilter } from './table-header-filter';\nimport { TableRefresh } from './table-refresh';\nimport { TableTools } from './table-tools';\nimport { TableViewMode } from './table/type';\nimport { TableWrapperProps } from './types';\n\nconst TableWrapperView = (props: TableWrapperProps) => {\n const {\n addOverflow,\n tableWrapperClassName,\n tableContainerClassName,\n tableInnerClassName,\n tableToolsOptions,\n cornered,\n shouldHideTableDivider,\n tableRefreshConfigurations,\n tableEmptyStateConfigurations,\n selectedLabels,\n headerFilterPosition = 'TOP',\n onRemoveLabel,\n configurations,\n data,\n tableStates,\n scrollRef,\n scrollPaginationProps,\n viewMode = TableViewMode.SIMPLE,\n } = props;\n\n return (\n <Wrapper>\n <TableContainer className={tableWrapperClassName}>\n {tableRefreshConfigurations && (\n <TableRefresh\n {...tableRefreshConfigurations}\n top={\n !isEmpty(selectedLabels) &&\n headerFilterPosition === 'TOP'\n ? -42\n : undefined\n }\n />\n )}\n {selectedLabels && headerFilterPosition === 'TOP' && (\n <TableHeaderFilter\n selectedLabels={selectedLabels}\n onRemoveLabel={onRemoveLabel}\n />\n )}\n <TableTools {...tableToolsOptions} />\n\n <TableDivider hide={shouldHideTableDivider} />\n\n {selectedLabels && headerFilterPosition === 'BOTTOM' && (\n <TableHeaderFilter\n selectedLabels={selectedLabels}\n onRemoveLabel={onRemoveLabel}\n />\n )}\n\n <TableExtendContainer>\n <Table\n data={data}\n tableStates={tableStates}\n cornered={cornered}\n addOverflow={addOverflow}\n tableContainerClassName={tableContainerClassName}\n tableInnerClassName={tableInnerClassName}\n tableEmptyStateConfigurations={\n tableEmptyStateConfigurations\n }\n configuration={configurations}\n scrollRef={scrollRef}\n scrollPaginationProps={scrollPaginationProps}\n viewMode={viewMode}\n />\n </TableExtendContainer>\n </TableContainer>\n </Wrapper>\n );\n};\n\nexport default memo(TableWrapperView);\n","export enum ErrorMessages {\n NO_REGISTER_PERMISSION = 'You may be trying to register in the wrong place.',\n WRONG_EMAIL_FORMAT = 'The format you used to enter this email isn’t correct.',\n INVITATION_NOT_FOUND = 'Invitation not found or outdated',\n}\n","import styled from 'styled-components';\nimport { makeStyles } from '@material-ui/core';\nimport { Field } from 'formik';\n\nexport const useStyles = makeStyles(theme => ({\n imageUploaderStyles: {\n marginBottom: '60px !important',\n\n '@media(max-height: 650px)': {\n marginTop: '64px',\n },\n },\n\n checkboxContainer: {\n alignItems: 'flex-start !important',\n margin: '-10px 0 20px 0',\n gap: '4px',\n userSelect: 'none',\n },\n\n checkBoxAnchorTag: {\n color: 'var(--ps-blue-main)',\n textDecoration: 'none',\n marginLeft: 5,\n },\n}));\n\nexport const UserInfoContainer = styled.div`\n width: 100%;\n text-align: center;\n margin-bottom: 20px;\n`;\n\nexport const UserTitle = styled.div`\n color: var(--ps-white-1);\n font-size: 15px;\n`;\nexport const UserEmail = styled.div`\n font-size: 13px;\n color: var(--ps-grey-2);\n`;\n\nexport const HeaderTitle = styled.div`\n flex-grow: 0;\n font-size: 18px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.44;\n letter-spacing: normal;\n margin: 8px 0;\n text-align: center;\n color: var(--ps-white-1);\n`;\n\nexport const FormContainer = styled.div`\n width: 100%;\n`;\n\nexport const FieldsContainer = styled.div<{ marginBottom?: string }>`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex-wrap: wrap;\n > div,\n p {\n margin-bottom: ${props =>\n !!props.marginBottom ? props.marginBottom : '16px'};\n }\n`;\n\nexport const StyledField = styled(Field)`\n flex: 1;\n`;\n\nexport const Divider = styled.div`\n width: 39px;\n height: 3px;\n margin: 10px auto 0;\n background-color: var(--ps-blue-main);\n`;","import * as Yup from 'yup';\n\nimport Validation from '../../../services/validation';\n\nexport const RegisterSchema = Yup.object().shape({\n password: Validation.password,\n confirmPassword: Validation.confirmPassword,\n});\n\nexport const passwordHintText = 'Your password must be 8 characters long.';\n","import { RegisterFormValuesType } from './types';\n\n/**\n * @function isSubmitButtonDisabled\n * @param { RegisterFormValuesType } values\n * @returns { boolean }\n */\nexport const isSubmitButtonDisabled = (\n values: RegisterFormValuesType\n): boolean => {\n if (!values) return true;\n\n const keys = Object.keys(values);\n const formValues: any = values;\n return keys.filter(key => formValues[key]).length < keys.length;\n};\n\n","import { Formik, Form } from 'formik';\n\nimport { Button } from '../../../ui/components/Button';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport {\n HeaderTitle,\n StyledField,\n FormContainer,\n FieldsContainer,\n UserEmail,\n UserInfoContainer,\n UserTitle,\n useStyles,\n Divider,\n} from './styles';\nimport { passwordHintText, RegisterSchema } from './constants';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { RegistrationProps } from './types';\nimport { ImageUploader } from '../../../ui/components/ImageUploader';\nimport { isSubmitButtonDisabled } from './helper';\nimport Checkbox from '../../../ui/components/Checkbox';\n\nfunction RegistrationView(props: RegistrationProps) {\n const {\n formRef,\n userInfo,\n setProfileImage,\n handleSubmit,\n isTermsAccepted,\n handleToggleTerms,\n } = props;\n\n const classes = useStyles();\n\n return (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={720} hideFooter={true}>\n <ImageUploader\n setProfileImage={setProfileImage}\n placeHolder={userInfo?.firstName?.charAt(0).toUpperCase()}\n className={classes.imageUploaderStyles}\n dataTest=\"user-avatar\"\n />\n <UserInfoContainer>\n <UserTitle data-test=\"user-name\">\n {`${userInfo?.firstName ?? ''} ${userInfo?.lastName ?? ''}`}\n </UserTitle>\n <UserEmail data-test=\"user-email\">{userInfo?.email ?? ''}</UserEmail>\n <Divider />\n </UserInfoContainer>\n\n <HeaderTitle data-test=\"account-form-title\">Create an account</HeaderTitle>\n <FormContainer>\n <Formik\n ref={formRef}\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n enableReinitialize={true}\n onSubmit={handleSubmit}\n validationSchema={RegisterSchema}\n >\n {({ values, isSubmitting }) => (\n <Form>\n <FieldsContainer>\n <StyledField\n type=\"password-with-eye\"\n autoComplete=\"new-password\"\n component={FormikField}\n name=\"password\"\n label=\"Password\"\n colorTheme=\"darkThree\"\n fontSize=\"15px\"\n labelFontSize=\"15px\"\n height=\"56px\"\n labelFontWeight={600}\n className=\"login-input\"\n errorPadding=\"2px 0\"\n errorColor=\"var(--ps-red-main)\"\n hint={passwordHintText}\n autoFocus\n decreaseLabelFontSize\n dataTest=\"password\"\n />\n <StyledField\n type=\"password-with-eye\"\n autoComplete=\"new-password\"\n component={FormikField}\n name=\"confirmPassword\"\n label=\"Confirm Password\"\n colorTheme=\"darkThree\"\n fontSize=\"15px\"\n labelFontSize=\"15px\"\n height=\"56px\"\n labelFontWeight={600}\n className=\"login-input\"\n errorPadding=\"2px 0 0 0\"\n errorColor=\"var(--ps-red-main)\"\n decreaseLabelFontSize\n dataTest=\"confirm-password\"\n />\n </FieldsContainer>\n\n <Checkbox\n className={classes.checkboxContainer}\n checked={isTermsAccepted}\n handleChange={handleToggleTerms}\n background=\"transparent\"\n label={\n <div>\n I've read, understood, and agree to the\n <a\n href=\"https://www.gopractis.com/document-privacy-policy\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={\n classes.checkBoxAnchorTag\n }\n >\n Privacy Policy\n </a>,\n <a\n href=\"https://www.gopractis.com/document-terms-of-use\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={\n classes.checkBoxAnchorTag\n }\n >\n Terms to Use\n </a>, and \n <a\n href=\"https://www.gopractis.com/document-terms-of-service\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={\n classes.checkBoxAnchorTag\n }\n >\n Terms of Service.\n </a>\n </div>\n }\n size={16}\n dataTest=\"terms-checkbox\"\n fontColor=\"var(--ps-grey-4)\"\n />\n\n <Button\n type=\"submit\"\n width=\"100%\"\n height=\"56px\"\n buttonWidth=\"100%\"\n fontSize={16}\n style={{ marginTop: '10px' }}\n disabled={\n isSubmitButtonDisabled(values) ||\n !isTermsAccepted\n }\n loading={isSubmitting}\n dataTest=\"continue-button\"\n >\n Continue\n </Button>\n </Form>\n )}\n </Formik>\n </FormContainer>\n </LoginAuthWrapper>\n );\n}\n\nexport default RegistrationView;\n","import { FormikActions } from 'formik';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\n\nimport ROUTES from '../../../routes/routes';\nimport Storage from '../../../services/Storage';\nimport { LocationState } from '../../../tools/router';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useUploadPhotoService } from '../../UserProfile/store/services';\nimport {\n useAuthType,\n useResetProfileService,\n useTestInvitationService,\n} from '../store/services';\nimport { ErrorMessages } from '../tools';\nimport {\n RegisterFormValuesType,\n UserInfoType,\n} from './types';\nimport RegistrationView from './view';\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../theme/variables';\nimport { useRedirectToPhoneVerification } from '../../../helpers/hooks/useRedirectToPhoneVerification';\nimport { isTeamLeader } from '../../../constants/enums';\nimport { useRegistrationApi } from '../../../api';\nimport { clearAuthData } from '../../../helpers/functions/auth-helpers';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { AuthType } from '../../../api/auth/enums';\nimport { replaceUrlQueryParam } from '../../../routes/helpers';\n\nconst qs = require('query-string');\n\nfunction RegistrationController() {\n const history = useHistory();\n const location = useLocation<LocationState>();\n const [userInfo, setUserInfo] = useState<UserInfoType | null>(null);\n const [profileImage, setProfileImage] = useState<File | null>(null);\n const [isTermsAccepted, setIsTermsAccepted] = useState(false);\n\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n\n useHtmlPageTitle('Create an account');\n\n\n const formRef = useRef(null);\n const handleTestInvitation = useTestInvitationService();\n const handleResetProfile = useResetProfileService();\n const handleFileUpload = useUploadPhotoService();\n const showMessage = useShowMessage();\n const redirectToPhoneVerification = useRedirectToPhoneVerification();\n const register = useRegistrationApi();\n const authType = useAuthType();\n\n /**\n * @function handleSubmitError\n * @param { ErrorResult } error\n * @returns { void }\n */\n const handleSubmitError = useCallback(\n (error: ErrorResult) => {\n if (error.code === 403) {\n showMessage(ErrorMessages.NO_REGISTER_PERMISSION, 'error');\n } else if (error.code === 404) {\n showMessage(ErrorMessages.INVITATION_NOT_FOUND, 'error');\n } else if (error.code === 400 && error.details) {\n const details = error.details;\n const checkEmail = details.find(\n (item: any) => item.field === 'email',\n );\n\n let message = '';\n if (checkEmail) {\n message = ErrorMessages.WRONG_EMAIL_FORMAT;\n } else {\n message = details[0].message as string;\n }\n\n showMessage(message, 'error');\n } else {\n showMessage(error.message, 'error');\n }\n },\n [showMessage],\n );\n\n /**\n * @function handleUploadProfilePicture\n * @returns { Promise<void> }\n */\n const handleUploadProfilePicture = useCallback(\n async (userId: number) => {\n if (profileImage) {\n handleFileUpload(userId, profileImage);\n }\n },\n [handleFileUpload, profileImage],\n );\n\n /**\n * @function handleSubmit\n * @param { RegisterFormValuesType } values\n * @param { FormikActions<RegisterFormValuesType> } formikActions\n */\n const handleSubmit = useCallback(\n (\n values: RegisterFormValuesType,\n formikActions: FormikActions<RegisterFormValuesType>,\n ) => {\n const { setSubmitting } = formikActions;\n\n const registerValues = {\n firstName: userInfo?.firstName || '',\n lastName: userInfo?.lastName || '',\n email: userInfo?.email || '',\n password: values.password,\n code: qs.parse(location.search).token ?? '',\n phoneNumber: null,\n };\n\n register(registerValues)\n .then((response: any) => {\n Storage.set('temp_token', response.token);\n handleUploadProfilePicture(response.user.id);\n const isTeamLead = isTeamLeader(response.user.role.name);\n const user = Object.assign({ isTeamLead }, response.user);\n redirectToPhoneVerification({\n user,\n isNewUser: true,\n });\n })\n .catch((error: ErrorResult) => {\n setSubmitting(false);\n handleSubmitError(error);\n });\n },\n [\n handleUploadProfilePicture,\n location,\n userInfo,\n handleSubmitError,\n redirectToPhoneVerification,\n register,\n ],\n );\n\n /**\n * @function handleToggleTerms\n * @returns { void }\n */\n const handleToggleTerms = useCallback(() => {\n setIsTermsAccepted(prev => !prev);\n }, []);\n\n /**\n * @function handleRedirectToInvalidInvitationPage\n * @returns { void }\n */\n const handleRedirectToInvalidInvitationPage = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.INVALID_INVITE);\n }, [history]);\n\n useEffect(() => {\n const invitationToken = qs.parse(location.search).token ?? null;\n\n if (!invitationToken) {\n handleRedirectToInvalidInvitationPage();\n }\n\n clearAuthData();\n\n authType({ invitation: invitationToken })\n .then((response: { type: AuthType; url?: string }) => {\n const url = response.url;\n if (url) {\n window.location.href = replaceUrlQueryParam(url, 'redirect_uri', window.location.origin + `/auth0-callback`);\n } else {\n handleTestInvitation(\n invitationToken,\n handleRedirectToInvalidInvitationPage,\n ).then(response => {\n if (response) {\n setUserInfo(response);\n }\n });\n }\n }).catch(() => {\n handleRedirectToInvalidInvitationPage();\n });\n }, [\n handleRedirectToInvalidInvitationPage,\n handleTestInvitation,\n location.search,\n ]);\n\n useEffect(() => {\n return () => {\n handleResetProfile();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <RegistrationView\n formRef={formRef}\n isMobile={isMobile}\n userInfo={userInfo}\n setProfileImage={setProfileImage}\n handleSubmit={handleSubmit}\n isTermsAccepted={isTermsAccepted}\n handleToggleTerms={handleToggleTerms}\n />\n );\n}\n\nexport default memo(RegistrationController);","import { forwardRef } from 'react';\n\nimport { IconProps } from './types';\n\nexport const Camera = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"21\"\n height=\"20\"\n viewBox=\"0 0 21 20\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#p0w82laf1a)\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"m15.25 6.083-1.583-1.916H7.751L6.167 6.083l-.5.584H3.251v9.166h15V6.667h-2.417l-.583-.584zM13.72 2.5c.495 0 .964.22 1.28.6L16.584 5h1.667c.92 0 1.666.746 1.666 1.667v9.166c0 .92-.746 1.667-1.666 1.667h-15c-.92 0-1.667-.746-1.667-1.667V6.667C1.584 5.747 2.33 5 3.251 5h1.666l1.584-1.9c.317-.38.786-.6 1.28-.6h5.939zm-.886 7.917a2.063 2.063 0 0 0-2.083-2.084 2.063 2.063 0 0 0-2.084 2.084c0 1.166.917 2.083 2.084 2.083a2.063 2.063 0 0 0 2.083-2.083zm-5.833 0a3.734 3.734 0 0 1 3.75-3.75 3.734 3.734 0 0 1 3.75 3.75 3.734 3.734 0 0 1-3.75 3.75A3.734 3.734 0 0 1 7 10.417z\"\n fill=\"#fff\"\n />\n </g>\n <defs>\n <clipPath id=\"p0w82laf1a\">\n <path\n fill=\"#fff\"\n transform=\"translate(1.584 2.5)\"\n d=\"M0 0h18.333v15H0z\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Camera;\n\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n`;\n\nexport const StyledImageContainer = styled.div<{ src?: string, rectStyled?: boolean }>`\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n width: 80px;\n height: 80px;\n border-radius: 50%;\n border: none;\n background: var(--ps-graphite-2);\n background-image: ${({ src }) => (src ? `url('${encodeURI(src)}')` : ``)};\n background-position: center;\n background-repeat: no-repeat;\n background-size: 80px 80px;\n cursor: pointer;\n font-size: 32px;\n font-weight: bold;\n color: var(--ps-grey-1);\n\n ${({ rectStyled, src }) => (rectStyled &&\n `width: 88px;\n height: 88px;\n margin: 5px 51px 25px 19px;\n background-size: 88px 88px;\n padding: 32px;\n border-radius: 4px;\n border: solid 1px var(--ps-grey-2);\n border-width: ${src ? `0px` : `1px`};\n background-color: var(--ps-grey-3);\n color: var(--ps-black-1);\n box-sizing: border-box;`\n )}\n`;\n\nexport const BadgeContainer = styled.div<{ rectStyled?: boolean }>`\n position: absolute;\n width: 24px;\n height: 24px;\n margin-top: 3rem;\n margin-left: 4rem;\n box-sizing: border-box;\n z-index: 3;\n color: red;\n background: var(--ps-blue-main);\n padding: 5px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n ${({ rectStyled }) => (rectStyled &&\n `width: 36px;\n height: 36px;\n padding: 8px;\n box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.14);\n background-color: var(--ps-grey-2);`\n )}\n`;\n\nexport const TrashContainer = styled.div`\n position: absolute;\n margin-top: 3rem;\n margin-left: 4rem;\n z-index: 3;\n color: var(--ps-white-1);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n padding: 8px;\n box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.14);\n background-color: var(--ps-blue-main);\n`;\n\nexport const LoadingContainer = styled.div`\n position: absolute;\n`;","import Camera from '../../icons/Camera';\nimport TrashBin from '../../icons/TrashBin';\nimport { Loading } from '../LoadingCopmonent';\nimport {\n BadgeContainer,\n Container,\n StyledImageContainer,\n TrashContainer,\n LoadingContainer\n} from './styles';\nimport { ImageUploaderViewProps } from './types';\n\nfunction ImageUploaderView(props: ImageUploaderViewProps) {\n const {\n initialImage,\n fileInputRef,\n className,\n placeHolder,\n editedImage,\n handleImageChange,\n handleInputClick,\n isInProgress,\n dataTest,\n onFileDelete,\n rectStyled\n } = props;\n const imageSrc = editedImage || initialImage;\n\n return (\n <Container\n className={className}\n onClick={() => fileInputRef?.current?.click()}\n data-test={dataTest && `${dataTest}-container`}\n >\n <input\n id=\"myInput\"\n type=\"file\"\n ref={fileInputRef}\n style={{ display: 'none' }}\n accept=\"image/jpeg, image/png, image/bmp\"\n onChange={handleImageChange}\n onClick={handleInputClick}\n data-test={dataTest && `${dataTest}-input`}\n />\n <StyledImageContainer src={!isInProgress && imageSrc} data-test={dataTest && `${dataTest}-image`} rectStyled={rectStyled}>\n {!imageSrc && !isInProgress && placeHolder}\n {isInProgress &&\n <LoadingContainer>\n <Loading size={24} />\n </LoadingContainer>\n }\n </StyledImageContainer>\n {rectStyled && imageSrc ?\n <TrashContainer data-test={dataTest && `${dataTest}-delete`} onClick={(e) => {\n e.stopPropagation();\n onFileDelete && onFileDelete();\n }}>\n <TrashBin />\n </TrashContainer> :\n <BadgeContainer data-test={dataTest && `${dataTest}-camera`} rectStyled={rectStyled}>\n <Camera />\n </BadgeContainer>\n }\n </Container>\n );\n}\n\nexport default ImageUploaderView;\n","import { MutableRefObject, useCallback } from 'react';\nimport AvatarEditor from 'react-avatar-editor';\n\nimport { useShowMessage } from '../ErrorMessages/ErrorMessages';\n\nconst uuid = require('uuid/v1');\n\n/**\n * @function useCheckImage\n * @param { React.ChangeEvent<HTMLInputElement> } event\n * @returns { void }\n */\nexport const useCheckImage = (maxImageSize: number) => {\n const showMessage = useShowMessage();\n\n return useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n event.persist();\n let file = event?.target?.files?.[0];\n\n if (!file) return false;\n if (!['image/jpeg', 'image/png', 'image/bmp'].includes(file.type)) {\n showMessage('Uploaded file is not a picture', 'error');\n return false;\n }\n if (file.size >= maxImageSize) {\n showMessage(`The image file size must be less than ${(maxImageSize/1048576).toFixed()} MB`, 'error');\n return false;\n } else if (!file.type.includes('image')) {\n showMessage('File must be an image', 'error');\n return false;\n }\n\n return true;\n },\n [showMessage, maxImageSize]\n );\n};\n\n/**\n * @function getEditedImageFileInfo\n * @param { MutableRefObject<AvatarEditor | null> } imageEditorRef\n */\nexport const getEditedImageFileInfo = async (\n imageEditorRef: MutableRefObject<AvatarEditor | null>\n) => {\n const dataUrl = imageEditorRef?.current?.getImage()?.toDataURL();\n\n if (!dataUrl) return null;\n\n const result = await fetch(dataUrl);\n const blob = await result.blob();\n\n return {\n url: URL.createObjectURL(blob),\n file: new File([blob], `image${uuid()}.png`, { type: 'image/png' }),\n };\n};\n\n","import { memo, useState, useRef } from 'react';\nimport AvatarEditor from 'react-avatar-editor';\n\nimport ImageUploaderView from './view';\nimport { ImageUploaderControllerProps } from './types';\nimport { ImageEditor } from './ImageEditor';\nimport { getEditedImageFileInfo, useCheckImage } from './helper';\nimport { MAX_IMAGE_FILE_SIZE } from './ImageEditor/constants';\n\nconst ImageUploaderController = ({\n initialImage,\n setProfileImage,\n placeHolder,\n className,\n dataTest,\n maxImageSize,\n onFileDelete,\n rectStyled,\n isInProgress,\n}: ImageUploaderControllerProps) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const imageEditorRef = useRef<AvatarEditor | null>(null);\n\n const checkImage = useCheckImage(maxImageSize || MAX_IMAGE_FILE_SIZE);\n\n const [isImageEditorVisible, setIsImageEditorVisible] = useState<boolean>(\n false\n );\n\n const [selectedImage, setSelectedImage] = useState<File | null>(null);\n const [editedImage, setEditedImage] = useState<string | null>(null);\n\n /**\n * @function handleApplyImage\n * @returns { Promise<void> }\n */\n const handleApplyImage = async (): Promise<void> => {\n if (imageEditorRef) {\n const editedImageFileInfo = await getEditedImageFileInfo(\n imageEditorRef\n );\n\n if (editedImageFileInfo) {\n Promise.resolve().then(() => {\n setEditedImage(editedImageFileInfo?.url);\n setProfileImage?.(editedImageFileInfo?.file);\n handleCloseImageEditor();\n });\n }\n }\n };\n\n const handleFileDelete = (): void => {\n setEditedImage(null);\n onFileDelete && onFileDelete();\n }\n\n /**\n * @function handleCloseImageEditor\n * @returns { void }\n */\n const handleCloseImageEditor = (): void => {\n setIsImageEditorVisible(false);\n };\n\n /**\n * @function handleOpenImageEditor\n * @returns { void }\n */\n const handleOpenImageEditor = (\n event: React.ChangeEvent<HTMLInputElement>\n ): void => {\n const isAllowedImage = checkImage(event);\n\n if (isAllowedImage) {\n Promise.resolve().then(() => {\n if (event?.target?.files?.[0]) {\n setSelectedImage(event.target.files[0]);\n setIsImageEditorVisible(true);\n }\n });\n }\n };\n\n /**\n * @description this function is used to handle choose same image again\n * @function handleInputClick\n * @param event\n * @returns { void }\n */\n const handleInputClick = (\n event: React.MouseEvent<HTMLInputElement>\n ): void => {\n const { target = {} } = event || {};\n (target as HTMLInputElement).value = '';\n };\n\n return (\n <>\n <ImageUploaderView\n initialImage={initialImage}\n fileInputRef={fileInputRef}\n placeHolder={placeHolder}\n className={className}\n editedImage={editedImage}\n handleImageChange={handleOpenImageEditor}\n handleInputClick={handleInputClick}\n isInProgress={isInProgress}\n dataTest={dataTest}\n onFileDelete={handleFileDelete}\n rectStyled={rectStyled}\n />\n {isImageEditorVisible && selectedImage && (\n <ImageEditor\n editorRef={imageEditorRef}\n selectedImage={selectedImage}\n handleClose={handleCloseImageEditor}\n handleApplyEditedImage={handleApplyImage}\n rectStyled={rectStyled}\n />\n )}\n </>\n );\n}\n\nexport default memo(ImageUploaderController);\n","export const MAX_IMAGE_FILE_SIZE = 10506316;\n","import { Field } from 'formik';\nimport styled from 'styled-components';\n\nexport const HeaderTitle = styled.div`\n flex-grow: 0;\n font-size: 18px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.44;\n letter-spacing: normal;\n margin: 8px 0;\n text-align: center;\n color: var(--ps-white-1);\n`;\n\nexport const Content = styled.div`\n width: 90%;\n\n @media (min-width: 420px) {\n width: 70%;\n }\n @media (min-width: 768px) {\n width: 40%;\n }\n\n @media (min-width: 1440px) {\n width: 22%;\n }\n`;\n\nexport const FieldsContainer = styled.div<{ marginBottom?: string }>`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex-wrap: wrap;\n > div,\n p {\n margin-bottom: ${props =>\n !!props.marginBottom ? props.marginBottom : '16px'};\n }\n`;\n\nexport const StyledField = styled(Field)`\n flex: 1;\n`;\n","import { RegisterFormValuesType } from './types';\n\n/**\n * @function isSubmitButtonDisabled\n * @param { RegisterFormValuesType } values\n * @returns { boolean }\n */\nexport const isSubmitButtonDisabled = (values: RegisterFormValuesType) => {\n if (!values) return true;\n\n const keys = Object.keys(values);\n const formValues: any = values;\n return keys.filter(key => formValues[key]).length < keys.length;\n};\n\n","import * as Yup from 'yup';\n\nimport Validation from '../../../services/validation';\n\nexport const RegisterSchema = Yup.object().shape({\n invitationCode: Validation.invitationCode.required(\n 'Invitation Code is required'\n ),\n});\n\n","import { Formik, Form } from 'formik';\n\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport {\n Content,\n FieldsContainer,\n HeaderTitle,\n StyledField,\n} from './styles';\nimport { isSubmitButtonDisabled } from './helper';\nimport { RegisterViewProps } from './types';\nimport { RegisterSchema } from './constants';\n\nfunction RegisterView(props: RegisterViewProps) {\n const { formRef, user, handleSubmit } = props;\n\n return (\n <LoginAuthWrapper>\n <Content>\n <HeaderTitle>Invitation Code From Email</HeaderTitle>\n <Formik\n ref={formRef}\n initialValues={{\n invitationCode: user?.invitationCode ?? '',\n }}\n enableReinitialize={true}\n onSubmit={handleSubmit}\n validationSchema={RegisterSchema}\n >\n {({ values, isSubmitting }) => (\n <Form>\n <FieldsContainer>\n <StyledField\n type=\"text\"\n disabled={!!user?.invitationCode}\n component={FormikField}\n name=\"invitationCode\"\n label=\"Invite Code\"\n colorTheme=\"darkThree\"\n fontSize=\"15px\"\n labelFontSize=\"15px\"\n height=\"56px\"\n labelFontWeight={600}\n errorPadding=\"2px 0\"\n errorColor=\"var(--ps-red-main)\"\n className=\"login-input\"\n decreaseLabelFontSize\n />\n </FieldsContainer>\n <Button\n type=\"submit\"\n width=\"100%\"\n height=\"56px\"\n buttonWidth=\"100%\"\n fontSize={16}\n style={{ marginTop: '10px' }}\n disabled={isSubmitButtonDisabled(values)}\n loading={isSubmitting}\n >\n Continue\n </Button>\n </Form>\n )}\n </Formik>\n </Content>\n </LoginAuthWrapper>\n );\n}\n\nexport default RegisterView;\n","import { memo, useCallback, useEffect, useRef } from 'react';\nimport { FormikActions } from 'formik';\nimport { useHistory, useLocation } from 'react-router-dom';\n\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../UserProfile/store/reducers';\nimport RegisterView from './view';\nimport { RegisterFormValuesType } from './types';\nimport { useTestInvitationService } from '../store/services';\nimport ROUTES from '../../../routes/routes';\nimport { LocationState } from '../../../tools/router';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nconst qs = require('query-string');\n\nfunction RegisterController() {\n const formRef = useRef(null);\n const history = useHistory();\n const location = useLocation<LocationState>();\n\n const user: UserProfile | undefined = useSelector(getProfileState);\n const handleTestInvitation = useTestInvitationService();\n\n useHtmlPageTitle(\"Invitation Code From Email\");\n\n\n /**\n * @function failureTestInvitationCallback\n * @param { function } setFieldError\n * @param { string } errorMessage\n * @returns { void }\n */\n const failureTestInvitationCallback = (\n setFieldError: (field: string, message: string) => void,\n errorMessage?: string\n ) => {\n errorMessage && setFieldError('invitationCode', errorMessage);\n };\n\n /**\n * @function handleSubmit\n * @param { RegisterFormValuesType } values\n * @param { FormikActions<RegisterFormValuesType> } formikActions\n */\n const handleSubmit = useCallback(\n (\n values: RegisterFormValuesType,\n formikActions: FormikActions<RegisterFormValuesType>\n ) => {\n const { invitationCode } = values;\n const { setSubmitting, setFieldError } = formikActions;\n\n if (invitationCode) {\n handleTestInvitation(invitationCode, errorMessage =>\n failureTestInvitationCallback(setFieldError, errorMessage)\n ).then(response => {\n if (response) {\n history.push(\n `${ROUTES.AUTH_PAGES.REGISTRATION}?token=${invitationCode}`\n );\n }\n });\n\n setSubmitting(false);\n }\n },\n [handleTestInvitation, history]\n );\n\n /**\n * @function handleRedirectToInvalidInvitationPage\n * @returns { void }\n */\n const handleRedirectToInvalidInvitationPage = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.INVALID_INVITE);\n }, [history]);\n\n useEffect(() => {\n const invitationToken = qs.parse(location.search).code ?? null;\n\n if (invitationToken) {\n handleTestInvitation(\n invitationToken,\n handleRedirectToInvalidInvitationPage\n );\n }\n }, [handleRedirectToInvalidInvitationPage, handleTestInvitation, location]);\n\n return (\n <RegisterView\n formRef={formRef}\n user={user}\n handleSubmit={handleSubmit}\n />\n );\n}\n\nexport default memo(RegisterController);\n","import { forwardRef } from 'react';\n\nimport { IconProps } from './types';\n\nexport const Person = forwardRef<SVGSVGElement, IconProps>(\n ({ className, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n data-test={dataTest}\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M10.5 5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0zm.061 3.072a4 4 0 1 0-5.123 0 6.004 6.004 0 0 0-3.43 5.142.75.75 0 0 0 1.497.07 4.5 4.5 0 0 1 8.99 0 .75.75 0 1 0 1.498-.07 6.005 6.005 0 0 0-3.432-5.142z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default Person;\n\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PractisSet = forwardRef<SVGSVGElement, IconProps>(\n ({ className, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n data-test={dataTest}\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M1.75 2.5a.25.25 0 0 0-.25.25v1.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-1.5a.25.25 0 0 0-.25-.25H1.75zM0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v1.5A1.75 1.75 0 0 1 14.25 6H1.75A1.75 1.75 0 0 1 0 4.25v-1.5zM1.75 7a.75.75 0 0 1 .75.75v5.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-5.5a.75.75 0 1 1 1.5 0v5.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25v-5.5A.75.75 0 0 1 1.75 7zm4.5 1a.75.75 0 0 0 0 1.5h3.5a.75.75 0 1 0 0-1.5h-3.5z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default PractisSet;\n\n","import { forwardRef } from 'react';\n\nimport { IconProps } from './types';\n\nexport const TeamLeaders = forwardRef<SVGSVGElement, IconProps>(\n ({ className, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n data-test={dataTest}\n >\n <g clip-path=\"url(#9l12if48ma)\">\n <g clip-path=\"url(#5blw8zx8gb)\">\n <path\n d=\"m14.33 6.71-1.38 5.73H3.08L1.69 6.71\"\n stroke=\"#6D7F8C\"\n stroke-width=\"1.2\"\n stroke-miterlimit=\"10\"\n />\n <path\n d=\"m8.01 3.55 1.66 3.11a1.82 1.82 0 0 0 2.62.64l1.13-.78M2.57 6.52l1.13.77a1.81 1.81 0 0 0 2.62-.64l1.65-3.1\"\n stroke=\"#6D7F8C\"\n stroke-width=\"1.2\"\n stroke-miterlimit=\"10\"\n />\n <path\n d=\"M8.01 3.88a1.19 1.19 0 1 0 0-2.38 1.19 1.19 0 0 0 0 2.38zM14.33 6.95a1.19 1.19 0 1 0 0-2.38 1.19 1.19 0 0 0 0 2.38zM1.69 6.95a1.19 1.19 0 1 0 0-2.38 1.19 1.19 0 0 0 0 2.38z\"\n fill=\"#6D7F8C\"\n stroke=\"#6D7F8C\"\n stroke-miterlimit=\"10\"\n />\n <path\n d=\"M13.33 13.99H2.61v1.2h10.72v-1.2z\"\n fill=\"#6D7F8C\"\n />\n </g>\n </g>\n <defs>\n <clipPath id=\"9l12if48ma\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\" />\n </clipPath>\n <clipPath id=\"5blw8zx8gb\">\n <path\n fill=\"#fff\"\n transform=\"translate(0 1)\"\n d=\"M0 0h16.02v14.19H0z\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default TeamLeaders;\n\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n margin: 1px 0 25px 0;\n`;\n\nexport const IconContainer = styled.div`\n display: flex;\n justify-content: space-between;\n margin-right: 14px;\n`;\n\nexport const Title = styled.div`\n font-size: 13px;\n font-weight: 500;\n color: var(--ps-grey-1);\n margin-left: 5px;\n`;\n","import Skeleton from '@material-ui/lab/Skeleton';\n\nimport { Tooltip } from '../../../../ui/components/Tooltip';\nimport PersonIcon from '../../../../ui/icons/Person';\nimport PractisSetIcon from '../../../../ui/icons/PractisSet';\nimport TeamLeadersIcon from '../../../../ui/icons/TeamLeader';\nimport { Container, IconContainer, Title } from './styles';\nimport { SubheaderProps } from './types';\n\nfunction SubheaderView(props: SubheaderProps) {\n const { practisSetsCount, usersCount, teamLeadersCount } = props;\n\n return (\n <Container data-test=\"subheader-container\">\n {practisSetsCount! >= 0 ? (\n <Tooltip label=\"Practis Sets\" position=\"bottom-start\">\n <IconContainer data-test=\"practisset-counter-container\">\n <PractisSetIcon dataTest=\"practisset-counter-icon\" />\n <Title data-test=\"practisset-counter-title\">\n {practisSetsCount}\n </Title>\n </IconContainer>\n </Tooltip>\n ) : (\n <Skeleton\n variant=\"text\"\n style={{\n background: 'var(--ps-grey-3)',\n marginRight: 14,\n }}\n width={20}\n height={18.5}\n />\n )}\n {usersCount! >= 0 ? (\n <Tooltip label=\"Users\" position=\"bottom-start\">\n <IconContainer data-test=\"users-counter-container\">\n <PersonIcon dataTest=\"users-counter-icon\" />\n <Title data-test=\"users-counter-title\">\n {usersCount}\n </Title>\n </IconContainer>\n </Tooltip>\n ) : (\n <Skeleton\n variant=\"text\"\n style={{\n background: 'var(--ps-grey-3)',\n marginRight: 14,\n }}\n width={20}\n height={18.5}\n />\n )}\n\n {teamLeadersCount! >= 0 ? (\n <Tooltip label=\"Team Leaders\" position=\"bottom-start\">\n <IconContainer data-test=\"team-leaders-counter-container\">\n <TeamLeadersIcon dataTest=\"team-leaders-counter-icon\" />\n <Title data-test=\"team-leaders-counter-title\">\n {teamLeadersCount}\n </Title>\n </IconContainer>\n </Tooltip>\n ) : (\n <Skeleton\n variant=\"text\"\n style={{\n background: 'var(--ps-grey-3)',\n marginRight: 14,\n }}\n width={20}\n height={18.5}\n />\n )}\n </Container>\n );\n}\n\nexport default SubheaderView;\n","import styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport { Slider, withStyles } from '@material-ui/core';\n\nexport const CustomSlider = withStyles({\n root: {\n color: 'var(--ps-blue-main)',\n height: 5,\n padding: '5px 0',\n },\n rail: {\n height: 4,\n background: 'var(--ps-grey-2)',\n border: '1px solid var(--ps-grey-2)',\n borderRadius: 8,\n },\n track: {\n height: 5,\n borderRadius: 2,\n },\n thumb: {\n height: 20,\n width: 20,\n backgroundColor: 'var(--ps-blue-main)',\n border: '1px solid currentColor',\n marginTop: -9,\n marginLeft: -11,\n boxShadow: '0 4px 4px 0 rgba(0, 0, 0, 0.12)',\n '&:focus, &:hover, &$active': {\n boxShadow: 'var(--ps-grey-2) 0 2px 3px 1px',\n },\n color: 'var(--ps-grey-2)',\n },\n})(Slider);\n\nexport const StyledDialogBlacker = styled(motion.div)`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1200;\n background: rgba(35, 46, 58, 0.8);\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const StyledDialog = styled(motion.div)`\n width: 355px;\n border-radius: 2px;\n box-shadow: 0 5px 20px -5px rgba(166, 174, 190, 0.5);\n background-color: ${props => props.theme.Colors.white};\n border-radius: 8px;\n`;\n\nexport const SliderContainer = styled.div`\n margin: 0 20px 0 20px;\n`;\nexport const SliderLabelContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 15px;\n color: var(--ps-grey-1);\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n font-size: 15px;\n font-weight: 800;\n padding: 0 20px;\n height: 54px;\n`;\nexport const Footer = styled.div`\n height: 150px;\n`;\nexport const ButtonContainer = styled.div`\n display: flex;\n justify-content: space-between;\n margin: 25px 20px 0 20px;\n`;\n\nexport const Divider = styled.div`\n width: 100%;\n height: 1px;\n margin: 10px 0 20px 0;\n background-color: var(--ps-grey-4);\n`;\n","import AvatarEditor from 'react-avatar-editor';\n\nimport { Button } from '../../Button';\nimport {\n ButtonContainer,\n CustomSlider,\n Divider,\n Footer,\n Header,\n SliderContainer,\n SliderLabelContainer,\n StyledDialog,\n StyledDialogBlacker,\n} from './styles';\nimport { ImageEditorViewProps } from './types';\n\nfunction ImageEditorView(props: ImageEditorViewProps) {\n const {\n selectedImage,\n handleClose,\n editorRef,\n handleApplyEditedImage,\n scale,\n onScaleChange,\n rectStyled\n } = props;\n\n return (\n <StyledDialogBlacker onClick={handleClose}>\n <StyledDialog\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n onClick={(event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n }}\n >\n <Header data-test=\"edit-photo-title\">Edit Photo</Header>\n <AvatarEditor\n ref={editorRef}\n image={selectedImage}\n width={255}\n height={255}\n border={rectStyled ? [50, 50] : [50,20]}\n borderRadius={rectStyled ? 5 : 500}\n color={[0, 0, 0, 0.38]}\n scale={scale}\n />\n <Footer>\n <SliderContainer>\n <SliderLabelContainer>\n <span data-test=\"edit-photo-zoom-label\">Zoom</span>\n <span data-test=\"edit-photo-zoom-value\">{scale}</span>\n </SliderLabelContainer>\n <span data-test=\"edit-photo-zoom-slider\">\n <CustomSlider\n aria-label=\"small\"\n onChange={onScaleChange}\n value={scale}\n step={0.1}\n marks={false}\n min={1}\n max={2}\n />\n </span>\n </SliderContainer>\n <Divider />\n <ButtonContainer>\n <Button\n action={handleClose}\n variant=\"inverse\"\n buttonWidth=\"47.5%\"\n dataTest=\"edit-photo-cancel-button\"\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n action={handleApplyEditedImage}\n buttonWidth=\"47.5%\"\n dataTest=\"edit-photo-save-button\"\n >\n Save\n </Button>\n </ButtonContainer>\n </Footer>\n </StyledDialog>\n </StyledDialogBlacker>\n );\n}\n\nexport default ImageEditorView;\n","import { ChangeEvent, memo, useState } from 'react';\n\nimport { ImageEditorControllerProps } from './types';\nimport ImageEditorView from './view';\n\nfunction ImageEditorController(props: ImageEditorControllerProps) {\n const {\n editorRef,\n selectedImage,\n handleClose,\n handleApplyEditedImage,\n rectStyled\n } = props;\n\n const [scale, setScale] = useState<number>(1.2);\n\n const onScaleChange = (\n event: ChangeEvent<{}>,\n scale: number | number[]\n ) => {\n setScale(scale as number);\n };\n\n return (\n <ImageEditorView\n editorRef={editorRef}\n selectedImage={selectedImage}\n handleClose={handleClose}\n handleApplyEditedImage={handleApplyEditedImage}\n onScaleChange={onScaleChange}\n scale={scale}\n rectStyled={rectStyled}\n />\n );\n}\n\nexport default memo(ImageEditorController);\n\n","export { default as Register } from './controller';\nexport * from './types';\n\n","export { default as Registration } from './controller';\nexport * from './types';\n","export { default as ImageEditor } from './controller';\nexport * from './types';\n","export default __webpack_public_path__ + \"static/media/back-arrow.314c7bdc.svg\";","import styled from 'styled-components';\n\nexport const Title = styled.div`\n position: relative;\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n width: 100%;\n text-align: center;\n`;\n\nexport const BackArrow = styled.img`\n position: absolute;\n top: 7px;\n left: 0;\n cursor: pointer;\n width: 16px;\n height: 14px;\n`;\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n text-align: center;\n padding-top: 4px;\n`;\n\nexport const FormContainer = styled.div`\n width: 100%;\n`;\n\nexport const FieldContainer = styled.div`\n min-height: 78px;\n margin-top: 12px;\n margin-bottom: 16px;\n\n .login-input-container + div {\n line-height: 18px;\n }\n`;\n","import { ChangeEvent } from 'react';\nimport { Field, Form, Formik } from 'formik';\nimport * as Yup from 'yup';\nimport Validation from '../../../../../services/validation';\nimport { Variables } from '../../../../../theme/variables';\nimport { FormikField } from '../../../../../ui/components/FormikField';\nimport { Button } from '../../../../../ui/components/Button';\nimport LoginAuthWrapper from '../../../../../ui/wrapper/LoginAuthWrapper';\nimport BackArrowImage from '../../../../../assets/images/icons/back-arrow.svg';\nimport { EnterEmailAddressViewProps } from './types';\nimport {\n Title,\n BackArrow,\n Description,\n FormContainer,\n FieldContainer,\n} from './styles';\n\nconst ForgotPasswordSchema = Yup.object().shape({\n email: Validation.authEmail,\n});\n\nfunction EnterEmailAddressView ({\n isSending,\n errorMessage,\n onClearError,\n onSend,\n onBack\n}: EnterEmailAddressViewProps) {\n return (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={470}>\n <Title>\n <BackArrow src={BackArrowImage} onClick={onBack} />\n Forgot Password\n </Title>\n <Description>\n Enter the email associated with your account.<br />We will email you a link to reset your password.\n </Description>\n <FormContainer>\n <Formik\n initialValues={{\n email: ''\n }}\n onSubmit={values => onSend(values.email)}\n validationSchema={ForgotPasswordSchema}\n >\n {({ values, setFieldValue }) => (\n <Form>\n <FieldContainer>\n <Field\n type='text'\n component={FormikField}\n name='email'\n label='Email Address'\n height='56px'\n colorTheme='darkThree'\n fontSize='15px'\n value={values.email}\n labelFontSize='15px'\n labelFontWeight={600}\n customError={errorMessage}\n errorColor={Variables.Colors.tomato}\n className='login-input'\n dataTest='forgot-password-email'\n autoFocus={true}\n handleChange={(e: ChangeEvent<HTMLInputElement>) => {\n setFieldValue('email', e.target.value);\n onClearError();\n }}\n />\n </FieldContainer>\n <Button\n disabled={!values.email}\n height='56px'\n width='343px'\n fontSize={15}\n loading={isSending}\n >\n Send Link\n </Button>\n </Form>\n )}\n </Formik>\n </FormContainer>\n </LoginAuthWrapper>\n );\n}\n\nexport default EnterEmailAddressView;\n","import { useState, useCallback } from 'react';\nimport { useForgotPasswordApi } from '../../../../../api';\nimport ROUTES from '../../../../../routes/routes';\nimport { useHistory } from '../../../../../tools/router';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\nimport EnterEmailAddressView from './view';\nimport { EnterEmailAddressProps } from './types';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nconst NOT_FOUND_ACCOUNT_ERROR = 'That account doesn\\'t exist. Enter a different email address.';\nconst INVALID_EMAIL_ERROR = 'The format you used to enter this email isn\\'t correct';\n\nfunction EnterEmailAddressController ({ onSuccess }: EnterEmailAddressProps) {\n const history = useHistory();\n const forgotPassword = useForgotPasswordApi();\n const [isSending, setIsSending] = useState<boolean>(false);\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n /**\n * @function handleClearError - clears error message\n * @returns { void }\n */ \n const handleClearError = () => {\n setErrorMessage('');\n };\n\n /**\n * @function getErrorByCode - returns error message based on error code\n * @param { number? } code\n * @returns { string? }\n */ \n const getErrorByCode = (code?: number) => {\n switch(code) {\n case 400:\n return INVALID_EMAIL_ERROR;\n case 404:\n return NOT_FOUND_ACCOUNT_ERROR;\n default:\n return null;\n } \n }\n\n /**\n * @function handleSend - sends email to forgot-password API and\n * shows error message if it's returned by API\n * @param { string } email\n * @returns { void }\n */ \n const handleSend = useCallback((email: string) => {\n setIsSending(true);\n forgotPassword(email)\n .then(\n (response: any) => {\n setIsSending(false);\n setErrorMessage('');\n onSuccess();\n }\n )\n .catch((error: ErrorResult) => {\n setIsSending(false);\n setErrorMessage(getErrorByCode(error.code) || error.message);\n });\n }, [forgotPassword, onSuccess]);\n\n /**\n * @function handleBack - redirects to login page\n * @returns { void }\n */ \n const handleBack = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }, [history]);\n\n useHtmlPageTitle('Forgot Password');\n\n return <EnterEmailAddressView\n isSending={isSending}\n errorMessage={errorMessage}\n onClearError={handleClearError}\n onSend={handleSend}\n onBack={handleBack}\n />\n}\n\nexport default EnterEmailAddressController;","import EnterEmailAddressController from './controller';\n\nexport default EnterEmailAddressController;","export default __webpack_public_path__ + \"static/media/check-email.5fab1d4a.svg\";","import styled from 'styled-components';\n\nexport const Title = styled.div`\n position: relative;\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n width: 100%;\n text-align: center;\n padding-top: 12px;\n`;\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n text-align: center;\n padding-top: 8px;\n padding-bottom: 24px;\n`;\n","import { Button } from '../../../../../ui/components/Button';\nimport LoginAuthWrapper from '../../../../../ui/wrapper/LoginAuthWrapper';\nimport CheckEmailImage from '../../../../../assets/images/check-email.svg';\nimport { FurtherInstructionsViewProps } from './types';\nimport {\n Title,\n Description,\n} from './styles';\n\nfunction FurtherInstructionsView ({ onSubmit }: FurtherInstructionsViewProps) {\n return (\n <LoginAuthWrapper contentWidth={289} heightToShowScroll={350}>\n <img src={CheckEmailImage} width='48px' height='48px' alt='Check your email' />\n <Title>\n Check Your Email\n </Title>\n <Description>\n If you can’t find our message with reset instructions, look in your spam folder.\n </Description>\n <Button\n height='56px'\n width='289px'\n fontSize={15}\n action={onSubmit}\n >\n Got it\n </Button>\n\n </LoginAuthWrapper>\n );\n}\n\nexport default FurtherInstructionsView;\n","import { useCallback } from 'react';\nimport { useHistory } from '../../../../../tools/router';\nimport ROUTES from '../../../../../routes/routes';\nimport FurtherInstructionsView from './view';\n\nfunction FurtherInstructionsController () {\n const history = useHistory();\n\n /**\n * @function handleSubmit - redirects to login page\n * @returns { void }\n */ \n const handleSubmit = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }, [history]);\n\n return <FurtherInstructionsView onSubmit={handleSubmit} />\n}\n\nexport default FurtherInstructionsController;","import FurtherInstructionsController from './controller';\n\nexport default FurtherInstructionsController;","import { useHistory, useLocation } from 'react-router';\nimport ROUTES from '../../../routes/routes';\nimport EnterEmailAddress from './components/EnterEmailAddress';\nimport FurtherInstructions from './components/FurtherInstructions';\n\nfunction ForgotPasswordController () {\n const history = useHistory();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n\n /**\n * @function handleSuccess - shows instructions view\n * @returns { void }\n */ \n const handleSuccess = () =>\n history.push(`${ROUTES.AUTH_PAGES.FORGOT_PASSWORD}?instructions=true`);\n\n if (query.get('instructions') === 'true')\n return <FurtherInstructions />;\n return <EnterEmailAddress onSuccess={handleSuccess} />\n}\n\nexport default ForgotPasswordController;\n","import ForgotPasswordController from './controller';\n\nexport default ForgotPasswordController;","import React, { useContext } from 'react';\n\nexport interface BuildUrlOptions {\n path?: string;\n processData?: any;\n params?: {\n [keyof: string]: any;\n };\n query?: any;\n absolute?: boolean;\n}\n\nexport interface BuildApiUrlOptions extends BuildUrlOptions {\n isV2?: boolean;\n}\n\nexport interface UrlBuilder {\n buildCompanyUrl(params: BuildUrlOptions): string;\n buildAdminUrl(params: BuildUrlOptions): string;\n buildApiUrl(params: BuildApiUrlOptions): string;\n}\n\nexport const UrlBuilderContext = React.createContext<UrlBuilder>(\n undefined as any\n);\n\nexport function useUrlBuilder() {\n return useContext(UrlBuilderContext);\n}\n","import styled from 'styled-components';\n\nexport const StyledActionsDivs = styled.div<{\n flexDirection?: string;\n justifyContent?: string;\n alignItems?: string;\n marginTop?: number;\n padding?: string;\n}>`\n display: flex;\n flex-direction: ${props => props.flexDirection || 'row-reverse'};\n justify-content: ${props => props.justifyContent || 'space-between'};\n align-items: ${props => props.alignItems || 'normal'};\n margin-top: ${props => props.marginTop || 23}px;\n padding: ${props => (!!props.padding ? props.padding : '0px 5px')};\n flex-wrap: wrap-reverse;\n`;\n\nexport const StyledActionsLinks = styled.div<any>`\n display: flex;\n flex-direction: column;\n margin-top: ${props => props.marginTop || 0}px;\n`;\n\nexport const StyledActionsText = styled.div<{\n fontSize: number;\n fontWeight: string;\n}>`\n font-size: ${props => props.fontSize || 14}px;\n font-weight: ${props => props.fontWeight || 'normal'};\n color: ${props => props.theme.Colors.white};\n`;\n","import React, { FC, MouseEvent, ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport { Loading } from '../LoadingCopmonent';\n\nconst StyledLinkText = styled.a<{\n fontSize?: number;\n weight?: string;\n color?: string;\n disabled?: boolean;\n}>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.color\n ? props.color\n : props.theme.Colors.darkSkyBlue};\n font-size: ${props => props.fontSize || 13}px;\n cursor: pointer;\n font-weight: ${props => props.weight || 600};\n user-select: none;\n max-width: 100%;\n word-break: keep-all;\n height: 25px;\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n ${props => props.disabled && 'pointer-events: none'}\n`;\n\nexport const LinkText: FC<{\n weight?: string;\n fontSize?: number;\n children: ReactNode;\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\n className?: string;\n color?: string;\n loading?: boolean;\n disabled?: boolean;\n dataTest?: string;\n}> = ({\n weight,\n fontSize,\n children,\n onClick,\n className,\n color,\n loading,\n disabled,\n dataTest\n}) => {\n return (\n <StyledLinkText\n className={className}\n weight={weight}\n fontSize={fontSize}\n onClick={onClick}\n color={color}\n disabled={disabled}\n data-test={dataTest}\n >\n {loading ? <Loading /> : children}\n </StyledLinkText>\n );\n};\n\nexport default LinkText;\n","import styled from 'styled-components';\nimport LinkText from '../../../ui/components/LinkText/link-text';\n\nexport const StyledInputDivs = styled.div<{\n isMobile: boolean;\n marginBottom?: string;\n}>`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n > div {\n flex: 1;\n min-width: 100px;\n margin-bottom: ${props =>\n props.isMobile\n ? '8px'\n : !!props.marginBottom\n ? props.marginBottom\n : '16px'};\n }\n`;\n\nexport const ForgotPasswordLink = styled(LinkText)`\n padding: 0 0 0 5px;\n text-align: right;\n font-size: 13px;\n display: block;\n height: auto!important;\n`;\n\nexport const StyledLoginContent = styled.div`\n width: 100%;\n\n @media(max-height:650px) {\n padding-top: 30px;\n }\n`;\n\nexport const StyledSeparatorWrapper = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const StyledSeparator = styled.span<{ isMobile: boolean }>`\n height: 1.2px;\n background: ${props => props.theme.Colors.steelGrey};\n display: inline-block;\n width: ${props => (props.isMobile ? '81px' : '96px')};\n`;\n\nexport const StyledSeparatorText = styled.span<{ isMobile: boolean }>`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: ${props => (props.isMobile ? '13px' : '15px')};\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n margin: 0 12px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n","import React, { useState } from 'react';\nimport { Field, Form, Formik } from 'formik';\nimport { History } from 'history';\nimport * as Yup from 'yup';\n\nimport ROUTES from '../../../routes/routes';\nimport Validation from '../../../services/validation';\nimport { UrlBuilder, UrlBuilderContext } from '../../../tools/url/UrlBuilder';\nimport { StyledActionsDivs } from '../styles';\nimport { useHistory } from '../../../tools/router';\nimport { useAuthType } from '../store/services';\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../theme/variables';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport {\n StyledInputDivs,\n StyledLoginContent,\n} from './styles';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\nimport { AuthType } from '../../../api/auth/enums';\nimport { replaceUrlQueryParam } from '../../../routes/helpers';\nimport Storage from '../../../services/Storage';\n\nconst LoginSchema = Yup.object().shape({\n email: Validation.email,\n});\n\nconst NOT_FOUND_ACCOUNT_ERROR = 'Invalid Email';\n\nconst Login = () => {\n const [disabled, setDisabled] = useState(false);\n const history: History<any> = useHistory();\n const authType = useAuthType();\n const showMessage = useShowMessage();\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.smaller;\n\n const performLogin = (values: any, urlBuilder: UrlBuilder) => {\n setDisabled(true);\n\n authType({ email: values.email })\n .then((response: { type: AuthType; url?: string }) => {\n const url = response.url;\n if (url) {\n window.location.href = replaceUrlQueryParam(url, 'redirect_uri', window.location.origin + `/auth0-callback`);\n } else {\n Storage.set('temp_email', values.email);\n history.push(ROUTES.AUTH_PAGES.INTERNAL_LOGIN);\n }\n })\n .catch(error => {\n const errorMessage =\n error.code === 404\n ? NOT_FOUND_ACCOUNT_ERROR\n : error.message;\n setDisabled(false);\n showMessage(errorMessage, 'error');\n });\n };\n\n useHtmlPageTitle('Login');\n\n return (\n <UrlBuilderContext.Consumer>\n {urlBuilder => (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={650}>\n <StyledLoginContent>\n <Formik\n initialValues={{\n email: '',\n }}\n onSubmit={values => {\n performLogin(values, urlBuilder);\n }}\n validationSchema={LoginSchema}\n >\n {({ values, setFieldValue }) => (\n <Form>\n <StyledInputDivs isMobile={isMobile}>\n <Field\n type='text'\n component={FormikField}\n name='email'\n label='Email Address'\n height='56px'\n colorTheme='darkThree'\n fontSize='15px'\n handleChange={(\n e: React.ChangeEvent<HTMLInputElement>,\n ) => {\n setFieldValue(\n 'email',\n e\n ? e.target.value.trim()\n : '',\n );\n }}\n value={values.email}\n labelFontSize='15px'\n labelFontWeight={600}\n errorPadding='8px 5px 0 26px'\n errorColor={Variables.Colors.tomato}\n className='login-input'\n dataTest='login-email'\n />\n </StyledInputDivs>\n\n <StyledActionsDivs\n justifyContent='center'\n alignItems='center'\n flexDirection='column'\n marginTop={16}\n padding='0'\n >\n <Button\n disabled={!values.email || !/^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$/g.test(values.email)}\n height='56px'\n width='100%'\n loading={disabled}\n buttonWidth='100%'\n fontSize={15}\n dataTest='login-button'\n >\n Continue\n </Button>\n </StyledActionsDivs>\n </Form>\n )}\n </Formik>\n </StyledLoginContent>\n </LoginAuthWrapper>\n )}\n </UrlBuilderContext.Consumer>\n );\n};\n\nexport default Login;","import React, { FC, useEffect } from 'react';\nimport { History } from 'history';\nimport { useHistory } from 'react-router-dom';\nimport ROUTES from '../../../routes/routes';\nimport { useUserLogout } from '../store/services';\n\ninterface LogoutPageProps {\n history: History;\n loginUrl: string;\n onUserLogout: () => any;\n}\nconst LogoutPage: FC<LogoutPageProps> = ({\n history,\n loginUrl,\n onUserLogout,\n}) => {\n useEffect(() => {\n onUserLogout();\n history.push(loginUrl);\n }, [onUserLogout, loginUrl, history]);\n\n return null;\n};\n\nexport const LogoutPageContainer: FC<{\n loginUrl?: string;\n}> = ({ loginUrl }) => {\n const history = useHistory();\n const userLogout = useUserLogout();\n return (\n <LogoutPage\n history={history}\n loginUrl={loginUrl || ROUTES.AUTH_PAGES.LOGIN}\n onUserLogout={userLogout}\n />\n );\n};\n\nexport default LogoutPageContainer;\n","import { FormControl } from '@material-ui/core';\n\nimport styled from 'styled-components';\n\nexport const StyledForm = styled(FormControl)`\n &&& {\n width: 100%;\n min-width: 100px;\n margin-bottom: 16px;\n background: #171923;\n border-radius: 5px;\n height: 60px;\n\n .MuiInput-underline:before {\n display: none\n }\n\n .MuiInputBase-root {\n color: white;\n margin-top: 15px;\n margin-left: 15px\n }\n \n }\n`;\n","import { MenuItem, Select } from '@material-ui/core';\nimport { DEV_ENV_URLS } from '../../../constants/variables/general';\nimport { StyledForm } from './styles';\nimport { ApiPlatformViewProps } from './types';\n\nfunction ApiPlatformDropdownView({apiPlatform, onPlatformChange, dataTest}: ApiPlatformViewProps) {\n const handleChange = (event: any) => {\n onPlatformChange(event.target.value as string);\n };\n \n return <StyledForm>\n <Select\n value={apiPlatform}\n label=\"Platform\"\n onChange={handleChange}\n placeholder=\"Choose platform ✈ï¸\"\n data-test={dataTest}\n >\n {\n Object.keys(DEV_ENV_URLS).map((value) => {\n return <MenuItem value={value}>{value.toUpperCase()}</MenuItem>\n })\n }\n </Select>\n </StyledForm>\n}\n\nexport default ApiPlatformDropdownView","import { useMemo } from 'react';\nimport ApiPlatformDropdownView from \"./view\";\nimport localStorage from '../../../services/Storage';\nimport { ApiPlatformProps } from './types';\n\nfunction ApiPlatformDropdownController({ dataTest }: ApiPlatformProps) {\n const apiPlatform = useMemo(() => {\n return localStorage.get('apiPlatform') || 'develop';\n }, []);\n\n /**\n @function saveApiPlatform - changes platform in localstorage\n @param { string } value\n @returns { void }\n */\n const saveApiPlatform = (value: string) => {\n localStorage.set('apiPlatform', value || 'develop');\n window.location.reload();\n }\n\n return <ApiPlatformDropdownView\n apiPlatform={apiPlatform}\n onPlatformChange={saveApiPlatform}\n dataTest={dataTest}\n />\n}\n\nexport default ApiPlatformDropdownController;","import ApiPlatformDropdown from './controller';\n\nexport default ApiPlatformDropdown;","import styled from 'styled-components';\nimport LinkText from '../../../ui/components/LinkText/link-text';\n\nexport const StyledInputDivs = styled.div<{\n isMobile: boolean;\n marginBottom?: string;\n}>`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n > div {\n flex: 1;\n min-width: 100px;\n margin-bottom: ${props =>\n props.isMobile\n ? '8px'\n : !!props.marginBottom\n ? props.marginBottom\n : '16px'};\n }\n input:disabled {\n color: ${props => props.theme.Colors.steelGrey};\n }\n`;\n\nexport const ForgotPasswordLink = styled(LinkText)`\n padding: 0 0 0 5px;\n text-align: right;\n font-size: 13px;\n display: block;\n height: auto!important;\n`;\n\nexport const StyledLoginContent = styled.div`\n width: 100%;\n\n @media(max-height:650px) {\n padding-top: 30px;\n }\n`;\n\nexport const StyledSeparatorWrapper = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const StyledSeparator = styled.span<{ isMobile: boolean }>`\n height: 1.2px;\n background: ${props => props.theme.Colors.steelGrey};\n display: inline-block;\n width: ${props => (props.isMobile ? '81px' : '96px')};\n`;\n\nexport const StyledSeparatorText = styled.span<{ isMobile: boolean }>`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: ${props => (props.isMobile ? '13px' : '15px')};\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n margin: 0 12px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n","import React, { useState } from 'react';\nimport { Field, Form, Formik } from 'formik';\nimport { History } from 'history';\nimport * as Yup from 'yup';\n\nimport ROUTES from '../../../routes/routes';\nimport Storage from '../../../services/Storage';\nimport Validation from '../../../services/validation';\nimport { UrlBuilder, UrlBuilderContext } from '../../../tools/url/UrlBuilder';\nimport { StyledActionsDivs } from '../styles';\nimport { useHistory } from '../../../tools/router';\nimport { useLogin } from '../store/services';\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../theme/variables';\nimport {\n setAuthToken,\n redirectAfterLogin,\n} from '../../../helpers/functions/auth-helpers';\nimport { useRedirectToPhoneVerification } from '../../../helpers/hooks/useRedirectToPhoneVerification';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport ApiPlatformDropdown from '../ApiPlatformDropdown';\nimport {\n StyledInputDivs,\n ForgotPasswordLink,\n StyledLoginContent,\n StyledSeparatorWrapper,\n StyledSeparator,\n StyledSeparatorText,\n} from './styles';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nconst InternalLoginSchema = Yup.object().shape({\n email: Validation.email,\n password: Validation.loginPassword,\n});\n\nconst NOT_FOUND_ACCOUNT_ERROR = 'Invalid Email Address or Password';\n\nconst InternalLogin = () => {\n const [disabled, setDisabled] = useState(false);\n const history: History<any> = useHistory();\n const from = history.location.state?.from as Location;\n const login = useLogin();\n const showMessage = useShowMessage();\n const windowDimensions = useWindowDimensions();\n const redirectToPhoneVerification = useRedirectToPhoneVerification();\n const isMobile = windowDimensions.width < Variables.BreakPoints.smaller;\n const envName = process.env.REACT_APP_DEV_ENV;\n\n const performLogin = (values: any, urlBuilder: UrlBuilder) => {\n setDisabled(true);\n login({ login: values.email, password: values.password })\n .then((response: { user: UserV2; token: string }) => {\n const user = response.user;\n if (!user.phoneNumberVerified) {\n Storage.set('temp_token', response.token);\n redirectToPhoneVerification({ user, from });\n } else {\n setAuthToken(user, response.token);\n redirectAfterLogin(\n history,\n urlBuilder,\n user,\n response.token,\n from,\n );\n }\n })\n .catch(error => {\n const errorMessage =\n error.code === 404\n ? NOT_FOUND_ACCOUNT_ERROR\n : error.message;\n setDisabled(false);\n showMessage(errorMessage, 'error');\n });\n };\n\n const forgotPasswordAction = (): void => {\n history.push('/forgot');\n };\n\n const mobileNumberLoginAction = (): void => {\n history.push(ROUTES.AUTH_PAGES.MOBILE_NUMBER_LOGIN);\n };\n\n useHtmlPageTitle('Internal Login');\n\n return (\n <UrlBuilderContext.Consumer>\n {urlBuilder => (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={650}>\n <StyledLoginContent>\n {['dev', 'local'].includes(envName as string) && (\n <ApiPlatformDropdown dataTest='api-platform-selector' />\n )}\n <Formik\n initialValues={{\n email: Storage.get('temp_email') || '',\n password: '',\n }}\n onSubmit={values => {\n performLogin(values, urlBuilder);\n }}\n validationSchema={InternalLoginSchema}\n >\n {({ values }) => (\n <Form>\n <StyledInputDivs isMobile={isMobile}>\n <Field\n type='email-with-edit-link'\n component={FormikField}\n name='email'\n label='Email Address'\n height='56px'\n colorTheme='darkThree'\n fontSize='15px'\n disabled={true}\n value={values.email}\n labelFontSize='15px'\n labelFontWeight={600}\n errorPadding='8px 5px 0 26px'\n errorColor={Variables.Colors.tomato}\n className='login-input'\n dataTest='login-email'\n />\n </StyledInputDivs>\n\n <StyledInputDivs\n isMobile={isMobile}\n marginBottom='8px'\n >\n <Field\n type='password-with-eye'\n component={FormikField}\n name='password'\n label='Password'\n height='56px'\n colorTheme='darkThree'\n fontSize='15px'\n labelFontSize='15px'\n labelFontWeight={600}\n errorPadding='8px 5px 0 26px'\n errorColor={Variables.Colors.tomato}\n className='login-input'\n dataTest='login-password'\n />\n </StyledInputDivs>\n <ForgotPasswordLink\n onClick={forgotPasswordAction}\n dataTest='forgot-password'\n >\n Forgot Password?\n </ForgotPasswordLink>\n <StyledActionsDivs\n justifyContent='center'\n alignItems='center'\n flexDirection='column'\n marginTop={16}\n padding='0'\n >\n <Button\n height='56px'\n width='100%'\n loading={disabled}\n buttonWidth='100%'\n fontSize={16}\n dataTest='login-button'\n >\n Log In\n </Button>\n </StyledActionsDivs>\n <StyledActionsDivs\n marginTop={20}\n padding='0'\n >\n <StyledSeparatorWrapper>\n <StyledSeparator\n isMobile={isMobile}\n />\n <StyledSeparatorText\n isMobile={isMobile}\n data-test='login-button-separator'\n >\n or log in with\n </StyledSeparatorText>\n <StyledSeparator\n isMobile={isMobile}\n />\n </StyledSeparatorWrapper>\n </StyledActionsDivs>\n <StyledActionsDivs\n justifyContent='center'\n alignItems='center'\n flexDirection='column'\n marginTop={8}\n padding='0'\n >\n <Button\n type='button'\n height='56px'\n width='100%'\n buttonWidth='100%'\n variant='inverse'\n fontSize={15}\n action={mobileNumberLoginAction}\n dataTest='mobile-number-button'\n >\n Mobile Number\n </Button>\n </StyledActionsDivs>\n </Form>\n )}\n </Formik>\n </StyledLoginContent>\n </LoginAuthWrapper>\n )}\n </UrlBuilderContext.Consumer>\n );\n};\n\nexport default InternalLogin;","import * as Yup from 'yup';\nimport Validation from '../../../services/validation';\n\nexport const EXPIRED_TOKEN_MESSAGE = 'This link has expired or broken. Click \"Forgot Password?\" again to request a new link.';\n\nexport const ResetPasswordSchema = Yup.object().shape({\n password: Validation.password,\n confirmPassword: Validation.confirmPassword\n .oneOf([Yup.ref('password'), null], 'New Password and Confirm Password do not match.'),\n});","import styled from 'styled-components';\n\nexport const Container = styled.div`\n @media(max-height:600px) {\n padding-top: 30px;\n }\n`;\n\nexport const Title = styled.div`\n position: relative;\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n width: 100%;\n text-align: center;\n`;\n\nexport const BackArrow = styled.img`\n position: absolute;\n top: 7px;\n left: 0;\n cursor: pointer;\n width: 16px;\n height: 14px;\n`;\n\nexport const GeneralError = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-red-main);\n padding-top: 16px;\n text-align: center;\n width: 90%;\n`\n\nexport const FormContainer = styled.div`\n width: 100%;\n`;\n\nexport const FieldContainer = styled.div`\n margin-top: 16px;\n min-height: 78px;\n\n .login-input-container + div {\n line-height: 18px;\n }\n`;\n\nexport const ButtonContainer = styled.div`\n margin-top: 16px;\n`;\n\nexport const FooterText = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-white-1);\n padding-top: 20px;\n text-align: center;\n\n a {\n color: var(--ps-blue-main);\n text-decoration: none;\n }\n`;","import { ChangeEvent } from 'react';\nimport { Field, Form, Formik } from 'formik';\nimport { Variables } from '../../../theme/variables';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport BackArrowImage from '../../../assets/images/icons/back-arrow.svg';\nimport { ResetPasswordSchema } from './constants';\nimport { ResetPasswordViewProps } from './types';\nimport {\n Container,\n Title,\n BackArrow,\n GeneralError,\n FormContainer,\n FieldContainer,\n ButtonContainer,\n FooterText\n} from './styles';\n\nfunction ResetPasswordView ({\n isSubmitting,\n errorMessage,\n onClearError,\n onSubmit,\n onBack\n}: ResetPasswordViewProps) {\n return (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={600}>\n <Container>\n <Title>\n <BackArrow src={BackArrowImage} onClick={onBack} />\n Reset Password\n </Title>\n {\n !!errorMessage && (\n <GeneralError>{errorMessage}</GeneralError>\n )\n }\n <FormContainer>\n <Formik\n initialValues={{\n password: '',\n confirmPassword: ''\n }}\n onSubmit={values => onSubmit(values.password)}\n validationSchema={ResetPasswordSchema}\n >\n {({ values, setFieldValue }) => (\n <Form>\n <FieldContainer>\n <Field\n type=\"password-with-eye\"\n component={FormikField}\n name=\"password\"\n label=\"New Password\"\n height=\"56px\"\n colorTheme=\"darkThree\"\n fontSize=\"15px\"\n value={values.password}\n labelFontSize=\"15px\"\n labelFontWeight={600}\n errorColor={Variables.Colors.tomato}\n className=\"login-input\"\n dataTest=\"new-password\"\n hint='Password must be 8 characters long.'\n handleChange={(e: ChangeEvent<HTMLInputElement>) => {\n setFieldValue('password', e.target.value);\n onClearError();\n }}\n />\n </FieldContainer>\n <FieldContainer>\n <Field\n type=\"password-with-eye\"\n component={FormikField}\n name=\"confirmPassword\"\n label=\"Confirm Password\"\n height=\"56px\"\n colorTheme=\"darkThree\"\n fontSize=\"15px\"\n value={values.confirmPassword}\n labelFontSize=\"15px\"\n labelFontWeight={600}\n errorColor={Variables.Colors.tomato}\n className=\"login-input\"\n dataTest=\"confirm-password\"\n handleChange={(e: ChangeEvent<HTMLInputElement>) => {\n setFieldValue('confirmPassword', e.target.value);\n onClearError();\n }}\n />\n </FieldContainer>\n <ButtonContainer>\n <Button\n height='56px'\n width='343px'\n fontSize={15}\n loading={isSubmitting}\n disabled={!values.password || !values.confirmPassword}\n >\n Reset Password\n </Button>\n </ButtonContainer>\n <FooterText>\n If you're having trouble accessing the product, please let us know at <a href='mailto:support@gopractis.com'>support@gopractis.com</a>.\n </FooterText>\n </Form>\n )}\n </Formik>\n </FormContainer>\n </Container>\n </LoginAuthWrapper>\n );\n}\n\nexport default ResetPasswordView;\n","import { useState, useCallback } from 'react';\nimport { useHistory, useLocation } from 'react-router';\nimport ROUTES from '../../../routes/routes';\nimport { useResetPasswordApi } from '../../../api';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport ResetPasswordView from './view';\nimport { EXPIRED_TOKEN_MESSAGE } from './constants';\nimport { ROLE_NAMES } from '../../../constants/enums';\n\nconst qs = require('query-string');\n\nfunction ResetPasswordController () {\n const history = useHistory();\n const location = useLocation();\n const queryParams = qs.parse(location.search);\n const resetPasswordApi = useResetPasswordApi();\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n /**\n * @function handleSubmit - sends reset password request to API\n * @param { string } password\n * @returns { void }\n */ \n const handleSubmit = useCallback((password: string) => {\n setIsSubmitting(true);\n resetPasswordApi(password, queryParams.token)\n .then(() => {\n history.push(queryParams.role?.trim() === ROLE_NAMES.USER\n ? ROUTES.AUTH_PAGES.TRAINEE_LOGIN\n : ROUTES.AUTH_PAGES.LOGIN);\n })\n .catch((error: ErrorResult) => {\n setIsSubmitting(false);\n setErrorMessage(\n error.code === 401\n ? EXPIRED_TOKEN_MESSAGE\n : error.message\n );\n });\n }, [history, queryParams, resetPasswordApi]);\n\n /**\n * @function handleClearErrorMessage - clears general error message\n * @returns { void }\n */ \n const handleClearErrorMessage = () => {\n setIsSubmitting(false);\n setErrorMessage('');\n };\n\n /**\n * @function handleBack - redirects to login page\n * @returns { void }\n */ \n const handleBack = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }, [history]);\n \n return <ResetPasswordView\n isSubmitting={isSubmitting}\n errorMessage={errorMessage}\n onBack={handleBack}\n onClearError={handleClearErrorMessage}\n onSubmit={handleSubmit}\n />\n}\n\nexport default ResetPasswordController;\n","import ResetPasswordController from \"./controller\";\n\nexport default ResetPasswordController;","import styled from 'styled-components';\n\nexport const StyledCard = styled.div`\n background: var(--ps-white-1);\n border-radius: 24px;\n width: 520px;\n padding: 8px 24px 24px 24px;\n`;\n\nexport const Item = styled.div`\n padding: 4px 0;\n display: flex;\n`;\n\nexport const Label = styled.strong`\n display: block;\n width: 70px;\n`;\n\nexport const Value = styled.div`\n margin-left: 8px;\n`;","import React from 'react';\nimport { getConfig } from '../../tools/config';\nimport LoginAuthWrapper from '../../ui/wrapper/LoginAuthWrapper';\nimport {\n StyledCard,\n Item,\n Label,\n Value\n} from './styles';\n\nfunction tryParseBuildId(buildId: string | undefined) {\n if (buildId) {\n try {\n return parseInt(buildId);\n } catch {}\n }\n return buildId;\n}\n\nexport const Health: React.FC = () => {\n const config = getConfig();\n return (\n <LoginAuthWrapper hideLogo={true}>\n <StyledCard>\n <h1>About App</h1>\n <Item>\n <Label>Version:</Label>\n <Value id=\"app_version\">{config.APP_VERSION}</Value>\n </Item>\n <Item>\n <Label>Build #:</Label>\n <Value id=\"build_number\">\n {tryParseBuildId(config.BUILD_ID)}\n </Value>\n </Item>\n <Item>\n <Label>Commit:</Label>\n <Value id=\"commit_id\">{config.COMMIT_ID}</Value>\n </Item>\n </StyledCard>\n </LoginAuthWrapper>\n );\n};\n\nexport default Health;\n","import React, { FC } from 'react';\nimport { Redirect, Route, RouteProps } from 'react-router-dom';\nimport { CompanyInterface } from '../constants/interfaces/Company';\nimport { UserInterface } from '../constants/interfaces/User';\nimport Storage from '../services/Storage';\nimport ROUTES from './routes';\n\nconst isAuthorized = () => {\n return !!Storage.get('token');\n};\n\nconst RedirectToUrl: React.FC<{ url: string }> = ({ url }) => {\n window.location.href = url;\n return null;\n};\n\nexport interface PrivateRouterProps extends RouteProps {\n component?: any;\n customPath?: string;\n path?: string;\n profile?: UserInterface;\n company?: CompanyInterface;\n editable?: boolean;\n url?: string;\n propsData?: any;\n}\n\nconst PrivateRoute: FC<PrivateRouterProps> = ({\n component: Component,\n customPath,\n url,\n children,\n propsData,\n ...rest\n}) => {\n return (\n <Route\n {...rest}\n render={props => {\n return isAuthorized() ? (\n Component ? (\n <Component {...props} {...rest} {...propsData} />\n ) : (\n <>{children}</>\n )\n ) : url ? (\n <RedirectToUrl url={url} />\n ) : (\n <Redirect\n to={{\n pathname: customPath\n ? customPath\n : ROUTES.AUTH_PAGES.LOGIN,\n state: { from: props.location },\n }}\n />\n );\n }}\n />\n );\n};\n\nexport default PrivateRoute;\n","import styled from \"styled-components\";\n\nexport const ProfilePageContainer = styled.div`\n \n`;\n\nexport const Title = styled.div`\n font-size: 20px;\n color: ${props => props.theme.Colors.dark};\n margin-bottom: 40px;\n`;\n\nexport const Content = styled.div`\n\n`;\nexport const Actions = styled.div`\n margin-top: 30px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const PhotoLoadingContainer = styled.div`\n position: absolute;\n z-index: 1;\n display: flex;\n width: 134px;\n height: 134px;\n justify-content: center;\n align-items: center;\n`","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const AddUser = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 40 40\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n id=\"a\"\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M846.8 410.8h-3.6v3.9c0 .717-.538 1.3-1.2 1.3-.662 0-1.2-.582-1.2-1.3v-3.9h-3.6c-.662 0-1.2-.582-1.2-1.3 0-.718.538-1.3 1.2-1.3h3.6v-3.898c0-.719.538-1.302 1.2-1.302.663 0 1.2.582 1.2 1.302v3.899h3.6c.662 0 1.2.581 1.2 1.3 0 .717-.538 1.3-1.2 1.3zm-14.448-9.39c1.286.321 3.161.804 5.021 1.326-.874.597-1.621 1.352-2.266 2.188-1.512-.406-3.098-.813-4.608-1.176v-3.96c3.133-2.134 4.99-6.769 4.99-10.981 0-5.697-1.457-10.317-8.743-10.317-7.285 0-8.743 4.62-8.743 10.317 0 4.216 1.86 8.855 4.998 10.987v3.991c-4.725 1.112-10.211 2.635-11.473 3.326-.817 1.03-1.53 4.33-1.023 6.393h22.846c.23.888.58 1.721 1.03 2.496h-25.253c-1.954-3-1.162-8.998.793-10.995.93-.952 7.909-2.752 11.249-3.571-3.528-2.74-5.678-7.825-5.678-12.673 0-7.048 2.046-12.761 11.254-12.761S838 381.713 838 388.761c0 4.834-2.14 9.903-5.648 12.65z\"\n transform=\"translate(-808 -376)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default AddUser;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport AddUser from '../../icons/AddUser';\n\nconst StyledUploadContainer = styled.div<{ marginTop?: string }>`\n margin-top: ${props => props.marginTop || '24px'};\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledUploadImage = styled.div<{\n backgroundColor?: string;\n height: number;\n width: number;\n}>`\n width: ${props => props.width}px;\n height: ${props => props.height}px;\n border-radius: 8px;\n max-width: 100%;\n background-color: ${props =>\n props.backgroundColor || props.theme.Colors.darkTwo};\n border: 1px solid ${props => props.theme.Colors.paleGrey};\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n user-select: none;\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst StyledImage = styled.img<{ opacity?: number; border?: string }>`\n width: 100%;\n min-width: 25px;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n opacity: 0.7;\n`;\n\nconst CustomPlaceholderContainer = styled.div`\n width: 40px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst StyledDescription = styled.div<{ fontSize?: number }>`\n font-size: ${props => (props.fontSize ? props.fontSize : 15)}px;\n text-align: center;\n color: ${props => props.theme.Colors.steelGrey};\n margin-top: 11px;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst UploadPhoto: FC<{\n currentImage?: string;\n customPlaceholder?: any;\n handleChange?: any;\n showCustomDescription?: boolean;\n backgroundColor?: string;\n marginTop?: string;\n className?: string;\n fontSize?: number;\n width?: number;\n height?: number;\n disabled?: boolean;\n}> = ({\n currentImage,\n customPlaceholder: PlaceholderIcon,\n handleChange,\n showCustomDescription,\n backgroundColor,\n marginTop,\n children,\n className,\n fontSize,\n width,\n height,\n disabled,\n}) => {\n let upload: any;\n return (\n <StyledUploadContainer marginTop={marginTop} className={className}>\n <input\n id=\"myInput\"\n type=\"file\"\n ref={ref => (upload = ref)}\n style={{ display: 'none' }}\n onChange={e => handleChange(e)}\n disabled={disabled}\n />\n <StyledUploadImage\n height={height ? height : 136}\n width={width ? width : 136}\n onClick={() => upload.click()}\n backgroundColor={backgroundColor}\n data-test=\"uploaded-image-section\"\n >\n {currentImage ? (\n <StyledImage src={currentImage} />\n ) : PlaceholderIcon ? (\n <CustomPlaceholderContainer data-test=\"upload-placeholder-container\">\n <PlaceholderIcon />\n </CustomPlaceholderContainer>\n ) : (\n <CustomPlaceholderContainer>\n <AddUser />\n </CustomPlaceholderContainer>\n )}\n </StyledUploadImage>\n {(!!showCustomDescription && (\n <StyledDescription onClick={() => upload.click()}>\n {children}\n </StyledDescription>\n )) || (\n <StyledDescription\n onClick={() => upload.click()}\n fontSize={fontSize}\n >\n <div>JPG, PNG, BMP only. </div>\n <div>Less than 10 MB</div>\n </StyledDescription>\n )}\n </StyledUploadContainer>\n );\n};\n\nexport default UploadPhoto;\n","import { Field, Form, Formik } from 'formik';\nimport { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport * as Yup from 'yup';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport Validation from '../../../services/validation';\nimport { StyledActionsDivs, StyledActionsLinks } from '../../Auth/styles';\nimport { Content, PhotoLoadingContainer } from './styles';\nimport { Variables } from '../../../theme/variables';\nimport UploadPhoto from '../../../ui/components/UploadPhoto/UploadPhoto';\nimport LinkText from '../../../ui/components/LinkText/link-text';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport { useShowConfirmModalDialog } from '../../../ui/components/ModalDialogs/store/actions';\nimport { isPractisAdminRole } from '../../../constants/enums';\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\n\nconst ProfilePageContainer = styled.div``;\n\nconst StyledContentHeader = styled.div``;\n\nconst UserInfoForm = styled.div`\n padding: 24px 0 0 0;\n`;\n\nconst Divider = styled.div`\n width: 100%;\n height: 1px;\n border: none;\n margin: 0;\n flex-shrink: 0;\n background-color: ${props => props.theme.Colors.paleGrey};\n`;\n\nconst StyledUploadPhoto = styled(UploadPhoto)`\n flex-direction: row;\n flex-wrap: wrap;\n position: relative;\n`;\n\nconst StyledDeleteButton = styled.div`\n margin-right: 8px;\n`;\n\nconst UploadPictureLink = styled(LinkText)`\n text-align: left;\n margin-bottom: 8px;\n font-size: 15px;\n font-weight: 600;\n display: block;\n`;\n\nconst StyledDescription = styled.div`\n width: 192px;\n height: 40px;\n color: ${props => props.theme.Colors.steelGrey};\n display: flex;\n flex-direction: column;\n text-align: left;\n flex: 1;\n`;\n\nconst StyledUploadContainer = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 24px;\n`;\n\nconst StyledUploadLink = styled.div`\n margin-left: 38px;\n`;\n\nconst InputWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n margin-bottom: 16px;\n`;\n\nconst NoticeWrapper = styled.div`\n margin-bottom: 40px;\n display: flex;\n justify-content: flex-end;\n padding-right: 8px;\n`;\n\nconst Notice = styled.div`\n width: calc(50% - 20px);\n height: 40px;\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst Separator = styled.div`\n height: 1px;\n width: 16px;\n`;\n\ninterface Values {\n firstName: string;\n lastName: string;\n phoneNumber?: string;\n email?: string;\n}\n\nexport const ProfileInfo: FC<{\n profile: UserV2;\n company?: CompanyInterface\n editable?: boolean;\n updateUserProfile(\n data: Partial<UserV2>,\n userId: number\n ): void;\n uploadUserPicture(userId: number, file: File): void;\n deleteUser?(userId: number): void;\n self?: boolean;\n dataTest?: string;\n isPhotoUploading: boolean;\n}> = ({\n profile,\n company,\n editable,\n updateUserProfile,\n uploadUserPicture,\n deleteUser,\n self,\n dataTest,\n isPhotoUploading,\n}) => {\n let validationSchema;\n const isPractisAdmin = isPractisAdminRole(profile.role?.name);\n const isSSOAuth = company?.isSSOEnabled;\n\n if (self && profile.phoneNumber && profile.phoneNumber.length > 0) {\n validationSchema = Yup.object().shape<Values>({\n firstName: Validation.firstName,\n lastName: Validation.lastName,\n phoneNumber: Validation.phoneNumber,\n email: Validation.email,\n });\n } else {\n validationSchema = Yup.object().shape<Values>({\n firstName: Validation.firstName,\n lastName: Validation.lastName,\n });\n }\n\n const handleUpload = useCallback(\n (e: any) => {\n e.persist();\n let file = e.target.files[0] as File;\n uploadUserPicture(profile.id!, file);\n },\n [profile, uploadUserPicture]\n );\n\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const handelDelete = useCallback(() => {\n showConfirmationModalDialog({\n modalTitle: 'Deactivate Practis Admin account?',\n description:\n 'Deactivating this account can not be undone. Are you sure?',\n onConfirm: () => deleteUser?.(profile.id!),\n confirmButtonText: 'Yes, Deactivate',\n });\n }, [showConfirmationModalDialog, deleteUser, profile.id]);\n\n return (\n <ProfilePageContainer>\n <Content>\n <StyledContentHeader>\n {editable && (\n <StyledUploadContainer>\n {isPhotoUploading &&\n <PhotoLoadingContainer>\n <Loading size={30} />\n </PhotoLoadingContainer>\n }\n <StyledUploadPhoto\n marginTop=\"0px\"\n currentImage={\n profile?.imageUrl\n }\n handleChange={handleUpload}\n showCustomDescription={true}\n backgroundColor={Variables.Colors.whiteFive}\n disabled={isPhotoUploading}\n data-test={`${dataTest}-upload-photo`}\n >\n <StyledUploadLink>\n <UploadPictureLink\n dataTest={`${dataTest}-upload-text`}\n >\n Upload a new picture\n </UploadPictureLink>\n <StyledDescription\n data-test={`${dataTest}-upload-description`}\n >\n <div>JPG, PNG, BMP only.</div>\n <div>Less than 10 MB</div>\n </StyledDescription>\n </StyledUploadLink>\n </StyledUploadPhoto>\n </StyledUploadContainer>\n )}\n </StyledContentHeader>\n <Divider />\n <Formik<Values>\n initialValues={{\n firstName: profile.firstName ? profile.firstName : '',\n lastName: profile.lastName ? profile.lastName : '',\n phoneNumber: profile.phoneNumber\n ? profile.phoneNumber\n : '',\n email: profile.email ? profile.email : '',\n }}\n enableReinitialize={true}\n onSubmit={values => {\n let sendValues;\n if (\n self &&\n profile.phoneNumber !== values.phoneNumber\n ) {\n sendValues = {\n firstName: values.firstName,\n lastName: values.lastName,\n phoneNumber: values.phoneNumber,\n };\n } else {\n sendValues = {\n firstName: values.firstName,\n lastName: values.lastName,\n };\n }\n updateUserProfile(sendValues, profile.id!);\n }}\n validationSchema={validationSchema}\n >\n {({ values, setFieldValue }) => {\n const profilePhoneNumber = profile.phoneNumber\n ? profile.phoneNumber\n : '';\n const valuesUpdated =\n values.email !== profile.email ||\n values.firstName !== profile.firstName ||\n values.lastName !== profile.lastName ||\n values.phoneNumber !== profilePhoneNumber;\n\n const valuesMissing =\n !values.firstName || !values.lastName;\n\n return (\n <Form>\n <UserInfoForm>\n <InputWrapper>\n <Field\n type=\"text\"\n component={FormikField}\n maxLength={100}\n name=\"firstName\"\n label=\"First Name\"\n disabled={isPractisAdmin || !editable || isSSOAuth}\n background={\n Variables.Colors.fadedRed\n }\n />\n <Separator />\n <Field\n type=\"text\"\n component={FormikField}\n maxLength={100}\n name=\"lastName\"\n label=\"Last Name\"\n disabled={isPractisAdmin || !editable || isSSOAuth}\n />\n </InputWrapper>\n <InputWrapper>\n <Field\n type=\"email\"\n component={FormikField}\n name=\"email\"\n label=\"Email\"\n disabled={true}\n background={Variables.Colors.white}\n />\n <Separator />\n <Field\n type=\"phone\"\n component={FormikField}\n onChange={(e: string) => {\n setFieldValue(\n 'phoneNumber',\n e ? e : ''\n );\n }}\n name=\"phoneNumber\"\n label=\"Mobile Number\"\n background={\n Variables.Colors.whiteFive\n }\n fontColor={Variables.Colors.black}\n labelColor={\n Variables.Colors.steelGrey\n }\n disabled={!editable || !self || isSSOAuth}\n dataTest={`${dataTest}-phone-number`}\n />\n </InputWrapper>\n {self && (\n <NoticeWrapper>\n <Notice>\n Updating your number requires\n verification via SMS. Carrier\n fees may apply.\n </Notice>\n </NoticeWrapper>\n )}\n </UserInfoForm>\n\n <Divider />\n {editable && (\n <StyledActionsDivs justifyContent=\"initial\">\n <Button\n height={'40px'}\n width={'120px'}\n disabled={\n !valuesUpdated || valuesMissing\n }\n dataTest={`${dataTest}-update`}\n >\n Update\n </Button>\n {!!deleteUser && (\n <StyledDeleteButton>\n <Button\n height={'40px'}\n width={'120px'}\n type=\"button\"\n color=\"warning\"\n action={handelDelete}\n dataTest={`${dataTest}-delete`}\n >\n Deactivate\n </Button>\n </StyledDeleteButton>\n )}\n <StyledActionsLinks />\n </StyledActionsDivs>\n )}\n </Form>\n );\n }}\n </Formik>\n </Content>\n </ProfilePageContainer>\n );\n};\n\nexport const ProfileInfoContainer: FC<{\n profile: UserV2;\n company?: CompanyInterface,\n editable: boolean;\n updateUserProfile(data: UserV2, userId: number): void;\n uploadUserPicture(userId: number, file: File): void;\n deleteUser?(userId: number): void;\n self?: boolean;\n dataTest?: string;\n isPhotoUploading: boolean;\n}> = ({\n profile,\n company,\n editable,\n updateUserProfile,\n uploadUserPicture,\n deleteUser,\n self,\n dataTest,\n isPhotoUploading,\n}) => {\n return (\n <ProfileInfo\n profile={profile}\n company={company}\n editable={editable}\n updateUserProfile={updateUserProfile}\n uploadUserPicture={uploadUserPicture}\n deleteUser={deleteUser}\n self={self}\n dataTest={dataTest}\n isPhotoUploading={isPhotoUploading}\n />\n );\n};\n\nexport default ProfileInfoContainer;\n\n","import { Field, Form, Formik } from 'formik';\nimport React, { FC, useState } from 'react';\nimport * as Yup from 'yup';\nimport styled, { css } from 'styled-components';\n\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport Validation from '../../../services/validation';\nimport { StyledActionsDivs, StyledActionsLinks } from '../../Auth/styles';\nimport { getProfileError, getProfileState } from '../store/reducers';\nimport { useSelector } from 'react-redux';\nimport { FormikField } from '../../../ui/components/FormikField';\nimport { Button } from '../../../ui/components/Button';\nimport { UpdatePasswordType } from '../../../api/users/types';\n\nconst ProfilePageContainer = styled.div`\n min-width: 200px;\n`;\n\nconst UserInfoForm = styled.div`\n padding-bottom: 8px;\n`;\n\nconst Divider = styled.div`\n width: 100%;\n height: 1px;\n border: none;\n margin: 0;\n flex-shrink: 0;\n background-color: ${props => props.theme.Colors.paleGrey};\n`;\n\nconst Separator = styled.div`\n height: 1px;\n width: 16px;\n`;\n\nconst InputItem = styled.div`\n min-width: 150px;\n flex: 1;\n margin-bottom: 16px;\n`;\n\nconst InputWrapper = styled.div<{ marginBottom?: number }>`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n ${({ marginBottom }) => css`margin-bottom: ${marginBottom}px;`}\n`;\n\nconst Content = styled.div``;\n\nconst validationSchemaDefault = Yup.object().shape({\n password: Validation.password,\n confirmPassword: Validation.confirmPassword,\n});\n\nconst validationSchemaWithCurrentPassword = Yup.object().shape({\n password: Validation.password,\n confirmPassword: Validation.confirmPassword,\n currentPassword: Validation.currentPassword,\n});\n\nexport const Security: FC<{\n profile: UserProfile;\n updateUserPassword(data: UpdatePasswordType, userId: number): void;\n dataTest?: string;\n}> = ({ profile, updateUserPassword, dataTest }) => {\n const selfProfile = useSelector(getProfileState);\n const isSelf = selfProfile?.id === profile?.id;\n const error = useSelector(getProfileError);\n \n const [showCurrentPasswordError, setShowCurrentPasswordError] = useState(true);\n const currentPasswordError = isSelf && error?.errorCode === 409 && showCurrentPasswordError && 'Incorrect password.';\n\n\n return (\n <ProfilePageContainer>\n <Content>\n <Formik\n initialValues={{\n password: '',\n confirmPassword: '',\n currentPassword: '',\n }}\n onSubmit={(values, actions) => {\n isSelf && setShowCurrentPasswordError(true);\n const updateValues = {\n password: values.password,\n currentPassword: values.currentPassword,\n };\n updateUserPassword(updateValues, profile.id!);\n }}\n validationSchema={isSelf ? validationSchemaWithCurrentPassword : validationSchemaDefault}\n >\n {({ values }) => (\n <Form>\n <UserInfoForm>\n {isSelf && (\n <InputWrapper marginBottom={16}>\n <InputItem>\n <Field\n type=\"password\"\n component={FormikField}\n autoComplete=\"current-password\"\n name=\"currentPassword\"\n label=\"Current Password\"\n customError={currentPasswordError}\n validate={() => setShowCurrentPasswordError(false)}\n />\n </InputItem>\n <Separator />\n <InputItem />\n </InputWrapper>\n )}\n <InputWrapper marginBottom={20}>\n <InputItem>\n <Field\n type=\"password\"\n component={FormikField}\n autoComplete=\"new-password\"\n name=\"password\"\n label=\"New Password\"\n dataTest={`${dataTest}-new-password`}\n />\n </InputItem>\n <Separator />\n <InputItem>\n <Field\n type=\"password\"\n component={FormikField}\n autoComplete=\"confirm-new-password\"\n name=\"confirmPassword\"\n label=\"Confirm Password\"\n dataTest={`${dataTest}-confirm-password`}\n />\n </InputItem>\n </InputWrapper>\n </UserInfoForm>\n <Divider />\n <StyledActionsDivs>\n <Button\n height={'40px'}\n width={'120px'}\n disabled={\n !values.password ||\n !values.confirmPassword ||\n (isSelf && !values.currentPassword)\n }\n dataTest={`${dataTest}-update`}\n >\n Update\n </Button>\n <StyledActionsLinks />\n </StyledActionsDivs>\n </Form>\n )}\n </Formik>\n </Content>\n </ProfilePageContainer>\n );\n};\n\nexport default Security;\n","import { Action } from 'redux';\n\nexport const decapsulateAction = <T extends Action>(\n encapsulateTerm: string,\n action: T\n): T => ({ ...action, type: action.type.replace(encapsulateTerm, '') });\n","import { Reducer } from 'redux';\nimport { cloneDeep } from 'lodash';\n\nimport { Config } from './types';\nimport { Actions } from './actions';\nimport { decapsulateAction } from '../../../../../store/helpers/decapsulateAction';\nimport { AppState } from '../../../../../store/reducers';\nimport { DEFAULT_LABELS_SCOPE, Scope, WithLabelsScopes } from './scopes';\n\n//region Reducer state\nexport type StateWithLabels = {\n _labels: Record<Scope, LabelsState>;\n};\n\nexport type LabelsState = {\n collapsed: number[];\n selected: number[];\n saved: number[];\n error: string | null;\n};\n\nconst initialState: LabelsState = {\n collapsed: [],\n selected: [],\n saved: [],\n error: null,\n};\n\nexport const withLabelsInitialState = <T>(\n baseInitialState: T,\n reducerName: keyof AppState\n): T & StateWithLabels => {\n const scopes =\n WithLabelsScopes[reducerName] === undefined\n ? [DEFAULT_LABELS_SCOPE]\n : [\n ...(WithLabelsScopes[reducerName] as string[]),\n DEFAULT_LABELS_SCOPE,\n ];\n\n return {\n ...baseInitialState,\n _labels: scopes.reduce((acc: Record<string, LabelsState>, scope) => {\n acc[scope] = cloneDeep(initialState);\n return acc;\n }, {}),\n };\n};\n//endregion\n\n//region HOR\nexport const withLabelsReducer = <S extends StateWithLabels>(\n config: Config\n) => (baseReducer: Reducer<S>) => (state: S, nativeAction: Actions): S => {\n let newState = state;\n const { reducerName } = config;\n const action = decapsulateAction(`${reducerName}/labels/`, nativeAction);\n const scope = action._scope;\n\n if (!scope) {\n return baseReducer(newState, action);\n }\n\n switch (action.type) {\n case 'clearLabels':\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: [],\n partial: [],\n },\n },\n };\n break;\n case 'saveLabels':\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n saved: [...state._labels[scope].selected],\n },\n },\n };\n break;\n case 'selectLabels':\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: action.ids,\n },\n },\n };\n break;\n case 'toggleCollapseLabel':\n let newCollapseLabels = [...state._labels[scope].collapsed];\n\n if (newCollapseLabels.includes(action.id)) {\n newCollapseLabels = newCollapseLabels.filter(\n id => id !== action.id\n );\n } else {\n newCollapseLabels.push(action.id);\n }\n\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n collapsed: newCollapseLabels,\n },\n },\n };\n break;\n case 'toggleCollapseAllLabels':\n let collapsedLabelIDs = action.ids;\n\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n collapsed: collapsedLabelIDs,\n },\n },\n };\n break;\n case 'resetCollapseAllLabels':\n \n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n collapsed: [],\n },\n },\n };\n break;\n case 'selectAllLabels':\n const newSelectedList = action.allLabels;\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: newSelectedList,\n },\n },\n };\n break;\n case 'deselectAllLabels':\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: [],\n },\n },\n };\n break;\n case 'resetSelectedLabels': {\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: state._labels[scope].saved,\n },\n },\n };\n break;\n }\n case 'resetLabels':\n newState = {\n ...newState,\n _labels: {\n ...state._labels,\n [scope]: {\n ...state._labels[scope],\n selected: [],\n saved: [],\n collapsed: [],\n },\n },\n };\n break;\n }\n\n return baseReducer(newState, action);\n};\n//endregion\n","import { AppState } from '../../../../../store/reducers';\r\n\r\nexport type Scope = typeof DEFAULT_TEAMS_SCOPE | string;\r\n\r\nexport const DEFAULT_TEAMS_SCOPE = 'primary';\r\n\r\nexport const WithTeamsScopes: Partial<Record<keyof AppState, Scope[]>> = {\r\n draftEdit: ['assignFilters', 'addNewUser', 'editUser'],\r\n performance: ['assignFilters', 'addNewUser', 'editUser'],\r\n};\r\n","import { Reducer } from 'redux';\r\nimport { cloneDeep } from 'lodash';\r\n\r\nimport { Config } from './types';\r\nimport { Actions } from './actions';\r\nimport { decapsulateAction } from '../../../../../store/helpers/decapsulateAction';\r\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\r\nimport { AppState } from '../../../../../store/reducers';\r\nimport { DEFAULT_TEAMS_SCOPE, Scope, WithTeamsScopes } from './scopes';\r\nimport { Team } from '../../../../../constants/interfaces/Team';\r\nimport { toggleItemInArray } from '../../../../../helpers/functions/array-helpers';\r\n\r\n//region Reducer state\r\nexport type StateWithTeams = {\r\n _teams: Record<Scope, TeamsState>;\r\n};\r\n\r\nexport type TeamsState = {\r\n data: PaginationResult<Team>;\r\n selected: number[];\r\n saved: number[];\r\n loading: boolean;\r\n error: string | null;\r\n};\r\n\r\nconst initialState: TeamsState = {\r\n data: {\r\n items: [],\r\n limit: 0,\r\n offset: 0,\r\n numberOfPages: 0,\r\n totalCount: 0,\r\n lastUpdated: undefined,\r\n },\r\n selected: [],\r\n saved: [],\r\n loading: false,\r\n error: null,\r\n};\r\n\r\nexport const withTeamsInitialState = <T>(\r\n baseInitialState: T,\r\n reducerName: keyof AppState\r\n): T & StateWithTeams => {\r\n const scopes =\r\n WithTeamsScopes[reducerName] === undefined\r\n ? [DEFAULT_TEAMS_SCOPE]\r\n : [\r\n ...(WithTeamsScopes[reducerName] as string[]),\r\n DEFAULT_TEAMS_SCOPE,\r\n ];\r\n\r\n return {\r\n ...baseInitialState,\r\n _teams: scopes.reduce((acc: Record<string, TeamsState>, scope) => {\r\n acc[scope] = cloneDeep(initialState);\r\n return acc;\r\n }, {}),\r\n };\r\n};\r\n//endregion\r\n\r\n//region HOR\r\nexport const withTeamsReducer = <S extends StateWithTeams>(config: Config) => (\r\n baseReducer: Reducer<S>\r\n) => (state: S, nativeAction: Actions): S => {\r\n let newState = state;\r\n const { reducerName } = config;\r\n const action = decapsulateAction(`${reducerName}/teams/`, nativeAction);\r\n const scope = action._scope;\r\n\r\n if (!scope) {\r\n return baseReducer(newState, action);\r\n }\r\n\r\n switch (action.type) {\r\n case 'clearTeams':\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: [],\r\n partial: [],\r\n },\r\n },\r\n };\r\n break;\r\n case 'saveTeams':\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n saved: [...state._teams[scope].selected],\r\n },\r\n },\r\n };\r\n break;\r\n case 'selectTeams':\r\n let updatedSelectedState = [...state._teams[scope].selected];\r\n\r\n updatedSelectedState = toggleItemInArray(\r\n updatedSelectedState,\r\n action.id\r\n );\r\n\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: updatedSelectedState,\r\n },\r\n },\r\n };\r\n break;\r\n case 'selectMultipleTeams': {\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: action.ids,\r\n },\r\n },\r\n };\r\n break;\r\n }\r\n case 'selectAllTeams':\r\n const newSelectedList = action.allTeams;\r\n\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: newSelectedList,\r\n },\r\n },\r\n };\r\n break;\r\n case 'deselectAllTeams':\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: [],\r\n },\r\n },\r\n };\r\n break;\r\n case 'resetSelectedTeams': {\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: state._teams[scope].saved,\r\n },\r\n },\r\n };\r\n break;\r\n }\r\n case 'resetTeams':\r\n newState = {\r\n ...newState,\r\n _teams: {\r\n ...state._teams,\r\n [scope]: {\r\n ...state._teams[scope],\r\n selected: [],\r\n saved: [],\r\n collapsed: [],\r\n },\r\n },\r\n };\r\n break;\r\n }\r\n\r\n return baseReducer(newState, action);\r\n};\r\n//endregion\r\n","import { Reducer } from 'redux';\nimport { cloneDeep } from 'lodash';\n\nimport { Config } from './types';\nimport { Actions } from './actions';\nimport { decapsulateAction } from '../../../../../store/helpers/decapsulateAction';\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { AppState } from '../../../../../store/reducers';\nimport {\n DEFAULT_PRACTIS_SETS_SCOPE,\n Scope,\n WithPractisSetsScopes,\n} from './scopes';\nimport { toggleItemInArray } from '../../../../../helpers/functions/array-helpers';\nimport { EnrollmentPractisSet } from '../../../../../constants/interfaces/PractisSets';\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\n\n//region Reducer state\nexport type StateWithPractisSets = {\n _practisSets: Record<Scope, PractisSetsState>;\n};\n\nexport type PractisSetsState = {\n data: ListResult<EnrollmentPractisSet>;\n selected: PractisSetWithDueDate[];\n saved: PractisSetWithDueDate[];\n loading: boolean;\n error: string | null;\n};\n\nconst initialState: PractisSetsState = {\n data: {\n items: [],\n count: 0,\n },\n selected: [],\n saved: [],\n loading: false,\n error: null,\n};\n\nexport const withPractisSetsInitialState = <T>(\n baseInitialState: T,\n reducerName: keyof AppState\n): T & StateWithPractisSets => {\n const scopes =\n WithPractisSetsScopes[reducerName] === undefined\n ? [DEFAULT_PRACTIS_SETS_SCOPE]\n : [\n ...(WithPractisSetsScopes[reducerName] as string[]),\n DEFAULT_PRACTIS_SETS_SCOPE,\n ];\n\n return {\n ...baseInitialState,\n _practisSets: scopes.reduce(\n (acc: Record<string, PractisSetsState>, scope) => {\n acc[scope] = cloneDeep(initialState);\n return acc;\n },\n {}\n ),\n };\n};\n//endregion\n\n//region HOR\nexport const withPractisSetsReducer = <S extends StateWithPractisSets>(\n config: Config\n) => (baseReducer: Reducer<S>) => (state: S, nativeAction: Actions): S => {\n let newState = state;\n const { reducerName } = config;\n const action = decapsulateAction(\n `${reducerName}/practisSets/`,\n nativeAction\n );\n const scope = action._scope;\n\n if (!scope) {\n return baseReducer(newState, action);\n }\n\n switch (action.type) {\n case 'clearPractisSets':\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: [],\n partial: [],\n },\n },\n };\n break;\n case 'savePractisSets':\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n saved: [...state._practisSets[scope].selected],\n },\n },\n };\n break;\n case 'selectPractisSets':\n let updatedSelectedState = [...state._practisSets[scope].selected];\n\n updatedSelectedState = toggleItemInArray(\n updatedSelectedState,\n action.id\n );\n\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: updatedSelectedState,\n },\n },\n };\n break;\n case 'selectMultiplePractisSets': {\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: action.ids,\n },\n },\n };\n break;\n }\n case 'selectAllPractisSets':\n const newSelectedList = action.allPractisSets.map(item => ({practisSetId: item.id, dueDate: item.dueDate || null}));\n\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: newSelectedList,\n },\n },\n };\n break;\n case 'deselectAllPractisSets':\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: [],\n },\n },\n };\n break;\n case 'resetSelectedPractisSets': {\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: state._practisSets[scope].saved,\n },\n },\n };\n break;\n }\n case 'resetPractisSets':\n newState = {\n ...newState,\n _practisSets: {\n ...state._practisSets,\n [scope]: {\n ...state._practisSets[scope],\n selected: [],\n saved: [],\n collapsed: [],\n },\n },\n };\n break;\n }\n\n return baseReducer(newState, action);\n};\n//endregion\n","import { UserV2 } from '../../../constants/interfaces/User';\r\nimport { AppState } from '../../../store/reducers';\r\nimport {\r\n ACTIONS,\r\n FETCH_ALL_USERS,\r\n FETCH_ALL_USERS_FAILURE,\r\n FETCH_ALL_USERS_SUCCESS,\r\n FETCH_USER,\r\n FETCH_USER_FAILURE,\r\n FETCH_USER_SUCCESS,\r\n fetchAllDrafts,\r\n fetchAllDraftsFailure,\r\n fetchAllDraftsSuccess,\r\n fetchCreatedByUsersFailure,\r\n fetchCreatedByUsersStart,\r\n fetchCreatedByUsersSuccess,\r\n fetchEditedByUsersFailure,\r\n fetchEditedByUsersStart,\r\n fetchEditedByUsersSuccess,\r\n getUserPerformanceFailure,\r\n getUserPerformanceStart,\r\n getUserPerformanceSuccess,\r\n resetUserPerformanceAction,\r\n searchInvitationsFailure,\r\n searchInvitationsStart,\r\n searchInvitationsSuccess,\r\n searchUserPractisSetsFailure,\r\n searchUserPractisSetsStart,\r\n searchUserPractisSetsSuccess,\r\n UPDATE_USER,\r\n UPDATE_USER_FAILURE,\r\n UPDATE_USER_SUCCESS,\r\n updateAllPractisSetsCheckedState,\r\n updateAllSelectedDraftState,\r\n updateAllSelectedInvitationsState,\r\n updateDraftsFailure,\r\n updateDraftsStart,\r\n updateDraftsSuccess,\r\n updateInvitationFailure,\r\n updateInvitationStart,\r\n updateInvitationSuccess,\r\n updateSelectedDraftState,\r\n updateSelectedInvitationState,\r\n updateTraineeProfilePractisSetCheckedState,\r\n updateUserActionFailure,\r\n updateUserActionStart,\r\n updateUserActionSuccess,\r\n updateUserPractisSetsFailure,\r\n updateUserPractisSetsStart,\r\n updateUserPractisSetsSuccess,\r\n userLabelsUpdatedAction,\r\n fetchPortablePractisSetsStart,\r\n fetchPortablePractisSetsSuccess,\r\n fetchPortablePractisSetsFailure,\r\n fetchUserFeaturesStart,\r\n fetchUserFeaturesSuccess,\r\n fetchUserFeaturesFailure,\r\n removePendingUserLabel,\r\n fetchUserAllPractisSetsSuccess,\r\n CLEAR_ALL_USERS,\r\n fetchUserPreferencesStart,\r\n fetchUserPreferencesSuccess,\r\n fetchUserPreferencesFailure,\r\n updateUserPreferencesStart,\r\n updateUserPreferencesSuccess,\r\n updateUserPreferencesFailure,\r\n} from './actions';\r\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { compose, Reducer } from 'redux';\r\nimport {\r\n DraftsState,\r\n InvitationsState,\r\n PerformanceState,\r\n UpdatedDraftsState,\r\n UpdatedUserPractisSetsState,\r\n UpdateInvitationState,\r\n UpdateUsersState,\r\n UserPerformanceState,\r\n UserFeaturesState,\r\n UserPreferencesState\r\n} from './states';\r\nimport {\r\n withLabelsInitialState,\r\n withLabelsReducer,\r\n} from '../../portableLabels/store/hors/withLabels';\r\nimport {\r\n withTeamsInitialState,\r\n withTeamsReducer,\r\n} from '../../portableTeams/store/hors/withTeams';\r\nimport {\r\n StateWithPractisSets,\r\n withPractisSetsInitialState,\r\n withPractisSetsReducer,\r\n} from '../../portablePractisSets/store/hors/withPractisSets';\r\n\r\nexport interface AllUsersInterface {\r\n list: ListResult<UserV2>;\r\n selectedUsers?: number[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nconst initialState: AllUsersInterface = withLabelsInitialState(\r\n withTeamsInitialState(\r\n {\r\n list: {\r\n items: [],\r\n count: 0\r\n },\r\n selectedUsers: [],\r\n loading: false,\r\n loadingCreatedBy: false,\r\n loadingEditedBy: false,\r\n error: '',\r\n },\r\n 'users'\r\n ),\r\n 'users'\r\n);\r\n\r\nconst allUsersBaseReducer = (state = initialState, action: any) => {\r\n switch (action.type) {\r\n case FETCH_ALL_USERS:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n reload: false,\r\n };\r\n case FETCH_ALL_USERS_SUCCESS:\r\n return {\r\n ...state,\r\n list: action.data,\r\n loading: false,\r\n error: '',\r\n };\r\n case FETCH_ALL_USERS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case CLEAR_ALL_USERS:\r\n return initialState;\r\n \r\n case ACTIONS.UPDATE_SELECTED_USER_STATE:\r\n const selectedUserIds = [...(state.selectedUsers || [])];\r\n\r\n const selectedUserIndex = selectedUserIds.findIndex(\r\n (item: number) => item === action.userId\r\n );\r\n if (selectedUserIndex > -1) {\r\n selectedUserIds.splice(selectedUserIndex, 1);\r\n } else {\r\n selectedUserIds.push(action.userId);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedUsers: selectedUserIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_USERS_STATE:\r\n return {\r\n ...state,\r\n selectedUsers:\r\n action.checked || action.partial ? action.userIds : [],\r\n };\r\n case ACTIONS.REMOVE_USER_LABEL:\r\n const list = {\r\n ...state.list,\r\n items: state.list.items.map(item => {\r\n if (item.id === action.userId)\r\n return {\r\n ...item,\r\n labels: item.labels?.filter(\r\n labelId => labelId !== action.labelId\r\n ),\r\n };\r\n return item;\r\n }),\r\n };\r\n return {\r\n ...state,\r\n list,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const allUsersReducer = compose<Reducer<AllUsersInterface, any>>(\r\n withLabelsReducer({ reducerName: 'users' }),\r\n withTeamsReducer({ reducerName: 'users' }),\r\n)(allUsersBaseReducer);\r\n\r\nexport const getAllUsersState = (state: AppState) => state.users.list;\r\nexport const getAllUsersLoading = (state: AppState) => state.users.loading;\r\nexport const getAllUsersError = (state: AppState) => state.users.error;\r\n\r\nconst initialUpdateUserState: UpdateUsersState = {};\r\n\r\nexport type updateUserAction =\r\n | ReturnType<typeof updateUserActionStart>\r\n | ReturnType<typeof updateUserActionSuccess>\r\n | ReturnType<typeof updateUserActionFailure>;\r\n\r\nexport const updatedUserReducer: Reducer<UpdateUsersState, updateUserAction> = (\r\n state = initialUpdateUserState,\r\n action: updateUserAction\r\n): UpdateUsersState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_USER_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_USER_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.user,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_USER_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport interface UserState {\r\n info?: UserV2;\r\n isLoading?: boolean;\r\n error?: any;\r\n}\r\n\r\nconst userInitialState: UserState = {\r\n info: undefined,\r\n isLoading: false,\r\n error: '',\r\n};\r\n\r\nexport const userReducer = (state = userInitialState, action: any) => {\r\n switch (action.type) {\r\n case FETCH_USER:\r\n return {\r\n info: undefined,\r\n isLoading: true,\r\n error: null,\r\n };\r\n case FETCH_USER_SUCCESS:\r\n return {\r\n info: {\r\n ...action.data,\r\n },\r\n isLoading: false,\r\n error: null,\r\n };\r\n case FETCH_USER_FAILURE:\r\n return {\r\n info: undefined,\r\n isLoading: false,\r\n error: action.error,\r\n };\r\n case UPDATE_USER:\r\n return {\r\n ...state,\r\n error: null,\r\n };\r\n case UPDATE_USER_SUCCESS:\r\n return {\r\n info: {\r\n ...state.info,\r\n ...action.data,\r\n },\r\n error: null,\r\n };\r\n case UPDATE_USER_FAILURE:\r\n return {\r\n ...state,\r\n error: action.error,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const getUserState = (state: AppState) => state.user.info;\r\nexport const getUserLoading = (state: AppState) => state.user.isLoading;\r\nexport const getUserError = (state: AppState) => state.user.error;\r\n\r\nexport interface InvitationsInterface {\r\n data: ListResult<UserV2>;\r\n selectedInvitations?: number[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nconst initialInvitationsState: InvitationsInterface = withLabelsInitialState(\r\n withTeamsInitialState(\r\n {\r\n data: {\r\n items: [],\r\n count: 0,\r\n },\r\n selectedInvitations: [],\r\n loading: false,\r\n error: '',\r\n },\r\n 'invitations'\r\n ),\r\n 'invitations'\r\n);\r\n\r\nexport type invitationsAction =\r\n | ReturnType<typeof searchInvitationsStart>\r\n | ReturnType<typeof searchInvitationsSuccess>\r\n | ReturnType<typeof searchInvitationsFailure>\r\n | ReturnType<typeof updateSelectedInvitationState>\r\n | ReturnType<typeof updateAllSelectedInvitationsState>\r\n | ReturnType<typeof userLabelsUpdatedAction>\r\n | ReturnType<typeof removePendingUserLabel>;\r\n\r\nexport const invitationsBaseReducer = (\r\n state = initialInvitationsState,\r\n action: invitationsAction\r\n): InvitationsState => {\r\n switch (action.type) {\r\n case ACTIONS.SEARCH_USER_INVITATIONS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_USER_INVITATIONS_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.users,\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_USER_INVITATIONS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.UPDATE_SELECTED_INVITATION_STATE:\r\n const selectedInvitationIds = [\r\n ...(state.selectedInvitations || []),\r\n ];\r\n\r\n const selectedInvitationIndex = selectedInvitationIds.findIndex(\r\n (item: number) => item === action.invitationId\r\n );\r\n if (selectedInvitationIndex > -1) {\r\n selectedInvitationIds.splice(selectedInvitationIndex, 1);\r\n } else {\r\n selectedInvitationIds.push(action.invitationId);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedInvitations: selectedInvitationIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_INVITATIONS_STATE:\r\n return {\r\n ...state,\r\n selectedInvitations:\r\n action.checked || action.partial\r\n ? action.invitationIds\r\n : [],\r\n };\r\n case ACTIONS.REMOVE_PENDING_USER_LABEL:\r\n const data = {\r\n ...state.data,\r\n items: state.data.items.map(item => {\r\n if (item.id === action.userId)\r\n return {\r\n ...item,\r\n labels: item.labels?.filter(\r\n labelId => labelId !== action.labelId\r\n )\r\n };\r\n return item;\r\n })\r\n };\r\n return {\r\n ...state,\r\n data\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const invitationsReducer = compose<Reducer<any, any>>(\r\n withLabelsReducer({ reducerName: 'invitations' }),\r\n withTeamsReducer({ reducerName: 'invitations' })\r\n)(invitationsBaseReducer);\r\n\r\nconst initialUpdateInvitationState: UpdateInvitationState = {};\r\n\r\nexport type updateInvitationAction =\r\n | ReturnType<typeof updateInvitationStart>\r\n | ReturnType<typeof updateInvitationSuccess>\r\n | ReturnType<typeof updateInvitationFailure>;\r\n\r\nexport const updateInvitationsReducer: Reducer<\r\n UpdateInvitationState,\r\n updateInvitationAction\r\n> = (\r\n state = initialUpdateInvitationState,\r\n action: updateInvitationAction\r\n): UpdateInvitationState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_USER_INVITATION_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_USER_INVITATION_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.invitation,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_USER_INVITATION_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialUserPerformanceState = withLabelsInitialState<\r\n PerformanceState & StateWithPractisSets\r\n>(\r\n withTeamsInitialState(\r\n withPractisSetsInitialState(\r\n {\r\n loading: false,\r\n },\r\n 'performance'\r\n ),\r\n 'performance'\r\n ),\r\n 'performance'\r\n);\r\n\r\nexport type userPerformanceAction =\r\n | ReturnType<typeof getUserPerformanceStart>\r\n | ReturnType<typeof getUserPerformanceSuccess>\r\n | ReturnType<typeof getUserPerformanceFailure>\r\n | ReturnType<typeof searchUserPractisSetsStart>\r\n | ReturnType<typeof searchUserPractisSetsSuccess>\r\n | ReturnType<typeof searchUserPractisSetsFailure>\r\n | ReturnType<typeof fetchPortablePractisSetsStart>\r\n | ReturnType<typeof fetchPortablePractisSetsSuccess>\r\n | ReturnType<typeof fetchPortablePractisSetsFailure>\r\n | ReturnType<typeof updateTraineeProfilePractisSetCheckedState>\r\n | ReturnType<typeof updateAllPractisSetsCheckedState>\r\n | ReturnType<typeof fetchUserAllPractisSetsSuccess>\r\n | ReturnType<typeof resetUserPerformanceAction>;\r\n\r\nexport const userPerformanceReducerBase: Reducer<\r\n UserPerformanceState,\r\n userPerformanceAction\r\n> = (\r\n state = initialUserPerformanceState,\r\n action: userPerformanceAction\r\n): UserPerformanceState => {\r\n switch (action.type) {\r\n case ACTIONS.GET_USER_PERFORMANCE_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.GET_USER_PERFORMANCE_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.trainee,\r\n loading: false,\r\n };\r\n case ACTIONS.GET_USER_PERFORMANCE_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n case ACTIONS.SEARCH_USER_PRACTIS_SETS_START:\r\n return {\r\n ...state,\r\n practisSetsLoading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_USER_PRACTIS_SETS_SUCCESS:\r\n return {\r\n ...state,\r\n practisSets: action.practisSets,\r\n practisSetsLoading: false,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_USER_PRACTIS_SETS_FAILURE:\r\n return {\r\n ...state,\r\n practisSetsLoading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_START:\r\n return {\r\n ...state,\r\n portablePractisSetsLoading: true,\r\n error: '',\r\n };\r\n case ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_SUCCESS:\r\n return {\r\n ...state,\r\n portablePractisSets: action.practisSets.items,\r\n portablePractisSetsLoading: false,\r\n error: '',\r\n };\r\n case ACTIONS.FETCH_PORTABLE_PRACTIS_SETS_FAILURE:\r\n return {\r\n ...state,\r\n portablePractisSetsLoading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.UPDATE_SELECTED_TRAINEE_PROFILE_PRACTIS_SET_STATE:\r\n const selectedIds = [...(state.selectedPractisSets || [])];\r\n\r\n const selectedIdIndex = selectedIds.findIndex(\r\n (item: number) => item === action.id\r\n );\r\n if (selectedIdIndex > -1) {\r\n selectedIds.splice(selectedIdIndex, 1);\r\n } else {\r\n selectedIds.push(action.id);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedPractisSets: selectedIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_TRAINEE_PROFILE_PRACTIS_SETS_STATE:\r\n return {\r\n ...state,\r\n selectedPractisSets:\r\n action.checked || action.partial\r\n ? action.selectedPractisSetIds\r\n : [],\r\n };\r\n\r\n case ACTIONS.FETCH_USER_ALL_PRACTIS_SETS:\r\n return {\r\n ...state,\r\n _practisSets: {\r\n ...state._practisSets,\r\n assignFilters: {\r\n data: action.data,\r\n selected: [],\r\n saved: [],\r\n loading: false,\r\n error: '',\r\n },\r\n },\r\n };\r\n case ACTIONS.RESET_USER_PERFORMANCE:\r\n return initialUserPerformanceState;\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const userPerformanceReducer = compose<\r\n Reducer<UserPerformanceState, userPerformanceAction>\r\n>(\r\n withLabelsReducer({ reducerName: 'performance' }),\r\n withTeamsReducer({ reducerName: 'performance' }),\r\n withPractisSetsReducer({ reducerName: 'performance' })\r\n)(userPerformanceReducerBase);\r\n\r\nconst initialUpdatedUserPractisiSetsState: UpdatedUserPractisSetsState = {};\r\n\r\nexport type updatedUserPractisSestsAction =\r\n | ReturnType<typeof updateUserPractisSetsStart>\r\n | ReturnType<typeof updateUserPractisSetsSuccess>\r\n | ReturnType<typeof updateUserPractisSetsFailure>;\r\n\r\nexport const updatedUserPractisSetsReducer: Reducer<\r\n UpdatedUserPractisSetsState,\r\n updatedUserPractisSestsAction\r\n> = (\r\n state = initialUpdatedUserPractisiSetsState,\r\n action: updatedUserPractisSestsAction\r\n): UpdatedUserPractisSetsState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_USER_PRACTIS_SETS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_USER_PRACTIS_SETS_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.practisSets,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_USER_PRACTIS_SETS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialDraftsState: any = {\r\n data: {\r\n items: [],\r\n },\r\n draftedUsers: {\r\n items: [],\r\n },\r\n selectedDrafts: [],\r\n loading: false,\r\n error: '',\r\n};\r\n\r\nexport type draftsAction =\r\n | ReturnType<typeof fetchAllDrafts>\r\n | ReturnType<typeof fetchAllDraftsSuccess>\r\n | ReturnType<typeof fetchAllDraftsFailure>\r\n | ReturnType<typeof updateSelectedDraftState>\r\n | ReturnType<typeof updateAllSelectedDraftState>\r\n | ReturnType<typeof fetchCreatedByUsersStart>\r\n | ReturnType<typeof fetchCreatedByUsersSuccess>\r\n | ReturnType<typeof fetchCreatedByUsersFailure>\r\n | ReturnType<typeof fetchEditedByUsersStart>\r\n | ReturnType<typeof fetchEditedByUsersSuccess>\r\n | ReturnType<typeof fetchEditedByUsersFailure>;\r\n\r\nexport const draftsReducer = (\r\n state = initialDraftsState,\r\n action: draftsAction\r\n): DraftsState => {\r\n switch (action.type) {\r\n case ACTIONS.SEARCH_STAGING_DRAFTS:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_STAGING_DRAFTS_SUCCESS:\r\n const prevItems = state.data?.items;\r\n return {\r\n ...state,\r\n data:\r\n action.data.offset === 0 || !prevItems\r\n ? action.data\r\n : {\r\n ...action.data,\r\n items: action.data.items,\r\n },\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_STAGING_DRAFTS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.UPDATE_SELECTED_DRAFT_STATE:\r\n const selectedDraftIds = [...(state.selectedDrafts || [])];\r\n\r\n const selectedDraftIndex = selectedDraftIds.findIndex(\r\n (item: number) => item === action.draftId\r\n );\r\n if (selectedDraftIndex > -1) {\r\n selectedDraftIds.splice(selectedDraftIndex, 1);\r\n } else {\r\n selectedDraftIds.push(action.draftId);\r\n }\r\n return {\r\n ...state,\r\n selectedDrafts: selectedDraftIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_DRAFT_STATE:\r\n return {\r\n ...state,\r\n selectedDrafts:\r\n action.checked || action.partial ? action.draftIds : [],\r\n };\r\n case ACTIONS.FETCH_CREATED_BY_USERS_START:\r\n return {\r\n ...state,\r\n loadingCreatedBy: true,\r\n };\r\n case ACTIONS.FETCH_CREATED_BY_USERS_SUCCESS:\r\n return {\r\n ...state,\r\n createdByUsers: action.data,\r\n loadingCreatedBy: false,\r\n };\r\n case ACTIONS.FETCH_CREATED_BY_USERS_FAILURE:\r\n return {\r\n ...state,\r\n error: action.error,\r\n loadingCreatedBy: false,\r\n };\r\n case ACTIONS.FETCH_EDITED_BY_USERS_START:\r\n return {\r\n ...state,\r\n loadingEditedBy: true,\r\n };\r\n case ACTIONS.FETCH_EDITED_BY_USERS_SUCCESS:\r\n return {\r\n ...state,\r\n editedByUsers: action.data,\r\n loadingEditedBy: false,\r\n };\r\n case ACTIONS.FETCH_EDITED_BY_USERS_FAILURE:\r\n return {\r\n ...state,\r\n error: action.error,\r\n loadingEditedBy: false,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialUpdatedDraftsState: UpdatedDraftsState = {};\r\n\r\nexport type updatedDraftsAction =\r\n | ReturnType<typeof updateDraftsStart>\r\n | ReturnType<typeof updateDraftsSuccess>\r\n | ReturnType<typeof updateDraftsFailure>;\r\n\r\nexport const updatedDraftsReducer: Reducer<\r\n UpdatedDraftsState,\r\n updatedDraftsAction\r\n> = (\r\n state = initialUpdatedDraftsState,\r\n action: updatedDraftsAction\r\n): UpdatedDraftsState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_STAGING_DRAFTS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_STAGING_DRAFTS_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.draft,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_STAGING_DRAFTS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialUserFeaturesState: UserFeaturesState = {\r\n data: {},\r\n loading: false,\r\n error: ''\r\n};\r\n\r\nexport type userFeaturesAction =\r\n | ReturnType<typeof fetchUserFeaturesStart>\r\n | ReturnType<typeof fetchUserFeaturesSuccess>\r\n | ReturnType<typeof fetchUserFeaturesFailure>;\r\n\r\nexport const userFeaturesReducer: Reducer<\r\n UserFeaturesState,\r\n userFeaturesAction\r\n> = (\r\n state = initialUserFeaturesState,\r\n action: userFeaturesAction\r\n): UserFeaturesState => {\r\n switch (action.type) {\r\n case ACTIONS.FETCH_USER_FEATURES_START:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case ACTIONS.FETCH_USER_FEATURES_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.data,\r\n loading: false,\r\n error: ''\r\n };\r\n case ACTIONS.FETCH_USER_FEATURES_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const getUserFeaturesState = (state: AppState) => state.userFeatures.data;\r\nexport const getUserFeaturesLoading = (state: AppState) => state.userFeatures.loading;\r\nexport const getUserFeaturesError = (state: AppState) => state.userFeatures.error;\r\n\r\nconst initialUserPreferencesState: UserPreferencesState = {\r\n data: undefined,\r\n pendingValues: undefined,\r\n loading: false,\r\n error: ''\r\n};\r\n\r\nexport type userPreferencesAction =\r\n | ReturnType<typeof fetchUserPreferencesStart>\r\n | ReturnType<typeof fetchUserPreferencesSuccess>\r\n | ReturnType<typeof fetchUserPreferencesFailure>\r\n | ReturnType<typeof updateUserPreferencesStart>\r\n | ReturnType<typeof updateUserPreferencesSuccess>\r\n | ReturnType<typeof updateUserPreferencesFailure>;\r\n\r\nexport const userPreferencesReducer: Reducer<\r\n UserPreferencesState,\r\n userPreferencesAction\r\n> = (\r\n state = initialUserPreferencesState,\r\n action: userPreferencesAction\r\n): UserPreferencesState => {\r\n switch (action.type) {\r\n case ACTIONS.FETCH_USER_PREFERENCES_START:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case ACTIONS.FETCH_USER_PREFERENCES_SUCCESS:\r\n return {\r\n data: action.data,\r\n pendingValues: undefined,\r\n loading: false,\r\n error: ''\r\n };\r\n case ACTIONS.FETCH_USER_PREFERENCES_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error\r\n };\r\n case ACTIONS.UPDATE_USER_PREFERENCES_START:\r\n return {\r\n ...state,\r\n pendingValues: state.pendingValues\r\n ? state.pendingValues.concat(action.data)\r\n : action.data\r\n };\r\n case ACTIONS.UPDATE_USER_PREFERENCES_SUCCESS:\r\n return {\r\n ...state,\r\n data: state.data?.map(item =>\r\n action.keys.includes(item.key)\r\n ? {\r\n ...item,\r\n value: state.pendingValues?.find(updatedItem =>\r\n item.key === updatedItem.key\r\n )?.value ?? item.value\r\n }\r\n : item\r\n ),\r\n pendingValues: state.pendingValues?.filter(item =>\r\n !action.keys.includes(item.key)\r\n )\r\n };\r\n case ACTIONS.UPDATE_USER_PREFERENCES_FAILURE:\r\n return {\r\n ...state,\r\n pendingValues: state.pendingValues?.filter(item =>\r\n !action.keys.includes(item.key)\r\n )\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const getUserPreferencesState = (state: AppState) => state.userPreferences.data;\r\nexport const getUserPreferencesPendingValues = (state: AppState) => state.userPreferences.pendingValues;\r\nexport const getUserPreferencesLoading = (state: AppState) => state.userPreferences.loading;\r\nexport const getUserPreferencesError = (state: AppState) => state.userPreferences.error;","export const NOTIFICATION_SETTING_TITLE: Record<string, string> = {\n 'feed_content_new': 'New Submissions from my Learners',\n 'enrollments_overdue': 'Notify me of learners running behind on training'\n}","import styled from 'styled-components';\n\nexport const Title = styled.div`\n font-size: 15px;\n color: var(--ps-black-main);\n font-weight: 600;\n`;\n\nexport const Info = styled.div`\n display: flex;\n justify-content: space-between;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--ps-grey-4);\n margin-bottom: 16px;\n`;\n\nexport const Description = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n padding-top: 4px;\n width: 70%;\n`;\n\nexport const ToggleContainer = styled.div`\n width: 42px;\n`","import React, { ChangeEvent, ChangeEventHandler, FC } from 'react';\nimport styled from 'styled-components';\n\nexport interface SwitchToggleInterface {\n index: number | string;\n checked?: boolean;\n label?: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n disabled?: boolean;\n height?: number;\n width?: number;\n bulletRadius?: number;\n dataTest?: string;\n}\n\nconst StyledSwitchContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst StyledSwitchCheckboxContainer = styled.div`\n position: relative;\n`;\n\nconst StyledSpan = styled.span<{\n checked?: boolean;\n disabled?: boolean;\n bulletRadius: number;\n}>`\n content: '';\n position: absolute;\n left: 4px;\n width: ${props => props.bulletRadius}px;\n height: ${props => props.bulletRadius}px;\n border-radius: 45px;\n transition: 0.2s;\n background: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue15\n : props.checked\n ? props.theme.Colors.darkSkyBlue15\n : props.theme.Colors.cloudyBlue15};\n box-shadow: 0 0 2px 0 rgba(10, 10, 10, 0.29);\n border: solid 1px\n ${props =>\n props.disabled\n ? props.theme.Colors.paleGrey\n : props.checked\n ? props.theme.Colors.darkSkyBlue\n : props.theme.Colors.cloudyBlue};\n`;\n\nconst StyledLabel = styled.label<{\n checked?: boolean;\n disabled?: boolean;\n width: number;\n height: number;\n bulletRadius: number;\n}>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n width: ${props => props.width}px;\n height: ${props => props.height}px;\n border-radius: 100px;\n border: solid 1px\n ${props =>\n props.disabled\n ? props.theme.Colors.paleGrey\n : props.checked\n ? props.theme.Colors.darkSkyBlue\n : props.theme.Colors.cloudyBlue};\n background-color: ${props => props.theme.Colors.whiteFive};\n position: relative;\n transition: background-color 0.2s;\n\n &:active ${StyledSpan} {\n width: ${props =>\n props.disabled ? props.bulletRadius : props.bulletRadius + 10}px;\n }\n`;\n\nconst StyledInput = styled.input`\n height: 0;\n width: 0;\n visibility: hidden;\n position: absolute;\n top: 15px;\n left: 10px;\n\n &:checked + ${StyledLabel} ${StyledSpan} {\n left: calc(100% - 4px);\n transform: translateX(-100%);\n }\n`;\n\nconst StyledLabelText = styled.div`\n margin-left: 12px;\n font-size: 13px;\n`;\n\nconst SwitchToggle: FC<SwitchToggleInterface> = ({\n index,\n label,\n onChange,\n checked,\n disabled,\n height,\n width,\n bulletRadius,\n dataTest\n}) => {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n onChange(e);\n };\n\n return (\n <StyledSwitchContainer>\n <StyledSwitchCheckboxContainer>\n <StyledInput\n checked={checked}\n id={`toggle-switch-${index}`}\n type=\"checkbox\"\n onChange={handleChange}\n data-test={dataTest}\n />\n <StyledLabel\n htmlFor={`toggle-switch-${index}`}\n checked={checked}\n height={height ? height : 32}\n width={width ? width : 56}\n bulletRadius={bulletRadius ? bulletRadius : 20}\n disabled={disabled}\n data-test={dataTest && `${dataTest}-label`}\n >\n <StyledSpan\n checked={checked}\n bulletRadius={bulletRadius ? bulletRadius : 20}\n disabled={disabled}\n />\n </StyledLabel>\n </StyledSwitchCheckboxContainer>\n <StyledLabelText>{label}</StyledLabelText>\n </StyledSwitchContainer>\n );\n};\n\nexport default SwitchToggle;\n","import { NotificationWithToggleProps } from './types';\nimport {\n Title,\n Info,\n Description,\n ToggleContainer,\n} from './styles';\nimport SwitchToggle from '../../../../ui/components/SwitchToggle/SwitchToggle';\n\nfunction NotificationWithToggleView({\n notificationKey,\n title,\n description,\n checked,\n disabled,\n onChange,\n}: NotificationWithToggleProps) {\n return <>\n <Title>{title}</Title>\n <Info>\n <Description>{description}</Description>\n <ToggleContainer>\n <SwitchToggle\n index={notificationKey}\n width={42}\n height={24}\n bulletRadius={16}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n />\n </ToggleContainer>\n </Info>\n </>;\n}\n\nexport default NotificationWithToggleView;","import NotificationWithToggle from './view';\n\nexport default NotificationWithToggle;","import styled from 'styled-components';\n\nexport const LoadingContent = styled.div`\n padding: 20px 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;","import NotificationWithToggle from '../NotificationWithToggle';\nimport { NotificationsViewProps } from './types';\nimport { LoadingContent } from './styles';\nimport { Loading } from '../../../../ui/components/LoadingCopmonent';\n\nfunction NotificationsView({\n isLoading,\n items,\n onToggle,\n}: NotificationsViewProps) {\n if (isLoading && !items)\n return (\n <LoadingContent>\n <Loading />\n </LoadingContent>\n );\n return (\n <>\n {items?.map(item => {\n if (item.type === 'boolean')\n return (\n <NotificationWithToggle\n notificationKey={item.key}\n key={item.key}\n title={item.title}\n description={item.description}\n checked={item.value as boolean}\n disabled={item.isSaving}\n onChange={() => onToggle(item.key)}\n />\n );\n return null;\n })}\n </>\n );\n}\n\nexport default NotificationsView;","import { useSelector } from 'react-redux';\nimport { useEffect, useMemo, useCallback } from 'react';\nimport {\n getUserPreferencesState,\n getUserPreferencesLoading,\n getUserPreferencesPendingValues,\n} from '../../../../features/users/store/reducers';\nimport { NOTIFICATION_SETTING_TITLE } from './constants';\nimport {\n useGetUserPreferencesService,\n useUpdateUserPreferenceService,\n} from '../../../../features/users/store/services';\nimport NotificationsView from './view';\nimport { NotificationsProps } from './types';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\n\nfunction NotificationsController({ userId }: NotificationsProps) {\n const preferences = useSelector(getUserPreferencesState);\n const pendingValues = useSelector(getUserPreferencesPendingValues);\n const isLoading = useSelector(getUserPreferencesLoading);\n const getPreferences = useGetUserPreferencesService();\n const updatePreference = useUpdateUserPreferenceService();\n const showMessage = useShowMessage();\n\n const items = useMemo(\n () =>\n preferences?.map(preference => {\n const pendingValue = pendingValues?.find(\n item => item.key === preference.key\n )?.value;\n return {\n key: preference.key,\n type: preference.type,\n title: NOTIFICATION_SETTING_TITLE[preference.key] ?? '',\n description: preference.description,\n value: pendingValue ?? preference.value,\n isSaving: typeof pendingValue !== 'undefined',\n };\n }),\n [preferences, pendingValues]\n );\n\n const handleToggle = useCallback(\n (key: string) => {\n const item = items?.find(item => item.key === key);\n if (!item) return;\n const newValue = !item.value;\n updatePreference(userId, key, newValue, () => {\n showMessage(\n `Notifications have been ${\n newValue ? 'enabled' : 'disabled'\n }`,\n 'success'\n );\n });\n },\n [userId, items, updatePreference, showMessage]\n );\n\n useEffect(() => {\n getPreferences(userId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <NotificationsView\n isLoading={isLoading}\n items={items}\n onToggle={handleToggle}\n />\n );\n}\n\nexport default NotificationsController;","import React from 'react';\n\nexport enum WEB_SITE_ID {\n ADMIN_PORTAL = 'ADMIN_PORTAL',\n COMPANY_PORTAL = 'COMPANY_PORTAL',\n}\n\nexport const WebSiteIdContext = React.createContext<WEB_SITE_ID>(\n '' as WEB_SITE_ID\n);\n","import Notifications from './controller';\n\nexport default Notifications;","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\nimport { isAdminPortal } from '../../../helpers/functions/general';\nimport PractisAdminPlatformLogo from '../../icons/PractisAdminPlatformLogo';\nimport PractisLogo from '../../icons/PractisLogo';\n\nconst StyledPractisIcon = styled(isAdminPortal() ? PractisAdminPlatformLogo : PractisLogo)<{ color?: string }>`\n color: ${props => (props.color ? props.color : props.theme.Colors.white)};\n`;\n\nconst StyledLogo = styled.div<{ height: number; width?: number }>`\n height: ${props => props.height}px;\n width: ${props => (props.width ? props.width + 'px' : 'auto')};\n & img {\n height: 100%;\n }\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst Logo: FC<{\n height?: number;\n width?: number;\n color?: string;\n className?: string;\n onClick?: () => void;\n}> = memo(({ height, width, color, className, onClick }) => {\n return (\n <StyledLogo\n height={height ? height : 25}\n width={width}\n onClick={onClick}\n className={className}\n >\n <StyledPractisIcon color={color} />\n </StyledLogo>\n );\n});\n\nexport default Logo;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const RightArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 21 18\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g\n fill=\"none\"\n fillRule=\"evenodd\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n d=\"M7 4L15 12 23 4\"\n transform=\"translate(0 1) rotate(-90 15 8)\"\n />\n <path d=\"M19 8L0 8\" transform=\"translate(0 1)\" />\n </g>\n </svg>\n );\n }\n);\n\nexport default RightArrow;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Label = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n height=\"100%\"\n viewBox=\"0 0 16 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M208 141v-10c0-.552.448-1 1-1h10.5l4.5 6-4.5 6H209c-.552 0-1-.448-1-1zm11 0l3.75-5-3.75-5h-10v10h10zm1.115-5c0 .86-.698 1.558-1.557 1.558-.86 0-1.558-.698-1.558-1.558 0-.86.697-1.558 1.558-1.558.86 0 1.557.698 1.557 1.558zm-2.336 0c0 .43.348.779.779.779.43 0 .779-.349.779-.779 0-.43-.349-.779-.78-.779-.43 0-.778.349-.778.78z\"\n transform=\"translate(-208 -130)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Label;\n","import { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport RightArrow from '../../icons/RightArrow';\nimport LabelIcon from '../../icons/Label';\n\nexport const PractisSupportWrapper = styled.div<{ shrink: boolean }>`\n position: relative;\n height: 32px;\n padding-left: ${props => (props.shrink ? '20px' : '32px')};\n padding-right: 20px;\n display: flex;\n cursor: pointer;\n color: var(--ps-grey-1);\n text-decoration: none;\n`;\n\nexport const StyledSidebar = styled.div`\n z-index: 1;\n display: flex;\n`;\n\nexport const SidebarBody = styled.div`\n display: flex;\n flex: 1;\n`;\n\nexport const SidebarLabels = styled.div<{ isOpen: boolean }>`\n background: ${props => (props.isOpen ? 'var(--ps-graphite-2)' : 'none')};\n margin-top: 28px;\n border-top-left-radius: 8px;\n display: flex;\n padding-bottom: 24px;\n`;\n\nexport const ClosedLabels = styled.div`\n width: 48px;\n height: 48px;\n padding: 8px;\n box-sizing: border-box;\n background: var(--ps-graphite-2);\n border-radius: 8px 0 0 8px;\n`;\n\nexport const OpenLabels = styled.div`\n width: 192px;\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nexport const OpenLabelsContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nexport const OpenLabelsFooter = styled.div`\n padding: 8px 0 16px 16px;\n`;\n\nexport const StyledLabelsIcon = styled(LabelIcon)`\n width: 16px;\n height: 12px;\n`;\n\nexport const StyledRightArrow = styled(RightArrow)`\n width: 12px;\n`;\n\nexport const OpenLabelsButton = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 4px;\n background: var(--ps-graphite-1);\n color: var(--ps-white-1);\n cursor: pointer;\n user-select: none;\n display: flex;\n justify-content: center;\n align-items: center;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const SidebarContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nexport const SidebarMenu = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n padding: 84px 0 105px 0;\n`;\n\nexport const SidebarProfile = styled.div``;\n\nexport const ItemLoading = styled.div<{ isOpen: boolean }>`\n height: 32px;\n margin-bottom: 32px;\n margin-left: ${props => (props.isOpen ? '20px' : '32px')};\n display: flex;\n align-items: center;\n flex-direction: row;\n`;\n\nexport const ItemLoadingIcon = styled.div`\n width: 16px;\n height: 16px;\n background-color: var(--ps-graphite-4);\n border-radius: 8px;\n`;\n\nexport const ItemLoadingText = styled.div`\n width: 64px;\n height: 8px;\n background-color: var(--ps-graphite-4);\n margin-left: 12px;\n`;\n\nexport const IconHolder = styled.div`\n width: 16px;\n height: 16px;\n align-self: center;\n`;\n\nexport const Link = styled(NavLink)<{ shrink: boolean }>`\n height: 32px;\n padding-left: ${props => (props.shrink ? '20px' : '32px')};\n padding-right: 20px;\n margin-bottom: 32px;\n display: flex;\n cursor: pointer;\n color: var(--ps-grey-1);\n text-decoration: none;\n position: relative;\n &.is-active {\n color: var(--ps-white-1);\n font-weight: bold;\n\n ::before {\n width: 4px;\n height: 32px;\n background: var(--ps-white-1);\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n border-radius: 0 10px 10px 0;\n }\n }\n ${props =>\n props.shrink &&\n `\n flex-direction: row;\n justify-content: center;\n `}\n &:last-child {\n margin-bottom: 120px;\n }\n`;\n\nexport const Label = styled.div<{ fontSize?: string }>`\n font-weight: 500;\n font-size: ${props => (!!props.fontSize ? props.fontSize : '15px')};\n text-decoration: none;\n margin-left: 12px;\n align-self: center;\n line-height: 22px;\n`;\n\nexport const StyledDot = styled.div<{ isShrink?: boolean }>`\n height: 8px;\n width: 8px;\n background-color: var(--ps-red-main);\n border-radius: 50%;\n ${props => !props.isShrink && 'margin: 10px 0 0 0'};\n ${props => !!props.isShrink && 'position: absolute; top: 3px; right: 0'};\n`;","import React, { memo, useCallback } from 'react';\nimport { match as Match, useLocation } from 'react-router-dom';\nimport { kebabCase } from 'lodash';\n\nimport { SideBarItemProps } from './types';\nimport { IconHolder, Label, Link, StyledDot } from './styles';\n\nexport const SideBarItem: React.FC<SideBarItemProps> = memo(\n ({\n name,\n icon: Icon,\n activeIcon: ActiveIcon,\n url,\n shrink,\n alternateUrl,\n defaultItem,\n fontSize,\n hasNewItems,\n }) => {\n const location = useLocation();\n const isActive = useCallback(\n (isMatch: boolean) =>\n isMatch ||\n (!!defaultItem && location.pathname === '/') ||\n (!!alternateUrl && alternateUrl.includes(location.pathname)),\n [defaultItem, location, alternateUrl]\n );\n\n const handleIsActive = useCallback(\n (match: Match<any>) => isActive(!!match),\n [isActive]\n );\n return (\n <Link\n to={url}\n activeClassName={'is-active'}\n isActive={handleIsActive}\n shrink={!!shrink}\n data-test={`sidebar-${kebabCase(name)}`}\n >\n <IconHolder title={name}>\n {isActive(location.pathname.indexOf(url) > -1) ? (\n <ActiveIcon />\n ) : (\n <Icon />\n )}\n </IconHolder>\n {!shrink && <Label fontSize={fontSize}>{name}</Label>}\n {hasNewItems && <StyledDot isShrink={!shrink} />}\n </Link>\n );\n }\n);\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Dots = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 384 384\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n data-test={dataTest}\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <g>\n <circle cx=\"192\" cy=\"42.667\" r=\"42.667\" />\n </g>\n </g>\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <g>\n <circle cx=\"192\" cy=\"192\" r=\"42.667\" />\n </g>\n </g>\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <g>\n <circle cx=\"192\" cy=\"341.333\" r=\"42.667\" />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Dots;\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nimport { Theme } from '../../../constants/interfaces/Theme';\nimport { StyleProps } from './types';\n\nexport const useStyles = makeStyles<Theme, StyleProps>(theme => ({\n menuListClassName: {\n width: ({ customWidth }) =>\n customWidth ? `${customWidth}px` : '128px',\n boxShadow: '0 5px 20px 0 rgba(0, 0, 0, 0.2)',\n padding: '16px 8px',\n borderRadius: '8px !important',\n right: ({ customLeft }) => `${customLeft || '40'}px !important`,\n bottom: ({ customLeft }) => `${customLeft ? '5px': 'unset' } !important`,\n marginTop: ({ marginTop }) =>\n marginTop ? `${marginTop}px !important` : '10px !important',\n background: '#fff',\n },\n popper: {\n zIndex: 1,\n '&[x-placement*=\"bottom\"] $arrow': {\n top: 0,\n left: 0,\n zIndex: 2,\n width: '1em',\n height: '1em',\n '&::before': {\n borderWidth: '0 1em 1em 1em',\n borderColor: `transparent transparent var(--ps-white-1) transparent`,\n },\n },\n '&[x-placement*=\"top\"] $arrow': {\n bottom: 0,\n left: 0,\n marginBottom: '-0.9em',\n zIndex: 2,\n width: '3em',\n height: '1em',\n '&::before': {\n borderWidth: '1em 1em 0 1em',\n borderColor: `var(--ps-white-1) transparent transparent transparent`,\n boxShadow: `-3px -4px 5px rgba(0, 0, 0, 0.015),\n 0 0px white, \n -7px -3px 5px rgba(0, 0, 0, 0.015), \n 0 0px white`,\n },\n },\n '&[x-placement*=\"right\"] $arrow': {\n left: 0,\n marginLeft: '-0.9em',\n zIndex: 2,\n height: '3em',\n width: '1em',\n '&::before': {\n borderWidth: '1em 1em 1em 0',\n borderColor: `transparent var(--ps-white-1) transparent transparent`,\n boxShadow: `-3px -4px 5px rgba(0, 0, 0, 0.015),\n 0 0px white, \n -7px -3px 5px rgba(0, 0, 0, 0.015), \n 0 0px white`,\n },\n },\n '&[x-placement*=\"left\"] $arrow': {\n right: 0,\n marginRight: '-0.9em',\n zIndex: 2,\n height: '3em',\n width: '1em',\n '&::before': {\n borderWidth: '1em 0 1em 1em',\n borderColor: `transparent transparent transparent var(--ps-white-1)`,\n boxShadow: `-3px -4px 5px rgba(0, 0, 0, 0.015),\n 0 0px white, \n -7px -3px 5px rgba(0, 0, 0, 0.015), \n 0 0px white`,\n },\n },\n },\n\n arrow: {\n position: 'absolute',\n fontSize: 10,\n\n '&::before': {\n content: '\"\"',\n margin: 'auto',\n display: 'block',\n width: 0,\n height: 0,\n borderStyle: 'solid',\n },\n },\n}));\n\nexport const ActionMenuHandler = styled.div<{\n open: boolean;\n hasCustomComponent: boolean;\n}>`\n width: 10px;\n ${({ hasCustomComponent }) => !hasCustomComponent && `height: 24px;`}\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 8px;\n color: ${props => props.theme.Colors.steelGrey};\n box-shadow: ${props =>\n props.open && !props.hasCustomComponent\n ? `0 0 0 1px ${props.theme.Colors.cloudyBlue}`\n : 'none'};\n background-color: ${props =>\n props.open && !props.hasCustomComponent\n ? props.theme.Colors.whiteTwo\n : 'unset'};\n`;\n\nexport const Button = styled.div`\n display: flex;\n justify-content: flex-end;\n cursor: default;\n height: 100%;\n`;\n\nexport const IconContainer = styled.div`\n height: 100%;\n width: 12px;\n cursor: pointer;\n margin: 0 5px;\n display: flex;\n align-items: center;\n &:active {\n opacity: 0.7;\n }\n`;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { ClickAwayListener, Grow, MenuList, Popper } from '@material-ui/core';\nimport classNames from 'classnames';\n\nimport Dots from '../../icons/Dots';\nimport { ActionMenuHandler, Button, IconContainer, useStyles } from './styles';\nimport { ActionButtonProps } from './types';\n\nconst uuid = require('uuid/v1');\n\nexport const ActionButton: React.FC<ActionButtonProps> = ({\n children,\n marginTop,\n customWidth,\n customLeft,\n active,\n button,\n hideArrow = true,\n isHidden,\n menuItemsClassName,\n dataTest,\n placement,\n isDisabled\n}) => {\n const classes = useStyles({\n customWidth,\n marginTop,\n customLeft\n });\n const menuListAnchorRef = useRef<HTMLDivElement>(null);\n const customRandomId = uuid();\n\n const [isMenuListOpen, setIsMenuListOpen] = useState<boolean>(false);\n const [arrowRef, setArrowRef] = useState<unknown>(null);\n\n /**\n * @function handleToggle\n * @param { React.MouseEvent<HTMLElement> } event\n * @returns { void }\n */\n const handleToggle = (event: React.MouseEvent<HTMLElement>): void => {\n event.stopPropagation();\n setIsMenuListOpen(prevOpen => !prevOpen);\n };\n\n /**\n * @function handleClose\n * @param { React.MouseEvent<Document, MouseEvent> | undefined } event\n * @returns { void }\n */\n const handleClose = (\n event?: React.MouseEvent<Document, MouseEvent>\n ): void => {\n if (\n menuListAnchorRef.current &&\n menuListAnchorRef.current.contains(event?.target as HTMLElement)\n ) {\n return;\n }\n\n setIsMenuListOpen(false);\n };\n\n // to close the menu while scrolling outside\n useEffect(() => {\n const scrollableContainer = document.getElementById(\n 'MainScrollableContainer'\n );\n\n scrollableContainer?.addEventListener('scroll', event => {\n handleClose();\n });\n\n return () => {\n scrollableContainer?.removeEventListener('scroll', event => {\n handleClose();\n });\n };\n }, []);\n\n return (\n <>\n <Button\n ref={menuListAnchorRef}\n id={`action-button-${customRandomId}`}\n aria-controls={\n isMenuListOpen ? `action-menu-${customRandomId}` : undefined\n }\n aria-expanded={isMenuListOpen ? 'true' : undefined}\n aria-haspopup=\"true\"\n onClick={(e) => !isDisabled && handleToggle(e)}\n className=\"action-button-element\"\n data-test={dataTest && `${dataTest}-button`}\n >\n <IconContainer>\n {!isHidden && (\n <ActionMenuHandler\n open={!!active || isMenuListOpen}\n hasCustomComponent={!!button}\n className=\"dot-icon-container\"\n >\n {button ? button : <Dots />}\n </ActionMenuHandler>\n )}\n </IconContainer>\n </Button>\n <Popper\n open={isMenuListOpen}\n anchorEl={menuListAnchorRef.current}\n className={classes.popper}\n modifiers={{\n arrow: {\n enabled: !hideArrow,\n element: arrowRef,\n },\n }}\n placement={placement ? placement : customLeft ? 'bottom-end': undefined}\n >\n {({ TransitionProps }) => (\n <>\n {!hideArrow ? (\n <span className={classes.arrow} ref={setArrowRef} />\n ) : null}\n <Grow {...TransitionProps}>\n <ClickAwayListener onClickAway={handleClose}>\n <MenuList\n autoFocusItem={isMenuListOpen}\n id={`action-menu-${customRandomId}`}\n aria-labelledby={`action-button-${customRandomId}`}\n data-test={`${dataTest}-menu`}\n className={classNames(\n classes.menuListClassName,\n menuItemsClassName\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n handleClose(event as any);\n }\n }\n >\n {children}\n </MenuList>\n </ClickAwayListener>\n </Grow>\n </>\n )}\n </Popper>\n </>\n );\n};\n","import React from 'react';\n\nexport interface TActionsContextValue {\n toggleOpen?(value?: boolean): void;\n}\n\nexport const ActionContext = React.createContext<TActionsContextValue>({});\n","import React, { MouseEvent, FC } from 'react';\nimport styled from 'styled-components';\nimport { ActionContext } from './ActionContext';\nimport { ACTION_ITEM_HEIGHT } from './constants';\n\n//region Styles\nconst Item = styled.div<{ disabled?: boolean }>`\n min-height: ${ACTION_ITEM_HEIGHT}px;\n padding: 8px 16px;\n font-weight: normal;\n cursor: pointer;\n font-weight: 600;\n border-radius: 4px;\n display: flex;\n align-items: center;\n ${props => props.disabled && `pointer-events: none`}\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n }\n &:active {\n background: ${props => props.theme.Colors.paleGrey};\n }\n`;\n\nconst Content = styled.span<{ type?: 'warning'; disabled?: boolean }>`\n font-size: 13px;\n font-weight: 500;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.type === 'warning'\n ? props.theme.Colors.tomato\n : props.theme.Colors.black};\n`;\n//endregion\n\nexport const ActionItem: FC<{\n destructive?: boolean;\n onClick?(e: MouseEvent<HTMLDivElement>): void;\n disabled?: boolean;\n dataTest?: string;\n}> = ({ destructive, children, onClick, disabled, dataTest }) => {\n return (\n <ActionContext.Consumer>\n {context => (\n <Item\n onClick={e => {\n if (disabled) return;\n if (context.toggleOpen) context.toggleOpen(false);\n if (onClick) onClick(e);\n }}\n disabled={disabled}\n data-test={dataTest}\n >\n <Content\n type={destructive ? 'warning' : undefined}\n disabled={disabled}\n >\n {children}\n </Content>\n </Item>\n )}\n </ActionContext.Consumer>\n );\n};\n","export const ACTION_ITEM_HEIGHT: number = 40;\n","import React, { Children } from 'react';\nimport styled from 'styled-components';\nimport OutsideActionBox from '../OutsideActionBox/OutsideActionBox';\n\nconst Menu = styled(OutsideActionBox)`\n position: absolute;\n`;\n\nconst Items = styled.div<{\n placement: 'top' | 'bottom';\n itemCount: number;\n extendHeight: number;\n marginTop?: number;\n customWidth?: number;\n}>`\n width: ${props => (props.customWidth ? props.customWidth : 128)}px;\n position: fixed;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n padding: 16px 8px;\n border-radius: 8px;\n background: ${props => props.theme.Colors.white};\n right: 20px;\n z-index: 100;\n margin-top: 40px;\n`;\n\nexport const ActionMenu: React.FC<{\n open: boolean;\n extendHeight: number;\n placement?: 'top' | 'bottom';\n marginTop?: number;\n customWidth?: number;\n toggleOpen(open?: boolean): void;\n className?: string;\n itemsClassName?: string;\n}> = ({\n open,\n placement,\n children,\n marginTop,\n toggleOpen,\n extendHeight,\n customWidth,\n className,\n itemsClassName,\n}) => {\n const itemCount = Children.count(children);\n return (\n <Menu\n open={open}\n toggleOpen={toggleOpen}\n styles={{ position: 'relative' }}\n className={className}\n >\n <Items\n placement={placement || 'top'}\n itemCount={itemCount}\n extendHeight={extendHeight}\n marginTop={marginTop}\n customWidth={customWidth}\n className={itemsClassName}\n >\n {children}\n </Items>\n </Menu>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { LinkText } from '../../../ui/components/LinkText/link-text';\n\nconst AddLabelActions = styled.div`\n text-align: right;\n height: 16px;\n margin-bottom: 8px;\n`;\n\nconst CancelLabelButton = styled(LinkText)`\n font-size: 11px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst SaveLabelButton = styled(LinkText)<{ disabled?: boolean }>`\n font-size: 11px;\n margin-left: 8px;\n ${props =>\n props.disabled &&\n `\n pointer-events: none;\n color: ${props.theme.Colors.steelGrey};\n `}\n`;\n\nconst EditLabelActions: FC<{\n onCancel?: () => void;\n onConfirm?: () => void;\n confirmDisabled?: boolean;\n}> = ({ onCancel, onConfirm, confirmDisabled }) => {\n return (\n <AddLabelActions>\n <CancelLabelButton onClick={onCancel} dataTest=\"sidebar-labels-cancel\">Cancel</CancelLabelButton>\n <SaveLabelButton onClick={onConfirm} disabled={confirmDisabled} dataTest=\"sidebar-labels-save\">\n Save\n </SaveLabelButton>\n </AddLabelActions>\n );\n};\n\nexport default EditLabelActions;\n","import { useRef } from 'react';\n\nexport const useFocus = () => {\n const htmlElRef = useRef<HTMLElement>();\n const setFocus = () => {\n const currentEl = htmlElRef.current;\n currentEl && currentEl.focus();\n };\n return [htmlElRef, setFocus] as const;\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Input } from '../../../ui/components/input';\n\nconst LabelInput = styled(Input)`\n font-size: 13px;\n padding: 0 8px;\n &::placeholder {\n font-size: 11px;\n }\n`;\n\nconst AddNewLabelInput: FC<{\n name: string;\n setName: (name: string) => void;\n onKeyPress?: (e: KeyboardEvent) => void;\n}> = ({ name, setName, onKeyPress }) => {\n return (\n <LabelInput\n height=\"24px\"\n colorTheme=\"dark\"\n autoFocus={true}\n placeholder=\"Label name\"\n maxLength={144}\n value={name}\n handleChange={e => setName(e.target.value)}\n onKeyPress={onKeyPress}\n dataTest='sidebar-labels-new-input'\n />\n );\n};\n\nexport default AddNewLabelInput;\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledWarning = styled.div`\n padding: 0 8px;\n margin-bottom: 8px;\n opacity: 0.9;\n`;\n\nconst StyledWarningLine = styled.div`\n height: 1px;\n border-top: 1px solid ${props => props.theme.Colors.coral};\n margin-bottom: 4px;\n`;\n\nconst StyledWarningText = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.coral};\n`;\n\nconst LabelInputWarning = () => {\n return (\n <StyledWarning>\n <StyledWarningLine />\n <StyledWarningText>Label name is not unique</StyledWarningText>\n </StyledWarning>\n );\n};\n\nexport default LabelInputWarning;\n","const keyPressed = (ev: KeyboardEvent, key: string) => {\n if (!ev.key) return false;\n return ev.key === key;\n};\n\nexport const enterPressed = (ev: KeyboardEvent) => keyPressed(ev, 'Enter');\nexport const escPressed = (ev: KeyboardEvent) => keyPressed(ev, 'Escape');\n","import { makeStyles, Theme } from '@material-ui/core';\nimport styled from 'styled-components';\nimport Checkbox from '../../../ui/components/Checkbox';\nimport { Input } from '../../../ui/components/input';\n\nimport { StyleProps } from './types';\n\nexport const useStyles = makeStyles<Theme, StyleProps>(theme => ({\n menuListClassName: {\n width: ({ customWidth }) =>\n customWidth ? `${customWidth}px` : '168px',\n boxShadow: '0 5px 20px 0 rgba(0, 0, 0, 0.1)',\n padding: '16px 8px',\n borderRadius: '8px !important',\n right: '40px !important',\n marginTop: ({ marginTop }) =>\n marginTop ? `${marginTop}px !important` : '5px !important',\n marginLeft: '240px !important',\n background: 'var(--ps-white-1)',\n },\n popper: {\n zIndex: 999999,\n },\n}));\n\nexport const DotsIconContainer = styled.div<{ disabled: boolean }>`\n height: 100%;\n padding: 0 6px 0 4px;\n width: 20px;\n cursor: pointer;\n color: ${props =>\n props.disabled ? 'var(--ps-grey-1)' : 'var(--ps-white-1)'};\n &:hover {\n color: ${props =>\n props.disabled ? 'var(--ps-grey-1)' : 'var(--ps-white-1)'};\n }\n`;\n\nexport const StyledLabelListItemContainer = styled.div``;\n\nexport const ChildLabelsContainer = styled.div<{\n expanded: boolean;\n}>`\n display: ${props => (props.expanded ? 'block' : 'none')};\n margin-left: 8px;\n`;\n\nexport const EditLabelActionsContainer = styled.div`\n margin: 0 16px;\n`;\n\nexport const LabelItemActions = styled.div<{ menuOpen?: boolean }>`\n display: ${props => (props.menuOpen ? 'flex' : 'none')};\n user-select: none;\n align-items: center;\n height: 100%;\n`;\n\nexport const StyledCheckbox = styled(Checkbox)`\n height: 100%;\n padding-left: 6px;\n`;\n\nexport const LabelNameContainer = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n height: 100%;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n ${props => props.disabled && 'pointer-events: none'}\n`;\n\nexport const ArrowContainer = styled.div`\n width: 8px;\n margin-right: 4px;\n cursor: pointer;\n color: var(--ps-grey-1);\n`;\n\nexport const CollapseArrow = styled.div`\n height: 8px;\n display: flex;\n`;\n\nexport const LabelListItemInputContainer = styled.div`\n flex: 1;\n`;\n\nexport const LabelListItemInput = styled(Input)<{\n ref?: any;\n readOnly?: boolean;\n}>`\n height: 100%;\n color: var(--ps-grey-1);\n font-size: 13px;\n font-weight: 500;\n padding: 0 4px;\n text-overflow: ellipsis;\n white-space: nowrap;\n ${props => props.readOnly && `pointer-events: none`}\n`;\n\nexport const NoPermissionPlaceHolder = styled.div`\n width: 16px;\n`;\n\nexport const StyledLabelListItem = styled.div<{\n selected?: boolean;\n modified?: boolean;\n searched?: boolean;\n}>`\n height: 32px;\n background: var(--ps-graphite-2);\n color: var(--ps-grey-1);\n border-radius: 4px;\n font-size: 13px;\n align-items: center;\n display: flex;\n padding-left: 8px;\n padding-right: 6px;\n background: var(--ps-graphite-2);\n ${LabelItemActions} {\n display: ${props => (props.selected ? 'flex' : 'none')};\n }\n ${LabelListItemInput}, ${ArrowContainer} {\n color: ${props =>\n props.selected || props.modified || props.searched\n ? 'var(--ps-white-1)'\n : 'unset'};\n }\n &:hover ${LabelItemActions} {\n display: flex;\n }\n &:hover ${LabelListItemInput}, :hover ${ArrowContainer} {\n color: var(--ps-white-1);\n }\n &:hover {\n background: var(--ps-graphite-1);\n }\n`;\n\nexport const AddLabelSection = styled.div`\n margin-bottom: 8px;\n padding: 0 16px;\n`;","import { FC, useEffect, useRef } from 'react';\nimport { ClickAwayListener, Grow, MenuList, Popper } from '@material-ui/core';\n\nimport Dots from '../../../ui/icons/Dots';\nimport { LabelListActionsProps } from './types';\nimport { DotsIconContainer, useStyles } from './styles';\n\nconst LabelListActions: FC<LabelListActionsProps> = props => {\n const {\n children,\n isMenuListOpen,\n handleOpen,\n handleClose,\n customWidth,\n marginTop,\n disabled\n } = props;\n\n const classes = useStyles({ customWidth, marginTop });\n const menuListAnchorRef = useRef<HTMLDivElement>(null);\n\n // to close the menu while scrolling\n useEffect(() => {\n const labelsScrollableContainer = document.getElementById(\n 'labels-scrollable-container'\n );\n\n labelsScrollableContainer?.addEventListener('scroll', event => {\n handleClose();\n });\n\n return () => {\n labelsScrollableContainer?.removeEventListener('scroll', event => {\n handleClose();\n });\n };\n }, [handleClose]);\n\n return (\n <DotsIconContainer\n ref={menuListAnchorRef}\n id={`label-list-action-button`}\n aria-controls={\n isMenuListOpen ? `label-list-action-menu` : undefined\n }\n aria-expanded={isMenuListOpen ? 'true' : undefined}\n aria-haspopup=\"true\"\n disabled={disabled}\n onClick={handleOpen}\n >\n <Dots />\n {isMenuListOpen && (\n <Popper\n open={isMenuListOpen}\n anchorEl={menuListAnchorRef.current}\n className={classes.popper}\n >\n {({ TransitionProps }) => (\n <Grow {...TransitionProps}>\n <ClickAwayListener onClickAway={handleClose}>\n <MenuList\n autoFocusItem={isMenuListOpen}\n id={`label-list-action-menu`}\n aria-labelledby={`label-list-action-button`}\n className={classes.menuListClassName}\n >\n {children}\n </MenuList>\n </ClickAwayListener>\n </Grow>\n )}\n </Popper>\n )}\n </DotsIconContainer>\n );\n};\n\nexport default LabelListActions;\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { kebabCase } from 'lodash';\n\nimport { ActionItem } from '../../../ui/components/ActionButton';\nimport {\n useCreateLabelService,\n useDeleteLabelService,\n useExpandLabelFieldByIdService,\n useSaveUserFiltersService,\n useSelectLabelFilterActionService,\n useSetEditingLabelActionService,\n useSetLabelFilterActionService,\n useToggleCollapseLabelFieldService,\n useUpdateLabelService,\n} from '../store/services';\nimport { Label } from '../../../constants/interfaces/Label';\nimport EditLabelActions from './EditLabelActions';\nimport { useFocus } from '../../../helpers/hooks/useFocus';\nimport { useLabelsConfigState, useLabelsState } from '../store/states';\nimport AddNewLabelInput from './AddNewLabelInput';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport TriangleDown from '../../../ui/icons/TriangleDown';\nimport TriangleRight from '../../../ui/icons/TriangleRight';\nimport { Variables } from '../../../theme/variables';\nimport LabelInputWarning from './LabelInputWarning';\nimport { enterPressed } from '../../../helpers/functions/key-down-helpers';\nimport { listToTree } from '../../../helpers/functions/list-to-tree';\nimport { useHandleSelectLabels } from '../tools';\nimport { CheckPermission } from '../../permissions';\nimport { usePermissionsState } from '../../permissions/store/state';\nimport LabelListActions from './LabelListActions';\nimport {\n AddLabelSection,\n ArrowContainer,\n ChildLabelsContainer,\n CollapseArrow,\n EditLabelActionsContainer,\n LabelItemActions,\n LabelListItemInput,\n LabelListItemInputContainer,\n LabelNameContainer,\n NoPermissionPlaceHolder,\n StyledCheckbox,\n StyledLabelListItem,\n StyledLabelListItemContainer,\n} from './styles';\nimport { LabelListItemProps } from './types';\nimport { useShowConfirmModalDialog } from '../../../ui/components/ModalDialogs/store/actions';\n\nexport const LabelListItem: FC<LabelListItemProps> = ({\n label,\n allLabels,\n searchResults,\n openActions,\n toggleOpenActions,\n deleteLabel,\n editingLabels,\n setEditingLabel,\n createLabel,\n updateLabel,\n toggleCollapse,\n labelsCollapseState,\n setLabelFilters,\n selectedLabels,\n saveUserFilters,\n expandLabelById,\n disableLabels,\n}) => {\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const [savingLabels, setSavingLabels] = useState(false);\n const [labelName, setLabelName] = useState(label.name);\n const [newLabelName, setNewLabelName] = useState('');\n\n const isLabelSelected = selectedLabels.includes(label.id);\n const isLabelPartiallySelected = selectedLabels.includes(-label.id);\n\n const editMode =\n !!editingLabels && editingLabels.id === label.id\n ? editingLabels.mode\n : 'view';\n\n const isLabelListActionDisabled = editingLabels?.mode === 'edit'; \n const isExpanded = labelsCollapseState.includes(label.id);\n\n const [inputRef, setFocus] = useFocus();\n\n const hasChildren = (label?: Label) => {\n return label && label.children && label.children.length > 0;\n };\n\n const checkForNotUniqueLabelName = (\n labelName: string,\n labels?: Label,\n labelId?: number\n ) => {\n if (!labels || !labels.children) return false;\n const children = labels.children;\n const filteredLabels = children.filter(\n (label: Label) => label.name === labelName && label.id !== labelId\n );\n return filteredLabels.length > 0;\n };\n\n const childLabelNotUnique = checkForNotUniqueLabelName(newLabelName, label);\n const addNewLabelDisabled = childLabelNotUnique || newLabelName.length < 1;\n\n const editLabelNotUnique = checkForNotUniqueLabelName(\n labelName,\n allLabels &&\n allLabels.filter(parent => parent.id === label.parentId)[0],\n label.id\n );\n const editLabelDisabled = editLabelNotUnique || labelName.length < 1;\n\n const handleSelectLabels = useHandleSelectLabels();\n\n const handleLabelSelection = () => {\n const labelsTree = listToTree(allLabels);\n setLabelFilters(handleSelectLabels(label, selectedLabels, labelsTree));\n setSavingLabels(true);\n };\n\n const permissions = usePermissionsState();\n useEffect(() => {\n if (\n savingLabels &&\n permissions.includes(NEW_PERMISSIONS.SAVE_SEARCH_FILTER)\n ) {\n saveUserFilters(selectedLabels);\n setSavingLabels(false);\n }\n }, [\n selectedLabels,\n savingLabels,\n setSavingLabels,\n saveUserFilters,\n permissions,\n ]);\n\n const updateLabelName = () => {\n updateLabel(label.id, {\n name: labelName,\n parentId: label.parentId,\n })\n .then(() => {\n setEditingLabel();\n })\n .catch(() => {\n setLabelName(label.name);\n setEditingLabel();\n });\n };\n\n const addSubLabelField = () => {\n toggleOpenActions(false);\n setEditingLabel({\n id: label.id,\n mode: 'new',\n });\n expandLabelById(label.id);\n };\n\n const createSubLabel = () => {\n createLabel({\n name: newLabelName,\n parentId: label.id,\n });\n setNewLabelName('');\n setEditingLabel();\n };\n\n\n const handleDeleteLabel = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description:\n 'Deleting the Label will remove it from all related content items and users. It cannot be undone.',\n confirmButtonText: 'Proceed',\n cancelButtonText: 'Cancel',\n onConfirm: () => {\n deleteLabel(label);\n toggleOpenActions(false);\n },\n });\n toggleOpenActions(false);\n },\n [deleteLabel, label, showConfirmationModalDialog, toggleOpenActions]\n ); \n\n return (\n <>\n <StyledLabelListItemContainer>\n <StyledLabelListItem\n title={labelName}\n selected={\n isLabelSelected ||\n isLabelPartiallySelected ||\n openActions\n }\n modified={editMode !== 'view'}\n searched={searchResults && searchResults.includes(label.id)}\n >\n <LabelNameContainer\n onClick={() => toggleCollapse(label.id)}\n disabled={!hasChildren(label)}\n data-test={`sidebar-labels-item-${kebabCase(\n labelName\n )}`}\n >\n <ArrowContainer>\n {hasChildren(label) && (\n <CollapseArrow>\n {labelsCollapseState.includes(label.id) ? (\n <TriangleDown />\n ) : (\n <TriangleRight />\n )}\n </CollapseArrow>\n )}\n </ArrowContainer>\n <LabelListItemInputContainer>\n <LabelListItemInput\n ref={inputRef}\n height={'auto'}\n value={labelName}\n handleChange={(e: any) =>\n setLabelName(e.target.value)\n }\n onKeyPress={e => {\n if (enterPressed(e) && !editLabelDisabled) {\n updateLabelName();\n }\n }}\n colorTheme=\"transparent\"\n maxLength={144}\n readOnly={editMode !== 'edit'}\n />\n </LabelListItemInputContainer>\n </LabelNameContainer>\n <LabelItemActions menuOpen={openActions}>\n <StyledCheckbox\n checked={\n isLabelSelected || isLabelPartiallySelected\n }\n partial={isLabelPartiallySelected}\n handleChange={handleLabelSelection}\n size={12}\n disabled={disableLabels}\n background={Variables.Colors.dark}\n border={Variables.Colors.steelGrey}\n />\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.UPDATE_LABEL,\n NEW_PERMISSIONS.CREATE_LABEL,\n NEW_PERMISSIONS.DELETE_LABEL,\n ]}\n alternateContent={<NoPermissionPlaceHolder />}\n >\n <LabelListActions\n isMenuListOpen={openActions}\n handleOpen={() =>\n !isLabelListActionDisabled &&\n toggleOpenActions(true)\n }\n handleClose={() => toggleOpenActions(false)}\n disabled={isLabelListActionDisabled}\n >\n {label.parentsCount < 4 && (\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.CREATE_LABEL,\n ]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n addSubLabelField();\n }}\n >\n Add a Sub Label\n </ActionItem>\n </CheckPermission>\n )}\n <CheckPermission\n permissions={[NEW_PERMISSIONS.UPDATE_LABEL]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n toggleOpenActions(false);\n setEditingLabel({\n id: label.id,\n mode: 'edit',\n });\n setFocus();\n }}\n >\n Edit Name\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.DELETE_LABEL]}\n >\n <ActionItem\n destructive={true}\n onClick={handleDeleteLabel}\n >\n Delete Label\n </ActionItem>\n </CheckPermission>\n </LabelListActions>\n </CheckPermission>\n </LabelItemActions>\n </StyledLabelListItem>\n {editMode === 'edit' && (\n <div>\n {editLabelNotUnique && <LabelInputWarning />}\n <EditLabelActionsContainer>\n <EditLabelActions\n onConfirm={updateLabelName}\n confirmDisabled={editLabelDisabled}\n onCancel={() => {\n setLabelName(label.name);\n setEditingLabel();\n }}\n />\n </EditLabelActionsContainer>\n </div>\n )}\n {editMode === 'new' && (\n <AddLabelSection>\n <AddNewLabelInput\n name={newLabelName}\n setName={setNewLabelName}\n onKeyPress={e => {\n if (enterPressed(e) && !addNewLabelDisabled) {\n createSubLabel();\n }\n }}\n />\n {childLabelNotUnique && <LabelInputWarning />}\n <EditLabelActions\n onConfirm={createSubLabel}\n confirmDisabled={addNewLabelDisabled}\n onCancel={() => {\n setNewLabelName('');\n setEditingLabel();\n }}\n />\n </AddLabelSection>\n )}\n </StyledLabelListItemContainer>\n {hasChildren(label) && (\n <ChildLabelsContainer\n expanded={isExpanded}\n >\n {label.children!.map((childLabel: Label) => (\n <LabelListItemContainer\n key={childLabel.id}\n label={childLabel}\n labelsCollapseState={labelsCollapseState}\n selectedLabels={selectedLabels}\n siblingIds={\n label.children &&\n label.children.map(label => label.id)\n }\n disableLabels={disableLabels}\n />\n ))}\n </ChildLabelsContainer>\n )}\n </>\n );\n};\n\nconst LabelListItemContainer: FC<{\n label: Label;\n labelsCollapseState: number[];\n selectedLabels: number[];\n siblingIds?: number[];\n disableLabels?: boolean;\n}> = ({ label, labelsCollapseState, selectedLabels, disableLabels }) => {\n const [open, setOpen] = useState(false);\n const deleteLabel = useDeleteLabelService();\n\n const allLabels = useLabelsState();\n\n const labelsConfigState = useLabelsConfigState();\n const setEditingLabel = useSetEditingLabelActionService();\n const createLabel = useCreateLabelService();\n const updateLabel = useUpdateLabelService();\n\n const toggleCollapse = useToggleCollapseLabelFieldService();\n const expandLabelById = useExpandLabelFieldByIdService();\n const selectLabelFilter = useSelectLabelFilterActionService();\n const setLabelFilters = useSetLabelFilterActionService();\n const saveUserFilters = useSaveUserFiltersService();\n\n return (\n <LabelListItem\n label={label}\n searchResults={allLabels.searchResults}\n allLabels={allLabels.data && allLabels.data.items}\n openActions={open}\n deleteLabel={deleteLabel}\n toggleOpenActions={setOpen}\n expandLabelById={expandLabelById}\n editingLabels={labelsConfigState.editingLabels}\n setEditingLabel={setEditingLabel}\n createLabel={createLabel}\n updateLabel={updateLabel}\n toggleCollapse={toggleCollapse}\n labelsCollapseState={labelsCollapseState}\n selectLabelFilter={selectLabelFilter}\n setLabelFilters={setLabelFilters}\n saveUserFilters={saveUserFilters}\n selectedLabels={selectedLabels}\n disableLabels={disableLabels}\n />\n );\n};\n\nexport default LabelListItemContainer;","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Label } from '../../../constants/interfaces/Label';\nimport LabelListItem from './LabelListtem';\n\nconst StyledLabelsList = styled.div`\n padding-left: 8px;\n margin-bottom: 16px;\n`;\n\nconst ScrollableLabelContainer = styled.div`\n height: 100%;\n`;\n\nconst LabelsList: FC<{\n labels?: Label[];\n labelsCollapseState: number[];\n selectedLabels: number[];\n disableLabels?: boolean;\n}> = ({ labels, labelsCollapseState, selectedLabels, disableLabels }) => {\n if (!labels || (labels && labels.length === 0)) return null;\n return (\n <StyledLabelsList>\n <ScrollableLabelContainer>\n {labels &&\n labels.map(label => {\n return (\n <LabelListItem\n key={label.id}\n label={label}\n labelsCollapseState={labelsCollapseState}\n selectedLabels={selectedLabels}\n disableLabels={disableLabels}\n />\n );\n })}\n </ScrollableLabelContainer>\n </StyledLabelsList>\n );\n};\n\nexport const LabelsListContainer: FC<{\n labels?: Label[];\n labelsCollapseState: number[];\n selectedLabels: number[];\n disableLabels?: boolean;\n}> = ({ labels, labelsCollapseState, selectedLabels, disableLabels }) => {\n return (\n <LabelsList\n labels={labels}\n labelsCollapseState={labelsCollapseState}\n selectedLabels={selectedLabels}\n disableLabels={disableLabels}\n />\n );\n};\n\nexport default LabelsListContainer;\n","import React, { FC, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { MutateLabelsParams } from '../../../api/labels/types';\nimport EditLabelActions from './EditLabelActions';\nimport AddNewLabelInput from './AddNewLabelInput';\nimport LabelInputWarning from './LabelInputWarning';\nimport { Label } from '../../../constants/interfaces/Label';\nimport { enterPressed } from '../../../helpers/functions/key-down-helpers';\n\nconst AddLabelSection = styled.div`\n margin-bottom: 8px;\n`;\n\nconst AddLabels: FC<{\n saveLabel?: (params: MutateLabelsParams) => Promise<any>;\n setEditing: () => void;\n labels?: Label[];\n}> = ({ saveLabel, setEditing, labels }) => {\n const [labelName, setLabelName] = useState('');\n const [labelUnique, setLabelUnique] = useState(true);\n const addLabelDisabled = !labelUnique || labelName.trim().length < 1;\n useEffect(() => {\n if (!labels) return;\n const filteredLabels = labels.filter(\n (label: Label) => label.name === labelName && !label.parentId\n );\n setLabelUnique(filteredLabels.length < 1);\n }, [labels, labelName]);\n\n const handleCreateLabel = () => {\n saveLabel &&\n saveLabel({ name: labelName })\n .then(result => {\n setEditing();\n setLabelName('');\n })\n .catch(e => {});\n };\n\n return (\n <AddLabelSection>\n <AddNewLabelInput\n name={labelName}\n setName={setLabelName}\n onKeyPress={e => {\n if (enterPressed(e) && !addLabelDisabled) {\n handleCreateLabel();\n }\n }}\n />\n {!labelUnique && <LabelInputWarning />}\n <EditLabelActions\n onCancel={() => {\n setLabelName('');\n setEditing();\n }}\n confirmDisabled={addLabelDisabled}\n onConfirm={handleCreateLabel}\n />\n </AddLabelSection>\n );\n};\n\nexport default AddLabels;\n","import React from 'react';\nimport styled from 'styled-components';\nimport NoLabels from '../../../ui/icons/NoLabels';\n\nconst StyledEmptyLabels = styled.div`\n display: flex;\n padding-top: 56px;\n flex-direction: column;\n align-items: center;\n`;\n\nconst StyledEmptyLabelsContent = styled.div`\n max-width: 140px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst NoLabelsIcon = styled.div`\n width: 30px;\n height: 40px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 16px;\n`;\n\nconst NoLabelsTitle = styled.div`\n font-weight: bold;\n font-size: 13px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoLabelsDescription = styled.div`\n font-size: 11px;\n color: ${props => props.theme.Colors.cloudyBlue};\n width: 100%;\n white-space: break-spaces;\n`;\n\nconst EmptyLabels = () => {\n return (\n <StyledEmptyLabels>\n <StyledEmptyLabelsContent>\n <NoLabelsIcon>\n <NoLabels />\n </NoLabelsIcon>\n <NoLabelsTitle>No Matching Label</NoLabelsTitle>\n <NoLabelsDescription>\n There are no labels that match your search\n </NoLabelsDescription>\n </StyledEmptyLabelsContent>\n </StyledEmptyLabels>\n );\n};\n\nexport default EmptyLabels;\n","import { useEffect, useRef } from 'react';\nimport equal from 'deep-equal';\n\n/**\n * @function usePreviousData\n * @param { T } value\n * @returns { T }\n */\nexport function usePreviousData<T>(value: T) {\n const ref = useRef<T>();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\n/**\n * @function useIfChanged\n * @param { T } value\n * @param { boolean } dontCheckEmpty\n * @returns { boolean }\n */\nexport function useIfChanged<T>(value: T, dontCheckEmpty?: boolean) {\n const previousValue = usePreviousData(value);\n\n if (!previousValue && dontCheckEmpty) {\n return false;\n }\n return !equal(value, previousValue && previousValue);\n}\n","import React, { useContext } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Dispatch } from 'redux';\r\n\r\nimport { PaginationResult, ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { UserV2 } from '../../../constants/interfaces/User';\r\nimport {\r\n EnrollmentDailyTraining,\r\n EnrollmentInterface,\r\n EnrollmentProgress\r\n} from '../../../constants/interfaces/Enrollments';\r\nimport { Team, TeamV2 } from '../../../constants/interfaces/Team';\r\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\r\nimport { AppState } from '../../../store/reducers';\r\nimport { StateWithLabels } from '../../portableLabels/store/hors/withLabels';\r\nimport { TeamMember } from '../../../constants/interfaces/TeamMember';\r\nimport { TeamLeader } from '../../../constants/interfaces/TeamLeader';\r\nimport { TrainingPractisSet } from '../../../constants/interfaces/TrainingPractisSet';\r\nimport { selectItemsByIds } from '../../../tools/redux';\r\nimport { isEqual } from 'lodash';\r\n\r\nexport interface TeamLeadersState {\r\n data?: PaginationResult<TeamLeader>;\r\n selected: number[];\r\n saved: number[];\r\n}\r\n\r\nexport interface TeamsState {\r\n myTeams?: ListResult<Team>;\r\n selectedMyTeamsItems?: number[];\r\n teamLeaders: TeamLeadersState;\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport type TeamsStateSelector = (state: any) => TeamsState;\r\n\r\nexport const TeamsStateSelectorContext = React.createContext<TeamsStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useTeamsState(): TeamsState {\r\n return useSelector(useContext(TeamsStateSelectorContext), isEqual);\r\n}\r\n\r\nexport interface UpdateTeamsState {\r\n data?: any;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdateTeamsStateStateSelector = (state: any) => UpdateTeamsState;\r\n\r\nexport const UpdateTeamsStateStateSelectorContext = React.createContext<UpdateTeamsStateStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdateTeamsState(): UpdateTeamsState {\r\n return useSelector(useContext(UpdateTeamsStateStateSelectorContext));\r\n}\r\n\r\nexport enum TeamUpdateStatus {\r\n IN_PROGRESS = 'inProgress',\r\n COMPLETED = 'completed',\r\n ERROR = 'error'\r\n}\r\n\r\nexport interface TeamEditState {\r\n data?: TeamV2;\r\n allUsers?: ListResult<UserV2>;\r\n teamMembers?: ListResult<TeamMember>;\r\n assignedLabels: number[];\r\n deletedLabels: number[];\r\n updatedTeam?: Partial<TeamV2>;\r\n loading: boolean;\r\n error?: string;\r\n updateStatus?: TeamUpdateStatus\r\n}\r\n\r\nexport type TeamEditSelector = (state: any) => TeamEditState;\r\n\r\nexport const TeamEditSelectorContext = React.createContext<TeamEditSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useTeamEditState(): TeamEditState {\r\n return useSelector(useContext(TeamEditSelectorContext));\r\n}\r\n\r\n//region Team members\r\nexport type TeamMembersStateSelector = (state: AppState) => TeamMembersState;\r\n\r\nexport type TeamMembersBaseState = {\r\n itemsOnPage: number;\r\n list: ListResult<TeamMember>;\r\n data?: TeamV2;\r\n loading: boolean;\r\n error: string | null;\r\n};\r\n\r\nexport interface UpdateMembersState {\r\n data?: any;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdateMembersStateStateSelector = (\r\n state: any\r\n) => UpdateMembersState;\r\n\r\nexport const UpdateMembersStateStateSelectorContext = React.createContext<UpdateMembersStateStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdateMembersState(): UpdateMembersState {\r\n return useSelector(useContext(UpdateMembersStateStateSelectorContext));\r\n}\r\n\r\nexport type TeamMembersState = StateWithLabels & TeamMembersBaseState;\r\n\r\nexport const TeamMembersStateSelectorContext = React.createContext<TeamMembersStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useTeamMembersState(): TeamMembersState {\r\n return useSelector(useContext(TeamMembersStateSelectorContext));\r\n}\r\n//endregion\r\n\r\nexport interface ProgressState {\r\n updatedProgress: UpdatedProgressState;\r\n enrollments: EnrollmentState;\r\n report: PractisSetReportState;\r\n}\r\n\r\nexport interface PractisSetsTrainingState {\r\n data?: ListResult<TrainingPractisSet>;\r\n teamData?: TeamV2;\r\n selectedPractisSets?: number[];\r\n checked: number[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport type PractisSetsStateSelector = (state: any) => PractisSetsTrainingState;\r\n\r\nexport const TrainerStateSelectorContext = React.createContext<PractisSetsStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useTrainerPractisSetState(): PractisSetsTrainingState {\r\n return useSelector(useContext(TrainerStateSelectorContext));\r\n}\r\n\r\nexport interface UpdatedProgressState {\r\n data?: PractisSets;\r\n updateType?: 'create' | 'update' | 'delete' | 'labels';\r\n loading?: boolean;\r\n}\r\n\r\nexport type UpdatedProgressStateSelector = (state: any) => UpdatedProgressState;\r\n\r\nexport const UpdatedProgressStateSelectorContext = React.createContext<UpdatedProgressStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useUpdatedProgressState(): UpdatedProgressState {\r\n return useSelector(useContext(UpdatedProgressStateSelectorContext));\r\n}\r\n\r\nexport interface EnrollmentState {\r\n data?: PaginationResult<EnrollmentInterface>;\r\n loading?: boolean;\r\n practisSet?: PractisSets;\r\n update?: Array<'invite' | 'reInvite' | 'unassign'>;\r\n error?: string;\r\n}\r\n\r\nexport type EnrollmentStateSelector = (state: any) => EnrollmentState;\r\n\r\nexport const EnrollmentStateSelectorContext = React.createContext<EnrollmentStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useEnrollmentState(): EnrollmentState {\r\n return useSelector(useContext(EnrollmentStateSelectorContext));\r\n}\r\n\r\nexport function selectSelectedProgresses(state: EnrollmentState, selectedProgressIds: number[] | undefined): EnrollmentInterface[] {\r\n return selectItemsByIds<EnrollmentInterface>(selectedProgressIds, state?.data?.items);\r\n}\r\n\r\nexport interface AssignUsersState {\r\n data?: ListResult<UserV2 & {dueDate?: Date}>;\r\n selectedUsers?: number[];\r\n loading?: boolean;\r\n update?: Array<'invite' | 'reInvite' | 'unassign'>;\r\n error?: string;\r\n}\r\n\r\nexport type TrainerInvitationStateSelector = (state: any) => AssignUsersState;\r\n\r\nexport const TrainerInvitationStateSelectorContext = React.createContext<TrainerInvitationStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function useTrainerInvitationState(): [AssignUsersState, Dispatch<any>] {\r\n const selector = useContext(TrainerInvitationStateSelectorContext);\r\n const state = useSelector(selector);\r\n const dispatch = useDispatch();\r\n return [state, dispatch];\r\n}\r\n\r\nexport interface PractisSetReportState {\r\n enrollment?: EnrollmentInterface;\r\n progress?: ListResult<EnrollmentProgress>;\r\n dailyTraining?: EnrollmentDailyTraining[];\r\n loading?: boolean;\r\n error?: string;\r\n}\r\n\r\nexport type PractisSetReportStateSelector = (\r\n state: any\r\n) => PractisSetReportState;\r\n\r\nexport const PractisSetReportStateSelectorContext = React.createContext<PractisSetReportStateSelector>(\r\n () => {\r\n throw new Error('Not implemented');\r\n }\r\n);\r\n\r\nexport function usePractisSetReportState(): PractisSetReportState {\r\n return useSelector(useContext(PractisSetReportStateSelectorContext));\r\n}\r\n","import { Roles } from '../../../constants/interfaces/Roles';\n\nexport enum ACTIONS {\n LOAD_USER_ROLES_START = 'LOAD_USER_ROLES_START =',\n LOAD_USER_ROLES_SUCCESS = 'LOAD_USER_ROLES_SUCCESS',\n LOAD_USER_ROLES_FAILURE = 'LOAD_USER_ROLES_FAILURE',\n}\n\nexport function loadUserRolesStart() {\n return {\n type: ACTIONS.LOAD_USER_ROLES_START as ACTIONS.LOAD_USER_ROLES_START,\n };\n}\n\nexport function loadUserRolesSuccess(data: Roles[]) {\n return {\n type: ACTIONS.LOAD_USER_ROLES_SUCCESS as ACTIONS.LOAD_USER_ROLES_SUCCESS,\n data,\n };\n}\n\nexport function loadUserRolesFailure(error: string) {\n return {\n type: ACTIONS.LOAD_USER_ROLES_FAILURE as ACTIONS.LOAD_USER_ROLES_FAILURE,\n error,\n };\n}\n","import React, { createContext, FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { debounce } from 'lodash';\r\nimport { Input } from '../../../ui/components/input';\r\nimport styled from 'styled-components';\r\nimport Dots from '../../../ui/icons/Dots';\r\nimport LabelsListContainer from '../components/LabelsList';\r\nimport {\r\n EditingLabels,\r\n useLabelsConfigState,\r\n useLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../store/states';\r\nimport { useSelector } from 'react-redux';\r\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\r\nimport {\r\n useClearLabelFilterActionService,\r\n useCollapseAllLabelsService,\r\n useCreateLabelService,\r\n useExpandAllLabelsService,\r\n useExpandLabelFieldByIdService,\r\n useSaveUserFiltersService,\r\n useSearchLabelsService,\r\n useSetAssignLabelsActionService,\r\n useSetEditingLabelActionService,\r\n useSetLabelFilterActionService,\r\n useSetLabelsSearchTermService,\r\n} from '../store/services';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../constants/interfaces/filters';\r\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { Label } from '../../../constants/interfaces/Label';\r\nimport { MutateLabelsParams } from '../../../api/labels/types';\r\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\r\nimport AddLabels from '../components/AddLabels';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { ClickAwayListener } from '@material-ui/core';\r\nimport { listToTree } from '../../../helpers/functions/list-to-tree';\r\nimport { treeToList } from '../../../helpers/functions/tree-to-list';\r\nimport { ActionItem } from '../../../ui/components/ActionButton';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport EmptyLabels from '../components/EmptyLabels';\r\nimport { Variables } from '../../../theme/variables';\r\nimport { sortLabels, useRenewLabelsStateOnUpdate } from '../tools';\r\nimport { useIfChanged } from '../../../helpers/hooks/usePreviousData';\r\nimport { getAllUsersLoading } from '../../users/store/reducers';\r\nimport { useInvitationsState } from '../../users/store/states';\r\nimport {\r\n useLibraryChallengesState,\r\n useLibraryPractisSetState,\r\n useLibraryScenariosState,\r\n} from '../../library/store/states';\r\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\r\nimport { CheckPermission } from '../../permissions';\r\nimport { usePermissionsState } from '../../permissions/store/state';\r\nimport {\r\n useTeamMembersState,\r\n useTeamsState,\r\n useTrainerPractisSetState,\r\n} from '../../teams/store/states';\r\nimport { useSearchDebounced } from '../../../helpers/hooks/useSearch';\r\nimport { usePortableLabelsState } from '../../portableLabels/store/states';\r\nimport Search from '../../../ui/icons/Search';\r\nimport { SEARCH_INPUT_DEBOUNCE_DELAY } from '../../../constants/variables/component-settings';\r\n\r\nconst StyledCreateLabels = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst CreateLabelsHeader = styled.div`\r\n padding: 0 16px 19px 16px;\r\n`;\r\n\r\nconst SearchInput = styled(Input) <{ placeholderColor?: string }>`\r\n height: 40px;\r\n padding: 0 16px 0 0;\r\n font-size: 11px;\r\n font-weight: 600;\r\n\r\n ${props =>\r\n !!props.placeholderColor &&\r\n `\r\n &:: placeholder {\r\n color: ${props.placeholderColor};\r\n font-size: 11px;\r\n }`}\r\n`;\r\n\r\nconst CreateLabelsBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 12px 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst FiltersSelectedPanel = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst SelectedLabelsStyle = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst ClearSelectedLabels = styled.div<{ disabled?: boolean }>`\r\n font-size: 11px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n user-select: none;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.steelGrey\r\n : props.theme.Colors.darkSkyBlue};\r\n &:hover {\r\n color: ${props => props.theme.Colors.lightBlue};\r\n }\r\n &:active {\r\n color: ${props => props.theme.Colors.windowsBlue};\r\n }\r\n ${props => props.disabled && 'pointer-events: none'}\r\n`;\r\n\r\nconst FilterActionsMenu = styled.div<{ disabled?: boolean }>`\r\n width: 12px;\r\n height: 18px;\r\n border-radius: 6px;\r\n color: var(--ps-grey-1);\r\n cursor: pointer;\r\n padding: 1px;\r\n &:active {\r\n background: ${props => props.theme.Colors.dark};\r\n opacity: 0.7;\r\n }\r\n ${props => props.disabled && `pointer-events: none`}\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.white};\r\n`;\r\n\r\nconst StyledAddLabels = styled.div`\r\n padding: 0 16px 100px 16px;\r\n`;\r\n\r\nconst StyledLinkText = styled(Button)`\r\n font-size: 13px;\r\n font-weight: 500;\r\n margin: 0 !important;\r\n & span {\r\n font-weight: bold;\r\n margin-right: 10px;\r\n }\r\n`;\r\n\r\nconst LabelsActionMenu = styled.div`\r\n width: 184px;\r\n position: fixed;\r\n background: ${props => props.theme.Colors.white};\r\n padding: 16px 8px;\r\n border-radius: 8px;\r\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\r\n z-index: 1;\r\n margin-left: 150px;\r\n margin-top: 80px;\r\n`;\r\n\r\nconst LabelsScrollableContainer = styled.div`\r\n overflow: auto;\r\n flex: 1 1 auto;\r\n overflow-x: hidden;\r\n height: 0;\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: ${Variables.Colors.steelGrey40};\r\n border-radius: 8px;\r\n }\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: ${Variables.Colors.steelGrey40};\r\n }\r\n`;\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n overflow: hidden;\r\n border-radius: 4px;\r\n background: ${props => props.theme.Colors.dark};\r\n border: 1px solid ${props => props.theme.Colors.dark};\r\n\r\n &:focus-within {\r\n border: 1px solid ${props => props.theme.Colors.steelGrey};\r\n }\r\n`;\r\n\r\nconst Icon = styled.div`\r\n width: 40px;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SearchIcon = styled(Search) <{ disabled?: boolean }>`\r\n width: 12px;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.battleshipGrey\r\n : props.theme.Colors.steelGrey};\r\n`;\r\n\r\nexport const LabelsListScrollContext = createContext<number>(0);\r\n\r\nconst CreateLabels: FC<{\r\n labels?: PaginationResult<Label>;\r\n allLabels?: Label[];\r\n labelsCollapseState: number[];\r\n selectedLabels: number[];\r\n assignedLabels: number[];\r\n labelsModified?: boolean;\r\n searchLabels(searchParams: SearchParams): void;\r\n saveUserFilters(filters: number[] | null): void;\r\n updatedLabels?: Label;\r\n updateType?: 'create' | 'update' | 'delete';\r\n createLabel: (params: MutateLabelsParams) => Promise<any>;\r\n searchTerm: string;\r\n setLabelsSearchTerm: (value: string) => void;\r\n company?: CompanyInterface;\r\n setLabels(labels: number[]): void;\r\n clearLabels(): void;\r\n editingLabels?: EditingLabels;\r\n setEditingLabel: (configs?: EditingLabels) => void;\r\n setLabelFilters: (labelIds: number[]) => void;\r\n setAssignedLabels: (labelIds: number[]) => void;\r\n expandAll: () => void;\r\n collapseAll: () => void;\r\n expandLabel: (labelId: number) => void;\r\n disableLabels?: boolean;\r\n loading?: boolean;\r\n}> = ({\r\n labels,\r\n allLabels,\r\n labelsCollapseState,\r\n selectedLabels,\r\n assignedLabels,\r\n createLabel,\r\n searchLabels,\r\n updatedLabels,\r\n updateType,\r\n company,\r\n clearLabels,\r\n searchTerm,\r\n setLabelsSearchTerm,\r\n editingLabels,\r\n setEditingLabel,\r\n setLabelFilters,\r\n setAssignedLabels,\r\n expandAll,\r\n collapseAll,\r\n expandLabel,\r\n saveUserFilters,\r\n disableLabels,\r\n loading,\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const [savingLabels, setSavingLabels] = useState(false);\r\n \r\n const transformedLabels = useMemo(\r\n () => listToTree(treeToList(labels && labels.items)),\r\n [labels]\r\n );\r\n\r\n const [localSearchTerm, setLocalSearchTerm] = useState(searchTerm);\r\n const setLabelsSearchTermDebounced = useMemo(\r\n () => debounce(setLabelsSearchTerm, SEARCH_INPUT_DEBOUNCE_DELAY),\r\n [setLabelsSearchTerm]\r\n );\r\n const handleSearchTermChange = useCallback(\r\n (value, useDebounce) => {\r\n setLocalSearchTerm(value);\r\n if (useDebounce)\r\n setLabelsSearchTermDebounced(value);\r\n else\r\n setLabelsSearchTerm(value);\r\n },\r\n [setLabelsSearchTermDebounced, setLabelsSearchTerm]\r\n );\r\n\r\n const editMode =\r\n !!editingLabels && !editingLabels.id ? editingLabels.mode : 'view';\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: searchTerm,\r\n filters: [],\r\n orderBy: {},\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n };\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n refreshSearchParams,\r\n } = useSearchParamsState(initialSearchParams);\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n\r\n useEffect(() => {\r\n if (ifSearchParamsChanged) {\r\n searchLabels(searchParams);\r\n } \r\n }, [searchLabels, searchParams, company, ifSearchParamsChanged]);\r\n\r\n useEffect(() => {\r\n setSearchTerm(searchTerm);\r\n }, [searchTerm, setSearchTerm]);\r\n\r\n const permissions = usePermissionsState();\r\n useEffect(() => {\r\n if (\r\n savingLabels &&\r\n permissions.includes(NEW_PERMISSIONS.SAVE_SEARCH_FILTER)\r\n ) {\r\n saveUserFilters(selectedLabels);\r\n setSavingLabels(false);\r\n }\r\n }, [\r\n selectedLabels,\r\n savingLabels,\r\n setSavingLabels,\r\n saveUserFilters,\r\n permissions,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (searchTerm.length > 0) {\r\n const parentLabelPaths: any =\r\n labels &&\r\n labels.items\r\n .filter((label: Label) => {\r\n return !!label.path;\r\n })\r\n .map((label: Label) => label.path && label.path.split('/'));\r\n if (parentLabelPaths && parentLabelPaths.length > 0) {\r\n const flattened = [].concat.apply([], parentLabelPaths);\r\n\r\n const uniqueIds = new Set(\r\n flattened.filter((item: string) => item !== '')\r\n );\r\n\r\n for (let id of Array.from(uniqueIds)) {\r\n expandLabel(Number(id));\r\n }\r\n }\r\n }\r\n }, [searchTerm, labels, expandLabel]);\r\n\r\n useEffect(() => {\r\n if (updatedLabels) refreshSearchParams();\r\n }, [updatedLabels, refreshSearchParams]);\r\n\r\n const handleSelectLabels = useRenewLabelsStateOnUpdate();\r\n const ifAllLabelsChanged = useIfChanged(allLabels);\r\n\r\n useEffect(() => {\r\n const labelsTree = listToTree(allLabels);\r\n if (\r\n ifAllLabelsChanged &&\r\n updatedLabels &&\r\n (updateType === 'delete' || updateType === 'create')\r\n ) {\r\n setLabelFilters(\r\n handleSelectLabels(\r\n updatedLabels,\r\n selectedLabels,\r\n labelsTree,\r\n updateType\r\n )\r\n );\r\n\r\n setSavingLabels(true);\r\n }\r\n }, [\r\n allLabels,\r\n updatedLabels,\r\n updateType,\r\n handleSelectLabels,\r\n selectedLabels,\r\n setLabelFilters,\r\n ifAllLabelsChanged,\r\n ]);\r\n useEffect(() => {\r\n if (ifAllLabelsChanged && updatedLabels && updateType === 'delete') {\r\n if (updateType === 'delete') {\r\n setAssignedLabels(\r\n assignedLabels.filter(\r\n labelId => labelId !== updatedLabels.id\r\n )\r\n );\r\n }\r\n }\r\n }, [\r\n updatedLabels,\r\n updateType,\r\n assignedLabels,\r\n setAssignedLabels,\r\n ifAllLabelsChanged,\r\n ]);\r\n\r\n /**\r\n * @function isSearchDisabled\r\n * @returns { boolean }\r\n */\r\n const isSearchDisabled = (): boolean => {\r\n return (\r\n !!labels &&\r\n labels.items.length < 1 &&\r\n localSearchTerm.length < 1 &&\r\n !loading\r\n );\r\n }\r\n\r\n if (loading && !labels && searchTerm.length < 1) {\r\n return <Loading />;\r\n }\r\n\r\n return (\r\n <StyledCreateLabels>\r\n <CreateLabelsHeader>\r\n <Container>\r\n <Icon>\r\n <SearchIcon disabled={isSearchDisabled()} />\r\n </Icon>\r\n <SearchInput\r\n colorTheme=\"darkTwo\"\r\n height={'40px'}\r\n value={localSearchTerm}\r\n handleChange={(e: any) => {\r\n handleSearchTermChange(e.target.value, true);\r\n }}\r\n placeholderColor={\r\n isSearchDisabled()\r\n ? Variables.Colors.steelGrey\r\n : Variables.Colors.cloudyBlue\r\n }\r\n disabled={isSearchDisabled()}\r\n clearInput={() => {\r\n handleSearchTermChange('', false);\r\n }}\r\n dataTest='sidebar-labels-search-input'\r\n />\r\n </Container>\r\n </CreateLabelsHeader>\r\n <CreateLabelsBody>\r\n <FiltersHeader>\r\n <FilterTitle data-test='sidebar-labels-filter-text'>Filter by</FilterTitle>\r\n {labels && labels.items.length > 0 && (\r\n <FilterActionsMenu\r\n onClick={() => setOpen(true)}\r\n data-test=\"sidebar-labels-menu\"\r\n >\r\n <Dots />\r\n </FilterActionsMenu>\r\n )}\r\n {open && (\r\n <ClickAwayListener\r\n onClickAway={() => setOpen(false)}\r\n >\r\n <LabelsActionMenu>\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n collapseAll();\r\n setOpen(false);\r\n }}\r\n >\r\n Collapse All\r\n </ActionItem>\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n expandAll();\r\n setOpen(false);\r\n }}\r\n >\r\n Expand All\r\n </ActionItem>\r\n </LabelsActionMenu>\r\n </ClickAwayListener>\r\n )}\r\n </FiltersHeader>\r\n <FiltersSelectedPanel>\r\n <SelectedLabelsStyle data-test='sidebar-labels-selected-counter'>\r\n {selectedLabels && selectedLabels.length > 0\r\n ? selectedLabels.filter(x => x > 0).length\r\n : 'No'}{' '}\r\n Labels selected\r\n </SelectedLabelsStyle>\r\n <ClearSelectedLabels\r\n onClick={() => {\r\n clearLabels();\r\n setSavingLabels(true);\r\n }}\r\n disabled={\r\n !(selectedLabels && selectedLabels.length > 0)\r\n }\r\n data-test=\"sidebar-labels-clear\"\r\n >\r\n Clear\r\n </ClearSelectedLabels>\r\n </FiltersSelectedPanel>\r\n {searchTerm.length > 0 &&\r\n labels &&\r\n labels.items.length < 1 ? (\r\n <EmptyLabels />\r\n ) : (\r\n <LabelsScrollableContainer id=\"labels-scrollable-container\">\r\n <LabelsListContainer\r\n labels={sortLabels(transformedLabels)}\r\n labelsCollapseState={labelsCollapseState}\r\n selectedLabels={selectedLabels}\r\n disableLabels={disableLabels}\r\n />\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.CREATE_LABEL]}\r\n >\r\n <StyledAddLabels>\r\n {editMode === 'edit' && (\r\n <AddLabels\r\n saveLabel={createLabel}\r\n setEditing={setEditingLabel}\r\n labels={labels && labels.items}\r\n />\r\n )}\r\n <div data-test=\"sidebar-labels-add\">\r\n <StyledLinkText\r\n variant=\"transparent\"\r\n action={() =>\r\n setEditingLabel({\r\n id: null,\r\n mode: 'edit',\r\n })\r\n }\r\n disabled={editMode === 'edit'}\r\n >\r\n <span>+</span>Add Label\r\n </StyledLinkText>\r\n </div>\r\n </StyledAddLabels>\r\n </CheckPermission>\r\n </LabelsScrollableContainer>\r\n )}\r\n </CreateLabelsBody>\r\n </StyledCreateLabels>\r\n );\r\n };\r\n\r\nexport const CreateLabelsContainer: FC = () => {\r\n const state = useLabelsState();\r\n const labelsList = usePortableLabelsState().data;\r\n const labelsConfigState = useLabelsConfigState();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const company = useSelector(getCompanyState);\r\n\r\n const createLabel = useCreateLabelService();\r\n\r\n const searchLabels = useSearchLabelsService();\r\n const searchLabelsDebounced = useSearchDebounced(searchLabels, 0);\r\n\r\n const setLabelsSearchTerm = useSetLabelsSearchTermService();\r\n const setEditingLabel = useSetEditingLabelActionService();\r\n const saveUserFilters = useSaveUserFiltersService();\r\n const setLabels = useSetLabelFilterActionService();\r\n const clearLabels = useClearLabelFilterActionService();\r\n\r\n const expandAll = useExpandAllLabelsService();\r\n const expandLabel = useExpandLabelFieldByIdService();\r\n const collapseAll = useCollapseAllLabelsService();\r\n const setLabelFilters = useSetLabelFilterActionService();\r\n const setAssignedLabels = useSetAssignLabelsActionService();\r\n\r\n const loadingUsers = useSelector(getAllUsersLoading);\r\n const loadingInvitations = useInvitationsState().loading;\r\n const loadingScenarios = useLibraryScenariosState().loading;\r\n const loadingChallenges = useLibraryChallengesState().loading;\r\n const loadingPractisSets = useLibraryPractisSetState().loading;\r\n const loadingMyTeams = useTeamsState().loading;\r\n const loadingTeamMembers = useTeamMembersState().loading;\r\n const loadingPractisSetTraining = useTrainerPractisSetState().loading;\r\n\r\n const labelsShouldBeDisabledOnLoading =\r\n loadingUsers ||\r\n loadingInvitations ||\r\n loadingScenarios ||\r\n loadingChallenges ||\r\n loadingPractisSets ||\r\n loadingMyTeams ||\r\n loadingTeamMembers ||\r\n loadingPractisSetTraining;\r\n\r\n return (\r\n <CreateLabels\r\n labels={state.data}\r\n allLabels={labelsList.items}\r\n labelsCollapseState={state.collapseLabels}\r\n selectedLabels={state.selected || []}\r\n assignedLabels={state.assignedLabels || []}\r\n labelsModified={state.selectedModified}\r\n searchLabels={searchLabelsDebounced}\r\n saveUserFilters={saveUserFilters}\r\n updatedLabels={updatedLabels.data}\r\n updateType={updatedLabels.updateType}\r\n company={company}\r\n setLabels={setLabels}\r\n clearLabels={clearLabels}\r\n createLabel={createLabel}\r\n searchTerm={labelsConfigState.searchTerm}\r\n setLabelsSearchTerm={setLabelsSearchTerm}\r\n editingLabels={labelsConfigState.editingLabels}\r\n setEditingLabel={setEditingLabel}\r\n setLabelFilters={setLabelFilters}\r\n setAssignedLabels={setAssignedLabels}\r\n expandAll={expandAll}\r\n collapseAll={collapseAll}\r\n expandLabel={expandLabel}\r\n disableLabels={labelsShouldBeDisabledOnLoading}\r\n loading={state.loading}\r\n />\r\n );\r\n};\r\n\r\nexport default CreateLabelsContainer;\r\n","import {\n fetchCompanyInfo,\n fetchCompanyInfoFailure,\n fetchCompanyInfoSuccess,\n loadVoiceSettingsFailure,\n loadVoiceSettingsStart,\n loadVoiceSettingsSuccess,\n fetchCompanyAdminsStart,\n fetchCompanyAdminsSuccess,\n fetchCompanyAdminsFailure,\n fetchCompanyUserStatsStart,\n fetchCompanyUserStatsSuccess,\n fetchCompanyUserStatsFailure,\n clearCompanyAdmins,\n} from './actions';\nimport { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport {\n useGetCompanyApi,\n useSearchUsersApi,\n useGetCompanyUserStatsApi,\n useSetCompanyLogoApi,\n useGetCompanyVoiceSettingsApi,\n} from '../../../api';\nimport { AxiosError } from 'axios';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { handleMessage, useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { Roles } from '../../../constants/interfaces/Roles';\nimport { ROLE_NAMES } from '../../../constants/enums';\nimport { SearchUsersParams } from '../../../api/users/types';\nimport { UserStatus } from '../../../features/users/store/costants';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport { CompanyUserStats } from '../../../constants/interfaces/CompanyUserStats';\nimport { useUploadMediaService } from '../../../services/MediaService';\n\nexport const useGetCompanyService = () => {\n const dispatch = useDispatch();\n const getCompanyApi = useGetCompanyApi();\n const showMessage = useShowMessage();\n return useCallback(\n (companyId: number) => {\n dispatch(fetchCompanyInfo());\n return getCompanyApi(companyId)\n .then(data => {\n dispatch(fetchCompanyInfoSuccess(data));\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchCompanyInfoFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getCompanyApi, showMessage]\n );\n};\n\nexport const useLoadVoiceSettingsService = () => {\n const getCompanyVoiceSettingsApi = useGetCompanyVoiceSettingsApi();\n const showMessage = useShowMessage();\n const dispatch = useDispatch();\n return useCallback((companyId: number) => {\n dispatch(loadVoiceSettingsStart());\n return getCompanyVoiceSettingsApi(companyId)\n .then(data => {\n dispatch(loadVoiceSettingsSuccess(data));\n return data;\n })\n .catch((error: AxiosError) => {\n showMessage(error.message, 'error');\n dispatch(loadVoiceSettingsFailure(error.message));\n throw error;\n });\n }, [dispatch, getCompanyVoiceSettingsApi, showMessage]);\n};\n\nexport const useGetCompanyAdmins = () => {\n const dispatch = useDispatch();\n const searchUsersApi = useSearchUsersApi();\n return useCallback(\n (userRoles: Roles[], companyId: number) => {\n dispatch(fetchCompanyAdminsStart());\n const roleId = userRoles.find(role => role.name === ROLE_NAMES.COMPANY_ADMIN)?.id;\n if (!roleId) {\n return fetchCompanyAdminsFailure(`${ROLE_NAMES.COMPANY_ADMIN} role id could not be found`);\n }\n const params: SearchUsersParams = {\n status: `${UserStatus.ACTIVE},${UserStatus.PENDING}`,\n roles: roleId.toString(),\n companies: companyId.toString(),\n sort: 'name_asc',\n limit: 100,\n offset: 0\n };\n return searchUsersApi(params)\n .then((res: ListResult<UserV2>) => {\n dispatch(fetchCompanyAdminsSuccess(res.items));\n return res;\n })\n .catch((error: any) => {\n dispatch(fetchCompanyAdminsFailure(error));\n handleMessage(dispatch, error, 'error');\n return 'error';\n });\n },\n [dispatch, searchUsersApi]\n );\n};\n\nexport const useClearCompanyAdmins = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(clearCompanyAdmins());\n }, [dispatch]);\n}\n\n/**\n * @function useGetCompanyUserStatsService\n * @returns { CallableFunction }\n */\nexport const useGetCompanyUserStatsService = () => {\n const dispatch = useDispatch();\n const getCompanyUserStatsApi = useGetCompanyUserStatsApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { number } companyId\n * @returns { void }\n */\n return useCallback(\n (companyId: number, callback?: (result: CompanyUserStats) => void) => {\n dispatch(fetchCompanyUserStatsStart());\n getCompanyUserStatsApi(companyId)\n .then((result: CompanyUserStats) => {\n dispatch(fetchCompanyUserStatsSuccess(result));\n callback?.(result);\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchCompanyUserStatsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getCompanyUserStatsApi, showMessage]\n );\n};\n\n/**\n * @description uploads company logo and sets its media id to company\n * @function useUploadLogoService\n * @returns { CallableFunction }\n */\nexport const useUploadLogoService = () => {\n const uploadMedia = useUploadMediaService();\n const setCompanyLogoApi = useSetCompanyLogoApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { number } companyId\n * @param { File } file\n * @returns { Promise<void> }\n */\n return useCallback(\n (companyId: number, file: File) => {\n return uploadMedia(file)\n .then((mediaId) => {\n return setCompanyLogoApi(companyId, mediaId);\n })\n .catch((error) => {\n showMessage(error.message, 'error');\n return Promise.reject(error);\n });\n },\n [uploadMedia, setCompanyLogoApi, showMessage]\n );\n};","import React, { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport OutsideActionBox from '../OutsideActionBox/OutsideActionBox';\nimport { motion } from 'framer-motion';\n\nconst Container = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst DropDownComponent = styled(motion.div)<{\n marginTop?: number;\n width?: string;\n}>`\n background: ${props => props.theme.Colors.white};\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n width: ${props => (props.width ? props.width : '248px')};\n position: absolute;\n border-radius: 8px;\n right: -5px;\n margin-top: ${props => (props.marginTop ? `${props.marginTop}px` : '16px')};\n z-index: 1000;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n overflow-y: auto;\n max-height: 295px;\n padding: 16px;\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteFive};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\nexport const DropDownList: React.FC<{\n open: boolean;\n toggleOpen: (open: boolean) => void;\n className?: string;\n width?: string;\n marginTop?: number;\n renderItem?: ReactNode;\n}> = ({\n children,\n open,\n toggleOpen,\n className,\n marginTop,\n width,\n renderItem,\n}) => {\n return (\n <Container\n open={open}\n toggleOpen={toggleOpen}\n styles={{ position: 'relative' }}\n >\n <DropDownComponent\n className={className}\n initial={{ scale: 0.5 }}\n animate={{ scale: 1 }}\n marginTop={marginTop}\n width={width}\n data-test='dropDownListContainer'\n >\n {renderItem}\n <ContentArea>{children}</ContentArea>\n </DropDownComponent>\n </Container>\n );\n};\n","import React, { ComponentType, ForwardRefExoticComponent } from 'react';\nimport styled from 'styled-components';\nimport { NavLink, useLocation } from 'react-router-dom';\n\nconst StyledDropDownItem = styled.div`\n color: ${props => props.theme.Colors.black};\n margin-top: 8px;\n\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst StyledNavLink = styled(NavLink)`\n color: ${props => props.theme.Colors.black};\n text-decoration: none;\n display: flex;\n align-items: center;\n font-size: 13px;\n font-weight: 500;\n height: 40px;\n padding: 8px 12px;\n border-radius: 4px;\n &.--custom {\n color: ${props => props.theme.Colors.tomato};\n }\n &.--active {\n background: ${props => props.theme.Colors.whiteFive};\n }\n &:hover {\n background: ${props => props.theme.Colors.whiteFive};\n }\n`;\n\nconst StyledA = StyledNavLink.withComponent('a');\nconst StyledIcon = styled.div<{iconSize?: number}>`\n height: ${props => props.iconSize || 20}px;\n width: ${props => props.iconSize || 20}px;\n margin-left: 6px;\n margin-right: 12px;\n`;\n\nexport const DropDownListItem: React.FC<{\n name: string;\n url: string;\n custom?: boolean;\n externalUrl?: boolean;\n replaceUrl?: boolean;\n modalUrl?: boolean;\n icon?: ComponentType | ForwardRefExoticComponent<any>;\n iconSize?: number;\n className?: string;\n onClick?(): void;\n}> = ({\n name,\n url,\n icon: Icon,\n custom,\n externalUrl,\n replaceUrl,\n modalUrl,\n className,\n iconSize,\n onClick,\n}) => {\n let location = useLocation();\n const IconComponent = Icon && (\n <StyledIcon iconSize={iconSize}>\n <Icon />\n </StyledIcon>\n );\n\n if (externalUrl) {\n return (\n <StyledDropDownItem className={className} data-test='dropDownListItem'>\n <StyledA href={url} className={custom ? '--custom' : ''} target='blank' data-test='dropDownListLink'>\n {name}{IconComponent}\n </StyledA>\n </StyledDropDownItem>\n );\n } \n else if (replaceUrl) {\n return (\n <StyledDropDownItem className={className} data-test='dropDownListItem'>\n <StyledA href={url} className={custom ? '--custom' : ''} data-test='dropDownListLink'>\n {name}{IconComponent}\n </StyledA>\n </StyledDropDownItem>\n );\n }\n else if (modalUrl) {\n return (\n <StyledDropDownItem className={className} data-test='dropDownListItem'>\n <StyledNavLink\n activeClassName=\"--active\"\n className={custom ? '--custom' : ''}\n to={{\n pathname: url,\n state: { background: location },\n }}\n data-test='dropDownListLink'\n >\n {IconComponent}\n {name}\n </StyledNavLink>\n </StyledDropDownItem>\n );\n }\n\n return (\n <StyledDropDownItem onClick={onClick} data-test='dropDownListItem'>\n <StyledNavLink\n activeClassName=\"--active\"\n className={custom ? '--custom' : ''}\n to={url}\n data-test='dropDownListLink'\n >\n {IconComponent}\n {name}\n </StyledNavLink>\n </StyledDropDownItem>\n );\n};\n","import styled from 'styled-components';\n\nexport const StyledUserArea = styled.div<{ open: boolean }>`\n display: flex;\n border-radius: 8px;\n margin: 0 24px;\n width: 200px;\n ${props => props.open && `background: var(--ps-graphite-2)`};\n padding: 8px;\n box-sizing: border-box;\n`;\n\nexport const UserInfo = styled.div`\n width: 150px;\n`;\n\nexport const UserRole = styled.div`\n font-size: 13px;\n font-weight: 500;\n color: var(--ps-grey-1);\n`;\n\nexport const UserName = styled.div`\n font-size: 13px;\n font-weight: 500;\n color: var(--ps-white-1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const UserProfilePictureSection = styled.div`\n height: 32px;\n width: 32px;\n border-radius: 4px;\n overflow: hidden;\n margin-right: 12px;\n`;\n\nexport const UserRoleLoading = styled.div`\n width: 66px;\n height: 8px;\n background-color: var(--ps-grey-1);\n margin-top: 12px;\n margin-left: 2px;\n margin-bottom: 4px;\n`;\n\nexport const UserNameLoading = styled.div`\n width: 76px;\n height: 8px;\n background-color: var(--ps-white-1);\n margin-top: 4px;\n margin-left: 2px;\n`;","import { FC, memo } from 'react';\nimport AvatarPlaceholder from '../../../../../components/AvatarPlaceholder/AvatarPlaceholder';\nimport { userRoleTitle } from '../../../../../../constants/enums';\nimport { UserProfile } from '../../../../../../constants/interfaces/User';\nimport {\n StyledUserArea,\n UserInfo,\n UserRole,\n UserName,\n UserProfilePictureSection,\n UserRoleLoading,\n UserNameLoading,\n} from './styles';\n\nconst UserProfileArea: FC<{\n profile: Partial<UserProfile>;\n open: boolean;\n loading?: boolean;\n}> = memo(({ profile, open, loading }) => {\n const dataTest = 'user-profile-area';\n\n return (\n <StyledUserArea open={open}>\n <UserProfilePictureSection>\n <AvatarPlaceholder profile={profile} size={'sm'} dataTest={`${dataTest}-avatar`}/>\n </UserProfilePictureSection>\n <UserInfo>\n {\n loading\n ? <>\n <UserNameLoading />\n <UserRoleLoading />\n </>\n :\n <>\n <UserName data-test={`${dataTest}-name`}>\n {profile.firstName} {profile.lastName}\n </UserName>\n <UserRole data-test={`${dataTest}-role`}>\n {userRoleTitle(profile)}\n </UserRole>\n </>\n }\n </UserInfo>\n </StyledUserArea>\n );\n});\nexport default UserProfileArea;\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Roles } from '../../../constants/interfaces/Roles';\n\nexport interface UserRolesState {\n list: Roles[];\n loading: boolean;\n error?: string;\n}\n\nexport type UserRolesStateSelector = (state: any) => UserRolesState;\n\nexport const UserRolesStateSelectorContext = React.createContext<UserRolesStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useUserRolesState(): UserRolesState {\n return useSelector(useContext(UserRolesStateSelectorContext));\n}\n","import { useCallback, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Roles } from '../../../constants/interfaces/Roles';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { useLoadUserRolesApi } from '../../../api';\nimport {\n loadUserRolesFailure,\n loadUserRolesStart,\n loadUserRolesSuccess,\n} from './actions';\nimport { useUserRolesState } from './states';\n\nexport const useLoadUserRolesService = () => {\n const dispatch = useDispatch();\n const loadUserRolesApi = useLoadUserRolesApi();\n const showMessage = useShowMessage();\n return useCallback(() => {\n dispatch(loadUserRolesStart());\n loadUserRolesApi()\n .then(data => {\n dispatch(loadUserRolesSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(loadUserRolesFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, loadUserRolesApi, showMessage]);\n};\n\nexport const useUserRolesService = () => {\n const state = useUserRolesState();\n\n const loading = state.loading;\n\n const rolesByName = useMemo(\n () => state.list?.reduce(\n (result, role) => {\n result[role.name] = role;\n return result;\n },\n {} as Record<string, Roles>\n ),\n [state.list]\n );\n\n const getRoleByName = useCallback(\n (roleName: string) => rolesByName[roleName],\n [rolesByName]\n );\n\n return useMemo(() => ({\n loading,\n getRoleByName,\n }), [\n loading,\n getRoleByName,\n ]);\n};\n","import React, { FC, useEffect, useState, ComponentType, memo } from 'react';\nimport styled from 'styled-components';\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\nimport { CompanyInterface } from '../../../../../constants/interfaces/Company';\nimport { UserProfile } from '../../../../../constants/interfaces/User';\nimport { useGetCompanyService } from '../../../../../pages/CompanySettings/store/services';\nimport { useGetProfileService } from '../../../../../pages/UserProfile/store/services';\nimport ROUTES from '../../../../../routes/routes';\nimport { DropDownListItem } from '../../../../components/DropdownList';\nimport { useUpdatedLabelsState } from '../../../../../features/labels/store/states';\nimport { CheckPermission } from '../../../../../features/permissions';\nimport { usePermissionsState } from '../../../../../features/permissions/store/state';\nimport { useSelector } from 'react-redux';\nimport {\n getProfileLoading,\n getProfileState,\n} from '../../../../../pages/UserProfile/store/reducers';\nimport OutsideActionBox from '../../../../components/OutsideActionBox/OutsideActionBox';\nimport UserProfileArea from './components/UserProfileArea';\nimport MinimizedUserProfileArea from './components/MinimizedUserProfileArea';\nimport { useLoadUserRolesService } from '../../../../../features/roles/store/services';\nimport { getCompanyState } from \"../../../../../pages/CompanySettings/store/reducers\";\nimport { useUserRolesState } from '../../../../../features/roles/store/states';\nimport { isEqual } from 'lodash';\nimport { isPractisAdminRole } from '../../../../../constants/enums';\nimport { useUrlBuilder } from '../../../../../tools/url/UrlBuilder';\nimport Storage from '../../../../../services/Storage';\nimport { isAdminPortal } from '../../../../../helpers/functions/general';\n\nconst StyledProfileContainer = styled.div`\n display: flex;\n cursor: pointer;\n position: absolute;\n z-index: 1;\n bottom: 0;\n background: var(--ps-graphite-3);\n border-top: 1px solid #343850;\n height: 84px;\n align-items: center;\n`;\n\nconst StyledMenu = styled.div<{ left: number;}>`\n position: absolute;\n bottom: 95%;\n left: ${props => props.left}px;\n background: ${props => props.theme.Colors.white};\n width: 200px;\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n`;\n\nexport interface ProfileDropDownItem {\n name: string;\n url: string;\n custom?: boolean;\n permissions?: NEW_PERMISSIONS[];\n externalUrl?: boolean;\n replaceUrl?: boolean;\n icon?: ComponentType;\n iconSize?: number;\n modalUrl?: boolean;\n}\n\nexport const ProfileSection: React.FC<{\n profile: Partial<UserProfile>;\n company?: CompanyInterface;\n loading?: boolean;\n getProfile: () => void;\n getCompany: (companyId: number) => void;\n sideBarOpen: boolean;\n}> = memo(({ profile, getProfile, getCompany, sideBarOpen, company, loading }) => {\n const [open, setOpen] = useState(false);\n const updatedLabels = useUpdatedLabelsState();\n const permissions = usePermissionsState();\n const urlBuilder = useUrlBuilder();\n\n useEffect(() => {\n if (!profile?.id || !!updatedLabels?.data) {\n getProfile();\n }\n }, [getProfile, profile?.id, updatedLabels?.data]);\n\n useEffect(() => {\n if (profile.companyId) {\n if (!company || company.id !== profile.companyId) {\n getCompany(profile.companyId);\n }\n }\n }, [company, getCompany, permissions, profile]);\n\n useEffect(() => {\n const isItAdminPortal = isAdminPortal();\n\n if (\n isPractisAdminRole(profile.role?.name) &&\n !profile.companyId &&\n !isItAdminPortal\n ) {\n window.location.href = urlBuilder.buildAdminUrl({\n absolute: true,\n query: {\n t: Storage.get('token'),\n id: profile.id,\n p: Storage.get('apiPlatform'),\n },\n });\n }\n }, [profile.companyId, profile.id, profile.role?.name, urlBuilder]);\n \n\n const defaultProfileItems: ProfileDropDownItem[] = [\n { name: 'Log Out', url: ROUTES.AUTH_PAGES.LOGOUT, custom: true },\n {\n name: 'Company Settings',\n url: ROUTES.COMPANY_SETTINGS.ROOT,\n permissions: [NEW_PERMISSIONS.UPDATE_COMPANY_INFO],\n modalUrl: true,\n },\n { name: 'My Settings', url: ROUTES.PROFILE.replace(':userId', 'me') },\n ];\n\n return (\n <ProfileSectionContext.Consumer>\n {context => (\n <StyledProfileContainer\n onClick={() => setOpen(!open)}\n >\n {sideBarOpen ? (\n <MinimizedUserProfileArea\n profile={profile}\n open={open}\n />\n ) : (\n <UserProfileArea profile={profile} open={open} loading={loading} />\n )}\n <OutsideActionBox\n open={open}\n toggleOpen={() => setOpen(false)}\n >\n <StyledMenu\n left={sideBarOpen ? 8 : 24}\n >\n {(context.items || defaultProfileItems).map(\n item => (\n <CheckPermission\n key={item.url}\n permissions={item.permissions}\n >\n <DropDownListItem\n name={item.name}\n url={item.url}\n custom={item.custom}\n externalUrl={item.externalUrl}\n replaceUrl={item?.replaceUrl}\n icon={item.icon}\n iconSize={item.iconSize}\n modalUrl={item.modalUrl}\n />\n </CheckPermission>\n )\n )}\n </StyledMenu>\n </OutsideActionBox>\n </StyledProfileContainer>\n )}\n </ProfileSectionContext.Consumer>\n );\n});\n\nconst ProfileSectionContainer: FC<{ sideBarOpen: boolean }> = ({\n sideBarOpen,\n}) => {\n const company = useSelector(getCompanyState, isEqual);\n const getProfile = useGetProfileService();\n const getCompany = useGetCompanyService();\n const profile = useSelector(getProfileState, isEqual);\n const profileLoading = useSelector(getProfileLoading, isEqual);\n const userRoles = useUserRolesState();\n const loadUserRoles = useLoadUserRolesService();\n useEffect(() => {\n if (!userRoles?.list?.length) {\n loadUserRoles();\n }\n }, [userRoles?.list?.length, loadUserRoles]);\n\n return (\n <ProfileSection\n company={company}\n profile={profile || {}}\n loading={profileLoading}\n getProfile={getProfile}\n getCompany={getCompany}\n sideBarOpen={sideBarOpen}\n />\n );\n};\n\nexport default ProfileSectionContainer;\n\nexport interface ProfileSectionContextValue {\n items?: ProfileDropDownItem[];\n}\n\nexport const ProfileSectionContext = React.createContext<ProfileSectionContextValue>(\n {}\n);\n","import { PRACTIS_SUPPORT_EMAIL } from \"../../ui/layout/Sidebar/constants\";\nimport { isSafari } from \"./detect-browsers\";\nimport { getOS } from \"./general\";\nimport * as qs from 'query-string';\n\nconst WINDOW_OPTIONS = 'height=1000,width=1000,left=-1000,top=-1000';\n\n/**\n * @function sendEmail\n * @description opens email app with a prefilled email form including subject and body\n * @param { string } subject\n * @param { string? } body\n * @returns { void }\n */\nexport function sendEmail(subject: string, body?: string) {\n const isItSafari = isSafari();\n const userOS = getOS();\n\n const emailLink = qs.stringifyUrl({\n url: `mailto:${PRACTIS_SUPPORT_EMAIL}`,\n query: { subject, body, format: 'html' }\n });\n\n if (isItSafari || userOS === 'Win') {\n window.location.href = emailLink;\n } else {\n window.open(emailLink, '_blank', WINDOW_OPTIONS);\n }\n}","export const PRACTIS_SUPPORT_EMAIL = 'support@gopractis.com';\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Support = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n className={className}\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3h12a1 1 0 0 1 .97.753L8.831 7.844a1.5 1.5 0 0 1-1.664 0L1.031 3.753A1 1 0 0 1 2 3zM1 4.934V12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4.934L9.387 8.676a2.5 2.5 0 0 1-2.774 0L1 4.934zM0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V4z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default Support;","import { FC, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { sendEmail } from '../../../helpers/functions/email-helpers';\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport SupportIcon from '../../icons/Support';\nimport { generateEmailBody } from './helpers';\nimport { IconHolder, Label, PractisSupportWrapper } from './styles';\nimport { PractisSupportProps } from './types';\n\nexport const PractisSetSupport: FC<PractisSupportProps> = ({ shrink }) => {\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n\n const handleSendEmail = useCallback(() => {\n const body = generateEmailBody();\n const subject = `Request from ${profile?.firstName} ${\n profile?.lastName\n } at ${company.name ?? ''}`;\n\n if (body) {\n sendEmail(subject, body);\n }\n }, [company.name, profile]);\n\n return (\n <PractisSupportWrapper onClick={handleSendEmail} shrink={!!shrink}>\n <IconHolder title=\"Practis Support\">\n <SupportIcon />\n </IconHolder>\n {!shrink ? <Label fontSize=\"15px\">Practis Support</Label> : null}\n </PractisSupportWrapper>\n );\n};","import { CompanyInterface } from '../../../constants/interfaces/Company';\nimport { ListResult, PaginationResult } from '../../../constants/interfaces/PaginationResult';\n\nexport enum ACTIONS {\n SEARCH_COMPANIES_START = 'ADMIN_SEARCH_COMPANIES_START',\n SEARCH_COMPANIES_SUCCESS = 'ADMIN_SEARCH_COMPANIES_SUCCESS',\n SEARCH_COMPANIES_FAILURE = 'ADMIN_SEARCH_COMPANIES_FAILURE',\n}\n\nexport enum ADMIN_ACTIONS {\n CHANGE_COMPANY = 'CHANGE_COMPANY',\n}\n\nexport function searchCompaniesStart() {\n return {\n type: ACTIONS.SEARCH_COMPANIES_START as ACTIONS.SEARCH_COMPANIES_START,\n };\n}\n\nexport function searchCompaniesSuccess(\n companies: PaginationResult<CompanyInterface>\n) {\n return {\n type: ACTIONS.SEARCH_COMPANIES_SUCCESS as ACTIONS.SEARCH_COMPANIES_SUCCESS,\n companies,\n };\n}\n\nexport function searchCompaniesFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_COMPANIES_FAILURE as ACTIONS.SEARCH_COMPANIES_FAILURE,\n error,\n };\n}\n\nexport const SEARCH_ALL_COMPANIES_START = 'SEARCH_ALL_COMPANIES_START';\nexport const SEARCH_ALL_COMPANIES_SUCCESS = 'SEARCH_ALL_COMPANIES_SUCCESS';\nexport const SEARCH_ALL_COMPANIES_FAILURE = 'SEARCH_ALL_COMPANIES_FAILURE';\nexport const FETCH_ACTIVE_COMPANIES_START = 'FETCH_ACTIVE_COMPANIES_START';\nexport const FETCH_ACTIVE_COMPANIES_SUCCESS = 'FETCH_ACTIVE_COMPANIES_SUCCESS';\nexport const FETCH_ACTIVE_COMPANIES_FAILURE = 'FETCH_ACTIVE_COMPANIES_FAILURE';\n\nexport function adminChangeCompanyAction() {\n return {\n type: ADMIN_ACTIONS.CHANGE_COMPANY as ADMIN_ACTIONS.CHANGE_COMPANY,\n };\n}\n\nexport function searchAllCompaniesStartAction() {\n return {\n type: SEARCH_ALL_COMPANIES_START,\n };\n}\n\nexport function searchAllCompaniesSuccessAction(data: any) {\n return {\n type: SEARCH_ALL_COMPANIES_SUCCESS,\n data,\n };\n}\n\nexport function searchAllCompaniesFailureAction(error: any) {\n return {\n type: SEARCH_ALL_COMPANIES_FAILURE,\n error,\n };\n}\n\nexport function fetchActiveCompaniesStart() {\n return {\n type: FETCH_ACTIVE_COMPANIES_START,\n };\n}\n\nexport function fetchActiveCompaniesSuccess(data: ListResult<CompanyInterface>) {\n return {\n type: FETCH_ACTIVE_COMPANIES_SUCCESS,\n data,\n };\n}\n\nexport function fetchActiveCompaniesFailure(error: string) {\n return {\n type: FETCH_ACTIVE_COMPANIES_FAILURE,\n error,\n };\n}","import {\n getDeviceInfo,\n getNetworkConnectionType,\n} from '../../../helpers/functions/detect-browsers';\nimport { getConfig } from '../../../tools/config';\n\n/**\n * @function generateEmailBody\n * @returns { string }\n */\nexport function generateEmailBody() {\n const deviceInfo = getDeviceInfo();\n const config = getConfig();\n const networkConnectionType = getNetworkConnectionType();\n\n return `\\n\\n\\n\\nDevice/Browser: ${deviceInfo}\\nInternet Connection: ${networkConnectionType.toUpperCase()}\\nWeb App Version: ${\n config.APP_VERSION\n }`;\n}","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarScrimmageAI = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#so9fm7tiza)\" stroke=\"#6D7F8C\" stroke-linecap=\"round\">\n <path d=\"M1.8 7.926C.466 5.375.22 2.843 1.536 1.534c1.94-1.946 6.551-.478 9.947 2.924 3.395 3.402 4.884 8.046 2.943 9.993-1.322 1.33-3.84 1.123-6.458-.305\" stroke-linejoin=\"round\"/>\n <path d=\"M1.78 7.88C.46 5.342.234 2.837 1.536 1.534c1.94-1.946 6.551-.478 9.947 2.924 3.395 3.402 4.884 8.046 2.943 9.993-1.322 1.33-3.84 1.123-6.458-.305\" stroke-linejoin=\"round\"/>\n <path d=\"M10.804.817C12.326.49 13.661.67 14.485 1.5c1.94 1.947.385 6.592-3.01 9.994-3.395 3.402-8.007 4.93-9.947 2.983-1.309-1.316-1.07-3.874.273-6.452a14.797 14.797 0 0 1 2.644-3.575\" stroke-linejoin=\"round\"/>\n <path d=\"M4.292 10.328 5.96 5.955a.1.1 0 0 1 .186 0l1.648 4.373M9.654 5.895v4.431\" stroke-linejoin=\"round\"/>\n <path d=\"M7.402 9.29H5.003\" stroke-miterlimit=\"10\"/>\n </g>\n <defs>\n <clipPath id=\"so9fm7tiza\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SidebarScrimmageAI;\n\n","import React, { memo } from 'react';\nimport { kebabCase } from 'lodash';\n\nimport { SideBarExternalLinkItemProps } from './types';\nimport { IconHolder, Label, Link } from './styles';\n\nexport const SideBarExternalLinkItem: React.FC<SideBarExternalLinkItemProps> = memo(\n ({\n name,\n icon: Icon,\n url,\n shrink,\n fontSize,\n }) => {\n\n return (\n <Link\n target={'_blank'}\n to={{pathname: url}}\n activeClassName={'is-active'}\n shrink={!!shrink}\n data-test={`sidebar-${kebabCase(name)}`}\n >\n <IconHolder title={name}>\n <Icon />\n </IconHolder>\n {!shrink && <Label fontSize={fontSize}>{name}</Label>}\n </Link>\n );\n }\n);\n","import React, { memo, useEffect, useLayoutEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { isEqual } from 'lodash';\nimport { makeStyles } from '@material-ui/core';\nimport Drawer from '@material-ui/core/Drawer';\n\nimport { Variables } from '../../../theme/variables';\nimport Logo from '../../components/Logo/Logo';\nimport { SideBarItem } from './SideBarItem';\nimport { OPEN_SIDEBAR_WIDTH } from '../../wrapper/configs';\nimport CreateLabelsContainer from '../../../features/labels/pages/CreateLabels';\nimport { useLabelsState } from '../../../features/labels/store/states';\nimport {\n useCloseLabelCreationPanelService,\n useExpandMultipleLabelsService,\n useOpenLabelCreationPanelService,\n} from '../../../features/labels/store/services';\nimport {\n getProfileState,\n getProfileLoading,\n} from '../../../pages/UserProfile/store/reducers';\nimport {\n useGenerateLabelsConfiguration,\n useGetSavedLabelExpandedState,\n useGetSavedLabelPanelState,\n} from '../../../features/labels/config';\nimport { CheckPermission } from '../../../features/permissions';\nimport ProfileSectionContainer from './components/ProfileSection/ProfileSection';\nimport {\n StyledSidebar,\n SidebarBody,\n SidebarLabels,\n ClosedLabels,\n OpenLabels,\n OpenLabelsContent,\n OpenLabelsFooter,\n StyledLabelsIcon,\n StyledRightArrow,\n OpenLabelsButton,\n SidebarContent,\n SidebarMenu,\n SidebarProfile,\n ItemLoading,\n ItemLoadingIcon,\n ItemLoadingText,\n} from './styles';\nimport { PractisSetSupport } from './PractisSupport';\nimport { SideBarItemProps } from './types';\nimport { isAdminPortal } from '../../../helpers/functions/general';\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\nimport SidebarScrimmageAI from '../../icons/SidebarScrimmageAI';\nimport { SideBarExternalLinkItem } from './SideBarExternalLinkItem';\n\nconst useStyles = makeStyles(theme => ({\n drawerPaper: {\n position: 'unset',\n overflowX: 'hidden',\n overflowY: 'overlay' as 'scroll', // TS issue\n zIndex: 1000,\n whiteSpace: 'nowrap',\n width: OPEN_SIDEBAR_WIDTH,\n background: Variables.Colors.dark,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n drawerPaperClose: {\n overflowX: 'hidden',\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n width: theme.spacing(7),\n [theme.breakpoints.up('sm')]: {\n width: theme.spacing(9),\n },\n },\n logoContainer: {\n marginTop: 48,\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n },\n}));\n\nexport type SideBarMenuItem = SideBarItemProps;\n\nexport const Sidebar: React.FC<{\n menuItems: SideBarMenuItem[];\n fontSize?: string;\n}> = memo(\n ({ menuItems, fontSize }) => {\n const classes = useStyles();\n const labels = useLabelsState();\n const open = !!labels && labels.open;\n const openLabelsPanel = useOpenLabelCreationPanelService();\n const closeLabelsPanel = useCloseLabelCreationPanelService();\n const expandMultipleLabels = useExpandMultipleLabelsService();\n const profile = useSelector(getProfileState);\n const profileLoading = useSelector(getProfileLoading);\n const generateLabelsConfiguration = useGenerateLabelsConfiguration();\n const getLabelsPanelState = useGetSavedLabelPanelState();\n const getLabelsExpandedState = useGetSavedLabelExpandedState();\n const isItAdminPortal = isAdminPortal();\n const company = useSelector(getCompanyState, isEqual);\n \n useLayoutEffect(() => {\n const expandedLabels = getLabelsExpandedState();\n if (expandedLabels && expandedLabels.length > 0) {\n expandMultipleLabels(expandedLabels);\n }\n }, [getLabelsExpandedState, expandMultipleLabels]);\n\n useLayoutEffect(() => {\n if (getLabelsPanelState()) {\n openLabelsPanel();\n }\n }, [getLabelsPanelState, openLabelsPanel]);\n\n useEffect(() => {\n if (labels && profile && profile.id) {\n generateLabelsConfiguration(labels.open, labels.collapseLabels);\n }\n }, [labels, profile, generateLabelsConfiguration]);\n\n return (\n <StyledSidebar>\n <Drawer\n variant=\"permanent\"\n classes={{\n paper: classes.drawerPaper,\n }}\n >\n <div className={classes.logoContainer}>\n <Logo\n width={isItAdminPortal ? 110 : 92}\n height={isItAdminPortal ? 36 : 25}\n />\n </div>\n <SidebarBody>\n <SidebarContent>\n <SidebarMenu>\n <div>\n {(company && company.isScrimmageEnabled) &&\n <SideBarExternalLinkItem\n name={'Scrimmage AI'}\n url={'https://dashboard.gopractis.com/'}\n shrink={open}\n fontSize={fontSize}\n icon={SidebarScrimmageAI}/>\n }\n {menuItems.map((item, index) => (\n <>\n {profileLoading ? (\n <ItemLoading isOpen={open}>\n <ItemLoadingIcon />\n {!open && (\n <ItemLoadingText />\n )}\n </ItemLoading>\n ) : (\n <CheckPermission\n key={index}\n permissions={\n item.permissions\n }\n >\n <SideBarItem\n {...item}\n shrink={open}\n fontSize={fontSize}\n />\n </CheckPermission>\n )}\n </>\n ))}\n </div>\n {!isItAdminPortal && (\n <PractisSetSupport shrink={open} />\n )}\n </SidebarMenu>\n <SidebarProfile>\n <ProfileSectionContainer sideBarOpen={open} />\n </SidebarProfile>\n </SidebarContent>\n {labels && (\n <SidebarLabels isOpen={open}>\n {!open ? (\n <ClosedLabels>\n <OpenLabelsButton\n onClick={() => openLabelsPanel()}\n data-test=\"sidebar-labels-expand\"\n >\n {profileLoading ? (\n <ItemLoadingIcon />\n ) : (\n <StyledLabelsIcon />\n )}\n </OpenLabelsButton>\n </ClosedLabels>\n ) : (\n <OpenLabels>\n <OpenLabelsFooter>\n <OpenLabelsButton\n onClick={() =>\n closeLabelsPanel()\n }\n data-test=\"sidebar-labels-collapse\"\n >\n <StyledRightArrow />\n </OpenLabelsButton>\n </OpenLabelsFooter>\n <OpenLabelsContent>\n <CreateLabelsContainer />\n </OpenLabelsContent>\n </OpenLabels>\n )}\n </SidebarLabels>\n )}\n </SidebarBody>\n </Drawer>\n </StyledSidebar>\n );\n },\n (prevProps, nextProps) =>\n isEqual(\n prevProps as Record<string, any>,\n nextProps as Record<string, any>\n )\n);\n\nexport default Sidebar;","export const CLOSED_SIDEBAR_WIDTH = 50;\nexport const OPEN_SIDEBAR_WIDTH = 248;\n\nexport const SM_SCREEN_BREAKPOINT = 750;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Plus = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 12 12\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M684.835 62L684.835 56.827 690 56.827 690 55.173 684.835 55.173 684.835 50 683.179 50 683.179 55.173 678 55.173 678 56.827 683.179 56.827 683.179 62z\"\n transform=\"translate(-678 -50)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Plus;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Folder = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n id=\"a\"\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n id=\"Document\"\n fill=\"currentColor\"\n d=\"M18.75 20H1.25C.56 20 0 19.44 0 18.75V1.25C0 .56.56 0 1.25 0H7.5c.69 0 1.25.56 1.25 1.25V2.5h10c.69 0 1.25.56 1.25 1.25v15c0 .69-.56 1.25-1.25 1.25zm-.625-16.25H7.5V1.875c0-.345-.28-.625-.625-.625h-5c-.345 0-.625.28-.625.625V5h16.875c.345 0 .625-.28.625-.626 0-.345-.28-.624-.625-.624zm.625 3.75V6.25H1.25v11.876c0 .345.28.624.625.624h16.25c.346 0 .625-.279.625-.624V7.5z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Folder;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NewUser = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n id=\"a\"\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n id=\"New-User\"\n fill=\"currentColor\"\n d=\"M19.376 12.5h-1.248c-.345 0-.624-.28-.624-.625 0-.344.28-.625.624-.625h1.248c.345 0 .624.28.624.625 0 .346-.28.625-.624.625zm0-3.75h-2.497c-.344 0-.624-.28-.624-.625s.28-.625.624-.625h2.497c.345 0 .624.28.624.625 0 .346-.28.625-.624.625zm0-3.75h-2.497c-.344 0-.624-.28-.624-.625s.28-.624.624-.624h2.497c.345 0 .624.28.624.624 0 .346-.28.626-.624.626zm-8.163 8.167c.862.207 5.296 1.293 5.843 1.794 1 .916 1.397 3.664.398 5.039l-8.397-.002L.58 20c-1.007-1.375-.599-4.123.409-5.04.56-.509 4.857-1.546 5.856-1.781-2.24-1.181-3.63-4.072-3.63-6.798C3.216 2.857 4.271 0 9.016 0c4.744 0 5.798 2.857 5.798 6.38 0 2.716-1.377 5.597-3.601 6.787zM9.015 1.246c-3.754 0-4.504 2.31-4.504 5.158 0 2.371 1.218 4.992 3.218 5.812v2.162h-.535c-2.458.513-4.717 1.227-5.376 1.549-.421.471-.69 1.878-.429 2.823l7.667-.002 7.588.002c.26-.945-.002-2.348-.416-2.822-.663-.317-2.883-1.032-5.312-1.55h-.612v-2.164c1.998-.821 3.216-3.44 3.216-5.81 0-2.849-.751-5.158-4.505-5.158zM19.376 15c.345 0 .624.28.624.625s-.28.625-.624.626c-.344-.001-.623-.28-.623-.626 0-.344.279-.625.623-.625zm0 0zm0 1.25z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default NewUser;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Document = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n id=\"a\"\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n id=\"Document\"\n fill=\"currentColor\"\n d=\"M18.571 17.333H4.286c-.79 0-1.429-.596-1.429-1.333V1.333C2.857.597 3.497 0 4.286 0H18.57C19.361 0 20 .597 20 1.333V16c0 .737-.64 1.333-1.429 1.333zm0-15.333c0-.368-.32-.666-.714-.666H5c-.394 0-.714.298-.714.666v13.333c0 .368.32.667.714.667h12.857c.395 0 .714-.299.714-.667V2zM16.43 13.333h-10c-.395 0-.715-.298-.715-.667 0-.368.32-.667.715-.667h10c.394 0 .714.3.714.667 0 .369-.32.667-.714.667zm0-4h-10c-.395 0-.715-.298-.715-.666 0-.368.32-.667.715-.667h10c.394 0 .714.299.714.667 0 .368-.32.666-.714.666zm-4.286-4H6.429c-.395 0-.715-.298-.715-.666 0-.368.32-.667.715-.667h5.714c.394 0 .714.299.714.667 0 .368-.32.666-.714.666zm5 14.667H1.429C.639 20 0 19.403 0 18.666V4c0-.736.64-1.332 1.429-1.332v15.998H18.57c0 .737-.64 1.334-1.428 1.334z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Document;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Mountains = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n d=\"M15.171 0v.999h4.332v5.075h-6.428v-1h-.978v2.503L20 20H3.076l.001-.001L0 20 7.346 8.491l1.528 2.395 2.105-3.309V0h4.192zM7.346 10.61l-5.231 8.196 1.721-.001 4.363-6.858-.853-1.336zm4.192-1.786l-6.35 9.982h12.7l-6.35-9.982zm6.847-6.63h-4.192V4.88h4.192V2.193zm-5.31 1.686V1.194h-.978v2.687l.978-.001z\"\n id=\"Mountains\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Mountains;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Team = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 20 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <path\n d=\"M19.002 15H19zM19 16.25zM7.354 0c3.87 0 4.73 2.429 4.73 5.424 0 2.307-1.123 4.756-2.938 5.768.704.176 4.32 1.099 4.767 1.525.815.778 1.14 6.116.324 7.285L7.387 20l-6.913.002c-.821-1.169-.488-6.507.333-7.285.457-.433 3.963-1.315 4.777-1.515-1.828-1.004-2.96-3.461-2.96-5.778 0-2.995.86-5.424 4.73-5.424zm0 1C4.259 1 3.729 2.98 3.729 5.42c0 2.032 1.005 4.278 2.654 4.98v1.854h-.531c-2.027.439-3.735 1.05-4.28 1.326-.346.405-.568 4.36-.353 5.17l6.168-.001 6.109.001c.214-.81-.001-4.762-.343-5.169-.547-.271-2.23-.884-4.232-1.327h-.648v-1.855c.387-.165.738-.415 1.049-.727.325-.326.606-.72.838-1.156.493-.925.764-2.04.764-3.096 0-2.441-.475-4.42-3.57-4.42zM19.176 15.717c.815.778 1.14 3.115.325 4.283l-4.186.002c.12-.349.21-.776.272-1.252h3.105c.214-.81-.001-1.762-.343-2.169-.377-.187-1.436-.537-2.714-.882-.03-.397-.075-.786-.133-1.157 1.422.359 3.369.883 3.674 1.175zM12.822 3.004L12.617 3c1.737 0 2.867.489 3.586 1.298.883.995.784 2.474.784 4.126 0 1.769-.644 3.62-1.762 4.845-.128-.438-.281-.803-.458-1.06.768-1.02 1.204-2.45 1.204-3.789 0-2.38-.106-4.322-2.982-4.416-.04-.351-.095-.684-.167-1z\"\n transform=\"translate(-1200 -302) translate(1168 80) translate(32 222)\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Team;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\n\nimport ROUTES from '../../../../../routes/routes';\nimport { SmallButton } from '../../../../components/Button';\nimport { DropDownList, DropDownListItem } from '../../../../components/DropdownList';\nimport Plus from '../../../../icons/Plus';\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\nimport { CheckPermission } from '../../../../../features/permissions';\nimport FolderIcon from '../../../../icons/Folder';\nimport NewUserIcon from '../../../../icons/NewUser';\nimport DocumentIcon from '../../../../icons/Document';\nimport MountainsIcon from '../../../../icons/Mountains';\nimport TeamIcon from '../../../../icons/Team';\n\nconst StyledActionsContainer = styled.div`\n position: relative;\n margin-left: 16px;\n`;\n\nconst StyledActionsButton = styled.div`\n user-select: none;\n`;\n\nconst StyledPlus = styled(Plus)`\n width: 12px;\n`;\n\nexport interface ActionsDropdownItem {\n icon: any;\n title: string;\n url: string;\n permissions: NEW_PERMISSIONS[];\n}\n\nconst defaultItems: ActionsDropdownItem[] = [\n {\n title: 'Practis Set',\n icon: FolderIcon,\n url: ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\n ':practisSetId',\n 'new'\n ),\n permissions: [NEW_PERMISSIONS.CREATE_PRACTIS_SET],\n },\n {\n title: 'Scenario',\n icon: DocumentIcon,\n url: ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n 'new'\n ),\n permissions: [NEW_PERMISSIONS.CREATE_SCENARIO],\n },\n {\n title: 'Challenge',\n icon: MountainsIcon,\n url: ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE.replace(\n ':challengeId',\n 'new'\n ),\n permissions: [NEW_PERMISSIONS.CREATE_CHALLENGE],\n },\n {\n title: 'User',\n icon: NewUserIcon,\n url: ROUTES.ACTION_ITEMS.NEW_USER.replace(':draftId', 'new'),\n permissions: [NEW_PERMISSIONS.CREATE_STAGING],\n },\n {\n title: 'Team',\n icon: TeamIcon,\n url: ROUTES.TEAMS_PAGES.NEW_TEAM,\n permissions: [NEW_PERMISSIONS.CREATE_TEAM],\n },\n];\n\nexport const ActionsDropdown: React.FC = () => {\n const [open, toggleOpen] = useState(false);\n \n return (\n <ActionsDropdownContext.Consumer>\n {context => {\n const items = context.items || defaultItems;\n return (\n <StyledActionsContainer data-test=\"actionDropDownContainer\">\n <StyledActionsButton\n onClick={() => toggleOpen(!open)}\n data-test=\"actionDropDownToggleButton\"\n >\n <SmallButton>\n <StyledPlus />\n </SmallButton>\n </StyledActionsButton>\n {open && (\n <DropDownList\n open={open}\n toggleOpen={toggleOpen}\n marginTop={8}\n >\n {items.map(item => (\n <CheckPermission\n key={item.title}\n permissions={item.permissions}\n >\n <DropDownListItem\n name={item.title}\n modalUrl={true}\n icon={item.icon}\n url={item.url}\n />\n </CheckPermission>\n ))}\n </DropDownList>\n )}\n </StyledActionsContainer>\n );\n }}\n </ActionsDropdownContext.Consumer>\n );\n};\n\nexport default ActionsDropdown;\n\nexport interface ActionsDropdownContextValue {\n items?: ActionsDropdownItem[];\n}\n\nexport const ActionsDropdownContext = React.createContext<ActionsDropdownContextValue>(\n {}\n);\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const BackArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 14\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fillRule=\"evenodd\"\n fill=\"currentColor\"\n d=\"M303.972 50.656L302.447 49 296 56 302.447 63 303.972 61.344 300.161 57.206 312 57.208 312 54.818 300.138 54.818z\"\n transform=\"translate(-296 -49)\"\n />\n </svg>\n );\n }\n);\n\nexport default BackArrow;\n","import styled from 'styled-components';\n\nexport const HeaderContainer = styled.div<{\n hasBorder?: boolean;\n headerPadding?: string;\n minHeight?: string;\n}>`\n font-size: 16px;\n background: ${props => props.theme.Colors.white};\n ${props =>\n !!props.hasBorder &&\n `border-bottom: 2px solid ${props.theme.Colors.paleGrey}`};\n flex-direction: column;\n ${props => !!props.headerPadding && `padding: ${props.headerPadding};`};\n ${props => !!props.minHeight && `min-height: ${props.minHeight}`};\n`;\n\nexport const SubHeaderContainer = styled.div<{ hasBackButton: boolean }>`\n margin-left: ${props => props.hasBackButton ? '18px' : '0'};\n`;\n\nexport const NavigationPanel = styled.div<{ useReducedHeight?: boolean }>`\n display: flex;\n width: 100%;\n align-items: flex-start;\n padding: 24px 0 0 20px;\n ${props => (\n typeof props.useReducedHeight === 'undefined'\n ? ''\n : props.useReducedHeight ? 'min-height: 112px' : 'min-height: 119px'\n )};\n`;\n\nexport const Toolbar = styled.div``;\n\nexport const SecondaryNavigation = styled.div`\n width: 100%;\n`;\n\nexport const LeftPanel = styled.div`\n flex-grow: 1;\n flex: 2;\n`;\n\nexport const TitleContainer = styled.div`\n font-weight: 600;\n display: flex;\n align-items: center;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const TitleSection = styled.div<{ useTopPadding: boolean }>`\n padding-top: ${props => (props.useTopPadding ? '4px' : '0px')};\n`;\nexport const MainTitle = styled.div`\n flex: 1;\n text-overflow: ellipsis;\n overflow: hidden;\n font-size: 13px;\n line-height: 24px;\n`;\n\nexport const SubTitle = styled.div`\n font-size: 20px;\n font-weight: 800;\n color: ${props => props.theme.Colors.black};\n min-height: 28px;\n line-height: 32px;\n`;\n\nexport const RightPanel = styled.div`\n display: flex;\n flex: 1;\n justify-content: flex-end;\n align-items: center;\n`;\n\nexport const CompanySectionWrapper = styled.div`\n border-radius: 4px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n`;\n\nexport const TitleIcon = styled.div`\n width: 13px;\n color: ${props => props.theme.Colors.black};\n margin-right: 4px;\n left: -16px;\n position: relative;\n cursor: pointer;\n display: flex;\n align-self: flex-end;\n margin-bottom: 8px;\n &:hover {\n color: ${props => props.theme.Colors.steelGrey};\n }\n &:active {\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n`;\n","import { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { CompanyStatus } from '../../../constants/interfaces/Company';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { SearchParams } from '../../../constants/interfaces/filters';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport ROUTES from '../../../routes/routes';\nimport Storage from '../../../services/Storage';\nimport { WEB_SITE_ID } from '../../../tools/constants/WebSiteId';\nimport { ThunkContext } from '../../../tools/thunk/ThunkContext';\nimport {\n adminChangeCompanyAction,\n fetchActiveCompaniesFailure,\n fetchActiveCompaniesStart,\n fetchActiveCompaniesSuccess,\n searchAllCompaniesFailureAction,\n searchAllCompaniesStartAction,\n searchAllCompaniesSuccessAction,\n} from './actions';\nimport { updateUser } from '../../users/store/services';\nimport {useDispatch} from \"react-redux\";\nimport {useCallback} from \"react\";\nimport {useSearchCompaniesApi} from \"../../../api\";\n\nexport const changeCompanyOfPractisAdmin = (\n companyId?: number,\n successCallback?: () => void,\n openInNewTab?: boolean,\n) => {\n return (dispatch: any, getState: any, tc: ThunkContext) => {\n dispatch(adminChangeCompanyAction());\n const { webSiteId, urlBuilder } = tc;\n const user = getProfileState(getState());\n adminChangeCompanyAction();\n return updateUser(\n { companyId: companyId || null } as any,\n user!.id!,\n true,\n 'Company Changed!',\n () => {\n let url = null;\n if (companyId) {\n const isCompanyPortal =\n webSiteId === WEB_SITE_ID.COMPANY_PORTAL;\n url = urlBuilder.buildCompanyUrl({\n path: ROUTES.SUBMISSIONS,\n query: {\n t: isCompanyPortal\n ? undefined\n : Storage.get('token'),\n id: Storage.get('userId'),\n p: Storage.get('apiPlatform')\n },\n absolute: true,\n });\n } else if (webSiteId !== WEB_SITE_ID.ADMIN_PORTAL) {\n url = urlBuilder.buildAdminUrl({\n query: {\n t: Storage.get('token'),\n id: Storage.get('userId'),\n p: Storage.get('apiPlatform')\n },\n absolute: true,\n });\n }\n if (url) {\n if (openInNewTab) {\n window.open(url, '_blank');\n } else {\n window.location.href = url;\n }\n }\n\n successCallback?.();\n }\n )(dispatch);\n };\n};\n\nexport const useSearchAllCompaniesService = () => {\n const dispatch = useDispatch();\n const searchCompaniesApi = useSearchCompaniesApi();\n const showMessage = useShowMessage();\n return useCallback(\n (sp?: SearchParams) => {\n dispatch(searchAllCompaniesStartAction());\n return searchCompaniesApi(sp)\n .then(data => {\n dispatch(searchAllCompaniesSuccessAction(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchAllCompaniesFailureAction(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchCompaniesApi, showMessage]\n );\n};\n\n/**\n * @function useFetchActiveCompaniesService\n * @returns { CallableFunction }\n */\nexport const useFetchActiveCompaniesService = () => {\n const dispatch = useDispatch();\n const searchCompaniesApi = useSearchCompaniesApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @returns { Promise }\n */\n return useCallback(\n () => {\n dispatch(fetchActiveCompaniesStart());\n return searchCompaniesApi(undefined, [ CompanyStatus.ACTIVE ])\n .then(data => {\n dispatch(fetchActiveCompaniesSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchActiveCompaniesFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchCompaniesApi, showMessage]\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const BoldDownArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 491.996 491.996\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fillRule=\"evenodd\" fill=\"currentColor\">\n <g>\n <path\n d=\"M484.132,124.986l-16.116-16.228c-5.072-5.068-11.82-7.86-19.032-7.86c-7.208,0-13.964,2.792-19.036,7.86l-183.84,183.848\n\t\t\tL62.056,108.554c-5.064-5.068-11.82-7.856-19.028-7.856s-13.968,2.788-19.036,7.856l-16.12,16.128\n\t\t\tc-10.496,10.488-10.496,27.572,0,38.06l219.136,219.924c5.064,5.064,11.812,8.632,19.084,8.632h0.084\n\t\t\tc7.212,0,13.96-3.572,19.024-8.632l218.932-219.328c5.072-5.064,7.856-12.016,7.864-19.224\n\t\t\tC491.996,136.902,489.204,130.046,484.132,124.986z\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default BoldDownArrow;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const BoldUpArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 492.002 492.002\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fillRule=\"evenodd\" fill=\"currentColor\">\n <g>\n <path\n d=\"M484.136,328.473L264.988,109.329c-5.064-5.064-11.816-7.844-19.172-7.844c-7.208,0-13.964,2.78-19.02,7.844\n\t\t\tL7.852,328.265C2.788,333.333,0,340.089,0,347.297c0,7.208,2.784,13.968,7.852,19.032l16.124,16.124\n\t\t\tc5.064,5.064,11.824,7.86,19.032,7.86s13.964-2.796,19.032-7.86l183.852-183.852l184.056,184.064\n\t\t\tc5.064,5.06,11.82,7.852,19.032,7.852c7.208,0,13.96-2.792,19.028-7.852l16.128-16.132\n\t\t\tC494.624,356.041,494.624,338.965,484.136,328.473z\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default BoldUpArrow;\n","import styled from 'styled-components';\nimport BoldDownArrow from '../../../../ui/icons/BoldDownArrow';\nimport BoldUpArrow from '../../../../ui/icons/BoldUpArrow';\n\nexport const TEXT_STYLES = `\n font-size: 14px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: #909ba7;\n display: inline-block;\n`;\n\nexport const Root = styled.div<{ open?: boolean }>`\n height: 40px;\n display: flex;\n cursor: pointer;\n position: relative;\n border-radius: 4px;\n padding: 0 10px;\n background: ${props =>\n props.open ? props.theme.Colors.whiteTwo : props.theme.Colors.white};\n`;\n\nexport const DownIcon = styled(BoldDownArrow)`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n height: 10px;\n width: 8px;\n margin-left: 10px;\n`;\n\nexport const UpIcon = styled(BoldUpArrow)`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n height: 10px;\n width: 8px;\n margin-left: 10px;\n`;\n\nexport const DropdownButton = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const DropdownButtonLabel = styled.div`\n color: ${props => props.theme.Colors.dark};\n margin-left: 10px;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n max-width: 150px;\n`;\n\nexport const LogoContainer = styled.div<{ practis?: boolean }>`\n height: ${props => (props.practis ? '20px' : '24px')};\n width: ${props => (props.practis ? '20px' : '24px')};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nexport const StyledLogo = styled.img`\n height: 100%;\n width: 100%;\n object-fit: cover;\n`;\n","import React, { useCallback } from 'react';\nimport styled from 'styled-components';\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { TEXT_STYLES } from './styles';\nimport { CompanyItem } from './types';\n\nconst Root = styled.div<{ practis: boolean }>`\n height: 56px;\n width: 272px;\n color: ${props => props.theme.Colors.dark};\n display: flex;\n align-items: center;\n padding: 0 16px;\n overflow: hidden;\n border-radius: 4px;\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n }\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst Logo = styled.div<{ practis: boolean }>`\n width: 40px;\n height: 40px;\n padding: 4px;\n margin-right: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n & img {\n height: ${props => (props.practis ? '31px' : '100%')};\n width: 100%;\n object-fit: cover;\n border-radius: 4px;\n }\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.dark};\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 600;\n`;\n\nconst SubTitle = styled.span`\n ${TEXT_STYLES};\n margin-left: 12px;\n`;\n\nexport const CompaniesDropdownItem: React.FC<{\n company: CompanyItem;\n dataTest?:string;\n onClick(company: CompanyItem): void;\n}> = ({ company, onClick, dataTest }) => {\n\n const handleClick = useCallback(() => onClick(company), [company, onClick]);\n const { logo, logoUrl, name, subTitle } = company;\n const mediaUrl = logo || logoUrl;\n return (\n <Root data-test={dataTest} practis={!!company.practis} onClick={handleClick}>\n <Logo practis={!!company.practis}>\n {mediaUrl ? (\n <img src={mediaUrl} alt=\"org\" />\n ) : (\n <AvatarPlaceholder profile={company} size=\"sm\" />\n )}\n </Logo>\n <Title>{name}</Title>\n {subTitle && <SubTitle>{subTitle}</SubTitle>}\n </Root>\n );\n};\n","import logoPractis from '../../../../assets/images/practis-icon.svg';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\n\nexport interface CompanyItem {\n id?: number;\n name?: string;\n logo?: string;\n logoUrl?: string;\n subTitle?: string;\n practis?: boolean;\n}\n\nexport const practisCompanyItem: CompanyItem = {\n name: 'Practis',\n logo: logoPractis,\n subTitle: '(Admin)',\n practis: true,\n};\n\nexport interface CompaniesDropdownButtonProps {\n company: CompanyItem;\n updatedCompany: CompanyInterface;\n onChangeCompany(company: CompanyItem): void;\n}\n","export default __webpack_public_path__ + \"static/media/practis-icon.bb2a71c9.svg\";","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PractisIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n fill=\"#4aa9e2\"\n d=\"M16.526 0C7.399 0 0 7.407 0 16.545V40l8.353-6.91h8.173c9.127 0 16.525-7.407 16.525-16.545C33.051 7.407 25.653 0 16.526 0zm-.106 8c4.651 0 8.421 3.817 8.421 8.526v.141c-.075 4.644-3.816 8.386-8.42 8.386H8v-8.527C8 11.817 11.77 8 16.42 8z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default PractisIcon;\n","import React, { useCallback } from 'react';\nimport styled from 'styled-components';\nimport { CompanyItem } from './types';\nimport PractisIcon from '../../../../ui/icons/PractisIcon';\n\nconst Container = styled.div`\n height: 100%;\n width: 272px;\n padding: 24px 16px 16px 16px;\n`;\n\nconst Root = styled.div`\n height: 40px;\n width: 272px;\n color: ${props => props.theme.Colors.dark};\n display: flex;\n align-items: center;\n padding: 0 16px;\n overflow: hidden;\n border-radius: 4px;\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n }\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst Logo = styled.div<{ practis: boolean }>`\n width: 40px;\n height: 40px;\n margin-right: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Divider = styled.div`\n margin: 0 24px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n background: ${props => props.theme.Colors.paleGrey};\n`;\n\nconst StyledLogo = styled(PractisIcon)`\n height: 24px;\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.dark};\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 13px;\n font-weight: 600;\n`;\n\nexport const PractisDropdownItem: React.FC<{\n company: CompanyItem;\n onClick(company: CompanyItem): void;\n}> = ({ company, onClick }) => {\n const handleClick = useCallback(() => onClick(company), [company, onClick]);\n return (\n <>\n <Container>\n <Root onClick={handleClick} data-test=\"practisAdminItemContainer\">\n <Logo practis={!!company.practis} data-test=\"practisAdminItemLogo\">\n <StyledLogo />\n </Logo>\n <Title data-test=\"practisAdminItemTitle\">Practis Admin</Title>\n </Root>\n </Container>\n <Divider />\n </>\n );\n};\n","import React, { FC, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\nimport { CompaniesDropdownItem } from './CompaniesDropdownItem';\nimport { CompanyItem, practisCompanyItem } from './types';\nimport { DropDownList } from '../../../../ui/components/DropdownList';\nimport { PractisDropdownItem } from './PractisDropdownItem';\nimport { useCompaniesGlobalState } from '../../store/states';\nimport { useFetchActiveCompaniesService } from '../../store/services';\nimport { usePreviousData } from '../../../../helpers/hooks/usePreviousData';\nimport { isEmpty } from 'lodash';\nimport equal from 'deep-equal';\n\nconst StyledListCard = styled(DropDownList)`\n background: ${props => props.theme.Colors.white};\n right: -5px;\n margin-top: 65px;\n min-width: 200px;\n`;\n\nexport const CompaniesDropdown: React.FC<{\n companies?: CompanyItem[];\n open: boolean;\n toggleOpen(open?: boolean): void;\n onChangeCompany(company: CompanyItem): void;\n practisCompanyItem?: any;\n}> = ({ companies, open, toggleOpen, onChangeCompany, practisCompanyItem }) => {\n return (\n <StyledListCard\n open={open}\n toggleOpen={toggleOpen}\n width={'auto'}\n renderItem={\n <PractisDropdownItem\n company={practisCompanyItem}\n onClick={onChangeCompany}\n />\n }\n >\n {companies?.map((company: any) => (\n <CompaniesDropdownItem\n key={'company_' + (company.id || '')}\n company={company}\n onClick={onChangeCompany}\n dataTest={'company-' + (company.id || '')}\n />\n ))}\n </StyledListCard>\n );\n};\n\nconst CompaniesDropdownContainer: FC<{\n open: boolean;\n updatedCompany?: CompanyInterface;\n toggleOpen(open?: boolean): void;\n onChangeCompany(company: CompanyItem): void;\n}> = ({ updatedCompany, open, toggleOpen, onChangeCompany }) => {\n const fetchActiveCompanies = useFetchActiveCompaniesService();\n const { activeCompanies, isActiveCompaniesLoading } = useCompaniesGlobalState();\n\n const prevUpdatedCompany = usePreviousData(updatedCompany);\n\n useEffect(() => {\n if (!activeCompanies?.items && !isActiveCompaniesLoading) {\n fetchActiveCompanies();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (isEmpty(prevUpdatedCompany) || equal(updatedCompany, prevUpdatedCompany)) return;\n fetchActiveCompanies();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updatedCompany]);\n\n return (\n <CompaniesDropdown\n companies={activeCompanies?.items}\n open={open}\n toggleOpen={toggleOpen}\n onChangeCompany={onChangeCompany}\n practisCompanyItem={practisCompanyItem}\n />\n );\n};\n\nexport default CompaniesDropdownContainer;\n","import { useSelector } from 'react-redux';\nimport { AllCompaniesInterface } from './reducers';\n\nexport const useCompaniesGlobalState = (): AllCompaniesInterface => {\n const appState = useSelector(state => state);\n return appState.companies;\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\nimport { UserInterface } from '../../../constants/interfaces/User';\n\nconst StyledAvatarContainer = styled.div<{\n disabled?: boolean;\n}>`\n font-size: 13px;\n height: 100%;\n width: 100%;\n border-radius: 4px;\n background: ${props => props.theme.Colors.whiteFive};\n color: ${props => props.theme.Colors.black};\n opacity: ${props => (props.disabled ? 0.7 : 1)};\n border: solid 1px ${props => props.theme.Colors.cloudyBlue};\n flex-shrink: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledImage = styled.img`\n height: 100%;\n width: 100%;\n border-radius: 4px;\n object-fit: cover;\n`;\n\nexport interface AvatarPlaceholderInterface {\n profile: (UserInterface & CompanyInterface) | undefined;\n loading?: boolean;\n link?: string;\n disabled?: boolean;\n className?: string;\n backgroundColor?: string;\n}\n\nconst NamePlaceholder: FC<{\n image?: string;\n name?: string;\n disabled?: boolean;\n className?: string;\n dataTest?: string;\n}> = ({ image, name, disabled, className, dataTest }) => {\n if (image) {\n return (\n <StyledAvatarContainer disabled={disabled} className={className}>\n <StyledImage src={image} alt={'profile'} data-test={dataTest} />\n </StyledAvatarContainer>\n );\n } else {\n return (\n <StyledAvatarContainer disabled={disabled} className={className} data-test={dataTest}>\n {name && name[0].toUpperCase()}\n </StyledAvatarContainer>\n );\n }\n};\n\nexport default NamePlaceholder;\n","import { FC, useCallback, useState } from 'react';\r\n\r\nimport CompaniesDropdownContainer from './CompaniesDropdown';\r\nimport { CompaniesDropdownButtonProps, CompanyItem } from './types';\r\nimport { useCollapseAllLabelsService } from '../../../labels/store/services';\r\nimport NamePlaceholder from '../../../../ui/components/AvatarPlaceholder';\r\nimport {\r\n DownIcon,\r\n DropdownButton,\r\n DropdownButtonLabel,\r\n LogoContainer,\r\n Root,\r\n StyledLogo,\r\n UpIcon,\r\n} from './styles';\r\n\r\nexport const CompaniesDropdownButton: FC<CompaniesDropdownButtonProps> = ({\r\n company,\r\n updatedCompany,\r\n onChangeCompany,\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const collapseLabels = useCollapseAllLabelsService();\r\n const toggleOpen = useCallback(\r\n (newOpen?: boolean) =>\r\n setOpen(prevOpen =>\r\n typeof newOpen === 'boolean' ? newOpen : !prevOpen\r\n ),\r\n [setOpen]\r\n );\r\n const handleChangeCompany = useCallback(\r\n (company: CompanyItem) => {\r\n setOpen(false);\r\n collapseLabels();\r\n onChangeCompany(company);\r\n },\r\n [setOpen, onChangeCompany, collapseLabels]\r\n );\r\n\r\n const mediaUrl = company.logo || company.logoUrl;\r\n\r\n return (\r\n <Root open={open}>\r\n <DropdownButton\r\n onClick={() => toggleOpen(!open)}\r\n data-test=\"companyDropDownToggleButton\"\r\n >\r\n <LogoContainer practis={company.practis}>\r\n {mediaUrl ? (\r\n <StyledLogo src={mediaUrl} alt=\"org\" />\r\n ) : (\r\n <NamePlaceholder\r\n image={mediaUrl}\r\n name={company.name}\r\n />\r\n )}\r\n </LogoContainer>\r\n <DropdownButtonLabel>{company.name}</DropdownButtonLabel>\r\n {open ? (\r\n <UpIcon data-test=\"companyDropDownUpIcon\" />\r\n ) : (\r\n <DownIcon data-test=\"companyDropDownDownIcon\" />\r\n )}\r\n </DropdownButton>\r\n <CompaniesDropdownContainer\r\n updatedCompany={updatedCompany}\r\n open={open}\r\n toggleOpen={toggleOpen}\r\n onChangeCompany={handleChangeCompany}\r\n />\r\n </Root>\r\n );\r\n};\r\n\r\nexport default CompaniesDropdownButton;\r\n","import React, { useCallback, useEffect } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { debounce } from 'lodash';\r\nimport { bindActionCreators } from 'redux';\r\nimport styled from 'styled-components';\r\n\r\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\r\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\r\nimport {\r\n getCompanyLoading,\r\n getCompanyState,\r\n} from '../../../../pages/CompanySettings/store/reducers';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport { changeCompanyOfPractisAdmin } from '../../store/services';\r\nimport CompaniesDropdownButton from '../CompaniesDropdownButton/CompaniesDropdownButton';\r\nimport { CompanyItem } from '../CompaniesDropdownButton/types';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { CheckPermission } from '../../../permissions';\r\nimport { useSaveUserFiltersService } from '../../../labels/store/services';\r\nimport {\r\n listenBroadCastChannelMessage,\r\n postBroadCastChannelMessage,\r\n} from '../../../../helpers/functions/broadcast-channel';\r\nimport { pushModal, useHistory } from '../../../../tools/router';\r\n\r\n\r\nconst StyledCompanySection = styled.div`\r\n height: 40px;\r\n & img {\r\n height: 100%;\r\n width: 100%;\r\n object-fit: cover;\r\n border-radius: 8px;\r\n }\r\n`;\r\n\r\nconst StyledCompanyLogo = styled.div`\r\n height: 100%;\r\n width: 100%;\r\n`;\r\n\r\nconst LogoButton = styled.div`\r\n text-decoration: none;\r\n cursor: pointer;\r\n`;\r\n\r\nconst LogoContainer = styled.div<{ practis?: boolean }>`\r\n height: ${props => (props.practis ? '20px' : '24px')};\r\n width: ${props => (props.practis ? '20px' : '24px')};\r\n border-radius: 4px;\r\n overflow: hidden;\r\n`;\r\n\r\nconst Root = styled.div<{ open?: boolean }>`\r\n height: 40px;\r\n display: flex;\r\n position: relative;\r\n border-radius: 4px;\r\n padding: 0 10px;\r\n background: ${props =>\r\n props.open ? props.theme.Colors.whiteTwo : props.theme.Colors.white};\r\n`;\r\n\r\nconst DropdownButton = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nconst DropdownButtonLabel = styled.div`\r\n color: ${props => props.theme.Colors.dark};\r\n margin-left: 10px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n max-width: 150px;\r\n`;\r\n\r\nconst StyledLogo = styled.img`\r\n height: 100%;\r\n width: 100%;\r\n object-fit: cover;\r\n`;\r\n\r\nconst NoLogoButton = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n\r\n .avatar-placeholder {\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 6px;\r\n }\r\n\r\n span {\r\n color: #212121;\r\n font-size: 13px;\r\n }\r\n`;\r\n\r\nexport const CompanySection: React.FC<{\r\n companies: boolean;\r\n company?: CompanyInterface;\r\n loading?: boolean;\r\n changeCompany?: (\r\n companyId?: number,\r\n successCallback?: <T>(args?: T) => void\r\n ) => Promise<void>;\r\n}> = ({ company, changeCompany }) => {\r\n const saveUserFilters = useSaveUserFiltersService();\r\n const history = useHistory();\r\n\r\n /**\r\n * @function clearUserFilters\r\n * @returns { void }\r\n */\r\n const clearUserFilters = useCallback(() => {\r\n saveUserFilters([]);\r\n }, [saveUserFilters]);\r\n\r\n /**\r\n * @function successChangeCompanyCallback\r\n * @param { CompanyItem } company\r\n */\r\n const successChangeCompanyCallback = useCallback(\r\n company => {\r\n debounce(clearUserFilters, 200);\r\n postBroadCastChannelMessage(company.id);\r\n },\r\n [clearUserFilters]\r\n );\r\n\r\n /**\r\n * @function handleChangeCompany\r\n * @param { CompanyItem } company\r\n * @returns { void }\r\n */\r\n\r\n const handleChangeCompany = useCallback(\r\n async (company: CompanyItem) => {\r\n if (changeCompany) {\r\n await changeCompany(company.id, () =>\r\n successChangeCompanyCallback(company)\r\n );\r\n }\r\n },\r\n [changeCompany, successChangeCompanyCallback]\r\n );\r\n\r\n /**\r\n * @function listenBroadCastChannelCallback\r\n * @returns { void }\r\n */\r\n const listenBroadCastChannelCallback = useCallback(\r\n async message => {\r\n await changeCompany?.(message, debounce(clearUserFilters, 200));\r\n },\r\n [changeCompany, clearUserFilters]\r\n );\r\n\r\n const openCompanySettings = useCallback(() => {\r\n pushModal(history, ROUTES.COMPANY_SETTINGS.ROOT);\r\n }, [history]);\r\n\r\n // handle change company for other open tabs\r\n useEffect(() => {\r\n listenBroadCastChannelMessage(listenBroadCastChannelCallback);\r\n }, [listenBroadCastChannelCallback]);\r\n\r\n if (!company) {\r\n return null;\r\n }\r\n\r\n const mediaUrl = company?.logoUrl || company?.logo;\r\n\r\n const logo =\r\n mediaUrl ? (\r\n <Root>\r\n <DropdownButton>\r\n <LogoContainer practis={false}>\r\n <StyledLogo src={mediaUrl} alt=\"org\" />\r\n </LogoContainer>\r\n <DropdownButtonLabel>\r\n {company?.name}\r\n </DropdownButtonLabel>\r\n </DropdownButton>\r\n </Root>\r\n ) : (\r\n <Root>\r\n <NoLogoButton>\r\n <AvatarPlaceholder\r\n profile={company}\r\n size=\"sm\"\r\n className=\"avatar-placeholder\"\r\n />\r\n <span>{company?.name}</span>\r\n </NoLogoButton>\r\n </Root>\r\n );\r\n\r\n return (\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.ACCESS_ANY_COMPANY]}\r\n alternateContent={\r\n <StyledCompanySection>\r\n <StyledCompanyLogo>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.VIEW_COMPANY]}\r\n alternateContent={logo}\r\n >\r\n <LogoButton onClick={openCompanySettings}>\r\n {logo}\r\n </LogoButton>\r\n </CheckPermission>\r\n </StyledCompanyLogo>\r\n </StyledCompanySection>\r\n }\r\n >\r\n <CompaniesDropdownButton\r\n company={company}\r\n updatedCompany={company}\r\n onChangeCompany={handleChangeCompany}\r\n />\r\n </CheckPermission>\r\n );\r\n};\r\n\r\nfunction mapStateToProps(state: any, container: any) {\r\n return {\r\n webSiteId: container.webSiteId,\r\n urlBuilder: container.urlBuilder,\r\n company: getCompanyState(state),\r\n loading: getCompanyLoading(state),\r\n };\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch: any) =>\r\n bindActionCreators(\r\n {\r\n changeCompany: changeCompanyOfPractisAdmin,\r\n },\r\n dispatch\r\n );\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(CompanySection as any);\r\n","import useWindowDimensions from '../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../theme/variables';\nimport LandingCard1 from '../../assets/images/LandingCard1.png';\nimport LandingCard2 from '../../assets/images/LandingCard2.png';\nimport LandingCard3 from '../../assets/images/LandingCard3.png';\n\nexport enum Platform {\n DESKTOP = 'DESKTOP',\n LAPTOP = 'LAPTOP',\n TABLET = 'TABLET',\n MOBILE = 'MOBILE',\n}\n\nconst CardWidth = {\n [Platform.DESKTOP]: 448,\n [Platform.LAPTOP]: 350,\n [Platform.TABLET]: 304,\n [Platform.MOBILE]: 289,\n};\n\nconst CardHeight = {\n [Platform.DESKTOP]: 592,\n [Platform.LAPTOP]: 480,\n [Platform.TABLET]: 424,\n [Platform.MOBILE]: 304,\n};\n\nexport const useGetPlatform = (): string => {\n const windowWidth = useWindowDimensions().width;\n\n if (windowWidth > Variables.BreakPoints.mid) {\n return Platform.DESKTOP;\n } else if (windowWidth > Variables.BreakPoints.small) {\n return Platform.LAPTOP;\n } else if (windowWidth > Variables.BreakPoints.smaller) {\n return Platform.TABLET;\n } else {\n return Platform.MOBILE;\n }\n};\n\nexport const useDynamicCardWidth = (): number => {\n const windowWidth = useWindowDimensions().width;\n\n if (windowWidth > Variables.BreakPoints.mid) {\n return CardWidth[Platform.DESKTOP];\n } else if (windowWidth > Variables.BreakPoints.small) {\n return CardWidth[Platform.LAPTOP];\n } else if (windowWidth > Variables.BreakPoints.smaller) {\n return CardWidth[Platform.TABLET];\n } else {\n return CardWidth[Platform.MOBILE];\n }\n};\n\nexport const useDynamicCardHeight = (): number => {\n const windowWidth = useWindowDimensions().width;\n\n if (windowWidth > Variables.BreakPoints.mid) {\n return CardHeight[Platform.DESKTOP];\n } else if (windowWidth > Variables.BreakPoints.small) {\n return CardHeight[Platform.LAPTOP];\n } else if (windowWidth > Variables.BreakPoints.smaller) {\n return CardHeight[Platform.TABLET];\n } else {\n return CardHeight[Platform.MOBILE];\n }\n};\n\nexport const CARDS = [\n {\n description: 'Are you a sales organization with a distributed team?',\n image: LandingCard1,\n },\n {\n description:\n 'Do you rely on consistency of message to optimize your close rate?',\n image: LandingCard2,\n },\n {\n description:\n 'Do you have a hard time monitoring capability and compliance?',\n image: LandingCard3,\n },\n];\n","/**\n * @description - Post Message by Broadcast channel api\n * @function postBroadCastChannelMessage\n * @param { T } message\n * @returns { void }\n */\nexport function postBroadCastChannelMessage<T>(message: T): void {\n try {\n const broadcastChannel = new BroadcastChannel('app-data');\n\n broadcastChannel.postMessage(message);\n } catch (error) {\n console.log(\n 'broadcast-channel.ts: postBroadCastChannelMessage: ',\n error\n );\n }\n}\n\n/**\n * @function listenBroadCastChannelMessage\n * @param { Function } callback\n * @returns { void }\n */\nexport function listenBroadCastChannelMessage<T>(\n callback: (message: T) => void\n): void {\n try {\n const broadcastChannel = new BroadcastChannel('app-data');\n\n broadcastChannel.onmessage = event => {\n callback(event.data);\n };\n } catch (error) {\n console.log(\n 'broadcast-channel.ts: listenBroadCastChannelMessage: ',\n error\n );\n }\n}\n\n","import { createContext, ReactNode } from 'react';\n\nimport CompanySection from '../../../features/companies/components/CompanySection/CompanySection';\n\nexport interface HeaderProps {\n title?: string;\n subTitle?: string;\n tabs?: ReactNode;\n subHeader?: ReactNode;\n hasBorder?: boolean;\n headerPadding?: string;\n goBackUrl?: string;\n useGoBack?: boolean;\n dataTest?: string;\n minHeight?: string;\n}\n\nexport interface HeaderContextValue {\n companySectionComponent: any;\n}\n\nexport const HeaderContext = createContext<HeaderContextValue>({\n companySectionComponent: CompanySection,\n});\n","import { memo, useContext } from 'react';\nimport { useHistory } from 'react-router';\nimport { isEqual } from 'lodash';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport ActionsDropdown from './components/ActionsDropdown/ActionsDropdown';\nimport BackArrow from '../../icons/BackArrow';\nimport { CheckPermission } from '../../../features/permissions';\nimport {\n CompanySectionWrapper,\n HeaderContainer,\n LeftPanel,\n MainTitle,\n NavigationPanel,\n RightPanel,\n SecondaryNavigation,\n SubHeaderContainer,\n SubTitle,\n TitleContainer,\n TitleIcon,\n TitleSection,\n Toolbar,\n} from './styles';\nimport { HeaderContext, HeaderProps } from './types';\n\nexport const Header: React.FC<HeaderProps> = memo(\n ({\n title,\n subTitle,\n tabs,\n subHeader,\n hasBorder,\n goBackUrl,\n useGoBack,\n headerPadding,\n dataTest,\n minHeight,\n }) => {\n const history = useHistory();\n const { companySectionComponent: CompanySection } =\n useContext(HeaderContext);\n const hasTabs = !!tabs;\n const hasBackButton = !!goBackUrl || !!useGoBack;\n\n const handleGoBack = () => {\n if (!!useGoBack) {\n history.goBack();\n } else if (!!goBackUrl) {\n history.push(goBackUrl);\n }\n };\n\n return (\n <HeaderContainer\n hasBorder={hasBorder}\n headerPadding={headerPadding}\n minHeight={minHeight ?? (hasTabs ? undefined : '144px')}\n >\n <Toolbar>\n <NavigationPanel useReducedHeight={minHeight ? undefined : hasTabs}>\n <LeftPanel>\n <TitleContainer>\n {hasBackButton && (\n <TitleIcon\n onClick={handleGoBack}\n data-test=\"back-arrow-button\"\n >\n <BackArrow />\n </TitleIcon>\n )}\n <TitleSection useTopPadding={!title}>\n {title && (\n <MainTitle\n data-test={\n dataTest &&\n `${dataTest}-page-title`\n }\n >\n {title}\n </MainTitle>\n )}\n\n {subTitle ? (\n <SubTitle\n data-test={\n dataTest &&\n `${dataTest}-page-subtitle`\n }\n >\n {subTitle}\n </SubTitle>\n ) : (\n <Skeleton\n variant=\"text\"\n width={140}\n height={32}\n style={{\n background: 'var(--ps-grey-3)',\n }}\n />\n )}\n </TitleSection>\n </TitleContainer>\n {subHeader && (\n <SubHeaderContainer hasBackButton={hasBackButton}>\n {subHeader}\n </SubHeaderContainer>\n )}\n </LeftPanel>\n <RightPanel>\n <CompanySectionWrapper data-test=\"companyDropDownSection\">\n <CompanySection />\n </CompanySectionWrapper>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.CREATE_PRACTIS_SET,\n NEW_PERMISSIONS.CREATE_SCENARIO,\n NEW_PERMISSIONS.CREATE_CHALLENGE,\n NEW_PERMISSIONS.CREATE_STAGING,\n ]}\n >\n <ActionsDropdown />\n </CheckPermission>\n </RightPanel>\n </NavigationPanel>\n <SecondaryNavigation>\n {tabs}\n </SecondaryNavigation>\n </Toolbar>\n </HeaderContainer>\n );\n },\n (prevProps, nextProps) =>\n isEqual(\n prevProps as Record<string, any>[],\n nextProps as Record<string, any>[]\n )\n);\n\nexport default Header;","import { Container } from '@material-ui/core';\nimport styled from 'styled-components';\n\nexport const WrapperContainer = styled.div`\n display: flex;\n height: 100vh;\n`;\n\nexport const Content = styled.main<{\n height?: string;\n contentPadding?: string;\n}>`\n padding: ${props =>\n !!props.contentPadding ? props.contentPadding : '0 24px'};\n\n flex: 1;\n min-width: 511px;\n ${props => !!props.height && `height: ${props.height};`};\n`;\n\nexport const StyledTest = styled.div<{ isScrollable: boolean }>`\n flex: 1;\n ${props => !!props.isScrollable && `overflow-y: scroll;`};\n position: relative;\n`;\n\nexport const StyledContainer = styled(Container)<{ height?: string, marginBottom?: string }>`\n padding: 0 !important;\n margin-bottom: ${props => props.marginBottom || '72px' };\n ${props => !!props.height && `height: ${props.height};`};\n`;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarLibrary = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 14.933V6.401c.552 0 1-.478 1-1.068V1.067C16 .477 15.552 0 15 0H1C.448 0 0 .477 0 1.067v4.266c0 .59.448 1.068 1 1.068v8.532C1 15.523 1.448 16 2 16h12c.552 0 1-.478 1-1.067zm-12.5 0c-.276 0-.5-.238-.5-.533V6.933c0-.294.224-.532.5-.532H5v2.132c0 .59.448 1.067 1 1.067h4c.552 0 1-.477 1-1.067V6.401h2.5c.276 0 .5.238.5.532V14.4c0 .295-.224.533-.5.533h-11zM10 8V6.401H6V8c0 .295.224.533.5.533h3c.276 0 .5-.239.5-.533zm4.5-6.933c.276 0 .5.239.5.533v3.2c0 .295-.224.534-.5.534h-13c-.276 0-.5-.24-.5-.534V1.6c0-.294.224-.533.5-.533h13z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarLibrary;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarLibraryActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill=\"#fff\"\n d=\"M1 1h14v5H1zM2 6h12v9H2z\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 14.933V6.401c.552 0 1-.478 1-1.068V1.067C16 .477 15.552 0 15 0H1C.448 0 0 .477 0 1.067v4.266c0 .59.448 1.068 1 1.068v8.532C1 15.523 1.448 16 2 16h12c.552 0 1-.478 1-1.067zm-12.5 0c-.276 0-.5-.238-.5-.533V6.933c0-.294.224-.532.5-.532H5v2.132c0 .59.448 1.067 1 1.067h4c.552 0 1-.477 1-1.067V6.401h2.5c.276 0 .5.238.5.532V14.4c0 .295-.224.533-.5.533h-11zM10 8V6.401H6V8c0 .295.224.533.5.533h3c.276 0 .5-.239.5-.533zm4.5-6.933c.276 0 .5.239.5.533v3.2c0 .295-.224.534-.5.534h-13c-.276 0-.5-.24-.5-.534V1.6c0-.294.224-.533.5-.533h13z\"\n fill=\"#222431\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarLibraryActive;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarTeams = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M6.268 1a2 2 0 0 1 3.464 0H12a1 1 0 0 1 1 1h3v14H0V2h3a1 1 0 0 1 1-1h2.268zM12 2v2H4V2h3a1 1 0 0 1 2 0h3zM3 4V3H1v12h14V3h-2v1a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1zm1 5V8h8v1H4zm0 3v-1h6v1H4z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarTeams;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarTeamsActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M1 3h2l1 1.5L8 5l4-.5L13 3h2v12H1V3z\" fill=\"#fff\"/>\n <path fill=\"#222431\" d=\"M4 8h8v1H4zM4 11h6v1H4z\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 0a2 2 0 0 0-1.732 1H4a1 1 0 0 0-1 1H0v14h16V2h-3a1 1 0 0 0-1-1H9.732A2 2 0 0 0 8 0zm5 3v1a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V3H1v12h14V3h-2z\" fill=\"#222431\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9 2a1 1 0 0 0-2 0H4v2h8V2H9z\" fill=\"#fff\"/>\n </svg>\n );\n }\n);\n\nexport default SidebarTeamsActive;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarFeed = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clip-path=\"url(#3q8huv9lja)\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15.777 5.336 8 0 .223 5.336a.5.5 0 0 0-.124.715c.172.23.505.283.744.119l.224-.153V16h4.8V9.34c0-.283.239-.513.533-.513h3.2c.295 0 .534.23.534.513V16h4.8V6.017l.223.153c.24.164.572.111.744-.12a.5.5 0 0 0-.124-.714zm-1.91-.051L8 1.259 2.134 5.285v9.69H4.8V9.34c0-.85.717-1.538 1.6-1.538h3.2c.884 0 1.6.689 1.6 1.538v5.635h2.667v-9.69z\"\n fill=\"#6D7F8C\"\n />\n </g>\n <defs>\n <clipPath id=\"3q8huv9lja\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SidebarFeed;\n\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarFeedActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clip-path=\"url(#rftlgqqbqa)\" fill=\"#fff\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.777 5.336 8 0 .223 5.336a.5.5 0 0 0-.124.715c.172.23.505.283.744.119l.224-.153V16h4.8V9.34c0-.283.239-.513.533-.513h3.2c.295 0 .534.23.534.513V16h4.8V6.017l.223.153c.24.164.572.111.744-.12a.5.5 0 0 0-.124-.714zm-1.91-.051L8 1.259 2.134 5.285v9.69H4.8V9.34c0-.85.717-1.538 1.6-1.538h3.2c.884 0 1.6.689 1.6 1.538v5.635h2.667v-9.69z\"/>\n <g clip-path=\"url(#xtobi3f9sb)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.777 5.336 8 0 .223 5.336a.5.5 0 0 0-.124.715c.172.23.505.283.744.119l.224-.153V16h4.8V9.34c0-.283.239-.513.533-.513h3.2c.295 0 .534.23.534.513V16h4.8V6.017l.223.153c.24.164.572.111.744-.12a.5.5 0 0 0-.124-.714zm-1.91-.051L8 1.259 2.134 5.285v9.69H4.8V9.34c0-.85.717-1.538 1.6-1.538h3.2c.884 0 1.6.689 1.6 1.538v5.635h2.667v-9.69z\"/>\n <path d=\"M5.5 15.5V9l.5-.5h4.5v7h4v-10L8 1 1.5 5.5v10h4z\"/>\n </g>\n </g>\n <defs>\n <clipPath id=\"rftlgqqbqa\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n <clipPath id=\"xtobi3f9sb\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SidebarFeedActive;\n\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarUsers = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n className={className}\n viewBox=\"0 0 16 16\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13.645 11.969c-.438-.401-3.985-1.27-4.675-1.436 1.78-.951 2.881-3.256 2.881-5.428 0-2.82-.843-5.105-4.639-5.105-3.795 0-4.639 2.286-4.639 5.105 0 2.18 1.111 4.493 2.904 5.438-.8.189-4.237 1.018-4.685 1.426C-.014 12.7-.34 14.9.465 16l6.78-.002 6.718.002c.8-1.1.481-3.299-.318-4.031zM15.501 4h-1.997a.5.5 0 0 1 0-1H15.5a.5.5 0 0 1 0 1zM13.504 7H15.5a.5.5 0 1 0 0-1h-1.997a.5.5 0 0 0 0 1zm.998 3h.999a.5.5 0 0 0 0-1h-.998a.5.5 0 0 0 0 1zM7.212.997c-3.003 0-3.604 1.848-3.604 4.126 0 1.897.975 3.994 2.575 4.65v1.73h-.428c-1.966.41-3.773.981-4.301 1.238-.336.378-.552 1.503-.343 2.26l6.134-.002 6.07.001c.208-.756-.001-1.878-.333-2.258-.53-.253-2.306-.825-4.249-1.24h-.49v-1.73c1.599-.658 2.573-2.753 2.573-4.649 0-2.279-.601-4.126-3.604-4.126z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarUsers;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarUsersActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n className={className}\n viewBox=\"0 0 16 16\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13.645 11.969c-.438-.401-3.985-1.27-4.675-1.436 1.78-.951 2.881-3.256 2.881-5.428 0-2.82-.843-5.105-4.639-5.105-3.795 0-4.639 2.286-4.639 5.105 0 2.18 1.111 4.493 2.904 5.438-.8.189-4.237 1.018-4.685 1.426C-.014 12.7-.34 14.9.465 16l6.78-.002 6.718.002c.8-1.1.481-3.299-.318-4.031zM15.501 4h-1.997a.5.5 0 0 1 0-1H15.5a.5.5 0 0 1 0 1zM13.504 7H15.5a.5.5 0 1 0 0-1h-1.997a.5.5 0 0 0 0 1zm.998 3h.999a.5.5 0 0 0 0-1h-.998a.5.5 0 0 0 0 1z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarUsersActive;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarAssessment = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.99 4.138a1.207 1.207 0 0 0-.64-.884l-1.714-.863L12.78.665a1.2 1.2 0 0 0-.877-.644 1.181 1.181 0 0 0-1.032.332L8.423 2.817c-.32.323-.402.811-.196 1.227L9.24 6.082l-.248.25-1.672 1.683a.517.517 0 0 0 0 .739.517.517 0 0 0 .361.156.5.5 0 0 0 .361-.156l1.673-1.685.247-.25 2.024 1.02a1.1 1.1 0 0 0 .474.114c.269 0 .537-.104.744-.312l2.446-2.464a1.21 1.21 0 0 0 .33-1.04h.01zm-6.834-.583 2.447-2.464s.082-.051.113-.051h.031s.083.02.114.093l.763 1.539-.051.052-2.56 2.578-.857-1.757v.01zm5.77.895L12.48 6.913h-.02l-1.725-.862 2.56-2.579.052-.052 1.538.77c.062.03.083.083.083.114s0 .094-.041.146zm.527 3.14c.02.207.03.405.03.613 0 4.304-3.468 7.797-7.741 7.797C3.468 16 0 12.507 0 8.203S3.468.405 7.742.405c.279 0 .557.021.836.052l-.929.936C3.954 1.435.97 4.47.97 8.203c0 3.732 3.035 6.82 6.772 6.82s6.575-2.88 6.761-6.477l.95-.957zm-3.768 1.798c-.506 1.715-2.064 2.973-3.943 2.973-2.281 0-4.13-1.86-4.13-4.158A4.146 4.146 0 0 1 6.649 4.21c.041.177.103.354.186.53l.216.427a3.125 3.125 0 0 0-2.405 3.036c0 1.715 1.394 3.119 3.097 3.119a3.092 3.092 0 0 0 2.994-2.37l.557.28c.124.062.248.114.382.156h.01z\"\n fill=\"#6D7F8C\"\n />\n </svg>\n );\n }\n);\n\nexport default SidebarAssessment;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarAssessmentActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M15.99 4.138a1.207 1.207 0 0 0-.64-.884l-1.714-.863L12.78.665a1.2 1.2 0 0 0-.877-.644 1.181 1.181 0 0 0-1.032.332L8.423 2.817c-.32.323-.402.811-.196 1.227L9.24 6.082l-.248.25-1.672 1.683a.517.517 0 0 0 0 .739.517.517 0 0 0 .361.156.5.5 0 0 0 .361-.156l1.673-1.685.247-.25 2.024 1.02a1.1 1.1 0 0 0 .474.114c.269 0 .537-.104.744-.312l2.446-2.464a1.21 1.21 0 0 0 .33-1.04h.01zm-.537 3.451c.02.208.03.406.03.614 0 4.304-3.468 7.797-7.741 7.797C3.468 16 0 12.507 0 8.203S3.468.405 7.742.405c.279 0 .557.021.836.052l-.929.936C3.954 1.435.97 4.47.97 8.203c0 3.732 3.035 6.82 6.772 6.82s6.575-2.88 6.761-6.477l.95-.957zm-3.768 1.799c-.506 1.715-2.064 2.973-3.943 2.973-2.281 0-4.13-1.86-4.13-4.158A4.146 4.146 0 0 1 6.649 4.21c.041.177.103.354.186.53l.216.427a3.125 3.125 0 0 0-2.405 3.036c0 1.715 1.394 3.119 3.097 3.119a3.092 3.092 0 0 0 2.994-2.37l.557.28c.124.062.248.114.382.156h.01z\" fill=\"#fff\"/>\n <path d=\"m11 5 1.5-1.5\" stroke=\"#222431\" stroke-linecap=\"round\"/>\n </svg>\n );\n }\n);\n\nexport default SidebarAssessmentActive;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarReports = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14 15H2V1h8v4h4v10zm-.45-11L11 1.571V4h2.55zM10.8 0H1v16h14V4l-4.2-4z\" fill=\"#6D7F8C\"/>\n <path fill=\"#6D7F8C\" d=\"M4 3h3v2H4zM4 8h2v1H4zM4 11h2v1H4zM8 8h4v1H8zM8 11h4v1H8z\"/>\n </svg>\n );\n }\n);\n\nexport default SidebarReports;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarReports = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1 0h9v5h5v11H1V0zm10 .19V4h4L11 .19zM4 3h4v2H4V3zm2 5H4v1h2V8zm-2 3h2v1H4v-1zm9-3H8v1h5V8zm-5 3h3v1H8v-1z\" fill=\"#fff\"/>\n </svg>\n );\n }\n);\n\nexport default SidebarReports;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarRoleplays = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg ref={ref} className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#y25b9jn7ba)\" stroke=\"#6D7F8C\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M.469 2.797v8.11l2.577-1.84c.294-.21.647-.322 1.009-.322h5.668c.74 0 1.34-.6 1.34-1.34V1.455H1.81c-.74 0-1.34.6-1.34 1.341z\"/>\n <path d=\"M12.938 5.093h1.253c.74 0 1.34.6 1.34 1.34v8.11l-2.577-1.838a1.737 1.737 0 0 0-1.008-.323H6.277c-.74 0-1.34-.6-1.34-1.341v-.42M8.787 4.012H3.37M8.787 6.2H3.37\"/>\n </g>\n <defs>\n <clipPath id=\"y25b9jn7ba\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SidebarRoleplays;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarRoleplaysActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg ref={ref} className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#gbq6l76f4a)\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#fff\">\n <path d=\"M15.791 14.988a.5.5 0 0 0 .271-.445v-8.11a1.84 1.84 0 0 0-1.84-1.84H12.97a.5.5 0 1 0 0 1h1.252a.84.84 0 0 1 .84.84v7.14l-1.786-1.276a2.237 2.237 0 0 0-1.3-.415H6.309a.84.84 0 0 1-.84-.841v-.42a.5.5 0 0 0-1 0v.42a1.84 1.84 0 0 0 1.84 1.84h5.669c.257 0 .508.081.718.23l2.577 1.839a.5.5 0 0 0 .52.038z\" />\n <path d=\"M.79 11.357A.5.5 0 0 1 0 10.95V2.84A1.84 1.84 0 0 1 1.84 1h9.255a.5.5 0 0 1 .5.5v5.948a1.84 1.84 0 0 1-1.841 1.84H4.086c-.258 0-.509.08-.718.23L.79 11.357zm2.612-6.845a.5.5 0 0 1 0-1h5.416a.5.5 0 1 1 0 1H3.402zm0 2.188a.5.5 0 0 1 0-1h5.416a.5.5 0 1 1 0 1H3.402z\" />\n </g>\n <defs>\n <clipPath id=\"gbq6l76f4a\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SidebarRoleplaysActive;\n","import { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport ROUTES from '../../../routes/routes';\nimport SidebarLibrary from '../../icons/SidebarLibrary';\nimport SidebarLibraryActive from '../../icons/SidebarLibraryActive';\nimport SidebarTeams from '../../icons/SidebarTeams';\nimport SidebarTeamsActive from '../../icons/SidebarTeamsActive';\nimport SidebarFeed from '../../icons/SidebarFeed';\nimport SidebarFeedActive from '../../icons/SidebarFeedActive';\nimport SidebarUsers from '../../icons/SidebarUsers';\nimport SidebarUsersActive from '../../icons/SidebarUsersActive';\nimport SidebarAssessment from '../../icons/SidebarAssessment';\nimport SidebarAssessmentActive from '../../icons/SidebarAssessmentActive';\nimport SidebarReports from '../../icons/SidebarReports';\nimport SidebarReportsActive from '../../icons/SidebarReportsActive';\nimport { SideBarMenuItem } from '../../layout/Sidebar/Sidebar';\nimport SidebarRoleplays from '../../icons/SidebarRoleplays';\nimport SidebarRoleplaysActive from '../../icons/SidebarRoleplaysActive';\n\nexport const initialDefaultSideBarMenuItems: SideBarMenuItem[] = [\n {\n name: 'Feed',\n icon: SidebarFeed,\n activeIcon: SidebarFeedActive,\n url: ROUTES.SUBMISSIONS,\n permissions: [NEW_PERMISSIONS.LIST_SUBMISSION],\n },\n {\n name: 'Teams',\n icon: SidebarTeams,\n activeIcon: SidebarTeamsActive,\n url: ROUTES.TEAMS,\n permissions: [NEW_PERMISSIONS.LIST_PRACTIS_SET],\n },\n {\n name: 'Training Log',\n icon: SidebarAssessment,\n activeIcon: SidebarAssessmentActive,\n url: ROUTES.ORGANIZATION_ASSESSMENT_LOGS,\n permissions: [NEW_PERMISSIONS.MANAGE_RECORDINGS],\n },\n {\n name: 'Reports',\n icon: SidebarReports,\n activeIcon: SidebarReportsActive,\n url: ROUTES.REPORTS.LIST_OF_REPORTS,\n permissions: [NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT],\n },\n {\n name: 'Library',\n icon: SidebarLibrary,\n activeIcon: SidebarLibraryActive,\n url: ROUTES.LIBRARY,\n permissions: [\n NEW_PERMISSIONS.LIST_SCENARIO,\n NEW_PERMISSIONS.LIST_CHALLENGE,\n NEW_PERMISSIONS.LIST_PRACTIS_SET,\n ],\n },\n {\n name: 'Users',\n icon: SidebarUsers,\n activeIcon: SidebarUsersActive,\n url: ROUTES.USERS,\n alternateUrl: [ROUTES.INVITATIONS, ROUTES.DRAFTS],\n permissions: [\n NEW_PERMISSIONS.LIST_USER,\n NEW_PERMISSIONS.LIST_INVITATION,\n ],\n },\n {\n name: 'Roleplay AI',\n icon: SidebarRoleplays,\n activeIcon: SidebarRoleplaysActive,\n url: ROUTES.ROLEPLAYS.LIST_OF_ROLEPLAYS,\n },\n];\n\n","import React, { memo, useEffect, useMemo, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { CssBaseline } from '@material-ui/core';\n\nimport Sidebar from '../../layout/Sidebar/Sidebar';\nimport Loading from '../../components/LoadingCopmonent/Loading';\nimport { ScrollPaginationContext } from '../../components/ScrollPagination';\nimport Header from '../../layout/Header/Header';\nimport { TableDivider } from '../../components/table-wrapper/table-divider';\nimport { MainWrapperProps } from './types';\nimport {\n Content,\n StyledContainer,\n StyledTest,\n WrapperContainer,\n} from './styles';\nimport { initialDefaultSideBarMenuItems } from './constants';\n\nexport const MainWrapper: React.FC<MainWrapperProps> = memo(\n ({\n children,\n contentSize,\n headerPadding,\n headerMinHeight,\n contentPadding,\n title,\n subTitle,\n subHeader,\n hideHeader,\n loading,\n sideBarMenuItems,\n tabs,\n goBackUrl,\n useGoBack,\n height,\n headerHasBorder,\n refreshComponent: RefreshComponent,\n fontSize,\n isScrollable = true,\n htmlPageTitle = 'Practis Web Portal',\n dataTest,\n marginBottom\n }) => {\n const location = useLocation()\n const mainRef = useRef<any>();\n const spContext = useMemo(\n () => ({ scrollableRef: mainRef }),\n [mainRef]\n );\n\n \n useEffect(() => {\n document.title = htmlPageTitle;\n }, [htmlPageTitle, location]);\n \n\n return (\n <WrapperContainer data-test={dataTest}>\n <CssBaseline />\n <Sidebar\n menuItems={\n sideBarMenuItems || initialDefaultSideBarMenuItems\n }\n fontSize={fontSize}\n />\n <StyledTest\n id=\"MainScrollableContainer\"\n ref={mainRef}\n isScrollable={isScrollable}\n >\n <Content height={height} contentPadding={contentPadding}>\n {!hideHeader && (\n <Header\n title={title}\n subTitle={subTitle}\n tabs={tabs}\n subHeader={subHeader}\n goBackUrl={goBackUrl}\n useGoBack={useGoBack}\n hasBorder={headerHasBorder}\n headerPadding={headerPadding}\n dataTest={dataTest}\n minHeight={headerMinHeight}\n />\n )}\n <MainWrapperContainer\n contentSize={contentSize}\n loading={loading}\n height={height}\n marginBottom={marginBottom}\n >\n {!hideHeader && <TableDivider hide={false} />}\n <ScrollPaginationContext.Provider value={spContext}>\n {children}\n </ScrollPaginationContext.Provider>\n </MainWrapperContainer>\n </Content>\n </StyledTest>\n </WrapperContainer>\n );\n }\n);\n\nexport const MainWrapperContainer: React.FC<{\n contentSize?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\n loading?: boolean;\n height?: string;\n marginBottom?: string;\n}> = memo(({ contentSize, loading, height, children, marginBottom }) => {\n return (\n <StyledContainer\n maxWidth={typeof contentSize !== 'undefined' ? contentSize : 'xl'}\n height={height}\n marginBottom={marginBottom}\n >\n <div>{loading ? <Loading /> : children}</div>\n </StyledContainer>\n );\n});\n\nexport default MainWrapper;","import { pickBy } from 'lodash';\n\nexport const isEmpty = (obj: any) => {\n if (!obj) {\n return false;\n }\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n};\n\n/**\n * @description check if all object values are empty\n * @function isAllObjectValuesEmpty\n * @param { Record<string, unknown> } object\n * @returns { boolean }\n */\nexport const isAllObjectValuesEmpty = (\n object: Record<string, unknown>\n): boolean => {\n return Object.keys(object as any).every(function (item) {\n return object[item] === '' || object[item] === null;\n });\n};\n\n/**\n * @function removeNullValues\n * @param { Record<string, unknown> } object \n * @returns { Record<string, unknown> }\n */\nexport const removeNullValues = (\n object: Record<string, unknown>\n): Record<string, unknown> => {\n return pickBy(object, value => value);\n};\n","import { History } from 'history';\r\nimport { FC, useCallback, useContext, useEffect, useRef, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { NavLink, Switch, useHistory } from 'react-router-dom';\r\nimport styled from 'styled-components';\r\nimport { isCompanyAdminRole, isPractisAdminRole, isTeamLeader, userRoleTitle } from '../../constants/enums';\r\nimport { NEW_PERMISSIONS } from '../../constants/enums/permissions';\r\nimport { UserV2 } from '../../constants/interfaces/User';\r\nimport PrivateRoute from '../../routes/PrivateRouter';\r\nimport ROUTES, { replaceUserId, useUserIdMatch } from '../../routes/routes';\r\nimport ProfileInfo from './components/ProfileInfo';\r\nimport Security from './components/Security';\r\nimport Notifications from './components/Notifications';\r\nimport { getProfileState } from './store/reducers';\r\nimport { useUploadPhotoService, useUpdateProfileService, useGetProfileService } from './store/services';\r\n\r\nimport { useFetchUser } from '../../features/users/store/services';\r\nimport {\r\n getUserLoading,\r\n getUserState,\r\n} from '../../features/users/store/reducers';\r\nimport { CompanyInterface } from '../../constants/interfaces/Company';\r\nimport { getCompanyState } from '../CompanySettings/store/reducers';\r\nimport { usePermissionsState } from '../../features/permissions/store/state';\r\nimport { WEB_SITE_ID, WebSiteIdContext } from '../../tools/constants/WebSiteId';\r\nimport ArrowRight from '../../ui/icons/ArrowRight';\r\nimport AvatarPlaceholder from '../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\r\nimport { Button } from '../../ui/components/Button';\r\nimport { TableDivider } from '../../ui/components/table-wrapper/table-divider';\r\nimport { Loading } from '../../ui/components/LoadingCopmonent';\r\nimport MainWrapper from '../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { useUpdateUserPassword } from '../../api';\r\nimport { UpdatePasswordType } from '../../api/users/types';\r\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { ErrorResult } from '../../constants/interfaces/ErrorResult';\r\nimport { removeNullValues } from '../../helpers/functions/object-helpers';\r\n\r\nconst StyledUserProfile = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nexport const StyledProfileDescription = styled.div`\r\n display: flex;\r\n padding: 27px 0;\r\n justify-content: space-between;\r\n`;\r\n\r\nexport const ProfileSection = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin-left: 32px;\r\n`;\r\n\r\nexport const ViewProfile = styled.div``;\r\n\r\nexport const StyledAvatar = styled.div`\r\n height: 48px;\r\n width: 48px;\r\n border-radius: 4px;\r\n background-color: ${props => props.theme.Colors.whiteFive};\r\n img {\r\n height: 100%;\r\n width: 100%;\r\n border-radius: 4px;\r\n object-fit: cover;\r\n }\r\n`;\r\n\r\nconst StyledDescription = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n text-align: left;\r\n margin-left: 24px;\r\n flex: 1;\r\n`;\r\n\r\nconst StyledProfileInfoWrapper = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n padding: 22px 0;\r\n`;\r\n\r\nconst StyledProfileInfo = styled.div`\r\n display: flex;\r\n flex: 3;\r\n min-width: 200px;\r\n margin-right: 32px;\r\n`;\r\n\r\nconst StyledProfileNavigation = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nconst NavigationItem = styled(NavLink)`\r\n align-items: center;\r\n padding: 0 20px 0 32px;\r\n height: 64px;\r\n text-decoration: none;\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n display: flex;\r\n border-radius: 4px;\r\n background-color: ${props => props.theme.Colors.white};\r\n margin-bottom: 16px;\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n &.is-active {\r\n color: ${props => props.theme.Colors.black};\r\n border: solid 1px ${props => props.theme.Colors.cloudyBlue};\r\n }\r\n`;\r\n\r\nconst NavLinkText = styled.div`\r\n flex: 1;\r\n margin: auto;\r\n`;\r\n\r\nconst NavLinkIcon = styled(ArrowRight)`\r\n cursor: pointer;\r\n margin-left: 15px;\r\n width: 8px;\r\n height: 8px;\r\n display: flex;\r\n`;\r\n\r\nconst StyledProfileContent = styled.div`\r\n flex: 5;\r\n padding: 40px 39.5px;\r\n border-radius: 4px;\r\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n min-height: 600px;\r\n`;\r\n\r\nconst StyledLoadingContent = styled.div`\r\n padding: 20px 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n\r\nconst UserRole = styled.div`\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: ${props => props.theme.Colors.black};\r\n`;\r\n\r\nconst Address = styled.div`\r\n font-size: 11px;\r\n font-weight: 600;\r\n margin: 0;\r\n color: var(--ps-grey-1);\r\n`;\r\n\r\nexport const UserProfile: FC<{\r\n history: History;\r\n userId: number | 'me';\r\n profile?: UserV2;\r\n loading?: boolean;\r\n self?: boolean;\r\n profileRoute: string;\r\n securityRoute: string;\r\n notificationsRoute: string;\r\n company?: CompanyInterface;\r\n isPhotoUploading: boolean;\r\n updateUserProfile(data: UserV2, userId: number): void;\r\n uploadUserPicture(userId: number, file: File): void;\r\n deleteUser?(userId: number): void;\r\n}> = ({\r\n history,\r\n company,\r\n userId,\r\n profile,\r\n loading,\r\n self,\r\n profileRoute,\r\n securityRoute,\r\n notificationsRoute,\r\n isPhotoUploading,\r\n updateUserProfile,\r\n uploadUserPicture,\r\n deleteUser,\r\n}) => {\r\n const updateUserPassword = useUpdateUserPassword();\r\n const showMessage = useShowMessage();\r\n const portal = useContext(WebSiteIdContext);\r\n const permissions = usePermissionsState();\r\n const editable = self || permissions.includes(NEW_PERMISSIONS.UPDATE_USER);\r\n const canUpdatePassword =\r\n self || permissions.includes(NEW_PERMISSIONS.SET_USER_PASSWORD);\r\n const isPractisAdmin = isPractisAdminRole(profile?.role?.name);\r\n\r\n const notificationsAllowed =\r\n isTeamLeader(profile?.role?.name) || isCompanyAdminRole(profile?.role?.name);\r\n const isLoading =\r\n self || (profile && userId === profile.id) ? false : loading;\r\n const isSSOAuth = company?.isSSOEnabled;\r\n\r\n const prevCompanyRef = useRef(company);\r\n useEffect(() => {\r\n prevCompanyRef.current = company;\r\n });\r\n const prevCompany = prevCompanyRef.current;\r\n\r\n useEffect(() => {\r\n if (\r\n !company ||\r\n !(company && company.id) ||\r\n !prevCompany ||\r\n !(prevCompany && prevCompany.id)\r\n )\r\n return;\r\n if (company.id !== prevCompany.id && userId !== 'me') {\r\n history.push(ROUTES.USERS);\r\n }\r\n }, [company, prevCompany, history, userId]);\r\n\r\n const handleViewProfile = useCallback(() => {\r\n if (!profile) return;\r\n\r\n if (permissions.includes(NEW_PERMISSIONS.VIEW_USER_PERFORMANCE)) {\r\n history.push(\r\n ROUTES.USER_PERFORMANCE.replace(\r\n ':userId',\r\n profile.id!.toString()\r\n ),\r\n { useGoBack: true }\r\n );\r\n }\r\n }, [profile, history, permissions]);\r\n\r\n /**\r\n * @function handleUpdateUserPassword\r\n * @param { UpdatePasswordType } data\r\n * @param { number } userId\r\n * @returns { Promise<void> }\r\n */\r\n const handleUpdateUserPassword = async (\r\n data: UpdatePasswordType,\r\n userId: number\r\n ): Promise<void> => {\r\n await updateUserPassword(\r\n userId,\r\n removeNullValues(data) as UpdatePasswordType\r\n )\r\n .then(() => {\r\n showMessage('Profile Updated!', 'success');\r\n })\r\n .catch((error: ErrorResult) => {\r\n error.message && showMessage(error.message, 'error');\r\n });\r\n };\r\n\r\n return (\r\n <StyledUserProfile>\r\n <StyledProfileDescription>\r\n <ProfileSection>\r\n <StyledAvatar>\r\n <AvatarPlaceholder\r\n profile={profile}\r\n loading={isLoading}\r\n size=\"default\"\r\n dataTest=\"user-profile-avatar\"\r\n />\r\n </StyledAvatar>\r\n <StyledDescription>\r\n {!isLoading && (\r\n <UserRole data-test=\"user-profile-role\">\r\n {userRoleTitle(profile)}\r\n </UserRole>\r\n )}\r\n {!isLoading && (\r\n <Title data-test=\"user-profile-full-name\">\r\n {profile && profile.firstName}{' '}\r\n {profile && profile.lastName}\r\n </Title>\r\n )}\r\n {!isLoading && (\r\n <Address data-test=\"user-profile-email\">\r\n {profile && profile.email}\r\n </Address>\r\n )}\r\n </StyledDescription>\r\n </ProfileSection>\r\n {portal === WEB_SITE_ID.COMPANY_PORTAL && (\r\n <ViewProfile>\r\n <Button\r\n label={'View Profile'}\r\n width={'136px'}\r\n height={'40px'}\r\n action={handleViewProfile}\r\n />\r\n </ViewProfile>\r\n )}\r\n </StyledProfileDescription>\r\n <TableDivider />\r\n <StyledProfileInfoWrapper>\r\n <StyledProfileInfo>\r\n <StyledProfileNavigation>\r\n <NavigationItem\r\n to={replaceUserId(profileRoute, userId)}\r\n activeClassName={'is-active'}\r\n exact\r\n data-test=\"edit-details\"\r\n >\r\n <NavLinkText>Edit User Details</NavLinkText>\r\n <NavLinkIcon />\r\n </NavigationItem>\r\n {editable && canUpdatePassword && (profile && !isPractisAdmin) && !isSSOAuth && (\r\n <NavigationItem\r\n to={replaceUserId(securityRoute, userId)}\r\n activeClassName={'is-active'}\r\n exact\r\n data-test=\"change-password\"\r\n >\r\n <NavLinkText>Change Password</NavLinkText>\r\n <NavLinkIcon />\r\n </NavigationItem>\r\n )}\r\n {editable && notificationsAllowed && (\r\n <NavigationItem\r\n to={replaceUserId(notificationsRoute, userId)}\r\n activeClassName={'is-active'}\r\n exact\r\n data-test=\"notifications\"\r\n >\r\n <NavLinkText>Notifications</NavLinkText>\r\n <NavLinkIcon />\r\n </NavigationItem>\r\n )}\r\n </StyledProfileNavigation>\r\n </StyledProfileInfo>\r\n <StyledProfileContent>\r\n {!isLoading && profile ? (\r\n <Switch>\r\n <PrivateRoute path={profileRoute} exact>\r\n <ProfileInfo\r\n profile={profile}\r\n company={company}\r\n editable={editable}\r\n updateUserProfile={updateUserProfile}\r\n uploadUserPicture={uploadUserPicture}\r\n deleteUser={deleteUser}\r\n self={self}\r\n dataTest={'user-profile'}\r\n isPhotoUploading={isPhotoUploading}\r\n />\r\n </PrivateRoute>\r\n {editable && (\r\n <PrivateRoute path={securityRoute} exact>\r\n <Security\r\n profile={profile}\r\n updateUserPassword={\r\n handleUpdateUserPassword\r\n }\r\n dataTest={'change-password'}\r\n />\r\n </PrivateRoute>\r\n )}\r\n {editable && notificationsAllowed && (\r\n <PrivateRoute path={notificationsRoute} exact>\r\n <Notifications userId={profile.id} />\r\n </PrivateRoute>\r\n )}\r\n </Switch>\r\n ) : (\r\n <StyledLoadingContent>\r\n <Loading />\r\n </StyledLoadingContent>\r\n )}\r\n </StyledProfileContent>\r\n </StyledProfileInfoWrapper>\r\n </StyledUserProfile>\r\n );\r\n};\r\n\r\nexport const UserProfileContainer: FC = () => {\r\n const history = useHistory();\r\n const company = useSelector(getCompanyState);\r\n const userId = useUserIdMatch();\r\n const meProfile = useSelector(getProfileState);\r\n const user = useSelector(getUserState);\r\n const userLoading = useSelector(getUserLoading);\r\n const getProfile = useGetProfileService();\r\n const updateProfileService = useUpdateProfileService();\r\n const fetchUser = useFetchUser();\r\n const uploadPhoto = useUploadPhotoService();\r\n const showMessage = useShowMessage();\r\n const [isPhotoUploading, setIsPhotoUploading] = useState(false);\r\n\r\n let self =\r\n (meProfile && user && meProfile.id === user.id) ?? false;\r\n\r\n let targetUser = self ? meProfile || user : user;\r\n\r\n if (typeof userId === 'number' && targetUser && targetUser.id !== userId) {\r\n targetUser = undefined;\r\n self = false;\r\n }\r\n\r\n /**\r\n * @function fetchUserSettingData\r\n * @returns { void }\r\n */\r\n const fetchUserSettingData = useCallback(() => {\r\n fetchUser(userId === 'me' ? meProfile?.id! : (userId as number));\r\n }, [fetchUser, meProfile?.id, userId]);\r\n\r\n /**\r\n * @function handleUpdateUserSuccess\r\n * @param { number } userId\r\n * @returns { void }\r\n */\r\n const handleUpdateUserSuccess = useCallback((userId: number) => {\r\n if (userId === meProfile?.id) {\r\n return getProfile();\r\n }\r\n return fetchUser(userId);\r\n }, [meProfile?.id, getProfile, fetchUser]);\r\n\r\n\r\n /**\r\n * @function handleUpdateUserProfileInfo\r\n * @returns { void }\r\n */\r\n const handleUpdateUserProfileInfo = useCallback(\r\n (data: UserV2, userId: number) => {\r\n updateProfileService(data, userId, self, true)\r\n .then(() => handleUpdateUserSuccess(userId));\r\n },\r\n [updateProfileService, self, handleUpdateUserSuccess]\r\n );\r\n\r\n /**\r\n * @function handleUpdateUserProfilePicture\r\n * @returns { void }\r\n */\r\n const handleUpdateUserProfilePicture = useCallback(\r\n (userId: number, file: File) => {\r\n setIsPhotoUploading(true);\r\n uploadPhoto(userId, file)\r\n .then(() => handleUpdateUserSuccess(userId))\r\n .catch(() => {\r\n setIsPhotoUploading(false);\r\n return Promise.reject();\r\n })\r\n .then(() => {\r\n setIsPhotoUploading(false);\r\n showMessage('Image Uploaded!', 'success');\r\n });\r\n },\r\n [uploadPhoto, handleUpdateUserSuccess, showMessage]\r\n );\r\n\r\n useEffect(() => {\r\n if (typeof userId === 'number' || meProfile?.id) fetchUserSettingData();\r\n }, [fetchUserSettingData, meProfile?.id, userId]);\r\n\r\n return (\r\n <MainWrapper\r\n goBackUrl={ROUTES.USERS}\r\n subTitle=\"User Settings\"\r\n htmlPageTitle={`User Settings ${\r\n targetUser\r\n ? `- ${targetUser.firstName} ${targetUser.lastName}`\r\n : ''\r\n } - Practis`}\r\n useGoBack={true}\r\n dataTest=\"user-settings\"\r\n >\r\n <UserProfile\r\n history={history}\r\n company={company}\r\n userId={userId}\r\n profile={targetUser}\r\n loading={userLoading}\r\n self={self}\r\n profileRoute={ROUTES.PROFILE}\r\n securityRoute={ROUTES.PROFILE_SETTINGS.SECURITY}\r\n notificationsRoute={ROUTES.PROFILE_SETTINGS.NOTIFICATIONS}\r\n isPhotoUploading={isPhotoUploading}\r\n updateUserProfile={handleUpdateUserProfileInfo}\r\n uploadUserPicture={handleUpdateUserProfilePicture}\r\n />\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nexport default UserProfileContainer;\r\n","export default __webpack_public_path__ + \"static/media/404.c3f1226a.svg\";","import styled from 'styled-components';\nimport { NavLink } from 'react-router-dom';\nimport ROUTES from '../../../routes/routes';\nimport { getCopyrightYear } from '../../../helpers/functions/date-convert';\n\nconst StyledFooterContainer = styled.div`\n background: ${props => props.theme.Colors.lighterGray};\n padding: 30px 50px;\n`;\n\nconst StyledTermsRow = styled.div`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n`;\n\nconst StyledTermsItems = styled(NavLink)`\n color: ${props => props.theme.Colors.coolGray};\n font-size: 14px;\n line-height: 1.14;\n letter-spacing: normal;\n margin-right: 40px;\n text-decoration: none;\n`;\n\nconst Footer = () => {\n return (\n <StyledFooterContainer>\n <StyledTermsRow>\n <div>\n <StyledTermsItems to=\"#\">\n © Practis {getCopyrightYear()}\n </StyledTermsItems>\n </div>\n <div>\n <StyledTermsItems to={ROUTES.SUPPORT}>\n Support\n </StyledTermsItems>\n <StyledTermsItems to={ROUTES.TERMS}>\n Terms & Conditions\n </StyledTermsItems>\n <StyledTermsItems to={ROUTES.PRIVACY}>\n Privacy Policy\n </StyledTermsItems>\n </div>\n </StyledTermsRow>\n </StyledFooterContainer>\n );\n};\n\nexport default Footer;\n","import styled from 'styled-components';\n\nimport { Button } from '../../../components/Button';\nimport ROUTES from '../../../../routes/routes';\nimport Logo from '../../../components/Logo/Logo';\nimport { Variables } from '../../../../theme/variables';\n\nexport interface LandingHeaderInterface {\n withAction?: boolean;\n history?: any;\n}\n\nconst StyledLandingHeader = styled.div`\n padding: 0 50px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n`;\n\nconst StyledLogoContainer = styled.div`\n width: 172px;\n height: 42px;\n padding: 24px 0;\n`;\n\nconst StyledLogo = styled(Logo)`\n cursor: pointer;\n max-width: 100%;\n`;\n\nconst StyledActionPanel = styled.div`\n padding: 24px 0;\n display: flex;\n`;\n\nconst LandingHeader = ({ withAction, history }: LandingHeaderInterface) => {\n const handleCreateProfile = () => {\n history.push(ROUTES.AUTH_PAGES.REGISTER);\n };\n\n const handleLogin = () => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n };\n\n const handleGoToHome = () => {\n history.push(ROUTES.LANDING);\n };\n\n return (\n <StyledLandingHeader>\n <StyledLogoContainer>\n <StyledLogo\n onClick={handleGoToHome}\n height={40}\n color={Variables.Colors.black}\n />\n </StyledLogoContainer>\n {withAction && (\n <StyledActionPanel>\n <Button\n variant=\"inverse\"\n style={{\n minWidth: 130,\n padding: '0 20px',\n marginRight: 20,\n }}\n action={handleCreateProfile}\n >\n Create Profile\n </Button>\n <Button\n style={{ minWidth: 90, fontSize: 14 }}\n action={handleLogin}\n >\n Login\n </Button>\n </StyledActionPanel>\n )}\n </StyledLandingHeader>\n );\n};\n\nexport default LandingHeader;\n","import React, { useEffect } from 'react';\nimport { RouteComponentProps, withRouter } from 'react-router';\nimport Footer from '../../layout/Footer/Footer';\nimport styled from 'styled-components';\nimport LandingHeader from './LandingHeader/LandingHeader';\n\nexport interface LandingWrapperInterface {\n children: any;\n contentSize?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\n title?: string;\n withAction?: boolean;\n height?: string;\n className?: string;\n}\n\nconst StyledLandingContainer = styled.div`\n display: flex;\n align-items: stretch;\n flex-direction: column;\n height: 100vh;\n background: ${props => props.theme.Colors.white};\n overflow: auto;\n`;\nconst StyledLandingContent = styled.div<any>`\n flex: 1;\n display: flex;\n`;\n\nconst LandingWrapper = ({\n children,\n history,\n withAction,\n className,\n}: LandingWrapperInterface & RouteComponentProps) => {\n useEffect(() => {\n window.scrollTo(0, 0);\n }, []);\n\n return (\n <StyledLandingContainer>\n <LandingHeader withAction={withAction} history={history} />\n <StyledLandingContent className={className}>\n {children}\n </StyledLandingContent>\n <Footer />\n </StyledLandingContainer>\n );\n};\n\nexport default withRouter(LandingWrapper);\n","import React from 'react';\nimport styled from 'styled-components';\nimport NotFoundImage from '../../assets/images/404.svg';\nimport ROUTES from '../../routes/routes';\nimport { Button } from '../../ui/components/Button';\nimport LandingWrapper from '../../ui/wrapper/LandingWrapper/LandingWrapper';\n\nexport interface NotFoundPageInterface {\n history?: any;\n}\n\nconst NotFoundContainer = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n min-height: 450px;\n justify-content: center;\n display: flex;\n height: 100%;\n padding: 0 50px;\n text-align: center;\n`;\nconst StyledNotFoundImageContainer = styled.div`\n max-width: 600px;\n margin-bottom: 40px;\n`;\nconst StyledNotFoundImage = styled.img`\n max-width: 100%;\n`;\nconst StyledNotFoundHeader = styled.h1`\n font-size: 36px;\n font-weight: bold;\n letter-spacing: 0.5px;\n color: ${props => props.theme.Colors.dark};\n margin: 0;\n margin-bottom: 30px;\n`;\nconst StyledActionContainer = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst NotFoundPage = ({ history }: NotFoundPageInterface) => {\n const handleGoBack = () => {\n history.push(ROUTES.TEAMS);\n };\n\n return (\n <LandingWrapper height={'450px'}>\n <NotFoundContainer>\n <StyledNotFoundImageContainer>\n <StyledNotFoundImage src={NotFoundImage} />\n </StyledNotFoundImageContainer>\n <StyledNotFoundHeader>\n Looks like you found a dead end, we’ll try to fix this.\n </StyledNotFoundHeader>\n <StyledActionContainer>\n <Button\n style={{\n minWidth: 110,\n padding: '0 15px',\n marginRight: 20,\n }}\n action={handleGoBack}\n >\n Go Back\n </Button>\n </StyledActionContainer>\n </NotFoundContainer>\n </LandingWrapper>\n );\n};\n\nexport default NotFoundPage;\n","export default __webpack_public_path__ + \"static/media/LandingCard1.ec958756.png\";","export default __webpack_public_path__ + \"static/media/LandingCard2.3619aa7d.png\";","export default __webpack_public_path__ + \"static/media/LandingCard3.f13aba15.png\";","import React from 'react';\n\nexport function getBrowserVisibilityProp() {\n if (typeof document.hidden !== 'undefined') {\n // Opera 12.10 and Firefox 18 and later support\n return 'visibilitychange';\n // @ts-ignore\n } else if (typeof document.msHidden !== 'undefined') {\n return 'msvisibilitychange';\n // @ts-ignore\n } else if (typeof document.webkitHidden !== 'undefined') {\n return 'webkitvisibilitychange';\n } else {\n return 'default';\n }\n}\nexport function getBrowserDocumentHiddenProp() {\n if (typeof document.hidden !== 'undefined') {\n return 'hidden';\n // @ts-ignore\n } else if (typeof document.msHidden !== 'undefined') {\n return 'msHidden';\n // @ts-ignore\n } else if (typeof document.webkitHidden !== 'undefined') {\n return 'webkitHidden';\n } else {\n return false;\n }\n}\nexport function getIsDocumentHidden() {\n const browserHidden = getBrowserDocumentHiddenProp();\n\n return browserHidden && !document[browserHidden as 'hidden'];\n}\n\nexport const usePageVisibility = () => {\n const [isVisible, setIsVisible] = React.useState(getIsDocumentHidden());\n const onVisibilityChange = () => setIsVisible(getIsDocumentHidden());\n React.useEffect(() => {\n const visibilityChange = getBrowserVisibilityProp();\n window.addEventListener(visibilityChange, onVisibilityChange, false);\n return () => {\n window.removeEventListener(visibilityChange, onVisibilityChange);\n };\n });\n return isVisible;\n};\n\nexport default usePageVisibility;\n","import { Team, TeamV2 } from '../../../constants/interfaces/Team';\r\nimport { PaginationResult, ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\r\nimport { TrainingPractisSet } from '../../../constants/interfaces/TrainingPractisSet';\r\nimport { UserV2 } from '../../../constants/interfaces/User';\r\nimport {\r\n EnrollmentDailyTraining,\r\n EnrollmentInterface,\r\n EnrollmentProgress,\r\n Enrollments,\r\n} from '../../../constants/interfaces/Enrollments';\r\nimport { Label } from '../../../constants/interfaces/Label';\r\nimport { Action } from 'redux';\r\nimport { TeamMember } from '../../../constants/interfaces/TeamMember';\r\nimport { TeamLeader } from '../../../constants/interfaces/TeamLeader';\r\n\r\nexport enum ACTIONS {\r\n // Create new team start\r\n SEARCH_SINGLE_TEAM_START = 'SEARCH_SINGLE_TEAM_START',\r\n SEARCH_SINGLE_TEAM_SUCCESS = 'SEARCH_SINGLE_TEAM_SUCCESS',\r\n SEARCH_SINGLE_TEAM_FAILURE = 'SEARCH_SINGLE_TEAM_FAILURE',\r\n SEARCH_SINGLE_TEAM_ALL_USERS_START = 'SEARCH_SINGLE_TEAM_ALL_USERS_START',\r\n SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS = 'SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS',\r\n SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE = 'SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE',\r\n SEARCH_SINGLE_TEAM_MEMBERS_START = 'SEARCH_SINGLE_TEAM_MEMBERS_START',\r\n SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS = 'SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS',\r\n SEARCH_SINGLE_TEAM_MEMBERS_FAILURE = 'SEARCH_SINGLE_TEAM_MEMBERS_FAILURE',\r\n MODIFY_TEAM_NAME = 'MODIFY_TEAM_NAME',\r\n UPDATE_TEAM_LEAD = 'UPDATE_TEAM_LEAD',\r\n SET_ASSIGNED_LABELS_TO_SINGLE_TEAM = 'SET_ASSIGNED_LABELS_TO_SINGLE_TEAM',\r\n SET_DELETED_LABELS_TO_SINGLE_TEAM = 'SET_DELETED_LABELS_TO_SINGLE_TEAM',\r\n RESET_SINGLE_TEAM_PAGE = 'RESET_SINGLE_TEAM_PAGE',\r\n REMOVE_SINGLE_TEAM_ALL_USERS_LABEL = 'REMOVE_SINGLE_TEAM_ALL_USERS_LABEL',\r\n REMOVE_SINGLE_TEAM_MEMBER_LABEL = 'REMOVE_SINGLE_TEAM_MEMBER_LABEL',\r\n\r\n CREATE_SINGLE_TEAM_SUCCESS = 'CREATE_SINGLE_TEAM_SUCCESS',\r\n\r\n UPDATE_SINGLE_TEAM_START = 'UPDATE_SINGLE_TEAM_START',\r\n UPDATE_SINGLE_TEAM_SUCCESS = 'UPDATE_SINGLE_TEAM_SUCCESS',\r\n UPDATE_SINGLE_TEAM_FAILURE = 'UPDATE_SINGLE_TEAM_FAILURE',\r\n UPDATE_SINGLE_TEAM_STOP = 'UPDATE_SINGLE_TEAM_STOP',\r\n\r\n CLEAR_TEAM_UPDATE_STATUS = 'CLEAR_TEAM_UPDATE_STATUS',\r\n\r\n FETCH_ALL_TEAMS = 'FETCH_ALL_TEAMS',\r\n FETCH_ALL_TEAMS_SUCCESS = 'FETCH_ALL_TEAMS_SUCCESS',\r\n FETCH_ALL_TEAMS_FAILURE = 'FETCH_ALL_TEAMS_FAILURE',\r\n\r\n UPDATE_SELECTED_TEAM_STATE = 'UPDATE_SELECTED_TEAM_STATE',\r\n UPDATE_ALL_SELECTED_TEAMS_STATE = 'UPDATE_ALL_SELECTED_TEAMS_STATE',\r\n\r\n UPDATE_TEAM_START = 'UPDATE_TEAM_START',\r\n UPDATE_TEAM_SUCCESS = 'UPDATE_TEAM_SUCCESS',\r\n UPDATE_TEAM_FAILURE = 'UPDATE_TEAM_FAILURE',\r\n\r\n UPDATE_TRAINEE_DUE_DATE = 'UPDATE_TRAINEE_DUE_DATE',\r\n\r\n UPDATE_ALL_SELECTED_TEAM_PRACTIS_SETS_STATE = 'UPDATE_ALL_SELECTED_TEAM_PRACTIS_SETS_STATE',\r\n UPDATE_SELECTED_TEAM_PRACTIS_SET_STATE = 'UPDATE_SELECTED_TEAM_PRACTIS_SET_STATE',\r\n UPDATE_TEAM_PROGRESS_SUCCESS = 'UPDATE_TEAM_PROGRESS_SUCCESS',\r\n\r\n SEARCH_TEAM_PRACTIS_SETS_START = 'SEARCH_TEAM_PRACTIS_SETS_START',\r\n SEARCH_TEAM_PRACTIS_SETS_SUCCESS = 'SEARCH_TEAM_PRACTIS_SETS_SUCCESS',\r\n SEARCH_TEAM_PRACTIS_SETS_FAILURE = 'SEARCH_TEAM_PRACTIS_SETS_FAILURE',\r\n\r\n SEARCH_TRAINER_PRACTIS_SETS_START = 'SEARCH_TRAINER_PRACTIS_SETS',\r\n SEARCH_TRAINER_PRACTIS_SETS_SUCCESS = 'SEARCH_TRAINER_PRACTIS_SETS_SUCCESS',\r\n SEARCH_TRAINER_PRACTIS_SETS_FAILURE = 'SEARCH_TRAINER_PRACTIS_SETS_FAILURE',\r\n\r\n UPDATE_PROGRESS_START = 'UPDATE_PROGRESS_START',\r\n UPDATE_PROGRESS_SUCCESS = 'UPDATE_PROGRESS_SUCCESS',\r\n UPDATE_PROGRESS_FAILURE = 'UPDATE_PROGRESS_FAILURE',\r\n\r\n SEARCH_TRAINER_PRACTIS_USERS_START = 'SEARCH_TRAINER_PRACTIS_USERS_START',\r\n SEARCH_TRAINER_PRACTIS_USERS_SUCCESS = 'SEARCH_TRAINER_PRACTIS_USERS_SUCCESS',\r\n SEARCH_TRAINER_PRACTIS_USERS_FAILURE = 'SEARCH_TRAINER_PRACTIS_USERS_FAILURE',\r\n CLEAR_TRAINER_PRACTIS_SETS_SUCCESS = 'CLEAR_TRAINER_PRACTIS_SETS_SUCCESS',\r\n\r\n SEARCH_TRAINER_INVITATION_USERS_START = 'SEARCH_TRAINER_INVITATION_USERS_START',\r\n SEARCH_TRAINER_INVITATION_USERS_SUCCESS = 'SEARCH_TRAINER_INVITATION_USERS_SUCCESS',\r\n SEARCH_TRAINER_INVITATION_USERS_FAILURE = 'SEARCH_TRAINER_INVITATION_USERS_FAILURE',\r\n\r\n SEND_TRAINEE_INVITATION_START = 'SEND_TRAINEE_INVITATION_START',\r\n SEND_TRAINEE_INVITATION_SUCCESS = 'SEND_TRAINEE_INVITATION_SUCCESS',\r\n SEND_TRAINEE_INVITATION_FAILURE = 'SEND_TRAINEE_INVITATION_FAILURE',\r\n UPDATE_SELECTED_INVITATION_TRAINEES_STATE = 'UPDATE_SELECTED_INVITATION_TRAINEES_STATE',\r\n UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE = 'UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE',\r\n\r\n GET_PRACTIS_SET_REPORT_START = 'GET_PRACTIS_SET_REPORT_START',\r\n GET_PRACTIS_SET_REPORT_SUCCESS = 'GET_PRACTIS_SET_REPORT_SUCCESS',\r\n GET_PRACTIS_SET_REPORT_FAILURE = 'GET_PRACTIS_SET_REPORT_FAILURE',\r\n RESET_PRACTIS_SET_REPORT = 'RESET_PRACTIS_SET_REPORT',\r\n RESET_PRACTIS_SET_DETAILS = 'RESET_PRACTIS_SET_DETAILS',\r\n\r\n GET_PRACTIS_SET_START = 'GET_PRACTIS_SET_START',\r\n GET_PRACTIS_SET_SUCCESS = 'GET_PRACTIS_SET_SUCCESS',\r\n GET_PRACTIS_SET_FAILURE = 'GET_PRACTIS_SET_FAILURE',\r\n\r\n CHECK_ALL_PROGRESS = 'CHECK_ALL_PROGRESS',\r\n CHECK_SINGLE_PROGRESS = 'CHECK_SINGLE_PROGRESS',\r\n\r\n UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE = 'UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE',\r\n UPDATE_SELECTED_PRACTIS_SET_STATE = 'UPDATE_SELECTED_PRACTIS_SET_STATE',\r\n\r\n UPDATE_MEMBER_START = 'UPDATE_MEMBER_START',\r\n UPDATE_MEMBER_SUCCESS = 'UPDATE_MEMBER_SUCCESS',\r\n UPDATE_MEMBER_FAILURE = 'UPDATE_MEMBER_FAILURE',\r\n\r\n GET_TEAM_INFO_START = 'GET_TEAM_INFO_START',\r\n GET_TEAM_INFO_SUCCESS = 'GET_TEAM_INFO_SUCCESS',\r\n GET_TEAM_INFO_FAILURE = 'GET_TEAM_INFO_FAILURE',\r\n RESET_TEAM_INFO = 'RESET_TEAM_INFO',\r\n\r\n GET_TEAM_INFO_TRAINING_START = 'GET_TEAM_INFO_TRAINING_START',\r\n GET_TEAM_INFO_TRAINING_SUCCESS = 'GET_TEAM_INFO_TRAINING_SUCCESS',\r\n GET_TEAM_INFO_TRAINING_FAILURE = 'GET_TEAM_INFO_TRAINING_FAILURE',\r\n\r\n SEARCH_TEAM_MEMBERS_START = 'SEARCH_TEAM_MEMBERS_START',\r\n SEARCH_TEAM_MEMBERS_SUCCESS = 'SEARCH_TEAM_MEMBERS_SUCCESS',\r\n SEARCH_TEAM_MEMBERS_FAILURE = 'SEARCH_TEAM_MEMBERS_FAILURE',\r\n\r\n SEARCH_TEAM_LEADERS_START = 'SEARCH_TEAM_LEADERS_START',\r\n SEARCH_TEAM_LEADERS_SUCCESS = 'SEARCH_TEAM_LEADERS_SUCCESS',\r\n SEARCH_TEAM_LEADERS_FAILURE = 'SEARCH_TEAM_LEADERS_FAILURE',\r\n SELECT_TEAM_LEADER = 'SELECT_TEAM_LEADER',\r\n SELECT_MULTIPLE_TEAM_LEADERS = 'SELECT_MULTIPLE_TEAM_LEADERS',\r\n RESET_TEAM_LEADERS_SELECTION = 'RESET_TEAM_LEADERS_SELECTION',\r\n DESELECT_ALL_TEAM_LEADERS_SELECTION = 'DESELECT_ALL_TEAM_LEADERS_SELECTION',\r\n SAVE_TEAM_LEADERS_SELECTION = 'SAVE_TEAM_LEADERS_SELECTION',\r\n}\r\n\r\nexport function searchSingleTeamStart() {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_START as ACTIONS.SEARCH_SINGLE_TEAM_START,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamSuccess(data: TeamV2) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_SUCCESS as ACTIONS.SEARCH_SINGLE_TEAM_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamFailure(error: any) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_FAILURE as ACTIONS.SEARCH_SINGLE_TEAM_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function getTeamInfoStart() {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_START as ACTIONS.GET_TEAM_INFO_START,\r\n };\r\n}\r\n\r\nexport function getTeamInfoSuccess(data: TeamV2) {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_SUCCESS as ACTIONS.GET_TEAM_INFO_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getTeamInfoFailure(error: any) {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_FAILURE as ACTIONS.GET_TEAM_INFO_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function resetTeamInfo() {\r\n return {\r\n type: ACTIONS.RESET_TEAM_INFO as ACTIONS.RESET_TEAM_INFO,\r\n };\r\n}\r\n\r\nexport function getTeamInfoTrainingStart() {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_TRAINING_START as ACTIONS.GET_TEAM_INFO_TRAINING_START,\r\n };\r\n}\r\n\r\nexport function getTeamInfoTrainingSuccess(data: TeamV2) {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_TRAINING_SUCCESS as ACTIONS.GET_TEAM_INFO_TRAINING_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getTeamInfoTrainingFailure(error: any) {\r\n return {\r\n type: ACTIONS.GET_TEAM_INFO_TRAINING_FAILURE as ACTIONS.GET_TEAM_INFO_TRAINING_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamAllUsersStart() {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_START as ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_START,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamAllUsersSuccess(\r\n data: ListResult<UserV2>,\r\n offset: number,\r\n isRefreshed?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS as ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS,\r\n data,\r\n offset,\r\n isRefreshed,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamAllUsersFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE as ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamMembersStart() {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_START as ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_START,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamMembersSuccess(\r\n data: ListResult<TeamMember>,\r\n offset: number,\r\n isRefreshed?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS as ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS,\r\n data,\r\n offset,\r\n isRefreshed,\r\n };\r\n}\r\n\r\nexport function searchSingleTeamMembersFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_FAILURE as ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function modifyTeamName(value: string) {\r\n return {\r\n type: ACTIONS.MODIFY_TEAM_NAME as ACTIONS.MODIFY_TEAM_NAME,\r\n value,\r\n };\r\n}\r\n\r\nexport function updateTeamLead(teamUserId: number, isTeamLead: boolean) {\r\n return {\r\n type: ACTIONS.UPDATE_TEAM_LEAD as ACTIONS.UPDATE_TEAM_LEAD,\r\n teamUserId,\r\n isTeamLead,\r\n };\r\n}\r\n\r\nexport function setAssignedLabelsToSingleTeam(labelIDs: number[]) {\r\n return {\r\n type: ACTIONS.SET_ASSIGNED_LABELS_TO_SINGLE_TEAM as ACTIONS.SET_ASSIGNED_LABELS_TO_SINGLE_TEAM,\r\n labelIDs,\r\n };\r\n}\r\n\r\nexport function setDeletedLabelsToSingleTeam(labelIDs: number[]) {\r\n return {\r\n type: ACTIONS.SET_DELETED_LABELS_TO_SINGLE_TEAM as ACTIONS.SET_DELETED_LABELS_TO_SINGLE_TEAM,\r\n labelIDs,\r\n };\r\n}\r\n\r\nexport function resetSingleTeamPage() {\r\n return {\r\n type: ACTIONS.RESET_SINGLE_TEAM_PAGE as ACTIONS.RESET_SINGLE_TEAM_PAGE,\r\n };\r\n}\r\n\r\nexport function removeSingleTeamAllUsersLabel(userId: number, labelId: number) {\r\n return {\r\n type: ACTIONS.REMOVE_SINGLE_TEAM_ALL_USERS_LABEL as ACTIONS.REMOVE_SINGLE_TEAM_ALL_USERS_LABEL,\r\n userId,\r\n labelId\r\n };\r\n}\r\n\r\nexport function removeSingleTeamMemberLabel(userId: number, labelId: number) {\r\n return {\r\n type: ACTIONS.REMOVE_SINGLE_TEAM_MEMBER_LABEL as ACTIONS.REMOVE_SINGLE_TEAM_MEMBER_LABEL,\r\n userId,\r\n labelId\r\n };\r\n}\r\n\r\nexport function createSingleTeamSuccess(team: Partial<TeamV2>) {\r\n return {\r\n type: ACTIONS.CREATE_SINGLE_TEAM_SUCCESS as ACTIONS.CREATE_SINGLE_TEAM_SUCCESS,\r\n team,\r\n };\r\n}\r\n\r\nexport function updateSingleTeamStart() {\r\n return {\r\n type: ACTIONS.UPDATE_SINGLE_TEAM_START as ACTIONS.UPDATE_SINGLE_TEAM_START,\r\n };\r\n}\r\n\r\nexport function updateSingleTeamSuccess(team?: Partial<TeamV2>) {\r\n return {\r\n type: ACTIONS.UPDATE_SINGLE_TEAM_SUCCESS as ACTIONS.UPDATE_SINGLE_TEAM_SUCCESS,\r\n team,\r\n };\r\n}\r\n\r\nexport function updateSingleTeamFailure(error?: string) {\r\n return {\r\n type: ACTIONS.UPDATE_SINGLE_TEAM_FAILURE as ACTIONS.UPDATE_SINGLE_TEAM_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateSingleTeamStop() {\r\n return {\r\n type: ACTIONS.UPDATE_SINGLE_TEAM_STOP as ACTIONS.UPDATE_SINGLE_TEAM_STOP,\r\n };\r\n}\r\n\r\nexport function clearTeamUpdateStatus() {\r\n return {\r\n type: ACTIONS.CLEAR_TEAM_UPDATE_STATUS as ACTIONS.CLEAR_TEAM_UPDATE_STATUS,\r\n };\r\n}\r\n\r\nexport function searchTeamPractisSetsStart() {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_PRACTIS_SETS_START as ACTIONS.SEARCH_TEAM_PRACTIS_SETS_START,\r\n };\r\n}\r\n\r\nexport function searchTeamPractisSetsSuccess(\r\n practisSets: PaginationResult<PractisSets>\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_PRACTIS_SETS_SUCCESS as ACTIONS.SEARCH_TEAM_PRACTIS_SETS_SUCCESS,\r\n practisSets,\r\n };\r\n}\r\n\r\nexport function searchTeamPractisSetsFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_PRACTIS_SETS_FAILURE as ACTIONS.SEARCH_TEAM_PRACTIS_SETS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function fetchAllTeamsStart() {\r\n return {\r\n type: ACTIONS.FETCH_ALL_TEAMS as ACTIONS.FETCH_ALL_TEAMS,\r\n };\r\n}\r\n\r\nexport function fetchAllTeamsSuccess(data: ListResult<Team>) {\r\n return {\r\n type: ACTIONS.FETCH_ALL_TEAMS_SUCCESS as ACTIONS.FETCH_ALL_TEAMS_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function fetchAllTeamsFailure(error: string) {\r\n return {\r\n type: ACTIONS.FETCH_ALL_TEAMS_FAILURE as ACTIONS.FETCH_ALL_TEAMS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateSelectedTeamState(teamId: number) {\r\n return {\r\n type: ACTIONS.UPDATE_SELECTED_TEAM_STATE as ACTIONS.UPDATE_SELECTED_TEAM_STATE,\r\n teamId,\r\n };\r\n}\r\n\r\nexport function updateAllSelectedTeamsState(\r\n teamIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_ALL_SELECTED_TEAMS_STATE as ACTIONS.UPDATE_ALL_SELECTED_TEAMS_STATE,\r\n teamIds,\r\n checked,\r\n partial,\r\n };\r\n}\r\n\r\nexport function updateMemberActionStart() {\r\n return {\r\n type: ACTIONS.UPDATE_MEMBER_START as ACTIONS.UPDATE_MEMBER_START,\r\n };\r\n}\r\n\r\nexport function updateMemberActionSuccess(\r\n team: any,\r\n updateType: 'create' | 'update' | 'delete' | 'labels'\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_MEMBER_SUCCESS as ACTIONS.UPDATE_MEMBER_SUCCESS,\r\n team,\r\n updateType,\r\n };\r\n}\r\n\r\nexport function updateMemberActionFailure(error: string) {\r\n return {\r\n type: ACTIONS.UPDATE_MEMBER_FAILURE as ACTIONS.UPDATE_MEMBER_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateTeamActionStart() {\r\n return {\r\n type: ACTIONS.UPDATE_TEAM_START as ACTIONS.UPDATE_TEAM_START,\r\n };\r\n}\r\n\r\nexport function updateTeamActionSuccess(\r\n team: any,\r\n updateType: 'create' | 'update' | 'delete' | 'labels'\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_TEAM_SUCCESS as ACTIONS.UPDATE_TEAM_SUCCESS,\r\n team,\r\n updateType,\r\n };\r\n}\r\n\r\nexport function updateTeamActionFailure(error: string) {\r\n return {\r\n type: ACTIONS.UPDATE_TEAM_FAILURE as ACTIONS.UPDATE_TEAM_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateTraineeDueDateAction(trainees: number[], dueDate: Date | null) {\r\n return {\r\n type: ACTIONS.UPDATE_TRAINEE_DUE_DATE as ACTIONS.UPDATE_TRAINEE_DUE_DATE,\r\n trainees,\r\n dueDate,\r\n };\r\n}\r\n\r\nexport function updateAllSelectedTeamPractisSetsState(\r\n setIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_ALL_SELECTED_TEAM_PRACTIS_SETS_STATE as ACTIONS.UPDATE_ALL_SELECTED_TEAM_PRACTIS_SETS_STATE,\r\n setIds,\r\n checked,\r\n partial,\r\n };\r\n}\r\n\r\nexport function updateSelectedTeamPractisSetState(setId: number) {\r\n return {\r\n type: ACTIONS.UPDATE_SELECTED_TEAM_PRACTIS_SET_STATE as ACTIONS.UPDATE_SELECTED_TEAM_PRACTIS_SET_STATE,\r\n setId,\r\n };\r\n}\r\n\r\nexport function updateAllSelectedPractisSetsState(\r\n setIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE as ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE,\r\n setIds,\r\n checked,\r\n partial,\r\n };\r\n}\r\n\r\nexport function updateSelectedPractisSetState(setId: number) {\r\n return {\r\n type: ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE as ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE,\r\n setId,\r\n };\r\n}\r\n\r\nexport function searchTrainerStart() {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_START as ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_START,\r\n };\r\n}\r\n\r\nexport function searchTrainerSuccess(\r\n practisSets: ListResult<TrainingPractisSet>\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_SUCCESS as ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_SUCCESS,\r\n practisSets,\r\n };\r\n}\r\n\r\nexport function clearTrainerPractisSet() {\r\n return {\r\n type: ACTIONS.CLEAR_TRAINER_PRACTIS_SETS_SUCCESS as ACTIONS.CLEAR_TRAINER_PRACTIS_SETS_SUCCESS,\r\n };\r\n}\r\n\r\nexport function searchTrainerFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_FAILURE as ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function updatedProgressActionStart() {\r\n return {\r\n type: ACTIONS.UPDATE_PROGRESS_START as ACTIONS.UPDATE_PROGRESS_START,\r\n };\r\n}\r\n\r\nexport function updatedProgressActionSuccess(\r\n progress: PractisSets,\r\n updateType: 'create' | 'update' | 'delete' | 'labels'\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_PROGRESS_SUCCESS as ACTIONS.UPDATE_PROGRESS_SUCCESS,\r\n progress,\r\n updateType,\r\n };\r\n}\r\n\r\nexport function updatedProgressActionFailure(error: any) {\r\n return {\r\n type: ACTIONS.UPDATE_PROGRESS_FAILURE as ACTIONS.UPDATE_PROGRESS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function searchPractisUsersStart() {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_START as ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_START,\r\n };\r\n}\r\n\r\nexport function searchPractisUsersSuccess(\r\n users: PaginationResult<EnrollmentInterface>\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_SUCCESS as ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_SUCCESS,\r\n users,\r\n };\r\n}\r\n\r\nexport function searchPractisUsersFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_FAILURE as ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function searchInvitationUsersStart() {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_INVITATION_USERS_START as ACTIONS.SEARCH_TRAINER_INVITATION_USERS_START,\r\n };\r\n}\r\n\r\nexport function searchInvitationUsersSuccess(\r\n users: ListResult<UserV2>,\r\n offset: number,\r\n isRefreshed?: boolean,\r\n) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_INVITATION_USERS_SUCCESS as ACTIONS.SEARCH_TRAINER_INVITATION_USERS_SUCCESS,\r\n users,\r\n offset,\r\n isRefreshed,\r\n };\r\n}\r\n\r\nexport function searchInvitationUsersFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEARCH_TRAINER_INVITATION_USERS_FAILURE as ACTIONS.SEARCH_TRAINER_INVITATION_USERS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function sendTraineeInvitationStart() {\r\n return {\r\n type: ACTIONS.SEND_TRAINEE_INVITATION_START as ACTIONS.SEND_TRAINEE_INVITATION_START,\r\n };\r\n}\r\n\r\nexport function sendTraineeInvitationSuccess(\r\n enrollments: Enrollments,\r\n inviteType: 'invite' | 'reInvite' | 'unassign'\r\n) {\r\n return {\r\n type: ACTIONS.SEND_TRAINEE_INVITATION_SUCCESS as ACTIONS.SEND_TRAINEE_INVITATION_SUCCESS,\r\n enrollments,\r\n inviteType,\r\n };\r\n}\r\n\r\nexport function sendTraineeInvitationFailure(error: string) {\r\n return {\r\n type: ACTIONS.SEND_TRAINEE_INVITATION_FAILURE as ACTIONS.SEND_TRAINEE_INVITATION_FAILURE,\r\n error,\r\n };\r\n}\r\nexport function getPractisSetStart() {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_START as ACTIONS.GET_PRACTIS_SET_START,\r\n };\r\n}\r\n\r\nexport function getPractisSetSuccess(practisSet: PractisSets) {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_SUCCESS as ACTIONS.GET_PRACTIS_SET_SUCCESS,\r\n practisSet,\r\n };\r\n}\r\n\r\nexport function getPractisSetFailure(error: string) {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_FAILURE as ACTIONS.GET_PRACTIS_SET_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function getPractisSetReportStart() {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_REPORT_START as ACTIONS.GET_PRACTIS_SET_REPORT_START,\r\n };\r\n}\r\n\r\nexport function getPractisSetReportSuccess(\r\n enrollment: EnrollmentInterface,\r\n progress: ListResult<EnrollmentProgress>,\r\n dailyTraining: EnrollmentDailyTraining[]\r\n) {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_REPORT_SUCCESS as ACTIONS.GET_PRACTIS_SET_REPORT_SUCCESS,\r\n enrollment,\r\n progress,\r\n dailyTraining,\r\n };\r\n}\r\n\r\nexport function getPractisSetReportFailure(error: string) {\r\n return {\r\n type: ACTIONS.GET_PRACTIS_SET_REPORT_FAILURE as ACTIONS.GET_PRACTIS_SET_REPORT_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function resetPractisSetDetails() {\r\n return {\r\n type: ACTIONS.RESET_PRACTIS_SET_DETAILS as ACTIONS.RESET_PRACTIS_SET_DETAILS,\r\n };\r\n}\r\n\r\nexport function resetPractisSetReport() {\r\n return {\r\n type: ACTIONS.RESET_PRACTIS_SET_REPORT as ACTIONS.RESET_PRACTIS_SET_REPORT,\r\n };\r\n}\r\n\r\nexport function checkSingleProgress(id: number) {\r\n return {\r\n type: ACTIONS.CHECK_SINGLE_PROGRESS as ACTIONS.CHECK_SINGLE_PROGRESS,\r\n id,\r\n };\r\n}\r\n\r\nexport function updateAllSelectedInvitationTraineesState(\r\n userIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE as ACTIONS.UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE,\r\n userIds,\r\n checked,\r\n partial,\r\n };\r\n}\r\n\r\nexport function updateSelectedInvitationTraineesState(userId: number) {\r\n return {\r\n type: ACTIONS.UPDATE_SELECTED_INVITATION_TRAINEES_STATE as ACTIONS.UPDATE_SELECTED_INVITATION_TRAINEES_STATE,\r\n userId,\r\n };\r\n}\r\n\r\nexport function checkAllProgress(\r\n progressId: any,\r\n checked: boolean,\r\n partial?: boolean\r\n) {\r\n return {\r\n type: ACTIONS.CHECK_ALL_PROGRESS as ACTIONS.CHECK_ALL_PROGRESS,\r\n progressId,\r\n checked,\r\n partial,\r\n };\r\n}\r\n\r\nexport enum INVITATION_LABEL_ACTIONS {\r\n SEARCH_LABELS_START = 'SEARCH_INVITATION_LABELS_START',\r\n SEARCH_LABELS_SUCCESS = 'SEARCH__INVITATION_LABELS_SUCCESS',\r\n SEARCH_LABELS_FAILURE = 'SEARCH_INVITATION_LABELS_FAILURE',\r\n\r\n TOGGLE_COLLAPSE_INVITATION_LABEL_FIELD = 'TOGGLE_COLLAPSE_INVITATION_LABEL_FIELD',\r\n SAVE_SELECTED_INVITATION_LABELS = 'SAVE_SELECTED_INVITATION_LABELS',\r\n\r\n SET_INVITATION_LABEL_FILTERS = 'SET_INVITATION_LABEL_FILTERS',\r\n CLEAR_LABEL_FILTERS = 'CLEAR_INVITATION_LABEL_FILTERS',\r\n}\r\n\r\nexport function searchLabelsStart(withLoading?: boolean) {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.SEARCH_LABELS_START as INVITATION_LABEL_ACTIONS.SEARCH_LABELS_START,\r\n withLoading,\r\n };\r\n}\r\n\r\nexport function searchLabelsSuccess(\r\n data: PaginationResult<Label>,\r\n searchTerm?: boolean\r\n) {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.SEARCH_LABELS_SUCCESS as INVITATION_LABEL_ACTIONS.SEARCH_LABELS_SUCCESS,\r\n data,\r\n searchTerm,\r\n };\r\n}\r\n\r\nexport function searchLabelsFailure(error: string) {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.SEARCH_LABELS_FAILURE as INVITATION_LABEL_ACTIONS.SEARCH_LABELS_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport function toggleCollapseLabelFieldAction(labelId: number) {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.TOGGLE_COLLAPSE_INVITATION_LABEL_FIELD as INVITATION_LABEL_ACTIONS.TOGGLE_COLLAPSE_INVITATION_LABEL_FIELD,\r\n labelId,\r\n };\r\n}\r\n\r\nexport function setLabelFilterAction(labels: number[]) {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.SET_INVITATION_LABEL_FILTERS as INVITATION_LABEL_ACTIONS.SET_INVITATION_LABEL_FILTERS,\r\n labels,\r\n };\r\n}\r\n\r\nexport function saveSelectedInvitationLabels() {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.SAVE_SELECTED_INVITATION_LABELS as INVITATION_LABEL_ACTIONS.SAVE_SELECTED_INVITATION_LABELS,\r\n };\r\n}\r\n\r\nexport function clearLabelFilterAction() {\r\n return {\r\n type: INVITATION_LABEL_ACTIONS.CLEAR_LABEL_FILTERS as INVITATION_LABEL_ACTIONS.CLEAR_LABEL_FILTERS,\r\n };\r\n}\r\n\r\nexport const searchTeamMembersStartAction = (): Action<ACTIONS.SEARCH_TEAM_MEMBERS_START> => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_MEMBERS_START,\r\n };\r\n};\r\n\r\nexport const searchTeamMembersSuccessAction = (\r\n data: ListResult<TeamMember>\r\n): Action<ACTIONS.SEARCH_TEAM_MEMBERS_SUCCESS> & {\r\n data: ListResult<TeamMember>;\r\n} => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_MEMBERS_SUCCESS,\r\n data,\r\n };\r\n};\r\n\r\nexport const searchTeamMembersFailureAction = (\r\n error: string\r\n): Action<ACTIONS.SEARCH_TEAM_MEMBERS_FAILURE> & { error: string } => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_MEMBERS_FAILURE,\r\n error,\r\n };\r\n};\r\n\r\nexport const searchTeamLeadersStartAction = () => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_LEADERS_START as ACTIONS.SEARCH_TEAM_LEADERS_START,\r\n };\r\n};\r\n\r\nexport const searchTeamLeadersSuccessAction = (\r\n data: PaginationResult<TeamLeader>\r\n) => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_LEADERS_SUCCESS as ACTIONS.SEARCH_TEAM_LEADERS_SUCCESS,\r\n data,\r\n };\r\n};\r\n\r\nexport const searchTeamLeadersFailureAction = (error: string) => {\r\n return {\r\n type: ACTIONS.SEARCH_TEAM_LEADERS_FAILURE as ACTIONS.SEARCH_TEAM_LEADERS_FAILURE,\r\n error,\r\n };\r\n};\r\n\r\nexport const selectTeamLeaderAction = (leaderId: number) => {\r\n return {\r\n type: ACTIONS.SELECT_TEAM_LEADER as ACTIONS.SELECT_TEAM_LEADER,\r\n leaderId,\r\n };\r\n};\r\n\r\nexport const selectMultipleTeamLeaderAction = (leaderIds: number[]) => {\r\n return {\r\n type: ACTIONS.SELECT_MULTIPLE_TEAM_LEADERS as ACTIONS.SELECT_MULTIPLE_TEAM_LEADERS,\r\n leaderIds,\r\n };\r\n};\r\n\r\nexport const resetTeamLeadersSelectionAction = () => {\r\n return {\r\n type: ACTIONS.RESET_TEAM_LEADERS_SELECTION as ACTIONS.RESET_TEAM_LEADERS_SELECTION,\r\n };\r\n};\r\n\r\nexport const deselectAllTeamLeadersSelectionAction = () => {\r\n return {\r\n type: ACTIONS.DESELECT_ALL_TEAM_LEADERS_SELECTION as ACTIONS.DESELECT_ALL_TEAM_LEADERS_SELECTION,\r\n };\r\n};\r\n\r\nexport const saveTeamLeaderSelection = () => {\r\n return {\r\n type: ACTIONS.SAVE_TEAM_LEADERS_SELECTION as ACTIONS.SAVE_TEAM_LEADERS_SELECTION,\r\n };\r\n};\r\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { CARDS, useDynamicCardHeight, useDynamicCardWidth } from '../configs';\nimport usePageVisibility from '../../../helpers/hooks/usePageVisibility';\nimport {\n isSafari,\n isOpera,\n isEdge,\n isChrome,\n isFirefox,\n} from '../../../helpers/functions/detect-browsers';\n\nconst StyledCardContent = styled(motion.div)`\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n align-items: center;\n position: relative;\n overflow: hidden;\n justify-content: center;\n`;\n\nconst StyledCard = styled(motion.div)<{ width: number; height: number }>`\n height: ${props => props.height}px;\n width: ${props => props.width}px;\n`;\n\nconst StyledNextCard = styled(motion.div)<{\n width: number;\n height: number;\n margin: number;\n}>`\n height: ${props => props.height}px;\n width: ${props => props.width}px;\n margin-top: -${props => props.margin}px;\n margin-left: ${props =>\n isSafari() || isOpera() || isEdge()\n ? props.width + 80\n : (props.width + 80) * 2}px;\n position: absolute;\n`;\n\nconst StyledCounter = styled(motion.div)<{\n percentage: number;\n width: number;\n height: number;\n margin?: number;\n}>`\n height: ${props => props.height}px;\n width: ${props => props.width}px;\n background: ${props => props.theme.Colors.white};\n opacity: 0.8;\n border-radius: 6px;\n z-index: 2;\n margin: ${props => (props.margin ? props.margin : 32)}px 0;\n position: relative;\n overflow: hidden;\n &:before {\n display: block;\n position: absolute;\n content: '';\n background: ${props => props.theme.Colors.softBlue};\n bottom: 0;\n width: ${props => props.percentage}%;\n height: 100%;\n transition: ${props =>\n props.percentage > 0 ? 'width 1s linear' : 'width 0.2s linear'};\n left: 0;\n border-radius: 6px;\n }\n`;\n\nconst currentCardAnimation = {\n initial: { opacity: 1, scale: 1 },\n center: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.5 },\n};\n\nconst nextCardAnimations = {\n enter: {\n x: 528,\n opacity: 0,\n },\n center: {\n x: 0,\n opacity: 0.5,\n },\n exit: (width: number) => {\n return {\n x: -(width + 80),\n opacity: 1,\n };\n },\n};\n\nconst CardContent: FC<{\n card: any;\n counterHeight: number;\n counterWidth: number;\n counterMargin?: number;\n}> = ({ card: LandingCard, counterHeight, counterWidth, counterMargin }) => {\n const [card, setCard] = useState({ current: 0, next: 1 });\n const [counter, setCounter] = useState(0);\n let intervalId = useRef<any>();\n const browserTabVisible = usePageVisibility();\n\n const goNext = useCallback(() => {\n if (card.next === CARDS.length - 1) {\n setCard({ current: card.next, next: 0 });\n } else {\n setCard({ current: card.next, next: card.next + 1 });\n }\n }, [card.next]);\n\n useEffect(() => {\n intervalId.current = setTimeout(() => {\n if (browserTabVisible) {\n if (counter === 5) {\n setCounter(0);\n goNext();\n } else {\n setCounter(counter + 1);\n }\n }\n }, 1000);\n return () => {\n clearInterval(intervalId.current);\n };\n }, [goNext, counter, browserTabVisible]);\n\n const clearCounter = () => {\n clearInterval(intervalId.current);\n setCounter(0);\n };\n\n const cardWidth = useDynamicCardWidth();\n const cardHeight = useDynamicCardHeight();\n\n return (\n <StyledCardContent>\n <AnimatePresence initial={false} exitBeforeEnter>\n <StyledCard\n width={cardWidth}\n height={cardHeight}\n key={card.current}\n initial=\"initial\"\n animate=\"visible\"\n exit={{\n scale: [1, 0.2, 0.2, 0, 0],\n opacity: [1, 0.2, 0, 0, 0],\n }}\n variants={currentCardAnimation}\n transition={{\n duration: 1,\n }}\n >\n <LandingCard\n image={CARDS[card.current].image}\n description={CARDS[card.current].description}\n goNext={() => {\n clearCounter();\n goNext();\n }}\n />\n </StyledCard>\n </AnimatePresence>\n <AnimatePresence initial={false} custom={cardWidth}>\n <StyledNextCard\n width={cardWidth}\n height={cardHeight}\n margin={\n counterMargin\n ? isChrome() || isFirefox()\n ? 40\n : 20\n : isChrome() || isFirefox()\n ? 76\n : 38\n }\n key={card.next}\n custom={cardWidth}\n variants={nextCardAnimations}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{\n x: { type: 'spring', stiffness: 100, damping: 16 },\n duration: 0.2,\n }}\n >\n <LandingCard\n image={CARDS[card.next].image}\n description={CARDS[card.next].description}\n />\n </StyledNextCard>\n </AnimatePresence>\n <StyledCounter\n percentage={(counter / 5) * 100}\n width={counterWidth}\n height={counterHeight}\n margin={counterMargin}\n />\n </StyledCardContent>\n );\n};\n\nexport default CardContent;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport useWindowDimensions from '../../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../../theme/variables';\nimport RightArrow from '../../../../ui/icons/RightArrow';\n\nconst StyledCardContent = styled.div<{ image?: string }>`\n height: 100%;\n width: 100%;\n background-image: url(${props => props.image});\n background-size: 100%;\n background-repeat: no-repeat;\n display: flex;\n`;\n\nconst Info = styled.div`\n height: 310px;\n border-radius: 32px;\n align-self: flex-end;\n background: ${props => props.theme.Colors.white};\n padding: 64px;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst Description = styled.div<{ fontSize: number }>`\n font-size: ${props => props.fontSize}px;\n color: ${props => props.theme.Colors.black};\n margin-top: 8px;\n`;\n\nconst NextButton = styled.div<{ disabled?: boolean }>`\n height: 64px;\n width: 64px;\n border-radius: 50px;\n background: ${props => props.theme.Colors.whiteTwo};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n right: 16px;\n bottom: 16px;\n cursor: ${props => (props.disabled ? 'no-drop' : 'pointer')};\n user-select: none;\n &:active {\n ${props => !props.disabled && ' opacity: 0.7'};\n }\n`;\n\nconst StyledArrowIcon = styled(RightArrow)`\n height: 20px;\n width: 20px;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst LandingCard: FC<{\n image?: string;\n description: string;\n goNext?: () => void;\n}> = ({ image, description, goNext }) => {\n return (\n <StyledCardContent image={image}>\n <Info>\n <Description\n fontSize={\n useWindowDimensions().width < Variables.BreakPoints.mid\n ? 22\n : 28\n }\n >\n {description}\n </Description>\n <NextButton onClick={goNext} disabled={!goNext}>\n <StyledArrowIcon />\n </NextButton>\n </Info>\n </StyledCardContent>\n );\n};\n\nexport default LandingCard;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport authBackground from '../../../../assets/images/auth-background.png';\nimport authBackground2x from '../../../../assets/images/auth-background2x.png';\nimport authBackground3x from '../../../../assets/images/auth-background3x.png';\nimport { isAdminPortal } from '../../../../helpers/functions/general';\nimport PractisAdminPlatformLogo from '../../../../ui/icons/PractisAdminPlatformLogo';\nimport PractisLogo from '../../../../ui/icons/PractisLogo';\nimport CardContent from '../../Component/CardContent';\nimport LandingCard from './LandingCard';\n\nconst LeftContentContainer = styled.div`\n flex: 0 0 50%;\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n`;\n\nconst AuthBackground = styled.img`\n height: 90%;\n right: -10%;\n bottom: 0;\n position: absolute;\n`;\n\nconst StyledLogo = styled.div`\n height: 32px;\n width: 125px;\n color: ${props => props.theme.Colors.white};\n margin-top: 70px;\n margin-left: 73px;\n`;\n\nclass LeftPanel extends Component {\n render() {\n return (\n <LeftContentContainer>\n <AuthBackground\n src={authBackground}\n srcSet={`${authBackground2x} 2x, ${authBackground3x} 3x`}\n />\n <StyledLogo>\n {isAdminPortal() ?\n <PractisAdminPlatformLogo />\n :\n <PractisLogo />}\n </StyledLogo>\n <CardContent\n card={LandingCard}\n counterHeight={12}\n counterWidth={112}\n />\n </LeftContentContainer>\n );\n }\n}\n\nexport default LeftPanel;\n","import React, { FC } from 'react';\nimport { getCopyrightYear } from '../../../helpers/functions/date-convert';\n\nexport const Copyright: FC = () => {\n return (\n <>Copyright © {getCopyrightYear()} Practis, Inc. All Rights Reserved.</>\n );\n};\n\n","import React from 'react';\nimport styled from 'styled-components';\nimport ROUTES from '../../../../routes/routes';\nimport { useHistory } from 'react-router';\nimport { Button } from '../../../../ui/components/Button';\nimport { Copyright } from '../../../../ui/components/Copyright';\n\nconst RightContentContainer = styled.div`\n flex: 0 0 50%;\n background: ${props => props.theme.Colors.white};\n border-top-left-radius: 32px;\n border-bottom-left-radius: 32px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.5);\n z-index: 2;\n`;\n\nconst Header = styled.div`\n height: 104px;\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n padding: 0 64px;\n`;\n\nconst Body = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nconst Content = styled.div`\n width: 288px;\n padding: 16px;\n`;\n\nconst Title = styled.div`\n font-size: 56px;\n margin-bottom: 24px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.2;\n font-family: 'Merriweather';\n`;\n\nconst Description = styled.div`\n font-size: 20px;\n margin-bottom: 48px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.5;\n`;\n\nconst Footer = styled.div`\n height: 80px;\n font-size: 15px;\n padding: 0 56px;\n color: ${props => props.theme.Colors.black};\n text-align: right;\n`;\n\nconst RightPanel = () => {\n const history = useHistory();\n\n const handleLogin = () => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n };\n\n return (\n <RightContentContainer>\n <Header>\n <Button\n label=\"Log In\"\n action={handleLogin}\n width=\"128px\"\n height=\"48px\"\n />\n </Header>\n <Body>\n <Content>\n <Title>You need Practis.</Title>\n <Description>\n Practis is a system for large teams to learn, retain,\n and effectively articulate messaging on the front lines.\n </Description>\n </Content>\n </Body>\n <Footer><Copyright /></Footer>\n </RightContentContainer>\n );\n};\n\nexport default RightPanel;\n","import React from 'react';\nimport LeftPanel from './LeftPanel';\nimport RightPanel from './RightPanel';\n\nconst WebLandingPage = () => {\n return (\n <>\n <LeftPanel />\n <RightPanel />\n </>\n );\n};\n\nexport default WebLandingPage;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport RightArrow from '../../../../ui/icons/RightArrow';\n\n\nconst StyledCardContent = styled.div<{ image?: string }>`\n height: 100%;\n width: 100%;\n background-image: url(${props => props.image});\n background-size: 100%;\n background-repeat: no-repeat;\n display: flex;\n border-bottom-left-radius: 32px;\n border-bottom-right-radius: 32px;\n`;\n\nconst Info = styled.div`\n height: 144px;\n border-radius: 32px;\n align-self: flex-end;\n background: ${props => props.theme.Colors.white};\n padding: 32px;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst Description = styled.div`\n font-size: 17px;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst NextButton = styled.div<{ disabled?: boolean }>`\n height: 40px;\n width: 40px;\n border-radius: 50px;\n background: ${props => props.theme.Colors.whiteTwo};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n right: 16px;\n bottom: 16px;\n cursor: ${props => (props.disabled ? 'no-drop' : 'pointer')};\n user-select: none;\n &:active {\n ${props => !props.disabled && ' opacity: 0.7'};\n }\n`;\n\nconst StyledArrowIcon = styled(RightArrow)`\n height: 20px;\n width: 20px;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst LandingCard: FC<{\n image?: string;\n description: string;\n goNext?: () => void;\n}> = ({ image, description, goNext }) => {\n return (\n <StyledCardContent image={image}>\n <Info>\n <Description>{description}</Description>\n <NextButton onClick={goNext} disabled={!goNext}>\n <StyledArrowIcon />\n </NextButton>\n </Info>\n </StyledCardContent>\n );\n};\n\nexport default LandingCard;\n","import React from 'react';\nimport styled from 'styled-components';\nimport authBackground from '../../../../assets/images/auth-background.png';\nimport authBackground2x from '../../../../assets/images/auth-background2x.png';\nimport authBackground3x from '../../../../assets/images/auth-background3x.png';\nimport ROUTES from '../../../../routes/routes';\nimport { useHistory } from 'react-router';\nimport LandingCard from './LandingCard';\nimport CardContent from '../../Component/CardContent';\nimport LinkText from '../../../../ui/components/LinkText/link-text';\nimport PractisLogo from '../../../../ui/icons/PractisLogo';\nimport { isAdminPortal } from '../../../../helpers/functions/general';\nimport PractisAdminPlatformLogo from '../../../../ui/icons/PractisAdminPlatformLogo';\n\nconst LeftContentContainer = styled.div`\n flex: 3;\n position: relative;\n display: flex;\n flex-direction: column;\n`;\n\nconst AuthBackground = styled.img`\n height: 90%;\n right: 0;\n bottom: 0;\n position: absolute;\n`;\n\nconst StyledHeader = styled.div`\n height: 72px;\n`;\n\nconst StyledHeaderContent = styled.div`\n padding: 24px;\n display: flex;\n justify-content: space-between;\n`;\n\nconst StyledLogo = styled.div`\n height: 24px;\n width: 94px;\n color: ${props => props.theme.Colors.white};\n`;\n\nconst StyledLinkText = styled(LinkText)`\n font-size: 13px;\n font-weight: bold;\n`;\n\nconst LeftPanel = () => {\n const history = useHistory();\n\n const handleLogin = () => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n };\n\n return (\n <LeftContentContainer>\n <AuthBackground\n src={authBackground}\n srcSet={`${authBackground2x} 2x, ${authBackground3x} 3x`}\n />\n <StyledHeader>\n <StyledHeaderContent>\n <StyledLogo>\n {isAdminPortal() ?\n <PractisAdminPlatformLogo />\n :\n <PractisLogo />}\n </StyledLogo>\n <StyledLinkText onClick={handleLogin}>\n Log In\n </StyledLinkText>\n </StyledHeaderContent>\n </StyledHeader>\n <CardContent\n card={LandingCard}\n counterHeight={8}\n counterWidth={64}\n counterMargin={16}\n />\n </LeftContentContainer>\n );\n};\n\nexport default LeftPanel;\n","import styled from 'styled-components';\nimport { Copyright } from '../../../../ui/components/Copyright';\n\n\nconst RightContentContainer = styled.div`\n flex: 2;\n background: ${props => props.theme.Colors.white};\n border-top-left-radius: 32px;\n border-top-right-radius: 32px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.5);\n z-index: 2;\n`;\n\nconst Body = styled.div`\n display: flex;\n flex: 1;\n`;\n\nconst Content = styled.div`\n padding: 40px 40px 0 40px;\n margin-bottom: 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst Title = styled.div`\n font-size: 24px;\n margin-bottom: 16px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.2;\n font-family: 'Merriweather';\n text-align: center;\n`;\n\nconst Description = styled.div`\n font-size: 13px;\n font-weight: 300;\n margin-bottom: 24px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.5;\n text-align: center;\n`;\n\n\nconst Footer = styled.div`\n font-size: 11px;\n font-weight: 300;\n color: ${props => props.theme.Colors.black};\n align-items: flex-end;\n display: flex;\n justify-content: center;\n padding-bottom: 16px;\n`;\n\nconst RightPanel = () => {\n return (\n <RightContentContainer>\n <Body>\n <Content>\n <Title>You need Practis.</Title>\n <Description>\n Practis is a system for large teams to learn, retain,\n and effectively articulate messaging on the front lines.\n </Description>\n </Content>\n </Body>\n <Footer><Copyright /></Footer>\n </RightContentContainer>\n );\n};\n\nexport default RightPanel;\n","import React from 'react';\nimport LeftPanel from './LeftPanel';\nimport RightPanel from './RightPanel';\n\nconst MobileLandingPage = () => {\n return (\n <>\n <LeftPanel />\n <RightPanel />\n </>\n );\n};\n\nexport default MobileLandingPage;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport RightArrow from '../../../../ui/icons/RightArrow';\n\n\nconst StyledCardContent = styled.div<{ image?: string }>`\n height: 100%;\n width: 100%;\n background-image: url(${props => props.image});\n background-size: 100%;\n background-repeat: no-repeat;\n display: flex;\n`;\n\nconst Info = styled.div`\n height: 240px;\n border-radius: 32px;\n align-self: flex-end;\n background: ${props => props.theme.Colors.white};\n padding: 37px;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst Description = styled.div`\n font-size: 24px;\n color: ${props => props.theme.Colors.black};\n margin-top: 8px;\n`;\n\nconst NextButton = styled.div<{ disabled?: boolean }>`\n height: 43px;\n width: 43px;\n border-radius: 50px;\n background: ${props => props.theme.Colors.whiteTwo};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n right: 16px;\n bottom: 16px;\n cursor: ${props => (props.disabled ? 'no-drop' : 'pointer')};\n user-select: none;\n &:active {\n ${props => !props.disabled && ' opacity: 0.7'};\n }\n`;\n\nconst StyledArrowIcon = styled(RightArrow)`\n height: 20px;\n width: 20px;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst LandingCard: FC<{\n image?: string;\n description: string;\n goNext?: () => void;\n}> = ({ image, description, goNext }) => {\n return (\n <StyledCardContent image={image}>\n <Info>\n <Description>{description}</Description>\n <NextButton onClick={goNext} disabled={!goNext}>\n <StyledArrowIcon />\n </NextButton>\n </Info>\n </StyledCardContent>\n );\n};\n\nexport default LandingCard;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport authBackground from '../../../../assets/images/auth-background.png';\nimport authBackground2x from '../../../../assets/images/auth-background2x.png';\nimport authBackground3x from '../../../../assets/images/auth-background3x.png';\nimport { isAdminPortal } from '../../../../helpers/functions/general';\nimport PractisAdminPlatformLogo from '../../../../ui/icons/PractisAdminPlatformLogo';\nimport PractisLogo from '../../../../ui/icons/PractisLogo';\nimport CardContent from '../../Component/CardContent';\nimport LandingCard from './LandingCard';\n\nconst LeftContentContainer = styled.div`\n flex: 0 0 50%;\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n`;\n\nconst AuthBackground = styled.img`\n height: 90%;\n right: -10%;\n bottom: 0;\n position: absolute;\n`;\n\nconst StyledHeader = styled.div``;\n\nconst StyledHeaderContent = styled.div`\n padding: 52px 48px 16px 48px;\n display: flex;\n justify-content: space-between;\n`;\n\nconst StyledLogo = styled.div`\n height: 24px;\n width: 93px;\n color: ${props => props.theme.Colors.white};\n`;\n\nclass LeftPanel extends Component {\n render() {\n return (\n <LeftContentContainer>\n <AuthBackground\n src={authBackground}\n srcSet={`${authBackground2x} 2x, ${authBackground3x} 3x`}\n />\n <StyledHeader>\n <StyledHeaderContent>\n <StyledLogo>\n {isAdminPortal() ?\n <PractisAdminPlatformLogo />\n :\n <PractisLogo />}\n </StyledLogo>\n </StyledHeaderContent>\n </StyledHeader>\n <CardContent\n card={LandingCard}\n counterWidth={80}\n counterHeight={8}\n />\n </LeftContentContainer>\n );\n }\n}\n\nexport default LeftPanel;\n","import React from 'react';\nimport styled from 'styled-components';\nimport ROUTES from '../../../../routes/routes';\nimport { useHistory } from 'react-router';\nimport { Button } from '../../../../ui/components/Button';\nimport { Copyright } from '../../../../ui/components/Copyright';\n\nconst RightContentContainer = styled.div`\n flex: 0 0 50%;\n background: ${props => props.theme.Colors.white};\n border-top-left-radius: 32px;\n border-bottom-left-radius: 32px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 0 50px 0 rgba(0, 0, 0, 0.5);\n z-index: 2;\n`;\n\nconst Header = styled.div`\n height: 104px;\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n padding: 0 64px;\n`;\n\nconst Body = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nconst Content = styled.div`\n width: 208px;\n padding: 16px;\n`;\n\nconst Title = styled.div`\n font-size: 40px;\n margin-bottom: 24px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.2;\n font-family: 'Merriweather';\n`;\n\nconst Description = styled.div`\n font-size: 15px;\n font-weight: 300;\n margin-bottom: 48px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.5;\n`;\n\nconst Footer = styled.div`\n height: 64px;\n font-size: 13px;\n font-weight: 300;\n padding: 0 24px;\n color: ${props => props.theme.Colors.black};\n text-align: right;\n`;\n\nconst RightPanel = () => {\n const history = useHistory();\n\n const handleLogin = () => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n };\n\n return (\n <RightContentContainer>\n <Header>\n <Button\n label=\"Log In\"\n action={handleLogin}\n width=\"128px\"\n height=\"48px\"\n />\n </Header>\n <Body>\n <Content>\n <Title>You need Practis.</Title>\n <Description>\n Practis is a system for large teams to learn, retain,\n and effectively articulate messaging on the front lines.\n </Description>\n </Content>\n </Body>\n <Footer><Copyright /></Footer>\n </RightContentContainer>\n );\n};\n\nexport default RightPanel;\n","import React from 'react';\nimport LeftPanel from './LeftPanel';\nimport RightPanel from './RightPanel';\n\nconst TabletLandingPage = () => {\n return (\n <>\n <LeftPanel />\n <RightPanel />\n </>\n );\n};\n\nexport default TabletLandingPage;\n","import React from 'react';\nimport styled from 'styled-components';\nimport WebLandingPage from './platforms/web';\nimport MobileLandingPage from './platforms/mobile';\nimport TabletLandingPage from './platforms/tablet';\nimport { Platform, useGetPlatform } from './configs';\n\nconst LandingPageContainer = styled.div<{ isMobile: boolean }>`\n display: flex;\n justify-content: center;\n background: ${props => props.theme.Colors.dark};\n height: 100vh;\n min-height: 700px;\n flex-direction: ${props => (props.isMobile ? 'column' : 'row')};\n`;\n\nconst LandingPage = () => {\n const platform = useGetPlatform();\n const isMobile = platform === Platform.MOBILE;\n let content = <WebLandingPage />;\n\n switch (platform) {\n case Platform.DESKTOP:\n content = <WebLandingPage />;\n break;\n case Platform.LAPTOP:\n content = <WebLandingPage />;\n break;\n case Platform.TABLET:\n content = <TabletLandingPage />;\n break;\n case Platform.MOBILE:\n content = <MobileLandingPage />;\n break;\n default:\n content = <WebLandingPage />;\n }\n return (\n <LandingPageContainer isMobile={isMobile}>\n {content}\n </LandingPageContainer>\n );\n};\n\nexport default LandingPage;\n","import { ErrorResult } from '../../../constants/interfaces/ErrorResult';\r\nimport {\r\n handleMessage,\r\n useShowMessage,\r\n} from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useCallback } from 'react';\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport {\r\n modifyTeamName,\r\n resetSingleTeamPage,\r\n searchSingleTeamAllUsersFailure,\r\n searchSingleTeamAllUsersStart,\r\n searchSingleTeamAllUsersSuccess,\r\n searchSingleTeamFailure,\r\n searchSingleTeamMembersFailure,\r\n searchSingleTeamMembersStart,\r\n searchSingleTeamMembersSuccess,\r\n searchSingleTeamStart,\r\n searchSingleTeamSuccess,\r\n searchTeamPractisSetsFailure,\r\n searchTeamPractisSetsStart,\r\n searchTeamPractisSetsSuccess,\r\n updateAllSelectedTeamPractisSetsState,\r\n updateAllSelectedTeamsState,\r\n updateSelectedTeamPractisSetState,\r\n updateSelectedTeamState,\r\n createSingleTeamSuccess,\r\n updateSingleTeamFailure,\r\n updateSingleTeamStart,\r\n updateSingleTeamSuccess,\r\n updateTeamActionFailure,\r\n updateTeamActionStart,\r\n fetchAllTeamsStart,\r\n fetchAllTeamsFailure,\r\n fetchAllTeamsSuccess,\r\n updateTeamActionSuccess,\r\n checkAllProgress,\r\n checkSingleProgress,\r\n clearLabelFilterAction,\r\n getPractisSetFailure,\r\n getPractisSetReportFailure,\r\n getPractisSetReportStart,\r\n getPractisSetReportSuccess,\r\n getPractisSetStart,\r\n getPractisSetSuccess,\r\n resetPractisSetReport,\r\n saveSelectedInvitationLabels,\r\n searchInvitationUsersFailure,\r\n searchInvitationUsersStart,\r\n searchInvitationUsersSuccess,\r\n searchPractisUsersFailure,\r\n searchPractisUsersStart,\r\n searchPractisUsersSuccess,\r\n searchTrainerFailure,\r\n searchTrainerStart,\r\n searchTrainerSuccess,\r\n sendTraineeInvitationFailure,\r\n sendTraineeInvitationStart,\r\n sendTraineeInvitationSuccess,\r\n setLabelFilterAction,\r\n toggleCollapseLabelFieldAction,\r\n updateAllSelectedInvitationTraineesState,\r\n updateAllSelectedPractisSetsState,\r\n updatedProgressActionSuccess,\r\n updateSelectedInvitationTraineesState,\r\n updateSelectedPractisSetState,\r\n searchTeamMembersStartAction,\r\n searchTeamMembersSuccessAction,\r\n searchTeamMembersFailureAction,\r\n updateMemberActionSuccess,\r\n setDeletedLabelsToSingleTeam,\r\n setAssignedLabelsToSingleTeam,\r\n searchTeamLeadersStartAction,\r\n searchTeamLeadersSuccessAction,\r\n searchTeamLeadersFailureAction,\r\n selectTeamLeaderAction,\r\n selectMultipleTeamLeaderAction,\r\n saveTeamLeaderSelection,\r\n resetTeamLeadersSelectionAction,\r\n getTeamInfoStart,\r\n getTeamInfoSuccess,\r\n getTeamInfoFailure,\r\n getTeamInfoTrainingStart,\r\n getTeamInfoTrainingSuccess,\r\n getTeamInfoTrainingFailure,\r\n resetTeamInfo,\r\n deselectAllTeamLeadersSelectionAction,\r\n resetPractisSetDetails,\r\n removeSingleTeamAllUsersLabel,\r\n removeSingleTeamMemberLabel,\r\n updateTeamLead,\r\n clearTrainerPractisSet,\r\n} from './actions';\r\nimport {\r\n useDeleteTeamsApi,\r\n useGetSingleTeamApi,\r\n useCreateNewTeamApi,\r\n useUpdateTeamNameApi,\r\n useSearchTeamsApi,\r\n useGetPractisSetsReportApi,\r\n useMarkTeamAsViewedApi,\r\n useSearchTeamMembersApi,\r\n useGetMembersReportApi,\r\n useSearchTeamLeadersApi,\r\n useSearchTrainingPractisSetsApi,\r\n useSearchPractisSetDetailsUsersApi,\r\n useNudgeUsersApi,\r\n useDeleteUserLabelsApi,\r\n useDeletePractisSetLabelsApi,\r\n useUpdateTeamLeaderApi,\r\n useDeleteLabelsFromTeamsApi,\r\n useGetEnrollmentsReportApi,\r\n useEnrollPractisSetsToUserApi,\r\n useRemindToStartApi,\r\n useSearchUsersApi,\r\n useDeleteEnrollmentsApi,\r\n useGetEnrollmentApi,\r\n useGetEnrollmentProgressApi,\r\n useGetEnrollmentDailyTrainingApi,\r\n} from '../../../api';\r\nimport { EnrollmentType } from '../../../api/enrollments/types';\r\nimport { Team, TeamV2 } from '../../../constants/interfaces/Team';\r\nimport { setAssignLabelsAction } from '../../labels/store/actions';\r\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\r\nimport { fileDownload } from '../../../helpers/functions/file-download';\r\nimport { Dispatch } from 'redux';\r\nimport { ThunkContext } from '../../../tools/thunk/ThunkContext';\r\nimport {\r\n ListResult,\r\n PaginationResult,\r\n} from '../../../constants/interfaces/PaginationResult';\r\nimport { useGetPractisSetApi } from '../../../api';\r\nimport { SEARCH_STATE } from '../../searchState/constants';\r\nimport {\r\n setSearchState,\r\n setSecondarySearchState,\r\n} from '../../searchState/store/actions';\r\nimport {\r\n SearchTrainingPractisSetsParams,\r\n ReportTrainingPractisSetsParams,\r\n ReportMembersParams,\r\n SearchTeamParams,\r\n} from '../../../api/teams/types';\r\nimport { usePortableLabelsState } from '../../portableLabels/store/states';\r\nimport { findAllChildIds } from '../../../helpers/functions/tree-helpers';\r\nimport {\r\n createSearchTeamMembersParams,\r\n createSearchTeamsParams,\r\n createSearchPractisSetDetailsParams,\r\n} from '../tools';\r\nimport { CLIENT_SIDE_ERROR_MESSAGE } from '../../../ui/components/ErrorMessages/constants';\r\nimport {\r\n EnrollmentDailyTraining,\r\n EnrollmentInterface,\r\n EnrollmentProgress,\r\n Enrollments,\r\n} from '../../../constants/interfaces/Enrollments';\r\nimport { getSearchSortingValue } from '../../../helpers/functions/search-params-helpers';\r\nimport { NudgeData, RemindToStartEnrollment } from '../../../api/alert/types';\r\nimport { ENROLLMENT_REMIND_TO_START } from '../../../api/alert/constants';\r\nimport { SearchUsersParams } from '../../../api/users/types';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { UserStatus } from '../../users/store/costants';\r\n\r\nconst uuid = require('uuid/v1');\r\n\r\nexport const useGetTeamInfoService = () => {\r\n const dispatch = useDispatch();\r\n const getSingleTeam = useGetSingleTeamApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (draftId: number) => {\r\n dispatch(getTeamInfoStart());\r\n getSingleTeam(draftId)\r\n .then(data => {\r\n dispatch(getTeamInfoSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getTeamInfoFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, getSingleTeam, showMessage]\r\n );\r\n};\r\n\r\nexport const useResetTeamInfoService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetTeamInfo());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useGetTeamInfoTrainingService = () => {\r\n const dispatch = useDispatch();\r\n const getSingleTeam = useGetSingleTeamApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (draftId: number) => {\r\n dispatch(getTeamInfoTrainingStart());\r\n getSingleTeam(draftId)\r\n .then(data => {\r\n dispatch(getTeamInfoTrainingSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getTeamInfoTrainingFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, getSingleTeam, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetSingleTeamService = () => {\r\n const dispatch = useDispatch();\r\n const getSingleTeam = useGetSingleTeamApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (draftId: number) => {\r\n dispatch(searchSingleTeamStart());\r\n getSingleTeam(draftId)\r\n .then(data => {\r\n dispatch(searchSingleTeamSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchSingleTeamFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, getSingleTeam, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchTeamsAllUsersService = () => {\r\n const dispatch = useDispatch();\r\n const searchTeamsAllUsers = useSearchUsersApi();\r\n const profile = useSelector(getProfileState);\r\n const showMessage = useShowMessage();\r\n\r\n return useCallback(\r\n (searchParams: SearchParams, isRefreshed?: boolean) => {\r\n if (!profile?.companyId) return;\r\n const searchAllUsersParams: SearchUsersParams = {\r\n status:\r\n searchParams.filters?.reduce((statuses, filter) => {\r\n if (filter.field === 'status') {\r\n statuses = String(filter.value);\r\n }\r\n\r\n return statuses;\r\n }, '') || `${UserStatus.ACTIVE},${UserStatus.PENDING}`,\r\n labels: searchParams.labelIDs?.join(','),\r\n roles: searchParams.roleIDs?.join(','),\r\n teams: searchParams.teamIds?.join(','),\r\n companies: profile?.companyId?.toString(),\r\n limit: searchParams.limit ?? 20,\r\n offset: searchParams.offset,\r\n query: searchParams.searchTerm,\r\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\r\n excludeTeamId: searchParams.teamId?.toString(),\r\n };\r\n dispatch(searchSingleTeamAllUsersStart());\r\n searchTeamsAllUsers(searchAllUsersParams)\r\n .then(data => {\r\n dispatch(\r\n searchSingleTeamAllUsersSuccess(\r\n data,\r\n searchParams.offset,\r\n isRefreshed\r\n )\r\n );\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchSingleTeamAllUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, profile?.companyId, searchTeamsAllUsers, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchSingleTeamMembersService = (teamId: number | string) => {\r\n const dispatch = useDispatch();\r\n const searchTeamMembersApi = useSearchTeamMembersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp: SearchParams, isRefreshed?: boolean) => {\r\n dispatch(searchSingleTeamMembersStart());\r\n searchTeamMembersApi(teamId, createSearchTeamMembersParams(sp))\r\n .then(data => {\r\n dispatch(\r\n searchSingleTeamMembersSuccess(\r\n data,\r\n sp.offset,\r\n isRefreshed\r\n )\r\n );\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchSingleTeamMembersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, searchTeamMembersApi, teamId, showMessage]\r\n );\r\n};\r\n\r\nexport const useTogglePromoteTeamLeader = () => {\r\n const updateTeamLeaderApi = useUpdateTeamLeaderApi();\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (teamUserId: number, isTeamLead: boolean) => {\r\n dispatch(updateSingleTeamStart());\r\n updateTeamLeaderApi(teamUserId, isTeamLead)\r\n .then(() => {\r\n dispatch(updateTeamLead(teamUserId, isTeamLead));\r\n dispatch(updateSingleTeamSuccess());\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateSingleTeamFailure(error.message));\r\n });\r\n },\r\n [dispatch, updateTeamLeaderApi]\r\n );\r\n};\r\n\r\nexport const useSetAssignedLabelsToSingleTeam = () => {\r\n const dispatch = useDispatch();\r\n const showMessage = useShowMessage();\r\n\r\n return useCallback(\r\n (labelIDs: number[]) => {\r\n dispatch(setAssignedLabelsToSingleTeam(labelIDs));\r\n showMessage('Labels have been assigned to the team', 'success');\r\n },\r\n [dispatch, showMessage]\r\n );\r\n};\r\n\r\nexport const useSetDeletedLabelsToSingleTeam = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelIDs: number[]) => {\r\n dispatch(setDeletedLabelsToSingleTeam(labelIDs));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useResetSingleTeamPageService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetSingleTeamPage());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useCreateNewTeamService = () => {\r\n const dispatch = useDispatch();\r\n const createNewTeamApi = useCreateNewTeamApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (name: string): Promise<TeamV2> => {\r\n return createNewTeamApi(name)\r\n .then(data => {\r\n dispatch(createSingleTeamSuccess(data));\r\n showMessage('New team has been created', 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, createNewTeamApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @description updates team name\r\n * @function useUpdateTeamNameService\r\n * @param { string | number } teamId\r\n * @param { string } name\r\n * @returns { Promise }\r\n */\r\nexport const useUpdateTeamNameService = (teamId: string | number) => {\r\n const dispatch = useDispatch();\r\n const updateTeamNameApi = useUpdateTeamNameApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (name: string): Promise<void> => {\r\n dispatch(updateSingleTeamStart());\r\n return updateTeamNameApi(teamId, name)\r\n .then(() => {\r\n dispatch(updateSingleTeamSuccess({ id: Number(teamId) }));\r\n dispatch(modifyTeamName(name));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateSingleTeamFailure(error.message));\r\n error.message &&\r\n showMessage(\r\n CLIENT_SIDE_ERROR_MESSAGE[error.message],\r\n 'error'\r\n );\r\n throw error;\r\n });\r\n },\r\n [teamId, dispatch, updateTeamNameApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchTeamsService = (storeSearchParams: boolean = false) => {\r\n const dispatch = useDispatch();\r\n const searchTeamsApi = useSearchTeamsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (p: SearchParams) => {\r\n dispatch(fetchAllTeamsStart());\r\n const params: SearchTeamParams = createSearchTeamsParams(p);\r\n\r\n searchTeamsApi(params)\r\n .then(data => {\r\n if (storeSearchParams) {\r\n dispatch(\r\n setSecondarySearchState(SEARCH_STATE.TEAMS.name, p)\r\n );\r\n }\r\n dispatch(fetchAllTeamsSuccess(data));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(fetchAllTeamsFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, searchTeamsApi, showMessage, storeSearchParams]\r\n );\r\n};\r\n\r\nexport const searchTeamPractisSets = (sp: SearchParams) => {\r\n return (dispatch: Dispatch<any>, getState: any, context: ThunkContext) => {\r\n dispatch(searchTeamPractisSetsStart());\r\n return context.http\r\n .post('teams/practisSets/search', sp)\r\n .then((data: PaginationResult<PractisSets>) => {\r\n dispatch(searchTeamPractisSetsSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchTeamPractisSetsFailure(error.message));\r\n handleMessage(dispatch, error.message, 'error');\r\n return 'error';\r\n });\r\n };\r\n};\r\n\r\n/**\r\n * @description deletes team member label including children labels\r\n * @function useDeleteMemberLabelService\r\n * @param { string | number } teamId\r\n * @param { number } userId\r\n * @param { number } labelId\r\n * @returns { void }\r\n */\r\nexport const useDeleteMemberLabelService = (teamId: string | number) => {\r\n const dispatch = useDispatch();\r\n const deleteUserLabelsApi = useDeleteUserLabelsApi();\r\n const showMessage = useShowMessage();\r\n const labels = usePortableLabelsState();\r\n return useCallback(\r\n (userId: number, labelId: number) => {\r\n const payload: { userId: number; labelId: number }[] = [\r\n { userId, labelId },\r\n ];\r\n const children: any[] = [];\r\n findAllChildIds(labels.data.items, labelId, children);\r\n if (children.length > 0)\r\n children.forEach(item =>\r\n payload.push({ userId, labelId: item.id })\r\n );\r\n return deleteUserLabelsApi(payload)\r\n .then(() => {\r\n dispatch(\r\n updateMemberActionSuccess(\r\n { id: teamId } as Team,\r\n 'labels'\r\n )\r\n );\r\n showMessage('Label removed successfully', 'success');\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [teamId, labels, showMessage, deleteUserLabelsApi, dispatch]\r\n );\r\n};\r\n\r\n/**\r\n * @description deletes a label of user who can be assigned to a team\r\n * @function useDeleteSingleTeamAllUsersLabelService\r\n * @param { string | number } teamId\r\n * @param { number } userId\r\n * @param { number } labelId\r\n * @returns { void }\r\n */\r\nexport const useDeleteSingleTeamAllUsersLabelService = (\r\n teamId: string | number\r\n) => {\r\n const dispatch = useDispatch();\r\n const deleteMemberLabelService = useDeleteMemberLabelService(teamId);\r\n return useCallback(\r\n (userId: number, labelId: number) => {\r\n dispatch(updateSingleTeamStart());\r\n deleteMemberLabelService(userId, labelId)\r\n .then(() => {\r\n dispatch(removeSingleTeamAllUsersLabel(userId, labelId));\r\n dispatch(updateSingleTeamSuccess());\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateSingleTeamFailure(error.message));\r\n });\r\n },\r\n [dispatch, deleteMemberLabelService]\r\n );\r\n};\r\n\r\n/**\r\n * @description deletes a label of a team member\r\n * @function useDeleteSingleTeamMemberLabelService\r\n * @param { string | number } teamId\r\n * @param { number } userId\r\n * @param { number } labelId\r\n * @returns { void }\r\n */\r\nexport const useDeleteSingleTeamMemberLabelService = (\r\n teamId: string | number\r\n) => {\r\n const dispatch = useDispatch();\r\n const deleteMemberLabelService = useDeleteMemberLabelService(teamId);\r\n return useCallback(\r\n (userId: number, labelId: number) => {\r\n dispatch(updateSingleTeamStart());\r\n deleteMemberLabelService(userId, labelId)\r\n .then(() => {\r\n dispatch(removeSingleTeamMemberLabel(userId, labelId));\r\n dispatch(updateSingleTeamSuccess());\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateSingleTeamFailure(error.message));\r\n });\r\n },\r\n [dispatch, deleteMemberLabelService]\r\n );\r\n};\r\n\r\nexport const useDeleteLabelFromTeamService = () => {\r\n const dispatch = useDispatch();\r\n const deleteLabelFromTeamApi = useDeleteLabelsFromTeamsApi();\r\n const showMessage = useShowMessage();\r\n\r\n return useCallback(\r\n (teamRemovedLabels, teamId) => {\r\n deleteLabelFromTeamApi(teamRemovedLabels)\r\n .then(() => {\r\n dispatch(\r\n updateTeamActionSuccess(\r\n { id: teamId } as Team,\r\n 'labels'\r\n )\r\n );\r\n showMessage(`Label removed successfully`, 'success');\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [showMessage, deleteLabelFromTeamApi, dispatch]\r\n );\r\n};\r\n\r\nexport const useSetAssignLabelsActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labels: number[]) => {\r\n dispatch(setAssignLabelsAction(labels));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateAllSelectedTeamsStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (teamIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(updateAllSelectedTeamsState(teamIds, checked, partial));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateSelectedTeamStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (teamId: number) => {\r\n dispatch(updateSelectedTeamState(teamId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateAllTeamSelectedPractisSetsStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (setIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllSelectedTeamPractisSetsState(setIds, checked, partial)\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateTeamSelectedPractisSetStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (setId: number) => {\r\n dispatch(updateSelectedTeamPractisSetState(setId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\n\r\nexport const useDeleteTeamsService = () => {\r\n const dispatch = useDispatch();\r\n const deleteTeamsApi = useDeleteTeamsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (teamIds: number, successCallback?: () => void) => {\r\n dispatch(updateTeamActionStart());\r\n return deleteTeamsApi([teamIds])\r\n .then((data: any) => {\r\n dispatch(updateTeamActionSuccess({ id: uuid() }, 'delete'));\r\n\r\n showMessage('Team has been deleted', 'success');\r\n successCallback?.();\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateTeamActionFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, deleteTeamsApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSearchTrainingPractisSets = (teamId: string) => {\r\n const dispatch = useDispatch();\r\n const searchTrainingPractisSets = useSearchTrainingPractisSetsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp: SearchParams) => {\r\n dispatch(searchTrainerStart());\r\n const overdueFilter = sp.filters?.find(\r\n f => f.field === 'hasOverdue'\r\n );\r\n const params: SearchTrainingPractisSetsParams = {\r\n enrollmentStatus: sp.filterByStatus?.join(','),\r\n isOverdue: overdueFilter?.value ? true : undefined,\r\n labels: sp.labelIDs?.join(','),\r\n limit: sp.limit ?? 20,\r\n offset: sp.offset ?? 0,\r\n query: sp.searchTerm,\r\n sort: getSearchSortingValue(sp.orderBy, 'name', true),\r\n };\r\n return searchTrainingPractisSets(teamId, params)\r\n .then((data: any) => {\r\n dispatch(\r\n setSearchState(\r\n SEARCH_STATE.TRAINING.name,\r\n SEARCH_STATE.TRAINING.childrenKeys,\r\n sp\r\n )\r\n );\r\n dispatch(searchTrainerSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchTrainerFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return 'error';\r\n });\r\n },\r\n [dispatch, searchTrainingPractisSets, showMessage, teamId]\r\n );\r\n};\r\n\r\n\r\nexport const useClearTrainerPractisSet = () => {\r\n const dispatch = useDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(clearTrainerPractisSet());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSearchPractisSetDetailsUsersService = (\r\n teamId: string,\r\n practisSetId: any\r\n) => {\r\n const dispatch = useDispatch();\r\n const searchPractisSetDetailsUsers = useSearchPractisSetDetailsUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp: SearchParams) => {\r\n const params = createSearchPractisSetDetailsParams(sp);\r\n dispatch(searchPractisUsersStart());\r\n return searchPractisSetDetailsUsers(teamId, practisSetId, params)\r\n .then((data: PaginationResult<EnrollmentInterface>) => {\r\n dispatch(\r\n setSearchState(\r\n SEARCH_STATE.PRACTIS_SET_DETAILS.name,\r\n SEARCH_STATE.PRACTIS_SET_DETAILS.childrenKeys,\r\n sp\r\n )\r\n );\r\n dispatch(searchPractisUsersSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchPractisUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return 'error';\r\n });\r\n },\r\n [\r\n dispatch,\r\n practisSetId,\r\n searchPractisSetDetailsUsers,\r\n showMessage,\r\n teamId,\r\n ]\r\n );\r\n};\r\n\r\nexport const getAssignUsersSearchParams = (searchParams: SearchParams) => {\r\n const hasRegStatusesFilter = searchParams.filterByRegistrationStatus && searchParams.filterByRegistrationStatus.length;\r\n return {\r\n status: (hasRegStatusesFilter ? <string[]>searchParams.filterByRegistrationStatus : [UserStatus.ACTIVE, UserStatus.PENDING]).join(','),\r\n labels: searchParams.labelIDs?.join(','),\r\n teams: searchParams.teamId?.toString(),\r\n limit: searchParams.limit ?? 20,\r\n offset: searchParams.offset ?? 0,\r\n query: searchParams.searchTerm,\r\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\r\n excludePSets: searchParams.practisSetId?.toString(),\r\n companies: searchParams.companyId?.toString(),\r\n } as SearchUsersParams;\r\n};\r\n\r\nexport const useSearchAssignUsersService = () => {\r\n const dispatch = useDispatch();\r\n const showMessage = useShowMessage();\r\n const searchAssignUsers = useSearchUsersApi();\r\n\r\n return useCallback(\r\n (searchParams: SearchParams, isRefreshed?: boolean) => {\r\n dispatch(searchInvitationUsersStart());\r\n const params = getAssignUsersSearchParams(searchParams);\r\n return searchAssignUsers(params)\r\n .then(data => {\r\n dispatch(\r\n searchInvitationUsersSuccess(\r\n data,\r\n params.offset,\r\n isRefreshed\r\n )\r\n );\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchInvitationUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, searchAssignUsers, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetPractisSetService = () => {\r\n const dispatch = useDispatch();\r\n const getPractisSet = useGetPractisSetApi();\r\n return useCallback(\r\n (practisSetId: number) => {\r\n dispatch(getPractisSetStart());\r\n return getPractisSet(practisSetId)\r\n .then(data => {\r\n dispatch(getPractisSetSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getPractisSetFailure(error.message));\r\n throw error;\r\n });\r\n },\r\n [dispatch, getPractisSet]\r\n );\r\n};\r\n\r\nexport const useResetPractisSetDetailsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetPractisSetDetails());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useEnrollPractisSetsToUsersService = () => {\r\n const createInvitationApi = useEnrollPractisSetsToUserApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n async (enrollments: EnrollmentType[]) => {\r\n try {\r\n await createInvitationApi(enrollments);\r\n } catch (error: any) {\r\n showMessage(error?.message, 'error');\r\n throw error;\r\n }\r\n showMessage(\r\n `${enrollments.length} Users ${\r\n enrollments.length > 1 ? 'have' : 'has'\r\n } been assigned`,\r\n 'success'\r\n );\r\n },\r\n [createInvitationApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useRemindToStartService = () => {\r\n const dispatch = useDispatch();\r\n const remindToStart = useRemindToStartApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (enrollmentIds: number[]) => {\r\n dispatch(sendTraineeInvitationStart());\r\n\r\n const enrollments = enrollmentIds.map(\r\n enrollmentId =>\r\n ({\r\n enrollmentId,\r\n type: ENROLLMENT_REMIND_TO_START,\r\n } as RemindToStartEnrollment)\r\n );\r\n\r\n return remindToStart(enrollments)\r\n .then(data => {\r\n if (enrollments.length === 1) {\r\n dispatch(\r\n sendTraineeInvitationSuccess(\r\n enrollments as unknown as Enrollments,\r\n 'reInvite'\r\n )\r\n );\r\n showMessage(`Reminder Sent to User`, 'success');\r\n }\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(sendTraineeInvitationFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, remindToStart, showMessage]\r\n );\r\n};\r\n\r\nexport const usePractisSetReportService = () => {\r\n const dispatch = useDispatch();\r\n const getEnrollmentApi = useGetEnrollmentApi();\r\n const getEnrollmentProgressApi = useGetEnrollmentProgressApi();\r\n const getEnrollmentDailyTrainingApi = useGetEnrollmentDailyTrainingApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (enrollmentId: number) => {\r\n dispatch(getPractisSetReportStart());\r\n return Promise.all([\r\n getEnrollmentApi(enrollmentId),\r\n getEnrollmentProgressApi(enrollmentId),\r\n getEnrollmentDailyTrainingApi(enrollmentId),\r\n ])\r\n .then(data => {\r\n const enrollment = data[0] as EnrollmentInterface;\r\n const progress = data[1] as ListResult<EnrollmentProgress>;\r\n const dailyTraining = data[2] as EnrollmentDailyTraining[];\r\n dispatch(\r\n getPractisSetReportSuccess(\r\n enrollment,\r\n progress,\r\n dailyTraining\r\n )\r\n );\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getPractisSetReportFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [\r\n dispatch,\r\n getEnrollmentApi,\r\n getEnrollmentProgressApi,\r\n getEnrollmentDailyTrainingApi,\r\n showMessage,\r\n ]\r\n );\r\n};\r\n\r\nexport const useResetPractisSetReportService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetPractisSetReport());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useCheckAllProgressService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (progressIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(checkAllProgress(progressIds, checked, partial));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useCheckSingleProgressService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (progressId: number) => {\r\n dispatch(checkSingleProgress(progressId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\n/**\r\n * @description deletes team practis set label including children labels\r\n * @function useDeleteTeamPractisSetLabelService\r\n * @param { number } practisSetId\r\n * @param { number } labelId\r\n * @returns { void }\r\n */\r\nexport const useDeleteTeamPractisSetLabelService = () => {\r\n const dispatch = useDispatch();\r\n const deletePractisSetLabelsApi = useDeletePractisSetLabelsApi();\r\n const showMessage = useShowMessage();\r\n const labels = usePortableLabelsState();\r\n return useCallback(\r\n (practisSetId: number, labelId: number) => {\r\n const payload: { practisSetId: number; labelId: number }[] = [\r\n { practisSetId, labelId },\r\n ];\r\n const children: any[] = [];\r\n findAllChildIds(labels.data.items, labelId, children);\r\n if (children.length > 0)\r\n children.forEach(item =>\r\n payload.push({ practisSetId, labelId: item.id })\r\n );\r\n deletePractisSetLabelsApi(payload)\r\n .then(() => {\r\n dispatch(\r\n updatedProgressActionSuccess(\r\n { id: practisSetId } as PractisSets,\r\n 'labels'\r\n )\r\n );\r\n showMessage('Label removed successfully', 'success');\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [labels, showMessage, deletePractisSetLabelsApi, dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateAllSelectedInvitationTraineesStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (userIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllSelectedInvitationTraineesState(\r\n userIds,\r\n checked,\r\n partial\r\n )\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateSelectedInvitationTraineesStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (userId: number) => {\r\n dispatch(updateSelectedInvitationTraineesState(userId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useNudgeUsersService = () => {\r\n const nudgeUsersApi = useNudgeUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (nudgeUserData: NudgeData[], successCallback?: () => void) => {\r\n nudgeUsersApi(nudgeUserData)\r\n .then(() => {\r\n showMessage(`Message was sent successfully`, 'success');\r\n successCallback?.();\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [nudgeUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useToggleCollapseLabelFieldService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labelId: number) => {\r\n dispatch(toggleCollapseLabelFieldAction(labelId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSetLabelFilterActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (labels: number[]) => {\r\n dispatch(setLabelFilterAction(labels));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useClearLabelFilterActionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(clearLabelFilterAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSaveSelectedInvitationLabelsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(saveSelectedInvitationLabels());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useUnenrollEnrollmentService = () => {\r\n const unenrollEnrollmentApi = useDeleteEnrollmentsApi();\r\n const showMessage = useShowMessage();\r\n\r\n return useCallback(\r\n (enrollmentIds: number[], successCallback?: () => void) => {\r\n return unenrollEnrollmentApi(enrollmentIds)\r\n .then(() => {\r\n showMessage(\r\n `${\r\n enrollmentIds.length > 1 ? 'Users have' : 'User has'\r\n } been unassigned`,\r\n 'success'\r\n );\r\n successCallback?.();\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [unenrollEnrollmentApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetMembersReportService = () => {\r\n const getMembersReportApi = useGetMembersReportApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (userIds: number[] | null, teamId: string, sp: SearchParams) => {\r\n const overdueFilter = sp.filters?.find(\r\n f => f.field === 'hasOverdue'\r\n );\r\n const params: ReportMembersParams = {\r\n userStatus: sp.filterByRegistrationStatus?.join(','),\r\n enrollmentStatus: sp.filterByStatus?.join(','),\r\n isOverdue: overdueFilter?.value ? true : undefined,\r\n labels: sp.labelIDs?.join(','),\r\n limit: userIds?.length ? undefined : sp.limit ?? 20,\r\n offset: sp.offset ?? 0,\r\n query: sp.searchTerm,\r\n sort: getSearchSortingValue(sp.orderBy, 'name', true),\r\n users: userIds?.join(','),\r\n };\r\n return getMembersReportApi(teamId, params)\r\n .then((data: any) => {\r\n fileDownload(data, 'report.csv');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [getMembersReportApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetTraineesReportService = () => {\r\n const getEnrollmentsReportApi = useGetEnrollmentsReportApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (\r\n enrollmentIds: number[] | null,\r\n practisSetId: number,\r\n search: SearchParams,\r\n teamId: number\r\n ) => {\r\n const params = {\r\n ...createSearchPractisSetDetailsParams(search),\r\n enrollments: enrollmentIds?.join(','),\r\n limit: undefined,\r\n offset: undefined,\r\n };\r\n return getEnrollmentsReportApi(params, teamId, practisSetId)\r\n .then((data: any) => {\r\n fileDownload(data, 'report.xlsx');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [getEnrollmentsReportApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useGetPractisSetsReportService = () => {\r\n const getPractisSetsReportApi = useGetPractisSetsReportApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp: SearchParams, practisSetIds: number[] | null, teamId: string) => {\r\n const overdueFilter = sp.filters?.find(\r\n f => f.field === 'hasOverdue'\r\n );\r\n const params: ReportTrainingPractisSetsParams = {\r\n enrollmentStatus: sp.filterByStatus?.join(','),\r\n isOverdue: overdueFilter?.value ? true : undefined,\r\n labels: sp.labelIDs?.join(','),\r\n limit: practisSetIds?.length ? undefined : sp.limit ?? 20,\r\n offset: sp.offset ?? 0,\r\n query: sp.searchTerm,\r\n sort: getSearchSortingValue(sp.orderBy, 'name', true),\r\n psets: practisSetIds?.join(','),\r\n };\r\n return getPractisSetsReportApi(params, teamId)\r\n .then((data: any) => {\r\n fileDownload(data, 'practis-set-reports.csv');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [getPractisSetsReportApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useUpdateAllSelectedPractisSetsStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (setIds: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(\r\n updateAllSelectedPractisSetsState(setIds, checked, partial)\r\n );\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useUpdateSelectedPractisSetStateService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (setId: number) => {\r\n dispatch(updateSelectedPractisSetState(setId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useMarkTeamAsViewedService = () => {\r\n const dispatch = useDispatch();\r\n const markTeamAsViewedApi = useMarkTeamAsViewedApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (teamId: any) => {\r\n markTeamAsViewedApi(teamId)\r\n .then(() => {\r\n dispatch(\r\n updateTeamActionSuccess(\r\n { id: teamId } as Team,\r\n 'update'\r\n )\r\n );\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [showMessage, markTeamAsViewedApi, dispatch]\r\n );\r\n};\r\n\r\nexport const useSearchTeamMembersService = (teamId: number | string) => {\r\n const teamMembersApi = useSearchTeamMembersApi();\r\n const dispatch = useDispatch();\r\n\r\n return useCallback(\r\n (sp: SearchParams) => {\r\n dispatch(searchTeamMembersStartAction());\r\n teamMembersApi(teamId, createSearchTeamMembersParams(sp))\r\n .then(data => {\r\n dispatch(\r\n setSearchState(\r\n SEARCH_STATE.MEMBERS.name,\r\n SEARCH_STATE.MEMBERS.childrenKeys,\r\n sp\r\n )\r\n );\r\n dispatch(searchTeamMembersSuccessAction(data));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchTeamMembersFailureAction(error.message));\r\n });\r\n },\r\n [teamMembersApi, teamId, dispatch]\r\n );\r\n};\r\n\r\nexport const useSearchTeamsLeadersService = () => {\r\n const dispatch = useDispatch();\r\n const searchTeamLeadersApi = useSearchTeamLeadersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (sp?: SearchParams) => {\r\n dispatch(searchTeamLeadersStartAction());\r\n searchTeamLeadersApi(sp)\r\n .then(data => {\r\n dispatch(searchTeamLeadersSuccessAction(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchTeamLeadersFailureAction(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, searchTeamLeadersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useSelectTeamLeaderService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (leaderId: number) => {\r\n dispatch(selectTeamLeaderAction(leaderId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSelectMultipleTeamLeadersService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (leaderId: number[]) => {\r\n dispatch(selectMultipleTeamLeaderAction(leaderId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useResetTeamLeadersSelection = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetTeamLeadersSelectionAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useDeselectAllTeamLeadersSelection = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(deselectAllTeamLeadersSelectionAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSaveTeamLeaderSelection = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(saveTeamLeaderSelection());\r\n }, [dispatch]);\r\n};","import { NEW_PERMISSIONS } from '../../constants/enums/permissions';\nimport { usePermissionsState } from '../../features/permissions/store/state';\nimport { useHistory } from '../../tools/router';\nimport ROUTES from '../../routes/routes';\nimport { useCallback } from 'react';\n\nexport function useHandleAccessPage() {\n const permissionList = usePermissionsState();\n const history = useHistory();\n return useCallback(\n (permissions: NEW_PERMISSIONS[]) => {\n if (permissionList.length < 1) return true;\n const hasPermission = permissions.some(r =>\n permissionList.includes(r)\n );\n if (hasPermission) {\n return true;\n } else {\n history.push(ROUTES.PROFILE.replace(':userId', 'me'));\n }\n },\n [permissionList, history]\n );\n}\n","import { UserInfo } from './UserInfo';\n\nexport interface TeamMember {\n id: number;\n teamId: number;\n user: UserInfo;\n userStatus: string;\n labels: number[];\n accuracy?: number\n isOverdue: boolean\n lastTraining: null | Date;\n trainingTime?: number\n enrollmentCompleted: number;\n enrollmentEnrolled: number;\n enrollmentNotStarted: number;\n isTeamLead?: boolean;\n}\n\nexport enum TeamMemberStatusEnum {\n PENDING = 'PENDING',\n ACTIVE = 'ACTIVE'\n}","import React, {\n createRef,\n CSSProperties,\n FC,\n ReactNode,\n RefObject,\n useMemo,\n} from 'react';\nimport styled, { css } from 'styled-components';\nimport { NavLink } from 'react-router-dom';\nimport { kebabCase } from 'lodash';\n\nimport { Popup } from '../Popup';\nimport { NavigationHint } from './Navigation';\n\n//region Styles\nconst StyledNavigationItemContainer = styled.div<{\n isActive: boolean;\n height?: number;\n widthPercent?: number;\n url?: string;\n disablehovereffect?: boolean;\n fontSize?: string;\n}>`\n height: ${props => (props.height ? `${props.height}px` : '32px')};\n padding: 0 15px 0 15px;\n padding-bottom: 12px;\n margin-right: 32px;\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n font-weight: 600;\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: ${props =>\n props.isActive\n ? props.theme.Colors.black\n : props.theme.Colors.steelGrey};\n &:before {\n display: block;\n position: absolute;\n content: '';\n background: ${props =>\n props.isActive\n ? props.theme.Colors.mainBlue\n : props.theme.Colors.mainBlue};\n height: ${props => (props.disablehovereffect ? '0' : '2px')};\n border-radius: 1px;\n bottom: 0;\n width: 0px;\n transition: width 0.2s ease-in;\n }\n &:hover {\n &:before {\n width: ${props => props.widthPercent || 100}%;\n }\n }\n ${props =>\n props.isActive &&\n css`\n &:before {\n display: block;\n position: absolute;\n content: '';\n background: ${props.theme.Colors.mainBlue};\n height: ${props.disablehovereffect ? '0' : '2px'};\n border-radius: 1px;\n bottom: 0;\n width: ${props.widthPercent || 100}%;\n left: 0;\n right: 0;\n margin: auto;\n }\n `}\n`;\nconst StyledNavigationItemRouteContainer = styled(NavLink)<{\n height?: number;\n url?: string;\n disablehovereffect?: boolean;\n fontSize?: string;\n}>`\n height: ${props => (props.height ? `${props.height}px` : '32px')};\n padding: 0 15px 0 15px;\n padding-bottom: 12px;\n margin-right: 32px;\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n font-weight: 600;\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n text-decoration: none;\n color: ${props => props.theme.Colors.steelGrey};\n &:before {\n display: block;\n position: absolute;\n content: '';\n background: ${props => props.theme.Colors.mainBlue};\n height: ${props => (props.disablehovereffect ? '0' : '2px')};\n border-radius: 1px;\n bottom: 0;\n width: 0px;\n transition: width 0.2s ease-in;\n }\n &:hover {\n &:before {\n width: 100%;\n }\n }\n &.is-active {\n color: ${props => props.theme.Colors.black};\n &:before {\n display: block;\n position: absolute;\n content: '';\n background: ${props => props.theme.Colors.mainBlue};\n height: ${props => (props.disablehovereffect ? '0' : '2px')};\n border-radius: 1px;\n bottom: 0;\n width: 100%;\n left: 0;\n right: 0;\n margin: auto;\n }\n }\n`;\n\nconst StyledDot = styled.div<{ isShrink?: boolean }>`\n height: 8px;\n width: 8px;\n background-color: ${props => props.theme.Colors.tomato};\n border-radius: 50%;\n margin-top: -10px;\n position: absolute;\n margin-left: 6px;\n right: 4px;\n`;\n//endregion\n\nconst HintWrapper: FC<{\n firstTime?: boolean;\n content?: NavigationHint;\n storageKey: string;\n children: (ref: RefObject<any>) => ReactNode;\n}> = ({ children, content, storageKey, firstTime }) => {\n if (content) {\n return (\n <Popup<HTMLDivElement>\n content={({ hide }, { dismiss }) =>\n content({ dismiss: firstTime ? dismiss : hide })\n }\n dismissKey={firstTime ? storageKey : undefined}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n arrow={true}\n padding={'28px 24px 28px 24px'}\n verticalOffset={3}\n horizontalOffset={16}\n >\n {ref => <>{children(ref)}</>}\n </Popup>\n );\n }\n\n return <>{children(createRef())}</>;\n};\n\nconst NavigationItem: FC<{\n title: string;\n action?: () => void;\n active?: boolean;\n height?: number;\n widthPercent?: number;\n url?: string;\n navigationItemStyles?: CSSProperties;\n activeNavigationItemStyles?: CSSProperties;\n disableHoverEffect?: boolean;\n fontSize?: string;\n hint?: NavigationHint;\n hintFirstTime?: boolean;\n name: string;\n notReviewedCount?: number;\n dataTest?: string;\n}> = ({\n title,\n action,\n active,\n height,\n widthPercent,\n url,\n navigationItemStyles,\n activeNavigationItemStyles,\n disableHoverEffect,\n fontSize,\n hint,\n hintFirstTime,\n name,\n notReviewedCount,\n dataTest\n}) => {\n const storageKey = useMemo(() => {\n if (url) {\n return name;\n }\n return name;\n }, [name, url]);\n\n if (!url) {\n return (\n <HintWrapper\n content={hint}\n firstTime={hintFirstTime}\n storageKey={storageKey}\n >\n {ref => (\n <StyledNavigationItemContainer\n ref={ref}\n onClick={action}\n isActive={!!active}\n height={height}\n widthPercent={widthPercent}\n disablehovereffect={disableHoverEffect}\n fontSize={fontSize}\n style={\n active\n ? {\n ...navigationItemStyles,\n ...activeNavigationItemStyles,\n }\n : {\n ...navigationItemStyles,\n }\n }\n data-test={dataTest && `${dataTest}-${kebabCase(title)}`}\n >\n {title} {!!notReviewedCount && <StyledDot />}\n </StyledNavigationItemContainer>\n )}\n </HintWrapper>\n );\n } else {\n return (\n <HintWrapper\n content={hint}\n firstTime={hintFirstTime}\n storageKey={storageKey}\n >\n {ref => (\n <StyledNavigationItemRouteContainer\n ref={ref}\n to={url}\n height={height}\n activeClassName={'is-active'}\n disablehovereffect={disableHoverEffect}\n style={\n active\n ? {\n ...navigationItemStyles,\n ...activeNavigationItemStyles,\n }\n : {\n ...navigationItemStyles,\n }\n }\n fontSize={fontSize}\n data-test={dataTest && `${dataTest}-${kebabCase(title)}`}\n >\n \n {title} {!!notReviewedCount && <StyledDot />}\n </StyledNavigationItemRouteContainer>\n )}\n </HintWrapper>\n );\n }\n};\n\nexport default NavigationItem;\n","import React, { CSSProperties, ReactNode } from 'react';\nimport styled from 'styled-components';\nimport NavigationItem from './NavigationItem';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport { CheckPermission } from '../../../features/permissions';\n\nexport type NavigationHint = (props: { dismiss: () => void }) => ReactNode;\n\nexport type MenuInterface = {\n key: string;\n title: string;\n url?: string;\n permissions?: NEW_PERMISSIONS[];\n hint?: NavigationHint;\n hintFirstTime?: boolean;\n notReviewedCount?: number\n};\n\ntype NavigationInterface = {\n menu: Array<MenuInterface>;\n active?: string;\n setActive?: (key: string) => void;\n height?: number;\n widthPercent?: number;\n url?: string;\n navigationItemStyles?: CSSProperties;\n activeNavigationItemStyles?: CSSProperties;\n disableHoverEffect?: boolean;\n fontSize?: string;\n dataTest?: string;\n};\n\nconst StyledNavigationContainer = styled.div`\n display: flex;\n`;\n\nconst Navigation: React.FC<NavigationInterface> = ({\n menu,\n active,\n setActive,\n height,\n widthPercent,\n navigationItemStyles,\n activeNavigationItemStyles,\n disableHoverEffect,\n fontSize,\n dataTest\n}) => {\n let menuItems;\n menuItems = menu.map((menu: MenuInterface) => {\n if (!menu.url) {\n return (\n <CheckPermission key={menu.key} permissions={menu.permissions}>\n <NavigationItem\n title={menu.title}\n action={() => setActive && setActive(menu.key)}\n active={active === menu.key}\n height={height}\n widthPercent={widthPercent}\n navigationItemStyles={navigationItemStyles}\n activeNavigationItemStyles={activeNavigationItemStyles}\n disableHoverEffect={disableHoverEffect}\n fontSize={fontSize}\n name={menu.key}\n notReviewedCount={menu.notReviewedCount}\n dataTest={dataTest}\n /> \n </CheckPermission>\n );\n } else {\n return (\n <CheckPermission key={menu.key} permissions={menu.permissions}>\n <NavigationItem\n title={menu.title}\n url={menu.url}\n height={height}\n navigationItemStyles={navigationItemStyles}\n activeNavigationItemStyles={activeNavigationItemStyles}\n disableHoverEffect={disableHoverEffect}\n fontSize={fontSize}\n hint={menu.hint}\n hintFirstTime={menu.hintFirstTime}\n name={menu.key}\n notReviewedCount={menu.notReviewedCount}\n dataTest={dataTest}\n />\n </CheckPermission>\n );\n }\n });\n\n return <StyledNavigationContainer>{menuItems}</StyledNavigationContainer>;\n};\n\nexport default Navigation;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Button } from '../../../../../ui/components/Button';\n\nconst StyledTutorialContent = styled.div`\n width: 288px;\n`;\n\nconst StyledTitle = styled.div`\n font-size: 13px;\n font-weight: bold;\n width: 100%;\n font-family: ${props => props.theme.Fonts.manrope};\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n margin-top: 18px;\n width: 100%;\n font-family: ${props => props.theme.Fonts.manrope};\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst StyledActions = styled.div`\n width: 100%;\n display: flex;\n justify-content: flex-end;\n margin-top: 20px;\n align-self: flex-end;\n`;\n\nconst StyledButtonContainer = styled(Button)`\n width: 120px;\n height: 40px;\n`;\n\nexport const TrainingTutorial: FC<{\n onDismiss: () => void;\n teamName?: string;\n}> = ({ onDismiss, teamName }) => {\n return (\n <StyledTutorialContent>\n <StyledTitle data-test=\"training-tutorial-title\">\n Keep track of members' training progress\n </StyledTitle>\n <StyledContent>\n <StyledDescription data-test=\"training-tutorial-description\">\n See the progress of all Practis Sets being worked on by\n {` ${teamName} `} team and access detailed reports for each\n Practis Set\n </StyledDescription>\n </StyledContent>\n <StyledActions>\n <StyledButtonContainer>\n <Button\n width=\"120px\"\n height=\"40px\"\n action={() => onDismiss()}\n dataTest=\"got-it-button\"\n >\n Got it\n </Button>\n </StyledButtonContainer>\n </StyledActions>\n </StyledTutorialContent>\n );\n};\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n margin-left: 4px;\n`;\n\n","import { FC } from 'react';\nimport { useParams } from 'react-router';\n\nimport ROUTES from '../../../../routes/routes';\nimport Navigation from '../../../../ui/components/Navigation/Navigation';\nimport { TrainingTutorial } from '../../pages/Training/components/TrainingTutorial';\nimport { getPageUrl } from '../../../../routes/helpers';\nimport { Container } from './styles';\n\nexport const TeamsPageNavigation: FC<{ teamName?: string }> = ({\n teamName,\n}) => {\n const params = useParams<{ teamId?: string }>();\n return (\n <Container>\n <Navigation\n fontSize=\"13px\"\n dataTest=\"team\"\n menu={[\n {\n key: 'training',\n title: 'Training',\n url: getPageUrl(ROUTES.TEAMS_PAGES.TRAINING, {\n teamId: params.teamId,\n }),\n hint: ({ dismiss }) => (\n <TrainingTutorial\n teamName={teamName || ''}\n onDismiss={dismiss}\n />\n ),\n hintFirstTime: true,\n },\n {\n key: 'members',\n title: 'Members',\n url: getPageUrl(ROUTES.TEAMS_PAGES.MEMBERS, {\n teamId: params.teamId,\n }),\n },\n ]}\n />\n </Container>\n );\n};\n","import ROUTES from '../../../../routes/routes';\nimport Navigation from '../../../../ui/components/Navigation/Navigation';\nimport { getPageUrl } from '../../../../routes/helpers';\nimport { Container } from './styles';\n\nexport const TeamsLearnersNavigation = () => {\n return (\n <Container>\n <Navigation\n fontSize=\"13px\"\n dataTest=\"team\"\n menu={[\n {\n key: 'teams',\n title: 'Teams',\n url: ROUTES.TEAMS_PAGES.LIST_OF_TEAMS\n },\n {\n key: 'overdueLearners',\n title: 'Overdue Learners',\n url: getPageUrl(ROUTES.OVERDUE_LEARNERS),\n },\n ]}\n />\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoTrainings = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 48 48\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M866 571.202V596.8c0 1.766-1.343 3.2-3 3.2h-36c-1.657 0-3-1.434-3-3.2v-25.598c-1.658 0-3-1.434-3-3.202v-12.8c0-1.768 1.343-3.2 3-3.2h42c1.657 0 3 1.432 3 3.2V568c0 1.769-1.344 3.202-3 3.202zM827 595.2c0 .884.672 1.6 1.5 1.6h33c.828 0 1.5-.716 1.5-1.6v-22.4c0-.883-.672-1.598-1.5-1.598H854v6.398c0 1.769-1.343 3.2-3 3.2h-12c-1.657 0-3-1.431-3-3.2v-6.398h-7.5c-.828 0-1.5.715-1.5 1.597V595.2zm24-19.2v-4.798h-12v4.799c0 .883.671 1.599 1.5 1.599h9c.828 0 1.5-.717 1.5-1.6zm15-19.2c0-.882-.672-1.6-1.5-1.6h-39c-.828 0-1.5.717-1.5 1.6v9.6c0 .884.671 1.6 1.5 1.6h39c.828 0 1.5-.716 1.5-1.6v-9.6z\"\n transform=\"translate(-821 -552)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoTrainings;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoTrainingsFiltering = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 50 50\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M27.428 0v3.576c3.912.79 6.857 4.222 6.857 8.338 0 4.116-2.945 7.548-6.857 8.338v27.4H24v-27.4c-3.912-.79-6.857-4.222-6.857-8.338 0-4.116 2.945-7.55 6.857-8.338V.001h3.428zM10.286 0v20.595c3.911.788 6.857 4.22 6.857 8.338 0 4.115-2.946 7.548-6.857 8.337v10.382h-3.43V37.27C2.946 36.48 0 33.047 0 28.933c0-4.118 2.945-7.551 6.856-8.338V0h3.43zM8.57 23.828c-2.84 0-5.142 2.285-5.142 5.106 0 2.818 2.302 5.104 5.142 5.104 2.84 0 5.143-2.286 5.143-5.104 0-2.82-2.303-5.106-5.143-5.106zM44.57 0l-.001 27.152h-3.427V0h3.428zM25.714 6.808c-2.84 0-5.143 2.286-5.143 5.106 0 2.819 2.302 5.104 5.143 5.104 2.84 0 5.143-2.284 5.143-5.104 0-2.82-2.304-5.106-5.143-5.106zM38.5 48L36 45.765 41.147 40.554 36 35.341 38.5 33.109 43.5 38.172 48.5 33.109 51 35.341 45.852 40.554 51 45.765 48.5 48 43.5 42.937z\"\n transform=\"translate(-818 -574) translate(759 574) translate(59)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoTrainingsFiltering;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const FiltersIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 17 15\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M1305.248 146.813v1.12h-1.067v-1.12c-1.217-.247-2.133-1.323-2.133-2.613s.916-2.366 2.133-2.613V133h1.067v8.587c1.217.247 2.133 1.323 2.133 2.613s-.916 2.366-2.133 2.613zm-.533-4.213c-.884 0-1.6.717-1.6 1.6 0 .884.716 1.6 1.6 1.6.883 0 1.6-.716 1.6-1.6 0-.883-.717-1.6-1.6-1.6zm-4.8-3.253v8.587h-1.067v-8.587c-1.217-.248-2.133-1.324-2.133-2.613 0-1.29.916-2.366 2.133-2.613V133h1.067v1.12c1.217.247 2.133 1.323 2.133 2.613s-.916 2.365-2.133 2.613zm-.534-4.213c-.884 0-1.6.716-1.6 1.6 0 .883.716 1.6 1.6 1.6.884 0 1.6-.717 1.6-1.6 0-.884-.716-1.6-1.6-1.6zm-4.8 9.546v3.254h-1.067v-3.254c-1.217-.247-2.133-1.323-2.133-2.613s.916-2.366 2.133-2.613V133h1.067v6.454c1.217.247 2.134 1.323 2.134 2.613s-.917 2.366-2.134 2.613zm-.533-4.213c-.884 0-1.6.716-1.6 1.6 0 .883.716 1.6 1.6 1.6.883 0 1.6-.717 1.6-1.6 0-.884-.717-1.6-1.6-1.6z\"\n transform=\"translate(-1291 -133)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default FiltersIcon;\n","import styled from 'styled-components';\n\ninterface RootProps {\n open?: boolean;\n disabled?: boolean;\n}\n\nexport const Root = styled.button<RootProps>`\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n position: relative;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n color: ${props => props.theme.Colors.cloudyBlue};\n background: ${({ theme }) => theme.Colors.whiteFive};\n box-shadow: inset 0 0 0 ${({ open }) => (open ? 1 : 0)}px\n ${({ theme }) => theme.Colors.cloudyBlue};\n border: none;\n`;\n\nexport const IconContainer = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const IconHolder = styled.div<{ disabled?: boolean }>`\n width: 16px;\n height: 15px;\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.steelGrey};\n`;\nexport const StyledAssignAction = styled.button<{\n open?: boolean;\n disabled?: boolean;\n hasFilters: boolean;\n}>`\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n position: relative;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n color: ${props => props.theme.Colors.cloudyBlue};\n background: ${({ theme }) => theme.Colors.whiteFive};\n box-shadow: inset 0 0 0 ${({ open }) => (open ? 1 : 0)}px\n ${({ theme }) => theme.Colors.cloudyBlue};\n border: none;\n`;\n\nexport const FiltersDotContainer = styled.div`\n position: absolute;\n top: -8px;\n right: -8px;\n width: 12px;\n height: 12px;\n border-radius: 100%;\n background: var(--ps-white-1);\n padding: 9px;\n`;\n\nexport const FiltersDot = styled.div`\n position: absolute;\n top: 1px;\n right: 1px;\n width: 12px;\n height: 12px;\n border-radius: 100%;\n background: var(--ps-blue-main);\n`;\n","import { forwardRef } from 'react';\n\nimport FiltersIcon from '../../icons/FiltersIcon';\nimport { Tooltip } from '../Tooltip';\nimport {\n FiltersDot,\n FiltersDotContainer,\n IconContainer,\n IconHolder,\n StyledAssignAction,\n} from './styles';\n\nconst TeamMembersFilterHandler = forwardRef<\n HTMLButtonElement,\n {\n toggleOpen: () => void;\n open: boolean;\n disabled?: boolean;\n filtersCount?: number;\n dataTest?: string;\n }\n>(({ toggleOpen, open, disabled = false, filtersCount = 0, dataTest }, ref) => {\n return (\n <StyledAssignAction\n ref={ref}\n onClick={() => !disabled && toggleOpen()}\n open={open}\n disabled={disabled}\n hasFilters={filtersCount > 0}\n data-test={dataTest && `${dataTest}-button`}\n >\n <Tooltip label={'Filters'} preset={'button-icon'} dataTest=\"filters-tooltip\">\n <IconContainer>\n <IconHolder disabled={disabled}>\n <FiltersIcon />\n </IconHolder>\n {filtersCount > 0 && (\n <FiltersDotContainer>\n <FiltersDot\n data-test={dataTest && `${dataTest}-counter`}\n />\n </FiltersDotContainer>\n )}\n </IconContainer>\n </Tooltip>\n </StyledAssignAction>\n );\n});\n\nexport default TeamMembersFilterHandler;\n","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const countAppliedFiltersCount = (searchParams: SearchParams) => {\n let total = 0;\n\n if (searchParams?.filterByStatus?.length) {\n total = total + searchParams.filterByStatus.length;\n }\n\n if (searchParams?.filterByRegistrationStatus?.length) {\n total = total + searchParams.filterByRegistrationStatus.length;\n }\n\n if (searchParams?.labelIDs?.length) {\n total = total + searchParams.labelIDs.filter((id: number) => id > 0).length;\n }\n\n if(searchParams?.filters?.some(item => item.field === 'hasOverdue' && item.value === true)) {\n total += 1;\n }\n\n if(searchParams?.filterByDueDate?.length) {\n total+=searchParams?.filterByDueDate?.length;\n }\n\n return total;\n};\n\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const OverdueFlag = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-test={dataTest}\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2.5 7.13v7.33h2.514V16H2.5A1.5 1.5 0 0 1 1 14.5v-11A1.5 1.5 0 0 1 2.5 2h1.25V.75A.76.76 0 0 1 4.5 0a.76.76 0 0 1 .75.71V2h5.5V.75A.76.76 0 0 1 11.5 0a.76.76 0 0 1 .75.71V2h1.25A1.5 1.5 0 0 1 15 3.46V5h-1.5V3.46h-11v2.17H8v1.5H2.5z\"\n fill=\"#EC513D\"\n />\n <path\n d=\"M11.62 6c-1.051.283-2.356 2.59-1.288 4.77.211.431.175.764.001.94-.284.29-1.728-.164-2.235-1.7C7.42 10.424 7 11.314 7 12.234 7 14.438 8.845 16 11 16c2.154 0 4-1.57 4-3.767 0-1.342-.694-2.046-1.422-2.786-.758-.77-1.865-1.845-1.957-3.447z\"\n fill=\"#EC513D\"\n />\n </svg>\n );\n }\n);\n\nexport default OverdueFlag;\n","import React, {\n ChangeEvent,\n FC,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport styled from 'styled-components';\nimport { EnrollmentStatus } from '../../../../../../constants/interfaces/Enrollments';\nimport { Variables } from '../../../../../../theme/variables';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { PortableLabelsWithStore } from '../../../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport OverdueFlag from '../../../../../../ui/icons/OverdueFlag';\nimport { statusesMap } from '../../../../../../constants/variables/general';\n\n//region Styles\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nconst StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n background-color: inherit;\n`;\n\nconst StatusItem = styled.div`\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nconst OverdueFlagWrapped = styled(OverdueFlag)`\n margin-left: 4px;\n`;\n\n//endregion\n\nexport const TrainingFilters: FC<{\n preSelectedLabels: number[];\n status: EnrollmentStatus[];\n onLabelsChange: (ids: number[]) => void;\n onStatusChange: (status: EnrollmentStatus[]) => void;\n onSuccessApply: () => void;\n onOverdueChange: (hasOverdue: boolean) => void;\n overdue?: boolean;\n}> = ({\n preSelectedLabels,\n onLabelsChange,\n onStatusChange,\n status,\n onSuccessApply,\n onOverdueChange,\n overdue,\n}) => {\n const [statuses, setStatuses] = useState(status);\n const labels = useLabelsState();\n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n const [hasOverdue, setHasOverdue] = useState(!!overdue);\n\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(preSelectedLabels);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n preSelectedLabels,\n saveLabels,\n selectLabels,\n ]);\n\n \n\n const onStatusChangeHandler = useCallback(\n (statusIn: EnrollmentStatus, e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setStatuses([...statuses, statusIn]);\n } else {\n setStatuses(statuses.filter(item => item !== statusIn));\n }\n },\n [setStatuses, statuses]\n );\n\n const onApplyHandler = useCallback(() => {\n onStatusChange(statuses);\n onLabelsChange(labels.selected);\n saveLabels();\n onSuccessApply();\n onOverdueChange(hasOverdue);\n }, [\n onStatusChange,\n statuses,\n onLabelsChange,\n labels.selected,\n onSuccessApply,\n saveLabels,\n onOverdueChange,\n hasOverdue\n ]);\n\n const totalFiltersSelected =\n labels?.selected.filter(id => id > 0).length + statuses.length + (hasOverdue ? 1 : 0);\n\n const deselectLabels = useDeselectAllLabels();\n\n \n const onClearHandler = () => {\n deselectLabels();\n setStatuses([]);\n setHasOverdue(false);\n }\n\n return (\n <Container>\n <Wrapper>\n <Fieldset\n title={'Team Member Status'}\n dataTest=\"team-member-status\"\n >\n <StatusContainer>\n {(Object.keys(statusesMap) as EnrollmentStatus[]).map(\n item => (\n <StatusItem key={item} data-test=\"team-member-status-item-container\">\n <Checkbox\n checked={statuses.includes(item)}\n handleChange={e =>\n onStatusChangeHandler(item, e)\n }\n label={statusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={statusesMap[item]?.dataTest}\n />\n </StatusItem>\n )\n )}\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Overdue'} dataTest=\"overdue\">\n <StatusContainer>\n <StatusItem>\n <Checkbox\n checked={hasOverdue}\n handleChange={e =>\n setHasOverdue(e.target.checked)\n }\n label=\"Overdue\"\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest=\"overdue-check-box\"\n />\n <OverdueFlagWrapped dataTest=\"overdue-flag-icon\" />\n </StatusItem>\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-filters-counter\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant=\"inverse\"\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-filters-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={() => onApplyHandler()}\n dataTest=\"apply-filters-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n\nexport default TrainingFilters;\n","import { FC, useCallback, useRef } from 'react';\r\nimport {\r\n ActionButton,\r\n ActionItem,\r\n} from '../../../../../../ui/components/ActionButton';\r\nimport { CheckPermission } from '../../../../../permissions';\r\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\r\nimport { isTeamLeader } from '../../../../../../constants/enums';\r\nimport ROUTES from '../../../../../../routes/routes';\r\nimport { TeamV2 } from '../../../../../../constants/interfaces/Team';\r\nimport { pushModal, useHistory } from '../../../../../../tools/router';\r\nimport { UserProfile } from '../../../../../../constants/interfaces/User';\r\nimport { TrainingPractisSet } from '../../../../../../constants/interfaces/TrainingPractisSet';\r\n\r\nconst ListActions: FC<{\r\n practisSet: TrainingPractisSet;\r\n profile?: UserProfile;\r\n team?: TeamV2;\r\n handleRedirection: (id?: number) => void;\r\n onExportSinglePractisClicked: (id?: number) => void;\r\n isHidden?: boolean;\r\n}> = ({\r\n practisSet,\r\n team,\r\n profile,\r\n handleRedirection,\r\n onExportSinglePractisClicked,\r\n isHidden,\r\n}) => {\r\n\r\n const history = useHistory();\r\n const triggerRef = useRef(null);\r\n\r\n const handleViewAssignUsers = useCallback(\r\n (id?: number) => {\r\n if (!id || !team || (team && !team.id)) return;\r\n\r\n pushModal(\r\n history,\r\n ROUTES.TEAMS_PAGES.TRAINING_PAGES.TRAINEE_INVITATION.replace(\r\n ':teamId',\r\n team.id ? team.id.toString() : ''\r\n ).replace(':practisSetId', id.toString())\r\n );\r\n },\r\n [history, team]\r\n );\r\n\r\n return (\r\n <span>\r\n <div ref={triggerRef}>\r\n <ActionButton customWidth={168} isHidden={isHidden} dataTest=\"action-menu\">\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_PRACTIS_SET_PROGRESS,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={() =>\r\n handleRedirection(practisSet.practisSetId)\r\n }\r\n dataTest=\"view-progress-action-item\"\r\n >\r\n View Progress\r\n </ActionItem>\r\n </CheckPermission>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.ASSIGN_ENROLLMENT]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n if (\r\n practisSet.practisSetId &&\r\n team &&\r\n team.id\r\n ) {\r\n handleViewAssignUsers(\r\n practisSet.practisSetId\r\n );\r\n }\r\n }}\r\n dataTest=\"assign-users-action-item\"\r\n >\r\n Assign Users\r\n </ActionItem>\r\n </CheckPermission>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n onExportSinglePractisClicked(\r\n practisSet.practisSetId\r\n );\r\n }}\r\n dataTest=\"export-report-action-item\"\r\n >\r\n Export Report\r\n </ActionItem>\r\n </CheckPermission>\r\n {isTeamLeader(profile?.role?.name) ? (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n if (practisSet.practisSetId)\r\n history.push(\r\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\r\n ':practisSetId',\r\n practisSet.practisSetId.toString()\r\n )\r\n );\r\n }}\r\n dataTest=\"view-practisset-action-item\"\r\n >\r\n View Practis Set\r\n </ActionItem>\r\n ) : (\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.UPDATE_PRACTIS_SET]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n if (practisSet.practisSetId)\r\n history.push(\r\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\r\n ':practisSetId',\r\n practisSet.practisSetId.toString()\r\n )\r\n );\r\n }}\r\n dataTest=\"edit-practisset-action-item\"\r\n >\r\n Edit Practis Set\r\n </ActionItem>\r\n </CheckPermission>\r\n )}\r\n </ActionButton>\r\n </div>\r\n </span>\r\n );\r\n};\r\n\r\nexport default ListActions;\r\n","import { Reducer } from 'redux';\nimport { SearchStateInterface, SecondarySearchStateInterface } from './states';\nimport {\n ACTIONS,\n setSearchState,\n deleteSearchState,\n setSecondarySearchState,\n deleteSecondarySearchState\n} from './actions';\nimport { AppState } from '../../../store/reducers';\n\n\nexport const getSearchState = (state: AppState) => state.searchState;\n\nexport type Action =\n | ReturnType<typeof setSearchState>\n | ReturnType<typeof deleteSearchState>;\n\nexport const SearchStateReducer: Reducer<SearchStateInterface, Action> = (\n state = {\n key: '',\n params: undefined,\n childrenKeys: []\n },\n action: Action\n): SearchStateInterface => {\n switch (action.type) {\n case ACTIONS.SET_SEARCH_STATE:\n return {\n key: action.key,\n params: action.params,\n childrenKeys: action.childrenKeys\n };\n case ACTIONS.DELETE_SEARCH_STATE: {\n return {\n key: '',\n params: undefined,\n childrenKeys: []\n };\n }\n default:\n return state;\n }\n};\n\nexport const getSecondarySearchState = (state: AppState) => state.secondarySearchState;\n\nexport type SecondaryAction =\n | ReturnType<typeof setSecondarySearchState>\n | ReturnType<typeof deleteSecondarySearchState>;\n\nexport const secondarySearchStateReducer: Reducer<SecondarySearchStateInterface, SecondaryAction> = (\n state = {\n key: '',\n params: undefined\n },\n action: SecondaryAction\n): SecondarySearchStateInterface => {\n switch (action.type) {\n case ACTIONS.SET_SECONDARY_SEARCH_STATE:\n return {\n key: action.key,\n params: action.params\n };\n case ACTIONS.DELETE_SECONDARY_SEARCH_STATE: {\n return {\n key: '',\n params: undefined\n };\n }\n default:\n return state;\n }\n};\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../theme/variables';\n\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { TableCell } from '../../../../ui/components/table-wrapper/table/table-cell';\nimport OverdueFlag from '../../../../ui/icons/OverdueFlag';\nimport { Loading } from '../../../../ui/components/LoadingCopmonent';\n\nexport const InvitationHeader = styled.div`\n padding: 40px 0 23px 16px;\n display: flex;\n flex-shrink: 0;\n justify-content: start;\n`;\n\nexport const QuickAssignmentInvitationFooter = styled.div`\n padding: 22px 30px 32px 32px;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n`;\n\nexport const InvitationHeaderWrapper = styled.div`\n display: flex;\n`;\n\nexport const QuickAssignmentInvitationHeaderText = styled.div`\n font-size: 24px;\n font-weight: 800;\n max-width: 400px;\n color: ${props => props.theme.Colors.black};\n line-height: 1.2;\n margin-bottom: 16px;\n`;\n\nexport const IconWrapper = styled.div`\n width: 24px;\n height: 24px;\n color: ${props => props.theme.Colors.topaz};\n margin-left: 12px;\n`;\n\nexport const InvitationHeaderSubText = styled.div`\n font-size: 15px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n margin-bottom: 2px;\n`;\n\nexport const CancelWrapper = styled.div`\n margin-right: 12px;\n`;\n\nexport const AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nexport const Avatar = styled(AvatarPlaceholder)<{ marginRight: number }>`\n width: 24px;\n height: 24px;\n margin-right: ${({ marginRight }) =>\n marginRight ? `${marginRight}px` : '8px'};\n`;\n\nexport const StyledProgressContainer = styled.div`\n max-width: 268px;\n`;\n\nexport const ProgressBarContainer = styled.div`\n width: 128px;\n`;\n\nexport const StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 200px;\n`;\n\nexport const DueDateWrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const DueDateIcon = styled.span`\n display: flex;\n`;\n\nexport const OverdueFlagWrapped = styled(OverdueFlag)`\n margin-left: 8px;\n`;\n\nexport const WrapperTableCell = styled.div<{ isTeamMembers?: boolean }>`\n width: 70%;\n margin: 0 auto;\n display: flex;\n flex-wrap: no-wrap;\n\n td {\n display: inline-flex;\n align-items: center;\n justify-content: flex-center;\n }\n\n td:nth-child(1) {\n padding-left: 0px !important;\n margin-left: -2px;\n }\n\n td:nth-child(2) {\n padding-left: 6px !important;\n }\n\n td:nth-child(3) {\n padding-left: 8px !important;\n }\n\n @media (max-width: 1680px) {\n width: 76%;\n }\n\n @media (max-width: 1441px) {\n width: 90%;\n td:nth-child(1) {\n padding-left: 10px !important;\n }\n\n td:nth-child(2) {\n padding-left: 8px !important;\n span {\n width: 92px;\n }\n }\n\n td:nth-child(3) {\n padding-left: 2px !important;\n }\n }\n`;\n\nexport const WrapperTableCellUsers = styled.div`\n width: 70%;\n margin: 0 auto;\n display: flex;\n flex-wrap: no-wrap;\n\n td {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n }\n\n td:nth-child(1) {\n padding-left: 1px !important;\n span {\n width: 55px;\n text-align: center;\n }\n }\n\n td:nth-child(2) {\n justify-content: center;\n span {\n width: 70px;\n margin-left: -9px;\n }\n }\n\n @media (max-width: 1441px) {\n td:nth-child(1) {\n padding-left: 10px !important;\n span {\n text-align: left;\n margin-left: -8px;\n }\n }\n\n td:nth-child(2) {\n padding-left: 0px !important;\n span {\n margin-left: -3px;\n }\n }\n }\n`;\n\nexport const StyledTraineeInvitationContainer = styled.div`\n padding: 0 30px;\n height: 100%;\n overflow: auto;\n background: ${props => props.theme.Colors.white};\n display: flex;\n flex-direction: column;\n border-top-left-radius: 8px;\n border-bottom-left-radius: 8px;\n`;\n\nexport const InvitationFooter = styled.div`\n padding: 22px 0 32px 32px;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n position: sticky;\n bottom: 0;\n background: ${props => props.theme.Colors.white};\n width: 100%;\n`;\n\nexport const InvitationHeaderText = styled.div`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.steelGrey};\n margin-bottom: 2px;\n`;\n\nexport const StyledInvitationTitle = styled.div`\n color: ${Variables.Colors.black};\n font-size: 20px;\n font-weight: 800;\n`;\n\nexport const StyledTableCell = styled(TableCell)`\n font-size: 13px;\n height: 45px;\n padding: 0;\n`;\n\nexport const StyledFirstTableItemContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 200px;\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n multiHeaderContainer: {\n justifyContent: 'space-between !important',\n\n width: '70% !important',\n '@media(min-width:960px)': {\n width: '71% !important',\n },\n\n '@media(min-width: 1280px)': {\n width: '70% !important',\n },\n\n '@media(min-width: 1441px)': {\n width: '55% !important',\n },\n },\n\n teamMemberHeaderContainer: {\n width: '45% !important',\n \n '@media(max-width:1680px)': {\n width: '80% !important',\n },\n\n '@media(max-width: 1441px)': {\n width: '100% !important',\n },\n\n '@media(min-width:1681px)': {\n width: '70% !important',\n },\n\n '@media(min-width: 2041px)': {\n width: '57% !important',\n },\n },\n\n scrollWrapperStyle: {\n height: '100% !important',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n\n tableWrapperStyle: {\n height: '100% !important',\n },\n\n tableBodyContainerStyleForInvitation: {\n maxHeight: 'calc(100vh - 358px)',\n },\n\n tableBodyContainerStyleForAssignment: {\n maxHeight: 'calc(100vh - 368px)',\n },\n\n customCellStyle: {\n fontSize: '13px',\n height: '45px',\n padding: 0,\n },\n\n labelsCellStyle: {\n justifyContent: 'flex-end !important',\n },\n}));\n\nexport const TeamMemberStatusCell = styled(TableCell)`\n justify-content: center;\n`;\n\nexport const StyledTraineeDetailsContainer = styled.div`\n height: 100%;\n background: ${props => props.theme.Colors.white};\n display: flex;\n flex-direction: column;\n`;\n\nexport const StyledLoading = styled(Loading)`\n height: calc(100vh - 115px);\n`;\n\nexport const StyledDetailsHeader = styled.div`\n padding: 24px 0;\n display: flex;\n flex-shrink: 0;\n justify-content: space-between;\n`;\n\nexport const ProfileSection = styled.div`\n display: flex;\n`;\n\nexport const DetailsStatus = styled.div`\n color: ${props => props.theme.Colors.coral};\n font-size: 13px;\n font-weight: normal;\n height: 24px;\n padding: 0px 12px;\n border-radius: 4px;\n align-self: flex-end;\n border-radius: 100px;\n\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nexport const DetailsStatusPending = styled(DetailsStatus)`\n color: #3a3a3a;\n background: #ebebeb;\n`;\n\nexport const DetailsStatusInProgress = styled(DetailsStatus)`\n color: #015895;\n background: rgba(74, 169, 226, 0.15);\n`;\n\nexport const DetailsStatusCompleted = styled(DetailsStatus)`\n background: #d6f7e8;\n color: #066150;\n`;\n\nexport const StyledDetailsAvatar = styled.div`\n width: 48px;\n height: 48px;\n border-radius: 4px;\n overflow: hidden;\n`;\n\nexport const StyledUserInfo = styled.div`\n display: flex;\n flex-direction: column;\n margin-left: 12px;\n`;\n\nexport const StyledName = styled.div<{ isFlex?: boolean }>`\n ${props => !!props.isFlex && `display: flex; align-items: center;`}\n font-size: 15px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n margin-top: 4px;\n`;\n\nexport const StyledEmail = styled.div`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const GraphSection = styled.div`\n padding: 24px 0;\n`;\n\nexport const GraphRow = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nexport const StyledAdditionalInfo = styled.span`\n font-size: 15px;\n font-weight: 600;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.steelGrey};\n margin-right: 4px;\n`;\n\nexport const StatusContainer = styled.div`\n display: flex;\n flex-shrink: 0;\n`;\n\nexport const StyledPendingTitle = styled.span`\n font-size: 13px;\n font-weight: 500;\n color: ${props => props.theme.Colors.brown};\n`;\n\nexport const StyledPendingInvitationLabel = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 24px;\n border-radius: 20px;\n background-color: ${props => props.theme.Colors.macaroniAndCheeseOpaque};\n padding: 4px 12px;\n margin-left: 10px;\n`;\n\nexport const SubHeaderContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 15px;\n margin-bottom: 10px;\n margin-left: -8px;\n`;\n\nexport const WarningTitle = styled.span`\n display: flex;\n align-items: center;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const DueDateSubTitle = styled.span`\n margin-top: 1px;\n font-size: 13px;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const StyledOverdueFlag = styled(OverdueFlag)`\n margin-left: 8px;\n`;\n\nexport const DueDateSkeletonContainer = styled.div`\n margin-left: 7px;\n width: 195px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n`","import { useCallback } from 'react';\n\nimport { TableHeaderCellProps } from './type';\n\nexport const useOrderBy = <T extends Object = {}>(\n field: keyof T | string,\n state: { field?: string; asc?: boolean } | undefined | null,\n onChange: (field: string) => void\n): Partial<TableHeaderCellProps> => {\n const asc = state && state.field === field ? state.asc : undefined;\n const onClick = useCallback(() => onChange(field as string), [\n field,\n onChange,\n ]);\n return {\n asc,\n onClick: onClick,\n };\n};\n\n","import { useCallback } from 'react';\n\nimport { TableStateHelper, TableStateValues } from './types';\n\nexport const useTableStateHelper = () =>\n useCallback((params: TableStateHelper) => {\n const {\n itemsCount,\n appliedFilters,\n searchTerm,\n startDate,\n endDate,\n filtersAreAlwaysEnabled\n } = params;\n\n let tableState: TableStateValues = {\n disableFilters: true,\n disableSearch: true,\n disableSorting: true,\n showEmptyState: true,\n showNoEntriesState: true,\n showNoSearchResultsState: true,\n showNoFilterResultsState: true,\n showNoCalendarResultsState: true,\n };\n\n const noItems = !itemsCount || itemsCount < 1;\n const noSearchTerm = !searchTerm || searchTerm.length < 1;\n const noFilters = !appliedFilters || appliedFilters < 1;\n const noCalendarFilters = !startDate && !endDate;\n\n if (noItems && noSearchTerm && noFilters && noCalendarFilters) {\n tableState.disableFilters = true;\n tableState.disableSearch = true;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = true;\n tableState.showNoSearchResultsState = false;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = false;\n } else if (noItems && !noSearchTerm && noFilters && noCalendarFilters) {\n tableState.disableFilters = true;\n tableState.disableSearch = false;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = true;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = false;\n } else if (noItems && noSearchTerm && noFilters && !noCalendarFilters) {\n tableState.disableFilters = true;\n tableState.disableSearch = true;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = false;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = true;\n } else if (noItems && noSearchTerm && !noFilters && !noCalendarFilters) {\n tableState.disableFilters = false;\n tableState.disableSearch = true;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = false;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = true;\n } else if (noItems && noSearchTerm && !noFilters && noCalendarFilters) {\n tableState.disableFilters = false;\n tableState.disableSearch = true;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = false;\n tableState.showNoFilterResultsState = true;\n tableState.showNoCalendarResultsState = false;\n } else if (noItems && !noSearchTerm && (!noFilters || !noCalendarFilters)) {\n tableState.disableFilters = false;\n tableState.disableSearch = false;\n tableState.disableSorting = true;\n tableState.showEmptyState = true;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = true;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = false;\n } else {\n tableState.disableFilters = false;\n tableState.disableSearch = false;\n tableState.disableSorting = false;\n tableState.showEmptyState = false;\n tableState.showNoEntriesState = false;\n tableState.showNoSearchResultsState = false;\n tableState.showNoFilterResultsState = false;\n tableState.showNoCalendarResultsState = false;\n }\n if (filtersAreAlwaysEnabled) {\n tableState.disableFilters = false;\n }\n return tableState;\n }, []);\n\n","import { SearchParams } from \"../../constants/interfaces/filters\";\n\nexport const normalizeSP = (\n searchParams: SearchParams,\n totalCount: number | undefined,\n teamId?: any,\n practisSetId?: any,\n userId?: any\n) => {\n let newParams = {...searchParams};\n newParams.offset = 0;\n newParams.limit = totalCount;\n\n if (teamId) {\n newParams.teamId = parseInt(teamId)\n }\n if (practisSetId) {\n newParams.practisSetId = parseInt(practisSetId)\n }\n\n if (userId) {\n newParams.userId = parseInt(userId)\n }\n\n return newParams;\n}\n\n","import { History } from 'history';\r\nimport { FC, useCallback, useEffect, useState } from 'react';\r\nimport { isEmpty as lodashIsEmpty } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport { PractisSets } from '../../../../constants/interfaces/PractisSets';\r\nimport { TrainingPractisSet } from '../../../../constants/interfaces/TrainingPractisSet';\r\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport {\r\n useDeleteTeamPractisSetLabelService,\r\n useGetPractisSetsReportService,\r\n useGetTeamInfoTrainingService,\r\n useSearchTrainingPractisSets,\r\n useUpdateAllSelectedPractisSetsStateService,\r\n useUpdateSelectedPractisSetStateService,\r\n} from '../../store/services';\r\nimport {\r\n useTeamMembersState,\r\n useTrainerPractisSetState,\r\n useUpdatedProgressState,\r\n} from '../../store/states';\r\nimport { formatDate } from '../../../../helpers/functions/date-convert';\r\nimport {\r\n UpdatedLabelsState,\r\n useLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../../../labels/store/states';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport { usePermissionsState } from '../../../permissions/store/state';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\r\nimport { clearSelectedItemIfNotLoaded } from '../../../labels/tools';\r\nimport {\r\n useSaveUserFiltersService,\r\n useSetAssignLabelsActionService,\r\n} from '../../../labels/store/services';\r\nimport { WithLabelsContext } from '../../../portableLabels';\r\nimport { TeamsPageNavigation } from '../../components/TeamsPageNavigation';\r\nimport { TeamV2 } from '../../../../constants/interfaces/Team';\r\nimport { UserProfile } from '../../../../constants/interfaces/User';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport NoTrainings from '../../../../ui/icons/NoTrainings';\r\nimport NoTrainingsFiltering from '../../../../ui/icons/NoTrainingsFiltering';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { EnrollmentStatus } from '../../../../constants/interfaces/Enrollments';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport { countAppliedFiltersCount } from '../TeamMembers/tools';\r\nimport TrainingFilters from './components/Filters/TrainingFilters';\r\nimport ListActions from './components/ListActions/ListActions';\r\nimport { SecondarySearchStateInterface } from '../../../searchState/store/states';\r\nimport { SEARCH_STATE } from '../../../searchState/constants';\r\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\r\nimport { getSecondarySearchState } from '../../../searchState/store/reducer';\r\nimport OverdueFlag from '../../../../ui/icons/OverdueFlag';\r\nimport { useStyles, WrapperTableCell, TeamMemberStatusCell } from './styles';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport { EmptyCellDash } from '../../../../ui/components/table-wrapper/table/EmptyCellDash';\r\nimport { Subheader } from '../../components/SubHeader';\r\nimport { normalizeSP } from '../../../../helpers/functions/searchparams-normalize';\r\nimport {\r\n onListenEvent,\r\n onRemoveEvent,\r\n} from '../../../../helpers/functions/Events';\r\nimport { EventNameList, REFRESH_TRAINING_PAGE } from '../../../../helpers/functions/Events/types';\r\n\r\nconst qs = require('query-string');\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nexport const PractisSetProgress: FC<{\r\n profile?: UserProfile;\r\n history: History<any>;\r\n params: { teamId?: string };\r\n updatedProgress?: PractisSets;\r\n searchPractisSets(searchParams: SearchParams): void;\r\n practisSets?: ListResult<TrainingPractisSet>;\r\n team?: TeamV2;\r\n company?: CompanyInterface;\r\n selectedLabels?: number[];\r\n deleteTeamPractisSetLabel: (practisSetId: number, labelId: number) => void;\r\n loading?: boolean;\r\n selectedPractisSets?: number[];\r\n updateSelectedPractisSet(setId: number): void;\r\n assignedLabels?: number[];\r\n updateAllSelectedPractisSets(\r\n setIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n setAssignLabelsAction(labels: number[]): void;\r\n getPractisSetReports(\r\n searchParams: SearchParams,\r\n practisSetIds: number[] | null,\r\n teamId: string\r\n ): void;\r\n getSingleTeam(teamId: any): void;\r\n saveGlobalLabelFilters: (labels: number[] | null) => void;\r\n updatedLabels?: UpdatedLabelsState;\r\n searchState: SecondarySearchStateInterface;\r\n}> = ({\r\n profile,\r\n history,\r\n params,\r\n practisSets,\r\n team,\r\n updatedProgress,\r\n searchPractisSets,\r\n company,\r\n selectedLabels,\r\n deleteTeamPractisSetLabel,\r\n loading,\r\n selectedPractisSets,\r\n updateSelectedPractisSet,\r\n updateAllSelectedPractisSets,\r\n getPractisSetReports,\r\n saveGlobalLabelFilters,\r\n updatedLabels,\r\n searchState,\r\n}) => {\r\n const canAccessPage = useHandleAccessPage();\r\n const classes = useStyles();\r\n\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\r\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\r\n null\r\n );\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n orderBy: { field: 'name', asc: true },\r\n labelIDs: selectedLabels,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n filterByStatus: [],\r\n };\r\n\r\n const usableParams: SearchParams =\r\n !isEmpty(searchState) &&\r\n !!searchState?.params &&\r\n searchState.key === SEARCH_STATE.TRAINING.name\r\n ? searchState.params\r\n : initialSearchParams;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLabelIDs,\r\n setOffset,\r\n setCustom,\r\n refreshSearchParams,\r\n setFilter,\r\n } = useSearchParamsState(usableParams);\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n const ifCompanyChanged = useIfChanged(company && company.id, true);\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const isCheckboxPartiallySelected =\r\n practisSets &&\r\n practisSets.items &&\r\n selectedPractisSets &&\r\n selectedPractisSets.length < practisSets.items.length;\r\n\r\n const orderBy = searchParams.orderBy;\r\n const hcName = useOrderBy('name', orderBy, setOrderBy);\r\n const hcOverdue = useOrderBy('overdue', orderBy, setOrderBy);\r\n const hcPending = useOrderBy('enrollment_not_started', orderBy, setOrderBy);\r\n const hcInProgress = useOrderBy(\r\n 'enrollment_in_progress',\r\n orderBy,\r\n setOrderBy\r\n );\r\n const hcCompleted = useOrderBy('enrollment_completed', orderBy, setOrderBy);\r\n const hcLastTrainingAt = useOrderBy('last_training', orderBy, setOrderBy);\r\n const permissions = usePermissionsState();\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countAppliedFiltersCount(searchParams),\r\n itemsCount: practisSets?.items.length || 0,\r\n });\r\n\r\n const handleRedirection = useCallback(\r\n (id?: number) => {\r\n if (!id || !team || (team && !team.id)) return;\r\n\r\n if (\r\n permissions.includes(NEW_PERMISSIONS.VIEW_PRACTIS_SET_PROGRESS)\r\n ) {\r\n history.push(\r\n ROUTES.TEAMS_PAGES.TRAINING_PAGES.PRACTIS_SETS_DETAILS.replace(\r\n ':teamId',\r\n team.id ? team.id.toString() : ''\r\n ).replace(':practisSetId', id.toString()),\r\n {\r\n useGoBack: true,\r\n }\r\n );\r\n }\r\n },\r\n [history, permissions, team]\r\n );\r\n\r\n const handleAssignedLabelDelete = (labelId: number, setId: number) => {\r\n deleteTeamPractisSetLabel(setId, labelId);\r\n };\r\n\r\n const handlePractisSetCheck = (e: any, set: TrainingPractisSet) => {\r\n e.stopPropagation();\r\n if (!!set.practisSetId) {\r\n updateSelectedPractisSet(set.practisSetId);\r\n }\r\n };\r\n\r\n const updateAllPractisSetsCheck = useCallback(\r\n (checked: boolean) => {\r\n const setIds =\r\n (practisSets &&\r\n practisSets.items.map((set: TrainingPractisSet) =>\r\n Number(set.practisSetId)\r\n )) ||\r\n [];\r\n updateAllSelectedPractisSets(\r\n setIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [practisSets, isCheckboxPartiallySelected, updateAllSelectedPractisSets]\r\n );\r\n\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(null);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n\r\n const onExportSinglePractisClicked = useCallback(\r\n (practisSetId: any) => {\r\n if (params && params.teamId) {\r\n getPractisSetReports(\r\n searchParams,\r\n [practisSetId],\r\n params.teamId\r\n );\r\n }\r\n },\r\n [getPractisSetReports, params, searchParams]\r\n );\r\n\r\n const onExportClicked = useCallback(() => {\r\n if (selectedPractisSets && params && params.teamId) {\r\n getPractisSetReports(\r\n isSelectAll\r\n ? normalizeSP(searchParams, practisSets?.count)\r\n : searchParams,\r\n !isSelectAll ? selectedPractisSets : null,\r\n params.teamId\r\n );\r\n }\r\n }, [\r\n selectedPractisSets,\r\n params,\r\n getPractisSetReports,\r\n isSelectAll,\r\n searchParams,\r\n practisSets?.count\r\n ]);\r\n\r\n useEffect(() => {\r\n canAccessPage([NEW_PERMISSIONS.LIST_PRACTIS_SET]);\r\n }, [canAccessPage]);\r\n\r\n useEffect(() => {\r\n if (ifSearchParamsChanged) {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchPractisSets(searchParams);\r\n }\r\n }, [ifSearchParamsChanged, searchParams, searchPractisSets]);\r\n\r\n useEffect(() => {\r\n if (ifCompanyChanged) {\r\n history.push(ROUTES.TEAMS);\r\n }\r\n }, [ifCompanyChanged, history]);\r\n\r\n useEffect(() => {\r\n if (updatedProgress) refreshSearchParams();\r\n }, [updatedProgress, refreshSearchParams]);\r\n\r\n const refreshData = useCallback(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchPractisSets(searchParams);\r\n setLastRefreshed(new Date());\r\n updateAllSelectedPractisSets([], true, isCheckboxPartiallySelected);\r\n }, [\r\n searchPractisSets,\r\n searchParams,\r\n updateAllSelectedPractisSets,\r\n isCheckboxPartiallySelected,\r\n ]);\r\n\r\n useEffect(() => {\r\n selectedLabels && setLabelIDs(selectedLabels);\r\n }, [selectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedPractisSets?.length &&\r\n selectedPractisSets.length === practisSets?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [practisSets?.count, selectedPractisSets]);\r\n\r\n useEffect(() => {\r\n const filteredPractisSets = practisSets\r\n ? practisSets.items.map(set => Number(set.practisSetId))\r\n : [];\r\n const practisSetsToClear = clearSelectedItemIfNotLoaded(\r\n selectedPractisSets,\r\n filteredPractisSets\r\n );\r\n if (practisSetsToClear && practisSetsToClear.length > 0) {\r\n updateAllSelectedPractisSets(practisSetsToClear, false);\r\n }\r\n }, [selectedPractisSets, practisSets, updateAllSelectedPractisSets]);\r\n\r\n useEffect(() => {\r\n return () =>\r\n updateAllSelectedPractisSets([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n updateAllSelectedPractisSets([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [practisSets]);\r\n\r\n useEffect(() => {\r\n if (pageIndex > 1) {\r\n setTimeout(() => {\r\n setOffset(initialOffset);\r\n }, 200);\r\n } else if (pageIndex === 1) {\r\n setTimeout(() => {\r\n setOffset(0);\r\n }, 100);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageIndex]);\r\n\r\n useEffect(() => {\r\n selectedLabels && setLabelIDs(selectedLabels);\r\n }, [selectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (updatedLabels && updatedLabels.updateType === 'delete')\r\n refreshSearchParams();\r\n }, [updatedLabels, refreshSearchParams]);\r\n\r\n const labelChangeHandler = (ids: number[]) => {\r\n saveGlobalLabelFilters(ids);\r\n };\r\n\r\n const filterStatusHandler = (status: EnrollmentStatus[]) => {\r\n setCustom('filterByStatus', status);\r\n };\r\n\r\n const filterOverdueHandler = (hasOverdue: boolean) => {\r\n setFilter({\r\n field: 'hasOverdue',\r\n value: hasOverdue,\r\n });\r\n };\r\n\r\n const isListEmpty =\r\n !practisSets || (practisSets && !practisSets.items.length);\r\n\r\n const isFilteredByOverdue = searchParams.filters?.some(\r\n item => item.field === 'hasOverdue' && item.value === true\r\n );\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n updateAllSelectedPractisSets([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n updateAllPractisSetsCheck(true);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n updateAllPractisSetsCheck(event.target.checked);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const isMasterCheckBoxChecked =\r\n !!selectedPractisSets && !!selectedPractisSets.length;\r\n\r\n const isMasterCheckBoxDisabled =\r\n !practisSets || (practisSets && practisSets.items.length < 1);\r\n\r\n /**\r\n * @function onRowClick\r\n * @param { TrainingPractisSet } set\r\n * @returns { void }\r\n */\r\n const onRowClick = (set: TrainingPractisSet) => {\r\n handleRedirection(set.practisSetId);\r\n };\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { TrainingPractisSet } set\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (set: TrainingPractisSet): boolean =>\r\n !!selectedPractisSets &&\r\n !!set.practisSetId &&\r\n selectedPractisSets.includes(set.practisSetId);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { TrainingPractisSet } set\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, set: TrainingPractisSet) => {\r\n handlePractisSetCheck(event, set);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { TrainingPractisSet } set\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (set: TrainingPractisSet): boolean => {\r\n return labelsOpen === set.practisSetId;\r\n };\r\n\r\n /**\r\n * @function onDeleteLabelHandler\r\n * @param { number } labelId\r\n * @param { TrainingPractisSet } set\r\n * @returns { void }\r\n */\r\n const onDeleteLabelHandler = (\r\n labelId: number,\r\n set: TrainingPractisSet\r\n ): void => {\r\n handleAssignedLabelDelete(labelId, set.practisSetId);\r\n };\r\n\r\n // Listen To Assign Users And Due Date -- Refresh the page after assign users\r\n useEffect(() => {\r\n onListenEvent(EventNameList[REFRESH_TRAINING_PAGE], refreshData);\r\n\r\n return () => {\r\n onRemoveEvent(EventNameList[REFRESH_TRAINING_PAGE], refreshData);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <MainWrapper\r\n title=\"Team\"\r\n tabs={<TeamsPageNavigation teamName={team?.name} />}\r\n subHeader={\r\n <Subheader\r\n practisSetsCount={team?.countPractisSets}\r\n usersCount={team?.countMembers}\r\n teamLeadersCount={team?.leaders?.length}\r\n />\r\n }\r\n goBackUrl={ROUTES.TEAMS_PAGES.LIST_OF_TEAMS}\r\n useGoBack={!!history.location.state?.useGoBack}\r\n subTitle={team?.name}\r\n htmlPageTitle={`Teams ${team ? `- ${team.name}` : ''} - Practis`}\r\n dataTest=\"team\"\r\n >\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={practisSets?.items}\r\n selectedLabels={selectedLabels}\r\n cornered={selectedLabels && !!selectedLabels.length}\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: \"team-timestamp\",\r\n }}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: practisSets?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: () => {}, // pageIndex change automatically renders next/prev page data\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n countAppliedFiltersCount(searchParams),\r\n dataTest: \"team-paging\",\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled:\r\n isListEmpty && !searchParams.searchTerm.length,\r\n dataTest: \"team-search\",\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedPractisSets) &&\r\n !lodashIsEmpty(practisSets),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedPractisSets?.length,\r\n totalCount: practisSets?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled:\r\n !selectedPractisSets ||\r\n (selectedPractisSets &&\r\n !selectedPractisSets.length),\r\n onExportClicked: onExportClicked,\r\n showExportPermissions: [\r\n NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET,\r\n ],\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <TrainingFilters\r\n preSelectedLabels={selectedLabels || []}\r\n onStatusChange={filterStatusHandler}\r\n status={\r\n searchParams.filterByStatus as EnrollmentStatus[]\r\n }\r\n onLabelsChange={labelChangeHandler}\r\n onSuccessApply={() => hide()}\r\n onOverdueChange={filterOverdueHandler}\r\n overdue={isFilteredByOverdue}\r\n />\r\n )}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n horizontalOffset={256}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={countAppliedFiltersCount(\r\n searchParams\r\n )}\r\n disabled={\r\n (searchParams.searchTerm.length >\r\n 0 ||\r\n countAppliedFiltersCount(\r\n searchParams\r\n ) === 0) &&\r\n isListEmpty\r\n }\r\n dataTest=\"team-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && practisSets?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: NoTrainings,\r\n text: 'No Trainings Yet',\r\n dataTest: 'no-trainings-yet',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Trainings',\r\n dataTest: 'no-trainings-found',\r\n },\r\n noFilterResultsOptions: {\r\n icon: NoTrainingsFiltering,\r\n width: '160px',\r\n dataTest: 'no-filtering-criteria',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial: isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: onCheckMasterCheckbox,\r\n dataTest: 'training-master-checkbox'\r\n },\r\n columns: [\r\n {\r\n title: 'Practis Sets',\r\n width: 16.5,\r\n ...(isListEmpty ? null : hcName),\r\n disabled: isListEmpty,\r\n dataTest: 'practis-sets-column',\r\n },\r\n {\r\n title: 'Overdue',\r\n width: 8,\r\n ...(isListEmpty ? null : hcOverdue),\r\n disabled: isListEmpty,\r\n dataTest: 'overdue-column',\r\n },\r\n {\r\n width: 25,\r\n title: 'Team Member Status',\r\n multiHeaderContainerClassName:\r\n classes.teamMemberHeaderContainer,\r\n disabled: isListEmpty,\r\n dataTest: 'team-member-status-column',\r\n subColumns: [\r\n {\r\n title: 'Not Started',\r\n ...(isListEmpty ? null : hcPending),\r\n disabled: isListEmpty,\r\n dataTest: 'not-started-column',\r\n width: 28.5,\r\n },\r\n {\r\n title: 'In Progress',\r\n ...(isListEmpty ? null : hcInProgress),\r\n disabled: isListEmpty,\r\n dataTest: 'in-progress-column',\r\n width: 28.5,\r\n },\r\n {\r\n title: 'Completed',\r\n ...(isListEmpty ? null : hcCompleted),\r\n disabled: isListEmpty,\r\n dataTest: 'completed-column',\r\n width: 28.5,\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Last Training',\r\n width: 10.3,\r\n ...(isListEmpty ? null : hcLastTrainingAt),\r\n disabled: isListEmpty,\r\n dataTest: 'last-training-column',\r\n },\r\n {\r\n width: 9,\r\n },\r\n {\r\n width: 3,\r\n },\r\n ],\r\n rowConfig: {\r\n onRowClick: onRowClick,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n getLabelTagsProps: (set: TrainingPractisSet) => ({\r\n selectedLabels: set.labels || [],\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_PRACTIS_SET_LABEL,\r\n ],\r\n onDeleteLabel: (labelId: any) =>\r\n onDeleteLabelHandler(labelId, set),\r\n }),\r\n dataTest: 'practis-set-item',\r\n cells: [\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n set: TrainingPractisSet\r\n ) => !set?.name,\r\n fieldProps: {\r\n isOverFlowText: true,\r\n renderTitle: (set: TrainingPractisSet) =>\r\n set.name,\r\n dataTest: 'practis-set-name',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n set: TrainingPractisSet\r\n ) => !set.isOverdue,\r\n fieldProps: {\r\n renderTitle: (set: TrainingPractisSet) =>\r\n set.isOverdue && <span data-test=\"overdue-icon\"><OverdueFlag /></span>,\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (\r\n set: TrainingPractisSet\r\n ) => (\r\n <WrapperTableCell isTeamMembers={true}>\r\n <TeamMemberStatusCell width={33}>\r\n {set?.pendingEnrollmentCount ? (\r\n <span data-test=\"not-started-count\">\r\n {\r\n set?.pendingEnrollmentCount\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TeamMemberStatusCell>\r\n <TeamMemberStatusCell width={33}>\r\n {set?.inProgressEnrollmentCount ? (\r\n <span data-test=\"in-progress-count\">\r\n {\r\n set?.inProgressEnrollmentCount\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TeamMemberStatusCell>\r\n <TeamMemberStatusCell width={33}>\r\n {set?.completedEnrollmentCount ? (\r\n <span data-test=\"completed-count\">\r\n {\r\n set?.completedEnrollmentCount\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TeamMemberStatusCell>\r\n </WrapperTableCell>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n set: TrainingPractisSet\r\n ) => !set.lastTraining,\r\n fieldProps: {\r\n renderTitle: (set: TrainingPractisSet) =>\r\n formatDate(set.lastTraining),\r\n dataTest: 'last-training-date',\r\n },\r\n },\r\n {\r\n fieldType: 'LABEL_TAGS',\r\n fieldProps: {\r\n getLabelTagsProps: (\r\n set: TrainingPractisSet\r\n ) => ({\r\n open: labelsOpen === set.practisSetId,\r\n toggleOpen: () =>\r\n handleToggleLabels(\r\n set.practisSetId\r\n ),\r\n selectedLabels: set.labels,\r\n dataTest: 'practis-set-labels',\r\n }),\r\n className: classes.labelsCellStyle,\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n set: TrainingPractisSet\r\n ) => (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName:\r\n 'practisSetsTraining',\r\n scope: 'assignLabels',\r\n }}\r\n >\r\n <ListActions\r\n practisSet={set}\r\n handleRedirection={\r\n handleRedirection\r\n }\r\n onExportSinglePractisClicked={\r\n onExportSinglePractisClicked\r\n }\r\n profile={profile}\r\n team={team}\r\n isHidden={\r\n !!selectedPractisSets?.length\r\n }\r\n />\r\n </WithLabelsContext.Provider>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nexport const PractisSetProgressContainer: FC = () => {\r\n const state = useTrainerPractisSetState();\r\n const profile = useSelector(getProfileState);\r\n const history = useHistory();\r\n const company = useSelector(getCompanyState);\r\n const params: { teamId: string } = useParams();\r\n const searchTrainingPractisSets = useSearchTrainingPractisSets(\r\n params.teamId\r\n );\r\n const { data: teamData } = useTeamMembersState();\r\n\r\n const labels = useLabelsState();\r\n const deleteTeamPractisSetLabel = useDeleteTeamPractisSetLabelService();\r\n const updatedProgress = useUpdatedProgressState();\r\n const updateAllSelectedPractisSets =\r\n useUpdateAllSelectedPractisSetsStateService();\r\n const updateSelectedPractisSet = useUpdateSelectedPractisSetStateService();\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const getPractisSetReports = useGetPractisSetsReportService();\r\n const getTeamInfo = useGetTeamInfoTrainingService();\r\n const saveGlobalLabelFilters = useSaveUserFiltersService();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const searchState = useSelector(getSecondarySearchState);\r\n\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'practisSetsTraining',\r\n }}\r\n >\r\n <PractisSetProgress\r\n profile={profile}\r\n history={history}\r\n params={params}\r\n company={company}\r\n searchPractisSets={searchTrainingPractisSets}\r\n practisSets={state.data}\r\n team={teamData}\r\n selectedPractisSets={state.selectedPractisSets}\r\n selectedLabels={labels.selected}\r\n deleteTeamPractisSetLabel={deleteTeamPractisSetLabel}\r\n updatedProgress={updatedProgress.data}\r\n loading={state.loading}\r\n updateAllSelectedPractisSets={updateAllSelectedPractisSets}\r\n updateSelectedPractisSet={updateSelectedPractisSet}\r\n assignedLabels={labels.assignedLabels}\r\n setAssignLabelsAction={setAssignLabelsAction}\r\n getPractisSetReports={getPractisSetReports}\r\n getSingleTeam={getTeamInfo}\r\n saveGlobalLabelFilters={saveGlobalLabelFilters}\r\n updatedLabels={updatedLabels}\r\n searchState={searchState}\r\n />\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport default PractisSetProgressContainer;\r\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const User = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 48 48\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M43.616 35.906c-1.337-1.203-12.154-3.808-14.258-4.306 5.428-2.856 8.786-9.77 8.787-16.286C38.145 6.857 35.572 0 23.996 0 12.421 0 9.848 6.857 9.848 15.314c0 6.542 3.388 13.48 8.855 16.315-2.436.565-12.923 3.054-14.288 4.277C1.957 38.104.962 44.701 3.42 48l20.678-.005 20.49.005c2.437-3.3 1.466-9.896-.971-12.094zM13.006 15.37c0-6.836 1.831-12.38 10.99-12.38s10.99 5.543 10.99 12.38c0 5.688-2.97 11.973-7.844 13.944v5.194h1.493c5.925 1.242 11.343 2.958 12.96 3.718 1.01 1.14 1.647 4.506 1.014 6.775l-18.514-.005-18.706.005c-.637-2.269.02-5.645 1.046-6.777 1.61-.772 7.12-2.486 13.117-3.716h1.306v-5.19c-4.88-1.967-7.853-8.257-7.853-13.948z\" clipRule=\"evenodd\"/>\n </svg>\n );\n }\n);\n\nexport default User;\n","const secondsToMin = (tt?: number | null): string => {\n if (!tt) return '0m 0s';\n const time = Number(tt.toFixed());\n const min = ~~(time / 60);\n const sec = time % 60;\n let sec_min = '';\n sec_min += '' + min + 'm ' + (sec < 10 ? '' : '');\n sec_min += '' + sec + 's';\n return sec_min;\n};\n\nexport const secondsToMinSimple = (tt?: number | null): string => {\n if (!tt) return '0 Min';\n\n if (tt < 60) {\n return `1 min`;\n } else {\n return `${Math.round((tt / 60)).toFixed()} min`;\n }\n};\n\nexport const secondsToMinFormatted = (tt?: number | null): string => {\n if (!tt) return '00:00';\n const time = Number(tt.toFixed());\n const hr = ~~(time / 3600);\n const min = ~~((time % 3600) / 60);\n const sec = time % 60;\n let sec_min = '';\n if (hr > 0) {\n sec_min += hr + ':';\n }\n sec_min += `${min < 10 ? '0' : ''}` + min + ':' + (sec < 10 ? '0' : '');\n sec_min += '' + sec + '';\n return sec_min;\n};\n\nexport default secondsToMin;\n","import { SearchParams } from '../../../../constants/interfaces/filters';\n\n/**\n * @function countAppliedFiltersCount\n * @param { SearchParams } searchParams\n * @returns { number }\n */\nexport const countAppliedFiltersCount = (\n searchParams: SearchParams\n): number => {\n let total = 0;\n\n if (searchParams?.filterByRegistrationStatus?.length) {\n total = total + searchParams.filterByRegistrationStatus.length;\n }\n\n if (searchParams?.labelIDs?.length) {\n total =\n total + searchParams.labelIDs.filter((id: number) => id > 0).length;\n }\n\n if (\n searchParams?.filters?.some(\n item => item.field === 'hasOverdue' && item.value === true\n )\n ) {\n total += 1;\n }\n\n return total;\n};\n\n\n/**\n * @function countPractisSetDetailsAppliedFiltersCount\n * @param { SearchParams } searchParams \n * @returns { number }\n */\nexport const countPractisSetDetailsAppliedFiltersCount = (searchParams: SearchParams) => {\n let total = 0;\n\n if (searchParams?.filterByStatus?.length) {\n total = total + searchParams.filterByStatus.length;\n }\n\n if (searchParams?.filterByRegistrationStatus?.length) {\n total = total + searchParams.filterByRegistrationStatus.length;\n }\n\n if(searchParams?.filterByDueDate?.length) {\n total+=searchParams?.filterByDueDate?.length;\n }\n\n return total;\n};\n\n","import React, { ChangeEvent, FC, useCallback, useState } from 'react';\nimport { kebabCase } from 'lodash';\nimport styled from 'styled-components';\nimport { EnrollmentStatusEnum } from '../../../../../../constants/interfaces/Enrollments';\nimport { Variables } from '../../../../../../theme/variables';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { TeamMemberStatusEnum } from '../../../../../../constants/interfaces/TeamMember';\nimport OverdueFlag from '../../../../../../ui/icons/OverdueFlag';\nimport { DueDateFilters } from '../../../../../../constants/interfaces/DueDates';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 166px;\n background-color: inherit;\n`;\n\nconst StatusItem = styled.div`\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst OverdueFlagWrapped = styled(OverdueFlag)`\n margin-left: 6px;\n`;\n\nconst overduesMap: Record<DueDateFilters, { title: string }> = {\n [DueDateFilters.ASSIGNED]: { title: 'Assigned' },\n [DueDateFilters.NO_DUEDATE]: { title: 'No Due Date' },\n [DueDateFilters.OVERDUE]: { title: 'Overdue' },\n};\n\nconst statusesMap: Record<EnrollmentStatusEnum, { title: string }> = {\n [EnrollmentStatusEnum.PENDING]: { title: 'Not Started' },\n [EnrollmentStatusEnum.IN_PROGRESS]: { title: 'In Progress' },\n [EnrollmentStatusEnum.COMPLETED]: { title: 'Completed' },\n};\n\nconst regStatusesMap: Record<any, { title: string }> = {\n [TeamMemberStatusEnum.PENDING]: { title: 'Pending' },\n [TeamMemberStatusEnum.ACTIVE]: { title: 'Active' }\n};\n\nexport const TrainingDetailsFilters: FC<{\n status: EnrollmentStatusEnum[];\n registrationStatus: any;\n onStatusChange: (status: EnrollmentStatusEnum[]) => void;\n onSuccessApply: () => void;\n onRegistrationStatusChange: (status: any) => void;\n onOverdueChange: (dueDate: DueDateFilters[]) => void;\n dueDate: DueDateFilters[];\n}> = ({ onStatusChange, status, registrationStatus, onSuccessApply, onRegistrationStatusChange, onOverdueChange, dueDate }) => {\n const [statuses, setStatuses] = useState(status);\n const [overdues, setOverdues] = useState(dueDate);\n const [registrationStatuses, setRegistrationStatuses] = useState<any>(registrationStatus)\n\n const onStatusChangeHandler = useCallback(\n (statusIn: EnrollmentStatusEnum, e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setStatuses([...statuses, statusIn]);\n } else {\n setStatuses(statuses.filter(item => item !== statusIn));\n }\n },\n [setStatuses, statuses]\n );\n\n const onOverdueChangeHandler = useCallback(\n (dueDateIn: DueDateFilters, e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setOverdues([...overdues, dueDateIn]);\n } else {\n setOverdues(overdues.filter(item => item !== dueDateIn));\n }\n },\n [overdues, setOverdues]\n );\n\n const onRegistrationStatusChangeHandler = useCallback(\n (statusIn: TeamMemberStatusEnum, e: ChangeEvent<HTMLInputElement>) => {\n \n if (e.target.checked) {\n setRegistrationStatuses([...registrationStatuses, statusIn]);\n } else {\n setRegistrationStatuses(registrationStatuses.filter((item: any) => item !== statusIn));\n }\n },\n [setRegistrationStatuses, registrationStatuses]\n );\n\n const onApplyHandler = useCallback(() => {\n onStatusChange(statuses);\n onRegistrationStatusChange(registrationStatuses)\n onSuccessApply();\n onOverdueChange(overdues);\n }, [onStatusChange, statuses, onRegistrationStatusChange, registrationStatuses, onSuccessApply, onOverdueChange, overdues]);\n\n const onClearHandler = () => {\n setStatuses([]);\n setRegistrationStatuses([]);\n setOverdues([]);\n }\n\n const totalFiltersSelected = statuses.length + \n registrationStatuses.length + overdues.length;\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Registration Status'} dataTest=\"registration-status-section-title\">\n <StatusContainer>\n {(Object.keys(\n regStatusesMap\n ) as TeamMemberStatusEnum[]).map(item => (\n <StatusItem data-test=\"registration-status-item-container\">\n <Checkbox\n key={item}\n checked={registrationStatuses && registrationStatuses.includes(item)}\n handleChange={e =>\n onRegistrationStatusChangeHandler(item, e)\n }\n label={regStatusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={`${regStatusesMap[item].title.toLowerCase()}-status-checkbox`}\n />\n </StatusItem>\n ))}\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Progress Status'} dataTest=\"progress-status-section-title\">\n <StatusContainer>\n {(Object.keys(\n statusesMap\n ) as EnrollmentStatusEnum[]).map(item => (\n <StatusItem data-test=\"progress-status-item-container\">\n <Checkbox\n key={item}\n checked={statuses.includes(item)}\n handleChange={e =>\n onStatusChangeHandler(item, e)\n }\n label={statusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={`${kebabCase(statusesMap[item].title)}-status-checkbox`}\n />\n </StatusItem>\n ))}\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Due Date'} dataTest=\"due-date-section-title\">\n <StatusContainer>\n {(Object.keys(\n overduesMap\n ) as DueDateFilters[]).map(item => (\n <StatusItem>\n <Checkbox\n key={item}\n checked={overdues.includes(item)}\n handleChange={e =>\n onOverdueChangeHandler(item, e)\n }\n label={overduesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={`${kebabCase(overduesMap[item].title)}-checkbox`}\n />\n {item === DueDateFilters.OVERDUE && <span data-test=\"overdue-checkbox-icon\"><OverdueFlagWrapped /></span>}\n </StatusItem>\n ))}\n </StatusContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant={'inverse'}\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={() => onApplyHandler()}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n\nexport default TrainingDetailsFilters;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { rgba } from 'polished';\n\nimport { Variables } from '../../../../theme/variables';\n\nconst Container = styled.div`\n border-radius: 100px;\n overflow: hidden;\n display: block;\n`;\n\nconst Tray = styled.div<{\n value: number;\n completed?: boolean;\n full?: boolean;\n color: string;\n completedColor: string;\n newProgressBar?: boolean\n}>`\n\n height: ${props => props.newProgressBar ? '4px' : '24px'};\n width: 100%;\n position: relative;\n background: ${props => props.newProgressBar ? props.theme.Colors.whiteThree : props.theme.Colors.whiteFive};\n border-radius: 12px;\n border: solid 1px ${props => !props.newProgressBar ? props.theme.Colors.cloudyBlue : 'transparent'};\n &&:before {\n background: none repeat scroll 0 0\n ${props =>\n !!props.completed\n ? rgba(props.completedColor, props.newProgressBar ? 1 : 0.15)\n : rgba(props.color, props.newProgressBar ? 1 :0.15)};\n content: '';\n position: absolute;\n top: -1px;\n bottom: -1px;\n left: -1px;\n right: -1px;\n ${props =>\n props.value && !props.newProgressBar &&\n `border: solid 1px ${\n !!props.completed ? props.completedColor : props.color\n };`}\n ${props =>\n props.full || props.completed\n ? `\n border-radius: 12px;`\n : `\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n `};\n ${props =>\n (!props.full && !props.completed) && ` width: ${props.value ? props.value : 0}%;`}\n\n ${props =>\n props.newProgressBar && props.value === 0 && `width: 4px !important;`}\n }\n`;\n\nconst ValueLabel = styled.div<{\n color?: string;\n isSmallerScreen?: boolean;\n completed?: boolean;\n}>`\n font-size: 11px;\n color: ${props =>\n props.completed ? props.color : props.theme.Colors.steelGrey};\n height: 100%;\n top: 0;\n z-index: 1;\n ${props => !props.isSmallerScreen && 'position: absolute; right: 16px;'}\n display: flex;\n ${props => !!props.isSmallerScreen && 'justify-content: center;'}\n align-items: center;\n padding: 0 5px;\n font-weight: 500;\n`;\n\nexport const ProgressBar: FC<{\n value: number;\n text?: string;\n color?: string;\n isCompleted?: boolean;\n isFull?: boolean;\n completedColor?: string;\n isSmallerScreen?: boolean;\n newProgressBar?: boolean\n}> = ({\n value,\n text,\n color,\n isCompleted,\n isFull,\n completedColor,\n isSmallerScreen,\n newProgressBar \n}) => {\n return (\n <Container>\n <Tray\n value={value}\n color={color || Variables.Colors.skyBlueTwo}\n completed={isCompleted}\n full={isFull}\n completedColor={completedColor || Variables.Colors.topaz}\n newProgressBar={newProgressBar}\n >\n <ValueLabel\n color={completedColor || Variables.Colors.topaz}\n isSmallerScreen={isSmallerScreen}\n completed={isCompleted}\n >\n {newProgressBar ? null : text\n ? text\n : isCompleted\n ? `Completed on ${value}%`\n : `${value}%`}\n </ValueLabel>\n </Tray>\n </Container>\n );\n};\n","import { memo } from 'react';\n\nimport { StripedProgressBarInterface } from './types';\n\nfunction StripedProgressBarView(props: StripedProgressBarInterface) {\n const { percentage = 0, dataTest } = props;\n\n return (\n <div className=\"progress-container\">\n <div className=\"progress-title\" data-test={dataTest && `${dataTest}-completed-value`}>Completed {percentage}%</div>\n <div className=\"progress progress-striped active\">\n <div\n style={{ width: `${percentage}%` }}\n className=\"progress-bar\"\n data-test={dataTest && `${dataTest}-bar`}\n ></div>\n </div>\n </div>\n );\n}\n\nexport default memo(StripedProgressBarView);\n","import React, { FC } from 'react';\nimport { formatMMDDYY } from '../../../../../../helpers/functions/date-convert';\nimport styled from 'styled-components';\nimport { ProgressBar } from '../../../../../../ui/components/ProgressBar';\nimport { EnrollmentStatus, EnrollmentStatusEnum } from '../../../../../../constants/interfaces/Enrollments';\nimport { Variables } from '../../../../../../theme/variables';\nimport { statusesMap } from '../../../../../../constants/variables/general';\n\n\nconst ProgressBarContainer = styled.div`\n width: 100%;\n`;\n\nconst InfoWrapper = styled.div<{calculatePercent?: number}>`\n display: flex;\n align-items: center;\n color: ${props => props.calculatePercent === 100 ? props.theme.Colors.darkGreen : 'auto'};\n`;\n\nconst CompletedAtWrapper = styled.div`\n color: ${props => props.theme.Colors.darkGreen};\n \n`;\n\nconst GreenDot = styled.div`\n background: ${props => props.theme.Colors.darkGreen};\n width: 4px;\n height: 4px;\n border-radius: 50%;\n margin: 0 5px 0 6px;\n`;\n\nconst GeneralProgressCol: FC<{\n count?: number;\n max?: number;\n passedScenarios?: number;\n totalScenarios?: number;\n status?: string | '';\n completedAt?: any,\n dataTest?: string,\n}> = ({ count, max, status, completedAt, dataTest }) => {\n \n if (status === EnrollmentStatus.PENDING) {\n return <>{statusesMap[EnrollmentStatus.PENDING]?.title}</>;\n }\n \n if (!max || count === 0) {\n return (\n <ProgressBarContainer data-test={dataTest}>\n <InfoWrapper>\n <span data-test={dataTest && `${dataTest}-count`}>0%</span>\n </InfoWrapper>\n <ProgressBar newProgressBar value={0} color={Variables.Colors.mainBlue} />\n </ProgressBarContainer>\n );\n }\n\n return (\n <ProgressBarContainer>\n <InfoWrapper calculatePercent={count || 0} data-test={dataTest}>\n <span data-test={dataTest && `${dataTest}-count`}>{count || 0}%</span>\n {completedAt && <GreenDot></GreenDot>}\n <CompletedAtWrapper>\n {formatMMDDYY(completedAt)}\n </CompletedAtWrapper>\n </InfoWrapper>\n <ProgressBar\n newProgressBar\n color={Variables.Colors.mainBlue}\n completedColor={Variables.Colors.topaz}\n value={count || 0}\n isFull={(count || 0) >= max}\n isCompleted={\n status === EnrollmentStatusEnum.COMPLETED\n ? true\n : count === max\n }\n />\n </ProgressBarContainer>\n );\n};\n\nexport default GeneralProgressCol;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PlusInCircleIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.343 2.343a8 8 0 1 0 11.314 11.314A8 8 0 0 0 2.343 2.343zm1.06 10.253a6.5 6.5 0 1 1 9.193-9.192 6.5 6.5 0 0 1-9.192 9.192z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 7.25V4h1.5v3.25H12v1.5H8.75V12h-1.5V8.75H4v-1.5h3.25z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n\nexport default PlusInCircleIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ViewPractisSetIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.573 2.573A.25.25 0 0 1 1.75 2.5h12.5a.25.25 0 0 1 .25.25v1.5a.25.25 0 0 1-.25.25H1.75a.25.25 0 0 1-.25-.25v-1.5a.25.25 0 0 1 .073-.177zM1.75 1A1.75 1.75 0 0 0 0 2.75v1.5A1.75 1.75 0 0 0 1.75 6h12.5A1.75 1.75 0 0 0 16 4.25v-1.5A1.75 1.75 0 0 0 14.25 1H1.75zm0 6h.75v6.25c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V7H15v6.25A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25V7h.75zm8 2.5H11V8H5v1.5h4.75z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n\nexport default ViewPractisSetIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ExportReportIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.893 1.6a.316.316 0 0 0-.195.075.307.307 0 0 0-.076.192v12.266a.272.272 0 0 0 .27.267h9.194a.262.262 0 0 0 .253-.163.254.254 0 0 0 .017-.104V6.4h-2.974a1.904 1.904 0 0 1-1.342-.544 1.855 1.855 0 0 1-.55-1.323V1.6H4.892zm6.218.597v2.336a.272.272 0 0 0 .27.267h2.37l-2.64-2.603zM3 1.867c0-.495.2-.97.554-1.32C3.91.197 4.391 0 4.893 0h5.526a1.883 1.883 0 0 1 1.33.544l3.7 3.648A1.845 1.845 0 0 1 16 5.504v8.63a1.834 1.834 0 0 1-.559 1.33 1.885 1.885 0 0 1-1.355.536H4.893a1.905 1.905 0 0 1-1.342-.544A1.856 1.856 0 0 1 3 14.133V1.867z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1.048 5h5.904A1.048 1.048 0 0 1 8 6.048v5.903A1.048 1.048 0 0 1 6.952 13H1.258A1.258 1.258 0 0 1 0 11.742V6.048A1.048 1.048 0 0 1 1.048 5z\"\n fill=\"currentColor\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.055 9.584 2.758 12H1l2.085-3.017L1.23 6h1.806l1.019 2.315L5.388 6H7L5.048 8.983 7 11.933 5.303 12 4.055 9.584z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n);\n\nexport default ExportReportIcon;\n","export const DEFAULT_LIMIT = 20;\nexport const MAX_SELECTED_ALL_ITEMS = 20;\nexport const MIN_ITEMS_TO_SHOW_MODAL = 30;\nexport const UPDATE_LABEL_ACTION = 'UPDATE_LABEL_ACTION';\nexport const UPDATE_MULTIPLE_LABEL_ACTION = 'UPDATE_MULTIPLE_LABEL_ACTION';\nexport const NUDGE_USERS_ACTION = 'NUDGE_USERS_ACTION';","import { useCallback } from 'react';\nimport { isEmpty } from 'lodash';\nimport dayjs from 'dayjs';\n\nimport { DATE_TIME_FORMAT } from '../../ui/components/Calendar/constants';\nimport { SearchParams } from '../../constants/interfaces/filters';\nimport { SearchUsersParams } from '../../api/users/types';\nimport { getSearchSortingValue } from '../../helpers/functions/search-params-helpers';\nimport { UserStatus } from '../../features/users/store/costants';\nimport {\n useNudgeUsersApi,\n useSearchPractisSetDetailsUsersApi,\n useSearchUsersApi,\n useGetOverdueLearners\n} from '../../api';\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\nimport { ErrorResult } from '../../constants/interfaces/ErrorResult';\nimport { NudgeData, NudgeDateType } from '../../api/alert/types';\nimport { NudgeUserSenderData, SearchUsersFunctionParams } from './types';\nimport { createSearchPractisSetDetailsParams } from '../../features/teams/tools';\n\n/**\n * @function generateCopyOfEntityName\n * @param { string } entityName\n * @returns { string }\n */\nexport const generateCopyOfEntityName = (entityName: string): string => {\n const newDataTimeFormatPrefix = `[${dayjs(new Date()).format(\n DATE_TIME_FORMAT\n )}]`;\n\n const splittedTeamName = entityName.split('-');\n\n // It already contains DateTime prefix.\n if (\n splittedTeamName?.[0].includes('AM') ||\n splittedTeamName?.[0].includes('PM')\n ) {\n const newTeamName = splittedTeamName.pop();\n return `${newDataTimeFormatPrefix} - ${newTeamName}`;\n }\n\n return `${newDataTimeFormatPrefix} - ${entityName}`;\n};\n\n/**\n * @function useSearchUsersWithEnrollmentAndNudge\n * @returns { CallableFunction }\n */\nconst useSearchUsersWithEnrollmentAndNudge = () => {\n const searchPractisSetDetailsUsers = useSearchPractisSetDetailsUsersApi();\n const nudgeUsers = useNudgeUsersApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n async (\n searchParams: SearchParams,\n teamId: string,\n practisSetId: string,\n senderData: NudgeUserSenderData,\n onSuccessCallback: () => void\n ) => {\n const searchPractisSetDetailsParams =\n createSearchPractisSetDetailsParams(searchParams);\n\n await searchPractisSetDetailsUsers(teamId, practisSetId, {\n ...searchPractisSetDetailsParams,\n })\n .then(async response => {\n if (!isEmpty(response.items)) {\n const nudgeUsersData = response.items.map(\n item =>\n ({\n type: 'enrollment',\n enrollmentId: item.id,\n receiverId: item.user.id,\n ...senderData,\n } as NudgeData)\n );\n\n await nudgeUsers(nudgeUsersData)\n .then(onSuccessCallback)\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [nudgeUsers, searchPractisSetDetailsUsers, showMessage]\n );\n};\n\n/**\n * @function useSearchCommonUsersAndNudge\n * @returns { CallableFunction }\n */\nconst useSearchCommonUsersAndNudge = () => {\n const searchUsersApi = useSearchUsersApi();\n const nudgeUsers = useNudgeUsersApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n async (\n searchParams: SearchParams,\n companyId: number,\n senderData: NudgeUserSenderData,\n onSuccessCallback: () => void\n ) => {\n const searchRegisteredUsersParams: SearchUsersParams = {\n status: UserStatus.ACTIVE,\n roles: searchParams.roleIDs?.join(','),\n labels: searchParams.labelIDs?.join(','),\n teams: searchParams.teamIds?.join(','),\n companies: companyId.toString(),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\n };\n\n await searchUsersApi({ ...searchRegisteredUsersParams })\n .then(async response => {\n if (!isEmpty(response.items)) {\n const nudgeUsersData = response.items.map(\n item =>\n ({\n type: 'common',\n enrollmentId: null,\n receiverId: item.id,\n ...senderData,\n } as NudgeData)\n );\n\n await nudgeUsers(nudgeUsersData)\n .then(onSuccessCallback)\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [nudgeUsers, searchUsersApi, showMessage]\n );\n};\n\n/**\n * @function useSearchOverdueLearnersAndNudge\n * @returns { CallableFunction }\n */\nconst useSearchOverdueLearnersAndNudge = () => {\n const searchOverdueLearnersApi = useGetOverdueLearners();\n const nudgeUsers = useNudgeUsersApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n async (\n searchParams: SearchParams,\n companyId: number,\n senderData: NudgeUserSenderData,\n onSuccessCallback: () => void\n ) => {\n const sp = {\n teams: searchParams.teamIds?.join(','),\n labels: searchParams.labelIDs?.join(','),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'user_name', true),\n companies: companyId.toString()\n }\n await searchOverdueLearnersApi(sp)\n .then(async response => {\n if (!isEmpty(response.items)) {\n const nudgeUsersData = response.items.map(\n item =>\n ({\n type: 'overdue',\n enrollmentId: null,\n receiverId: item.id,\n ...senderData,\n } as NudgeData)\n );\n\n await nudgeUsers(nudgeUsersData)\n .then(onSuccessCallback)\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [nudgeUsers, searchOverdueLearnersApi, showMessage]\n );\n};\n\n/**\n * @function useHandleSearchUsersAndNudge\n * @param { NudgeDateType } type\n * @returns { CallableFunction }\n */\nexport const useHandleSearchUsersAndNudge = (type: NudgeDateType) => {\n const searchCommonUsersAndNudge = useSearchCommonUsersAndNudge();\n const searchUsersWithEnrollmentAndNudge =\n useSearchUsersWithEnrollmentAndNudge();\n const searchOverdueLearnersAndNudge = useSearchOverdueLearnersAndNudge();\n\n return useCallback(\n async (\n searchParams: SearchParams,\n searchUsersFunctionParams: SearchUsersFunctionParams<typeof type>,\n senderData: NudgeUserSenderData,\n onSuccessCallback: () => void\n ) => {\n if (type === 'common') {\n const { companyId } =\n searchUsersFunctionParams as SearchUsersFunctionParams<'common'>;\n\n await searchCommonUsersAndNudge(\n searchParams,\n companyId,\n senderData,\n onSuccessCallback\n );\n } else if (type === 'overdue') {\n const { companyId } =\n searchUsersFunctionParams as SearchUsersFunctionParams<'overdue'>;\n\n await searchOverdueLearnersAndNudge(\n searchParams,\n companyId,\n senderData,\n onSuccessCallback);\n } else {\n const { teamId, practisSetId } =\n searchUsersFunctionParams as SearchUsersFunctionParams<'enrollment'>;\n await searchUsersWithEnrollmentAndNudge(\n searchParams,\n teamId,\n practisSetId,\n senderData,\n onSuccessCallback\n );\n } \n },\n [searchCommonUsersAndNudge, searchUsersWithEnrollmentAndNudge, type, searchOverdueLearnersAndNudge]\n );\n};","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { flatten, isEmpty } from 'lodash';\n\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../ui/components/ModalDialogs/store/actions';\nimport { useChunkRequestsService } from '../ChunkRequestService/hooks';\nimport { ChunkRequestActionInterface } from '../ChunkRequestService/hooks/types';\nimport {\n NudgeUsersChunkRequestParameters,\n NudgeUserSenderData,\n SearchUsersFunctionParams,\n UpdateLabelEntityType,\n updateLabelFetchEntityActionFunctionParametersType,\n UpdateLabelMultipleEntityType,\n UpdateLabelsParametersType,\n} from './types';\nimport { GeneralBulkActionModalInterface } from '../../ui/components/ModalDialogs/types';\nimport { MIN_ITEMS_TO_SHOW_MODAL, NUDGE_USERS_ACTION, UPDATE_LABEL_ACTION } from './constants';\nimport { ErrorResult } from '../../constants/interfaces/ErrorResult';\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\nimport { SearchParams } from '../../constants/interfaces/filters';\nimport { NudgeDateType } from '../../api/alert/types';\nimport { useHandleSearchUsersAndNudge } from './helpers';\nimport { ITEM_PER_CHUNK_SIZE } from '../ChunkRequestService/hooks/constants';\n\n/**\n * @function useUpdateLabelsBulkActionService\n * @param { Function } addLabelActionFunction\n * @param { Function } deleteLabelActionFunction\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @param { Function } onStartCallback\n * @returns { void }\n */\nexport function useUpdateLabelsBulkActionService(\n addLabelActionFunction: Function,\n deleteLabelActionFunction: Function,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void,\n onStartCallback?: () => void\n) {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const hideModalDialog = useHideModalDialog();\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const entityRef = useRef<UpdateLabelEntityType | null>(null);\n const { entityName = '', entityId = 0 } = entityRef.current! || {};\n\n const assignedLabelIdsRef = useRef<number[]>([]);\n const deletedLabelIdsRef = useRef<number[]>([]);\n\n const assignedLabelIds = assignedLabelIdsRef?.current;\n const deletedLabelIds = deletedLabelIdsRef.current;\n\n const shouldShowModals =\n assignedLabelIds.length + deletedLabelIds.length >=\n MIN_ITEMS_TO_SHOW_MODAL;\n\n const assignedLabels = assignedLabelIds?.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n\n const deletedLabels = deletedLabelIds?.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n\n const assignLabelsToEntityOptions = {\n parameters: {\n labels: assignedLabels,\n },\n fieldName: 'labels',\n };\n\n const deleteLabelsFromEntityOptions = {\n parameters: {\n labels: deletedLabels,\n },\n fieldName: 'labels',\n };\n\n const actionList: ChunkRequestActionInterface<UpdateLabelsParametersType>[] =\n [];\n\n if (!isEmpty(assignedLabelIds)) {\n actionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: addLabelActionFunction,\n actionFunctionOptions: assignLabelsToEntityOptions,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n actionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: deleteLabelActionFunction,\n actionFunctionOptions: deleteLabelsFromEntityOptions,\n });\n }\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Processing Labels',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n setIsRunning(false);\n onErrorCallback?.();\n }, [dispatch, hideModalDialog, onErrorCallback, shouldShowModals]);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n\n hideModalDialog();\n isRunning && setIsRunning(false);\n\n onSuccessCallback?.();\n });\n\n showMessage('Changes have been saved', 'success');\n }, [\n dispatch,\n hideModalDialog,\n isRunning,\n onSuccessCallback,\n shouldShowModals,\n ]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopBulkActionService\n * @returns { void }\n */\n const handleStopBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (!isEmpty(assignedLabelIds)) {\n setIsStopped(true);\n }\n\n isRunning && setIsRunning(false);\n hideModalDialog();\n\n onSuccessCallback?.();\n });\n }, [assignedLabelIds, hideModalDialog, isRunning, setIsStopped, dispatch]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Processing Labels',\n onStopBulkActionService:\n handleStopBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n onStartCallback?.();\n });\n }, [\n dispatch,\n handleStopBulkActionService,\n hideModalDialog,\n setIsStopped,\n shouldShowModals,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(\n (\n entity: UpdateLabelEntityType,\n assignedLabelIds: number[],\n deletedLabelIds: number[]\n ) => {\n entityRef.current = entity;\n assignedLabelIdsRef.current = assignedLabelIds;\n deletedLabelIdsRef.current = deletedLabelIds;\n\n setIsRunning(true);\n },\n []\n );\n}\n\n/**\n * @dev Use this hook to assign labels to multiple users/practisSets/teams.\n * @function useUpdateMultipleEntityLabelsBulkActionService\n * @param { Function } addLabelActionFunction\n * @param { Function } deleteLabelActionFunction\n * @param { boolean } isSelectAll\n * @param { Function } fetchEntityActionFunction\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { void }\n */\nexport function useUpdateMultipleEntityLabelsBulkActionService(\n addLabelActionFunction: Function,\n deleteLabelActionFunction: Function,\n isSelectAll: boolean,\n fetchEntityAction: ChunkRequestActionInterface<updateLabelFetchEntityActionFunctionParametersType>,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const hideModalDialog = useHideModalDialog();\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n let actionList: ChunkRequestActionInterface<\n | UpdateLabelsParametersType\n | updateLabelFetchEntityActionFunctionParametersType\n >[] = [];\n\n const entityRef = useRef<UpdateLabelMultipleEntityType | null>(null);\n const { entityName = '', entityIds = [] } = entityRef.current! || {};\n const totalCompletedItems = useRef<number>(0);\n\n const assignedLabelIdsRef = useRef<number[]>([]);\n const deletedLabelIdsRef = useRef<number[]>([]);\n\n const assignedLabelIds = assignedLabelIdsRef?.current;\n const deletedLabelIds = deletedLabelIdsRef.current;\n\n const shouldShowModals =\n isSelectAll ||\n (!isSelectAll &&\n (assignedLabelIds.length + deletedLabelIds.length) *\n entityIds.length >=\n MIN_ITEMS_TO_SHOW_MODAL);\n\n const assignedLabels = entityIds.map(entityId => {\n return assignedLabelIds.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n });\n\n const deletedLabels = entityIds.map(entityId => {\n return deletedLabelIds.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n });\n\n const assignLabelsToEntityOptions = {\n parameters: {\n labels: flatten(assignedLabels),\n },\n fieldName: 'labels',\n };\n\n const deleteLabelsFromEntityOptions = {\n parameters: {\n labels: flatten(deletedLabels),\n entityIds: [],\n },\n fieldName: 'labels',\n };\n\n /**\n * @function assignLabelsToEntityService\n * @param { { id: number, labels: number[] }[] } entityData\n * @returns { Promise<void> }\n */\n const assignLabelsToEntityService = useCallback(\n async (\n labels: number[],\n entityData: { id: number; labels: number[] }[]\n ) => {\n const entityIds = entityData?.map(entity => entity.id);\n const entityLabelIds = entityData?.map(\n entity => entity.labels\n )?.[0];\n\n const filteredAssignedLabelIds = labels.filter(\n labelId => !entityLabelIds.includes(labelId)\n );\n\n if (!isEmpty(entityIds) && !isEmpty(filteredAssignedLabelIds)) {\n const processedAssignedLabelIds = entityIds.map(entityId => {\n return filteredAssignedLabelIds.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n });\n\n if (!isEmpty(processedAssignedLabelIds)) {\n await addLabelActionFunction(\n flatten(processedAssignedLabelIds)\n ).then(\n () => (totalCompletedItems.current += entityIds.length)\n );\n }\n }\n },\n [addLabelActionFunction, entityName]\n );\n\n /**\n * @function deleteLabelsFromEntityService\n * @param { { id: number, labels: number[] }[] } entityData\n * @returns { Promise<void> }\n */\n const deleteLabelsFromEntityService = useCallback(\n async (\n labels: number[],\n entityData: { id: number; labels: number[] }[]\n ) => {\n const entityIds = entityData?.map(entity => entity.id);\n const entityLabelIds = entityData?.map(\n entity => entity.labels\n )?.[0];\n\n const filteredDeletedLabelIds = labels.filter(labelId =>\n entityLabelIds.includes(labelId)\n );\n\n if (!isEmpty(entityIds) && !isEmpty(filteredDeletedLabelIds)) {\n const processedDeletedLabelIds = entityIds.map(entityId => {\n return filteredDeletedLabelIds.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n });\n\n if (!isEmpty(processedDeletedLabelIds)) {\n await deleteLabelActionFunction(\n flatten(processedDeletedLabelIds)\n ).then(\n () => (totalCompletedItems.current += entityIds.length)\n );\n }\n }\n },\n [deleteLabelActionFunction, entityName]\n );\n\n /**\n * @function handleShowCompletedItemsMessage\n * @returns { void }\n */\n const handleShowCompletedItemsMessage = () => {\n const numberOfCompletedItems = isSelectAll\n ? totalCompletedItems.current\n : entityIds.length;\n\n const isSingleItem = numberOfCompletedItems === 1;\n\n showMessage(\n `Changes ${\n isSingleItem ? 'has' : 'have'\n } been saved for ${numberOfCompletedItems} item${\n !isSingleItem ? 's' : ''\n }`,\n 'success'\n );\n };\n\n if (isSelectAll) {\n const childActionList: ChunkRequestActionInterface<UpdateLabelsParametersType>[] =\n [];\n\n if (!isEmpty(assignedLabelIds)) {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: assignedLabelIds,\n entityIds: [],\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityIds',\n };\n\n childActionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: assignLabelsToEntityService,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n const deleteLabelsFromEntityServiceOptions = {\n parameters: {\n labels: deletedLabelIds,\n entityIds: [],\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityIds',\n };\n\n childActionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: deleteLabelsFromEntityService,\n actionFunctionOptions:\n deleteLabelsFromEntityServiceOptions as any,\n });\n }\n\n actionList.push({\n ...fetchEntityAction,\n childActionList: childActionList,\n });\n } else {\n if (!isEmpty(assignedLabelIds)) {\n actionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: addLabelActionFunction,\n actionFunctionOptions: assignLabelsToEntityOptions,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n actionList.push({\n actionName: UPDATE_LABEL_ACTION,\n actionFunction: deleteLabelActionFunction,\n actionFunctionOptions: deleteLabelsFromEntityOptions,\n });\n }\n }\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult) => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Processing Labels',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n setIsRunning(false);\n\n actionList = [];\n handleShowCompletedItemsMessage();\n\n totalCompletedItems.current = 0;\n\n onErrorCallback?.();\n },\n [dispatch, hideModalDialog, onErrorCallback, shouldShowModals]\n );\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n\n hideModalDialog();\n isRunning && setIsRunning(false);\n\n actionList = [];\n \n onSuccessCallback?.();\n });\n \n handleShowCompletedItemsMessage();\n\n totalCompletedItems.current = 0;\n }, [hideModalDialog, isRunning, onSuccessCallback, shouldShowModals]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopBulkActionService\n * @returns { void }\n */\n const handleStopBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n\n isRunning && setIsRunning(false);\n hideModalDialog();\n\n actionList = [];\n \n onSuccessCallback?.();\n });\n\n handleShowCompletedItemsMessage();\n\n totalCompletedItems.current = 0;\n }, [\n assignedLabelIds,\n isRunning,\n hideModalDialog,\n onSuccessCallback,\n setIsStopped,\n ]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Processing Labels',\n onStopBulkActionService:\n handleStopBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopBulkActionService,\n hideModalDialog,\n setIsStopped,\n shouldShowModals,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(\n (\n entity: UpdateLabelMultipleEntityType,\n assignedLabelIds: number[],\n deletedLabelIds: number[]\n ) => {\n entityRef.current = entity;\n assignedLabelIdsRef.current = assignedLabelIds;\n deletedLabelIdsRef.current = deletedLabelIds;\n\n setIsRunning(true);\n },\n []\n );\n}\n\n/**\n *\n * @description Custom hook to nudge users with chunk service\n * when all items are selected.\n * @function useNudgeUsersBulkActionService\n * @param { NudgeDateType } type\n * @param { SearchParams } searchParams\n * @param { number } totalUsersCount\n * @param { number } companyId\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useNudgeUsersBulkActionService(\n type: NudgeDateType,\n searchUsersFunctionParams: SearchUsersFunctionParams<typeof type>,\n searchParams: SearchParams,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const handleSearchUsersAndNudge = useHandleSearchUsersAndNudge(type);\n\n const senderDataRef = useRef<NudgeUserSenderData>({\n senderName: '',\n text: '',\n });\n\n const shouldShowModals = totalUsersCount > 20;\n\n const totalCompletedNudgedUsers = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<\n NudgeUsersChunkRequestParameters<typeof type>\n >[] = [\n {\n actionName: NUDGE_USERS_ACTION,\n actionFunction: handleSearchUsersAndNudge,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n offset: totalUsersCount,\n },\n searchUsersFunctionParams,\n senderData: senderDataRef.current,\n onSuccessCallback: () =>\n (totalCompletedNudgedUsers.current =\n totalCompletedNudgedUsers.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedNudgedUsers\n * @returns { void }\n */\n const clearTotalCompletedNudgedUsers = () =>\n (totalCompletedNudgedUsers.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n\n isRunning && setIsRunning(false);\n clearTotalCompletedNudgedUsers();\n\n showMessage('Messages were sent successfully', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Nudge Users',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n clearTotalCompletedNudgedUsers();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopNudgeUsersBulkActionService\n * @returns { void }\n */\n const handleStopNudgeUsersBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n totalCompletedNudgedUsers.current * ITEM_PER_CHUNK_SIZE\n } Messages were sent successfully`,\n 'success'\n );\n\n clearTotalCompletedNudgedUsers();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartNudgeUsersBulkActionService\n * @returns { void }\n */\n const handleStartNudgeUsersBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Nudge Users',\n onStopBulkActionService:\n handleStopNudgeUsersBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopNudgeUsersBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartNudgeUsersBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n /**\n * @param { NudgeUserSenderData } senderData\n */\n return useCallback((senderData: NudgeUserSenderData) => {\n senderDataRef.current = senderData;\n setIsRunning(true);\n }, []);\n}","export const DEFAULT_LIMIT = 20;\nexport const MAX_SELECTED_ALL_ITEMS = 20;\nexport const MIN_ITEMS_TO_SHOW_MODAL = 30;\nexport const UPDATE_TEAM_ACTION = 'UPDATE_TEAM_ACTION';\nexport const REMIND_TO_START_ACTION = 'REMIND_TO_START_ACTION';","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport {\n useAssignMembersToTeamsApi,\n useDeleteMembersFromTeamsApi,\n useSearchTeamMembersApi,\n useDeleteTeamsApi,\n useSearchTeamsApi,\n useCreateNewTeamApi,\n useAssignLabelsToTeamsApi,\n useSearchUsersApi,\n} from '../../../../api';\nimport {\n AssignedMemberToTeamType,\n DeletedMemberToTeamType,\n SearchTeamMembersParams,\n} from '../../../../api/teams/types';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\n\nimport { useChunkRequestsService } from '../../../../services/ChunkRequestService/hooks';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../ui/components/ModalDialogs/store/actions';\nimport { GeneralBulkActionModalInterface } from '../../../../ui/components/ModalDialogs/types';\nimport {\n bulkActionFunctionParametersType,\n RemindToStartChunkRequestParameters,\n} from './types';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport {\n createSearchTeamMembersParams,\n createSearchTeamsParams,\n} from '../../tools';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { TeamMember } from '../../../../constants/interfaces/TeamMember';\nimport {\n updateSingleTeamStart,\n updateSingleTeamSuccess,\n updateSingleTeamFailure,\n updateSingleTeamStop,\n} from '../../store/actions';\nimport {\n DEFAULT_LIMIT,\n MAX_SELECTED_ALL_ITEMS,\n MIN_ITEMS_TO_SHOW_MODAL,\n REMIND_TO_START_ACTION,\n UPDATE_TEAM_ACTION,\n} from './constants';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { CLIENT_SIDE_ERROR_MESSAGE } from '../../../../ui/components/ErrorMessages/constants';\nimport { Team } from '../../../../constants/interfaces/Team';\nimport { generateCopyOfEntityName } from '../../../../services/GeneralBulkActionServices/helpers';\nimport { useHandleSearchEnrollmentsAndRemind } from './helpers';\nimport { SearchUsersParams } from '../../../../api/users/types';\nimport { getSearchSortingValue } from '../../../../helpers/functions/search-params-helpers';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport { UserStatus } from '../../../users/store/costants';\n\n/**\n * @function useUpdateTeamMembersBulkActionService\n * @param { string } actionName\n * @param { Function } actionFunction\n * @param { Record<string, unknown>} actionFunctionOptions\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns\n */\nexport function useUpdateTeamMembersBulkActionService(\n action: ChunkRequestActionInterface<bulkActionFunctionParametersType>,\n modalTitle: string,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const { actionFunction, actionFunctionOptions } = action;\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n\n const {\n parameters: { selectedItemIds = null, itemsCount = 0 },\n } = actionFunctionOptions;\n\n const shouldShowModals =\n (!selectedItemIds && itemsCount >= MAX_SELECTED_ALL_ITEMS) ||\n (selectedItemIds && selectedItemIds.length >= MIN_ITEMS_TO_SHOW_MODAL);\n\n /**\n * @function handleSuccessBulkActionServiceCallback\n * @returns { void }\n */\n const handleSuccessBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n dispatch(updateSingleTeamSuccess());\n\n onSuccessCallback?.();\n }, [hideModalDialog, onSuccessCallback, shouldShowModals, dispatch]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n dispatch(updateSingleTeamFailure());\n\n onErrorCallback?.();\n }, [\n dispatch,\n hideModalDialog,\n modalTitle,\n onErrorCallback,\n shouldShowModals,\n ]);\n\n const { setIsStopped } =\n useChunkRequestsService<bulkActionFunctionParametersType>(\n [\n {\n actionName: UPDATE_TEAM_ACTION,\n actionFunction,\n actionFunctionOptions,\n },\n ],\n handleSuccessBulkActionServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopBulkActionService\n * @returns { void }\n */\n const handleStopBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n dispatch(updateSingleTeamStop());\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, dispatch]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle,\n onStopBulkActionService:\n handleStopBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n dispatch(updateSingleTeamStart());\n });\n }, [\n dispatch,\n handleStopBulkActionService,\n hideModalDialog,\n modalTitle,\n setIsStopped,\n shouldShowModals,\n ]);\n\n return {\n handleStartBulkActionService,\n handleStopBulkActionService,\n };\n}\n\n/**\n * @description function to duplicate a selected team.\n * Create new team by selected team's name at first then assign labels and members to\n * new created team by using chunk service if needed.\n * @function useDuplicateTeamBulActionService\n * @param { Function | undefined } onSuccessCallback\n * @param { Function | undefined } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useDuplicateTeamBulActionService(\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const actionList = useRef<any>([]);\n const newTeamDataRef = useRef<Team | null>(null);\n const { countMembers = 0, labels = [] } = newTeamDataRef.current || {};\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const createNewTeam = useCreateNewTeamApi();\n const assignLabelsToTeam = useAssignLabelsToTeamsApi();\n const getCurrentTeamMembers = useSearchTeamMembersApi();\n const assignMembersToTeam = useAssignMembersToTeamsApi();\n\n const shouldShowModals = countMembers > 0 || !isEmpty(labels);\n\n /**\n * @description fetch current team 'members' data and immediately\n * assign them to the new created (duplicated) team 20 by 20.\n * @function getCurrentTeamMembersAndAssignToNewTeam\n * @returns { void }\n */\n const getCurrentTeamMembersAndAssignToNewTeam = useCallback(\n async (\n currentTeamId: number,\n newTeamId: number,\n searchParams: SearchTeamMembersParams\n ) => {\n if (currentTeamId && newTeamId) {\n await getCurrentTeamMembers(currentTeamId, searchParams)\n .then(async (response: ListResult<TeamMember>) => {\n const members = response?.items?.map(item => ({\n userId: item.user.id,\n isTeamLead: item.isTeamLead ?? false,\n teamId: newTeamId,\n }));\n if (!isEmpty(members)) {\n await assignMembersToTeam(members).catch(\n (error: unknown) => {\n throw error;\n }\n );\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n }\n },\n [assignMembersToTeam, getCurrentTeamMembers]\n );\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Duplicate Team',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n isRunning && setIsRunning(false);\n\n actionList.current = [];\n onErrorCallback?.();\n }, [\n dispatch,\n hideModalDialog,\n isRunning,\n onErrorCallback,\n shouldShowModals,\n ]);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n\n hideModalDialog();\n isRunning && setIsRunning(false);\n\n showMessage('1 Team has been copied', 'success');\n\n actionList.current = [];\n onSuccessCallback?.();\n });\n }, [\n hideModalDialog,\n isRunning,\n onSuccessCallback,\n shouldShowModals,\n showMessage,\n ]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList.current,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDuplicateTeamBulkActionService\n * @returns { void }\n */\n const handleStopDuplicateTeamBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n onSuccessCallback?.();\n actionList.current = [];\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped]);\n\n /**\n * @description add assignMembers action item to main action list\n * @function handleAddAssignMembersActionToActionList\n * @param { number } currentTeamId\n * @param { number } newTeamId\n * @returns { void }\n */\n const handleAddAssignMembersActionToActionList = useCallback(\n (currentTeamId: number, newTeamId: number) => {\n const assignMembersToTeamOptions = {\n parameters: {\n currentTeamId,\n newTeamId,\n searchParams: {\n sort: 'name_asc',\n limit: DEFAULT_LIMIT,\n offset: countMembers,\n },\n },\n fieldName: 'searchParams.offset',\n };\n\n const AssignMembersToTeamAction = {\n actionFunction: getCurrentTeamMembersAndAssignToNewTeam,\n actionFunctionOptions: assignMembersToTeamOptions,\n };\n\n actionList.current.push(AssignMembersToTeamAction);\n },\n [countMembers, getCurrentTeamMembersAndAssignToNewTeam]\n );\n\n /**\n * @description add assignLabels action item to main action list\n * @function handleAddAssignLabelsActionToActionList\n * @returns { void }\n */\n const handleAddAssignLabelsActionToActionList = useCallback(\n (currentTeamLabelIds: number[], newTeamId: number) => {\n const assignedLabelList = currentTeamLabelIds?.map(labelId => ({\n teamId: newTeamId,\n labelId,\n }));\n\n const assignLabelsToTeamOptions = {\n parameters: {\n labels: assignedLabelList,\n },\n fieldName: 'labels',\n };\n\n const AssignLabelsToTeamAction = {\n actionFunction: assignLabelsToTeam,\n actionFunctionOptions: assignLabelsToTeamOptions,\n };\n\n actionList.current.push(AssignLabelsToTeamAction);\n },\n [assignLabelsToTeam]\n );\n\n /**\n * @description show progress modal and start chunk service action\n * @function handleStartActionModal\n * @returns { void }\n */\n const handleStartActionModal = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Duplicate Team',\n onStopBulkActionService:\n handleStopDuplicateTeamBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopDuplicateTeamBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n /**\n * @function handleAssignRelationsToNewTeam\n * @param { number } newTeamId\n * @returns { void }\n */\n const handleAssignRelationsToNewTeam = useCallback(\n (newTeamId: number) => {\n const {\n id: currentTeamId = 0,\n countMembers = 0,\n labels: currentTeamLabelIds = [],\n } = newTeamDataRef.current!;\n\n if (shouldShowModals) {\n if (countMembers > 0) {\n handleAddAssignMembersActionToActionList(\n currentTeamId,\n newTeamId\n );\n }\n\n if (!isEmpty(currentTeamLabelIds)) {\n handleAddAssignLabelsActionToActionList(\n currentTeamLabelIds,\n newTeamId\n );\n }\n\n handleStartActionModal();\n }\n // There is nothing to assign so stop the runner\n else {\n Promise.resolve().then(() => {\n onSuccessCallback?.();\n setIsRunning(false);\n });\n }\n },\n [\n handleAddAssignLabelsActionToActionList,\n handleAddAssignMembersActionToActionList,\n handleStartActionModal,\n onSuccessCallback,\n shouldShowModals,\n ]\n );\n\n /**\n * @function handleStartDuplicateTeamBulkActionService\n * @returns { void }\n */\n const handleStartDuplicateTeamBulkActionService = useCallback(() => {\n const { name = '' } = newTeamDataRef.current!;\n\n const generatedCopyOfTeamName = generateCopyOfEntityName(name);\n\n createNewTeam(generatedCopyOfTeamName)\n .then(response => {\n const { id: newTeamId } = response;\n\n if (newTeamId) {\n handleAssignRelationsToNewTeam(newTeamId);\n }\n })\n .catch((error: ErrorResult) => {\n if (error.message) {\n const errorMessage =\n CLIENT_SIDE_ERROR_MESSAGE[error.message] ??\n error.message;\n\n showMessage(errorMessage, 'error');\n setIsRunning(false);\n throw error;\n }\n });\n }, [createNewTeam, handleAssignRelationsToNewTeam, showMessage]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartDuplicateTeamBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n /**\n * @description Call the service runner.\n * @function callback\n * @param { Team } teamData\n * @returns { void }\n */\n return useCallback((teamData: Team) => {\n newTeamDataRef.current = teamData;\n\n setIsRunning(true);\n }, []);\n}\n\n/**\n * @function useSearchAndAssignMembersToTeam\n * @returns { void }\n */\nconst useSearchAndAssignMembersToTeam = () => {\n const searchAllUsers = useSearchUsersApi();\n const assignMembersToTeams = useAssignMembersToTeamsApi();\n const profile = useSelector(getProfileState);\n\n return useCallback(\n async (teamId: number, searchParams: SearchParams) => {\n if (!profile?.companyId) return;\n const searchAllUsersParams: SearchUsersParams = {\n status:\n searchParams.filters?.reduce((statuses, filter) => {\n if (filter.field === 'status') {\n statuses = String(filter.value);\n }\n\n return statuses;\n }, '') || `${UserStatus.ACTIVE},${UserStatus.PENDING}`,\n labels: searchParams.labelIDs?.join(','),\n roles: searchParams.roleIDs?.join(','),\n teams: searchParams.teamIds?.join(','),\n companies: profile?.companyId?.toString(),\n limit: searchParams.limit ?? 20,\n offset: 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\n excludeTeamId: searchParams.teamId?.toString(),\n };\n await searchAllUsers(searchAllUsersParams)\n .then(async (response: Record<string, any>) => {\n const members = response?.items?.map(\n (item: { id: number }) => ({\n userId: item?.id,\n isTeamLead: false,\n teamId: teamId,\n })\n );\n if (!isEmpty(members)) {\n await assignMembersToTeams(members).catch(\n (error: unknown) => {\n throw error;\n }\n );\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [assignMembersToTeams, profile?.companyId, searchAllUsers]\n );\n};\n\n/**\n * @function useAssignMembersToTeam\n * @returns { void }\n */\nconst useAssignMembersToTeam = () => {\n const assignMembersToTeams = useAssignMembersToTeamsApi();\n\n return useCallback(\n async (teamId: number, selectedItemIds: number[]) => {\n const members = selectedItemIds.map((userId: number) => ({\n userId,\n isTeamLead: false,\n teamId,\n })) as AssignedMemberToTeamType[];\n\n await assignMembersToTeams(members)\n .then(res => {})\n .catch((error: unknown) => {\n throw error;\n });\n },\n [assignMembersToTeams]\n );\n};\n\n/**\n * @function useAssignMembersToTeamService\n * @returns { void }\n */\nexport const useAssignMembersToTeamService = () => {\n const assignMembersToTeam = useAssignMembersToTeam();\n const searchAndAssignMembersToTeam = useSearchAndAssignMembersToTeam();\n\n return useCallback(\n async (\n teamId: number,\n searchParams: SearchParams,\n selectedItemIds?: number[]\n ) => {\n if (selectedItemIds) {\n await assignMembersToTeam(teamId, selectedItemIds);\n } else {\n await searchAndAssignMembersToTeam(teamId, searchParams);\n }\n },\n [assignMembersToTeam, searchAndAssignMembersToTeam]\n );\n};\n\n/**\n * @function useSearchAndDeleteMembersFromTeam\n * @returns { void }\n */\nconst useSearchAndDeleteMembersFromTeam = () => {\n const searchTeamsMembersApi = useSearchTeamMembersApi();\n const deleteMembersFromTeams = useDeleteMembersFromTeamsApi();\n\n return useCallback(\n async (teamId: number, searchParams: SearchParams) => {\n await searchTeamsMembersApi(\n teamId,\n createSearchTeamMembersParams({ ...searchParams, offset: 0 })\n )\n .then(async (response: ListResult<TeamMember>) => {\n const members = response?.items?.map(item => ({\n userId: item.user.id,\n teamId: teamId,\n }));\n\n if (!isEmpty(members)) {\n await deleteMembersFromTeams(members).catch(\n (error: unknown) => {\n throw error;\n }\n );\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteMembersFromTeams, searchTeamsMembersApi]\n );\n};\n\n/**\n * @function useDeleteMembersFromTeam\n * @returns { void }\n */\nconst useDeleteMembersFromTeam = () => {\n const deleteMembersFromTeams = useDeleteMembersFromTeamsApi();\n\n return useCallback(\n async (teamId: number, selectedItemIds: number[]) => {\n const members = selectedItemIds.map((userId: number) => ({\n userId,\n teamId,\n })) as DeletedMemberToTeamType[];\n\n await deleteMembersFromTeams(members)\n .then(res => {})\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteMembersFromTeams]\n );\n};\n\n/**\n * @function useDeleteMembersFromTeamService\n * @returns { void }\n */\nexport const useDeleteMembersFromTeamService = () => {\n const searchAndDeleteMembersFromTeam = useSearchAndDeleteMembersFromTeam();\n const deleteMembersFromTeam = useDeleteMembersFromTeam();\n\n return useCallback(\n async (\n teamId: number,\n searchParams?: SearchParams,\n selectedItemIds?: number[]\n ) => {\n if (selectedItemIds) {\n await deleteMembersFromTeam(teamId, selectedItemIds);\n } else {\n searchParams &&\n (await searchAndDeleteMembersFromTeam(\n teamId,\n searchParams\n ));\n }\n },\n [deleteMembersFromTeam, searchAndDeleteMembersFromTeam]\n );\n};\n\n/**\n * @function useUpdateTeamsBulkActionService\n * @param { string } actionName\n * @param { Function } actionFunction\n * @param { Record<string, unknown>} actionFunctionOptions\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useUpdateTeamsBulkActionService(\n action: ChunkRequestActionInterface<bulkActionFunctionParametersType>,\n modalTitle: string,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const { actionFunction, actionFunctionOptions } = action;\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n\n const {\n parameters: { selectedItemIds = null, itemsCount = 0 },\n } = actionFunctionOptions;\n\n const shouldShowModals =\n (!selectedItemIds && itemsCount >= MAX_SELECTED_ALL_ITEMS) ||\n (selectedItemIds && selectedItemIds.length >= MIN_ITEMS_TO_SHOW_MODAL);\n /**\n * @function handleSuccessBulkActionServiceCallback\n * @returns { void }\n */\n const handleSuccessBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n dispatch(updateSingleTeamSuccess());\n\n onSuccessCallback?.();\n }, [hideModalDialog, onSuccessCallback, shouldShowModals, dispatch]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n dispatch(updateSingleTeamFailure());\n\n onErrorCallback?.();\n }, [\n dispatch,\n hideModalDialog,\n modalTitle,\n onErrorCallback,\n shouldShowModals,\n ]);\n\n const { setIsStopped } =\n useChunkRequestsService<bulkActionFunctionParametersType>(\n [\n {\n actionName: UPDATE_TEAM_ACTION,\n actionFunction,\n actionFunctionOptions,\n },\n ],\n handleSuccessBulkActionServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopBulkActionService\n * @returns { void }\n */\n const handleStopBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle,\n onStopBulkActionService:\n handleStopBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n dispatch(updateSingleTeamStart());\n });\n }, [\n dispatch,\n handleStopBulkActionService,\n hideModalDialog,\n modalTitle,\n setIsStopped,\n shouldShowModals,\n ]);\n\n return {\n handleStartBulkActionService,\n handleStopBulkActionService,\n };\n}\n\n/**\n * @function useDeleteTeamsService\n * @returns { void }\n */\nexport const useDeleteTeamsService = () => {\n const searchAndDeleteTeams = useSearchAndDeleteTeams();\n const deleteSelectedTeams = useDeleteSelectedTeams();\n return useCallback(\n async (searchParams: SearchParams, selectedItemIds?: number[]) => {\n if (selectedItemIds) {\n await deleteSelectedTeams(selectedItemIds);\n } else {\n await searchAndDeleteTeams(searchParams);\n }\n },\n [deleteSelectedTeams, searchAndDeleteTeams]\n );\n};\n\n/**\n * @function useDeleteSelectedTeams\n * @returns { void }\n */\nconst useDeleteSelectedTeams = () => {\n const deleteTeams = useDeleteTeamsApi();\n\n return useCallback(\n async (selectedItemIds: number[]) => {\n await deleteTeams(selectedItemIds)\n .then(res => {})\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteTeams]\n );\n};\n\n/**\n * @function useSearchAndDeleteTeams\n * @returns { void }\n */\nconst useSearchAndDeleteTeams = () => {\n const searchTeamsApi = useSearchTeamsApi();\n const deleteSelectedTeams = useDeleteSelectedTeams();\n\n return useCallback(\n async (searchParams: SearchParams) => {\n await searchTeamsApi(\n createSearchTeamsParams({ ...searchParams, offset: 0 })\n )\n .then(async (response: ListResult<Team>) => {\n const teamIds = [] as number[];\n response?.items?.forEach(item => {\n if (!item.isDefault && item.id) {\n teamIds.push(item.id);\n }\n });\n\n if (!isEmpty(teamIds)) {\n await deleteSelectedTeams(teamIds).catch(\n (error: unknown) => {\n throw error;\n }\n );\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteSelectedTeams, searchTeamsApi]\n );\n};\n\n/**\n *\n * @description Custom hook to remind to start with chunk service\n * when all items are selected.\n * @function useRemindToStartBulkActionService\n * @param { string } teamId\n * @param { string } practisSetId\n * @param { SearchParams } searchParams\n * @param { number } totalUsersCount\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useRemindToStartBulkActionService(\n teamId: string,\n practisSetId: string,\n searchParams: SearchParams,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const handleSearchEnrollmentsAndRemind =\n useHandleSearchEnrollmentsAndRemind();\n\n const shouldShowModals = totalUsersCount > 20;\n\n const totalCompletedRemindToStartItems = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<RemindToStartChunkRequestParameters>[] =\n [\n {\n actionName: REMIND_TO_START_ACTION,\n actionFunction: handleSearchEnrollmentsAndRemind,\n actionFunctionOptions: {\n parameters: {\n teamId,\n practisSetId,\n searchParams: {\n ...searchParams,\n offset: totalUsersCount,\n },\n onSuccessCallback: (numberOfDoneItems: number) =>\n (totalCompletedRemindToStartItems.current =\n totalCompletedRemindToStartItems.current +\n numberOfDoneItems),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedRemindedUsers\n * @returns { void }\n */\n const clearTotalCompletedRemindedUsers = () =>\n (totalCompletedRemindToStartItems.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n }\n\n isRunning && setIsRunning(false);\n\n showMessage(\n `Reminders Sent to ${totalCompletedRemindToStartItems.current} Users`,\n 'success'\n );\n\n clearTotalCompletedRemindedUsers();\n onSuccessCallback?.();\n });\n }, [\n hideModalDialog,\n isRunning,\n onSuccessCallback,\n shouldShowModals,\n showMessage,\n ]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Remind Users',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n clearTotalCompletedRemindedUsers();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [\n dispatch,\n hideModalDialog,\n isRunning,\n onErrorCallback,\n shouldShowModals,\n ]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopRemindUsersBulkActionService\n * @returns { void }\n */\n const handleStopRemindUsersBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `Reminders Sent to ${totalCompletedRemindToStartItems.current} Users`,\n 'success'\n );\n\n clearTotalCompletedRemindedUsers();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartRemindUsersBulkActionService\n * @returns { void }\n */\n const handleStartRemindUsersBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Remind Users',\n onStopBulkActionService:\n handleStopRemindUsersBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopRemindUsersBulkActionService,\n hideModalDialog,\n setIsStopped,\n shouldShowModals,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartRemindUsersBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}","import { useCallback } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport {\n useRemindToStartApi,\n useSearchPractisSetDetailsUsersApi,\n} from '../../../../api';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { createSearchPractisSetDetailsParams } from '../../tools';\nimport { RemindToStartEnrollment } from '../../../../api/alert/types';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { UserStatus } from '../../../users/store/costants';\nimport { ENROLLMENT_REMIND_TO_START } from '../../../../api/alert/constants';\n\n/**\n * @function useHandleSearchEnrollmentsAndRemind\n * @returns { CallableFunction }\n */\nexport const useHandleSearchEnrollmentsAndRemind = () => {\n const searchPractisSetDetailsUsers = useSearchPractisSetDetailsUsersApi();\n const remindToStart = useRemindToStartApi();\n const showMessage = useShowMessage();\n\n return useCallback(\n async (\n teamId: string,\n practisSetId: string,\n searchParams: SearchParams,\n onSuccessCallback: (numberOdDoneItems: number) => void\n ) => {\n const searchPractisSetDetailsParams =\n createSearchPractisSetDetailsParams({\n ...searchParams,\n filterByStatus: searchParams.filterByStatus?.length\n ? searchParams.filterByStatus\n : ['PENDING', 'IN_PROGRESS'],\n });\n\n await searchPractisSetDetailsUsers(teamId, practisSetId, {\n ...searchPractisSetDetailsParams,\n })\n .then(async response => {\n if (!isEmpty(response.items)) {\n const enrollments = response.items\n // Pending users can't be reminded.\n .filter(\n item => item.user.status === UserStatus.ACTIVE\n )\n .map(\n item =>\n ({\n enrollmentId: item.id,\n type: ENROLLMENT_REMIND_TO_START,\n } as RemindToStartEnrollment)\n );\n\n await remindToStart(enrollments)\n .then(() => {\n onSuccessCallback(enrollments.length);\n })\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [remindToStart, searchPractisSetDetailsUsers, showMessage]\n );\n};","export const CREATE_ENROLLMENT_ACTION = 'CREATE_ENROLLMENT_ACTION';\nexport const DELETE_ENROLLMENT_ACTION = 'DELETE_ENROLLMENT_ACTION';\nexport const UPDATE_ENROLLMENT_ACTION = 'UPDATE_ENROLLMENT_ACTION';","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { SearchParams } from '../../../../../../constants/interfaces/filters';\n\nimport { useChunkRequestsService } from '../../../../../../services/ChunkRequestService/hooks';\nimport { ITEM_PER_CHUNK_SIZE } from '../../../../../../services/ChunkRequestService/hooks/constants';\nimport { ChunkRequestActionInterface } from '../../../../../../services/ChunkRequestService/hooks/types';\nimport { useShowMessage } from '../../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../../../ui/components/ModalDialogs/store/actions';\nimport { GeneralBulkActionModalInterface } from '../../../../../../ui/components/ModalDialogs/types';\nimport { CREATE_ENROLLMENT_ACTION, DELETE_ENROLLMENT_ACTION, UPDATE_ENROLLMENT_ACTION } from './constants';\nimport { useSearchEnrollmentsAndDelete, useSearchEnrollmentsAndUpdate, useSearchPsetEnrollmentsAndDelete, useSearchUsersAndCreateEnrollment } from './helpers';\nimport { CreateEnrollmentChunkRequestParameters, CreateEnrollmentsParams, DeleteEnrollmentChunkRequestParameters, DeleteEnrollmentsParams, UpdateEnrollmentChunkRequestParameters } from './types';\n\n/**\n *\n * @description Custom hook to create enrollments with chunk service\n * @function useCreateEnrollmentBulkActionService\n * @param { createEnrollmentsParams } CreateEnrollmentsParams\n * @param { Number } totalUsersCount\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { Void }\n */\n export function useCreateEnrollmentBulkActionService(\n createEnrollmentsParams: CreateEnrollmentsParams,\n totalUsersCount?: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n ) {\n const dispatch = useDispatch();\n const searchUsersAndCreateEnrollment = useSearchUsersAndCreateEnrollment();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedEnrollments = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<CreateEnrollmentChunkRequestParameters>[] =\n [\n {\n actionName: CREATE_ENROLLMENT_ACTION,\n actionFunction: searchUsersAndCreateEnrollment,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...createEnrollmentsParams,\n offset: totalUsersCount\n },\n onSuccessCallback: () =>\n (totalCompletedEnrollments.current =\n totalCompletedEnrollments.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedEnrollments\n * @returns { void }\n */\n const clearTotalCompletedEnrollments = () =>\n (totalCompletedEnrollments.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedEnrollments();\n\n showMessage('All Users have been assigned', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Assign Users',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedEnrollments();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopCreateEnrollmentsBulkActionService\n * @returns { void }\n */\n const handleStopCreateEnrollmentsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n totalCompletedEnrollments.current *\n ITEM_PER_CHUNK_SIZE\n } Users have been assigned`,\n 'success'\n );\n\n clearTotalCompletedEnrollments();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartCreateEnrollmentBulkActionService\n * @returns { void }\n */\n const handleStartCreateEnrollmentBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Assign Users',\n onStopBulkActionService:\n handleStopCreateEnrollmentsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopCreateEnrollmentsBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartCreateEnrollmentBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}\n\n\n/**\n *\n * @description Custom hook to get enrollments and delete with chunk service\n * @function useDeleteEnrollmentBulkActionService\n * @param { deleteEnrollmentsParams } DeleteEnrollmentsParams\n * @param { Number } totalEnrollmentsCount\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { Void }\n */\n export function useDeleteEnrollmentBulkActionService(\n deleteEnrollmentsParams: DeleteEnrollmentsParams,\n entityType: string,\n totalEnrollmentsCount?: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const searchEnrollmentsAndDelete = useSearchEnrollmentsAndDelete();\n const searchPsetEnrollmentsAndDelete = useSearchPsetEnrollmentsAndDelete();\n const actionFunction = entityType === 'practisSet' ? searchEnrollmentsAndDelete : searchPsetEnrollmentsAndDelete;\n const entityExpression = entityType === 'practisSet' ? 'Practis Sets' : 'Users';\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedEnrollments = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<DeleteEnrollmentChunkRequestParameters>[] =\n [\n {\n actionName: DELETE_ENROLLMENT_ACTION,\n actionFunction,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...deleteEnrollmentsParams,\n offset: totalEnrollmentsCount\n },\n onSuccessCallback: () =>\n (totalCompletedEnrollments.current =\n totalCompletedEnrollments.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedEnrollments\n * @returns { void }\n */\n const clearTotalCompletedEnrollments = () =>\n (totalCompletedEnrollments.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedEnrollments();\n\n showMessage(`All ${entityExpression} have been unassigned`, 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage, entityExpression]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: `Unassign ${entityExpression}`,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedEnrollments();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback, entityExpression]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDeleteEnrollmentsBulkActionService\n * @returns { void }\n */\n const handleStopDeleteEnrollmentsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n totalCompletedEnrollments.current *\n ITEM_PER_CHUNK_SIZE\n } ${entityExpression} have been unassigned`,\n 'success'\n );\n\n clearTotalCompletedEnrollments();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage, entityExpression]);\n\n /**\n * @function handleStartDeleteEnrollmentBulkActionService\n * @returns { void }\n */\n const handleStartDeleteEnrollmentBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: `Unassign ${entityExpression}`,\n onStopBulkActionService:\n handleStopDeleteEnrollmentsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopDeleteEnrollmentsBulkActionService,\n hideModalDialog,\n setIsStopped,\n entityExpression\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartDeleteEnrollmentBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}\n\n/**\n *\n * @description Custom hook to get enrollments and update with chunk service\n * @function useUpdateEnrollmentBulkActionService\n * @param { UpdateEnrollmentsParams } { searchParams: SearchParams }\n * @param { Number } totalEnrollmentsCount\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { Void }\n */\nexport function useUpdateEnrollmentBulkActionService(\n updateEnrollmentsParams: { searchParams: SearchParams },\n totalEnrollmentsCount?: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const searchEnrollmentsAndUpdate = useSearchEnrollmentsAndUpdate();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n const dueDateRef = useRef<string | null>(null);\n\n const totalCompletedEnrollments = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const actionList: ChunkRequestActionInterface<UpdateEnrollmentChunkRequestParameters>[] =\n [\n {\n actionName: UPDATE_ENROLLMENT_ACTION,\n actionFunction: searchEnrollmentsAndUpdate,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...updateEnrollmentsParams,\n dueDate: dueDateRef.current,\n offset: totalEnrollmentsCount as number\n },\n onSuccessCallback: () =>\n (totalCompletedEnrollments.current =\n totalCompletedEnrollments.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedEnrollments\n * @returns { void }\n */\n const clearTotalCompletedEnrollments = () =>\n (totalCompletedEnrollments.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedEnrollments();\n\n showMessage(`Due Date has changed`, 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: `Change Due Date`,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedEnrollments();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopUpdateEnrollmentsBulkActionService\n * @returns { void }\n */\n const handleStopUpdateEnrollmentsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `Due Date has changed`,\n 'success'\n );\n\n clearTotalCompletedEnrollments();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartUpdateEnrollmentBulkActionService\n * @returns { void }\n */\n const handleStartUpdateEnrollmentBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: `Change Due Date`,\n onStopBulkActionService:\n handleStopUpdateEnrollmentsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopUpdateEnrollmentsBulkActionService,\n hideModalDialog,\n setIsStopped\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartUpdateEnrollmentBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback((dueDate: string | null) => {\n dueDateRef.current = dueDate;\n setIsRunning(true);\n }, []);\n}","import { useCallback } from 'react';\nimport { useShowMessage } from '../../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { CreateEnrollmentsParams, DeleteEnrollmentsParams, UpdateEnrollmentsParams } from './types';\nimport { EnrollmentsDueDateType, EnrollmentType } from '../../../../../../api/enrollments/types';\nimport { getSearchUserPractisSetsParams } from '../../../../../users/store/helpers';\nimport { getAssignUsersSearchParams } from '../../../../store/services';\nimport { useCreateUpdateEnrollmentDueDate, useDeleteEnrollmentsApi, useEnrollPractisSetsToUserApi, useSearchPractisSetDetailsUsersApi, useSearchUserEnrollmentsApi, useSearchUsersApi } from '../../../../../../api';\nimport { createSearchPractisSetDetailsParams } from '../../../../tools';\n\n/**\n * @function useSearchUsersAndCreateEnrollment\n * @returns { CallableFunction }\n */\n export const useSearchUsersAndCreateEnrollment = () => {\n const searchUsersApi = useSearchUsersApi();\n const enrollPractisSetsToUser = useEnrollPractisSetsToUserApi();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } CreateEnrollmentsParams\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n { search, practisSetId, dueDate, enrollments: selectedEnrollments }: CreateEnrollmentsParams,\n onSuccessCallback: () => void\n ) => {\n const params = { ...getAssignUsersSearchParams(search), offset: 0 };\n await searchUsersApi(params)\n .then(async (response) => {\n const enrollments: EnrollmentType[] = response.items.map((item) => {\n return {\n userId: item.id, \n practisSetId: practisSetId as number, \n dueDate: dueDate\n || selectedEnrollments.find(e => e.userId === item.id)?.dueDate\n || null\n }\n });\n\n if (enrollments.length) {\n await enrollPractisSetsToUser(enrollments).catch(error => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n })\n onSuccessCallback();\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [enrollPractisSetsToUser, searchUsersApi, showMessage]\n );\n};\n\n/**\n * @function useSearchEnrollmentsAndDelete\n * @returns { CallableFunction }\n */\n export const useSearchEnrollmentsAndDelete = () => {\n const searchUserEnrollmentsApi = useSearchUserEnrollmentsApi();\n const deleteEnrollments = useDeleteEnrollmentsApi();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } DeleteEnrollmentsParams\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n { userId, searchParams }: DeleteEnrollmentsParams,\n onSuccessCallback: () => void\n ) => {\n const params = getSearchUserPractisSetsParams(searchParams);\n userId && await searchUserEnrollmentsApi(userId, params)\n .then(async (response) => {\n const enrollmentIds: number[] = response?.items.map((item) => item.id) || [];\n\n if (enrollmentIds.length) {\n await deleteEnrollments(enrollmentIds).catch(error => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n })\n onSuccessCallback();\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteEnrollments, searchUserEnrollmentsApi, showMessage]\n );\n};\n\n/**\n * @function useSearchPsetEnrollmentsAndDelete\n * @returns { CallableFunction }\n */\nexport const useSearchPsetEnrollmentsAndDelete = () => {\n const searchUserEnrollmentsApi = useSearchPractisSetDetailsUsersApi();\n const deleteEnrollments = useDeleteEnrollmentsApi();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } DeleteEnrollmentsParams\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n { searchParams }: DeleteEnrollmentsParams,\n onSuccessCallback: () => void\n ) => {\n const params = createSearchPractisSetDetailsParams(searchParams);\n const { teamId, practisSetId } = searchParams;\n\n teamId && practisSetId && await searchUserEnrollmentsApi(\n teamId.toString(), \n practisSetId.toString(),\n params\n ).then(async (response) => {\n const enrollmentIds: number[] = response?.items.map((item) => item.id) || [];\n\n if (enrollmentIds.length) {\n await deleteEnrollments(enrollmentIds).catch(error => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n })\n onSuccessCallback();\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteEnrollments, searchUserEnrollmentsApi, showMessage]\n );\n};\n\n/**\n * @function useSearchEnrollmentsAndUpdate\n * @returns { CallableFunction }\n */\nexport const useSearchEnrollmentsAndUpdate = () => {\n const searchUserEnrollmentsApi = useSearchPractisSetDetailsUsersApi();\n const updateEnrollmentsDueDate = useCreateUpdateEnrollmentDueDate();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } UpdateEnrollmentsParams\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n { searchParams, dueDate, offset }: UpdateEnrollmentsParams,\n onSuccessCallback: () => void\n ) => {\n const params = createSearchPractisSetDetailsParams({...searchParams, offset});\n const { teamId, practisSetId } = searchParams;\n\n teamId && practisSetId && await searchUserEnrollmentsApi(\n teamId.toString(), \n practisSetId.toString(),\n params\n ).then(async (response) => {\n const enrollments: EnrollmentsDueDateType[] = response?.items.map((item) => ({ enrollmentId: item.id, dueDate })) || [];\n\n if (enrollments.length) {\n await updateEnrollmentsDueDate(enrollments).catch(error => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n })\n onSuccessCallback();\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [updateEnrollmentsDueDate, searchUserEnrollmentsApi, showMessage]\n );\n}","export enum ACTIONS {\n SOCKET_PROGRESS_SHOW = 'SOCKET_PROGRESS_SHOW',\n SOCKET_PROGRESS_HIDE = 'SOCKET_PROGRESS_HIDE',\n}\n\nexport function SocketProgressShow() {\n return {\n type: ACTIONS.SOCKET_PROGRESS_SHOW as ACTIONS.SOCKET_PROGRESS_SHOW,\n };\n}\n\nexport function SocketProgressHide() {\n return {\n type: ACTIONS.SOCKET_PROGRESS_HIDE as ACTIONS.SOCKET_PROGRESS_HIDE,\n };\n}\n","import { History } from 'history';\r\nimport { FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { isEmpty as lodashIsEmpty } from 'lodash';\r\n\r\nimport User from '../../../../ui/icons/User';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\r\nimport {\r\n EnrollmentStatus,\r\n EnrollmentStatusEnum,\r\n} from '../../../../constants/interfaces/Enrollments';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport { PaginationResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport { PractisSets } from '../../../../constants/interfaces/PractisSets';\r\nimport { EnrollmentInterface } from '../../../../constants/interfaces/Enrollments';\r\nimport {\r\n formatDate,\r\n formatDateWithTimeZone,\r\n} from '../../../../helpers/functions/date-convert';\r\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport { pushModal } from '../../../../tools/router';\r\nimport {\r\n useCheckAllProgressService,\r\n useCheckSingleProgressService,\r\n useGetPractisSetService,\r\n useGetTraineesReportService,\r\n useNudgeUsersService,\r\n useRemindToStartService,\r\n useResetPractisSetDetailsService,\r\n useSearchPractisSetDetailsUsersService,\r\n useUnenrollEnrollmentService,\r\n} from '../../store/services';\r\nimport {\r\n useCreateUpdateEnrollmentDueDate,\r\n} from '../../../../api';\r\nimport {\r\n selectSelectedProgresses,\r\n useEnrollmentState,\r\n useTrainerPractisSetState,\r\n} from '../../store/states';\r\nimport { useLabelsState } from '../../../labels/store/states';\r\nimport { clearSelectedItemIfNotLoaded } from '../../../labels/tools';\r\nimport {\r\n ActionItem,\r\n ActionButton,\r\n} from '../../../../ui/components/ActionButton';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\r\nimport { secondsToMinSimple } from '../../../../helpers/functions/convert-time';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport { countPractisSetDetailsAppliedFiltersCount } from './tools';\r\nimport TrainingDetailsFilters from './components/Filters/TrainingDetailsFilters';\r\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\r\nimport {\r\n useProgressActionsHelper,\r\n ProgressActionsHelper,\r\n ProgressActions,\r\n} from '../../tools';\r\nimport GeneralProgressCol from './components/ProgressDetails/GeneralProgressCol';\r\nimport PlusInCircleIcon from '../../../../ui/icons/PlusInCircleIcon';\r\nimport ViewPractisSetIcon from '../../../../ui/icons/ViewPractisSetIcon';\r\nimport { getSearchState } from '../../../searchState/store/reducer';\r\nimport { SearchStateInterface } from '../../../searchState/store/states';\r\nimport { SEARCH_STATE } from '../../../searchState/constants';\r\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\r\nimport { DueDateFilters } from '../../../../constants/interfaces/DueDates';\r\nimport ExportReportIcon from '../../../../ui/icons/ExportReportIcon';\r\nimport { DueDateCalendar } from '../../../../ui/components/DueDateCalendar';\r\nimport { usePreviousData } from '../../../../helpers/hooks/usePreviousData';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport {\r\n Avatar,\r\n AvatarTile,\r\n DueDateWrapper,\r\n DueDateIcon,\r\n OverdueFlagWrapped,\r\n ProgressBarContainer,\r\n StyledFirstTableContent,\r\n StyledProgressContainer,\r\n useStyles,\r\n} from './styles';\r\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { DueDateCalendarParams } from '../../../../constants/interfaces/dueDate';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport TableTitleOverflowText from '../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\r\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\r\nimport { EmptyCellDash } from '../../../../ui/components/table-wrapper/table/EmptyCellDash';\r\nimport { UserProfile } from '../../../../constants/interfaces/User';\r\nimport { NudgeData } from '../../../../api/alert/types';\r\nimport { useNudgeUsersBulkActionService } from '../../../../services/GeneralBulkActionServices';\r\nimport { useRemindToStartBulkActionService } from '../../services/TeamBulkActionsService';\r\nimport { UserStatus } from '../../../users/store/costants';\r\nimport {\r\n useDeleteEnrollmentBulkActionService,\r\n useUpdateEnrollmentBulkActionService,\r\n} from './services/EnrollmentBulkActionsService';\r\nimport {\r\n onListenEvent,\r\n onRemoveEvent,\r\n} from '../../../../helpers/functions/Events';\r\nimport {\r\n EventNameList,\r\n REFRESH_TRAINING_PAGE,\r\n} from '../../../../helpers/functions/Events/types';\r\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\r\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\r\n\r\nconst qs = require('query-string');\r\n\r\nexport const RenderStarted: FC<{\r\n enrollment?: EnrollmentInterface;\r\n onResendInvitation?: (enrollmentIds: number[]) => Promise<any>;\r\n}> = ({ enrollment, onResendInvitation }) => {\r\n if (\r\n !enrollment ||\r\n !enrollment.startedAt ||\r\n !enrollment.user ||\r\n !onResendInvitation\r\n ) {\r\n return <EmptyCellDash />;\r\n }\r\n\r\n if (enrollment.status !== EnrollmentStatusEnum.PENDING) {\r\n return (\r\n <StyledProgressContainer data-test=\"training-item-start-date\">\r\n {formatDate(enrollment.startedAt)}\r\n </StyledProgressContainer>\r\n );\r\n } else {\r\n return <EmptyCellDash />;\r\n }\r\n};\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nexport const ProgressDetails: FC<{\r\n history: History<any>;\r\n profile?: UserProfile;\r\n loading?: boolean;\r\n params: { teamId: string; practisSetId: string };\r\n updateTrainees?: Array<any>;\r\n searchPractisSetDetailsUsers(searchParams: SearchParams): void;\r\n practisSetsEnrollments?: PaginationResult<EnrollmentInterface>;\r\n practisSet?: PractisSets;\r\n company?: CompanyInterface;\r\n onResendInvitation: (enrollmentIds: number[]) => Promise<any>;\r\n onGetPractisSet: (practisSetId: number) => void;\r\n selectedLabels?: number[];\r\n checkAllProgress(\r\n progressIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n checkSingleProgress(progressId: number): void;\r\n selectedProgressIds: number[];\r\n selectedProgresses?: EnrollmentInterface[];\r\n actionsHelper: ProgressActionsHelper;\r\n onNudgeUsers: (\r\n nudgeUserDate: NudgeData[],\r\n successCallback?: () => void\r\n ) => void;\r\n onUnenrollEnrollment: (\r\n enrollmentIds: number[],\r\n successCallback?: () => void\r\n ) => void;\r\n getTraineesReportService?(\r\n userIds: number[] | null,\r\n practisSetId: number,\r\n searchParams: SearchParams,\r\n teamId: number,\r\n selectAll?: boolean\r\n ): void;\r\n searchState?: SearchStateInterface;\r\n locationState: any;\r\n}> = ({\r\n profile,\r\n practisSetsEnrollments,\r\n loading,\r\n searchPractisSetDetailsUsers,\r\n params,\r\n history,\r\n updateTrainees,\r\n company,\r\n onResendInvitation,\r\n onGetPractisSet,\r\n practisSet,\r\n selectedLabels,\r\n checkAllProgress,\r\n checkSingleProgress,\r\n selectedProgressIds,\r\n selectedProgresses,\r\n actionsHelper,\r\n onNudgeUsers,\r\n onUnenrollEnrollment,\r\n getTraineesReportService,\r\n searchState,\r\n locationState,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n const [isSelectAll, setIsSelectAll] = useState<any>(false);\r\n\r\n const [dueDateCalendarParams, setDueDateCalendarParams] =\r\n useState<DueDateCalendarParams>({\r\n isOpen: false,\r\n data: null,\r\n });\r\n\r\n const [showNudgeDialogProgressId, setShowNudgeDialogProgressId] =\r\n useState<any>(null);\r\n\r\n const canAccessPage = useHandleAccessPage();\r\n const updateEnrollmentsDueDate = useCreateUpdateEnrollmentDueDate();\r\n const showConfirmationModalDialog = useShowConfirmModalDialog();\r\n\r\n const prevCompany = usePreviousData(company);\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n orderBy: { field: 'enrollment.lastTraining', asc: false },\r\n filterByStatus: [],\r\n filters: [],\r\n filterByRegistrationStatus: [],\r\n labelIDs: selectedLabels,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n filterByDueDate: [],\r\n };\r\n\r\n const usableParams: SearchParams =\r\n !isEmpty(searchState) &&\r\n !!searchState?.params &&\r\n searchState?.key === SEARCH_STATE.PRACTIS_SET_DETAILS.name\r\n ? searchState.params\r\n : initialSearchParams;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setOffset,\r\n setLabelIDs,\r\n refreshSearchParams,\r\n setCustom,\r\n } = useSearchParamsState(usableParams);\r\n\r\n const isCheckboxPartiallySelected =\r\n practisSetsEnrollments &&\r\n practisSetsEnrollments.items &&\r\n selectedProgressIds &&\r\n selectedProgressIds.length < practisSetsEnrollments.items.length;\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const refreshData = useCallback(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchPractisSetDetailsUsers(searchParams);\r\n setLastRefreshed(new Date());\r\n setIsSelectAll(false);\r\n checkAllProgress([], true, isCheckboxPartiallySelected);\r\n }, [\r\n searchParams,\r\n initialOffset,\r\n searchPractisSetDetailsUsers,\r\n checkAllProgress,\r\n isCheckboxPartiallySelected,\r\n ]);\r\n\r\n const handleAddTrainees = () => {\r\n pushModal(\r\n history,\r\n ROUTES.TEAMS_PAGES.TRAINING_PAGES.TRAINEE_INVITATION.replace(\r\n ':teamId',\r\n params.teamId.toString()\r\n ).replace(':practisSetId', params.practisSetId.toString())\r\n );\r\n };\r\n\r\n const handleEditPractisSet = () => {\r\n if (!params.practisSetId || !params.teamId) return;\r\n pushModal(\r\n history,\r\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\r\n ':practisSetId',\r\n params.practisSetId.toString()\r\n )\r\n );\r\n };\r\n\r\n const handleViewPractisSetReport = (userId: number, enrollmentId: number) => {\r\n history.push(ROUTES.TRAINEE_DETAILS\r\n .replace(\r\n ':userId',\r\n userId.toString()\r\n )\r\n .replace(\r\n ':enrollmentId',\r\n enrollmentId.toString()\r\n ),\r\n { useGoBack: true }\r\n );\r\n };\r\n\r\n const filterOverdueHandler = (dueDates: DueDateFilters[]) => {\r\n setCustom('filterByDueDate', dueDates);\r\n };\r\n\r\n const handleViewProfile = (userId: number) => {\r\n history.push(\r\n ROUTES.USER_PERFORMANCE.replace(':userId', userId.toString()),\r\n { useGoBack: true }\r\n );\r\n };\r\n\r\n const updateAllProgressCheck = useCallback(\r\n (checked: boolean) => {\r\n const practisSetIds =\r\n (practisSetsEnrollments &&\r\n practisSetsEnrollments.items.map(\r\n (practisSetsEnrollment: EnrollmentInterface) =>\r\n Number(practisSetsEnrollment.id)\r\n )) ||\r\n [];\r\n checkAllProgress(\r\n practisSetIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [practisSetsEnrollments, isCheckboxPartiallySelected, checkAllProgress]\r\n );\r\n\r\n const handleProgressCheck = (e: any, trainee: EnrollmentInterface) => {\r\n e.stopPropagation();\r\n if (!!trainee.id) {\r\n checkSingleProgress(trainee.id);\r\n }\r\n };\r\n\r\n const onNudgeSingleUserSuccessCallback = () => {\r\n setShowNudgeDialogProgressId(null);\r\n };\r\n\r\n const handleNudgeSingleUser = useCallback(\r\n (data: any) => {\r\n const { text, name: senderName } = data;\r\n\r\n if (showNudgeDialogProgressId) {\r\n const enrollmentId = practisSetsEnrollments?.items.find(\r\n item => item.user.id === showNudgeDialogProgressId\r\n )?.id;\r\n\r\n if (enrollmentId) {\r\n const nudgeUserData: NudgeData = {\r\n type: 'enrollment',\r\n enrollmentId,\r\n receiverId: showNudgeDialogProgressId,\r\n text,\r\n senderName,\r\n };\r\n onNudgeUsers(\r\n [nudgeUserData],\r\n onNudgeSingleUserSuccessCallback\r\n );\r\n }\r\n }\r\n },\r\n [onNudgeUsers, practisSetsEnrollments?.items, showNudgeDialogProgressId]\r\n );\r\n\r\n const onNudgeMultipleUserSuccessCallback = useCallback(() => {\r\n checkAllProgress([], true, isCheckboxPartiallySelected);\r\n }, [checkAllProgress, isCheckboxPartiallySelected]);\r\n\r\n const nudgeUsersBulkActionService = useNudgeUsersBulkActionService(\r\n 'enrollment',\r\n {\r\n teamId: params.teamId,\r\n practisSetId: params.practisSetId,\r\n },\r\n searchParams,\r\n practisSetsEnrollments?.count ?? 0,\r\n refreshData\r\n );\r\n\r\n const handleNudgeMultipleUser = useCallback(\r\n (data: any) => {\r\n const { text, name: senderName } = data;\r\n\r\n if (isSelectAll) {\r\n nudgeUsersBulkActionService({ ...{ text }, ...{ senderName } });\r\n } else {\r\n const users = [] as { id: number; enrollmentId: number }[];\r\n practisSetsEnrollments?.items.forEach(element => {\r\n if (selectedProgressIds.includes(element.id)) {\r\n users.push({\r\n id: element.user.id,\r\n enrollmentId: element.id,\r\n });\r\n }\r\n });\r\n if (selectedProgressIds) {\r\n const nudgeUsersDate = users.map(\r\n user =>\r\n ({\r\n type: 'enrollment',\r\n enrollmentId: user.enrollmentId,\r\n receiverId: user.id,\r\n text,\r\n senderName,\r\n } as NudgeData)\r\n );\r\n\r\n onNudgeUsers(\r\n nudgeUsersDate,\r\n onNudgeMultipleUserSuccessCallback\r\n );\r\n }\r\n }\r\n },\r\n [\r\n isSelectAll,\r\n nudgeUsersBulkActionService,\r\n practisSetsEnrollments?.items,\r\n selectedProgressIds,\r\n onNudgeUsers,\r\n onNudgeMultipleUserSuccessCallback,\r\n ]\r\n );\r\n\r\n const showMessage = useShowMessage();\r\n\r\n const handleSingleRemind = useCallback(\r\n (progressId?: any) => {\r\n if (\r\n !!onResendInvitation &&\r\n !!practisSetsEnrollments &&\r\n !!practisSetsEnrollments.items &&\r\n !!practisSetsEnrollments.items.length\r\n ) {\r\n const selectedEnrollmentId = [progressId];\r\n\r\n onResendInvitation(selectedEnrollmentId).then(() => {\r\n showMessage(`Reminder Sent to User`, 'success');\r\n });\r\n }\r\n },\r\n [onResendInvitation, practisSetsEnrollments, showMessage]\r\n );\r\n\r\n const remindToStartBulkActionService = useRemindToStartBulkActionService(\r\n params.teamId,\r\n params.practisSetId,\r\n searchParams,\r\n practisSetsEnrollments?.count ?? 0,\r\n refreshData\r\n );\r\n\r\n const handleBulkRemind = useCallback(() => {\r\n if (isSelectAll) {\r\n remindToStartBulkActionService();\r\n } else {\r\n if (\r\n !!onResendInvitation &&\r\n !!selectedProgressIds?.length &&\r\n !!practisSetsEnrollments?.items?.length\r\n ) {\r\n const enrollmentIds = practisSetsEnrollments?.items\r\n .filter(\r\n enrollment =>\r\n selectedProgressIds.includes(enrollment.id) &&\r\n enrollment.user.status === UserStatus.ACTIVE &&\r\n (enrollment.status === EnrollmentStatus.PENDING ||\r\n enrollment.status === EnrollmentStatus.ENROLLED)\r\n )\r\n .map(enrollment => enrollment.id);\r\n\r\n onResendInvitation(enrollmentIds).then(() => {\r\n showMessage(\r\n `Reminder(s) Sent to ${\r\n selectedProgressIds.length > 1 ? 'Users' : 'User'\r\n }`,\r\n 'success'\r\n );\r\n });\r\n }\r\n }\r\n }, [\r\n isSelectAll,\r\n remindToStartBulkActionService,\r\n selectedProgressIds,\r\n practisSetsEnrollments,\r\n onResendInvitation,\r\n showMessage,\r\n ]);\r\n\r\n const orderBy = searchParams.orderBy;\r\n const enFirstName = useOrderBy('firstName', orderBy, setOrderBy);\r\n const enAssigned = useOrderBy('enrollment.createdAt', orderBy, setOrderBy);\r\n const enStarted = useOrderBy('enrollment.enrolledAt', orderBy, setOrderBy);\r\n const enDueDate = useOrderBy('enrollment.dueDate', orderBy, setOrderBy);\r\n const enTime = useOrderBy('enrollment.trainingTime', orderBy, setOrderBy);\r\n const enLastTrainingAt = useOrderBy(\r\n 'enrollment.lastTraining',\r\n orderBy,\r\n setOrderBy\r\n );\r\n const enProgressValue = useOrderBy(\r\n 'enrollment.progressValue',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n const enAccuracyAvg = useOrderBy(\r\n 'enrollment.averageAccuracy',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countPractisSetDetailsAppliedFiltersCount(searchParams),\r\n itemsCount: practisSetsEnrollments?.items.length || 0,\r\n });\r\n\r\n /**\r\n * @function onExportReportButtonClick\r\n * @returns { void }\r\n */\r\n const onExportReportButtonClick = useCallback(() => {\r\n history.push(\r\n `${ROUTES.REPORTS.PRACTIS_SET_SUMMARY_REPORT}?team=${params.teamId}&practisSet=${params.practisSetId}`);\r\n }, [history, params]);\r\n\r\n const filterStatusHandler = (status: EnrollmentStatusEnum[]) => {\r\n setCustom('filterByStatus', status);\r\n };\r\n\r\n const registrationStatusHandler = (values: string[]) => {\r\n setCustom('filterByRegistrationStatus', values);\r\n };\r\n\r\n const isListEmpty = lodashIsEmpty(practisSetsEnrollments?.items);\r\n\r\n const headersDisabled =\r\n !practisSetsEnrollments ||\r\n (practisSetsEnrollments && practisSetsEnrollments.items.length < 1);\r\n\r\n const bulkActions = useMemo(\r\n () => actionsHelper.getBulkActions(selectedProgresses),\r\n [selectedProgresses, actionsHelper]\r\n );\r\n\r\n const isExportButtonDisabled: boolean =\r\n !practisSetsEnrollments ||\r\n isEmpty(practisSetsEnrollments) ||\r\n practisSetsEnrollments?.count === 0;\r\n\r\n /**\r\n * @function openDueDatePopup\r\n * @param { number | undefined } enrollmentId\r\n * @returns { Promise<void> }\r\n */\r\n const openDueDatePopup = async (enrollmentId?: number) => {\r\n const enrollmentIds = enrollmentId\r\n ? [enrollmentId]\r\n : selectedProgresses?.map(item => item?.id || 0) || [];\r\n\r\n //temporary solution for calendar data \r\n\r\n let dueDateDataManual: any = {}\r\n if (isSelectAll) {\r\n dueDateDataManual = {\"type\":\"MULTIPLE\", \"dueDate\": null , \"count\": practisSetsEnrollments?.count}\r\n } else if (enrollmentIds.length > 1 ) {\r\n dueDateDataManual = {\"type\":\"MULTIPLE\", \"dueDate\": null , \"count\": enrollmentIds.length}\r\n } else if (enrollmentIds.length === 1) {\r\n const dueDate = practisSetsEnrollments ? practisSetsEnrollments.items.find((item) => item.id === enrollmentIds[0])?.dueDate : null;\r\n dueDateDataManual = {\"type\" : \"SINGLE\", \"dueDate\": dueDate, \"count\": 1}\r\n } \r\n \r\n setDueDateCalendarParams(prev => ({\r\n isOpen: true,\r\n data: {\r\n ...dueDateDataManual,\r\n enrollmentIds,\r\n isSubTitleVisible: !enrollmentId && true,\r\n },\r\n }));\r\n };\r\n\r\n /**\r\n * @function onCloseDueDateCalendar\r\n * @returns { void }\r\n */\r\n const onCloseDueDateCalendar = (): void => {\r\n setDueDateCalendarParams(prev => ({ isOpen: false, data: null }));\r\n };\r\n\r\n const updateSuccessCallback = () => {\r\n setDueDateCalendarParams(prev => ({ ...prev, isOpen: false }));\r\n refreshData();\r\n };\r\n\r\n const handleUpdateEnrollmentsBulkActionService =\r\n useUpdateEnrollmentBulkActionService(\r\n {\r\n searchParams: {\r\n ...searchParams,\r\n teamId: params.teamId,\r\n practisSetId: +params.practisSetId,\r\n },\r\n },\r\n practisSetsEnrollments?.count,\r\n updateSuccessCallback\r\n );\r\n\r\n const updateDueDate = async (dueDate: string | null) => {\r\n const { enrollmentIds, type } = dueDateCalendarParams?.data!;\r\n\r\n const updateDueDateSuccessMessage =\r\n type === 'NO_DUEDATE'\r\n ? 'Due date assigned'\r\n : dueDate\r\n ? 'Due date changed'\r\n : 'Due date removed';\r\n\r\n const enrollments = enrollmentIds.map(enrollmentId => ({\r\n enrollmentId,\r\n dueDate,\r\n }));\r\n\r\n if (isSelectAll) {\r\n handleUpdateEnrollmentsBulkActionService(dueDate);\r\n } else {\r\n await updateEnrollmentsDueDate(enrollments);\r\n showMessage(updateDueDateSuccessMessage, 'success');\r\n }\r\n\r\n updateSuccessCallback();\r\n };\r\n\r\n useEffect(() => {\r\n canAccessPage([NEW_PERMISSIONS.VIEW_PRACTIS_SET_PROGRESS]);\r\n }, [canAccessPage]);\r\n\r\n useEffect(() => {\r\n params.practisSetId && onGetPractisSet(+params.practisSetId);\r\n }, [onGetPractisSet, params.practisSetId]);\r\n\r\n useEffect(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchParams.labelIDs = selectedLabels;\r\n searchPractisSetDetailsUsers(searchParams);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchPractisSetDetailsUsers, searchParams]);\r\n\r\n useEffect(() => {\r\n if (!company?.id || !prevCompany?.id) return;\r\n if (company?.id !== prevCompany?.id) {\r\n history.push(ROUTES.TEAMS_PAGES.TRAINING);\r\n }\r\n }, [company, prevCompany, history]);\r\n\r\n useEffect(() => {\r\n if (updateTrainees && updateTrainees.length > 0) {\r\n refreshSearchParams();\r\n }\r\n }, [updateTrainees, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n selectedLabels && setLabelIDs(selectedLabels);\r\n }, [selectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (pageIndex > 1) {\r\n setTimeout(() => {\r\n setOffset(initialOffset);\r\n }, 200);\r\n } else if (pageIndex === 1) {\r\n setTimeout(() => {\r\n setOffset(0);\r\n }, 100);\r\n }\r\n }, [initialOffset, pageIndex, setOffset]);\r\n\r\n // NOTE: no need to add second parameter for this useEffect hook.\r\n // We need to clear selectedProgressIds when the component did mount\r\n useEffect(() => {\r\n if (selectedProgressIds && selectedProgressIds.length) {\r\n checkAllProgress(selectedProgressIds, false, false);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => checkAllProgress([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n checkAllProgress([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [practisSetsEnrollments]);\r\n\r\n useEffect(() => {\r\n const filteredPractisSetsEnrollments = practisSetsEnrollments\r\n ? practisSetsEnrollments.items.map(enrollment =>\r\n Number(enrollment.id)\r\n )\r\n : [];\r\n const enrollmentsToClear = clearSelectedItemIfNotLoaded(\r\n selectedProgressIds,\r\n filteredPractisSetsEnrollments\r\n );\r\n if (enrollmentsToClear && enrollmentsToClear.length > 0) {\r\n checkAllProgress(enrollmentsToClear, false);\r\n }\r\n }, [selectedProgressIds, practisSetsEnrollments, checkAllProgress]);\r\n\r\n const handleDeleteEnrollmentsBulkActionService =\r\n useDeleteEnrollmentBulkActionService(\r\n {\r\n searchParams: {\r\n ...searchParams,\r\n teamId: params.teamId,\r\n practisSetId: +params.practisSetId,\r\n },\r\n },\r\n 'user',\r\n practisSetsEnrollments?.count,\r\n refreshData\r\n );\r\n\r\n /**\r\n * @function onConfirmUnassign\r\n * @param { number[] } unAssignedPractisSetIds\r\n * @returns { void }\r\n */\r\n const onConfirmUnassign = (unAssignedPractisSetIds: number[]): void => {\r\n isSelectAll &&\r\n practisSetsEnrollments?.count !== unAssignedPractisSetIds.length\r\n ? handleDeleteEnrollmentsBulkActionService()\r\n : onUnenrollEnrollment(unAssignedPractisSetIds, refreshData);\r\n };\r\n\r\n /**\r\n * @function handleUnassign\r\n * @param { number[] } ids\r\n * @returns { void }\r\n */\r\n const handleUnassign = (ids: number[]) => {\r\n showConfirmationModalDialog({\r\n modalTitle: 'Are you sure?',\r\n description:\r\n selectedProgressIds.length > 1\r\n ? 'Users will get notified about this change.'\r\n : 'User will get notified about this change.',\r\n onConfirm: () => onConfirmUnassign(ids),\r\n });\r\n };\r\n\r\n /**\r\n * @function handleMultipleUserUnassign\r\n * @returns { void }\r\n */\r\n const handleMultipleUserUnassign = (): void => {\r\n if (!practisSetsEnrollments || !selectedProgressIds) return;\r\n const selectedEntities = practisSetsEnrollments.items.filter(\r\n item => item.id && selectedProgressIds.includes(item.id)\r\n );\r\n\r\n const selectedEntityIds: number[] = selectedEntities.map(entity =>\r\n entity ? entity.id || 0 : 0\r\n );\r\n\r\n handleUnassign(selectedEntityIds);\r\n };\r\n\r\n /**\r\n * @function handlePageChange\r\n * @param { number } limit\r\n * @param { number } offset\r\n * @returns { void }\r\n */\r\n const handlePageChange = (offset: number) => {\r\n setOffset(offset);\r\n };\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n checkAllProgress([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n const practisSetIds =\r\n (practisSetsEnrollments &&\r\n practisSetsEnrollments.items.map(\r\n (practisSetsEnrollment: EnrollmentInterface) =>\r\n Number(practisSetsEnrollment.id)\r\n )) ||\r\n [];\r\n checkAllProgress(practisSetIds, true, isCheckboxPartiallySelected);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n updateAllProgressCheck(event.target.checked);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const isMasterCheckBoxChecked =\r\n !!selectedProgressIds && !!selectedProgressIds.length;\r\n\r\n const isMasterCheckBoxDisabled = headersDisabled;\r\n\r\n /**\r\n * @function onRowClick\r\n * @param { EnrollmentInterface } trainee\r\n * @returns { void }\r\n */\r\n const onRowClick = (trainee: EnrollmentInterface) => {\r\n handleViewPractisSetReport(trainee.user.id, trainee.id);\r\n };\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { EnrollmentInterface } trainee\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (trainee: EnrollmentInterface): boolean =>\r\n !!selectedProgressIds &&\r\n !!trainee.id &&\r\n selectedProgressIds.includes(trainee.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { EnrollmentInterface } set\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, trainee: EnrollmentInterface) => {\r\n handleProgressCheck(event, trainee);\r\n setIsSelectAll(false);\r\n };\r\n\r\n // Listen To Assign Users And Due Date -- Refresh the page after assign users\r\n useEffect(() => {\r\n onListenEvent(EventNameList[REFRESH_TRAINING_PAGE], refreshData);\r\n\r\n return () => {\r\n onRemoveEvent(EventNameList[REFRESH_TRAINING_PAGE], refreshData);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (\r\n practisSetsEnrollments?.items.length &&\r\n selectedProgressIds.length === practisSetsEnrollments?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [practisSetsEnrollments?.count, practisSetsEnrollments?.items.length, selectedProgressIds.length]);\r\n\r\n return (\r\n <>\r\n <MainWrapper\r\n title=\"Practis Set Details\"\r\n goBackUrl={ROUTES.TEAMS_PAGES.TRAINING_PAGES.PRACTIS_SETS.replace(\r\n ':teamId',\r\n params && params.teamId ? params.teamId.toString() : ''\r\n )}\r\n subTitle={practisSet?.name ?? ''}\r\n useGoBack={locationState?.useGoBack}\r\n htmlPageTitle={`Practis Set Details ${\r\n practisSet ? `- ${practisSet?.name}` : ''\r\n } - Practis`}\r\n dataTest=\"training-details\"\r\n >\r\n {!!showNudgeDialogProgressId && (\r\n <DialogWrapper\r\n customization={{\r\n width: 480,\r\n padding: '49px 32px 32px 32px',\r\n }}\r\n >\r\n <NudgeUser\r\n practisSetName={\r\n practisSet && practisSet.name\r\n ? practisSet.name\r\n : ''\r\n }\r\n fromUser={\r\n !!profile\r\n ? `${profile.firstName} ${profile.lastName}`\r\n : ''\r\n }\r\n onSend={handleNudgeSingleUser}\r\n onClose={() => setShowNudgeDialogProgressId(null)}\r\n />\r\n </DialogWrapper>\r\n )}\r\n {loading && !isSelectAll && (\r\n <LoadingComponent />\r\n )}\r\n\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={practisSetsEnrollments?.items}\r\n selectedLabels={selectedLabels}\r\n cornered={selectedLabels && !!selectedLabels.length}\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: 'training-timestamp',\r\n buttons: [\r\n {\r\n name: 'Assign Users',\r\n icon: <PlusInCircleIcon />,\r\n onPress: handleAddTrainees,\r\n permissions: [\r\n NEW_PERMISSIONS.ASSIGN_ENROLLMENT,\r\n ],\r\n dataTest: 'assign-users',\r\n },\r\n {\r\n name: 'Generate Report',\r\n icon: <ExportReportIcon />,\r\n onPress: onExportReportButtonClick,\r\n permissions:\r\n [\r\n NEW_PERMISSIONS.EXPORT_LIST_PRACTIS_SET_USER,\r\n ] || [],\r\n disabled: isExportButtonDisabled,\r\n dataTest: 'export-report',\r\n },\r\n {\r\n name: 'View Practis Set',\r\n icon: <ViewPractisSetIcon />,\r\n onPress: handleEditPractisSet,\r\n permissions: [\r\n NEW_PERMISSIONS.UPDATE_PRACTIS_SET,\r\n ],\r\n dataTest: 'view-practis-set',\r\n },\r\n ],\r\n }}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: practisSetsEnrollments?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: handlePageChange,\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n searchParams.labelIDs?.length,\r\n dataTest: 'training-paging',\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled: isListEmpty && lodashIsEmpty(searchParams.searchTerm),\r\n dataTest: 'training-search'\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedProgresses) &&\r\n !lodashIsEmpty(practisSetsEnrollments),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedProgresses?.length,\r\n totalCount: practisSetsEnrollments?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled: bulkActions.areBulkActionsDisabled(),\r\n disabledLabel: bulkActions.areItemsEmpty()\r\n ? undefined\r\n : \"Bulk actions can't be applied\",\r\n practisSetName: practisSet?.name || '',\r\n nudgeTitle: 'Nudge Users',\r\n showNudgeWarning: false,\r\n onNudgeSendButtonClicked:\r\n handleNudgeMultipleUser,\r\n sendNudgePermissions:\r\n bulkActions.isBulkActionVisible(\r\n ProgressActions.NUDGE_USER\r\n )\r\n ? [NEW_PERMISSIONS.SEND_NUDGE]\r\n : [],\r\n nudgeButtonDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n ProgressActions.NUDGE_USER\r\n ),\r\n showRemindPermission:\r\n bulkActions.isBulkActionVisible(\r\n ProgressActions.REMIND_TO_START\r\n )\r\n ? [NEW_PERMISSIONS.RESEND_INVITATION]\r\n : [],\r\n onRemindSubmit: handleBulkRemind,\r\n remindDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n ProgressActions.REMIND_TO_START\r\n ),\r\n removeItemTitle: 'Unassign Users',\r\n removeItemPermissions:\r\n bulkActions.isBulkActionVisible(\r\n ProgressActions.UNASSIGN_USER\r\n )\r\n ? [NEW_PERMISSIONS.UNASSIGN_ENROLLMENT]\r\n : [],\r\n onRemoveItemsSubmit: handleMultipleUserUnassign,\r\n removeItemsDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n ProgressActions.UNASSIGN_USER\r\n ),\r\n dueDatesPermissions:\r\n bulkActions.isBulkActionVisible(\r\n ProgressActions.SET_DUEDATE\r\n )\r\n ? [NEW_PERMISSIONS.SET_DUE_DATE]\r\n : [],\r\n isDueDatesDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n ProgressActions.SET_DUEDATE\r\n ),\r\n isSelectAll: isSelectAll,\r\n totalCount: practisSetsEnrollments?.count,\r\n onUpdateDueDatesSubmit: openDueDatePopup,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <TrainingDetailsFilters\r\n onStatusChange={filterStatusHandler}\r\n status={\r\n searchParams.filterByStatus as EnrollmentStatusEnum[]\r\n }\r\n onSuccessApply={() => hide()}\r\n registrationStatus={\r\n searchParams.filterByRegistrationStatus ||\r\n []\r\n }\r\n onRegistrationStatusChange={\r\n registrationStatusHandler\r\n }\r\n onOverdueChange={\r\n filterOverdueHandler\r\n }\r\n dueDate={\r\n searchParams.filterByDueDate as DueDateFilters[]\r\n }\r\n />\r\n )}\r\n padding={'40px 32px 32px 32px'}\r\n horizontalOffset={256}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={countPractisSetDetailsAppliedFiltersCount(\r\n searchParams\r\n )}\r\n disabled={\r\n searchParams.searchTerm.length > 0 &&\r\n isListEmpty\r\n }\r\n dataTest=\"training-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading &&\r\n practisSetsEnrollments?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: User,\r\n text: 'No Users Yet',\r\n dataTest: 'training-no-entries',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: <>Users</>,\r\n dataTest: 'training-no-found-entries',\r\n },\r\n noFilterResultsOptions: {\r\n dataTest: 'training-no-filtered-entries',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial:\r\n isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: onCheckMasterCheckbox,\r\n dataTest: 'training-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Users',\r\n width: 20,\r\n ...enFirstName,\r\n disabled: headersDisabled,\r\n dataTest: 'training-user-name-column',\r\n },\r\n {\r\n title: 'Due Date',\r\n width: 10,\r\n ...enDueDate,\r\n disabled: headersDisabled,\r\n dataTest: 'training-due-date-column',\r\n },\r\n {\r\n title: 'Progress',\r\n width: 10,\r\n ...enProgressValue,\r\n disabled: headersDisabled,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The percentage completion of all the items in a Practis Set.',\r\n dataTest: 'training-progress-column',\r\n },\r\n {\r\n title: 'Accuracy',\r\n width: 10,\r\n ...enAccuracyAvg,\r\n disabled: headersDisabled,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The accuracy scores for all submitted scenario accuracy tests.',\r\n dataTest: 'training-accuracy-column',\r\n },\r\n {\r\n title: 'Training Time',\r\n width: 10,\r\n ...enTime,\r\n disabled: headersDisabled,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The total time spent by a user learning material.',\r\n dataTest: 'training-time-column',\r\n },\r\n {\r\n title: 'Assigned',\r\n width: 10,\r\n ...enAssigned,\r\n disabled: headersDisabled,\r\n dataTest: 'assign-date-column',\r\n },\r\n {\r\n title: 'Started',\r\n width: 10,\r\n ...enStarted,\r\n disabled: headersDisabled,\r\n dataTest: 'start-date-column',\r\n },\r\n {\r\n title: 'Last Training',\r\n width: 10,\r\n ...enLastTrainingAt,\r\n disabled: headersDisabled,\r\n dataTest: 'last-training-column',\r\n },\r\n {\r\n width: 5,\r\n },\r\n ],\r\n\r\n rowConfig: {\r\n onRowClick: onRowClick,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n dataTest: 'training-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n getCustomFieldComponent: (\r\n trainee: EnrollmentInterface\r\n ) => (\r\n <StyledFirstTableContent>\r\n <AvatarTile>\r\n <Avatar\r\n profile={{\r\n ...trainee.user,\r\n picture:\r\n trainee.user\r\n .imageUrl,\r\n }}\r\n size=\"sm\"\r\n marginRight={15}\r\n dataTest=\"training-item-user-avatar\"\r\n />\r\n <TableTitleOverflowText\r\n isCurrent={\r\n profile &&\r\n profile.id ===\r\n trainee.user.id\r\n }\r\n dataTest=\"training-item-user-name\"\r\n >{`${trainee.user.firstName} ${trainee.user.lastName}`}</TableTitleOverflowText>\r\n </AvatarTile>\r\n </StyledFirstTableContent>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n trainee: EnrollmentInterface\r\n ) => !trainee?.dueDate,\r\n fieldProps: {\r\n renderTitle: (\r\n trainee: EnrollmentInterface\r\n ) =>\r\n trainee?.dueDate ? (\r\n <DueDateWrapper>\r\n <span data-test=\"training-item-due-date\">\r\n {formatDateWithTimeZone(\r\n trainee?.dueDate\r\n )}\r\n </span>\r\n {trainee.hasOverdue && (\r\n <DueDateIcon data-test=\"training-item-due-date-icon\">\r\n <OverdueFlagWrapped />\r\n </DueDateIcon>\r\n )}\r\n </DueDateWrapper>\r\n ) : (\r\n ''\r\n ),\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (\r\n trainee: EnrollmentInterface\r\n ) => (\r\n <ProgressBarContainer>\r\n <GeneralProgressCol\r\n count={Math.round(\r\n trainee?.progress * 100\r\n )}\r\n max={100}\r\n completedAt={\r\n trainee?.completedAt\r\n }\r\n status={trainee.status}\r\n dataTest=\"training-item-progress\"\r\n />\r\n </ProgressBarContainer>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n trainee: EnrollmentInterface\r\n ) => !trainee?.averageAccuracy,\r\n fieldProps: {\r\n renderTitle: (\r\n trainee: EnrollmentInterface\r\n ) =>\r\n `${Math.floor(\r\n trainee?.averageAccuracy * 100\r\n )}%`,\r\n dataTest: 'training-item-accuracy',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n trainee: EnrollmentInterface\r\n ) => !trainee?.trainingTime,\r\n fieldProps: {\r\n renderTitle: (\r\n trainee: EnrollmentInterface\r\n ) =>\r\n secondsToMinSimple(\r\n trainee!.trainingTime\r\n ),\r\n dataTest: 'training-item-time',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n trainee: EnrollmentInterface\r\n ) => !trainee?.createdAt,\r\n fieldProps: {\r\n renderTitle: (\r\n trainee: EnrollmentInterface\r\n ) => formatDate(trainee?.createdAt),\r\n dataTest: 'training-item-assign-date',\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (\r\n trainee: EnrollmentInterface\r\n ) => (\r\n <RenderStarted\r\n onResendInvitation={\r\n onResendInvitation\r\n }\r\n enrollment={trainee}\r\n />\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n trainee: EnrollmentInterface\r\n ) => !trainee?.lastTrainingAt,\r\n\r\n fieldProps: {\r\n renderTitle: (\r\n trainee: EnrollmentInterface\r\n ) =>\r\n formatDate(trainee?.lastTrainingAt),\r\n dataTest: 'training-item-last-date',\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n trainee: EnrollmentInterface\r\n ) => (\r\n <ActionButton\r\n customWidth={224}\r\n isHidden={\r\n !!selectedProgresses?.length\r\n }\r\n dataTest=\"training-item-menu\"\r\n >\r\n {actionsHelper.canViewPractisSetReport() && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewPractisSetReport(\r\n trainee.user.id,\r\n trainee.id\r\n );\r\n }}\r\n dataTest=\"view-practis-set-report-item-action\"\r\n >\r\n View Practis Set Report\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canViewProfile() && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewProfile(\r\n trainee.user.id!\r\n );\r\n }}\r\n dataTest=\"view-profile-item-action\"\r\n >\r\n View Profile\r\n </ActionItem>\r\n )}\r\n\r\n {actionsHelper.canChangeDueDate() && (\r\n <ActionItem\r\n onClick={() =>\r\n openDueDatePopup(\r\n trainee?.id //enroll id\r\n )\r\n }\r\n dataTest=\"due-date-item-action\"\r\n >\r\n Due Date\r\n </ActionItem>\r\n )}\r\n\r\n {actionsHelper.canNudgeUser(\r\n trainee.user\r\n ) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n setShowNudgeDialogProgressId(\r\n trainee.user.id!\r\n );\r\n }}\r\n dataTest=\"nudge-user-item-action\"\r\n >\r\n Nudge User\r\n </ActionItem>\r\n )}\r\n\r\n {actionsHelper.canRemindToStart(\r\n trainee\r\n ) && (\r\n <ActionItem\r\n onClick={e => {\r\n handleSingleRemind(\r\n trainee.id!\r\n );\r\n }}\r\n dataTest=\"remind-to-start-item-action\"\r\n >\r\n Remind to Start\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canUnassignUser() && (\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n trainee &&\r\n handleUnassign([\r\n trainee.id!,\r\n ]);\r\n }}\r\n dataTest=\"unassign-user-item-action\"\r\n >\r\n Unassign User\r\n </ActionItem>\r\n )}\r\n </ActionButton>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </MainWrapper>\r\n {dueDateCalendarParams.isOpen && dueDateCalendarParams?.data && (\r\n <DueDateCalendar\r\n data={dueDateCalendarParams?.data}\r\n onCancel={onCloseDueDateCalendar}\r\n onApply={updateDueDate}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport const ProgressDetailsContainer: FC = () => {\r\n const state = useEnrollmentState();\r\n const profile = useSelector(getProfileState);\r\n const practisSetsState = useTrainerPractisSetState();\r\n const history = useHistory();\r\n const params: { teamId: string; practisSetId: string } = useParams();\r\n const company = useSelector(getCompanyState);\r\n const searchPractisSetDetailsUsers = useSearchPractisSetDetailsUsersService(\r\n params.teamId,\r\n params.practisSetId\r\n );\r\n const searchPractisSetDetailsUsersDebounced = useSearchDebounced(\r\n searchPractisSetDetailsUsers\r\n );\r\n const resendInvitation = useRemindToStartService();\r\n const getPractisSet = useGetPractisSetService();\r\n const resetPractisSetDetails = useResetPractisSetDetailsService();\r\n const labels = useLabelsState();\r\n const checkAllProgress = useCheckAllProgressService();\r\n const checkSingleProgress = useCheckSingleProgressService();\r\n const nudgeUsers = useNudgeUsersService();\r\n const unenrollEnrollment = useUnenrollEnrollmentService();\r\n const getTraineesReportService = useGetTraineesReportService();\r\n const actionsHelper = useProgressActionsHelper();\r\n\r\n const selectedProgresses = useMemo(\r\n () => selectSelectedProgresses(state, practisSetsState.checked),\r\n [practisSetsState.checked, state]\r\n );\r\n const searchState = useSelector(getSearchState);\r\n\r\n const locationState: any = history.location.state;\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetPractisSetDetails();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <ProgressDetails\r\n history={history}\r\n profile={profile}\r\n params={params}\r\n company={company}\r\n searchPractisSetDetailsUsers={searchPractisSetDetailsUsersDebounced}\r\n practisSetsEnrollments={state.data}\r\n updateTrainees={state.update}\r\n loading={state.loading}\r\n practisSet={state.practisSet}\r\n onResendInvitation={resendInvitation}\r\n onGetPractisSet={getPractisSet}\r\n selectedLabels={labels.selected}\r\n checkAllProgress={checkAllProgress}\r\n checkSingleProgress={checkSingleProgress}\r\n selectedProgressIds={practisSetsState.checked}\r\n selectedProgresses={selectedProgresses}\r\n actionsHelper={actionsHelper}\r\n onNudgeUsers={nudgeUsers}\r\n onUnenrollEnrollment={unenrollEnrollment}\r\n getTraineesReportService={getTraineesReportService}\r\n locationState={locationState}\r\n searchState={searchState}\r\n />\r\n );\r\n};\r\n\r\nexport default ProgressDetailsContainer;","import React, { FC } from 'react';\nimport { Redirect, Switch } from 'react-router-dom';\nimport PrivateRoute from '../../../../routes/PrivateRouter';\nimport ROUTES from '../../../../routes/routes';\nimport PractisSetProgressContainer from './PractisSetProgress';\nimport ProgressDetailsContainer from './ProgressDetails';\nimport { useHistory, useLocations } from '../../../../tools/router';\n\nexport const Progress: FC = () => {\n let { rootLocation } = useLocations();\n const history = useHistory();\n return (\n <React.Fragment>\n <Switch location={rootLocation}>\n <Redirect\n from={ROUTES.TEAMS_PAGES.TRAINING}\n exact\n to={{\n pathname: ROUTES.TEAMS_PAGES.TRAINING_PAGES.PRACTIS_SETS,\n state: history.location.state\n }}\n />\n <PrivateRoute\n path={ROUTES.TEAMS_PAGES.TRAINING_PAGES.PRACTIS_SETS}\n exact\n component={PractisSetProgressContainer}\n />\n <PrivateRoute\n path={\n ROUTES.TEAMS_PAGES.TRAINING_PAGES.PRACTIS_SETS_DETAILS\n }\n exact\n component={ProgressDetailsContainer}\n />\n </Switch>\n </React.Fragment>\n );\n};\n\nexport default Progress;\n","import { UserInterface } from '../../../../constants/interfaces/User';\r\nimport { Dispatch } from 'redux';\r\nimport { ThunkContext } from '../../../../tools/thunk/ThunkContext';\r\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\r\nimport { useCallback } from 'react';\r\nimport {\r\n useAddStagingUsersApi,\r\n useAssignFiltersToStagingUsersApi,\r\n useCreateUserStagingApi,\r\n useDeleteStagingUsersApi,\r\n useInviteStagingUsersApi,\r\n useSearchStagingUsersApi,\r\n useUpdateStagingUsersApi,\r\n} from '../../../../api';\r\nimport { NewUserValues } from '../models/NewUserValues';\r\nimport { DraftUser, PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\r\nimport { useDispatch } from 'react-redux';\r\nimport { SearchParams } from '../../../../constants/interfaces/filters';\r\nimport { PaginationResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport {\r\n modifyDraftUsersAction,\r\n modifyDraftUsersWithoutValidationAction,\r\n resetDraftsPageAction,\r\n searchDraftUsersFailure,\r\n searchDraftUsersStart,\r\n searchDraftUsersSuccess,\r\n updateDraftUsersFailure,\r\n updateDraftUsersStart,\r\n updateDraftUsersSuccess,\r\n} from './actions';\r\nimport { SocketProgressShow } from '../../../../features/socketProgress(api1)/store/actions';\r\nimport { AssignFiltersToStagingUsersParams } from '../../../../api/users/types';\r\nimport { handleMessage, useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\r\n\r\nconst uuid = require('uuid/v1');\r\nexport const MAX_DRAFT_USERS_INVITE = 10;\r\nexport interface SendInvitationParams {\r\n id?: number | string;\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n roleId?: number | null;\r\n labelIDs?: any[];\r\n practisSetIDs?: PractisSetWithDueDate[];\r\n teamIDs?: any[];\r\n}\r\n\r\nexport const sendInvitation = (\r\n data: DraftUser[],\r\n assignedPractisSets?: number[]\r\n) => {\r\n return (dispatch: Dispatch<any>, getState: any, context: ThunkContext) => {\r\n return context.http\r\n .post('invitations', {\r\n items: data,\r\n practisSets: [...(assignedPractisSets || [])],\r\n })\r\n .then((res: any) => {\r\n let sentEmails: Array<UserInterface> = [];\r\n let failedEmails: Array<string> = [];\r\n res.map((response: any) => {\r\n if (response.error) {\r\n return failedEmails.push(response.error.message);\r\n } else {\r\n return sentEmails.push(response);\r\n }\r\n });\r\n\r\n if (failedEmails.length < 1) {\r\n handleMessage(\r\n dispatch,\r\n data.length > 1\r\n ? 'Invitations sent!'\r\n : 'Invitation sent!',\r\n 'success'\r\n );\r\n } else {\r\n handleMessage(dispatch, failedEmails, 'error');\r\n }\r\n return sentEmails;\r\n })\r\n .catch((error: ErrorResult) => {\r\n let errorMessage;\r\n if (error && error.message && error.message.includes('role')) {\r\n errorMessage = 'Role is required';\r\n } else {\r\n errorMessage = error.message;\r\n }\r\n handleMessage(dispatch, errorMessage, 'error');\r\n throw error;\r\n });\r\n };\r\n};\r\n\r\nexport const assignLabelsToInvitedUsers = (\r\n labels: number[],\r\n entities: number[]\r\n) => {\r\n return (dispatch: Dispatch<any>, getState: any, context: ThunkContext) => {\r\n return context.http\r\n .post(`labels/assign`, {\r\n labels,\r\n entities,\r\n entityType: 'INVITATION',\r\n deleted: [],\r\n })\r\n .then((res: any) => {\r\n return res;\r\n })\r\n .catch((error: ErrorResult) => {\r\n handleMessage(dispatch, error.message, 'error');\r\n throw error;\r\n });\r\n };\r\n};\r\n\r\nexport const useSearchStagingUsersService = () => {\r\n const dispatch = useDispatch();\r\n const searchStagingUsersApi = useSearchStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (draftId: number, sp: SearchParams) => {\r\n dispatch(searchDraftUsersStart());\r\n return searchStagingUsersApi(draftId, sp)\r\n .then(data => {\r\n dispatch(searchDraftUsersSuccess(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, searchStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useCreateUserStagingService = () => {\r\n const dispatch = useDispatch();\r\n const createStagingApi = useCreateUserStagingApi();\r\n return useCallback(\r\n (name: string, users: NewUserValues[]) => {\r\n dispatch(updateDraftUsersStart());\r\n return createStagingApi(name, users)\r\n .then((res: any) => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-created')\r\n );\r\n return res;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n return error;\r\n });\r\n },\r\n [dispatch, createStagingApi]\r\n );\r\n};\r\n\r\nexport const useAddStagingUserService = () => {\r\n const dispatch = useDispatch();\r\n const addStagingUsersApi = useAddStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (stagingId: number, user: DraftUser) => {\r\n dispatch(updateDraftUsersStart());\r\n return addStagingUsersApi(stagingId, [user])\r\n .then(() => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-updated')\r\n );\r\n return true;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return false;\r\n });\r\n },\r\n [dispatch, addStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useAddMultipleStagingUsersService = () => {\r\n const dispatch = useDispatch();\r\n const addStagingUsersApi = useAddStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (stagingId: number, user: DraftUser[]) => {\r\n dispatch(updateDraftUsersStart());\r\n return addStagingUsersApi(stagingId, user)\r\n .then(() => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-updated')\r\n );\r\n return true;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return false;\r\n });\r\n },\r\n [dispatch, addStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useUpdateStagingUserService = () => {\r\n const dispatch = useDispatch();\r\n const updateStagingUsersApi = useUpdateStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (stagingId: number, stagingUserId: number, user: DraftUser) => {\r\n dispatch(updateDraftUsersStart());\r\n return updateStagingUsersApi(stagingId, stagingUserId, user)\r\n .then(() => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-updated')\r\n );\r\n return true;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return false;\r\n });\r\n },\r\n [dispatch, updateStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useDeleteStagingUserService = () => {\r\n const dispatch = useDispatch();\r\n const deleteStagingUsersApi = useDeleteStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (stagingId: number, stagingUserIds: number[]) => {\r\n dispatch(updateDraftUsersStart());\r\n return deleteStagingUsersApi(stagingId, stagingUserIds)\r\n .then(() => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-updated')\r\n );\r\n return true;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return false;\r\n });\r\n },\r\n [dispatch, deleteStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useInviteStagingUserService = () => {\r\n const dispatch = useDispatch();\r\n const inviteStagingUsersApi = useInviteStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (stagingId: number, stagingUserIds: number[], selectAll: boolean, search: SearchParams) => {\r\n dispatch(updateDraftUsersStart());\r\n return inviteStagingUsersApi(stagingId, stagingUserIds, selectAll, search)\r\n .then(data => {\r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'user-invited')\r\n );\r\n\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage('Something went wrong', 'error');\r\n throw error;\r\n });\r\n },\r\n [dispatch, inviteStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useAssignFiltersToStagingUsersService = () => {\r\n const dispatch = useDispatch();\r\n const assignFiltersToStagingUsersApi = useAssignFiltersToStagingUsersApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (\r\n stagingId: number,\r\n assignFilters: AssignFiltersToStagingUsersParams\r\n ) => {\r\n dispatch(updateDraftUsersStart());\r\n return assignFiltersToStagingUsersApi(stagingId, assignFilters)\r\n .then(data => {\r\n if (assignFilters.selectAll) {\r\n dispatch(SocketProgressShow());\r\n } else { \r\n dispatch(\r\n updateDraftUsersSuccess({ id: uuid() }, 'draft-updated')\r\n );\r\n }\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateDraftUsersFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return error;\r\n });\r\n },\r\n [dispatch, assignFiltersToStagingUsersApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useModifyDraftUsersService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (users: PaginationResult<DraftUser>) => {\r\n dispatch(modifyDraftUsersAction(users));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useModifyDraftUsersWithoutValidationService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (users: PaginationResult<DraftUser>) => {\r\n dispatch(modifyDraftUsersWithoutValidationAction(users));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useResetDraftsPageService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(() => {\r\n dispatch(resetDraftsPageAction());\r\n }, [dispatch]);\r\n};\r\n","import React, { FC, CSSProperties, ChangeEventHandler } from 'react';\nimport styled from 'styled-components';\n\nimport { Variables } from '../../../theme/variables';\n\nconst radioButtonSize = 20;\n\nconst COLORS = {\n background: Variables.Colors.white,\n checkedBackground: Variables.Colors.white,\n checkedColor: Variables.Colors.white,\n borderColor: Variables.Colors.iconGrayBg,\n disabled: {\n background: Variables.Colors.steelGrey,\n checkedBackground: Variables.Colors.iconGrayBg,\n checkedColor: Variables.Colors.white,\n },\n};\n\nconst StyledWrapper = styled.label<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n ${props => props.disabled && 'pointer-events: none'};\n margin-bottom: 8px;\n cursor: pointer;\n`;\n\nconst StyledLabel = styled.div<{\n color?: string;\n size?: number;\n disabled?: boolean;\n}>`\n font-size: ${props => (!!props.size ? props.size : 13)}px;\n margin-left: 8px;\n font-weight: 500;\n color: ${props => (\n props.color\n ? props.color\n : props.disabled\n ? Variables.Colors.steelGrey\n : Variables.Colors.black)};\n cursor: pointer;\n`;\n\nconst HiddenRadioButton = styled.input`\n visibility: hidden;\n position: absolute;\n`;\n\nconst StyledRadioButton = styled.div<{\n color?: string;\n background?: string;\n size: number;\n checked?: boolean;\n partial?: boolean;\n borderWidth?: number;\n disabled?: boolean;\n}>`\n cursor: pointer;\n height: ${props => props.size}px;\n width: ${props => props.size}px;\n border: ${props =>\n !!props.checked && !!props.borderWidth ? props.borderWidth : 1}px\n solid\n ${props =>\n props.checked\n ? props.disabled\n ? Variables.Colors.cloudyBlue\n : props.partial\n ? Variables.Colors.cloudyBlue\n : Variables.Colors.darkSkyBlue\n : Variables.Colors.cloudyBlue};\n background: ${props => props.background};\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n flex-shrink: 0;\n border-radius: 50%;\n`;\n\nexport const RadioButton: FC<{\n checked: boolean;\n partial?: boolean;\n handleChange: ChangeEventHandler<HTMLInputElement>;\n disabled?: boolean;\n label?: string;\n color?: string;\n background?: string;\n size?: number;\n fontColor?: string;\n fontSize?: number;\n className?: string;\n labelStyles?: CSSProperties;\n checkedBackground?: string;\n dataTest?: string;\n}> = ({\n checked,\n partial,\n disabled,\n handleChange,\n label,\n background,\n size,\n fontColor,\n fontSize,\n className,\n labelStyles,\n checkedBackground,\n dataTest,\n}) => {\n return (\n <StyledWrapper className={className} disabled={disabled}>\n <HiddenRadioButton\n type=\"checkbox\"\n onChange={e => {\n handleChange(e);\n }}\n data-test={\n dataTest\n && `${dataTest}${partial ? '-partially-checked' : (checked ? '-checked' : '')}`\n }\n />\n <StyledRadioButton\n size={size ? size : radioButtonSize}\n checked={checked}\n disabled={disabled}\n partial={partial}\n background={\n checked\n ? !!checkedBackground\n ? checkedBackground\n : COLORS.checkedBackground\n : background || COLORS.background\n }\n borderWidth={size ? size / 3 : 4}\n data-test={dataTest && `${dataTest}-view`}\n />\n {label && (\n <StyledLabel\n color={fontColor}\n size={fontSize}\n style={labelStyles}\n data-test={dataTest && `${dataTest}-label`}\n disabled={disabled}\n >\n {label}\n </StyledLabel>\n )}\n </StyledWrapper>\n );\n};\n\nexport default RadioButton;\n","import React, { FC, useState } from 'react';\nimport { kebabCase } from 'lodash';\nimport {\n filterInvitationRolesByPermissions,\n getUserRoleNameById,\n} from '../tools';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport { ClickAwayListener } from '@material-ui/core';\nimport { usePermissionsState } from '../../../../features/permissions/store/state';\nimport { Variables } from '../../../../theme/variables';\nimport { useUserRolesState } from '../../../../features/roles/store/states';\nimport RadioButton from '../../../../ui/components/RadioButton';\nimport OutsideActionBox from '../../../../ui/components/OutsideActionBox/OutsideActionBox';\n\nconst StyledSelectForm = styled.div<{\n disabled?: boolean;\n minWidth?: string;\n height?: number;\n error?: boolean;\n border?: boolean;\n}>`\n box-sizing: border-box;\n position: relative;\n border-radius: 4px;\n width: 129px;\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n padding-right: 15px;\n height: ${props => (props.height ? `${props.height}px` : '100%')};\n background: ${props => props.theme.Colors.white};\n color: ${props => props.theme.Colors.black};\n &.is-disabled {\n color: ${props => props.theme.Colors.cloudyBlue};\n pointer-events: none;\n }\n`;\n\nconst StyledLabelWrapper = styled.div`\n display: flex;\n height: 100%;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n`;\n\nconst SelectContainer = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst SelectTitle = styled.div`\n pointer-events: none;\n font-size: 11px;\n -webkit-transition: all 0.18s ease;\n transition: all 0.18s ease;\n display: block;\n align-items: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n font-weight: 600;\n margin-left: 15px;\n`;\n\nconst SelectLabelWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n`;\n\nconst SelectLabel = styled.div<{ color?: string }>`\n pointer-events: none;\n font-size: 13px;\n -webkit-transition: all 0.18s ease;\n transition: all 0.18s ease;\n display: flex;\n align-items: center;\n height: 100%;\n color: ${props =>\n props.color ? props.color : props.theme.Colors.cloudyBlue};\n font-weight: 500;\n margin-left: 15px;\n margin-bottom: 1px;\n`;\n\nconst RolesContainer = styled(motion.div)`\n padding: 24px 24px 16px 24px;\n width: 129px;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n top: 8px;\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n position: absolute;\n`;\n\nconst StyledRolesList = styled.div``;\n\nconst ScrollableRoleContainer = styled.div``;\n\nconst RoleItemWrapper = styled.div`\n display: flex;\n align-items: center;\n height: 24px;\n margin-bottom: 8px;\n`;\n\nconst ANIMATION_SCALE = 5;\nconst ROLE_PLACEHOLDER = 'Role*';\n\nexport const AssignRoles: FC<{\n disabled?: boolean;\n assignedRole: number | null;\n handleRoleCheck: any;\n dataTest: string;\n}> = ({ disabled, assignedRole, handleRoleCheck, dataTest }) => {\n const [show, setShow] = useState(false);\n const permissions = usePermissionsState();\n const userRoles = useUserRolesState();\n const roles = filterInvitationRolesByPermissions(\n userRoles.list,\n permissions\n );\n const assignedRoleName = getUserRoleNameById(assignedRole, userRoles.list);\n\n const updateCheckedRole = (value: number) => {\n setShow(false);\n handleRoleCheck(value);\n };\n\n return (\n <ClickAwayListener onClickAway={() => setShow(false)}>\n <StyledSelectForm\n disabled={disabled}\n border={show || !!assignedRole}\n >\n <StyledLabelWrapper\n onClick={() => setShow(!show)}\n data-test={dataTest}\n >\n {assignedRoleName && (\n <SelectTitle>{ROLE_PLACEHOLDER}</SelectTitle>\n )}\n <SelectLabelWrapper>\n <SelectLabel\n color={\n !assignedRoleName || disabled\n ? Variables.Colors.cloudyBlue\n : Variables.Colors.black\n }\n >\n {assignedRoleName || ROLE_PLACEHOLDER}\n </SelectLabel>\n </SelectLabelWrapper>\n </StyledLabelWrapper>\n <SelectContainer open={show && !disabled}>\n <RolesContainer\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n >\n <StyledRolesList>\n <ScrollableRoleContainer>\n {roles &&\n (roles || []).map(role => (\n <RoleItemWrapper\n key={role.name}\n onClick={() =>\n updateCheckedRole(role.value)\n }\n >\n <RadioButton\n checked={\n assignedRole === role.value\n }\n size={12}\n handleChange={() =>\n updateCheckedRole(\n role.value\n )\n }\n label={role.name}\n dataTest={`${kebabCase(role.name.toLowerCase())}-role-radio`}\n />\n </RoleItemWrapper>\n ))}\n </ScrollableRoleContainer>\n </StyledRolesList>\n </RolesContainer>\n </SelectContainer>\n </StyledSelectForm>\n </ClickAwayListener>\n );\n};\n","import React, { FC, useCallback, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { Fieldset } from '../../../ui/components/Fieldset';\r\nimport { PortableLabelsWithStore } from '../../portableLabels';\r\nimport { useSaveLabels } from '../store/hors/withLabels/services';\r\nimport { useLabelsState } from '../store/hors/withLabels/states';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Wrapper = styled.div<{ withBorder?: boolean }>`\r\n width: ${({withBorder}) => withBorder ? `272px` : '208px'};\r\n max-height: 432px;\r\n min-height: 200px;\r\n display: flex;\r\n ${({withBorder}) => withBorder && `padding: 16px 8px 0 8px;`};\r\n background-color: inherit;\r\n`;\r\n\r\nconst LabelsContainer = styled.div`\r\n width: 208px;\r\n height: 100%;\r\n overflow: auto;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Actions = styled.div<{ withBorder?: boolean }>`\r\n width: ${({withBorder}) => withBorder ? `272px` : '208px'};\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-shrink: 0;\r\n margin-top: 16px;\r\n ${({withBorder}) => withBorder && `padding: 0 8px;`};\r\n`;\r\n\r\nexport const AssignLabels: FC<{\r\n onLabelsChange?: (ids: number[]) => void;\r\n onSuccessApply: () => void;\r\n withBorder?: boolean;\r\n}> = ({ onLabelsChange, onSuccessApply, withBorder }) => {\r\n const saveLabels = useSaveLabels();\r\n const labels = useLabelsState();\r\n\r\n const [labelIds, setLabelIds] = useState<number[]>(labels.selected);\r\n const [applyDisabled, setApplyDisabled] = useState(true);\r\n\r\n const onLabelChangeHandler = useCallback(\r\n (ids: number[]) => {\r\n setLabelIds(ids);\r\n setApplyDisabled(false);\r\n },\r\n [setLabelIds]\r\n );\r\n\r\n const onApplyHandler = useCallback(() => {\r\n onLabelsChange?.(labelIds);\r\n saveLabels();\r\n onSuccessApply();\r\n }, [onLabelsChange, labelIds, onSuccessApply, saveLabels]);\r\n\r\n return (\r\n <Container>\r\n <Wrapper withBorder={withBorder}>\r\n <Fieldset\r\n withoutBorder={!withBorder}\r\n title={withBorder ? 'Labels' : ''}\r\n dataTest=\"labels-section-title\"\r\n >\r\n <LabelsContainer>\r\n <PortableLabelsWithStore\r\n onSetSelected={onLabelChangeHandler}\r\n showSave={false}\r\n showSelectActions\r\n showSearch\r\n />\r\n </LabelsContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions withBorder={withBorder}>\r\n <Button\r\n width={withBorder ? '120px' : '96px'}\r\n action={onSuccessApply}\r\n variant=\"inverse\"\r\n dataTest=\"cancel-button\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n width={withBorder ? '120px' : '96px'}\r\n action={onApplyHandler}\r\n disabled={applyDisabled}\r\n dataTest=\"apply-button\"\r\n >\r\n Apply\r\n </Button>\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import React, { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { Variables } from '../../../../theme/variables';\r\nimport { useLabelsState } from '../../../../features/portableLabels/store/hors/withLabels/states';\r\nimport { usePortableLabelsState } from '../../../../features/portableLabels/store/states';\r\nimport { AssignLabels } from '../../../../features/portableLabels/templates/AssignLabels';\r\nimport {\r\n useResetLabels,\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../../features/portableLabels/store/hors/withLabels/services';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { Tooltip } from '../../../../ui/components/Tooltip';\r\n\r\n//region Styles\r\nconst Container = styled.div`\r\n position: relative;\r\n height: 100%;\r\n`;\r\n\r\nconst SelectHead = styled.div<{ disabled?: boolean }>`\r\n cursor: ${({ disabled }) => disabled ? 'default' : 'pointer'};\r\n display: flex;\r\n height: 100%;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n`;\r\n\r\nconst SelectTitle = styled.div`\r\n pointer-events: none;\r\n font-size: 11px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: block;\r\n align-items: center;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n font-weight: 600;\r\n margin-left: 15px;\r\n`;\r\n\r\nconst SelectLabelWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\r\n width: 100%;\r\n`;\r\n\r\nconst SelectLabel = styled.div<{ color?: string; disabled?: boolean }>`\r\n pointer-events: none;\r\n font-size: 13px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n color: ${props =>\r\n props.disabled ? props.theme.Colors.lightBlueGray : props.color};\r\n font-weight: 500;\r\n margin-left: 15px;\r\n margin-bottom: 1px;\r\n`;\r\n\r\n//endregion\r\n\r\nexport const SelectedUserLabels: FC<{\r\n selectedLabels: number[];\r\n onSelectLabels(labelIds?: number[]): void;\r\n dataTest: string;\r\n}> = ({ selectedLabels, onSelectLabels, dataTest }) => {\r\n const { saved } = useLabelsState();\r\n const { data } = usePortableLabelsState();\r\n const saveLabels = useSaveLabels();\r\n const selectLabels = useSelectLabels();\r\n const resetLabels = useResetLabels();\r\n\r\n useEffect(() => {\r\n selectLabels(selectedLabels);\r\n saveLabels();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectLabels, saveLabels]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetLabels();\r\n };\r\n }, [resetLabels]);\r\n\r\n useEffect(() => {\r\n onSelectLabels(saved);\r\n }, [onSelectLabels, saved]);\r\n\r\n const labelsDisabled = !data || data.items.length < 1;\r\n const selectedUserLabelsCount = selectedLabels.filter(id => id > 0).length;\r\n\r\n return (\r\n <Container>\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignLabels\r\n onSuccessApply={() => {\r\n hide();\r\n }}\r\n />\r\n )}\r\n horizontalOffset={64}\r\n >\r\n {(ref, { toggleShown }) => (\r\n <span ref={ref}>\r\n <Tooltip\r\n label={'No labels added yet'}\r\n preset={'dropdown'}\r\n disabled={!labelsDisabled}\r\n dataTest={`${dataTest}-no-result`}\r\n >\r\n <SelectHead\r\n onClick={() => !labelsDisabled && toggleShown()}\r\n disabled={labelsDisabled}\r\n data-test={dataTest}\r\n >\r\n {!!selectedUserLabelsCount && (\r\n <SelectTitle>Labels</SelectTitle>\r\n )}\r\n <SelectLabelWrapper>\r\n <SelectLabel\r\n color={\r\n selectedUserLabelsCount < 1\r\n ? Variables.Colors.cloudyBlue\r\n : Variables.Colors.black\r\n }\r\n disabled={labelsDisabled}\r\n >\r\n {selectedUserLabelsCount < 1\r\n ? 'Labels'\r\n : `${selectedUserLabelsCount} ${\r\n selectedUserLabelsCount > 1\r\n ? 'Labels'\r\n : 'Label'\r\n }`}\r\n </SelectLabel>\r\n </SelectLabelWrapper>\r\n </SelectHead>\r\n </Tooltip>\r\n </span>\r\n )}\r\n </Popup>\r\n </Container>\r\n );\r\n};\r\n","import React, { FC, useCallback, useState } from 'react';\nimport { PractisSetWithDueDate } from '../../../constants/interfaces/Draft';\nimport styled from 'styled-components';\nimport { Button } from '../../../ui/components/Button';\nimport { Fieldset } from '../../../ui/components/Fieldset';\nimport { PortablePractisSetsWithStore } from '../index';\nimport { useSavePractisSets } from '../store/hors/withPractisSets/services';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst PractisSetsContainer = styled.div`\n width: 348px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n flex-shrink: 0;\n margin-top: 16px;\n width: 100%;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 16px;\n`;\n\nexport const AssignPractisSets: FC<{\n onSuccessApply: () => void;\n}> = ({ onSuccessApply }) => {\n const savePractisSets = useSavePractisSets();\n const [, setPractisSetIds] = useState<PractisSetWithDueDate[]>([]);\n const [applyDisabled, setApplyDisabled] = useState(true);\n\n const onPractissetHandler = useCallback(\n (ids: PractisSetWithDueDate[]) => {\n setPractisSetIds(ids);\n setApplyDisabled(false);\n },\n [setPractisSetIds]\n );\n\n\n const onApplyHandler = useCallback(() => {\n savePractisSets();\n onSuccessApply();\n }, [onSuccessApply, savePractisSets]);\n\n return (\n <Container>\n <Wrapper>\n <Fieldset withoutBorder>\n <PractisSetsContainer>\n <PortablePractisSetsWithStore\n showSave={false}\n showSelectActions\n showSearch\n onSetSelected={onPractissetHandler}\n />\n </PractisSetsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <ButtonWrapper>\n <Button\n width=\"96px\"\n action={() => onSuccessApply()}\n variant={'inverse'}\n dataTest=\"cancel-button\"\n >\n Cancel\n </Button>\n </ButtonWrapper>\n <Button\n width=\"96px\"\n disabled={applyDisabled}\n action={() => onApplyHandler()}\n dataTest=\"apply-button\"\n >\n Apply\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Variables } from '../../../../theme/variables';\r\n\r\nimport {\r\n useResetPractisSets,\r\n useSavePractisSets,\r\n useSelectMultiplePractisSets,\r\n} from '../../../../features/portablePractisSets/store/hors/withPractisSets/services';\r\nimport { AssignPractisSets } from '../../../../features/portablePractisSets/templates/AssignPractisSets';\r\nimport { usePractisSetsState } from '../../../../features/portablePractisSets/store/hors/withPractisSets/states';\r\nimport { usePortablePractisSetsState } from '../../../../features/portablePractisSets/store/states';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { Tooltip } from '../../../../ui/components/Tooltip';\r\nimport { PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\r\nimport { PractisSetStatuses } from '../../../../constants/interfaces/PractisSets';\r\n\r\n\r\nconst Container = styled.div`\r\n position: relative;\r\n height: 100%;\r\n`;\r\n\r\nconst SelectHead = styled.div<{ disabled?: boolean }>`\r\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\r\n display: flex;\r\n height: 100%;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n`;\r\n\r\nconst SelectTitle = styled.div`\r\n pointer-events: none;\r\n font-size: 11px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: block;\r\n align-items: center;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n font-weight: 600;\r\n margin-left: 15px;\r\n`;\r\n\r\nconst SelectButtonWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\r\n width: 100%;\r\n`;\r\n\r\nconst SelectLabel = styled.div<{ color?: string; disabled?: boolean }>`\r\n pointer-events: none;\r\n font-size: 13px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n color: ${props =>\r\n props.disabled ? props.theme.Colors.lightBlueGray : props.color};\r\n font-weight: 500;\r\n margin-left: 15px;\r\n margin-bottom: 1px;\r\n`;\r\n\r\nconst SelectedUserPractisSetsComponent: FC<{\r\n selectedPractisSets: PractisSetWithDueDate[];\r\n onSelectPractisSets(practisSetIds?: PractisSetWithDueDate[]): void;\r\n dataTest: string;\r\n}> = ({ selectedPractisSets, onSelectPractisSets, dataTest }) => {\r\n const { saved } = usePractisSetsState();\r\n const { data } = usePortablePractisSetsState();\r\n const savePractisSets = useSavePractisSets();\r\n const selectMultiplePractisSets = useSelectMultiplePractisSets();\r\n const resetPractisSets = useResetPractisSets();\r\n\r\n useEffect(() => {\r\n selectMultiplePractisSets(selectedPractisSets);\r\n savePractisSets();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectMultiplePractisSets]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetPractisSets();\r\n };\r\n }, [resetPractisSets]);\r\n\r\n useEffect(() => {\r\n onSelectPractisSets(saved);\r\n }, [onSelectPractisSets, saved]);\r\n\r\n const practisSetsDisabled = !data || data.items.filter(item => item.status === PractisSetStatuses.ACTIVE).length < 1;\r\n\r\n return (\r\n <Container>\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignPractisSets\r\n onSuccessApply={() => {\r\n hide();\r\n }}\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown }) => (\r\n <span ref={ref}>\r\n <Tooltip\r\n label={'No practis sets added yet'}\r\n preset={'table-item'}\r\n disabled={!practisSetsDisabled}\r\n dataTest={`${dataTest}-no-result`}\r\n >\r\n <SelectHead\r\n onClick={() =>\r\n !practisSetsDisabled && toggleShown()\r\n }\r\n disabled={practisSetsDisabled}\r\n data-test={dataTest}\r\n >\r\n {selectedPractisSets &&\r\n !!selectedPractisSets.length && (\r\n <SelectTitle>Practis Sets</SelectTitle>\r\n )}\r\n <SelectButtonWrapper>\r\n <SelectLabel\r\n color={\r\n selectedPractisSets.length < 1\r\n ? Variables.Colors.cloudyBlue\r\n : Variables.Colors.black\r\n }\r\n disabled={practisSetsDisabled}\r\n >\r\n {selectedPractisSets.length < 1\r\n ? 'Practis Sets'\r\n : `${selectedPractisSets.length} ${\r\n selectedPractisSets.length > 1\r\n ? 'Practis Sets'\r\n : 'Practis Set'\r\n }`}\r\n </SelectLabel>\r\n </SelectButtonWrapper>\r\n </SelectHead>\r\n </Tooltip>\r\n </span>\r\n )}\r\n </Popup>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default SelectedUserPractisSetsComponent;\r\n","import { createContext } from 'react';\n\nimport { AppState } from '../../../../../../store/reducers';\nimport { DEFAULT_TEAMS_SCOPE, Scope } from '../scopes';\n\nexport type WithTeamsContextProps<T = keyof AppState, K = Scope> = {\n reducerName?: T;\n scope?: K;\n};\n\nexport const WithTeamsContext = createContext<WithTeamsContextProps>({\n reducerName: 'portableTeams',\n scope: DEFAULT_TEAMS_SCOPE,\n});\n","import { useContext } from 'react';\n\nimport { WithTeamsContextProps, WithTeamsContext } from './context';\n\nexport const useWithTeamsContext = (): WithTeamsContextProps => {\n const context = useContext(WithTeamsContext);\n\n if (!context) {\n throw new Error(\n 'Cannot find WithTeams context provider. Please make a sure that you are located on the children of WithTeamsProvider'\n );\n }\n return context;\n};\n","import { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\n\nimport { useWithTeamsContext } from '../context/useWithTeamsContext';\nimport { encapsulateAction } from '../../../../../../store/helpers/encapsulateAction';\nimport { ActionTeam } from '../actions';\nimport { DEFAULT_TEAMS_SCOPE, Scope, WithTeamsScopes } from '../scopes';\n\nexport const useEncapsulatedDispatch = () => {\n const dispatch = useDispatch();\n const { reducerName, scope } = useWithTeamsContext();\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithTeamsContext.Provider props'\n );\n }\n\n const targetScope = (scope || DEFAULT_TEAMS_SCOPE) as Scope;\n if (\n targetScope !== DEFAULT_TEAMS_SCOPE &&\n !WithTeamsScopes[reducerName]?.includes(targetScope)\n ) {\n throw new Error(\n `Undefined \"${targetScope}\" scope of portableTeams. Please check config (WithTeamsScopes) for \"${reducerName}\" reducer`\n );\n }\n\n return useCallback(\n <T extends ActionTeam>(action: T) => {\n action._scope = targetScope;\n dispatch(encapsulateAction(`${reducerName}/teams/`, action));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatch]\n );\n};\n","import { useCallback } from 'react';\r\n\r\nimport { useSearchTeamsApi } from './api';\r\nimport {\r\n clearAction,\r\n saveAction,\r\n searchFailureAction,\r\n searchSuccessAction,\r\n selectAllAction,\r\n deselectAllAction,\r\n selectTeamsAction,\r\n searchStartAction,\r\n resetSelectedAction,\r\n resetAction,\r\n selectMultipleTeamsAction,\r\n} from './actions';\r\n\r\nimport { useEncapsulatedDispatch } from './helpers/useEncapsulatedDispatch';\r\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\r\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\r\nimport { useDispatch } from 'react-redux';\r\nimport { NOT_AUTHORIZED_ERROR_MESSAGE } from '../../../../../ui/components/ErrorMessages/constants';\r\n\r\nexport const useSearchTeamsService = () => {\r\n const dispatch = useDispatch();\r\n const showMessage = useShowMessage();\r\n const searchTeams = useSearchTeamsApi();\r\n\r\n return useCallback(\r\n (sp?: SearchParams) => {\r\n dispatch(searchStartAction());\r\n\r\n return searchTeams(sp)\r\n .then(data => {\r\n dispatch(searchSuccessAction(data));\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchFailureAction(error.message));\r\n error?.message !== NOT_AUTHORIZED_ERROR_MESSAGE &&\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, showMessage, searchTeams]\r\n );\r\n};\r\n\r\nexport const useClearTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(clearAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSaveTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(saveAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useSelectTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n return useCallback(\r\n (ids: number) => {\r\n dispatch(selectTeamsAction(ids));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSelectMultipleTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n return useCallback(\r\n (ids: number[]) => {\r\n dispatch(selectMultipleTeamsAction(ids));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useSelectAllTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(\r\n (processedTeams: number[]) => {\r\n dispatch(selectAllAction(processedTeams));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useDeselectAllTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(deselectAllAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useResetSelectedTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(resetSelectedAction());\r\n }, [dispatch]);\r\n};\r\n\r\nexport const useResetTeams = () => {\r\n const dispatch = useEncapsulatedDispatch();\r\n\r\n return useCallback(() => {\r\n dispatch(resetAction());\r\n }, [dispatch]);\r\n};\r\n","import { useCallback } from 'react';\n\nimport { useHttp } from '../../../../../tools/http/Http';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { TeamBasic } from '../../../../../constants/interfaces/TeamBasic';\n\nexport const useSearchTeamsApi = () => {\n const http = useHttp();\n return useCallback(\n (sp?: SearchParams): Promise<PaginationResult<TeamBasic>> =>\n http.post('teams/search/basic', sp),\n [http]\n );\n};\n","import { Action } from 'redux';\r\n\r\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\r\nimport { Scope } from './scopes';\r\nimport { TeamBasic } from '../../../../../constants/interfaces/TeamBasic';\r\n\r\n//region Types\r\ntype ReturnTypeTeamAction<T extends (...args: any) => any> = ReturnType<T> &\r\n ActionPayload;\r\n\r\ntype ActionPayload = { _scope?: Scope };\r\n\r\nexport type ActionTeam<T = any> = Action<T> & ActionPayload;\r\n\r\nexport type Actions =\r\n | ReturnTypeTeamAction<typeof selectAllAction>\r\n | ReturnTypeTeamAction<typeof deselectAllAction>\r\n | ReturnTypeTeamAction<typeof resetSelectedAction>\r\n | ReturnTypeTeamAction<typeof selectTeamsAction>\r\n | ReturnTypeTeamAction<typeof selectMultipleTeamsAction>\r\n | ReturnTypeTeamAction<typeof clearAction>\r\n | ReturnTypeTeamAction<typeof saveAction>\r\n | ReturnTypeTeamAction<typeof resetAction>;\r\n\r\n//endregion\r\n\r\nexport const searchStartAction = (): ActionTeam<'searchStartTeams'> => ({\r\n type: 'searchStartTeams',\r\n});\r\n\r\nexport const searchSuccessAction = (\r\n result: PaginationResult<TeamBasic>\r\n): ActionTeam<'searchSuccessTeams'> & {\r\n result: PaginationResult<TeamBasic>;\r\n} => ({\r\n type: 'searchSuccessTeams',\r\n result,\r\n});\r\n\r\nexport const searchFailureAction = (\r\n message: string\r\n): ActionTeam<'searchFailureTeams'> & { message: string } => ({\r\n type: 'searchFailureTeams',\r\n message,\r\n});\r\n\r\nexport const selectAllAction = (\r\n allTeams: number[]\r\n): ActionTeam<'selectAllTeams'> & { allTeams: number[] } => ({\r\n type: 'selectAllTeams',\r\n allTeams,\r\n});\r\n\r\nexport const deselectAllAction = (): ActionTeam<'deselectAllTeams'> => ({\r\n type: 'deselectAllTeams',\r\n});\r\n\r\nexport const resetSelectedAction = (): ActionTeam<'resetSelectedTeams'> => ({\r\n type: 'resetSelectedTeams',\r\n});\r\n\r\nexport const selectTeamsAction = (\r\n id: number\r\n): ActionTeam<'selectTeams'> & { id: number } => ({\r\n type: 'selectTeams',\r\n id,\r\n});\r\n\r\nexport const selectMultipleTeamsAction = (\r\n ids: number[]\r\n): ActionTeam<'selectMultipleTeams'> & { ids: number[] } => ({\r\n type: 'selectMultipleTeams',\r\n ids,\r\n});\r\n\r\nexport const clearAction = (): ActionTeam<'clearTeams'> => ({\r\n type: 'clearTeams',\r\n});\r\n\r\nexport const saveAction = (): ActionTeam<'saveTeams'> => ({\r\n type: 'saveTeams',\r\n});\r\n\r\nexport const resetAction = (): ActionTeam<'resetTeams'> => ({\r\n type: 'resetTeams',\r\n});\r\n","import { useSelector } from 'react-redux';\n\nimport { useWithTeamsContext } from './context/useWithTeamsContext';\nimport { TeamsState } from './reducer';\nimport { DEFAULT_LABELS_SCOPE } from '../../../../portableLabels/store/hors/withLabels/scopes';\n\nexport const useTeamsState = (): TeamsState => {\n const { reducerName, scope } = useWithTeamsContext();\n const appState = useSelector(state => state);\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithTeamsContext.Provider props'\n );\n }\n\n const labelsState: TeamsState | undefined =\n // @ts-ignore\n // TODO implement `_teams?: TeamsState` field into each reducer (create general type)\n // interface GeneralReducer {\n // ...\n // _teams?: StateWithTeams;\n // }\n appState[reducerName]?._teams?.[scope || DEFAULT_LABELS_SCOPE];\n if (!labelsState) {\n throw new Error(\n `Wrap your reducer ${reducerName} via \"withTeamsReducer\" HOR`\n );\n }\n\n return labelsState;\n};\n","import React, { FC, useCallback } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport Checkbox from '../../../ui/components/Checkbox';\r\nimport { TeamBasic } from '../../../constants/interfaces/TeamBasic';\r\nimport { handleToggleSelectedItems } from '../../../pages/ActionPages/NewUser/tools';\r\nimport { Tooltip } from '../../../ui/components/Tooltip';\r\nimport Star from '../../../ui/icons/Star';\r\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\r\n\r\nconst StyledTeamsList = styled.div`\r\n overflow: auto;\r\n height: 100%;\r\n`;\r\n\r\nconst TopSideList = styled.span``;\r\n\r\nconst GeneralList = styled.span``;\r\n\r\nconst TeamsItemWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin: 10px 0;\r\n`;\r\n\r\nconst DefaultTeamIconHolderWrapper = styled.div`\r\n width: 12px;\r\n display: flex;\r\n justify-content: center;\r\n border-radius: 2px;\r\n background-color: ${props => props.theme.Colors.macaroniAndCheese};\r\n`;\r\n\r\nconst DefaultTeamIconHolder = styled.div`\r\n width: 10px;\r\n height: 12px;\r\n display: block;\r\n color: ${props => props.theme.Colors.white};\r\n`;\r\n\r\nconst TeamsItem = styled.div<{ disabled?: boolean }>`\r\n color: ${props => props.theme.Colors.black};\r\n cursor: ${props => props.disabled ? `default` : `pointer`};\r\n border-radius: 8px;\r\n font-weight: 500;\r\n font-size: 13px;\r\n padding: 0 12px;\r\n align-items: center;\r\n background: ${props => props.theme.Colors.white};\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n display: inline-block;\r\n ${props => props.disabled && 'pointer-events: none'}\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n`;\r\nexport const PortableTeamsList: FC<{\r\n teams?: TeamBasic[];\r\n selectedTeams: number[];\r\n disabled?: boolean;\r\n showDefaultMembers?: boolean\r\n setTeamFilters?: (teamIds: number[]) => void;\r\n}> = ({ teams, selectedTeams, showDefaultMembers, setTeamFilters }) => {\r\n const isChecked = useCallback(\r\n (setId?: number) => {\r\n return !!selectedTeams && !!setId && selectedTeams.includes(setId);\r\n },\r\n [selectedTeams]\r\n );\r\n\r\n const isPartiallyChecked = useCallback(\r\n (teamId?: number) => {\r\n return (\r\n !!selectedTeams &&\r\n !!teamId &&\r\n selectedTeams.includes(-Number(teamId))\r\n );\r\n },\r\n [selectedTeams]\r\n );\r\n\r\n const changeHandler = (teamId?: number) => {\r\n if (teamId && setTeamFilters) {\r\n setTeamFilters(handleToggleSelectedItems(selectedTeams, teamId));\r\n }\r\n };\r\n\r\n if (!teams || (teams && teams.length === 0)) return null;\r\n\r\n const topListTeams = teams.filter(\r\n team => team.isDefault || (team.id && selectedTeams.map(id => Math.abs(id)).includes(team.id))\r\n );\r\n\r\n const bottomListTeams = teams.filter(\r\n team => !team.isDefault && team.id && !selectedTeams.map(id => Math.abs(id)).includes(team.id)\r\n );\r\n\r\n const processedTopListTeams = showDefaultMembers ? topListTeams.filter(team => !team.isDefault) : topListTeams;\r\n\r\n return (\r\n <StyledTeamsList>\r\n {topListTeams.length > 0 && (\r\n <TopSideList>\r\n {showDefaultMembers &&\r\n topListTeams\r\n .filter(team => team.isDefault)\r\n .map(team => (\r\n <TeamsItemWrapper\r\n key={team.id}\r\n data-test=\"all-members-container\"\r\n >\r\n <Tooltip\r\n label=\"This team cannot be modified\"\r\n preset=\"checkbox-icon\"\r\n >\r\n <DefaultTeamIconHolderWrapper data-test=\"all-members-icon\">\r\n <DefaultTeamIconHolder>\r\n <Star viewBox=\"-1 1 10 12\" />\r\n </DefaultTeamIconHolder>\r\n </DefaultTeamIconHolderWrapper>\r\n </Tooltip>\r\n <TeamsItem\r\n disabled\r\n data-test=\"all-members-item\"\r\n >\r\n {team.name}\r\n </TeamsItem>\r\n </TeamsItemWrapper>\r\n ))}\r\n {processedTopListTeams.map(team => {\r\n return (\r\n <TeamsItemWrapper\r\n key={team.id}\r\n data-test=\"team-item-container\"\r\n >\r\n <Checkbox\r\n size={12}\r\n checked={\r\n isChecked(team.id) ||\r\n isPartiallyChecked(team.id)\r\n }\r\n partial={isPartiallyChecked(team.id)}\r\n handleChange={() => changeHandler(team.id)}\r\n dataTest=\"team-item-checkbox\"\r\n />\r\n <TeamsItem\r\n onClick={() => changeHandler(team.id)}\r\n data-test=\"team-item-title\"\r\n >\r\n {team.name}\r\n </TeamsItem>\r\n </TeamsItemWrapper>\r\n );\r\n })}\r\n {topListTeams.length < teams.length && <TableDivider width=\"98%\" />}\r\n </TopSideList>\r\n )}\r\n <GeneralList>\r\n {bottomListTeams.map(team => {\r\n return (\r\n <TeamsItemWrapper\r\n key={team.id}\r\n data-test=\"team-item-container\"\r\n >\r\n <Checkbox\r\n size={12}\r\n checked={\r\n isChecked(team.id) ||\r\n isPartiallyChecked(team.id)\r\n }\r\n partial={isPartiallyChecked(team.id)}\r\n handleChange={() => changeHandler(team.id)}\r\n dataTest=\"team-item-checkbox\"\r\n />\r\n <TeamsItem\r\n onClick={() => changeHandler(team.id)}\r\n data-test=\"team-item-title\"\r\n >\r\n {team.name}\r\n </TeamsItem>\r\n </TeamsItemWrapper>\r\n );\r\n })}\r\n </GeneralList>\r\n </StyledTeamsList>\r\n );\r\n};","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport EmptyBox from '../../../ui/icons/EmptyBox';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\n\nconst StyledEmptyLabels = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyLabelsContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst IconWrapper = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoTeamsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyTeams: FC<{ loading?: boolean; isEmpty?: boolean }> = ({\n loading,\n isEmpty,\n}) => {\n if (loading) {\n return (\n <StyledEmptyLabels>\n <Loading />\n </StyledEmptyLabels>\n );\n }\n\n return (\n <StyledEmptyLabels>\n <StyledEmptyLabelsContent>\n <IconWrapper data-test=\"teams-searchbox-empty-result-icon\">\n {isEmpty ? <EmptyBox /> : <NoSearchResult />}\n </IconWrapper>\n <NoTeamsTitle data-test=\"teams-searchbox-empty-result-label\">\n {isEmpty ? 'No Teams yet' : 'No Teams found'}\n </NoTeamsTitle>\n </StyledEmptyLabelsContent>\n </StyledEmptyLabels>\n );\n};\n\nexport default EmptyTeams;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { TeamBasic } from '../../../constants/interfaces/TeamBasic';\r\nimport { PortableTeamsList } from './PortableTeamsList';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { Variables } from '../../../theme/variables';\r\nimport EmptyTeams from './EmptyTeams';\r\nimport { sortBy } from 'lodash';\r\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\n//region Types\r\ntype Action = 'clear' | 'select';\r\n\r\nexport type PortableTeamsProps = {\r\n teams?: PaginationResult<TeamBasic>;\r\n selectedList: number[];\r\n onSave?: () => void;\r\n onSelectAll?: (processedTeams: number[]) => void;\r\n onDeselectAll?: () => void;\r\n onClearSelected?: () => void;\r\n onSetSelected?: (teamIds: number[]) => void;\r\n filtersTitle?: string;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n showSave?: boolean;\r\n showDefaultMembers?: boolean;\r\n};\r\n//endregion\r\n\r\n//region Styles\r\nconst StyledCreateTeams = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst CreateTeamsBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst FiltersSavePanel = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.black};\r\n font-weight: 600;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst StyledPlainActionsWrapper = styled.div`\r\n padding-right: 15px;\r\n`;\r\n//endregion\r\n\r\nconst PortableTeams: FC<PortableTeamsProps> = ({\r\n teams,\r\n selectedList,\r\n disabled,\r\n loading,\r\n onSave,\r\n onClearSelected,\r\n onDeselectAll,\r\n onSelectAll,\r\n onSetSelected,\r\n filtersTitle,\r\n showSelectActions,\r\n showSearch,\r\n showDefaultMembers,\r\n showSave = true,\r\n}) => {\r\n const actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n > = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n };\r\n\r\n const clearHandler = useCallback(() => {\r\n onClearSelected?.();\r\n }, [onClearSelected]);\r\n\r\n const [processedSelectedList, setProcessedSelectedList] = useState<\r\n number[]\r\n >([]);\r\n\r\n const [searchTerm, setSearchTerm] = useState<string | undefined>(undefined);\r\n const searchHandler = (value: string) => setSearchTerm(value);\r\n const [, setAllSelected] = useState<boolean>(false);\r\n const defaultTeam = teams?.items.find(item => item.isDefault);\r\n const hasAllMembers = !!defaultTeam;\r\n \r\n const processedTeams = useMemo(() => {\r\n let result = teams?.items || [];\r\n if (!!searchTerm) {\r\n result = result.filter(\r\n item =>\r\n item.name\r\n .toLowerCase()\r\n .indexOf(searchTerm.toLowerCase()) !== -1\r\n );\r\n }\r\n if (result.length > 0) {\r\n result = sortBy(result, t => t.isDefault ? '' : t.name?.toLowerCase());\r\n const processedDataIds = result.map(item => item.id!);\r\n \r\n setProcessedSelectedList(\r\n selectedList.filter(item =>\r\n processedDataIds.includes(Math.abs(item))\r\n )\r\n );\r\n }\r\n return result;\r\n }, [teams?.items, searchTerm, selectedList]);\r\n\r\n const isAllSelected = useMemo(\r\n () =>\r\n selectedList.length === teams?.items?.length &&\r\n !(teams?.items.length === 1 && hasAllMembers),\r\n [selectedList.length, teams?.items.length, hasAllMembers]\r\n );\r\n\r\n //TODO: [MM]: Refactor: Use `deSelectAllHandler` either for both `Select All` and `Unselect All` buttons and delete `clearHandler`\r\n //or rename confusing `deSelectAllHandler` to `handleClickSelectAll` and get rid of `if (isAllSelected && onDeselectAll` statement.\r\n const toggleAllHandler = useCallback(() => {\r\n if (isAllSelected && onDeselectAll) {\r\n onDeselectAll();\r\n setAllSelected(false)\r\n } else if (onSelectAll) {\r\n setAllSelected(true)\r\n onSelectAll(processedTeams.map(item => item.id!));\r\n }\r\n }, [onDeselectAll, onSelectAll, isAllSelected, processedTeams]);\r\n\r\n useEffect(() => {\r\n if (\r\n !!searchTerm &&\r\n processedSelectedList.length !== selectedList.length\r\n ) {\r\n // toggleAllHandler();\r\n }\r\n }, [searchTerm, processedSelectedList, selectedList, processedTeams]);\r\n\r\n const showNoItems = !teams?.totalCount;\r\n const showEmptyState = !processedTeams.length || loading;\r\n const selectedTeamsLength = selectedList?.filter(\r\n id => id > 0 && id !== defaultTeam?.id)?.length;\r\n\r\n return (\r\n <StyledCreateTeams>\r\n <CreateTeamsBody>\r\n {filtersTitle && (\r\n <FiltersHeader>\r\n <FilterTitle>{filtersTitle}</FilterTitle>\r\n </FiltersHeader>\r\n )}\r\n {showSearch && (\r\n <SearchWrapper data-test=\"teams-searchbox-wrapper\">\r\n <TableSearchInput\r\n onChange={searchHandler}\r\n disabled={showNoItems}\r\n dataTest=\"teams-searchbox-field\"\r\n />\r\n </SearchWrapper>\r\n )}\r\n {showSelectActions && !showNoItems && (\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"teams-selected-caption\">\r\n {selectedTeamsLength > 0\r\n ? `${selectedTeamsLength} ${\r\n selectedTeamsLength > 1\r\n ? ' Teams selected'\r\n : ' Team selected'\r\n }`\r\n : 'No Teams selected'}\r\n </SelectedCaption>\r\n </div>\r\n <StyledPlainActionsWrapper>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n selectedList.length === 0 ||\r\n showEmptyState ||\r\n (processedTeams.length < 1 &&\r\n hasAllMembers)\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"teams-unselect-all-button\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={\r\n showEmptyState ||\r\n (processedTeams.length === 1 &&\r\n hasAllMembers &&\r\n !searchTerm)\r\n }\r\n color={actionConfig.select.color}\r\n colorActive={\r\n actionConfig.select.colorActive\r\n }\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={toggleAllHandler}\r\n data-test=\"teams-select-all-button\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </StyledPlainActionsWrapper>\r\n </SelectActions>\r\n )}\r\n {showEmptyState ? (\r\n <EmptyTeams\r\n loading={loading}\r\n isEmpty={!teams?.totalCount}\r\n />\r\n ) : (\r\n <>\r\n <PortableTeamsList\r\n showDefaultMembers={showDefaultMembers}\r\n teams={processedTeams}\r\n selectedTeams={selectedList}\r\n disabled={disabled}\r\n setTeamFilters={onSetSelected}\r\n />\r\n {onSave && showSave && (\r\n <FiltersSavePanel>\r\n <Button\r\n type={'button'}\r\n label={'Save'}\r\n action={() => onSave()}\r\n height={'48px'}\r\n width={'160px'}\r\n />\r\n </FiltersSavePanel>\r\n )}\r\n </>\r\n )}\r\n </CreateTeamsBody>\r\n </StyledCreateTeams>\r\n );\r\n};\r\n\r\nexport { PortableTeams };\r\n","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { TeamBasic } from '../../../constants/interfaces/TeamBasic';\nimport { useSelector } from 'react-redux';\n\ntype PortableTeamsBaseState = {\n data: PaginationResult<TeamBasic>;\n loading: boolean;\n};\n\nexport type PortableTeamsState = PortableTeamsBaseState;\n\nexport const initialState = {\n data: {\n items: [],\n limit: 0,\n offset: 0,\n numberOfPages: 0,\n totalCount: 0,\n lastUpdated: undefined,\n },\n loading: false,\n};\n\nexport const usePortableTeamsState = (): PortableTeamsBaseState => {\n const appState = useSelector(state => state);\n return appState.portableTeams;\n};\n","import React, { FC, useEffect } from 'react';\r\n\r\nimport {\r\n useClearTeams,\r\n useDeselectAllTeams,\r\n useResetSelectedTeams,\r\n useSaveTeams,\r\n useSearchTeamsService,\r\n useSelectAllTeams,\r\n useSelectMultipleTeams,\r\n} from '../store/hors/withTeams/services';\r\nimport { useTeamsState } from '../store/hors/withTeams/states';\r\nimport { PortableTeams, PortableTeamsProps } from './PortableTeams';\r\nimport { usePortableTeamsState } from '../store/states';\r\n\r\ntype Props = Pick<\r\n PortableTeamsProps,\r\n | 'filtersTitle'\r\n | 'onSetSelected'\r\n | 'showSelectActions'\r\n | 'showSearch'\r\n | 'showSave'\r\n> & {\r\n fetchOnMount?: boolean;\r\n resetSelectedOnUnmount?: boolean;\r\n showDefaultMembers?: boolean;\r\n selectedTeams?: number[];\r\n};\r\n\r\nexport const PortableTeamsWithStore: FC<Props> = ({\r\n onSetSelected,\r\n selectedTeams,\r\n fetchOnMount = true,\r\n resetSelectedOnUnmount = true,\r\n showDefaultMembers,\r\n ...rest\r\n}) => {\r\n const search = useSearchTeamsService();\r\n const { selected } = useTeamsState();\r\n const { data, loading } = usePortableTeamsState();\r\n const clearHandler = useClearTeams();\r\n const saveHandler = useSaveTeams();\r\n const select = useSelectMultipleTeams();\r\n const selectAll = useSelectAllTeams();\r\n const deselectAll = useDeselectAllTeams();\r\n const resetSelected = useResetSelectedTeams();\r\n\r\n useEffect(() => {\r\n if (fetchOnMount) {\r\n search();\r\n }\r\n\r\n return () => {\r\n if (resetSelectedOnUnmount) {\r\n resetSelected();\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (selectedTeams) {\r\n selectAll(selectedTeams);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <PortableTeams\r\n teams={data}\r\n selectedList={selected}\r\n loading={loading}\r\n onClearSelected={() => {\r\n onSetSelected && onSetSelected([]);\r\n clearHandler();\r\n }}\r\n onSave={saveHandler}\r\n onSetSelected={(team) => { \r\n onSetSelected && onSetSelected(team);\r\n select(team);\r\n }}\r\n showDefaultMembers={showDefaultMembers}\r\n onSelectAll={(teams) => { \r\n onSetSelected && onSetSelected(teams);\r\n selectAll(teams);\r\n }}\r\n onDeselectAll={deselectAll}\r\n {...rest}\r\n />\r\n );\r\n};\r\n","import React, { FC, useCallback } from 'react';\r\nimport { PortableTeams } from './PortableTeams';\r\nimport { usePortableTeamsState } from '../store/states';\r\n\r\ninterface Props {\r\n selectedTeams: number[];\r\n showDefaultMembers?: boolean\r\n onChangeSelectedTeams(teamIds: number[]): void;\r\n}\r\n\r\nexport const PortableTeamsWithStore2: FC<Props> = props => {\r\n const { selectedTeams, showDefaultMembers, onChangeSelectedTeams } = props;\r\n const { data, loading } = usePortableTeamsState();\r\n\r\n const handleSelectAll = useCallback(\r\n () => onChangeSelectedTeams(data?.items.map(t => t.id!)),\r\n [data?.items, onChangeSelectedTeams]\r\n );\r\n\r\n const handleDeselectAll = useCallback(\r\n () => onChangeSelectedTeams([]),\r\n [onChangeSelectedTeams]\r\n );\r\n\r\n return (\r\n <PortableTeams\r\n showDefaultMembers={showDefaultMembers}\r\n teams={data}\r\n selectedList={selectedTeams}\r\n loading={loading}\r\n showSave={false}\r\n showSelectActions={true}\r\n showSearch={true}\r\n onSetSelected={onChangeSelectedTeams}\r\n onSelectAll={handleSelectAll}\r\n onClearSelected={handleDeselectAll} //nice interface! :(\r\n />\r\n );\r\n};\r\n","import React, { FC, useCallback, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { Fieldset } from '../../../ui/components/Fieldset';\r\nimport { PortableTeamsWithStore } from '../index';\r\nimport {\r\n useSaveTeams,\r\n useSelectMultipleTeams,\r\n} from '../store/hors/withTeams/services';\r\nimport { usePortableTeamsState } from '../store/states';\r\nimport { useTeamsState } from '../store/hors/withTeams/states';\r\nimport { useParams } from 'react-router';\r\n\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n gap: 16px;\r\n max-height: 416px;\r\n flex-grow: 1;\r\n background-color: inherit;\r\n`;\r\n\r\nconst TeamsContainer = styled.div`\r\n width: 264px;\r\n height: 100%;\r\n overflow: auto;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Actions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n flex-shrink: 0;\r\n margin-top: 16px;\r\n width: 100%;\r\n`;\r\n\r\nexport const AssignTeams: FC<{\r\n onSuccessApply: (teamIds: number[]) => void;\r\n onCancel: () => void;\r\n selectedTeams?: number[];\r\n}> = ({ onSuccessApply, onCancel, selectedTeams }) => {\r\n const params: any = useParams();\r\n\r\n const teams = useTeamsState();\r\n const saveTeams = useSaveTeams();\r\n const selectMultipleTeams = useSelectMultipleTeams();\r\n const { data: initialTeams } = usePortableTeamsState();\r\n const [, setTeamIds] = useState<number[]>(teams.selected);\r\n const [applyDisabled, setApplyDisabled] = useState(true);\r\n\r\n const hasAllMembers = initialTeams.items.some(item => item.isDefault);\r\n\r\n const onApplyHandler = useCallback(() => {\r\n selectMultipleTeams(teams.selected);\r\n if (params.draftId) {\r\n saveTeams();\r\n }\r\n onSuccessApply(teams.selected);\r\n }, [\r\n onSuccessApply,\r\n params.draftId,\r\n saveTeams,\r\n selectMultipleTeams,\r\n teams.selected,\r\n ]); \r\n\r\n const onTeamChangeHandler = useCallback(\r\n (ids: number[]) => {\r\n if(!(initialTeams.totalCount < 1 && hasAllMembers) ){\r\n setTeamIds(ids);\r\n setApplyDisabled(false);\r\n }\r\n },\r\n [hasAllMembers, initialTeams.totalCount]\r\n );\r\n\r\n\r\n\r\n return (\r\n <Container>\r\n <Wrapper>\r\n <Fieldset withoutBorder>\r\n <TeamsContainer>\r\n <PortableTeamsWithStore\r\n showSave={false}\r\n fetchOnMount={false}\r\n showSelectActions\r\n showSearch\r\n selectedTeams={selectedTeams}\r\n onSetSelected={onTeamChangeHandler}\r\n showDefaultMembers={true}\r\n />\r\n </TeamsContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <Button\r\n width={'96px'}\r\n action={() => onCancel()}\r\n variant={'inverse'}\r\n dataTest='cancel-button'\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n disabled={applyDisabled}\r\n style={{ marginLeft: 16 }}\r\n width={'96px'}\r\n action={() => onApplyHandler()}\r\n dataTest='apply-button'\r\n >\r\n Apply\r\n </Button>\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import React, { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Variables } from '../../../../theme/variables';\r\n\r\nimport {\r\n useResetTeams,\r\n useSaveTeams,\r\n useSelectMultipleTeams,\r\n} from '../../../../features/portableTeams/store/hors/withTeams/services';\r\nimport { AssignTeams } from '../../../../features/portableTeams/templates/AssignTeams';\r\nimport { useTeamsState } from '../../../../features/portableTeams/store/hors/withTeams/states';\r\nimport { usePortableTeamsState } from '../../../../features/portableTeams/store/states';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { Tooltip } from '../../../../ui/components/Tooltip';\r\n\r\nconst Container = styled.div`\r\n position: relative;\r\n height: 100%;\r\n`;\r\n\r\nconst SelectHead = styled.div<{ disabled?: boolean }>`\r\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\r\n display: flex;\r\n height: 100%;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n`;\r\n\r\nconst SelectTitle = styled.div`\r\n pointer-events: none;\r\n font-size: 11px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: block;\r\n align-items: center;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n font-weight: 600;\r\n margin-left: 15px;\r\n`;\r\n\r\nconst SelectButtonWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\r\n width: 100%;\r\n`;\r\n\r\nconst SelectLabel = styled.div<{ color?: string; disabled?: boolean }>`\r\n pointer-events: none;\r\n font-size: 13px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n color: ${props =>\r\n props.disabled ? props.theme.Colors.lightBlueGray : props.color};\r\n font-weight: 500;\r\n margin-left: 15px;\r\n margin-bottom: 1px;\r\n`;\r\n\r\nconst SelectedUserTeamsComponent: FC<{\r\n selectedTeams: number[];\r\n saveTeams?(): void;\r\n onSelectTeams(teamIds?: number[]): void;\r\n dataTest: string\r\n}> = ({ selectedTeams, onSelectTeams, dataTest }) => {\r\n const { saved } = useTeamsState();\r\n const { data } = usePortableTeamsState();\r\n const saveTeams = useSaveTeams();\r\n const selectMultipleTeams = useSelectMultipleTeams();\r\n const resetTeams = useResetTeams();\r\n\r\n useEffect(() => {\r\n selectMultipleTeams(selectedTeams);\r\n saveTeams();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [saveTeams, selectMultipleTeams]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetTeams();\r\n };\r\n }, [resetTeams]);\r\n\r\n useEffect(() => {\r\n onSelectTeams(saved);\r\n }, [onSelectTeams, saved]);\r\n\r\n const teamsDisabled = !data || data.items.length < 1;\r\n\r\n return (\r\n <Container>\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignTeams\r\n onSuccessApply={() => {\r\n hide();\r\n }}\r\n onCancel={() => {\r\n hide();\r\n }}\r\n selectedTeams={selectedTeams}\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <span ref={ref}>\r\n <Tooltip\r\n label={'No Teams added yet'}\r\n preset={'table-item'}\r\n disabled={!teamsDisabled}\r\n >\r\n <SelectHead\r\n onClick={() => !teamsDisabled && toggleShown()}\r\n disabled={teamsDisabled}\r\n data-test={dataTest}\r\n >\r\n {selectedTeams && !!selectedTeams.length && (\r\n <SelectTitle>Teams</SelectTitle>\r\n )}\r\n <SelectButtonWrapper>\r\n <SelectLabel\r\n color={\r\n selectedTeams.length < 1\r\n ? Variables.Colors.cloudyBlue\r\n : Variables.Colors.black\r\n }\r\n disabled={teamsDisabled}\r\n >\r\n {selectedTeams.length < 1\r\n ? 'Teams'\r\n : `${selectedTeams.length} ${\r\n selectedTeams.length > 1\r\n ? 'Teams'\r\n : 'Team'\r\n }`}\r\n </SelectLabel>\r\n </SelectButtonWrapper>\r\n </SelectHead>\r\n </Tooltip>\r\n </span>\r\n )}\r\n </Popup>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default SelectedUserTeamsComponent;\r\n","import React, { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Field } from 'formik';\r\n\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { CheckPermission } from '../../../../features/permissions';\r\nimport { AssignRoles } from './AssignRoles';\r\nimport { NewUserValues } from '../models/NewUserValues';\r\nimport { SelectedUserLabels } from './SelectedUserLabels';\r\nimport SelectedUserPractisSetsComponent from './SelectedUserPractisSets';\r\nimport { WithLabelsContext } from '../../../../features/portableLabels';\r\nimport { WithPractisSetsContext } from '../../../../features/portablePractisSets';\r\nimport { WithTeamsContext } from '../../../../features/portableTeams';\r\nimport { useResetLabels } from '../../../../features/portableLabels/store/hors/withLabels/services';\r\nimport { useResetPractisSets } from '../../../../features/portablePractisSets/store/hors/withPractisSets/services';\r\nimport SelectedUserTeamsComponent from './SelectedUserTeams';\r\nimport { useResetTeams } from '../../../../features/portableTeams/store/hors/withTeams/services';\r\nimport { FormikField } from '../../../../ui/components/FormikField';\r\nimport Plus from '../../../../ui/icons/Plus';\r\nimport { PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\r\n\r\n//region Styles\r\nconst StyledUserListItem = styled.div`\r\n background: ${props => props.theme.Colors.white};\r\n height: 64px;\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst StyledRow = styled.div<{\r\n hasBlueBorder?: boolean;\r\n hasNormalBorder?: boolean;\r\n hasGreyBorder: boolean;\r\n hasError: boolean;\r\n}>`\r\n display: flex;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n border-radius: 4px;\r\n box-shadow: 0 3px 10px 0 rgb(0 0 0 / 5%);\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n ${props =>\r\n props.hasBlueBorder &&\r\n `border: solid 2px ${props.theme.Colors.darkSkyBlue};`}\r\n ${props =>\r\n props.hasNormalBorder &&\r\n `border-color: ${props.theme.Colors.paleGrey};`}\r\n ${props =>\r\n props.hasGreyBorder &&\r\n `border-color: ${props.theme.Colors.blueyGreyTwo};`}\r\n ${props => props.hasError && `border-color: ${props.theme.Colors.tomato};`}\r\n \r\n background-color: ${props => props.theme.Colors.white};\r\n`;\r\n\r\nconst StyledField = styled.div<{ flex: number }>`\r\n flex: ${props => props.flex};\r\n padding-right: 1px;\r\n`;\r\n\r\nconst AddIconArea = styled.div`\r\n flex: 5;\r\n display: flex;\r\n justify-content: flex-end;\r\n`;\r\n\r\nconst StyledAddUserIconContainer = styled.button<{ disabled?: boolean }>`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 40px;\r\n height: 40px;\r\n align-self: center;\r\n border-radius: 4px;\r\n margin-right: 17px;\r\n background-color: ${props =>\r\n !!props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.darkSkyBlue};\r\n ${props => !!props.disabled && 'pointer-events: none;'}\r\n outline: none;\r\n border: none;\r\n cursor: pointer;\r\n`;\r\n\r\nconst StyledAddUserIconHolder = styled.div<{ disabled?: boolean }>`\r\n cursor: pointer;\r\n width: 12px;\r\n height: 16px;\r\n color: ${props => props.theme.Colors.white};\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n`;\r\n\r\nconst BorderSeparator = styled.div`\r\n height: 33px;\r\n width: 1px;\r\n align-self: center;\r\n flex-shrink: 0;\r\n border-left: 1px solid ${props => props.theme.Colors.paleGrey};\r\n`;\r\n\r\nconst StyledPlusIconContainer = styled.div<{ padding?: string }>`\r\n padding-left: 20px;\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n`;\r\n\r\nconst PlusIconHolder = styled.div`\r\n width: 10px;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n`;\r\n\r\nconst ErrorLabel = styled.div`\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-stretch: normal;\r\n font-style: normal;\r\n line-height: normal;\r\n letter-spacing: normal;\r\n padding: 5px 24px;\r\n color: ${props => props.theme.Colors.tomato};\r\n position: absolute;\r\n z-index: 1;\r\n width: 100%;\r\n`;\r\n//endregion\r\n\r\nexport type AddNewUserProps = {\r\n handleInputChange: (\r\n e: React.ChangeEvent<HTMLInputElement>,\r\n field: string\r\n ) => void;\r\n assignedRole: number | null;\r\n hasError?: boolean;\r\n selectedUserLabels: number[];\r\n setSelectedUserLabels: (labelIds: number[]) => void;\r\n selectedUserPractisSets: PractisSetWithDueDate[];\r\n setSelectedUserPractisSets: (practisSetIds: PractisSetWithDueDate[]) => void;\r\n selectedUserTeams: number[];\r\n setSelectedUserTeams: (teamIds: number[]) => void;\r\n onAssignRoleCheck(role: number | null): void;\r\n users: NewUserValues[];\r\n isSubmitDisabled: boolean;\r\n errorMessages: any;\r\n startedToFillInitialUser?: boolean;\r\n hideNewUserTipDisplayed?: boolean;\r\n creatingUser: boolean;\r\n isRoleDisabled: boolean | undefined;\r\n dataTest: string;\r\n};\r\n\r\nexport const AddNewUser: FC<AddNewUserProps> = ({\r\n handleInputChange,\r\n assignedRole,\r\n onAssignRoleCheck,\r\n hasError,\r\n setSelectedUserLabels,\r\n selectedUserLabels,\r\n setSelectedUserPractisSets,\r\n selectedUserPractisSets,\r\n selectedUserTeams,\r\n setSelectedUserTeams,\r\n users,\r\n isSubmitDisabled,\r\n errorMessages,\r\n startedToFillInitialUser,\r\n hideNewUserTipDisplayed,\r\n creatingUser,\r\n isRoleDisabled,\r\n dataTest\r\n}) => {\r\n const clearLabels = useResetLabels();\r\n const clearPractisSets = useResetPractisSets();\r\n const clearTeams = useResetTeams();\r\n\r\n useEffect(() => {\r\n if (creatingUser) {\r\n clearLabels();\r\n clearPractisSets();\r\n clearTeams();\r\n }\r\n return () => {\r\n clearLabels();\r\n clearPractisSets();\r\n clearTeams();\r\n };\r\n }, [clearLabels, clearPractisSets, clearTeams, creatingUser]);\r\n\r\n return (\r\n <StyledUserListItem>\r\n <StyledRow\r\n hasBlueBorder={!hideNewUserTipDisplayed}\r\n hasNormalBorder={!!users.length && !startedToFillInitialUser}\r\n hasGreyBorder={!!startedToFillInitialUser}\r\n hasError={!!hasError}\r\n data-test={`${dataTest}-row`}\r\n >\r\n <StyledPlusIconContainer>\r\n <PlusIconHolder>\r\n <Plus />\r\n </PlusIconHolder>\r\n </StyledPlusIconContainer>\r\n <StyledField flex={14}>\r\n <Field\r\n maxLength={100}\r\n autoFocus={!startedToFillInitialUser}\r\n type=\"text\"\r\n component={FormikField}\r\n name=\"firstName\"\r\n label=\"First Name*\"\r\n colorTheme=\"lightTwo\"\r\n height=\"64px\"\r\n labelFontSize=\"13px\"\r\n decreaseLabelFontSize={true}\r\n inputPadding=\"27px 13px 14px 13px\"\r\n labelFontWeight={600}\r\n labelLeftPosition={'12px'}\r\n hideError\r\n handleChange={(e: any) =>\r\n handleInputChange(e, 'firstName')\r\n }\r\n dataTest={`${dataTest}-first-name`}\r\n />\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={14}>\r\n <Field\r\n maxLength={100}\r\n type=\"text\"\r\n component={FormikField}\r\n name=\"lastName\"\r\n label=\"Last Name*\"\r\n colorTheme=\"lightTwo\"\r\n height=\"64px\"\r\n labelFontSize=\"13px\"\r\n decreaseLabelFontSize={true}\r\n inputPadding=\"27px 13px 14px 13px\"\r\n labelFontWeight={600}\r\n labelLeftPosition={'12px'}\r\n hideError={true}\r\n handleChange={(e: any) =>\r\n handleInputChange(e, 'lastName')\r\n }\r\n dataTest={`${dataTest}-last-name`}\r\n />\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={18}>\r\n <Field\r\n type=\"text\"\r\n component={FormikField}\r\n name=\"email\"\r\n label=\"Email*\"\r\n colorTheme=\"lightTwo\"\r\n labelFontSize=\"13px\"\r\n decreaseLabelFontSize={true}\r\n height=\"64px\"\r\n inputPadding=\"27px 13px 14px 13px\"\r\n labelFontWeight={600}\r\n labelLeftPosition={'12px'}\r\n hideError={true}\r\n handleChange={(e: any) => handleInputChange(e, 'email')}\r\n dataTest={`${dataTest}-email`}\r\n />\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={10}>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.ASSIGN_INVITATION_ROLE]}\r\n >\r\n <AssignRoles\r\n disabled={isRoleDisabled}\r\n assignedRole={assignedRole}\r\n handleRoleCheck={(role: number) =>\r\n onAssignRoleCheck(role)\r\n }\r\n dataTest={`${dataTest}-role`}\r\n />\r\n </CheckPermission>\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={13}>\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.ASSIGN_INVITATION_PRACTIS_SET,\r\n ]}\r\n >\r\n <SelectedUserTeamsComponent\r\n selectedTeams={selectedUserTeams}\r\n onSelectTeams={setSelectedUserTeams}\r\n dataTest={`${dataTest}-teams`}\r\n />\r\n </CheckPermission>\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={15}>\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.ASSIGN_INVITATION_PRACTIS_SET,\r\n ]}\r\n >\r\n <SelectedUserPractisSetsComponent\r\n selectedPractisSets={selectedUserPractisSets}\r\n onSelectPractisSets={setSelectedUserPractisSets}\r\n dataTest={`${dataTest}-practis-sets`}\r\n />\r\n </CheckPermission>\r\n </StyledField>\r\n <BorderSeparator />\r\n <StyledField flex={10}>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.ASSIGN_INVITATION_LABEL]}\r\n >\r\n <SelectedUserLabels\r\n selectedLabels={selectedUserLabels}\r\n onSelectLabels={setSelectedUserLabels}\r\n dataTest={`${dataTest}-labels`}\r\n />\r\n </CheckPermission>\r\n </StyledField>\r\n <AddIconArea>\r\n <StyledAddUserIconContainer\r\n disabled={\r\n creatingUser || !assignedRole || isSubmitDisabled\r\n }\r\n data-test={`${dataTest}-add`}\r\n >\r\n <StyledAddUserIconHolder>\r\n <Plus />\r\n </StyledAddUserIconHolder>\r\n </StyledAddUserIconContainer>\r\n </AddIconArea>\r\n </StyledRow>\r\n {!!hasError &&\r\n (!!errorMessages.email ||\r\n !!errorMessages.firstName ||\r\n !!errorMessages.lastName) && (\r\n <ErrorLabel data-test={`${dataTest}-error`}>\r\n {errorMessages.email ||\r\n errorMessages.firstName ||\r\n errorMessages.lastName}\r\n </ErrorLabel>\r\n )}\r\n </StyledUserListItem>\r\n );\r\n};\r\n\r\nexport const AddNewUserContainer: FC<AddNewUserProps> = props => {\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{ reducerName: 'draftEdit', scope: 'addNewUser' }}\r\n >\r\n <WithPractisSetsContext.Provider\r\n value={{ reducerName: 'draftEdit', scope: 'addNewUser' }}\r\n >\r\n <WithTeamsContext.Provider\r\n value={{\r\n reducerName: 'draftEdit',\r\n scope: 'addNewUser',\r\n }}\r\n >\r\n <AddNewUser {...props} />\r\n </WithTeamsContext.Provider>\r\n </WithPractisSetsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n","import { useCallback } from 'react';\n\ntype Entity = {\n id: number;\n practisSetIDs: number[];\n roleId: number;\n};\n\nexport const useCalculatePreSelectedUserRoles = <T extends Entity>() => {\n return useCallback((selectedItems: number[], entity: T[]) => {\n let outputArray: number[] = [];\n const filteredEntities = entity.filter(entityItem => {\n return selectedItems.includes(entityItem.id);\n });\n for (let entity of filteredEntities) {\n if (!outputArray.includes(entity.roleId)) {\n outputArray.push(entity.roleId);\n }\n }\n\n return outputArray;\n }, []);\n};\n","import React, { FC, useEffect } from 'react';\nimport { kebabCase } from 'lodash';\nimport styled from 'styled-components';\nimport RadioButton from '../../ui/components/RadioButton';\nimport { useUserRolesState } from '../roles/store/states';\nimport { useCalculatePreSelectedUserRoles } from './tools';\nimport { DraftUser } from '../../constants/interfaces/Draft';\nimport { PaginationResult } from '../../constants/interfaces/PaginationResult';\nimport { filterInvitationRolesByPermissions } from '../../pages/ActionPages/NewUser/tools';\nimport { usePermissionsState } from '../permissions/store/state';\n\nconst Container = styled.div`\n width: 100%;\n`;\n\nconst PortableRoles: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers?: number[];\n selectedRoles: number[];\n setSelectedRoles(value: number[]): void;\n}> = ({ users, selectedUsers, selectedRoles, setSelectedRoles }) => {\n const permissions = usePermissionsState();\n const userRoles = useUserRolesState();\n const roles = filterInvitationRolesByPermissions(\n userRoles.list,\n permissions\n );\n const calculatePreSelectedUserRoles = useCalculatePreSelectedUserRoles();\n\n useEffect(() => {\n if (users && users.items && selectedUsers) {\n const preSelectedUserRoles = calculatePreSelectedUserRoles(\n selectedUsers,\n users.items as any // TODO: ask\n );\n\n setSelectedRoles(preSelectedUserRoles);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [calculatePreSelectedUserRoles, selectedUsers, users]);\n\n return (\n <Container>\n {roles.map(item => {\n return (\n <RadioButton\n key={item.value}\n handleChange={() => setSelectedRoles([item.value])}\n checked={selectedRoles.includes(item.value)}\n partial={selectedRoles.length > 1}\n size={12}\n label={item.name}\n dataTest={`${kebabCase(item.name.toLowerCase())}-role-radio`}\n />\n );\n })}\n </Container>\n );\n};\n\nexport default PortableRoles;\n","import React, { FC, useCallback, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { PortableLabelsWithStore } from '../../../../../../../features/portableLabels';\nimport { useCalculatePreSelectedLabels } from '../../../../../../../features/labels/tools';\nimport { PaginationResult } from '../../../../../../../constants/interfaces/PaginationResult';\nimport { DraftUser } from '../../../../../../../constants/interfaces/Draft';\nimport { getCompanyState } from '../../../../../../CompanySettings/store/reducers';\nimport { useIfChanged } from '../../../../../../../helpers/hooks/usePreviousData';\nimport {\n useResetSelectedLabels,\n useSelectLabels,\n} from '../../../../../../../features/portableLabels/store/hors/withLabels/services';\nimport { useLabelsState } from '../../../../../../../features/portableLabels/store/hors/withLabels/states';\n\nexport const FilterLabels: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers?: number[];\n}> = ({ users, selectedUsers }) => {\n const labelsState = useLabelsState();\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n const company = useSelector(getCompanyState);\n const select = useSelectLabels();\n const resetSelected = useResetSelectedLabels();\n const ifCompanyChanged = useIfChanged(company);\n\n const getPreselectedLabels = useCallback((): number[] | null => {\n if (users?.items && selectedUsers) {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedUsers,\n users\n );\n return preAssignedLabels;\n }\n\n return null;\n }, [selectedUsers, users, calculatePreSelectedLabels]);\n\n const setDefaultState = useCallback(() => {\n const preselectedLabels = getPreselectedLabels();\n\n if (preselectedLabels !== null) {\n select(preselectedLabels);\n }\n }, [select, getPreselectedLabels]);\n\n useEffect(() => {\n setDefaultState();\n }, [users, selectedUsers, setDefaultState]);\n\n useEffect(() => {\n setDefaultState();\n }, [setDefaultState]);\n\n useEffect(() => {\n if (ifCompanyChanged) {\n resetSelected();\n setDefaultState();\n\n const preselectedLabels = getPreselectedLabels();\n\n if (preselectedLabels !== null) {\n select(preselectedLabels);\n }\n }\n }, [\n getPreselectedLabels,\n ifCompanyChanged,\n labelsState.selected,\n select,\n resetSelected,\n setDefaultState,\n ]);\n\n return (\n <PortableLabelsWithStore\n showSelectActions\n showSave={false}\n showSearch\n />\n );\n};\n","import React, { FC, useEffect } from 'react';\nimport { PaginationResult } from '../../../../../../../constants/interfaces/PaginationResult';\nimport { DraftUser } from '../../../../../../../constants/interfaces/Draft';\nimport { useCalculatePreSelectedPractisSets, useFindPractisSetDueDate } from '../../../../../../../features/portablePractisSets/tools';\nimport { PortablePractisSetsWithStore } from '../../../../../../../features/portablePractisSets';\nimport { useSelectMultiplePractisSets } from '../../../../../../../features/portablePractisSets/store/hors/withPractisSets/services';\n\nconst FilterPractisSets: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers?: number[];\n setInitialPractisSets?(practisSetId: number[]): void;\n}> = ({ users, selectedUsers, setInitialPractisSets }) => {\n const setPractisSets = useSelectMultiplePractisSets();\n const calculatePreSelectedPractisSets = useCalculatePreSelectedPractisSets();\n const findPractisSetDueDate = useFindPractisSetDueDate()\n\n useEffect(() => {\n if (users && users.items && selectedUsers && setInitialPractisSets) {\n const preSelectedPractisSets = calculatePreSelectedPractisSets(\n selectedUsers,\n users.items as any\n );\n setInitialPractisSets(preSelectedPractisSets);\n\n //PSWDD maybe change type\n setPractisSets(\n preSelectedPractisSets.map(id => ({\n practisSetId: id,\n dueDate: findPractisSetDueDate(\n selectedUsers,\n users.items as any,\n id\n ),\n }))\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [users, selectedUsers, calculatePreSelectedPractisSets]);\n\n return (\n <PortablePractisSetsWithStore\n showSave={false}\n showSelectActions={true}\n showSearch={true}\n resetSelectedOnUnmount={true}\n />\n );\n};\n\nexport default FilterPractisSets;\n","import { useCallback } from 'react';\n\ntype Entity = {\n id: number;\n teamIDs: number[];\n roleId: number;\n};\n\nexport const useCalculatePreSelectedTeams = <T extends Entity>() => {\n return useCallback((selectedItems: number[], entity: T[]) => {\n let countSelectedItems: Record<number, number> = {};\n let outputArray: number[] = [];\n\n const filteredEntities = entity.filter(entityItem => {\n return selectedItems.includes(entityItem.id);\n });\n for (let entity of filteredEntities) {\n for (let teamId of entity.teamIDs) {\n countSelectedItems[teamId] =\n countSelectedItems[teamId] + 1 || 1;\n }\n }\n\n for (const key in countSelectedItems) {\n if (countSelectedItems[key] === selectedItems.length) {\n outputArray.push(Number(key));\n } else {\n outputArray.push(-Number(key));\n }\n }\n\n return outputArray;\n }, []);\n};\n\nexport const useCalculateDeletedTeams = () => {\n return useCallback((assignedTeams, initialTeams) => {\n const deletedTeams: number[] = [];\n\n for (let team of initialTeams) {\n if (\n !assignedTeams.includes(team) &&\n !assignedTeams.includes(-team)\n ) {\n deletedTeams.push(team < 0 ? -team : team);\n }\n }\n\n return deletedTeams;\n }, []);\n};\n","import React, { FC, useEffect } from 'react';\nimport { PaginationResult } from '../../../../../../../constants/interfaces/PaginationResult';\nimport { DraftUser } from '../../../../../../../constants/interfaces/Draft';\nimport { useCalculatePreSelectedTeams } from '../../../../../../../features/portableTeams/tools';\nimport { PortableTeamsWithStore } from '../../../../../../../features/portableTeams';\nimport { useSelectMultipleTeams } from '../../../../../../../features/portableTeams/store/hors/withTeams/services';\n\nconst FilterTeams: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers?: number[];\n setInitialTeams?(practisSetId: number[]): void;\n showDefaultMembers?: boolean\n}> = ({ users, selectedUsers, showDefaultMembers, setInitialTeams }) => {\n const setTeams = useSelectMultipleTeams();\n const calculatePreSelectedTeams = useCalculatePreSelectedTeams();\n \n useEffect(() => {\n if (users && users.items && selectedUsers && setInitialTeams) {\n const preSelectedTeams = calculatePreSelectedTeams(\n selectedUsers,\n users.items as any\n );\n setInitialTeams(preSelectedTeams);\n setTeams(preSelectedTeams);\n }\n }, [users, selectedUsers, calculatePreSelectedTeams, setInitialTeams, setTeams]);\n\n return (\n <PortableTeamsWithStore\n showSave={false}\n showSelectActions={true}\n fetchOnMount={false}\n showSearch={true}\n resetSelectedOnUnmount={true}\n showDefaultMembers={showDefaultMembers}\n />\n );\n};\n\nexport default FilterTeams;\n","import React, { FC, useState } from 'react';\nimport styled from 'styled-components';\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { DraftUser, PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\nimport { useCalculateDeletedLabels } from '../../../../../features/labels/tools';\nimport PortableRoles from '../../../../../features/portableRoles/portableRoles';\nimport { FilterLabels } from './components/FilterLabels/FilterLabels';\nimport FilterPractisSets from './components/FilterPractisSets/FilterPractisSets';\nimport { useCalculateDeletedPractisSets } from '../../../../../features/portablePractisSets/tools';\nimport { usePractisSetsState } from '../../../../../features/portablePractisSets/store/hors/withPractisSets/states';\nimport { useLabelsState } from '../../../../../features/portableLabels/store/hors/withLabels/states';\nimport FilterTeams from './components/FilterTeams/FilterTeams';\nimport { useTeamsState } from '../../../../../features/portableTeams/store/hors/withTeams/states';\nimport { useCalculateDeletedTeams } from '../../../../../features/portableTeams/tools';\nimport { Fieldset } from '../../../../../ui/components/Fieldset';\nimport { Button } from '../../../../../ui/components/Button';\n\nconst Container = styled.div`\n z-index: 2;\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst RolesContainer = styled.div`\n width: 129px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst PractisSetsContainer = styled.div`\n width: 312px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst ButtonContainer = styled.div`\n margin-right: 16px;\n`;\n\nexport const AssignFilters: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers: number[];\n assignFilters(\n assignedLabels: number[],\n deletedLabels: number[],\n assignedPractisSets: PractisSetWithDueDate[],\n deletedPractisSets: number[],\n assignedTeams: number[],\n deletedTeams: number[],\n roleId: null | number\n ): Promise<boolean>;\n selectedRoles: number[];\n setSelectedRoles(value: number[]): void;\n onSuccessApply: (isCancel?: boolean) => void;\n isRoleDisabled?: boolean;\n}> = ({\n users,\n selectedUsers,\n assignFilters,\n selectedRoles,\n setSelectedRoles,\n onSuccessApply,\n isRoleDisabled,\n}) => {\n const [saving, setSaving] = useState(false);\n\n const { selected: selectedLabels } = useLabelsState();\n const { selected: selectedPractisSets } = usePractisSetsState();\n const { selected: selectedTeams } = useTeamsState();\n const getDeletedLabels = useCalculateDeletedLabels();\n const getDeletedPractisSets = useCalculateDeletedPractisSets();\n const getDeletedTeams = useCalculateDeletedTeams();\n const [initialPractisSets, setInitialPractisSets] = useState<number[]>([]);\n const [initialTeams, setInitialTeams] = useState<number[]>([]);\n\n const handleApplyFilters = () => {\n const assignedLabels = selectedLabels.filter(x => x > 0);\n const deletedLabels = getDeletedLabels(selectedLabels);\n const assignedPractisSets = selectedPractisSets.filter(x => x.practisSetId > 0);\n const deletedPractisSets = getDeletedPractisSets(\n selectedPractisSets.map(item => item.practisSetId),\n initialPractisSets\n );\n\n const assignedTeams = selectedTeams.filter(x => x > 0);\n const deletedTeams = getDeletedTeams(selectedTeams, initialTeams);\n \n setSaving(true);\n assignFilters(\n assignedLabels,\n deletedLabels,\n assignedPractisSets,\n deletedPractisSets,\n assignedTeams,\n deletedTeams,\n selectedRoles.length > 1 ? null : selectedRoles[0]\n ).then(updated => {\n if (updated) {\n onSuccessApply();\n }\n setSaving(false);\n });\n };\n\n return (\n <Container>\n <Wrapper>\n {!isRoleDisabled && (\n <Fieldset title={'Roles'} dataTest=\"roles-section-title\">\n <RolesContainer>\n <PortableRoles\n users={users}\n selectedUsers={selectedUsers}\n selectedRoles={selectedRoles}\n setSelectedRoles={setSelectedRoles}\n />\n </RolesContainer>\n </Fieldset>\n )}\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <FilterTeams\n showDefaultMembers={true}\n users={users}\n selectedUsers={selectedUsers}\n setInitialTeams={setInitialTeams}\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Practis Sets'} dataTest=\"practis-sets-section-title\">\n <PractisSetsContainer>\n <FilterPractisSets\n users={users}\n selectedUsers={selectedUsers}\n setInitialPractisSets={setInitialPractisSets}\n />\n </PractisSetsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <FilterLabels\n users={users}\n selectedUsers={selectedUsers}\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <ButtonContainer>\n <Button\n label={'Cancel'}\n variant={'inverse'}\n action={() => onSuccessApply(true)}\n width={'112px'}\n disabled={saving}\n />\n </ButtonContainer>\n <Button\n label={'Apply'}\n action={handleApplyFilters}\n width={'112px'}\n loading={saving}\n />\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const RemoveUser = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M530.681 162l1.18 1.18c.187.187.187.491 0 .679-.188.187-.492.187-.68 0l-1.179-1.18-1.179 1.18c-.187.187-.49.187-.678 0-.188-.188-.188-.492 0-.68l1.178-1.178-1.178-1.179c-.188-.187-.188-.491 0-.679.187-.188.49-.188.678 0l1.18 1.18 1.178-1.18c.188-.188.492-.188.68 0 .187.188.187.492 0 .68L530.68 162zm-4.937-3.835c.514.128 1.265.32 2.01.53-.35.239-.65.54-.908.875-.605-.163-1.24-.325-1.844-.47v-1.584c1.254-.854 1.997-2.708 1.997-4.393 0-2.28-.583-4.127-3.498-4.127-2.916 0-3.499 1.848-3.499 4.127 0 1.686.744 3.542 2 4.395v1.596c-1.89.445-4.086 1.054-4.591 1.33-.327.412-.612 1.733-.41 2.558h9.142c.093.355.233.688.413.998h-10.105c-.782-1.2-.465-3.599.317-4.398.372-.38 3.165-1.1 4.502-1.428-1.412-1.096-2.273-3.13-2.273-5.07 0-2.819.82-5.104 4.504-5.104 3.685 0 4.503 2.285 4.503 5.105 0 1.933-.856 3.961-2.26 5.06z\"\n transform=\"translate(-516 -148)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default RemoveUser;\n","import React, { FC, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { useUserRolesState } from '../roles/store/states';\nimport { useCalculatePreSelectedUserRoles } from './tools';\nimport { DraftUser } from '../../constants/interfaces/Draft';\nimport { PaginationResult } from '../../constants/interfaces/PaginationResult';\nimport { invitationRoles } from '../../pages/ActionPages/NewUser/tools';\nimport { Variables } from '../../theme/variables';\nimport Checkbox from '../../ui/components/Checkbox';\n\nconst Container = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n`;\n\nconst CheckBoxWrapper = styled.div`\n margin-bottom: 8px;\n`;\n\nconst PortableRolesMultiselect: FC<{\n users?: PaginationResult<DraftUser>;\n selectedUsers?: number[];\n selectedRoles: number[];\n setSelectedRoles(value: number[]): void;\n}> = ({ users, selectedUsers, selectedRoles, setSelectedRoles }) => {\n const userRoles = useUserRolesState();\n const roles = invitationRoles(userRoles.list);\n const calculatePreSelectedUserRoles = useCalculatePreSelectedUserRoles();\n\n useEffect(() => {\n if (users && users.items && selectedUsers) {\n const preSelectedUserRoles = calculatePreSelectedUserRoles(\n selectedUsers,\n users.items as any // TODO: ask\n );\n\n setSelectedRoles(preSelectedUserRoles);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [users, selectedUsers, calculatePreSelectedUserRoles]);\n\n const handleSelectItem = (value: number) => {\n if (selectedRoles.includes(value)) {\n setSelectedRoles(selectedRoles.filter(roleId => roleId !== value));\n } else {\n const updatedRoles = [...selectedRoles];\n updatedRoles.push(value);\n setSelectedRoles(updatedRoles);\n }\n };\n\n return (\n <Container>\n {roles.map(item => {\n return (\n <CheckBoxWrapper key={item.value}>\n <Checkbox\n key={item.value}\n handleChange={() => handleSelectItem(item.value)}\n checked={selectedRoles.includes(item.value)}\n size={12}\n label={item.name}\n fontSize={13}\n fontColor={Variables.Colors.black}\n fontWeight={'500'}\n dataTest={`${item.name.toLowerCase()}-role-checkbox`}\n />\n </CheckBoxWrapper>\n );\n })}\n </Container>\n );\n};\n\nexport default PortableRolesMultiselect;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { useLabelsState } from '../../../../../features/portableLabels/store/hors/withLabels/states';\nimport { PortableTeamsWithStore } from '../../../../../features/portableTeams';\nimport { PortableLabelsWithStore } from '../../../../../features/portableLabels';\nimport PortableRolesWithMultiSelect from '../../../../../features/portableRoles/portableRolesWithMultiSelect';\nimport { useTeamsState } from '../../../../../features/portableTeams/store/hors/withTeams/states';\nimport { usePractisSetsState } from '../../../../../features/portablePractisSets/store/hors/withPractisSets/states';\nimport { useSaveTeams } from '../../../../../features/portableTeams/store/hors/withTeams/services';\nimport { useSaveLabels } from '../../../../../features/portableLabels/store/hors/withLabels/services';\nimport { useSavePractisSets } from '../../../../../features/portablePractisSets/store/hors/withPractisSets/services';\nimport { PortablePractisSetsWithStore } from '../../../../../features/portablePractisSets';\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\nimport { Fieldset } from '../../../../../ui/components/Fieldset';\nimport { Button } from '../../../../../ui/components/Button';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst RolesContainer = styled.div`\n width: 129px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst PractisSetsContainer = styled.div`\n width: 312px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonContainer = styled.span`\n margin-right: 12px;\n`;\n\nexport const ApplyFilters: FC<{\n applyFilters(\n assignedLabels: number[],\n assignedPractisSets: PractisSetWithDueDate[],\n assignedTeams: number[],\n roleIds: number[]\n ): Promise<boolean>;\n selectedRoles: number[];\n setSelectedRoles(value: number[]): void;\n onSuccessApply: () => void;\n isRoleDisabled?: boolean;\n hideDueDates?: boolean;\n}> = ({\n applyFilters,\n selectedRoles,\n setSelectedRoles,\n onSuccessApply,\n isRoleDisabled,\n hideDueDates,\n}) => {\n const { selected: selectedLabels } = useLabelsState();\n const { selected: selectedTeams } = useTeamsState();\n const { selected: selectedPractisSets } = usePractisSetsState();\n const saveLabels = useSaveLabels();\n const saveTeams = useSaveTeams();\n const savePractisSets = useSavePractisSets();\n\n const handleApplyFilters = () => {\n applyFilters(\n selectedLabels,\n selectedPractisSets,\n selectedTeams,\n selectedRoles\n ).then(() => {\n onSuccessApply();\n saveTeams();\n saveLabels();\n savePractisSets();\n });\n };\n\n const selectedFiltersCount =\n selectedLabels.filter(id => id > 0).length +\n selectedPractisSets.length +\n selectedTeams.length +\n selectedRoles.length;\n\n return (\n <Container>\n <Wrapper>\n {!isRoleDisabled && (\n <Fieldset title={'Roles'} dataTest=\"roles-section-title\">\n <RolesContainer>\n <PortableRolesWithMultiSelect\n selectedRoles={selectedRoles}\n setSelectedRoles={setSelectedRoles}\n />\n </RolesContainer>\n </Fieldset>\n )}\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Practis Sets'} dataTest=\"practis-sets-section-title\">\n <PractisSetsContainer>\n <PortablePractisSetsWithStore\n showSave={false}\n showSelectActions\n showSearch\n hideDueDates={hideDueDates}\n />\n </PractisSetsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption>\n {`${selectedFiltersCount} ${\n selectedFiltersCount > 1 ? 'Filters' : 'Filter'\n } Selected`}\n </SummaryCaption>\n <ButtonContainer>\n <Button\n label={'Cancel'}\n variant={'inverse'}\n action={() => onSuccessApply()}\n width={'122px'}\n />\n </ButtonContainer>\n <Button width={'122px'} action={() => handleApplyFilters()}>\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const FileDownload = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 18 18\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\".1\"\n d=\"M13.082 1c.772 0 1.39.637 1.417 1.422l.001.055v5.428c0 .272-.22.492-.49.492-.26 0-.472-.2-.49-.455l-.002-.037V5.75H10V16.5h-.153v.008c0 .26-.2.472-.454.49L9.356 17H2.418c-.772 0-1.39-.637-1.417-1.422L1 2.477C1 1.686 1.6 1.03 2.365 1L2.418 1h10.664zM14 10c.276 0 .5.22.5.49v4.853l1.667-1.633c.19-.187.5-.187.69 0 .19.187.19.49 0 .676l-2.469 2.42c-.003.005-.009.006-.012.01-.01.013-.006.032-.019.044-.018.018-.046.013-.066.027-.074.058-.16.099-.26.105-.009 0-.015.006-.024.006l-.003.001h-.008c-.01 0-.014-.004-.02-.004-.12-.006-.226-.052-.31-.125-.006-.006-.017-.004-.023-.01-.007-.007-.004-.017-.01-.024-.004-.004-.003-.012-.007-.017l-2.483-2.433c-.19-.186-.19-.49 0-.677.19-.186.5-.186.69 0l1.667 1.634V10.49c0-.27.224-.49.5-.49zM9 16.015V5.75H5.75v10.265h3.249zM4.75 5.75H1.981v9.773c0 .265.184.472.404.49l.033.002H4.75V5.75zm8.332-3.765H2.418c-.223 0-.417.194-.435.453l-.001.039L1.98 4.75h11.537V2.477c0-.265-.183-.472-.403-.49l-.033-.002z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default FileDownload;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Upload = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 18\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\".1\"\n d=\"M13.923 17H2.077C1.482 17 1 16.552 1 16V6c0-.552.482-1 1.077-1h1.615v1H2.615c-.297 0-.538.224-.538.5v9c0 .276.241.5.538.5h10.77c.297 0 .538-.224.538-.5v-9c0-.276-.241-.5-.538-.5h-1.077V5h1.615C14.518 5 15 5.448 15 6v10c0 .552-.482 1-1.077 1zm-3.61-12.642L8.564 2.69v9.81c0 .275-.234.499-.524.499-.29 0-.525-.224-.525-.5V2.69l-1.75 1.668c-.2.19-.525.19-.725 0-.2-.191-.2-.5 0-.691l2.592-2.47.014-.01c.01-.013.006-.032.019-.044.019-.018.048-.013.069-.027.078-.06.168-.102.274-.108.009 0 .015-.006.024-.006L8.04 1l.008.002c.006 0 .01.003.017.003.125.006.237.053.325.128.007.006.018.003.025.01.007.007.004.017.01.024.005.005.004.012.008.017l2.607 2.483c.2.19.2.5 0 .691-.2.19-.525.19-.725 0z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Upload;\n","/**\n * function getFileExtension - extracts file extension from a file name\n * @param { string } filename\n * @returns { string }\n*/\nexport const getFileExtension = (filename: string): string => {\n if (!filename)\n return \"\";\n const parts: string[] = filename.split(\".\");\n return parts.length > 1 ? (parts.pop() as string) : \"\";\n}\n\nconst excelExtensions: string[] = ['xls', 'xlt', 'xla', 'xlsx', 'xltx', 'xlsm', 'xltm', 'xlam', 'xlsb'];\n\n/**\n * function isExcelFile - checks if a file name is of Excel file\n * @param { string } filename\n * @returns { boolean }\n*/\nexport const isExcelFile = (filename: string): boolean => {\n const fileExtension: string = getFileExtension(filename).toLowerCase();\n return !!fileExtension && excelExtensions.includes(fileExtension);\n}","/**\n * @description to extract email addresses from a string\n * EX: input: 'test \"test@test.com\" it's a test' => output: test@test.com\n * @function extractEmailsFromString\n * @returns { RegExpMatchArray | null }\n */\nexport function extractEmailsFromString(\n string: string\n): RegExpMatchArray | null {\n return string.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9_-]+)/gi);\n}\n\n/**\n * @description Simple function to convert simple present verb to the simple past form.\n * ex: create => created, cry => cried \n * @function convertPresentVerbToPastVerb\n * @param { string } string \n * @returns { string }\n */\nexport function convertPresentVerbToPastVerb(string: string) {\n return (\n string\n .replace(/([^aeiouy])y$/, '$1i')\n .replace(/([^aeiouy][aeiou])([^aeiouy])$/, '$1$2$2')\n .replace(/e$/, '') + 'ed'\n );\n}\n\n/**\n * @description a function which checks if a string is undefined, null, empty or contains white spaces only\n * @function isEmptyOrWhiteSpace\n * @param { string } value \n * @returns { boolean }\n */\nexport function isEmptyOrWhiteSpace(value: string) {\n return !value || value.trim().length === 0;\n}","import React, { FC, ChangeEvent, useCallback, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\r\nimport { parseXlsFile } from '../../../../../tools/parseXlsx';\r\nimport { DraftUser, PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\r\nimport { CheckPermission } from '../../../../../features/permissions';\r\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\r\nimport { WithLabelsContext } from '../../../../../features/portableLabels';\r\nimport { WithPractisSetsContext } from '../../../../../features/portablePractisSets';\r\nimport { getUserRoleIdByName } from '../../tools';\r\nimport { useUserRolesState } from '../../../../../features/roles/store/states';\r\n\r\nimport { AssignFilters } from '../Filters/AssignFilters';\r\nimport { isTeamLeader } from '../../../../../constants/enums';\r\nimport { UserInterface } from '../../../../../constants/interfaces/User';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../../UserProfile/store/reducers';\r\nimport { Divider } from '@material-ui/core';\r\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { SelectAll } from '../../../../../ui/components/table-wrapper/SelectAll';\r\nimport { Popup } from '../../../../../ui/components/Popup';\r\nimport UpArrow from '../../../../../ui/icons/UpArrow';\r\nimport DownArrow from '../../../../../ui/icons/DownArrow';\r\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\r\nimport Trash from '../../../../../ui/icons/Trash';\r\nimport RemoveUser from '../../../../../ui/icons/RemoveUser';\r\nimport { TableSearchInput } from '../../../../../ui/components/table-wrapper/table-tools/table-search-input';\r\nimport { ApplyFilters } from '../Filters/ApplyFilters';\r\nimport FilterByHandler from '../../../../../ui/components/Filters/FilterByHandler';\r\nimport FileDownload from '../../../../../ui/icons/FileDownload';\r\nimport Upload from '../../../../../ui/icons/Upload';\r\nimport { isExcelFile } from '../../../../../helpers/functions/file-helpers';\r\nimport { isEmptyOrWhiteSpace } from '../../../../../helpers/functions/strings';\r\n\r\nconst uuid = require('uuid/v1');\r\n\r\nconst StyledLabelActionPanel = styled.div<{ isActionPanelOpen?: boolean }>`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin: ${({ isActionPanelOpen }) => (isActionPanelOpen ? '16px 0 0 0' : '16px 0')};\r\n`;\r\n\r\nconst StyledLabelActionButtons = styled.div`\r\n display: flex;\r\n`;\r\n\r\nconst StyledIconWrapper = styled.div`\r\n width: 40px;\r\n height: 40px;\r\n padding: 11px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n background: ${props => props.theme.Colors.whiteFive};\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n`;\r\n\r\nconst ActionDropdownsWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n`;\r\n\r\nconst StyledHeaderActionItems = styled.div`\r\n margin-left: 8px;\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst StyledIconContainer = styled.div`\r\n position: relative;\r\n`;\r\n\r\nconst HeaderToolsItem = styled.div`\r\n z-index: 1;\r\n`;\r\n\r\nconst IconWrapper = styled.div<{ disabled?: boolean }>`\r\n height: 40px;\r\n width: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.steelGrey};\r\n background: var(--ps-white-1);\r\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\r\n margin-left: 8px;\r\n z-index: 1;\r\n &:active {\r\n opacity: ${props => (props.disabled ? '1' : '0.7')};\r\n }\r\n`;\r\n\r\nconst DeleteUsersIcon = styled.div`\r\n height: 16px;\r\n width: 14px;\r\n`;\r\n\r\nconst UploadTemplateIcon = styled.div`\r\n width: 14px;\r\n height: 16px;\r\n`;\r\n\r\nconst DownloadTemplateIcon = styled.div`\r\n width: 16px;\r\n height: 16px;\r\n`;\r\n\r\nconst RemoveUsersIcon = styled.div`\r\n height: 16px;\r\n width: 14px;\r\n color: ${props => props.theme.Colors.tomato};\r\n`;\r\n\r\nconst SearchPanel = styled.div`\r\n height: 40px;\r\n width: 224px;\r\n margin-right: 8px;\r\n`;\r\n\r\ntype UserFromExcelDoc = {\r\n 'First Name': string;\r\n 'Last Name': string;\r\n Email: string;\r\n Role: string;\r\n};\r\n\r\nconst StyledAssignAction = styled.div<{ open?: boolean; disabled?: boolean }>`\r\n display: flex;\r\n height: 40px;\r\n width: 152px;\r\n border-radius: 4px;\r\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\r\n background: var(--ps-white-1);\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.steelGrey};\r\n border: ${props => (props.open ? 1 : 0)}px solid\r\n ${props => props.theme.Colors.cloudyBlue};\r\n position: relative;\r\n`;\r\n\r\nconst IconHolder = styled.div<{ disabled: boolean }>`\r\n width: 8px;\r\n height: 100%;\r\n display: flex;\r\n position: absolute;\r\n right: 15px;\r\n top: 0;\r\n pointer-events: none;\r\n align-items: center;\r\n justify-content: center;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst Label = styled.div<{ disabled: boolean }>`\r\n position: absolute;\r\n top: 0;\r\n left: 16px;\r\n pointer-events: none;\r\n font-size: 13px;\r\n font-weight: normal;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst TEMPLATE_URL_ADMIN =\r\n 'https://docs.google.com/uc?id=15Ojf5QCjC-d0g-_Qzsmho_6gWl2oUMDm&export=download&hl=en_US';\r\nconst TEMPLATE_URL_TEAM_LEADER =\r\n 'https://docs.google.com/uc?id=1dvshvYy5OC6_YgNwmX_jtS9oacNqyIFZ&export=download&hl=en_US';\r\n\r\nconst StyledUserCounterContainer = styled.div`\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n font-size: 13px;\r\n font-weight: normal;\r\n font-stretch: normal;\r\n font-style: normal;\r\n line-height: normal;\r\n letter-spacing: normal;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n align-self: center;\r\n`;\r\n\r\nexport const NewUserHeader: FC<{\r\n profile?: UserInterface;\r\n users?: PaginationResult<DraftUser>;\r\n localUsers?: any;\r\n selectedUsers: number[];\r\n existingUserIds: number[];\r\n onUsersImported(users: any[]): void;\r\n onRemoveUsers(): void;\r\n onRemoveExistingUsers(): void;\r\n disableFilters: boolean;\r\n disableSearch: boolean;\r\n setSearchTerm(value: string): void;\r\n assignFilters(\r\n assignedLabels: number[],\r\n deletedLabels: number[],\r\n assignedPractisSets: PractisSetWithDueDate[],\r\n //PSWDD we dont need due date for deleted practis set, because it will be removed anyway\r\n deletedPractisSets: number[],\r\n assignedTeams: number[],\r\n deletedTeams: number[],\r\n roleId: null | number\r\n ): Promise<boolean>;\r\n applyFilters(\r\n assignedLabels: number[],\r\n assignedPractisSets: PractisSetWithDueDate[],\r\n assignedTeams: number[],\r\n roleIds: number[]\r\n ): Promise<boolean>;\r\n selectedRoles: number[];\r\n setSelectedRoles(value: number[]): void;\r\n filterRoles: number[];\r\n setFilterRoles(value: number[]): void;\r\n filtersCount: number;\r\n isRoleDisabled: boolean | undefined;\r\n updateAllUsersCheck(checked: boolean): void;\r\n userItemsList: DraftUser[] | undefined;\r\n clearAllUsers: () => void;\r\n isSelectAll: boolean;\r\n updateSelectAll: (checked: boolean) => void;\r\n dataTest: string;\r\n}> = ({\r\n users,\r\n localUsers,\r\n selectedUsers,\r\n existingUserIds,\r\n onUsersImported,\r\n onRemoveUsers,\r\n onRemoveExistingUsers,\r\n disableFilters,\r\n disableSearch,\r\n setSearchTerm,\r\n assignFilters,\r\n applyFilters,\r\n selectedRoles,\r\n setSelectedRoles,\r\n filterRoles,\r\n setFilterRoles,\r\n filtersCount,\r\n isRoleDisabled,\r\n updateAllUsersCheck,\r\n userItemsList,\r\n clearAllUsers,\r\n isSelectAll,\r\n updateSelectAll,\r\n dataTest\r\n}) => {\r\n let upload: any;\r\n const showMessage = useShowMessage();\r\n const userRoles = useUserRolesState();\r\n const profile = useSelector(getProfileState);\r\n\r\n const handleDownloadTemplate = useCallback(() => {\r\n const isUserTeamLeader = isTeamLeader(profile?.role?.name);\r\n\r\n window.open(\r\n isUserTeamLeader ? TEMPLATE_URL_TEAM_LEADER : TEMPLATE_URL_ADMIN,\r\n '_blank'\r\n );\r\n }, [profile]);\r\n\r\n const getRoleId = useCallback( (roleName: string) => {\r\n return getUserRoleIdByName(roleName, userRoles.list);\r\n }, [userRoles.list]);\r\n\r\n /**\r\n * function showFileFormatErrorMessage - shows invalid file format message\r\n * @returns { void }\r\n */\r\n const showFileFormatErrorMessage = useCallback(() =>\r\n showMessage('No valid scheme found', 'error')\r\n , [showMessage]);\r\n\r\n /**\r\n * function handleParsedUsersData - filters out parsed data and converts it to user info,\r\n * shows error if data format is incorrect\r\n * @param { UserFromExcelDoc[] } data\r\n * @returns { void }\r\n */\r\n const handleParsedUsersData = useCallback(\r\n (data: UserFromExcelDoc[]) => {\r\n const parsedResults = data\r\n .filter((user: UserFromExcelDoc) =>\r\n !(isEmptyOrWhiteSpace(user['First Name'])\r\n && isEmptyOrWhiteSpace(user['Last Name'])\r\n && isEmptyOrWhiteSpace(user['Email'])\r\n && isEmptyOrWhiteSpace(user['Role']))\r\n ).map((user: UserFromExcelDoc) => {\r\n return {\r\n id: uuid(),\r\n firstName: user['First Name'],\r\n lastName: user['Last Name'],\r\n email: user['Email'],\r\n roleId: getRoleId(!!user['Role'] ? user['Role'] : ''),\r\n practisSetIDs: [],\r\n labelIDs: [],\r\n practisSets: [],\r\n isEntryInvalid: false,\r\n teamIDs: [],\r\n };\r\n });\r\n\r\n if (parsedResults.length > 0) {\r\n onUsersImported(parsedResults);\r\n } else {\r\n showFileFormatErrorMessage();\r\n }\r\n },\r\n [showFileFormatErrorMessage, onUsersImported, getRoleId]\r\n );\r\n\r\n /**\r\n * function handleImportUsers - perform file parsing if it's Excel file, otherwise shows error\r\n * @param { Event } e\r\n * @returns { void }\r\n */\r\n const handleImportUsers = useCallback(\r\n (e: ChangeEvent<HTMLInputElement>) => {\r\n const files: FileList | null = e.target.files;\r\n if (files && files.length > 0) {\r\n if (isExcelFile(files[0].name)) {\r\n parseXlsFile(files[0], handleParsedUsersData);\r\n } else {\r\n showFileFormatErrorMessage();\r\n }\r\n }\r\n // @ts-ignore\r\n e.target.value = null;\r\n },\r\n [handleParsedUsersData, showFileFormatErrorMessage]\r\n );\r\n\r\n useEffect(() => {\r\n return () => clearAllUsers();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const isDisabled = selectedUsers.length < 1;\r\n\r\n const count = (!isEmpty(localUsers?.items) &&\r\n localUsers.items.filter(\r\n (item: any) => !item.isEntryInvalid\r\n ).length);\r\n\r\n const userItemsText =\r\n count\r\n ? `${count} ${\r\n count > 1 ? 'items' : 'item'\r\n }`\r\n : '0 items';\r\n\r\n return (\r\n <>\r\n {isEmpty(selectedUsers) && <Divider />}\r\n <StyledLabelActionPanel isActionPanelOpen={!isEmpty(selectedUsers)}>\r\n {users && selectedUsers && (\r\n <SelectAll\r\n isSelectAll={isSelectAll}\r\n selectedLength={selectedUsers.length}\r\n totalCount={\r\n users.totalCount ||\r\n (localUsers?.items?.length &&\r\n localUsers?.items?.filter(\r\n (item: any) => !item.isEntryInvalid\r\n ).length)\r\n }\r\n itemsPerPage={20}\r\n onClearSelecion={() => {\r\n clearAllUsers();\r\n updateAllUsersCheck(false);\r\n updateSelectAll(false);\r\n }}\r\n onSelectAll={() => {\r\n updateAllUsersCheck(true);\r\n updateSelectAll(true);\r\n }}\r\n style={{\r\n position: 'relative',\r\n width: '100%',\r\n }}\r\n dataTest={dataTest}\r\n >\r\n <ActionDropdownsWrapper>\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'draftEdit',\r\n scope: 'assignFilters',\r\n }}\r\n >\r\n <WithPractisSetsContext.Provider\r\n value={{\r\n reducerName: 'draftEdit',\r\n scope: 'assignFilters',\r\n }}\r\n >\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignFilters\r\n onSuccessApply={() =>\r\n hide()\r\n }\r\n users={users}\r\n selectedUsers={\r\n selectedUsers\r\n }\r\n assignFilters={\r\n assignFilters\r\n }\r\n selectedRoles={\r\n selectedRoles\r\n }\r\n setSelectedRoles={\r\n setSelectedRoles\r\n }\r\n isRoleDisabled={\r\n isRoleDisabled\r\n }\r\n />\r\n )}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n }}\r\n transformOrigin={{\r\n vertical: 'top',\r\n horizontal: 'left',\r\n }}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <StyledAssignAction\r\n ref={ref}\r\n onClick={() =>\r\n !isDisabled &&\r\n toggleShown()\r\n }\r\n open={shown}\r\n disabled={isDisabled}\r\n data-test={`${dataTest}-assign-selected`}\r\n >\r\n <Label\r\n disabled={isDisabled}\r\n >\r\n Assign...\r\n </Label>\r\n <IconHolder\r\n disabled={isDisabled}\r\n >\r\n {shown ? (\r\n <UpArrow />\r\n ) : (\r\n <DownArrow />\r\n )}\r\n </IconHolder>\r\n </StyledAssignAction>\r\n )}\r\n </Popup>\r\n </WithPractisSetsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n <HeaderToolsItem>\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.REMOVE_USER_FROM_STAGING,\r\n ]}\r\n >\r\n <Tooltip\r\n label={'Select users to delete'}\r\n preset={'button-icon'}\r\n disabled={!isDisabled}\r\n >\r\n <IconWrapper\r\n onClick={() => {\r\n !isDisabled &&\r\n onRemoveUsers();\r\n }}\r\n disabled={isDisabled}\r\n data-test={`${dataTest}-delete-selected`}\r\n >\r\n <DeleteUsersIcon>\r\n <Trash />\r\n </DeleteUsersIcon>\r\n </IconWrapper>\r\n </Tooltip>\r\n </CheckPermission>\r\n </HeaderToolsItem>\r\n {existingUserIds.length > 0 && (\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.REMOVE_USER_FROM_STAGING,\r\n ]}\r\n >\r\n <Tooltip\r\n preset={'button-icon'}\r\n label={'Remove all existing users'}\r\n dataTest=\"remove-existing-users-tooltip\"\r\n >\r\n <IconWrapper\r\n onClick={onRemoveExistingUsers}\r\n data-test={`${dataTest}-delete-existing`}\r\n >\r\n <RemoveUsersIcon>\r\n <RemoveUser />\r\n </RemoveUsersIcon>\r\n </IconWrapper>\r\n </Tooltip>\r\n </CheckPermission>\r\n )}\r\n </ActionDropdownsWrapper>\r\n </SelectAll>\r\n )}\r\n\r\n {isEmpty(selectedUsers) && (\r\n <StyledLabelActionButtons>\r\n <SearchPanel>\r\n <TableSearchInput\r\n onChange={setSearchTerm}\r\n disabled={disableSearch}\r\n />\r\n </SearchPanel>\r\n\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <ApplyFilters\r\n onSuccessApply={() => hide()}\r\n applyFilters={applyFilters}\r\n selectedRoles={filterRoles}\r\n setSelectedRoles={setFilterRoles}\r\n isRoleDisabled={isRoleDisabled}\r\n hideDueDates={true}\r\n />\r\n )}\r\n transformOrigin={{\r\n horizontal: 272,\r\n vertical: 0,\r\n }}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n disabled={disableFilters}\r\n toggleOpen={toggleShown}\r\n filtersCount={filtersCount}\r\n dataTest={`${dataTest}-filters`}\r\n />\r\n )}\r\n </Popup>\r\n <StyledIconContainer>\r\n <StyledHeaderActionItems>\r\n <Tooltip\r\n label={'Download template'}\r\n preset={'button-icon'}\r\n dataTest=\"download-template-tooltip\"\r\n >\r\n <StyledIconWrapper\r\n onClick={() =>\r\n handleDownloadTemplate()\r\n }\r\n data-test={`${dataTest}-download-template`}\r\n >\r\n <DownloadTemplateIcon>\r\n <FileDownload />\r\n </DownloadTemplateIcon>\r\n </StyledIconWrapper>\r\n </Tooltip>\r\n </StyledHeaderActionItems>\r\n </StyledIconContainer>\r\n <StyledIconContainer>\r\n <StyledHeaderActionItems>\r\n <Tooltip<HTMLDivElement>\r\n label={'Upload template'}\r\n preset={'button-icon'}\r\n dataTest=\"upload-template-tooltip\"\r\n >\r\n {tooltipRef => (\r\n <>\r\n <input\r\n id=\"myInput\"\r\n type=\"file\"\r\n ref={ref => (upload = ref)}\r\n style={{ display: 'none' }}\r\n onChange={e =>\r\n handleImportUsers(e)\r\n }\r\n />\r\n <StyledIconWrapper\r\n ref={tooltipRef}\r\n onClick={() =>\r\n upload.click()\r\n }\r\n data-test={`${dataTest}-upload-template`}\r\n >\r\n <UploadTemplateIcon>\r\n <Upload />\r\n </UploadTemplateIcon>\r\n </StyledIconWrapper>\r\n </>\r\n )}\r\n </Tooltip>\r\n </StyledHeaderActionItems>\r\n </StyledIconContainer>\r\n </StyledLabelActionButtons>\r\n )}\r\n {!!users?.items.length && isEmpty(selectedUsers) && (\r\n <StyledUserCounterContainer data-test={`${dataTest}-counter`}>\r\n {userItemsText}\r\n </StyledUserCounterContainer>\r\n )}\r\n </StyledLabelActionPanel>\r\n {isEmpty(selectedUsers) && <Divider />}\r\n </>\r\n );\r\n };\r\n","import XLSX from 'xlsx';\n\nexport const parseXlsFile = (file: any, onSuccess?: any) => {\n const reader = new FileReader();\n let generatedResults: any = [];\n\n reader.onload = e => {\n const bstr = e.target!.result;\n const wb = XLSX.read(bstr, {\n type: 'binary',\n bookVBA: true,\n });\n\n wb.SheetNames.forEach(function(sheetName: string) {\n const XL_row_object = XLSX.utils.sheet_to_json(\n wb.Sheets[sheetName]\n );\n const json_object = JSON.stringify(XL_row_object);\n let sheetResults = JSON.parse(json_object);\n generatedResults = [...generatedResults, ...sheetResults];\n });\n onSuccess && onSuccess(generatedResults);\n return generatedResults;\n };\n reader.readAsBinaryString(file);\n};\n","import React, { FC, useState } from 'react';\nimport {\n filterInvitationRolesByPermissions,\n getUserRoleNameById,\n} from '../../tools';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\nimport { ClickAwayListener } from '@material-ui/core';\nimport { usePermissionsState } from '../../../../../features/permissions/store/state';\nimport { useUserRolesState } from '../../../../../features/roles/store/states';\nimport { Variables } from '../../../../../theme/variables';\nimport OutsideActionBox from '../../../../../ui/components/OutsideActionBox/OutsideActionBox';\nimport RadioButton from '../../../../../ui/components/RadioButton';\nimport UpArrow from '../../../../../ui/icons/UpArrow';\nimport DownArrow from '../../../../../ui/icons/DownArrow';\n\nconst StyledSelectForm = styled.div`\n box-sizing: border-box;\n position: relative;\n width: 100%;\n height: 100%;\n`;\n\nconst StyledLabelWrapper = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 16px;\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n`;\n\nconst SelectContainer = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst SelectLabel = styled.div<{ color?: string }>`\n font-size: 13px;\n color: ${props => (props.color ? props.color : props.theme.Colors.black)};\n`;\n\nconst IconHolder = styled.div<{ disabled?: boolean }>`\n width: 8px;\n height: 100%;\n display: flex;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n margin-left: 10px;\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.black};\n`;\n\nconst RolesContainer = styled(motion.div)`\n padding: 24px 24px 16px 24px;\n width: 129px;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n top: 8px;\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n position: absolute;\n`;\n\nconst StyledRolesList = styled.div``;\n\nconst ScrollableRoleContainer = styled.div``;\n\nconst RoleItemWrapper = styled.div`\n display: flex;\n align-items: center;\n height: 24px;\n margin-bottom: 8px;\n`;\n\nconst StyledRadioButton = styled(RadioButton)`\n margin-bottom: 0;\n`;\n\nconst ANIMATION_SCALE = 5;\n\nexport const EditAssignRoles: FC<{\n disabled?: boolean;\n assignedRole: number | null;\n handleRoleCheck(role: number | null): void;\n modified: boolean;\n setModified(modified: boolean): void;\n dataTest: string;\n}> = ({ disabled, assignedRole, handleRoleCheck, modified, setModified, dataTest }) => {\n const [open, setOpen] = useState(false);\n const permissions = usePermissionsState();\n const userRoles = useUserRolesState();\n const roles = filterInvitationRolesByPermissions(\n userRoles.list,\n permissions\n );\n const assignedRoleName = getUserRoleNameById(assignedRole, userRoles.list);\n\n const updateCheckedRole = (value: number) => {\n setOpen(false);\n handleRoleCheck(value);\n };\n\n return (\n <ClickAwayListener onClickAway={() => setOpen(false)}>\n <StyledSelectForm>\n <StyledLabelWrapper\n onClick={() => {\n if (!modified) {\n setModified(true);\n }\n setOpen(!open);\n }}\n disabled={disabled}\n data-test={dataTest}\n >\n <SelectLabel\n color={\n !assignedRoleName || disabled\n ? Variables.Colors.cloudyBlue\n : Variables.Colors.black\n }\n >\n {assignedRoleName}\n </SelectLabel>\n <IconHolder disabled={disabled}>\n {!disabled && open ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n </StyledLabelWrapper>\n <SelectContainer open={open && !disabled}>\n <RolesContainer\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n >\n <StyledRolesList>\n <ScrollableRoleContainer>\n {roles &&\n (roles || []).map(role => (\n <RoleItemWrapper\n key={role.value}\n onClick={() => {\n updateCheckedRole(role.value);\n }}\n data-test={`role-${role.name.toLowerCase()}`}\n >\n <StyledRadioButton\n checked={\n assignedRole === role.value\n }\n size={12}\n handleChange={() =>\n updateCheckedRole(\n role.value\n )\n }\n label={role.name}\n />\n </RoleItemWrapper>\n ))}\n </ScrollableRoleContainer>\n </StyledRolesList>\n </RolesContainer>\n </SelectContainer>\n </StyledSelectForm>\n </ClickAwayListener>\n );\n};\n","import React, { FC, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { usePractisSetsState } from '../../../../../features/portablePractisSets/store/hors/withPractisSets/states';\nimport {\n useResetPractisSets,\n useSavePractisSets,\n useSelectMultiplePractisSets,\n} from '../../../../../features/portablePractisSets/store/hors/withPractisSets/services';\nimport { AssignPractisSets } from '../../../../../features/portablePractisSets/templates/AssignPractisSets';\nimport { usePortablePractisSetsState } from '../../../../../features/portablePractisSets/store/states';\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\nimport { Popup } from '../../../../../ui/components/Popup';\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\nimport UpArrow from '../../../../../ui/icons/UpArrow';\nimport DownArrow from '../../../../../ui/icons/DownArrow';\nimport { PractisSetStatuses } from '../../../../../constants/interfaces/PractisSets';\n\nconst Container = styled.div`\n position: relative;\n height: 100%;\n width: 100%;\n`;\n\nconst SelectLabelWrapper = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 16px;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n`;\n\nconst SelectLabel = styled.div<{ disabled?: boolean }>`\n font-size: 13px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.lightBlueGray\n : props.theme.Colors.black};\n`;\n\nconst IconHolder = styled.div<{ disabled?: boolean }>`\n width: 8px;\n height: 100%;\n display: flex;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n margin-left: 10px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.lightBlueGray\n : props.theme.Colors.black};\n`;\n\nconst EditAssignPractisSets: FC<{\n selectedPractisSets: PractisSetWithDueDate[];\n onSelectPractisSets(practisSetIds?: PractisSetWithDueDate[]): void;\n modified: boolean;\n setModified(modified: boolean): void;\n dataTest: string;\n}> = ({ selectedPractisSets, onSelectPractisSets, modified, setModified, dataTest }) => {\n const { saved } = usePractisSetsState();\n const { data } = usePortablePractisSetsState();\n const savePractisSets = useSavePractisSets();\n const selectMultiplePractisSets = useSelectMultiplePractisSets();\n const resetPractisSets = useResetPractisSets();\n\n useEffect(() => {\n selectMultiplePractisSets(selectedPractisSets);\n savePractisSets();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectMultiplePractisSets, savePractisSets]);\n\n useEffect(() => {\n return () => {\n resetPractisSets();\n };\n }, [resetPractisSets]);\n\n useEffect(() => {\n onSelectPractisSets(saved);\n }, [onSelectPractisSets, saved]);\n\n const practisSetsDisabled = !data || data.items.filter(item => item.status === PractisSetStatuses.ACTIVE).length < 1;\n\n return (\n <Container>\n <Popup<HTMLDivElement>\n content={({ hide }) => (\n <AssignPractisSets\n onSuccessApply={() => {\n hide();\n }}\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <span ref={ref}>\n <Tooltip\n label={'No practis sets added yet'}\n preset={'dropdown'}\n disabled={!practisSetsDisabled}\n >\n <SelectLabelWrapper\n onClick={() => {\n if (!modified && !practisSetsDisabled) {\n setModified(true);\n }\n !practisSetsDisabled && toggleShown();\n }}\n disabled={practisSetsDisabled}\n data-test={dataTest}\n >\n <>\n <SelectLabel disabled={practisSetsDisabled}>\n {saved.length < 1\n ? 'Practis Sets'\n : `${saved.length} ${\n saved.length > 1\n ? 'Practis Sets'\n : 'Practis Set'\n }`}\n </SelectLabel>\n <IconHolder disabled={practisSetsDisabled}>\n {shown ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n </>\n </SelectLabelWrapper>\n </Tooltip>\n </span>\n )}\n </Popup>\n </Container>\n );\n};\n\nexport default EditAssignPractisSets;\n","import React, { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useTeamsState } from '../../../../../features/portableTeams/store/hors/withTeams/states';\r\nimport {\r\n useResetTeams,\r\n useSaveTeams,\r\n useSelectMultipleTeams,\r\n} from '../../../../../features/portableTeams/store/hors/withTeams/services';\r\nimport { AssignTeams } from '../../../../../features/portableTeams/templates/AssignTeams';\r\nimport { usePortableTeamsState } from '../../../../../features/portableTeams/store/states';\r\nimport { Popup } from '../../../../../ui/components/Popup';\r\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\r\nimport UpArrow from '../../../../../ui/icons/UpArrow';\r\nimport DownArrow from '../../../../../ui/icons/DownArrow';\r\n\r\nconst Container = styled.div`\r\n position: relative;\r\n height: 100%;\r\n width: 100%;\r\n`;\r\n\r\nconst SelectLabelWrapper = styled.div<{ disabled?: boolean }>`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n width: 100%;\r\n height: 100%;\r\n padding: 0 16px;\r\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\r\n`;\r\n\r\nconst SelectLabel = styled.div<{ disabled?: boolean }>`\r\n font-size: 13px;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.lightBlueGray\r\n : props.theme.Colors.black};\r\n`;\r\n\r\nconst IconHolder = styled.div<{ disabled?: boolean }>`\r\n width: 8px;\r\n height: 100%;\r\n display: flex;\r\n pointer-events: none;\r\n align-items: center;\r\n justify-content: center;\r\n margin-left: 10px;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.lightBlueGray\r\n : props.theme.Colors.black};\r\n`;\r\n\r\nconst EditAssignTeams: FC<{\r\n selectedTeams: number[];\r\n saveTeams?(): void;\r\n onSelectTeams(TeamIds?: number[]): void;\r\n modified: boolean;\r\n setModified(modified: boolean): void;\r\n dataTest: string;\r\n}> = ({ selectedTeams, onSelectTeams, modified, setModified, dataTest }) => {\r\n const { saved } = useTeamsState();\r\n const { data } = usePortableTeamsState();\r\n const saveTeams = useSaveTeams();\r\n const selectMultipleTeams = useSelectMultipleTeams();\r\n const resetTeams = useResetTeams();\r\n\r\n useEffect(() => {\r\n selectMultipleTeams(selectedTeams);\r\n saveTeams();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [saveTeams, selectMultipleTeams]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetTeams();\r\n };\r\n }, [resetTeams]);\r\n\r\n useEffect(() => {\r\n onSelectTeams(saved);\r\n }, [onSelectTeams, saved]);\r\n\r\n const TeamsDisabled = !data || data.items.length < 1;\r\n\r\n return (\r\n <Container>\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignTeams\r\n onSuccessApply={() => {\r\n hide();\r\n }}\r\n onCancel={() => {\r\n hide();\r\n }}\r\n selectedTeams={selectedTeams}\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <span ref={ref}>\r\n <Tooltip\r\n label={'No teams added yet'}\r\n preset={'dropdown'}\r\n disabled={!TeamsDisabled}\r\n >\r\n <SelectLabelWrapper\r\n onClick={() => {\r\n if (!modified && !TeamsDisabled) {\r\n setModified(true);\r\n }\r\n !TeamsDisabled && toggleShown();\r\n }}\r\n disabled={TeamsDisabled}\r\n data-test={dataTest}\r\n >\r\n <>\r\n <SelectLabel disabled={TeamsDisabled}>\r\n {saved.length < 1\r\n ? 'Teams'\r\n : `${saved.length} ${\r\n saved.length > 1\r\n ? 'Teams'\r\n : 'Team'\r\n }`}\r\n </SelectLabel>\r\n <IconHolder disabled={TeamsDisabled}>\r\n {shown ? <UpArrow /> : <DownArrow />}\r\n </IconHolder>\r\n </>\r\n </SelectLabelWrapper>\r\n </Tooltip>\r\n </span>\r\n )}\r\n </Popup>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default EditAssignTeams;\r\n","import React, { FC, useEffect } from 'react';\nimport styled from 'styled-components';\n\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\nimport { AssignLabels } from '../../../../../features/portableLabels/templates/AssignLabels';\nimport { useLabelsState } from '../../../../../features/portableLabels/store/hors/withLabels/states';\nimport {\n useResetLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../features/portableLabels/store/hors/withLabels/services';\nimport { Popup } from '../../../../../ui/components/Popup';\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\nimport UpArrow from '../../../../../ui/icons/UpArrow';\nimport DownArrow from '../../../../../ui/icons/DownArrow';\n\nconst Container = styled.div`\n position: relative;\n height: 100%;\n width: 100%;\n`;\n\nconst SelectLabelWrapper = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 16px;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n`;\n\nconst SelectLabel = styled.div<{ disabled?: boolean }>`\n font-size: 13px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.lightBlueGray\n : props.theme.Colors.black};\n`;\n\nconst IconHolder = styled.div<{ disabled?: boolean }>`\n width: 8px;\n height: 100%;\n display: flex;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n margin-left: 10px;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.lightBlueGray\n : props.theme.Colors.black};\n`;\n\nconst EditAssignLabels: FC<{\n selectedLabels: number[];\n onSelectLabels(labelIds?: number[]): void;\n modified: boolean;\n setModified(modified: boolean): void;\n dataTest: string;\n}> = ({ selectedLabels, onSelectLabels, modified, setModified, dataTest }) => {\n const { saved } = useLabelsState();\n const { data } = usePortableLabelsState();\n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n const resetLabels = useResetLabels();\n\n useEffect(() => {\n selectLabels(selectedLabels);\n saveLabels();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectLabels, saveLabels]);\n\n useEffect(() => {\n return () => {\n resetLabels();\n };\n }, [resetLabels]);\n\n useEffect(() => {\n onSelectLabels(saved);\n }, [onSelectLabels, saved]);\n\n const labelsDisabled = !data || data.items.length < 1;\n const selectedUserLabelsCount = selectedLabels.filter(id => id > 0).length;\n\n return (\n <Container>\n <Popup<HTMLDivElement>\n content={({ hide }) => (\n <AssignLabels\n onSuccessApply={() => {\n hide();\n }}\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <span ref={ref}>\n <Tooltip\n label={'No labels added yet'}\n preset={'dropdown'}\n disabled={!labelsDisabled}\n >\n <SelectLabelWrapper\n onClick={() => {\n if (!modified && !labelsDisabled) {\n setModified(true);\n }\n !labelsDisabled && toggleShown();\n }}\n disabled={labelsDisabled}\n data-test={dataTest}\n >\n <>\n <SelectLabel disabled={labelsDisabled}>\n {selectedUserLabelsCount < 1\n ? 'Labels'\n : `${selectedUserLabelsCount} ${\n selectedUserLabelsCount > 1\n ? 'Labels'\n : 'Label'\n }`}\n </SelectLabel>\n <IconHolder disabled={labelsDisabled}>\n {shown ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n </>\n </SelectLabelWrapper>\n </Tooltip>\n </span>\n )}\n </Popup>\n </Container>\n );\n};\n\nexport default EditAssignLabels;\n","import React, { FC } from 'react';\nimport { IconProps } from './types';\n\nexport const ThinClose: FC<IconProps> = ({ className }) => {\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g>\n <g>\n <path\n d=\"M0 0H16V16H0z\"\n transform=\"translate(-1342 -404) translate(1342 404)\"\n />\n <g stroke=\"currentColor\" strokeLinecap=\"round\">\n <path\n d=\"M0 0L12 12M12 0L0 12\"\n transform=\"translate(-1342 -404) translate(1342 404) translate(1.953 2.021)\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n};\n\nexport default ThinClose;\n","import React, { FC } from 'react';\nimport { IconProps } from './types';\n\nexport const ThinCheck: FC<IconProps> = ({ className }) => {\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g>\n <g>\n <path\n d=\"M0 0H16V16H0z\"\n transform=\"translate(-1389 -404) translate(1389 404)\"\n />\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n d=\"M0.98 9.032L5.024 13.076 15.099 3\"\n transform=\"translate(-1389 -404) translate(1389 404)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n};\n\nexport default ThinCheck;\n","import React, { FC, useState, useEffect } from 'react';\nimport * as EmailValidator from 'email-validator';\nimport styled from 'styled-components';\n\nimport { DraftUser, PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\nimport { CheckPermission } from '../../../../../features/permissions';\nimport { WithPractisSetsContext } from '../../../../../features/portablePractisSets';\nimport { WithTeamsContext } from '../../../../../features/portableTeams';\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\nimport { EditAssignRoles } from './EditAssignRoles';\nimport EditAssignPractisSets from './EditAssignPractisSets';\nimport {\n useResetSelectedLabels,\n useSelectLabels,\n} from '../../../../../features/portableLabels/store/hors/withLabels/services';\nimport EditAssignTeams from './EditAssignTeams';\nimport EditAssignLabels from './EditAssignLabels';\nimport OutsideActionBox from '../../../../../ui/components/OutsideActionBox/OutsideActionBox';\nimport ThinClose from '../../../../../ui/icons/ThinClose';\nimport ThinCheck from '../../../../../ui/icons/ThinCheck';\n\n//region Styles\nconst TableRow = styled.tr`\n &&:hover {\n background: unset;\n }\n`;\n\nconst Container = styled.div`\n display: grid;\n grid-template-columns: 16fr 13fr 18fr 12fr 11fr 15fr 15fr;\n grid-template-rows: 1fr;\n grid-column-gap: 8px;\n padding: 7.5px 0;\n position: relative;\n`;\n\nconst Actions = styled.div`\n position: absolute;\n right: 0;\n bottom: -40px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: 1fr;\n grid-column-gap: 8px;\n`;\n\nconst ActionButton = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 4px;\n background: ${props => props.theme.Colors.whiteFive};\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n &&:hover {\n opacity: 0.9;\n }\n`;\n\nconst ActionIcon = styled.div`\n width: 16px;\n height: 16px;\n display: flex;\n color: inherit;\n`;\n\nconst SectionItem = styled.div`\n display: flex;\n align-items: center;\n height: 40px;\n border-radius: 4px;\n background: ${props => props.theme.Colors.whiteFive};\n position: relative;\n & > div {\n width: 100%;\n }\n`;\n\nconst SectionError = styled.div`\n position: absolute;\n bottom: -20px;\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.tomato};\n`;\n\nconst Input = styled.input<{ hasError?: boolean }>`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 13px;\n font-weight: normal;\n color: ${props => props.theme.Colors.black};\n border: none;\n background: transparent;\n height: 100%;\n width: 100%;\n padding: 0 16px;\n border-radius: 4px;\n box-shadow: 0 0 0 ${props => (props.hasError ? '1px' : '0px')} ${props => props.theme.Colors.tomato};\n`;\n//endregion\n\nconst EditUserItem: FC<{\n user: DraftUser;\n setUser(user: DraftUser): void;\n handleUpdateSelectedUser(): void;\n assignedRole: number | null;\n onAssignRoleCheck(role: number | null): void;\n selectedUserLabels: number[];\n setSelectedUserLabels: (labelIds: number[]) => void;\n selectedUserPractisSets: PractisSetWithDueDate[];\n setSelectedUserPractisSets: (practisSetIds: PractisSetWithDueDate[]) => void;\n selectedUserTeams: number[];\n setSelectedUserTeams: (teamIds: number[]) => void;\n handleInputChange: (\n e: React.ChangeEvent<HTMLInputElement>,\n field: string\n ) => void;\n isRoleDisabled: boolean | undefined;\n dataTest: string;\n}> = ({\n user,\n setUser,\n handleUpdateSelectedUser,\n handleInputChange,\n assignedRole,\n onAssignRoleCheck,\n setSelectedUserLabels,\n selectedUserLabels,\n setSelectedUserPractisSets,\n selectedUserPractisSets,\n setSelectedUserTeams,\n selectedUserTeams,\n isRoleDisabled,\n dataTest\n}) => {\n const selectLabels = useSelectLabels();\n const resetSelectedLabels = useResetSelectedLabels();\n const [modified, setModified] = useState(false);\n const [hideActions, setHideActions] = useState(false);\n\n useEffect(() => {\n selectLabels(user.labelIDs);\n }, [selectLabels, user]);\n\n const resetSelectedUser = () => {\n setUser({\n id: '',\n email: '',\n firstName: '',\n lastName: '',\n labelIDs: [],\n practisSetIDs: [],\n teamIDs: [],\n roleId: null,\n });\n resetSelectedLabels();\n };\n\n const handleChange = (\n e: React.ChangeEvent<HTMLInputElement>,\n field: string\n ) => {\n if (!modified) {\n setModified(true);\n }\n handleInputChange(e, field);\n };\n\n const handleSaveUser = () => {\n setHideActions(true);\n handleUpdateSelectedUser();\n };\n\n const isFirstNameInvalid = !user.firstName || user.firstName.length < 1;\n const isLastNameInvalid = !user.lastName || user.lastName.length < 1;\n const isEmailInvalid = !EmailValidator.validate(user.email.trim());\n const isRoleInvalid = !assignedRole;\n\n const isEditFormInvalid =\n isFirstNameInvalid ||\n isLastNameInvalid ||\n isEmailInvalid ||\n isRoleInvalid;\n\n return (\n <TableRow data-test={`${dataTest}-row`}>\n <td colSpan={9}>\n <OutsideActionBox\n open={true}\n toggleOpen={() => {\n if (!modified) {\n resetSelectedUser();\n }\n }}\n >\n <Container>\n <SectionItem>\n <Input\n value={user.firstName}\n onChange={e => {\n handleChange(e, 'firstName');\n }}\n autoFocus={true}\n data-test={`${dataTest}-first-name`}\n />\n </SectionItem>\n <SectionItem>\n <Input\n value={user.lastName}\n onChange={e => {\n handleChange(e, 'lastName');\n }}\n data-test={`${dataTest}-last-name`}\n />\n </SectionItem>\n <SectionItem>\n <Input\n value={user.email}\n onChange={e => {\n handleChange(e, 'email');\n }}\n hasError={isEmailInvalid}\n data-test={`${dataTest}-email`}\n />\n {isEmailInvalid && (\n <SectionError>\n Enter a valid email address \n </SectionError>\n )}\n </SectionItem>\n <SectionItem>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.ASSIGN_INVITATION_ROLE,\n ]}\n >\n <EditAssignRoles\n disabled={isRoleDisabled}\n assignedRole={assignedRole}\n handleRoleCheck={(role: number) => {\n onAssignRoleCheck(role);\n }}\n modified={modified}\n setModified={setModified}\n dataTest={`${dataTest}-roles`}\n />\n </CheckPermission>\n </SectionItem>\n <SectionItem>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.ASSIGN_INVITATION_PRACTIS_SET,\n ]}\n >\n <WithTeamsContext.Provider\n value={{\n reducerName: 'draftEdit',\n scope: 'editUser',\n }}\n >\n <EditAssignTeams\n selectedTeams={selectedUserTeams}\n onSelectTeams={setSelectedUserTeams}\n modified={modified}\n setModified={setModified}\n dataTest={`${dataTest}-teams`}\n />\n </WithTeamsContext.Provider>\n </CheckPermission>\n </SectionItem>\n <SectionItem>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.ASSIGN_INVITATION_PRACTIS_SET,\n ]}\n >\n <WithPractisSetsContext.Provider\n value={{\n reducerName: 'draftEdit',\n scope: 'editUser',\n }}\n >\n <EditAssignPractisSets\n selectedPractisSets={\n selectedUserPractisSets\n }\n onSelectPractisSets={\n setSelectedUserPractisSets\n }\n modified={modified}\n setModified={setModified}\n dataTest={`${dataTest}-practis-sets`}\n />\n </WithPractisSetsContext.Provider>\n </CheckPermission>\n </SectionItem>\n <SectionItem>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.ASSIGN_INVITATION_LABEL,\n ]}\n >\n <EditAssignLabels\n selectedLabels={selectedUserLabels}\n onSelectLabels={setSelectedUserLabels}\n modified={modified}\n setModified={setModified}\n dataTest={`${dataTest}-labels`}\n />\n </CheckPermission>\n </SectionItem>\n {!hideActions && (\n <Actions>\n <ActionButton onClick={resetSelectedUser} data-test={`${dataTest}-cancel`}>\n <ActionIcon>\n <ThinClose />\n </ActionIcon>\n </ActionButton>\n <ActionButton\n onClick={() => {\n !isEditFormInvalid && handleSaveUser();\n }}\n disabled={isEditFormInvalid}\n data-test={`${dataTest}-save`}\n >\n <ActionIcon>\n <ThinCheck />\n </ActionIcon>\n </ActionButton>\n </Actions>\n )}\n </Container>\n </OutsideActionBox>\n </td>\n </TableRow>\n );\n};\n\nexport default EditUserItem;\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { TableCell } from '../table-cell';\n\nconst StyledTableCell = styled(TableCell)`\n padding: 0;\n border-bottom: 1px solid ${props => props.theme.Colors.paleGrey};\n`;\n\nexport const TableCheckboxHeaderCell: FC<{ width?: number, dataTest?: string; }> = ({\n children,\n width,\n dataTest\n}) => {\n return <StyledTableCell width={width} dataTest={dataTest}>{children}</StyledTableCell>;\n};\n","import React, { ChangeEventHandler, FC } from 'react';\nimport Checkbox from '../../../Checkbox';\nimport { Variables } from '../../../../../theme/variables';\nimport styled from 'styled-components';\nimport { DEFAULT_SIZE } from './constants';\n\nconst CheckboxContainer = styled.div`\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: initial;\n flex-shrink: 0;\n margin-right: 16px;\n`;\n\nconst StyledCheckbox = styled(Checkbox)`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n`;\n\nexport const TableCheckbox: FC<{\n checked: boolean;\n handleCheck: ChangeEventHandler<HTMLInputElement>;\n partial?: boolean;\n disabled?: boolean;\n size?: number;\n}> = ({ checked, partial, disabled, handleCheck, size }) => {\n return (\n <CheckboxContainer\n onClick={e => {\n e.stopPropagation();\n }}\n >\n <StyledCheckbox\n size={size ? size : DEFAULT_SIZE}\n checked={checked}\n partial={partial}\n disabled={disabled}\n background={Variables.Colors.white}\n handleChange={handleCheck}\n border={Variables.Colors.cloudyBlue}\n />\n </CheckboxContainer>\n );\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { TableCell } from '../table-cell';\n\nconst StyledTableCell = styled(TableCell)`\n padding: 0;\n`;\n\nexport const TableCheckboxCell: FC<{ width?: number }> = ({\n children,\n width,\n}) => {\n return <StyledTableCell width={width}>{children}</StyledTableCell>;\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nconst NewUserExclamation = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n viewBox=\"0 0 2 11\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M16.884 86.34v-7.02h-1.768v7.02h1.768zm0 2.34v-1.56h-1.768v1.56h1.768z\"\n transform=\"translate(-1367 -295) translate(1352 216)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NewUserExclamation;\n","import { FC, CSSProperties, memo } from 'react';\nimport styled from 'styled-components';\n\nimport { SIZES } from '../table-wrapper/constants';\n\nconst ScrollContainer = styled.div<{ addOverflow?: boolean }>`\n ${props => props.addOverflow && `overflow-y: hidden;`}\n ${props => props.addOverflow && `overflow-x: auto;`}\n transform: rotateZ(180deg);\n direction: rtl;\n\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteTwo};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\n\nconst TableInner = styled.table`\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n display: inline-table;\n transform: rotateZ(180deg);\n direction: ltr;\n min-width: ${SIZES.MIN_WIDTH}px;\n\n ::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.whiteTwo};\n border-radius: 8px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${props => props.theme.Colors.whiteThree};\n }\n`;\n\nconst TableCont = styled.div`\n display: block;\n border-radius: 8px;\n background: ${props => props.theme.Colors.white};\n position: relative;\n`;\n\nexport const Table: FC<{\n className?: string;\n containerStyles?: CSSProperties;\n cornered?: boolean;\n hideSpacer?: boolean;\n addOverflow?: boolean;\n}> = memo(\n ({ addOverflow, children, className, containerStyles }) => {\n return (\n <TableCont style={containerStyles}>\n <ScrollContainer addOverflow={addOverflow}>\n <TableInner className={className}>{children}</TableInner>\n </ScrollContainer>\n </TableCont>\n );\n }\n);\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst THead = styled.thead``;\n\nexport const TableHead: FC<{children?: React.ReactNode, dataTest?: string }> =\n ({ children, dataTest }) => <THead data-test={dataTest}>{children}</THead>;\n","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../theme/variables';\n\nconst Root = styled.div`\n flex: 1;\n display: flex;\n justify-content: flex-end;\n @media (max-width: ${Variables.BreakPoints.responsiveSmPlus}px) {\n margin-top: 8px;\n justify-content: flex-start;\n flex-wrap: wrap;\n }\n`;\n\nexport const TableToolsRight: FC<{\n className?: string;\n}> = memo(({ children, className }) => (\n <Root className={className}>{children}</Root>\n));\n","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\n\nimport { SIZES } from '../table-wrapper/constants';\n\nconst Root = styled.div`\n min-width: ${SIZES.MIN_WIDTH}px;\n display: flex;\n justify-content: stretch;\n align-items: stretch;\n padding: 16px 0;\n`;\n\nexport const TableTools: FC<{\n className?: string;\n}> = memo(({ children, className }) => (\n <Root className={className}>{children}</Root>\n));\n","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../theme/variables';\n\nconst Root = styled.div`\n display: flex;\n flex: 1;\n justify-content: space-between;\n @media (max-width: ${Variables.BreakPoints.responsiveSmPlus}px) {\n flex-direction: column;\n }\n`;\n\nexport const TableToolsWrapper: FC<{\n className?: string;\n}> = memo(({ children, className }) => (\n <Root className={className}>{children}</Root>\n));\n","import React, { FC, memo } from 'react';\nimport styled from 'styled-components';\n\nconst Root = styled.div`\n display: flex;\n`;\n\nexport const TableToolsLeft: FC<{\n className?: string;\n}> = memo(({ children, className }) => (\n <Root className={className}>{children}</Root>\n));\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const EditPencil = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 15 15\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <g fill=\"#currentColor\">\n <path\n d=\"M1358.3 306.282l-3.585.718-.715-.718.717-3.583 4.657-4.657 3.581-3.581.36-.36.36-.359c.989-.99 2.593-.99 3.583 0 .99.99.99 2.594 0 3.583l-8.958 8.957zm-2.151-3.582l-.499.498-.537 2.69 2.688-.54.498-.498-2.15-2.15zm.716-.717l2.15 2.15 6.45-6.45-2.15-2.15-6.45 6.45zm9.676-7.524c-.593-.593-1.557-.593-2.15 0l-.359.358 2.15 2.15.36-.358c.555-.556.59-1.438.103-2.035z\"\n transform=\"translate(-1354 -293)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default EditPencil;\n","import { FC } from 'react';\n\nimport styled from 'styled-components';\nimport { TableBody } from '../table-body-wrapper/table-body';\n\nconst TableRow = styled.tr`\n pointer-events: none;\n`;\n\nconst StyledTableBody = styled(TableBody)`\n &:before {\n line-height: unset;\n }\n`\n\nexport const TableNoResultBody: FC<{}> = ({ children }) => (\n <StyledTableBody>\n <TableRow>\n <td colSpan={100}>{children}</td>\n </TableRow>\n </StyledTableBody>\n);\n","import styled from 'styled-components';\n\nexport const StyledNoResults = styled.div`\n display: flex;\n padding-top: 136px;\n padding-bottom: 88px;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const StyledNoResultsContent = styled.div`\n max-width: 300px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const NoResultsTitle = styled.div<{ width?: string }>`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 15px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n ${props => !!props.width && `width: ${props.width};`}\n`;\n\nexport const NoResultsIcon = styled.div`\n width: 48px;\n height: 48px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 10px;\n`;\n\n","import { FC } from 'react';\n\nimport {\n NoResultsIcon,\n NoResultsTitle,\n StyledNoResults,\n StyledNoResultsContent,\n} from './styles';\n\nexport const TableNoResult: FC<{\n icon?: any;\n width?: string;\n subTitle?: string;\n subTitleWidth?: string;\n dataTest?: string;\n}> = ({ icon: Icon, width, dataTest, children }) => (\n <StyledNoResults>\n <StyledNoResultsContent>\n {Icon && (\n <NoResultsIcon data-test={dataTest && `${dataTest}-icon`}>\n <Icon />\n </NoResultsIcon>\n )}\n <NoResultsTitle\n width={width}\n data-test={dataTest && `${dataTest}-text`}\n >\n {children}\n </NoResultsTitle>\n </StyledNoResultsContent>\n </StyledNoResults>\n);\n","import React, { FC, useEffect, useRef, useState } from 'react';\n\nimport styled from 'styled-components';\nimport { NewUserValues } from '../../models/NewUserValues';\nimport { getUserRoleNameById, InvitationEmailErrors } from '../../tools';\nimport {\n DraftUser,\n PractisSetWithDueDate,\n} from '../../../../../constants/interfaces/Draft';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { useIfChanged } from '../../../../../helpers/hooks/usePreviousData';\nimport EditUserItem from './EditUserItem';\nimport { useUserRolesState } from '../../../../../features/roles/store/states';\nimport { TableCheckbox } from '../../../../../ui/components/table-wrapper/table/table-checkbox';\nimport {\n TableCheckboxCell,\n TableCheckboxHeaderCell,\n} from '../../../../../ui/components/table-wrapper/table/TableCheckbox';\nimport { TableHeaderCell } from '../../../../../ui/components/table-wrapper/table/table-header/table-header-cell';\nimport { TableCell } from '../../../../../ui/components/table-wrapper/table/table-cell';\nimport { TableBody } from '../../../../../ui/components/table-wrapper/table/table-body-wrapper/table-body';\nimport { ScrollPagination } from '../../../../../ui/components/ScrollPagination';\nimport { TableRow } from '../../../../../ui/components/table-wrapper/table/table-row';\nimport NewUserExclamation from '../../../../../ui/icons/NewUserExclamation';\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\nimport { useOrderBy } from '../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { Table, TableHead } from '../../../../../ui/components/Table';\nimport EditPencil from '../../../../../ui/icons/EditPencil';\nimport Trash from '../../../../../ui/icons/Trash';\nimport { TableNoResultBody } from '../../../../../ui/components/table-wrapper/table/TableNoResultBody';\nimport { TableNoResult } from '../../../../../ui/components/table-wrapper/table/TableNoResult';\nimport NoTrainingsFiltering from '../../../../../ui/icons/NoTrainingsFiltering';\nimport NoSearchResult from '../../../../../ui/icons/NoSearchResult';\n\nconst ITEMS_PER_PAGE = 20;\n\n//region Styles\nconst TableHeaderFirstCell = styled(TableHeaderCell)`\n min-width: 120px;\n`;\n\nconst StyledTableCell = styled(TableCell)`\n padding: 0;\n`;\n\nconst StyledTable = styled.table`\n flex: 1;\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n display: inline-table;\n`;\n\nconst StyledTableBody = styled(TableBody)`\n width: 100%;\n &:before {\n content: unset;\n }\n`;\n\nconst StyledTablePagination = styled(ScrollPagination)`\n width: 100%;\n`;\n\nconst TableBodyScrollContainer = styled.div`\n overflow: auto;\n flex: 1;\n width: 100%;\n padding-bottom: 40px;\n margin-top: -5px;\n`;\n\nconst FormatTableCellText = styled.span<{ hasError?: boolean }>`\n color: ${props => (props.hasError ? props.theme.Colors.tomato : 'unset')};\n`;\n\nconst IconsContainer = styled.div`\n align-items: center;\n justify-content: space-between;\n padding-right: 10px;\n display: none;\n min-width: 50px;\n`;\n\nconst IconHolder = styled.div`\n width: 14px;\n height: 14px;\n cursor: pointer;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst StyledTableRow = styled(TableRow)<{ hovered?: boolean }>`\n ${props =>\n !!props.hovered &&\n `\n background: ${props.theme.Colors.whiteTwo};\n & > td {\n &:first-child {\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n }\n &:last-child {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n }\n }\n `}\n\n &:hover ${IconsContainer} {\n display: flex;\n }\n`;\n\nconst IconsPlaceholder = styled.div`\n display: block;\n width: 50px;\n`;\n\nconst StyledIconHint = styled.div`\n display: none;\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 13px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n cursor: pointer;\n padding: 8px 16px;\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n background-color: ${props => props.theme.Colors.white};\n`;\n\nconst ErrorStateCheckbox = styled.div`\n margin-right: 16px;\n`;\n\nconst ExclamationIconContainer = styled.div`\n position: relative;\n width: 16px;\n height: 16px;\n border-radius: 2px;\n border: solid 1px ${props => props.theme.Colors.tomato};\n background-color: ${props => props.theme.Colors.tomato};\n align-items: center;\n justify-content: center;\n padding-left: 6px;\n\n &:hover ${StyledIconHint} {\n display: block;\n width: 200px;\n position: absolute;\n left: 8px;\n top: 10px;\n }\n\n &:hover ${IconsPlaceholder} {\n display: none;\n }\n`;\n\nconst ExclamationIconHolder = styled.div`\n width: 2px;\n color: ${props => props.theme.Colors.white};\n`;\n\nconst StyledTableContainer = styled.div`\n flex: 1;\n height: 100%;\n`;\n\nconst TableContainer = styled.div`\n width: 100%;\n height: 100%;\n`;\n\nconst TableExtendContainer = styled.div`\n border-radius: 16px;\n background: ${props => props.theme.Colors.white};\n height: 100%;\n display: flex;\n flex-direction: column;\n`;\n//endregion\n\nexport const RenderTableCheckboxCell: FC<{\n user: DraftUser;\n selectedUsers: number[];\n handleUserCheck(userId: number): void;\n dataTest: string;\n}> = ({ user, selectedUsers, handleUserCheck, dataTest }) => {\n let content;\n if (\n !user.firstName ||\n !user.lastName ||\n !user.email ||\n user.isEntryInvalid\n ) {\n content = (\n <Tooltip\n label={\n <span data-test={`${dataTest}-warning-text`}>\n {InvitationEmailErrors.isEntryInvalid}\n </span>\n }\n position=\"bottom-end\"\n >\n <ErrorStateCheckbox data-test={`${dataTest}-warning`}>\n <ExclamationIconContainer>\n <ExclamationIconHolder>\n <NewUserExclamation />\n </ExclamationIconHolder>\n </ExclamationIconContainer>\n </ErrorStateCheckbox>\n </Tooltip>\n );\n } else if (user.emailExistsInSystem) {\n content = (\n <Tooltip\n label={\n <span data-test={`${dataTest}-warning-text`}>\n {InvitationEmailErrors.emailExistsInSystem}\n </span>\n }\n position=\"bottom-end\"\n >\n <ErrorStateCheckbox data-test={`${dataTest}-warning`}>\n <ExclamationIconContainer>\n <ExclamationIconHolder>\n <NewUserExclamation />\n </ExclamationIconHolder>\n </ExclamationIconContainer>\n </ErrorStateCheckbox>\n </Tooltip>\n );\n } else {\n content = (\n <TableCheckbox\n checked={\n !!selectedUsers &&\n !!user.id &&\n selectedUsers.includes(user.id)\n }\n handleCheck={() => handleUserCheck(user.id)}\n dataTest={dataTest}\n />\n );\n }\n\n return <TableCheckboxCell width={1}>{content}</TableCheckboxCell>;\n};\n\nexport const UsersList: FC<{\n userList?: DraftUser[];\n totalUsersCount?: number;\n selectedUsers: number[];\n handleUserCheck(id?: number | string): void;\n updateAllUsersCheck(checked: boolean): void;\n onEditUser(user: NewUserValues): void;\n onRemoveUser(userId: number | string): void;\n isDraftSaved?: boolean;\n searchParams: SearchParams;\n limit: any;\n setLimit(limit: number): void;\n orderBy: any;\n setOrderBy(field: string): void;\n selectedUser: DraftUser;\n setSelectedUser(user: DraftUser): void;\n handleUpdateSelectedUser(): void;\n assignedRole: number | null;\n onAssignRoleCheck(role: number | null): void;\n selectedUserLabels: number[];\n setSelectedUserLabels: (labelIds: number[]) => void;\n selectedUserPractisSets: PractisSetWithDueDate[];\n setSelectedUserPractisSets: (\n practisSetIds: PractisSetWithDueDate[]\n ) => void;\n selectedUserTeams: number[];\n setSelectedUserTeams: (teamIds: number[]) => void;\n handleInputChange: (\n e: React.ChangeEvent<HTMLInputElement>,\n field: string\n ) => void;\n showNoSearchResultsState: boolean;\n showNoFilterResultsState: boolean;\n isRoleDisabled: boolean | undefined;\n updateSelectAll: (checked: boolean) => void;\n dataTest: string;\n}> = ({\n userList,\n totalUsersCount,\n selectedUsers,\n handleUserCheck,\n updateSelectAll,\n updateAllUsersCheck,\n onEditUser,\n onRemoveUser,\n isDraftSaved,\n searchParams,\n limit,\n setLimit,\n orderBy,\n setOrderBy,\n children,\n selectedUser,\n setSelectedUser,\n handleUpdateSelectedUser,\n handleInputChange,\n assignedRole,\n onAssignRoleCheck,\n setSelectedUserLabels,\n selectedUserLabels,\n setSelectedUserPractisSets,\n selectedUserPractisSets,\n setSelectedUserTeams,\n selectedUserTeams,\n showNoSearchResultsState,\n showNoFilterResultsState,\n isRoleDisabled,\n dataTest\n}) => {\n const scrollableRef = useRef<HTMLDivElement>(null);\n const userRoles = useUserRolesState();\n\n const [usersToDisplay, setUsersToDisplay] = useState<\n DraftUser[] | undefined\n >(userList);\n\n const isCheckboxPartiallySelected =\n usersToDisplay &&\n selectedUsers &&\n selectedUsers.length < usersToDisplay.length;\n\n const ifSearchParamsChanged = useIfChanged(searchParams);\n\n useEffect(() => {\n if (userList) {\n if (isDraftSaved) {\n setUsersToDisplay(userList);\n } else {\n updateDisplayUsers(searchParams);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [userList, limit, ifSearchParamsChanged]);\n\n //TODO: refactor\n const updateDisplayUsers = (searchParams: SearchParams) => {\n const displayUsers: any = userList ? [...userList] : [];\n if (searchParams.orderBy && searchParams.orderBy.field) {\n const field = searchParams.orderBy.field;\n const reverse = searchParams.orderBy.asc ? 1 : -1;\n if (field === 'labelCount') {\n displayUsers.sort((a: any, b: any) => {\n const firstEntry = a['labelIDs'];\n const secondEntry = b['labelIDs'];\n if (!firstEntry || !secondEntry) return false;\n return (\n reverse *\n (firstEntry.length < secondEntry.length\n ? -1\n : firstEntry.length > secondEntry.length\n ? 1\n : 0)\n );\n });\n } else if (field === 'practisSetCount') {\n displayUsers.sort((a: any, b: any) => {\n const firstEntry = a['practisSetIDs'];\n const secondEntry = b['practisSetIDs'];\n if (!firstEntry || !secondEntry) return false;\n return (\n reverse *\n (firstEntry.length < secondEntry.length\n ? -1\n : firstEntry.length > secondEntry.length\n ? 1\n : 0)\n );\n });\n } else if (field === 'roleId') {\n displayUsers.sort((a: any, b: any) => {\n const firstEntry = getRoleName(a[field] as number);\n const secondEntry = getRoleName(b[field] as number);\n if (!firstEntry || !secondEntry) return false;\n if (\n typeof firstEntry !== 'string' ||\n typeof secondEntry !== 'string'\n )\n return false;\n return (\n reverse *\n (firstEntry.toLowerCase() < secondEntry.toLowerCase()\n ? -1\n : firstEntry.toLowerCase() >\n secondEntry.toLowerCase()\n ? 1\n : 0)\n );\n });\n } else {\n displayUsers.sort((a: any, b: any) => {\n const firstEntry = a[field];\n const secondEntry = b[field];\n if (!firstEntry || !secondEntry) return false;\n if (\n typeof firstEntry !== 'string' ||\n typeof secondEntry !== 'string'\n )\n return false;\n return (\n reverse *\n (firstEntry.toLowerCase() < secondEntry.toLowerCase()\n ? -1\n : firstEntry.toLowerCase() >\n secondEntry.toLowerCase()\n ? 1\n : 0)\n );\n });\n }\n setUsersToDisplay(displayUsers);\n }\n };\n\n const getRoleName = (roleId: number) => {\n if (!roleId) return '';\n\n const role = getUserRoleNameById(roleId, userRoles.list);\n return role || '';\n };\n\n const hcUserFirstName = useOrderBy('firstName', orderBy, setOrderBy);\n const hcUserLastName = useOrderBy('lastName', orderBy, setOrderBy);\n const hcUserEmail = useOrderBy('email', orderBy, setOrderBy);\n const hcUserRole = useOrderBy('roleId', orderBy, setOrderBy);\n const hcPractisSets = useOrderBy('practisSetCount', orderBy, setOrderBy);\n const hcTeams = useOrderBy('teamsCount', orderBy, setOrderBy);\n const hcLabels = useOrderBy('labelCount', orderBy, setOrderBy);\n\n const actionsDisabled = !userList || userList.length < 1;\n\n return (\n <StyledTableContainer>\n <TableContainer>\n <TableExtendContainer>\n <Table hideSpacer={true}>\n <TableHead dataTest={`${dataTest}-head`}>\n <TableRow>\n <TableCheckboxHeaderCell width={1} dataTest={`${dataTest}-head-checkbox`}>\n <TableCheckbox\n checked={\n !!selectedUsers &&\n !!selectedUsers.length\n }\n disabled={actionsDisabled}\n partial={isCheckboxPartiallySelected}\n handleCheck={(event: any) => {\n updateAllUsersCheck(\n event.target.checked\n );\n\n updateSelectAll(\n event.target.checked\n );\n }}\n dataTest={`${dataTest}-head-checkbox-input`}\n />\n </TableCheckboxHeaderCell>\n <TableHeaderFirstCell\n width={14}\n {...hcUserFirstName}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-first-name`}\n >\n First Name\n </TableHeaderFirstCell>\n <TableHeaderCell\n width={14}\n {...hcUserLastName}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-last-name`}\n >\n Last Name\n </TableHeaderCell>\n <TableHeaderCell\n width={18}\n {...hcUserEmail}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-email`}\n >\n User Email\n </TableHeaderCell>\n <TableHeaderCell\n width={10}\n {...hcUserRole}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-role`}\n >\n Role\n </TableHeaderCell>\n <TableHeaderCell\n width={13}\n {...hcTeams}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-teams`}\n >\n Teams\n </TableHeaderCell>\n <TableHeaderCell\n width={15}\n {...hcPractisSets}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-practis-sets`}\n >\n Practis Sets\n </TableHeaderCell>\n <TableHeaderCell\n width={10}\n {...hcLabels}\n disabled={actionsDisabled}\n dataTest={`${dataTest}-head-labels`}\n >\n Labels\n </TableHeaderCell>\n <TableHeaderCell width={5} />\n </TableRow>\n </TableHead>\n </Table>\n {children}\n <TableBodyScrollContainer ref={scrollableRef}>\n <StyledTablePagination\n itemsPerPage={ITEMS_PER_PAGE}\n itemCount={userList ? userList.length : 0}\n totalCount={\n isDraftSaved\n ? totalUsersCount\n : userList && userList.length\n }\n onLimitChange={setLimit}\n scrollableRef={scrollableRef}\n >\n <StyledTable>\n <StyledTableBody>\n {usersToDisplay &&\n usersToDisplay.map(\n (user: DraftUser) => {\n if (\n user.id === selectedUser.id\n ) {\n return (\n <EditUserItem\n key={user.id}\n user={selectedUser}\n setUser={\n setSelectedUser\n }\n handleUpdateSelectedUser={\n handleUpdateSelectedUser\n }\n handleInputChange={\n handleInputChange\n }\n assignedRole={\n assignedRole\n }\n onAssignRoleCheck={\n onAssignRoleCheck\n }\n setSelectedUserLabels={\n setSelectedUserLabels\n }\n selectedUserLabels={\n selectedUserLabels\n }\n setSelectedUserPractisSets={\n setSelectedUserPractisSets\n }\n selectedUserPractisSets={\n selectedUserPractisSets\n }\n setSelectedUserTeams={\n setSelectedUserTeams\n }\n selectedUserTeams={\n selectedUserTeams\n }\n isRoleDisabled={\n isRoleDisabled\n }\n dataTest={`${dataTest}-edit`}\n />\n );\n }\n return (\n <StyledTableRow\n key={user.id}\n hovered={\n user.id ===\n selectedUser.id\n }\n dataTest={`${dataTest}-row`}\n >\n <RenderTableCheckboxCell\n user={user}\n selectedUsers={\n selectedUsers\n }\n handleUserCheck={\n handleUserCheck\n }\n dataTest={`${dataTest}-row-checkbox`}\n />\n <StyledTableCell\n width={14}\n >\n {user.firstName && (\n <FormatTableCellText\n hasError={\n user.isEntryInvalid ||\n user.emailExistsInSystem ||\n !user.firstName ||\n !user.lastName ||\n !user.email ||\n !user.roleId\n }\n data-test={`${dataTest}-row-first-name`}\n >\n {\n user.firstName\n }\n </FormatTableCellText>\n )}\n </StyledTableCell>\n <TableCell width={14}>\n {user.lastName && (\n <FormatTableCellText\n hasError={\n user.isEntryInvalid ||\n user.emailExistsInSystem ||\n !user.firstName ||\n !user.lastName ||\n !user.email ||\n !user.roleId\n }\n data-test={`${dataTest}-row-last-name`}\n >\n {\n user.lastName\n }\n </FormatTableCellText>\n )}\n </TableCell>\n <TableCell width={18}>\n {user.email && (\n <FormatTableCellText\n hasError={\n user.isEntryInvalid ||\n user.emailExistsInSystem ||\n !user.firstName ||\n !user.lastName ||\n !user.email ||\n !user.roleId\n }\n data-test={`${dataTest}-row-email`}\n >\n {\n user.email\n }\n </FormatTableCellText>\n )}\n </TableCell>\n <TableCell width={10}>\n <span data-test={`${dataTest}-row-role`}>\n {!!user.roleId &&\n getRoleName(\n user.roleId\n )}\n </span>\n </TableCell>\n <TableCell\n shouldShowEmptyCell={!user.teamIDs?.length}\n width={13}>\n <span data-test={`${dataTest}-row-teams`}>\n {user.teamIDs &&\n !!user.teamIDs\n .length &&\n `${\n user.teamIDs\n .length\n } ${\n user.teamIDs\n .length >\n 1\n ? 'Teams'\n : 'Team'\n }`}\n </span>\n </TableCell>\n <TableCell\n shouldShowEmptyCell={!user.practisSetIDs?.length}\n width={15}>\n <span data-test={`${dataTest}-row-practis-sets`}>\n {user.practisSetIDs &&\n user\n .practisSetIDs\n .length &&\n `${\n user\n .practisSetIDs\n .length\n } ${\n user\n .practisSetIDs\n .length >\n 1\n ? 'Practis Sets'\n : 'Practis Set'\n }`}\n </span>\n </TableCell>\n <TableCell\n shouldShowEmptyCell={!user.labelIDs?.length}\n width={10}>\n <span data-test={`${dataTest}-row-labels`}>\n {user.labelIDs &&\n user.labelIDs\n .length &&\n `${\n user\n .labelIDs\n .length\n } ${\n user\n .labelIDs\n .length >\n 1\n ? 'Labels'\n : 'Label'\n }`}\n </span>\n </TableCell>\n <TableCell width={5}>\n <IconsPlaceholder />\n <IconsContainer>\n <IconHolder\n onClick={() =>\n user &&\n onEditUser(\n user\n )\n }\n data-test={`${dataTest}-row-edit`}\n >\n <EditPencil />\n </IconHolder>\n <IconHolder\n onClick={() =>\n user.id &&\n onRemoveUser(\n user.id\n )\n }\n data-test={`${dataTest}-row-delete`}\n >\n <Trash />\n </IconHolder>\n </IconsContainer>\n </TableCell>\n </StyledTableRow>\n );\n }\n )}\n </StyledTableBody>\n {usersToDisplay && usersToDisplay.length === 0 && (\n <TableNoResultBody>\n {showNoSearchResultsState ? (\n <TableNoResult\n icon={NoSearchResult}\n subTitleWidth=\"180px\"\n dataTest=\"no-found-users\"\n >\n No Users Found\n </TableNoResult>\n ) : showNoFilterResultsState ? (\n <TableNoResult\n icon={NoTrainingsFiltering}\n width=\"160px\"\n dataTest=\"no-filter-results\"\n >\n No Results Match the Filter\n Criteria\n </TableNoResult>\n ) : null}\n </TableNoResultBody>\n )}\n </StyledTable>\n </StyledTablePagination>\n </TableBodyScrollContainer>\n </TableExtendContainer>\n </TableContainer>\n </StyledTableContainer>\n );\n};\n","import { FC, useCallback, useState } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { Variables } from '../../../../theme/variables';\r\nimport { useCreateUserStagingService } from '../store/services';\r\nimport { NewUserValues } from '../models/NewUserValues';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport { pushModal, useHistory } from '../../../../tools/router';\r\nimport { Input } from '../../../../ui/components/input';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\r\n\r\nconst StyledTitle = styled.div`\r\n font-size: 20px;\r\n font-weight: 800;\r\n width: 100%;\r\n`;\r\n\r\nconst StyledContent = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nconst StyledDescription = styled.div`\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n margin-top: 15px;\r\n margin-bottom: -2px;\r\n width: 100%;\r\n height: 37px;\r\n`;\r\n\r\nconst StyledFormArea = styled.div`\r\n width: 416px;\r\n`;\r\n\r\nconst StyledActions = styled.div`\r\n width: 264px;\r\n display: flex;\r\n justify-content: space-between;\r\n margin-top: 12px;\r\n align-self: flex-end;\r\n`;\r\n\r\nconst StyledInput = styled(Input)<{ hasError?: boolean }>`\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n border-radius: 4px;\r\n background-color: ${props => props.theme.Colors.whiteTwo};\r\n ${props =>\r\n !!props.hasError && `border: 1px solid ${props.theme.Colors.tomato}`};\r\n`;\r\n\r\nconst StyledInputContainer = styled.div`\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst StyledErrorMessage = styled.div`\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n font-size: 13px;\r\n font-weight: 500;\r\n font-stretch: normal;\r\n font-style: normal;\r\n line-height: normal;\r\n letter-spacing: normal;\r\n color: ${props => props.theme.Colors.tomato};\r\n width: 100%;\r\n margin-bottom: 2px;\r\n`;\r\n\r\nexport const SaveAsDraftModal: FC<{\r\n newUsers: NewUserValues[];\r\n onProceed(): void;\r\n onError(error: string): void;\r\n onClose(): void;\r\n}> = ({ newUsers, onProceed, onError, onClose }) => {\r\n const [title, setTitle] = useState('');\r\n const [error, setError] = useState('');\r\n const [submitClicked, setSubmitClicked] = useState(false)\r\n const createUserStagingService = useCreateUserStagingService();\r\n const history = useHistory();\r\n const handleTitleChange = (value: any) => {\r\n if (value.length > 64) return;\r\n setTitle(value);\r\n setError('');\r\n };\r\n\r\n const handleSubmit = useCallback(() => {\r\n if (!newUsers || (newUsers && !newUsers.length)) return;\r\n\r\n setSubmitClicked(true)\r\n createUserStagingService(\r\n title,\r\n newUsers.map(user => ({\r\n firstName: user.firstName ? user.firstName.toString() : '',\r\n lastName: user.lastName ? user.lastName.toString() : '',\r\n email: user.email ? user.email : '',\r\n roleId: user.roleId ? user.roleId : null,\r\n labelIDs: user.labelIDs,\r\n practisSetIDs: user.practisSetIDs ?? [],\r\n teamIDs: user.teamIDs,\r\n }))\r\n ).then((data: any) => {\r\n if (data && data.errorCode && data.errorCode === 433) {\r\n setError('Entered title already exists');\r\n setSubmitClicked(false);\r\n } else if (data.id) {\r\n setError('');\r\n onProceed();\r\n pushModal(\r\n history,\r\n ROUTES.ACTION_ITEMS.NEW_USER.replace(':draftId', data.id)\r\n );\r\n } else {\r\n setError('');\r\n onError('Draft contains invalid data');\r\n setSubmitClicked(false);\r\n }\r\n });\r\n }, [\r\n newUsers,\r\n createUserStagingService,\r\n title,\r\n onProceed,\r\n history,\r\n onError,\r\n ]);\r\n\r\n return (\r\n <DialogWrapper\r\n customization={{ width: 480, padding: '32px 40px' }}\r\n dataTest=\"save-as-draft\"\r\n >\r\n <StyledTitle data-test=\"save-as-draft-title\">\r\n Save as Draft\r\n </StyledTitle>\r\n <StyledContent>\r\n <StyledDescription data-test=\"save-as-draft-description\">\r\n You can save your progress as draft until it’s ready to be\r\n sent out.\r\n </StyledDescription>\r\n <StyledFormArea>\r\n <StyledInputContainer>\r\n <StyledInput\r\n type=\"text\"\r\n name=\"title\"\r\n inputPadding=\"15px 24px\"\r\n value={title}\r\n placeholder=\"Draft Title\"\r\n labelLeftPosition=\"24px\"\r\n labelFontWeight={500}\r\n maxLength={100}\r\n height=\"40px\"\r\n handleChange={(e: any) =>\r\n handleTitleChange(e.target.value)\r\n }\r\n hasError={!!error}\r\n dataTest=\"save-as-draft-input\"\r\n />\r\n </StyledInputContainer>\r\n </StyledFormArea>\r\n {error && (\r\n <StyledErrorMessage data-test=\"save-as-draft-input-error\">\r\n {error}\r\n </StyledErrorMessage>\r\n )}\r\n <StyledActions>\r\n <Button\r\n width=\"128px\"\r\n height=\"40px\"\r\n action={onClose}\r\n variant=\"inverse\"\r\n dataTest=\"save-as-draft-cancel\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n width=\"128px\"\r\n height=\"40px\"\r\n action={handleSubmit}\r\n disabled={!title}\r\n customDisabledColor={Variables.Colors.cloudyBlue}\r\n loading={submitClicked}\r\n dataTest=\"save-as-draft-save\"\r\n >\r\n Save\r\n </Button>\r\n </StyledActions>\r\n </StyledContent>\r\n </DialogWrapper>\r\n );\r\n};\r\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { PaginationResult } from '../../../../constants/interfaces/PaginationResult';\nimport { DraftUser } from '../../../../constants/interfaces/Draft';\nimport { StateWithLabels } from '../../../../features/portableLabels/store/hors/withLabels';\n\nexport type DraftEditBaseState = {\n data?: PaginationResult<DraftUser>;\n loading: boolean;\n updateData?: Partial<DraftUser>;\n updateType?:\n | 'draft-created'\n | 'draft-updated'\n | 'draft-deleted'\n | 'user-invited';\n loadingUpdate?: boolean;\n error?: string;\n};\n\nexport type DraftEditState = DraftEditBaseState & StateWithLabels;\n\nexport type DraftEditStateSelector = (state: any) => DraftEditState;\n\nexport const DraftEditStateSelectorContext = React.createContext<DraftEditStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useDraftEditState(): DraftEditState {\n return useSelector(useContext(DraftEditStateSelectorContext));\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const AddUser = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 24 24\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <g fill=\"#currentColor\">\n <g>\n <path\n fillRule=\"evenodd\"\n d=\"M23.253 21h-2.25v2.25c0 .414-.336.75-.75.75s-.75-.336-.75-.75V21h-2.25c-.414 0-.75-.336-.75-.75 0-.415.336-.75.75-.75h2.25v-2.25c0-.415.336-.751.75-.751s.75.336.75.751v2.25h2.25c.414 0 .75.335.75.75 0 .414-.336.75-.75.75zm-8.637-5.754c.771.192 1.897.482 3.014.795-.525.358-.974.81-1.36 1.313-.908-.244-1.86-.488-2.767-.706v-2.376c1.881-1.28 2.996-4.06 2.996-6.588 0-3.418-.875-6.19-5.248-6.19s-5.247 2.772-5.247 6.19c0 2.53 1.116 5.313 3 6.592v2.394c-2.837.667-6.13 1.581-6.887 1.996-.49.618-.918 2.597-.614 3.835h13.712c.138.533.349 1.033.619 1.498H.677c-1.173-1.8-.697-5.399.476-6.597.558-.57 4.747-1.65 6.751-2.142-2.117-1.645-3.407-4.695-3.407-7.604C4.497 3.428 5.725 0 11.25 0c5.527 0 6.755 3.428 6.755 7.656 0 2.9-1.284 5.942-3.39 7.59z\"\n transform=\"translate(-392 -692) translate(392 692)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default AddUser;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NewUserPath = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"68\"\n height=\"74\"\n viewBox=\"0 0 68 74\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"#4AA9E2\">\n <g>\n <path\n fillRule=\"nonzero\"\n d=\"M68 0v1.5C33.417 1.5 5.317 29.254 4.758 63.704L4.75 64.75h-1.5C3.25 29.347 31.663.58 66.93.009L68 0z\"\n transform=\"translate(-316 -703) translate(316 703.25)\"\n />\n <path\n stroke=\"#4AA9E2\"\n d=\"M4 65.868l3.191 6.382H.809L4 65.868z\"\n transform=\"translate(-316 -703) translate(316 703.25) rotate(-180 4 68.75)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NewUserPath;\n","import React, { FC } from 'react';\n\nimport styled from 'styled-components';\nimport AddNewUser from '../../../../ui/icons/AddNewUser';\nimport NewUserPath from '../../../../ui/icons/NewUserPath';\n\nconst IconsContainer = styled.div`\n display: flex;\n z-index: 1;\n padding-left: 24px;\n position: absolute;\n align-items: flex-end;\n top: 70px;\n`;\n\nconst PathIconHolder = styled.div`\n margin-right: 8px;\n padding-top: 12px;\n color: ${props => props.theme.Colors.darkSkyBlue};\n transform: rotateX(180deg);\n`;\n\nconst UserIconContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst UserIconHolder = styled.div`\n height: 24px;\n width: 24px;\n color: ${props => props.theme.Colors.darkSkyBlue};\n`;\n\nconst AddNewUserLabel = styled.div`\n color: ${props => props.theme.Fonts.manrope};\n font-size: 15px;\n font-weight: 600;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.darkSkyBlue};\n margin-left: 7px;\n`;\n\nconst AddNewUserTip: FC<{dataTest: string}> = ({ dataTest }) => {\n return (\n <IconsContainer>\n <PathIconHolder>\n <NewUserPath />\n </PathIconHolder>\n <UserIconContainer>\n <UserIconHolder>\n <AddNewUser />\n </UserIconHolder>\n <AddNewUserLabel data-test={dataTest}>\n Add users to the table in order to edit or invite them\n </AddNewUserLabel>\n </UserIconContainer>\n </IconsContainer>\n );\n};\n\nexport default AddNewUserTip;\n","import { useEffect } from 'react';\n\nexport default function useKeypress(key: string, action: any) {\n useEffect(() => {\n function onKeyup(e: any) {\n if (e.key === key) action && action();\n }\n window.addEventListener('keyup', onKeyup);\n return () => window.removeEventListener('keyup', onKeyup);\n }, [action, key]);\n}\n","import { rgba } from 'polished';\nimport React, {\n createContext,\n FC,\n MouseEvent,\n useCallback,\n useContext,\n useMemo,\n} from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\n\nimport { useHistory } from '../../../tools/router';\n\nconst Background = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1100;\n background: ${props => rgba(props.theme.Colors.dark, 0.8)};\n overflow-x: auto;\n overflow-y: hidden;\n`;\n\nconst Modal = styled(motion.div)<{ width?: string }>`\n position: absolute;\n width: ${props => (!!props.width ? props.width : '80%')};\n top: 0;\n right: 0;\n bottom: 0;\n background: ${props => props.theme.Colors.whiteTwo};\n box-shadow: 0 5px 20px -5px rgba(166, 174, 190, 0.5);\n transition: left 0.3s linear;\n border-top-left-radius: 16px;\n border-bottom-left-radius: 16px;\n @media (max-width: ${props => props.theme.BreakPoints.responsiveSm}px) {\n left: 47px;\n min-width: 375px;\n width: 968px;\n }\n`;\n\nexport const ModalPage: FC<{\n onClose?(): void;\n className?: string;\n width?: string;\n}> = ({ children, onClose, className, width }) => {\n const preventClick = useCallback((e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n }, []);\n\n const closeModalPage = useCallback(() => {\n if (onClose) onClose();\n }, [onClose]);\n const context = useMemo(() => ({ closeModalPage }), [closeModalPage]);\n\n return (\n <Background onClick={closeModalPage} data-test=\"modal-background\">\n <Modal onClick={preventClick} className={className} width={width}>\n <ModalPageContext.Provider value={context}>\n {children}\n </ModalPageContext.Provider>\n </Modal>\n </Background>\n );\n};\n\nexport interface ModalPageContainerProps {\n closePath: string;\n closeGoingBack: boolean;\n restrictClosing?: boolean;\n restrictClosingAction?(): void;\n handleManualClose?(): void;\n className?: string;\n width?: string;\n}\n\nexport const ModalPageContainer: FC<ModalPageContainerProps> = ({\n closePath,\n closeGoingBack,\n restrictClosing,\n restrictClosingAction,\n children,\n className,\n handleManualClose,\n width,\n}) => {\n const history = useHistory();\n const handleClose = useCallback(() => {\n if (restrictClosing) {\n restrictClosingAction && restrictClosingAction();\n } else {\n if (closeGoingBack) history.goBack();\n else history.replace(closePath);\n }\n }, [\n history,\n closeGoingBack,\n closePath,\n restrictClosing,\n restrictClosingAction,\n ]);\n\n return (\n <ModalPage\n onClose={handleManualClose || handleClose}\n className={className}\n width={width}\n >\n {children}\n </ModalPage>\n );\n};\n\nexport const ModalPageContext = createContext<{ closeModalPage?(): void }>({});\n\nexport function useModalPageContext() {\n return useContext(ModalPageContext);\n}\n\nexport default ModalPageContainer;\n","import styled from 'styled-components';\n\nexport const StyledContainer = styled.div`\n overflow: auto;\n height: 100%;\n display: block;\n padding: 0 28px;\n background-color: var(--ps-white-1);\n min-width: 1024px;\n border-top-left-radius: 8px;\n border-bottom-left-radius: 8px;\n`;\n\nexport const StyledHeader = styled.div<{ marginBottom?: string }>`\n display: flex;\n align-items: center;\n font-size: 24px;\n font-weight: bold;\n letter-spacing: 0.5px;\n height: 95px;\n background-color: var(--ps-white-1);\n color: var(--ps-graphite-1);\n`;\n\nexport const UserStatsContainer = styled.div`\n margin-left: 16px;\n`;\n\nexport const StyledFooter = styled.div`\n height: 79px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-shrink: 0;\n`;\n\nexport const StyledFooterActions = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const StyledHeaderInput = styled.div`\n flex: 1;\n min-width: 150px;\n font-size: 20px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n margin-left: 16px;\n`;\n\nexport const StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n height: calc(100% - 257px);\n justify-content: space-between;\n min-height: 300px;\n`;\n\nexport const AddNewUserWrapper = styled.div`\n margin-top: 16px;\n position: relative;\n`;\n\nexport const Divider = styled.hr`\n width: 100%;\n height: 1px;\n border: none;\n flex-shrink: 0;\n background-color: var(--ps-grey-4);\n margin: 0;\n`;\n\nexport const StyledSavedStatusContainer = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 13px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: var(--ps-grey-1);\n align-self: flex-end;\n`;\n\nexport const StyledButtonContainer = styled.div`\n margin-right: 16px;\n`;","import { useSelector } from 'react-redux';\nimport React, { useContext } from 'react';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport { CompanyUserStats } from '../../../constants/interfaces/CompanyUserStats';\nimport { CompanyVoiceSettings } from '../../../constants/interfaces/CompanyVoiceSettings';\n\nexport interface CompanyVoiceSettingsState {\n data?: CompanyVoiceSettings[];\n loading: boolean;\n error?: string;\n}\n\nexport type CompanyVoiceSettingsStateSelector = (\n state: any\n) => CompanyVoiceSettingsState;\n\nexport const CompanyVoiceSettingsStateSelectorContext = React.createContext<\n CompanyVoiceSettingsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useCompanyVoiceSettingsState(): CompanyVoiceSettingsState {\n return useSelector(useContext(CompanyVoiceSettingsStateSelectorContext));\n}\n\nexport interface CompanyAdminsState {\n data?: UserV2[];\n loading: boolean;\n error?: string;\n}\n\nexport type CompanyAdminsStateSelector = (\n state: any\n) => CompanyAdminsState;\n\nexport const CompanyAdminsStateSelectorContext = React.createContext<\n CompanyAdminsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useCompanyAdminsState(): CompanyAdminsState {\n return useSelector(useContext(CompanyAdminsStateSelectorContext));\n}\n\nexport interface CompanyUserStatsState {\n data?: CompanyUserStats;\n loading: boolean;\n error?: string;\n}\n\nexport type CompanyUserStatsStateSelector = (\n state: any\n) => CompanyUserStatsState;\n\nexport const CompanyUserStatsStateSelectorContext = React.createContext<\n CompanyUserStatsStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useCompanyUserStatsState(): CompanyUserStatsState {\n return useSelector(useContext(CompanyUserStatsStateSelectorContext));\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Cross = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.650152 0.649946C0.825927 0.474384 1.06421 0.375771 1.31265 0.375771C1.56109 0.375771 1.79936 0.474384 1.97515 0.649946L6.00015 4.67495L10.0252 0.649946C10.111 0.557834 10.2145 0.483959 10.3295 0.432721C10.4445 0.381484 10.5687 0.353934 10.6945 0.351709C10.8204 0.349484 10.9454 0.372646 11.0622 0.419796C11.1789 0.466946 11.2849 0.537121 11.3739 0.626146C11.463 0.715171 11.5332 0.821221 11.5803 0.937946C11.6274 1.05468 11.6507 1.17972 11.6484 1.3056C11.6462 1.43148 11.6187 1.55562 11.5674 1.67062C11.5162 1.78562 11.4423 1.88912 11.3502 1.97495L7.32515 5.99995L11.3502 10.0249C11.4423 10.1108 11.5162 10.2143 11.5674 10.3293C11.6187 10.4443 11.6462 10.5684 11.6484 10.6943C11.6507 10.8202 11.6274 10.9452 11.5803 11.0619C11.5332 11.1787 11.463 11.2847 11.3739 11.3737C11.2849 11.4628 11.1789 11.5329 11.0622 11.5801C10.9454 11.6272 10.8204 11.6504 10.6945 11.6482C10.5687 11.6459 10.4445 11.6184 10.3295 11.5672C10.2145 11.5159 10.111 11.4421 10.0252 11.3499L6.00015 7.32495L1.97515 11.3499C1.79743 11.5156 1.56236 11.6057 1.31949 11.6014C1.07661 11.5971 0.844889 11.4987 0.673114 11.3269C0.501352 11.1552 0.402964 10.9234 0.398677 10.6806C0.394389 10.4377 0.484552 10.2027 0.650152 10.0249L4.67515 5.99995L0.650152 1.97495C0.474589 1.79917 0.375977 1.56088 0.375977 1.31245C0.375977 1.06401 0.474589 0.825734 0.650152 0.649946Z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n","import { motion } from 'framer-motion';\nimport styled from 'styled-components';\nimport { rgba } from 'polished';\n\nexport const ModalBackground = styled(motion.div)<{\n zIndex?: number;\n}>`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: ${props => props.zIndex || '1200'};\n background: ${rgba('#232e3a', 0.8)};\n display: flex;\n justify-content: center;\n align-items: center;\n color: var(--ps-black-main);\n`;\n\nexport const ModalContainer = styled(motion.div)<{\n width: number;\n}>`\n width: ${props => props.width || '400'}px;\n height: auto;\n min-height: 200px;\n box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.1);\n background-color: var(--ps-white-1);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n`;\n\nexport const ModalHeader = styled.div`\n min-height: 50px;\n border-bottom: 1px solid var(--ps-grey-4);\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const ModalTitle = styled.div`\n padding: 8px 50px 8px 24px;\n font-size: 18px;\n font-weight: 800;\n color: var(--ps-black-main);\n`;\n\nexport const CrossContainer = styled.div`\n width: 12px;\n height: 12px;\n color: #24292E;\n position: absolute;\n top: 19px;\n right: 28px;\n cursor: pointer;\n display: flex;\n`;","import React, { FC } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Cross } from '../../icons/Cross';\n\nimport {\n ModalBackground,\n ModalContainer,\n ModalTitle,\n CrossContainer,\n ModalHeader,\n} from './styles';\nimport { ModalWithCrossProps } from './types';\n\nconst ModalWithCrossView: FC<ModalWithCrossProps> = props => {\n const {\n title,\n titleStyle,\n titleContent,\n width,\n onClose,\n children,\n dataTest,\n zIndex,\n hideCross\n } = props;\n const container = document.querySelector('body') as HTMLElement;\n\n return createPortal(\n <ModalBackground zIndex={zIndex}>\n <ModalContainer\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n width={width}\n data-test={dataTest}\n >\n {!hideCross && <ModalHeader>\n {title ? (\n <ModalTitle style={titleStyle} data-test={dataTest && `${dataTest}-title`}>\n {title}\n </ModalTitle>\n ) : titleContent}\n <CrossContainer onClick={onClose} data-test={dataTest && `${dataTest}-close`}>\n <Cross />\n </CrossContainer>\n </ModalHeader>}\n {children}\n </ModalContainer>\n </ModalBackground>,\n container\n );\n};\n\nexport default ModalWithCrossView;","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding: 16px 24px;\n`;\n\nexport const Description = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-black-main);\n`;\n\nexport const QuickTip = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-black-main);\n padding-top: 8px;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-top: 32px;\n`;","import { Button } from \"../../../../../../../ui/components/Button\";\nimport { ModalWithCross } from \"../../../../../../../ui/components/ModalWithCross\";\nimport {\n Container,\n Description,\n QuickTip,\n Footer\n} from \"./styles\";\nimport { UserLimitWarningModalViewProps } from \"./types\";\n\nfunction UserLimitWarningModalView({\n title,\n description,\n quickTip,\n width,\n onClose,\n onManageInvitations,\n onRequestLimitChange,\n}: UserLimitWarningModalViewProps) {\n return (\n <ModalWithCross\n title={title}\n width={width}\n titleStyle={{padding: '14px 24px', fontSize: '15px'}}\n onClose={onClose}\n dataTest=\"limit-warning\"\n >\n <Container>\n <Description data-test=\"limit-warning-description\">{description}</Description>\n <QuickTip>\n <span data-test=\"quick-tip-icon\">💡</span> \n <b data-test=\"quick-tip-title\">Quick tip:</b> \n <span data-test=\"quick-tip-text\">{quickTip}</span>\n </QuickTip>\n <Footer>\n <Button\n action={onManageInvitations}\n label=\"Manage Invitations\"\n width=\"130px\"\n height=\"40px\"\n variant=\"inverse\"\n dataTest=\"manage-invitations-button\"\n />\n <Button\n action={onRequestLimitChange}\n label=\"Request Limit Change\"\n width=\"130px\"\n height=\"40px\"\n dataTest=\"request-limit-change-button\"\n />\n </Footer>\n </Container>\n </ModalWithCross>\n );\n}\n\nexport default UserLimitWarningModalView;","import { useCallback } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { sendEmail } from \"../../../../../../../helpers/functions/email-helpers\";\nimport ROUTES from \"../../../../../../../routes/routes\";\nimport { useHistory } from \"../../../../../../../tools/router\";\nimport { getCompanyState } from \"../../../../../../CompanySettings/store/reducers\";\nimport { getProfileState } from \"../../../../../../UserProfile/store/reducers\";\nimport { UserLimitWarningModalProps } from \"./types\";\nimport UserLimitWarningModalView from \"./view\";\n\nfunction UserLimitWarningModal({\n title, description, quickTip, width, onClose\n}: UserLimitWarningModalProps) {\n const history = useHistory();\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n\n const handleManageInvitations = useCallback(() => {\n history.push(ROUTES.INVITATIONS);\n }, [history]);\n\n const handleRequestLimitChange = useCallback(() => {\n if (!profile || !company) return;\n sendEmail(\n `Licensed seats limit change request from ${profile.firstName} ${profile.lastName} at ${company.name}`\n );\n }, [company, profile]);\n\n return (\n <UserLimitWarningModalView\n title={title}\n description={description}\n quickTip={quickTip}\n width={width}\n onClose={onClose}\n onManageInvitations={handleManageInvitations}\n onRequestLimitChange={handleRequestLimitChange}\n />\n );\n}\n\nexport default UserLimitWarningModal;","import { useCompanyUserStatsState } from \"../../../../../../CompanySettings/store/states\";\nimport { UserLimitWarningModal } from \"../UserLimitWarningModal\";\nimport { NoFreeUsersModalViewProps } from \"./types\";\n\nfunction NoFreeUsersModalView({\n onClose\n}: NoFreeUsersModalViewProps) {\n const userStats = useCompanyUserStatsState().data;\n\n if (!userStats) return <></>;\n\n return (\n <UserLimitWarningModal\n title=\"You can't invite new users\"\n description={<>You've reached your company's licensed seats limit of <b data-test=\"user-limit-value\">{userStats.limit}</b>. You may be able to find unaccepted invitations and revoke them, which will free up some seats.<br />\n Alternatively, contact your Practis Support to request an increase.</>}\n quickTip=\"you can save all these invitations as a Draft for now until the limitation issue is resolved.\"\n width={388}\n onClose={onClose}\n />\n );\n}\n\nexport default NoFreeUsersModalView;","import { useCompanyUserStatsState } from '../../../../../../CompanySettings/store/states';\nimport { UserLimitWarningModal } from '../UserLimitWarningModal';\nimport { ExceededFreeUsersModalViewProps } from './types';\n\nfunction ExceededFreeUsersModalView({\n onClose\n}: ExceededFreeUsersModalViewProps) {\n const userStats = useCompanyUserStatsState().data;\n\n if (!userStats) return <></>;\n\n return (\n <UserLimitWarningModal\n title=\"You need more seats to invite these users\"\n description={<>You're trying to invite more users than is allowed under your existing license. Your company's account on Practis is limited to <b><span data-test=\"user-limit-value\">{userStats.limit}</span> licensed seats</b> and you've used up <b data-test=\"existing-users-count\">{userStats.total}</b>.<br /> \nYou can either modify the invitations here to a lower number, find unaccepted invitations and revoke them, which will free up some seats.<br />\nAlternatively, contact your Practis Support to request an increase.</>}\n quickTip=\"you can save all these invitations as a Draft for now until the limitation issue is resolved.\"\n width={392}\n onClose={onClose}\n />\n );\n}\n\nexport default ExceededFreeUsersModalView;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Gear = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#iirg9aq4aa)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.429 1.525a6.593 6.593 0 0 1 1.142 0c.036.003.108.036.137.146l.289 1.105c.147.56.55.967.997 1.189.174.086.341.183.501.29.417.278.97.423 1.53.27l1.102-.303c.11-.03.175.016.195.046.219.31.41.641.573.989.014.031.022.11-.059.19l-.815.806c-.411.406-.562.957-.53 1.456a4.588 4.588 0 0 1 0 .582c-.032.499.119 1.05.53 1.456l.815.806c.08.08.073.159.059.19a6.494 6.494 0 0 1-.573.99c-.02.029-.086.074-.195.045l-1.103-.303c-.559-.153-1.112-.008-1.529.27-.16.107-.327.204-.5.29-.449.222-.851.628-.998 1.189l-.289 1.105c-.029.11-.101.143-.137.146a6.613 6.613 0 0 1-1.142 0c-.036-.003-.108-.037-.137-.146l-.289-1.105c-.147-.56-.55-.967-.997-1.189a4.502 4.502 0 0 1-.501-.29c-.417-.278-.97-.423-1.53-.27l-1.102.303c-.11.03-.175-.016-.195-.046a6.492 6.492 0 0 1-.573-.989c-.014-.031-.022-.11.059-.19l.815-.806c.411-.406.562-.957.53-1.456a4.587 4.587 0 0 1 0-.582c.032-.499-.119-1.05-.53-1.456l-.815-.806c-.08-.08-.073-.159-.059-.19.162-.348.354-.679.573-.99.02-.029.086-.075.195-.045l1.103.303c.559.153 1.112.008 1.529-.27.16-.107.327-.204.5-.29.449-.222.851-.628.998-1.189l.289-1.105c.029-.11.101-.143.137-.146zM8 0c-.236 0-.47.01-.701.03-.743.065-1.29.615-1.458 1.261l-.29 1.106c-.017.066-.078.158-.211.224a5.994 5.994 0 0 0-.668.386c-.123.082-.233.09-.3.071L3.27 2.776c-.644-.177-1.392.02-1.82.63-.268.382-.505.789-.704 1.217-.315.675-.111 1.422.363 1.891l.815.806c.05.048.098.147.088.294a6.084 6.084 0 0 0 0 .772c.01.147-.038.246-.088.294l-.815.806c-.474.469-.678 1.216-.363 1.891.2.428.436.835.704 1.218.428.609 1.176.806 1.82.63l1.103-.303c.066-.019.176-.011.299.071.213.143.436.272.668.386.133.066.194.158.212.224l.289 1.106c.169.646.715 1.196 1.458 1.26a8.094 8.094 0 0 0 1.402 0c.743-.064 1.29-.614 1.458-1.26l.29-1.106c.017-.066.078-.158.211-.224a5.98 5.98 0 0 0 .668-.386c.123-.082.233-.09.3-.071l1.102.302c.644.177 1.392-.02 1.82-.63.268-.382.505-.789.704-1.217.315-.675.111-1.422-.364-1.891l-.814-.806c-.05-.048-.098-.147-.088-.294a6.1 6.1 0 0 0 0-.772c-.01-.147.039-.246.088-.294l.814-.806c.475-.469.679-1.216.364-1.891a7.992 7.992 0 0 0-.704-1.218c-.428-.609-1.176-.806-1.82-.63l-1.103.303c-.066.019-.176.011-.299-.071a5.991 5.991 0 0 0-.668-.386c-.133-.066-.194-.158-.212-.224L10.16 1.29C9.99.645 9.444.095 8.701.031A8.094 8.094 0 0 0 8 0zm1.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"iirg9aq4aa\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Gear;\n","import styled from 'styled-components';\n\nexport const Text = styled.div`\n font-size: 13px;\n font-weight: 400;\n color: var(--ps-grey-1);\n height: 19px;\n display: flex;\n align-items: center;\n`;\n\nexport const GearButton = styled.div`\n width: 16px;\n height: 16px;\n margin-left: 4px;\n cursor: pointer;\n color: var(--ps-blue-11);\n`;","import Gear from '../../icons/Gear';\nimport { CompanyUserStatsTextViewProps } from './types';\nimport { GearButton, Text } from './styles';\n\nfunction CompanyUserStatsTextView({\n userStats,\n showUnlimited,\n showSettingsButton,\n style,\n onSettingsClick,\n}: CompanyUserStatsTextViewProps) {\n return (\n <Text style={style}>\n {userStats?.limit ? (\n <>\n <span data-test=\"user-stats-text\">\n <span data-test=\"user-stats-total\">{userStats.total}</span>\n of \n <span data-test=\"user-stats-limit\">{userStats.limit}</span>\n licensed seats have been used\n </span>\n {showSettingsButton && (\n <GearButton\n onClick={onSettingsClick}\n data-test=\"user-limit-settings-button\"\n >\n <Gear />\n </GearButton>\n )}\n </>\n ) : (showUnlimited && (\n <span data-test=\"user-stats-text\">Unlimited licensed seats</span>\n ))}\n </Text>\n );\n}\n\nexport default CompanyUserStatsTextView;","import { useCallback, useEffect } from 'react';\nimport { useGetCompanyUserStatsService } from '../../../pages/CompanySettings/store/services';\nimport { useCompanyUserStatsState } from '../../../pages/CompanySettings/store/states';\nimport { CompanyUserStatsTextProps } from './types';\nimport CompanyUserStatsTextView from './view';\nimport { pushModal, useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\n\nfunction CompanyUserStatsText({\n companyId,\n showUnlimited,\n showSettingsButton,\n style,\n}: CompanyUserStatsTextProps) {\n const userStatsState = useCompanyUserStatsState();\n const getCompanyUserStats = useGetCompanyUserStatsService();\n const history = useHistory();\n\n /**\n * @function handleGearClick\n * @description opens company settings modal with user limits tab selected\n * @returns { void }\n */\n const handleSettingClick = useCallback(() => {\n pushModal(history, ROUTES.COMPANY_SETTINGS.USER_LIMIT);\n }, [history]);\n\n useEffect(() => {\n getCompanyUserStats(companyId);\n }, [companyId, getCompanyUserStats]);\n\n return (\n <CompanyUserStatsTextView\n userStats={userStatsState.data}\n showUnlimited={showUnlimited}\n showSettingsButton={showSettingsButton}\n style={style}\n onSettingsClick={handleSettingClick}\n />\n );\n}\n\nexport default CompanyUserStatsText;","import { ScenarioCases } from './reducers';\nimport { Keywords } from '../../../../constants/interfaces/Keywords';\n\nexport enum ACTIONS {\n UPLOAD_SCENARIO_LOGO_START = 'UPLOAD_SCENARIO_LOGO_START',\n UPLOAD_SCENARIO_LOGO_SUCCESS = 'UPLOAD_SCENARIO_LOGO_SUCCESS',\n UPLOAD_SCENARIO_LOGO_FAILURE = 'UPLOAD_SCENARIO_LOGO_FAILURE',\n\n UPLOAD_SCENARIO_AUDIO_START = 'UPLOAD_SCENARIO_AUDIO_START',\n UPLOAD_SCENARIO_AUDIO_SUCCESS = 'UPLOAD_SCENARIO_AUDIO_SUCCESS',\n UPLOAD_SCENARIO_AUDIO_FAILURE = 'UPLOAD_SCENARIO_AUDIO_FAILURE',\n\n CREATE_SCRIPT_LINE = 'CREATE_SCRIPT_LINE',\n UPDATE_SCRIPT_LINE = 'UPDATE_SCRIPT_LINE',\n DELETE_SCRIPT_LINE = 'DELETE_SCRIPT_LINE',\n MODIFY_SCRIPT_TEXT = 'MODIFY_SCRIPT_TEXT',\n CLEAR_SCRIPT_LINES = 'CLEAR_SCRIPT_LINES',\n\n RESET_SCENARIO = 'RESET_SCENARIO',\n RESET_SCENARIO_LOGO = 'RESET_SCENARIO_LOGO',\n\n FETCH_SCENARIO_START = 'FETCH_SCENARIO_START',\n FETCH_SCENARIO_SUCCESS = 'FETCH_SCENARIO_SUCCESS',\n FETCH_SCENARIO_FAILURE = 'FETCH_SCENARIO_FAILURE',\n\n UPDATE_SCRIPT_LINE_KEYWORDS = 'UPDATE_SCRIPT_LINE_KEYWORDS',\n\n STORE_SCENARIO_TEMP_COPY = 'STORE_SCENARIO_TEMP_COPY',\n RESTORE_SCENARIO_FROM_TEMP = 'RESTORE_SCENARIO_FROM_TEMP',\n\n MODIFY_SCENARIO = 'MODIFY_SCENARIO',\n UPDATE_SCENARIO_CASE = 'UPDATE_SCENARIO_CASE',\n}\n\nexport function createScriptLineAction(data: any) {\n return {\n type: ACTIONS.CREATE_SCRIPT_LINE as ACTIONS.CREATE_SCRIPT_LINE,\n data,\n };\n}\n\nexport function updateScriptLineAction(data: any) {\n return {\n type: ACTIONS.UPDATE_SCRIPT_LINE as ACTIONS.UPDATE_SCRIPT_LINE,\n data,\n };\n}\n\nexport function modifyScriptTextAction(\n value: string,\n lineId: number | string\n) {\n return {\n type: ACTIONS.MODIFY_SCRIPT_TEXT as ACTIONS.MODIFY_SCRIPT_TEXT,\n lineId: lineId,\n value,\n };\n}\n\nexport function deleteScriptLineAction(data: any) {\n return {\n type: ACTIONS.DELETE_SCRIPT_LINE as ACTIONS.DELETE_SCRIPT_LINE,\n data,\n };\n}\n\nexport function clearScriptLinesAction() {\n return {\n type: ACTIONS.CLEAR_SCRIPT_LINES as ACTIONS.CLEAR_SCRIPT_LINES,\n };\n}\n\nexport function uploadScenarioLogoStart() {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_LOGO_START as ACTIONS.UPLOAD_SCENARIO_LOGO_START,\n };\n}\n\nexport function uploadScenarioLogoSuccess(data: any) {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_LOGO_SUCCESS as ACTIONS.UPLOAD_SCENARIO_LOGO_SUCCESS,\n data,\n };\n}\n\nexport function uploadScenarioLogoFailure(error: any) {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_LOGO_FAILURE as ACTIONS.UPLOAD_SCENARIO_LOGO_FAILURE,\n error,\n };\n}\n\nexport function uploadScenarioAudioStart() {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_AUDIO_START as ACTIONS.UPLOAD_SCENARIO_AUDIO_START,\n };\n}\n\nexport function uploadScenarioAudioSuccess(\n scriptLineId: string | number,\n response: any\n) {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_AUDIO_SUCCESS as ACTIONS.UPLOAD_SCENARIO_AUDIO_SUCCESS,\n data: {\n scriptLineId,\n response,\n },\n };\n}\n\nexport function uploadScenarioAudioFailure(error: any) {\n return {\n type: ACTIONS.UPLOAD_SCENARIO_AUDIO_FAILURE as ACTIONS.UPLOAD_SCENARIO_AUDIO_FAILURE,\n error,\n };\n}\n\nexport function resetScenarioAction() {\n return {\n type: ACTIONS.RESET_SCENARIO as ACTIONS.RESET_SCENARIO,\n };\n}\n\nexport function resetScenarioLogoAction() {\n return {\n type: ACTIONS.RESET_SCENARIO_LOGO as ACTIONS.RESET_SCENARIO_LOGO,\n };\n}\n\nexport function fetchScenarioStart() {\n return {\n type: ACTIONS.FETCH_SCENARIO_START as ACTIONS.FETCH_SCENARIO_START,\n };\n}\n\nexport function fetchScenarioSuccess(data: any) {\n return {\n type: ACTIONS.FETCH_SCENARIO_SUCCESS as ACTIONS.FETCH_SCENARIO_SUCCESS,\n data,\n };\n}\n\nexport function fetchScenarioFailure(error: any) {\n return {\n type: ACTIONS.FETCH_SCENARIO_FAILURE as ACTIONS.FETCH_SCENARIO_FAILURE,\n error,\n };\n}\n\nexport function modifyScenarioAction(\n data: any,\n field: string,\n silent?: boolean\n) {\n return {\n type: ACTIONS.MODIFY_SCENARIO as ACTIONS.MODIFY_SCENARIO,\n field: field,\n data: data,\n silent: silent,\n };\n}\n\nexport function updateScenarioModifyCase(value: ScenarioCases) {\n return {\n type: ACTIONS.UPDATE_SCENARIO_CASE as ACTIONS.UPDATE_SCENARIO_CASE,\n value,\n };\n}\n\nexport function storeScenarioTempCopyAction() {\n return {\n type: ACTIONS.STORE_SCENARIO_TEMP_COPY as ACTIONS.STORE_SCENARIO_TEMP_COPY,\n };\n}\n\nexport function restoreScenarioFromTempAction() {\n return {\n type: ACTIONS.RESTORE_SCENARIO_FROM_TEMP as ACTIONS.RESTORE_SCENARIO_FROM_TEMP,\n };\n}\n\nexport function updateScriptLineKeywords(\n keywords: Keywords[],\n lineId: number | string\n) {\n return {\n type: ACTIONS.UPDATE_SCRIPT_LINE_KEYWORDS as ACTIONS.UPDATE_SCRIPT_LINE_KEYWORDS,\n keywords,\n lineId,\n };\n}\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useParams } from 'react-router';\r\n\r\nimport * as Yup from 'yup';\r\nimport { useSelector } from 'react-redux';\r\nimport { FieldArray, Form, Formik } from 'formik';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport Validation from '../../../../../services/validation';\r\nimport {\r\n useAddMultipleStagingUsersService,\r\n useAddStagingUserService,\r\n useAssignFiltersToStagingUsersService,\r\n useDeleteStagingUserService,\r\n useInviteStagingUserService,\r\n useModifyDraftUsersService,\r\n useModifyDraftUsersWithoutValidationService,\r\n useResetDraftsPageService,\r\n useSearchStagingUsersService,\r\n useUpdateStagingUserService,\r\n MAX_DRAFT_USERS_INVITE,\r\n} from '../../store/services';\r\n\r\nimport { AddNewUserContainer } from '../../components/AddNewUser';\r\nimport { CheckPermission } from '../../../../../features/permissions';\r\nimport { NEW_PERMISSIONS } from '../../../../../constants/enums/permissions';\r\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\r\nimport { NewUserHeader } from '../../components/Header/NewUserHeader';\r\nimport { UsersList } from '../../components/UsersList/UsersList';\r\nimport { formatDate } from '../../../../../helpers/functions/date-convert';\r\nimport { SaveAsDraftModal } from '../../components/SaveAsDraftModal';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../../constants/interfaces/filters';\r\nimport { useIfChanged } from '../../../../../helpers/hooks/usePreviousData';\r\nimport {\r\n DraftUser,\r\n PractisSetWithDueDate,\r\n} from '../../../../../constants/interfaces/Draft';\r\nimport { useDraftEditState } from '../../store/states';\r\nimport { getCompanyState } from '../../../../CompanySettings/store/reducers';\r\nimport { CompanyInterface } from '../../../../../constants/interfaces/Company';\r\nimport { useHistory } from '../../../../../tools/router';\r\nimport { useGetFullPractisSetsService } from '../../../../../features/library/store/services';\r\nimport { AssignFiltersToStagingUsersParams } from '../../../../../api/users/types';\r\nimport { LibraryItemsStatus } from '../../../../../features/library/tools';\r\nimport ROUTES from '../../../../../routes/routes';\r\nimport AddNewUserTip from '../../components/AddNewUserTip';\r\nimport useKeyPress from '../../../../../helpers/hooks/useKeyPress';\r\nimport { WithLabelsContext } from '../../../../../features/portableLabels';\r\nimport { WithTeamsContext } from '../../../../../features/portableTeams';\r\nimport { WithPractisSetsContext } from '../../../../../features/portablePractisSets';\r\nimport { isAdminRole, isTeamLeader, ROLE_NAMES } from '../../../../../constants/enums';\r\nimport { getProfileState } from '../../../../UserProfile/store/reducers';\r\nimport { useUserRolesState } from '../../../../../features/roles/store/states';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { escapeRegExp } from '../../../../../helpers/functions/escape-reg-exp';\r\nimport { ModalPageContainerProps } from '../../../../../ui/components/ModalPage';\r\nimport ModalPage from '../../../../../ui/components/ModalPage/ModalPage';\r\nimport { useTableStateHelper } from '../../../../../ui/components/table-wrapper/helper';\r\nimport { Button } from '../../../../../ui/components/Button';\r\nimport { useInviteUsersBulActionService } from '../../services/InviteUsersBulkActionService';\r\nimport { ChunkServiceUserDataInterface } from '../../services/InviteUsersBulkActionService/types';\r\nimport { onTriggerEvent } from '../../../../../helpers/functions/Events';\r\nimport {\r\n EventNameList,\r\n REFRESH_PENDING_USERS_PAGE,\r\n} from '../../../../../helpers/functions/Events/types';\r\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\r\nimport { extractEmailsFromString } from '../../../../../helpers/functions/strings';\r\nimport { usePortableTeamsState } from '../../../../../features/portableTeams/store/states';\r\nimport { useShowConfirmModalDialog } from '../../../../../ui/components/ModalDialogs/store/actions';\r\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\r\n\r\nimport {\r\n StyledContainer,\r\n StyledHeader,\r\n StyledFooter,\r\n StyledFooterActions,\r\n StyledHeaderInput,\r\n StyledContent,\r\n AddNewUserWrapper,\r\n Divider,\r\n StyledSavedStatusContainer,\r\n StyledButtonContainer,\r\n UserStatsContainer,\r\n} from './styles';\r\nimport { CompanyUserStats } from '../../../../../constants/interfaces/CompanyUserStats';\r\nimport { NoFreeUsersModal } from './components/NoFreeUsersModal';\r\nimport { ExceededFreeUsersModal } from './components/ExceededFreeUsersModal';\r\nimport { useGetCompanyUserStatsService } from '../../../../CompanySettings/store/services';\r\nimport { CompanyUserStatsText } from '../../../../../ui/components/CompanyUserStatsText';\r\n\r\nconst validationSchema = Yup.object().shape<DraftUser>({\r\n email: Validation.email.trim(),\r\n firstName: Validation.firstName,\r\n lastName: Validation.lastName,\r\n} as any);\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\nconst NEW_DRAFT_ID = 'new';\r\n\r\nconst NewUser: FC<{\r\n users?: PaginationResult<DraftUser>;\r\n lastUpdated?: string;\r\n loading?: boolean;\r\n params: { draftId?: any };\r\n company: CompanyInterface;\r\n navigateToInvitations(): void;\r\n searchDraftUsers(draftId: number, sp: SearchParams): Promise<any>;\r\n modifyDraftUsers(users: PaginationResult<DraftUser>): void;\r\n modifyDraftUsersWithoutValidation(users: PaginationResult<DraftUser>): void;\r\n resetDraftsPage(): void;\r\n addStagingUser(stagingId: number, users: DraftUser): Promise<boolean>;\r\n addMultipleStagingUsers(\r\n stagingId: number,\r\n users: DraftUser[]\r\n ): Promise<boolean>;\r\n updateStagingUser(\r\n stagingId: number,\r\n stagingUserId: number,\r\n users: DraftUser\r\n ): Promise<boolean>;\r\n deleteStagingUser(\r\n stagingId: number,\r\n stagingUserIds: number[]\r\n ): Promise<boolean>;\r\n inviteStagingUser(\r\n stagingId: number,\r\n stagingUserIds: number[],\r\n selectAll: boolean,\r\n search: SearchParams\r\n ): Promise<any>;\r\n assignFiltersToStagingUsers(\r\n stagingId: number,\r\n assignFilters: AssignFiltersToStagingUsersParams\r\n ): Promise<any>;\r\n setGoBackTwice(enable: boolean): void;\r\n getCompanyUserStats: (companyId: number, callback?: (result: CompanyUserStats) => void) => void;\r\n}> = ({\r\n users,\r\n lastUpdated,\r\n loading,\r\n params,\r\n company,\r\n navigateToInvitations,\r\n searchDraftUsers,\r\n modifyDraftUsers,\r\n modifyDraftUsersWithoutValidation,\r\n resetDraftsPage,\r\n addStagingUser,\r\n addMultipleStagingUsers,\r\n updateStagingUser,\r\n deleteStagingUser,\r\n inviteStagingUser,\r\n assignFiltersToStagingUsers,\r\n setGoBackTwice,\r\n getCompanyUserStats\r\n}) => {\r\n const showMessage = useShowMessage();\r\n const history = useHistory();\r\n useHtmlPageTitle('Invite Users to the App')\r\n\r\n const existedEmailListRef = useRef<string[]>([]);\r\n const existedEmailList = existedEmailListRef.current;\r\n const { data: initialTeams } = usePortableTeamsState();\r\n const defaultTeamId = initialTeams?.items?.find(item => item.isDefault)?.id;\r\n\r\n const [noFreeUsersModalOpen, setNoFreeUsersModalOpen] = useState(false);\r\n const [exceededFreeUsersModalOpen, setExceededFreeUsersModalOpen] = useState(false);\r\n\r\n const formRef: any = React.createRef();\r\n const [loadingInvitation, setLoadingInvitation] = useState(false);\r\n const [saveDraftModalOpen, setSaveDraftModalOpen] = useState(false);\r\n const [creatingUser, setCreatingUser] = useState(false);\r\n const [usersSavedAt, setUsersSavedAt] = useState<Date | null>(null);\r\n const [draftSavedFirstTimeAt, setDraftSavedFirstTimeAt] =\r\n useState<Date | null>(null);\r\n\r\n const isDraftSaved = params.draftId !== NEW_DRAFT_ID;\r\n const profile = useSelector(getProfileState);\r\n const isRoleDisabled = isTeamLeader(profile?.role?.name);\r\n\r\n const userEmptyState: DraftUser = {\r\n id: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n labelIDs: [],\r\n practisSetIDs: [],\r\n teamIDs: [],\r\n roleId: null,\r\n };\r\n\r\n const userRoles = useUserRolesState();\r\n const userRoleId = userRoles.list.filter(\r\n role => role.name === ROLE_NAMES.USER\r\n )[0];\r\n\r\n // NEW USER STATE LOGIC\r\n const [newUser, setNewUser] = useState<DraftUser>(userEmptyState);\r\n\r\n const [newUserRole, setNewUserRole] = useState<number | null>(null);\r\n const [newUserPractisSets, setNewUserPractisSets] = useState<\r\n PractisSetWithDueDate[]\r\n >([]);\r\n const [newUserTeams, setNewUserTeams] = useState<number[]>([]);\r\n const [newUserLabels, setNewUserLabels] = useState<number[]>([]);\r\n const [isSelectAll, setIsSelectAll] = useState(false);\r\n\r\n const handleSetNewUserLabels = (labelIds: number[]) => {\r\n setNewUserLabels(labelIds);\r\n };\r\n\r\n const handleChangeNewUserRole = useCallback(\r\n (role: number | null) => {\r\n setNewUserRole(role);\r\n },\r\n [setNewUserRole]\r\n );\r\n\r\n const handleSetNewUserPractisSets = (\r\n practisSetIds: PractisSetWithDueDate[]\r\n ) => {\r\n setNewUserPractisSets(practisSetIds);\r\n };\r\n\r\n const handleSetNewUserTeams = (teamIds: number[]) => {\r\n setNewUserTeams(teamIds);\r\n };\r\n\r\n // SELECTED USER STATE LOGIC\r\n const [selectedUser, setSelectedUser] = useState<DraftUser>(userEmptyState);\r\n const [selectedUserRole, setSelectedUserRole] = useState<number | null>(\r\n null\r\n );\r\n const [selectedUserPractisSets, setSelectedUserPractisSets] = useState<\r\n PractisSetWithDueDate[]\r\n >([]);\r\n const [selectedUserTeams, setSelectedUserTeams] = useState<number[]>([]);\r\n const [selectedUserLabels, setSelectedUserLabels] = useState<number[]>([]);\r\n\r\n const handleSetSelectedUserLabels = (labelIds: number[]) => {\r\n setSelectedUserLabels(labelIds);\r\n };\r\n const handleChangeSelectedUserRole = useCallback(\r\n (role: number | null) => {\r\n setSelectedUserRole(role);\r\n },\r\n [setSelectedUserRole]\r\n );\r\n\r\n const handleSetSelectedUserPractisSets = (\r\n practisSetIds: PractisSetWithDueDate[]\r\n ) => {\r\n setSelectedUserPractisSets(practisSetIds);\r\n };\r\n\r\n const handleSetSelectedUserTeams = (teamIds: number[]) => {\r\n setSelectedUserTeams(teamIds);\r\n };\r\n\r\n const isTeamLead = isTeamLeader(profile?.role?.name);\r\n useEffect(() => {\r\n if (userRoleId?.id && isTeamLead) {\r\n setNewUserRole(userRoleId.id);\r\n setSelectedUserRole(userRoleId.id);\r\n }\r\n }, [userRoleId, isTeamLead]);\r\n\r\n // LIST USERS STATE LOGIC\r\n const [checkedUserIds, setCheckedUserIds] = useState<number[]>([]);\r\n\r\n const [checkedUserRoles, setCheckedUserRoles] = useState<number[]>([]);\r\n\r\n const handleClearCheckedUserRoles = (roleIds: number[]) => {\r\n setCheckedUserRoles(roleIds);\r\n };\r\n\r\n const handleAssignFiltersToCheckedUsers = async (\r\n assignedLabels: number[],\r\n deletedLabels: number[],\r\n assignedPractisSets: PractisSetWithDueDate[],\r\n deletedPractisSets: number[],\r\n assignedTeams: number[],\r\n deletedTeams: number[],\r\n roleId: null | number\r\n ) => {\r\n if (isDraftSaved) {\r\n const limit = isSelectAll ? users?.totalCount : searchParams?.limit;\r\n\r\n return assignFiltersToStagingUsers(params.draftId, {\r\n userIDs: checkedUserIds,\r\n labelIDs: assignedLabels,\r\n roleId: isRoleDisabled ? null : roleId,\r\n deletedLabelIDs: deletedLabels,\r\n practisSetIDs: assignedPractisSets,\r\n deletedPractisSetIDs: deletedPractisSets,\r\n teamIDs: assignedTeams,\r\n deletedTeamIDs: deletedTeams,\r\n selectAll: isSelectAll,\r\n search: { ...searchParams, limit },\r\n })\r\n .then(() => {\r\n manualRefreshSearchParams();\r\n const count =\r\n (isSelectAll\r\n ? users?.totalCount\r\n : checkedUserIds.length) || 0;\r\n\r\n showMessage(\r\n `Changes ${\r\n count > 1 ? 'have' : 'has'\r\n } been saved for ${count} ${\r\n count > 1 ? 'users' : 'user'\r\n }`,\r\n 'success'\r\n );\r\n return true;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n } else {\r\n let filteredUsers = userItemsList ? [...userItemsList] : [];\r\n\r\n if (assignedLabels.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserLabels = new Set([\r\n ...user.labelIDs,\r\n ...assignedLabels,\r\n ]);\r\n return {\r\n ...user,\r\n labelIDs: Array.from(updatedUserLabels),\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (deletedLabels.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserLabels = user.labelIDs.filter(\r\n id => !deletedLabels.includes(id)\r\n );\r\n return {\r\n ...user,\r\n labelIDs: updatedUserLabels,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (assignedPractisSets.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserPractisSets = uniqBy(\r\n [...assignedPractisSets, ...user.practisSetIDs],\r\n practisSet => practisSet.practisSetId\r\n );\r\n\r\n return {\r\n ...user,\r\n practisSetIDs: updatedUserPractisSets,\r\n practisSets: updatedUserPractisSets,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (deletedPractisSets.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserPractisSets =\r\n user.practisSetIDs.filter(\r\n id =>\r\n !deletedPractisSets.includes(\r\n id.practisSetId\r\n )\r\n );\r\n return {\r\n ...user,\r\n practisSetIDs: updatedUserPractisSets,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (assignedTeams.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserTeams = new Set([\r\n ...user.teamIDs,\r\n ...assignedTeams,\r\n ]);\r\n return {\r\n ...user,\r\n teamIDs: Array.from(updatedUserTeams),\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (deletedTeams.length > 0) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n const updatedUserTeams = user.teamIDs.filter(\r\n id => !deletedTeams.includes(id)\r\n );\r\n return {\r\n ...user,\r\n teamIDs: updatedUserTeams,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n if (roleId && !isRoleDisabled) {\r\n filteredUsers = filteredUsers.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n return {\r\n ...user,\r\n roleId: roleId,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n }\r\n showMessage(\r\n `Changes ${\r\n checkedUserIds.length > 1 ? 'have' : 'has'\r\n } been saved for ${checkedUserIds.length} ${\r\n checkedUserIds.length > 1 ? 'users' : 'user'\r\n }`,\r\n 'success'\r\n );\r\n modifyDraftUsers({\r\n ...users,\r\n items: filteredUsers,\r\n } as PaginationResult<DraftUser>);\r\n return true;\r\n }\r\n };\r\n\r\n // FILTERS\r\n const [filterRoles, setFilterRoles] = useState<number[]>([]);\r\n\r\n const initialLocalFilterParams: {\r\n searchTerm: string;\r\n labelIDs: number[];\r\n practisSetIDs: number[];\r\n roleIDs: number[];\r\n teamIDs: number[];\r\n } = {\r\n searchTerm: '',\r\n labelIDs: [],\r\n practisSetIDs: [],\r\n roleIDs: [],\r\n teamIDs: [],\r\n };\r\n\r\n const [localFilterParams, setLocalFilterParams] = useState(\r\n initialLocalFilterParams\r\n );\r\n const [filtersCount, setFiltersCount] = useState<number>(0);\r\n\r\n const ifLocalFilterParamsChanged = useIfChanged(localFilterParams);\r\n const ifUsersChanged = useIfChanged(users);\r\n const [localUsers, setLocalUsers] = useState<\r\n PaginationResult<DraftUser> | undefined\r\n >(users && users);\r\n\r\n useEffect(() => {\r\n if (users) {\r\n setLocalUsers(users);\r\n }\r\n }, [users]);\r\n\r\n useEffect(() => {\r\n if ((ifLocalFilterParamsChanged || ifUsersChanged) && !isDraftSaved) {\r\n let filteredUser: DraftUser[] =\r\n users && users.items ? users.items : [];\r\n if (localFilterParams.roleIDs.length > 0) {\r\n filteredUser = filteredUser.filter(user => {\r\n return (\r\n user.roleId &&\r\n localFilterParams.roleIDs.includes(user.roleId)\r\n );\r\n });\r\n }\r\n\r\n if (localFilterParams.labelIDs.length > 0) {\r\n filteredUser = filteredUser.filter(user => {\r\n return localFilterParams.labelIDs.some(\r\n id => user.labelIDs.indexOf(id) >= 0\r\n );\r\n });\r\n }\r\n\r\n if (localFilterParams.practisSetIDs.length > 0) {\r\n filteredUser = filteredUser.filter(user => {\r\n return localFilterParams.practisSetIDs.some(\r\n //filter to find if filtered practis set is assigned to user\r\n id =>\r\n user.practisSetIDs.some(\r\n x => x.practisSetId === id\r\n )\r\n );\r\n });\r\n }\r\n\r\n if (localFilterParams.teamIDs.length > 0) {\r\n filteredUser = filteredUser.filter(user => {\r\n return localFilterParams.teamIDs.some(\r\n id => user.teamIDs.indexOf(id) >= 0\r\n );\r\n });\r\n }\r\n\r\n if (localFilterParams.searchTerm.length > 0) {\r\n const escapedSearchTerm = escapeRegExp(\r\n localFilterParams.searchTerm\r\n ).toLowerCase();\r\n const regSearchTerm = new RegExp(escapedSearchTerm);\r\n\r\n const trimmedRegSearchTerm = new RegExp(\r\n escapeRegExp(\r\n localFilterParams.searchTerm.trim()\r\n ).toLowerCase()\r\n );\r\n\r\n filteredUser = filteredUser.filter(user => {\r\n return (\r\n (user.firstName &&\r\n regSearchTerm.test(user.firstName.toLowerCase())) ||\r\n (user.firstName &&\r\n user.lastName &&\r\n trimmedRegSearchTerm.test(\r\n `${user.firstName} ${user.lastName}`\r\n .trim()\r\n .toLowerCase()\r\n )) ||\r\n (user.lastName &&\r\n regSearchTerm.test(user.lastName.toLowerCase())) ||\r\n (user.email &&\r\n regSearchTerm.test(user.email?.toLowerCase()))\r\n );\r\n });\r\n }\r\n\r\n setLocalUsers(prevState => {\r\n if (prevState) {\r\n return {\r\n ...prevState,\r\n items: filteredUser,\r\n };\r\n }\r\n });\r\n }\r\n }, [\r\n ifLocalFilterParamsChanged,\r\n isDraftSaved,\r\n ifUsersChanged,\r\n localFilterParams,\r\n modifyDraftUsers,\r\n users,\r\n ]);\r\n\r\n const userItemsList = !isDraftSaved\r\n ? localUsers && localUsers.items\r\n : users && users.items;\r\n\r\n const setLocalSearchTerm = (value: string) => {\r\n setLocalFilterParams(prevState => {\r\n return {\r\n ...prevState,\r\n searchTerm: value,\r\n };\r\n });\r\n };\r\n\r\n const handleApplyFiltersToCheckedUsers = async (\r\n labelIDs: number[],\r\n practisSetIDs: PractisSetWithDueDate[],\r\n teamIDs: number[],\r\n roleIDs: number[]\r\n ) => {\r\n setFiltersCount(\r\n labelIDs.length +\r\n teamIDs.length +\r\n practisSetIDs.length +\r\n roleIDs.length\r\n );\r\n\r\n if (isDraftSaved) {\r\n setLabelIDs(labelIDs);\r\n //PSWDD maybe change type\r\n setPractisSetIDs(practisSetIDs.map(x => x.practisSetId));\r\n setTeamIDs(teamIDs);\r\n if (!isRoleDisabled) {\r\n setRoleIDs(roleIDs);\r\n }\r\n } else {\r\n setLocalFilterParams((prevState: any) => {\r\n return {\r\n ...prevState,\r\n teamIDs: teamIDs,\r\n labelIDs: labelIDs,\r\n practisSetIDs: practisSetIDs.map(x => x.practisSetId),\r\n roleIDs: isRoleDisabled ? [] : roleIDs,\r\n };\r\n });\r\n }\r\n return true;\r\n };\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n filters: [],\r\n orderBy: { field: 'lastEditedBy.firstName', asc: false },\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n };\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLabelIDs,\r\n setPractisSetIDs,\r\n setRoleIDs,\r\n setTeamIDs,\r\n setLimit,\r\n } = useSearchParamsState(initialSearchParams);\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n const ifDraftIdChanged = useIfChanged(params.draftId);\r\n\r\n const manualRefreshSearchParams = useCallback(async () => {\r\n return searchDraftUsers(params.draftId, searchParams).then(\r\n updatedUsers => {\r\n setUsersSavedAt(new Date());\r\n setDraftSavedFirstTimeAt(null);\r\n return updatedUsers;\r\n }\r\n );\r\n }, [searchDraftUsers, params.draftId, searchParams]);\r\n\r\n useEffect(() => {\r\n if ((ifSearchParamsChanged || ifDraftIdChanged) && isDraftSaved) {\r\n searchDraftUsers(params.draftId, searchParams).catch(console.error);\r\n }\r\n }, [\r\n params.draftId,\r\n searchDraftUsers,\r\n searchParams,\r\n ifSearchParamsChanged,\r\n ifDraftIdChanged,\r\n isDraftSaved,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (userItemsList) {\r\n const userItemListIds: number[] = userItemsList.map(\r\n user => user.id\r\n );\r\n let updatedCheckedUserIds = checkedUserIds.filter(userId =>\r\n userItemListIds.includes(userId)\r\n );\r\n setCheckedUserIds(\r\n !isSelectAll ? updatedCheckedUserIds : userItemListIds\r\n );\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [userItemsList]);\r\n\r\n const resetNewUserFields = () => {\r\n setNewUser(JSON.parse(JSON.stringify(userEmptyState)));\r\n if (!isRoleDisabled) {\r\n setNewUserRole(null);\r\n }\r\n setNewUserPractisSets([]);\r\n setNewUserTeams([]);\r\n setNewUserLabels([]);\r\n };\r\n\r\n const resetEditingUserFields = () => {\r\n setSelectedUser(JSON.parse(JSON.stringify(userEmptyState)));\r\n if (!isRoleDisabled) {\r\n setSelectedUserRole(null);\r\n }\r\n setSelectedUserTeams([]);\r\n setSelectedUserPractisSets([]);\r\n setSelectedUserLabels([]);\r\n };\r\n\r\n const handleUpdateSelectedUser = () => {\r\n const modifiedUser: DraftUser = {\r\n ...selectedUser,\r\n email: selectedUser.email.trim(),\r\n id: selectedUser.id,\r\n roleId: selectedUserRole,\r\n labelIDs: selectedUserLabels.filter(labelId => labelId > 0) || [],\r\n practisSetIDs: selectedUserPractisSets || [],\r\n practisSets: selectedUserPractisSets || [],\r\n teamIDs: selectedUserTeams || [],\r\n emailExistsInSystem: false,\r\n };\r\n\r\n let updatedUserItems = users ? [...users.items] : [];\r\n const userExists =\r\n updatedUserItems.filter(user => user.id === modifiedUser.id)\r\n .length > 0;\r\n\r\n if (userExists) {\r\n updatedUserItems = updatedUserItems.map(user => {\r\n if (user.id === modifiedUser.id) {\r\n return modifiedUser;\r\n } else {\r\n return user;\r\n }\r\n });\r\n } else {\r\n updatedUserItems.unshift(modifiedUser);\r\n }\r\n\r\n const filteredUser = updatedUserItems.map((item, index) => ({\r\n ...item,\r\n isEntryInvalid:\r\n !!item.email &&\r\n index < updatedUserItems.length - 1 &&\r\n updatedUserItems\r\n .slice(index + 1)\r\n .filter(user => user.email === item.email).length > 0,\r\n }));\r\n\r\n if (isDraftSaved) {\r\n if (userExists) {\r\n updateStagingUser(params.draftId, modifiedUser.id, {\r\n firstName: modifiedUser.firstName,\r\n lastName: modifiedUser.lastName,\r\n email: modifiedUser.email,\r\n roleId: modifiedUser.roleId,\r\n labelIDs: modifiedUser.labelIDs\r\n ? modifiedUser.labelIDs\r\n : [],\r\n practisSetIDs: modifiedUser.practisSetIDs ?? [],\r\n teamIDs: modifiedUser.teamIDs,\r\n }).then(() => {\r\n resetEditingUserFields();\r\n manualRefreshSearchParams().catch(console.error);\r\n });\r\n } else {\r\n addStagingUser(params.draftId, {\r\n firstName: modifiedUser.firstName,\r\n lastName: modifiedUser.lastName,\r\n email: modifiedUser.email,\r\n roleId: modifiedUser.roleId,\r\n labelIDs: modifiedUser.labelIDs\r\n ? modifiedUser.labelIDs\r\n : [],\r\n practisSetIDs: modifiedUser.practisSetIDs ?? [],\r\n practisSets: modifiedUser.practisSets ?? [],\r\n teamIDs: modifiedUser.teamIDs,\r\n }).then(() => {\r\n resetEditingUserFields();\r\n manualRefreshSearchParams().catch(console.error);\r\n });\r\n }\r\n } else {\r\n modifyDraftUsers({\r\n ...users,\r\n items: filteredUser,\r\n } as PaginationResult<DraftUser>);\r\n resetEditingUserFields();\r\n }\r\n };\r\n\r\n const handleCreateNewUser = (user: DraftUser) => {\r\n const modifiedUser: DraftUser = {\r\n ...user,\r\n id: Date.now(), // random unique number\r\n roleId: newUserRole,\r\n labelIDs: newUserLabels.filter(labelId => labelId > 0) || [],\r\n practisSetIDs: newUserPractisSets || [],\r\n practisSets: newUserPractisSets || [],\r\n teamIDs: newUserTeams || [],\r\n teamsCount: `${(newUserTeams || []).length}`,\r\n };\r\n\r\n let updatedUserItems = users ? [...users.items] : [];\r\n const userExists =\r\n updatedUserItems.filter(user => user.id === modifiedUser.id)\r\n .length > 0;\r\n\r\n if (userExists) {\r\n updatedUserItems = updatedUserItems.map(user => {\r\n if (user.id === modifiedUser.id) {\r\n return modifiedUser;\r\n } else {\r\n return user;\r\n }\r\n });\r\n } else {\r\n updatedUserItems.unshift(modifiedUser);\r\n }\r\n\r\n const filteredUser = updatedUserItems.map((item, index) => ({\r\n ...item,\r\n isEntryInvalid:\r\n !!item.email &&\r\n index < updatedUserItems.length - 1 &&\r\n updatedUserItems\r\n .slice(index + 1)\r\n .filter(user => user.email === item.email).length > 0,\r\n }));\r\n\r\n if (isDraftSaved) {\r\n if (userExists) {\r\n updateStagingUser(params.draftId, modifiedUser.id, {\r\n firstName: modifiedUser.firstName,\r\n lastName: modifiedUser.lastName,\r\n email: modifiedUser.email,\r\n roleId: modifiedUser.roleId,\r\n labelIDs: modifiedUser.labelIDs\r\n ? modifiedUser.labelIDs\r\n : [],\r\n practisSetIDs: modifiedUser.practisSetIDs ?? [],\r\n teamIDs: modifiedUser.teamIDs,\r\n }).then(() => {\r\n resetNewUserFields();\r\n manualRefreshSearchParams().catch(console.error);\r\n });\r\n } else {\r\n addStagingUser(params.draftId, {\r\n firstName: modifiedUser.firstName,\r\n lastName: modifiedUser.lastName,\r\n email: modifiedUser.email,\r\n roleId: modifiedUser.roleId,\r\n labelIDs: modifiedUser.labelIDs\r\n ? modifiedUser.labelIDs\r\n : [],\r\n practisSetIDs: modifiedUser.practisSetIDs ?? [],\r\n teamIDs: modifiedUser.teamIDs,\r\n }).then(() => {\r\n resetNewUserFields();\r\n manualRefreshSearchParams().catch(console.error);\r\n });\r\n }\r\n } else {\r\n modifyDraftUsers({\r\n ...users,\r\n items: filteredUser,\r\n } as PaginationResult<DraftUser>);\r\n resetNewUserFields();\r\n }\r\n };\r\n\r\n const handleSubmitForm = () => {\r\n if (formRef.current) {\r\n if (newUserRole) {\r\n formRef.current.handleSubmit();\r\n }\r\n }\r\n };\r\n\r\n useKeyPress('Enter', handleSubmitForm);\r\n\r\n const onUsersImported = (importedUsers: DraftUser[]) => {\r\n if (isDraftSaved) {\r\n const sendImportedUsers = importedUsers.map(user => {\r\n return {\r\n firstName: user.firstName ? user.firstName : '',\r\n lastName: user.lastName ? user.lastName : '',\r\n email: user.email ? user.email.trim() : '',\r\n roleId: user.roleId ? user.roleId : null,\r\n practisSetIDs: [],\r\n teamIDs: [],\r\n labelIDs: [],\r\n };\r\n });\r\n\r\n addMultipleStagingUsers(params.draftId, sendImportedUsers).then(\r\n () => {\r\n manualRefreshSearchParams().catch(console.error);\r\n }\r\n );\r\n } else {\r\n const currentUsers = userItemsList ? [...userItemsList] : [];\r\n const finalReformattedResults = [\r\n ...currentUsers.filter((user: any) => !!user.email),\r\n ...importedUsers,\r\n ];\r\n\r\n const trimmedFinalResults = finalReformattedResults.map(item => {\r\n return {\r\n ...item,\r\n email: item.email?.trim(),\r\n };\r\n });\r\n\r\n modifyDraftUsers({\r\n ...users,\r\n items: trimmedFinalResults,\r\n } as PaginationResult<DraftUser>);\r\n }\r\n };\r\n\r\n const onEditUser = (user: DraftUser) => {\r\n if (!user) return;\r\n setSelectedUser({\r\n ...user,\r\n email: user.email || '',\r\n });\r\n\r\n setSelectedUserRole(user.roleId);\r\n setSelectedUserLabels(user.labelIDs || []);\r\n\r\n if (isDraftSaved) {\r\n setSelectedUserPractisSets(user.practisSets || []);\r\n } else {\r\n setSelectedUserPractisSets(user.practisSetIDs || []);\r\n }\r\n\r\n setSelectedUserTeams(user.teamIDs || []);\r\n };\r\n\r\n const onRemoveUser = (userId: number | string) => {\r\n const userItems = users && users.items ? users.items : [];\r\n const updatedList = userItems.filter(user => user.id !== userId);\r\n const finalResult = updatedList.map((item, index) => ({\r\n ...item,\r\n isEntryInvalid:\r\n !!item.email &&\r\n index < updatedList.length - 1 &&\r\n updatedList\r\n .slice(index + 1)\r\n .filter(user => user.email === item.email).length > 0,\r\n }));\r\n\r\n if (isDraftSaved) {\r\n deleteStagingUser(params.draftId, [Number(userId)]).then(() => {\r\n manualRefreshSearchParams().catch(console.error);\r\n showMessage('1 User has been removed', 'success');\r\n if (checkedUserIds.includes(userId as number)) {\r\n setCheckedUserIds([]);\r\n }\r\n });\r\n } else {\r\n modifyDraftUsers({\r\n ...users,\r\n items: finalResult,\r\n } as PaginationResult<DraftUser>);\r\n showMessage('1 User has been removed', 'success');\r\n if (checkedUserIds.includes(userId as number)) {\r\n setCheckedUserIds([]);\r\n }\r\n }\r\n\r\n setCheckedUserIds([]);\r\n };\r\n\r\n const modifySelectedUser = (value: string, field: string) => {\r\n if (value.length > 100) return;\r\n setSelectedUser(prevState => ({\r\n ...prevState,\r\n [field]: value,\r\n }));\r\n };\r\n\r\n const modifyNewUser = (value: string, field: string) => {\r\n if (value.length > 100) return;\r\n setNewUser(prevState => ({\r\n ...prevState,\r\n [field]: value,\r\n }));\r\n };\r\n\r\n const handleUserCheck = (id?: number | string) => {\r\n if (!id) return;\r\n const checkUser = checkedUserIds.find((item: any) => item === id);\r\n setCheckedUserIds((prevState: any) =>\r\n checkUser\r\n ? prevState.filter((item: any) => item !== id)\r\n : [...prevState, id]\r\n );\r\n if (checkUser) {\r\n setIsSelectAll(false);\r\n }\r\n };\r\n\r\n const updateAllUsersCheck = (checked: boolean) => {\r\n const userItems =\r\n users && users.items\r\n ? users.items.filter(\r\n item => !item.isEntryInvalid && !item.emailExistsInSystem\r\n )\r\n : [];\r\n\r\n setCheckedUserIds(checked ? userItems.map(item => item.id) : []);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const updateSelectAll = (checked: boolean) => {\r\n setIsSelectAll(checked);\r\n };\r\n\r\n const clearAllUsers = () => {\r\n setCheckedUserIds([]);\r\n };\r\n\r\n const onRemoveSelectedUsers = () => {\r\n const userItems = users && users.items ? users.items : [];\r\n const deletedUsersLength = checkedUserIds.length;\r\n\r\n if (isDraftSaved) {\r\n deleteStagingUser(params.draftId, checkedUserIds).then(() => {\r\n manualRefreshSearchParams().catch(console.error);\r\n\r\n showMessage(\r\n `${deletedUsersLength} ${\r\n deletedUsersLength > 1 ? 'Users have' : 'User has'\r\n } been removed`,\r\n 'success'\r\n );\r\n\r\n setCheckedUserIds([]);\r\n });\r\n } else {\r\n const updatedList = userItems.filter(\r\n user => !checkedUserIds.includes(user.id)\r\n );\r\n showMessage(\r\n `${deletedUsersLength} ${\r\n deletedUsersLength > 1 ? 'Users have' : 'User has'\r\n } been removed`,\r\n 'success'\r\n );\r\n modifyDraftUsers({\r\n ...users,\r\n items: updatedList,\r\n } as PaginationResult<DraftUser>);\r\n setCheckedUserIds([]);\r\n }\r\n };\r\n\r\n const [existingUserIds, setExistingUserIds] = useState<any>([]);\r\n\r\n useEffect(() => {\r\n if (users && users.items) {\r\n const userItems = users && users.items ? users.items : [];\r\n let existingUsers = userItems.filter(\r\n user => user.emailExistsInSystem\r\n );\r\n setExistingUserIds(existingUsers.map(user => user.id));\r\n }\r\n }, [users]);\r\n\r\n const onRemoveExistingUsers = () => {\r\n const userItems = users && users.items ? users.items : [];\r\n if (existingUserIds.length < 1) return;\r\n\r\n if (isDraftSaved) {\r\n deleteStagingUser(params.draftId, existingUserIds).then(() => {\r\n manualRefreshSearchParams().catch(console.error);\r\n showMessage(\r\n `${existingUserIds.length} Existing ${\r\n existingUserIds.length > 1 ? 'users have' : 'user has'\r\n } been removed`,\r\n 'success'\r\n );\r\n setCheckedUserIds([]);\r\n });\r\n } else {\r\n const updatedList = userItems.filter(\r\n user => !existingUserIds.includes(user.id)\r\n );\r\n showMessage(\r\n `${existingUserIds.length} Existing ${\r\n existingUserIds.length > 1 ? 'users have' : 'user has'\r\n } been removed`,\r\n 'success'\r\n );\r\n modifyDraftUsers({\r\n ...users,\r\n items: updatedList,\r\n } as PaginationResult<DraftUser>);\r\n setCheckedUserIds([]);\r\n }\r\n };\r\n\r\n /**\r\n * @function checkIsAllItemsSelected\r\n * @returns { boolean }\r\n */\r\n const checkIsAllItemsSelected = () =>\r\n users?.totalCount === checkedUserIds.length;\r\n\r\n /**\r\n * @function handleSuccessAllUsersInvited\r\n * @returns { void }\r\n */\r\n const handleSuccessAllUsersInvited = useCallback(() => {\r\n // if previous page was pending users page, dispatch refresh the page.\r\n if (\r\n history?.location?.state?.background?.pathname ===\r\n ROUTES.INVITATIONS\r\n ) {\r\n onTriggerEvent(EventNameList[REFRESH_PENDING_USERS_PAGE]);\r\n }\r\n\r\n showMessage('All Users have been invited', 'success');\r\n navigateToInvitations();\r\n }, [history, navigateToInvitations, showMessage]);\r\n\r\n /**\r\n * @function handleErrorUsersInvited\r\n * @returns { void }\r\n */\r\n const handleErrorUsersInvited = useCallback(\r\n (invitedUsers: ChunkServiceUserDataInterface[]) => {\r\n const alreadyInvitedUserItems: ChunkServiceUserDataInterface[] = [];\r\n\r\n for (const user of invitedUsers) {\r\n if (!existedEmailList.includes(user.email?.toLowerCase())) {\r\n alreadyInvitedUserItems.push(user);\r\n }\r\n }\r\n const remainingUserItems = users?.items\r\n .filter(\r\n user =>\r\n !alreadyInvitedUserItems.some(\r\n item => item.email === user.email\r\n )\r\n )\r\n .map(user =>\r\n existedEmailList.includes(user.email?.toLowerCase())\r\n ? { ...user, emailExistsInSystem: true }\r\n : user\r\n );\r\n\r\n if (!isEmpty(remainingUserItems)) {\r\n alreadyInvitedUserItems.length > 0 &&\r\n (alreadyInvitedUserItems.length > 1\r\n ? showMessage(\r\n `${alreadyInvitedUserItems?.length} Users have been invited`,\r\n 'success'\r\n )\r\n : showMessage(\r\n `${alreadyInvitedUserItems?.length} User has been invited`,\r\n 'success'\r\n ));\r\n\r\n modifyDraftUsers({\r\n ...users,\r\n items: remainingUserItems,\r\n } as PaginationResult<DraftUser>);\r\n } else {\r\n handleSuccessAllUsersInvited();\r\n }\r\n },\r\n [\r\n existedEmailList,\r\n handleSuccessAllUsersInvited,\r\n modifyDraftUsers,\r\n showMessage,\r\n users,\r\n ]\r\n );\r\n\r\n /**\r\n * @dev Contains all conditions can error happens.\r\n * @function checkIfInviteUsersHaveErrors\r\n * @param { ChunkServiceUserDataInterface[] } invitedUsers\r\n * @returns { boolean }\r\n */\r\n const checkIfInviteUsersHaveErrors = useCallback(\r\n (invitedUsers: ChunkServiceUserDataInterface[]): boolean => {\r\n if (\r\n (!isEmpty(existedEmailList) &&\r\n (existedEmailList.length === invitedUsers.length ||\r\n invitedUsers.length === 1)) ||\r\n users?.items?.some(item => item.emailExistsInSystem) ||\r\n users?.items?.some(item => item.isEntryInvalid)\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n [existedEmailList, users?.items]\r\n );\r\n\r\n /**\r\n * @function onSuccessInviteUsersCallback\r\n * @returns { void }\r\n */\r\n const onSuccessInviteUsersCallback = useCallback(\r\n (invitedUsers: ChunkServiceUserDataInterface[]) => {\r\n if (checkIfInviteUsersHaveErrors(invitedUsers)) {\r\n handleErrorUsersInvited(invitedUsers);\r\n } else {\r\n if (\r\n isSelectAll ||\r\n invitedUsers.length === users?.items.length ||\r\n users?.items.length === 1\r\n ) {\r\n handleSuccessAllUsersInvited();\r\n } else {\r\n invitedUsers.length > 0 &&\r\n (invitedUsers.length > 1\r\n ? showMessage(\r\n `${invitedUsers?.length} Users have been invited`,\r\n 'success'\r\n )\r\n : showMessage(\r\n `${invitedUsers?.length} User has been invited`,\r\n 'success'\r\n ));\r\n modifyDraftUsers({\r\n ...users,\r\n items: users?.items.filter(\r\n user =>\r\n !invitedUsers.some(\r\n invitedUser =>\r\n invitedUser.email?.toLowerCase() ===\r\n user.email?.toLowerCase()\r\n )\r\n ),\r\n } as PaginationResult<DraftUser>);\r\n }\r\n }\r\n\r\n Promise.resolve().then(() => {\r\n setCheckedUserIds([]);\r\n setIsSelectAll(false);\r\n setLoadingInvitation(false);\r\n existedEmailList.length = 0; // clear existedEmailListRef\r\n getCompanyUserStats(company.id!);\r\n });\r\n },\r\n [checkIfInviteUsersHaveErrors, handleErrorUsersInvited, isSelectAll, users, handleSuccessAllUsersInvited, showMessage, modifyDraftUsers, existedEmailList, getCompanyUserStats, company.id]\r\n );\r\n\r\n /**\r\n * @function onFailedInviteUsersCallback\r\n * @param { ErrorResult | undefined } error\r\n * @returns { void }\r\n */\r\n const onFailedInviteUsersCallback = useCallback(\r\n (error?: ErrorResult) => {\r\n if (error?.message) {\r\n const existedEmail = extractEmailsFromString(\r\n error.message\r\n )?.[0];\r\n\r\n if (existedEmail) {\r\n existedEmailList.push(existedEmail);\r\n }\r\n }\r\n },\r\n [existedEmailList]\r\n );\r\n\r\n const inviteUsersBulkActionService = useInviteUsersBulActionService(\r\n onSuccessInviteUsersCallback,\r\n onFailedInviteUsersCallback\r\n );\r\n\r\n const onInviteSelectedUsers = () => {\r\n setLoadingInvitation(true);\r\n\r\n getCompanyUserStats(company.id!, (userStats) => {\r\n const userItems = users && users.items ? users.items : [];\r\n const isAllItemsSelected = checkIsAllItemsSelected() || isSelectAll;\r\n\r\n const checkedUsersIds = isAllItemsSelected ? [] : checkedUserIds;\r\n\r\n if (userStats!.limit && userStats!.limit <= userStats!.total) {\r\n setLoadingInvitation(false);\r\n setNoFreeUsersModalOpen(true);\r\n return;\r\n }\r\n\r\n if (isDraftSaved) {\r\n const limit = isAllItemsSelected\r\n ? users!.totalCount\r\n : searchParams.limit;\r\n\r\n const filteredUsers = userItems.filter(user =>\r\n checkedUserIds.includes(user.id)\r\n );\r\n\r\n if (\r\n userStats!.limit\r\n && userStats!.limit < userStats!.total + (isAllItemsSelected ? users!.totalCount : filteredUsers.length)\r\n ) {\r\n setLoadingInvitation(false);\r\n setExceededFreeUsersModalOpen(true);\r\n return;\r\n }\r\n\r\n if (\r\n filteredUsers?.length > MAX_DRAFT_USERS_INVITE ||\r\n isAllItemsSelected\r\n ) {\r\n showMessage(\r\n `We're sending ${\r\n filteredUsers?.length || 'all'\r\n } invitations. This might take a while.`,\r\n 'success'\r\n );\r\n navigateToInvitations();\r\n }\r\n\r\n inviteStagingUser(\r\n params.draftId,\r\n checkedUsersIds,\r\n isAllItemsSelected,\r\n { ...searchParams, limit }\r\n )\r\n .then(invitationResults => {\r\n const updatedErroredUsers = userItems.map(user => {\r\n if (checkedUserIds.includes(user.id)) {\r\n return {\r\n ...user,\r\n emailExistsInSystem:\r\n invitationResults &&\r\n invitationResults[user.id] &&\r\n invitationResults[user.id].error,\r\n };\r\n } else {\r\n return user;\r\n }\r\n });\r\n const updatedFilteredUsers = updatedErroredUsers.filter(\r\n user =>\r\n (checkedUserIds.includes(user.id) &&\r\n invitationResults &&\r\n invitationResults[user.id] &&\r\n !invitationResults[user.id].id) ||\r\n !checkedUserIds.includes(user.id)\r\n );\r\n setLoadingInvitation(false);\r\n\r\n const duplicatedUsersCount = updatedErroredUsers.filter(\r\n user => user.emailExistsInSystem\r\n ).length;\r\n\r\n const usersInvitedCount =\r\n checkedUserIds.length - duplicatedUsersCount;\r\n\r\n modifyDraftUsersWithoutValidation({\r\n ...users,\r\n items: updatedErroredUsers,\r\n } as PaginationResult<DraftUser>);\r\n setCheckedUserIds([]);\r\n if (!isAllItemsSelected) {\r\n if (updatedFilteredUsers.length < 1) {\r\n showMessage(\r\n 'All Users have been invited',\r\n 'success'\r\n );\r\n navigateToInvitations();\r\n } else {\r\n if (\r\n usersInvitedCount > 0 &&\r\n duplicatedUsersCount > 0\r\n ) {\r\n showMessage(\r\n `${usersInvitedCount} ${\r\n usersInvitedCount > 1\r\n ? 'Users have'\r\n : 'User has'\r\n } been invited but ${duplicatedUsersCount} ${\r\n duplicatedUsersCount > 1\r\n ? 'users'\r\n : 'user'\r\n } already exist in our system`,\r\n 'error'\r\n );\r\n manualRefreshSearchParams();\r\n } else if (\r\n usersInvitedCount > 0 &&\r\n duplicatedUsersCount < 1\r\n ) {\r\n showMessage(\r\n `${usersInvitedCount} ${\r\n usersInvitedCount > 1\r\n ? 'Users have'\r\n : 'User has'\r\n } been invited `,\r\n 'success'\r\n );\r\n manualRefreshSearchParams();\r\n } else if (\r\n duplicatedUsersCount > 0 &&\r\n usersInvitedCount < 1\r\n ) {\r\n showMessage(\r\n `${duplicatedUsersCount} ${\r\n duplicatedUsersCount > 1\r\n ? 'Users'\r\n : 'User'\r\n } already exist in our system`,\r\n 'error'\r\n );\r\n }\r\n }\r\n }\r\n getCompanyUserStats(company.id!);\r\n })\r\n .catch(() => {\r\n setLoadingInvitation(false);\r\n });\r\n } else {\r\n const filteredUsers = userItems.filter(\r\n user =>\r\n checkedUserIds.includes(user.id) &&\r\n !user.isEntryInvalid &&\r\n !user.emailExistsInSystem\r\n );\r\n\r\n if (\r\n userStats!.limit\r\n && userStats!.limit < userStats!.total + filteredUsers.length\r\n ) {\r\n setLoadingInvitation(false);\r\n setExceededFreeUsersModalOpen(true);\r\n return;\r\n }\r\n\r\n const invitingUsers = filteredUsers.map(\r\n user =>\r\n ({\r\n firstName: user.firstName.toString(),\r\n lastName: user.lastName.toString(),\r\n email: user.email,\r\n roleId: user.roleId,\r\n companyId: company.id,\r\n labelIds: user.labelIDs,\r\n practisSets: user.practisSets,\r\n teamsIds: user.teamIDs?.filter(\r\n teamId => teamId !== defaultTeamId\r\n ), // Remove default team id.\r\n } as ChunkServiceUserDataInterface)\r\n );\r\n\r\n inviteUsersBulkActionService(invitingUsers);\r\n }\r\n });\r\n };\r\n\r\n const handleSaveAsDraft = () => {\r\n if (!isDraftSaved) {\r\n setSaveDraftModalOpen(true);\r\n }\r\n };\r\n\r\n const saveAsDraftConfirmed = useCallback(() => {\r\n setUsersSavedAt(new Date());\r\n setDraftSavedFirstTimeAt(new Date());\r\n setSaveDraftModalOpen(false);\r\n setGoBackTwice(true);\r\n showMessage('Invitation draft has been saved', 'success');\r\n }, [showMessage, setGoBackTwice]);\r\n\r\n const saveAsDraftFailed = useCallback(\r\n (error: string) => {\r\n setSaveDraftModalOpen(false);\r\n showMessage(error, 'error');\r\n },\r\n [showMessage]\r\n );\r\n\r\n const startedToFillInitialUser =\r\n !!newUser.firstName ||\r\n !!newUser.lastName ||\r\n !!newUser.email ||\r\n !!newUser.roleId ||\r\n !!newUserRole ||\r\n !!newUserLabels.length ||\r\n !!newUserPractisSets.length;\r\n\r\n const hideNewUserTipDisplayed =\r\n (!!userItemsList && userItemsList.length > 0) ||\r\n filtersCount > 0 ||\r\n searchParams.searchTerm.length > 0 ||\r\n localFilterParams.searchTerm.length > 0 ||\r\n startedToFillInitialUser ||\r\n loading;\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm || localFilterParams.searchTerm,\r\n appliedFilters: filtersCount,\r\n itemsCount: userItemsList?.length,\r\n });\r\n\r\n const userSavedAtText = draftSavedFirstTimeAt\r\n ? `Saved ${formatDate(draftSavedFirstTimeAt)}`\r\n : usersSavedAt\r\n ? `Automatically Saved ${formatDate(usersSavedAt)}`\r\n : isDraftSaved\r\n ? lastUpdated\r\n ? `Last Updated ${formatDate(lastUpdated)}`\r\n : 'Not Saved'\r\n : 'Not Saved';\r\n\r\n useEffect(() => {\r\n resetDraftsPage();\r\n return () => {\r\n resetDraftsPage();\r\n };\r\n }, [resetDraftsPage]);\r\n\r\n return (\r\n <StyledContainer>\r\n {saveDraftModalOpen && (\r\n <SaveAsDraftModal\r\n newUsers={users && users.items ? users.items : []}\r\n onClose={() => setSaveDraftModalOpen(false)}\r\n onProceed={saveAsDraftConfirmed}\r\n onError={saveAsDraftFailed}\r\n />\r\n )}\r\n {noFreeUsersModalOpen && (\r\n <NoFreeUsersModal\r\n onClose={() => setNoFreeUsersModalOpen(false)}\r\n />\r\n )}\r\n {exceededFreeUsersModalOpen && (\r\n <ExceededFreeUsersModal\r\n onClose={() => setExceededFreeUsersModalOpen(false)}\r\n />\r\n )}\r\n <StyledHeader>\r\n <div>\r\n <StyledHeaderInput data-test=\"invite-users-page-title\">\r\n Invite Users to Practis\r\n </StyledHeaderInput>\r\n {company.id && (\r\n <UserStatsContainer>\r\n <CompanyUserStatsText\r\n companyId={company.id}\r\n showSettingsButton={isAdminRole(profile?.role?.name)}\r\n />\r\n </UserStatsContainer>\r\n )}\r\n </div>\r\n </StyledHeader>\r\n <NewUserHeader\r\n users={users}\r\n localUsers={localUsers}\r\n selectedUsers={checkedUserIds}\r\n existingUserIds={existingUserIds}\r\n onUsersImported={onUsersImported}\r\n onRemoveUsers={onRemoveSelectedUsers}\r\n onRemoveExistingUsers={onRemoveExistingUsers}\r\n disableSearch={tableStates.disableSearch}\r\n disableFilters={tableStates.disableFilters}\r\n setSearchTerm={\r\n isDraftSaved ? setSearchTerm : setLocalSearchTerm\r\n }\r\n assignFilters={handleAssignFiltersToCheckedUsers}\r\n selectedRoles={checkedUserRoles}\r\n setSelectedRoles={handleClearCheckedUserRoles}\r\n filterRoles={filterRoles}\r\n setFilterRoles={setFilterRoles}\r\n applyFilters={handleApplyFiltersToCheckedUsers}\r\n filtersCount={filtersCount}\r\n isRoleDisabled={isRoleDisabled}\r\n updateAllUsersCheck={updateAllUsersCheck}\r\n clearAllUsers={clearAllUsers}\r\n userItemsList={userItemsList}\r\n isSelectAll={isSelectAll}\r\n updateSelectAll={updateSelectAll}\r\n dataTest=\"invite-users\"\r\n />\r\n <StyledContent>\r\n <UsersList\r\n userList={userItemsList}\r\n totalUsersCount={users && users.totalCount}\r\n selectedUsers={checkedUserIds}\r\n updateAllUsersCheck={updateAllUsersCheck}\r\n updateSelectAll={updateSelectAll}\r\n handleUserCheck={handleUserCheck}\r\n onEditUser={onEditUser}\r\n onRemoveUser={onRemoveUser}\r\n isDraftSaved={isDraftSaved}\r\n searchParams={searchParams}\r\n limit={searchParams.limit}\r\n setLimit={setLimit}\r\n orderBy={searchParams.orderBy}\r\n setOrderBy={setOrderBy}\r\n selectedUser={selectedUser}\r\n setSelectedUser={setSelectedUser}\r\n handleUpdateSelectedUser={handleUpdateSelectedUser}\r\n assignedRole={selectedUserRole}\r\n onAssignRoleCheck={handleChangeSelectedUserRole}\r\n selectedUserLabels={selectedUserLabels}\r\n setSelectedUserLabels={handleSetSelectedUserLabels}\r\n selectedUserPractisSets={selectedUserPractisSets}\r\n setSelectedUserPractisSets={\r\n handleSetSelectedUserPractisSets\r\n }\r\n selectedUserTeams={selectedUserTeams}\r\n setSelectedUserTeams={handleSetSelectedUserTeams}\r\n handleInputChange={(\r\n e: React.ChangeEvent<HTMLInputElement>,\r\n field: string\r\n ) => {\r\n if (e.target.value.length > 100) return;\r\n modifySelectedUser(e.target.value, field);\r\n }}\r\n showNoSearchResultsState={\r\n searchParams.searchTerm.length > 0 ||\r\n localFilterParams.searchTerm.length > 0\r\n }\r\n showNoFilterResultsState={\r\n tableStates.showNoFilterResultsState\r\n }\r\n isRoleDisabled={isRoleDisabled}\r\n dataTest=\"invite-users-table\"\r\n >\r\n {!tableStates.showNoFilterResultsState &&\r\n !searchParams.searchTerm.length &&\r\n !localFilterParams.searchTerm.length && (\r\n <AddNewUserWrapper>\r\n {!hideNewUserTipDisplayed && (\r\n <AddNewUserTip dataTest=\"invite-users-table-prompt\" />\r\n )}\r\n <Formik<DraftUser>\r\n ref={formRef}\r\n initialValues={newUser}\r\n onSubmit={values => {\r\n values.email = values.email.trim();\r\n setCreatingUser(true);\r\n\r\n setTimeout(() => {\r\n setCreatingUser(false);\r\n }, 2000);\r\n handleCreateNewUser(values);\r\n }}\r\n validationSchema={validationSchema}\r\n enableReinitialize={true}\r\n >\r\n {({\r\n values,\r\n handleChange,\r\n errors,\r\n submitCount,\r\n }) => (\r\n <Form\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n return;\r\n }\r\n }}\r\n >\r\n <FieldArray\r\n name=\"users\"\r\n render={() => (\r\n <AddNewUserContainer\r\n users={\r\n userItemsList\r\n ? userItemsList\r\n : []\r\n }\r\n creatingUser={\r\n creatingUser\r\n }\r\n startedToFillInitialUser={\r\n startedToFillInitialUser\r\n }\r\n hideNewUserTipDisplayed={\r\n hideNewUserTipDisplayed\r\n }\r\n hasError={\r\n (!!errors.email ||\r\n !!errors.firstName ||\r\n !!errors.lastName) &&\r\n submitCount > 0\r\n }\r\n errorMessages={errors}\r\n isSubmitDisabled={\r\n !values.firstName ||\r\n !values.lastName ||\r\n !values.email ||\r\n !newUserRole\r\n }\r\n assignedRole={\r\n newUserRole\r\n }\r\n onAssignRoleCheck={\r\n handleChangeNewUserRole\r\n }\r\n selectedUserPractisSets={\r\n newUserPractisSets\r\n }\r\n setSelectedUserPractisSets={\r\n handleSetNewUserPractisSets\r\n }\r\n selectedUserTeams={\r\n newUserTeams\r\n }\r\n setSelectedUserTeams={\r\n handleSetNewUserTeams\r\n }\r\n selectedUserLabels={\r\n newUserLabels\r\n }\r\n setSelectedUserLabels={\r\n handleSetNewUserLabels\r\n }\r\n handleInputChange={(\r\n e: React.ChangeEvent<HTMLInputElement>,\r\n field: string\r\n ) => {\r\n if (\r\n e.target.value\r\n .length >\r\n 100\r\n )\r\n return;\r\n modifyNewUser(\r\n e.target.value,\r\n field\r\n );\r\n handleChange(e);\r\n }}\r\n isRoleDisabled={\r\n isRoleDisabled\r\n }\r\n dataTest=\"invite-users-new\"\r\n />\r\n )}\r\n />\r\n </Form>\r\n )}\r\n </Formik>\r\n </AddNewUserWrapper>\r\n )}\r\n </UsersList>\r\n </StyledContent>\r\n <Divider />\r\n <StyledFooter>\r\n <StyledFooterActions>\r\n <StyledButtonContainer>\r\n <StyledSavedStatusContainer data-test=\"invite-users-saved-label\">\r\n {userSavedAtText}\r\n </StyledSavedStatusContainer>\r\n </StyledButtonContainer>\r\n {!isDraftSaved && (\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.CREATE_STAGING]}\r\n >\r\n <StyledButtonContainer>\r\n <Button\r\n action={handleSaveAsDraft}\r\n label=\"Save as Draft\"\r\n variant=\"inverse\"\r\n width=\"152px\"\r\n height=\"40px\"\r\n buttonSize={16}\r\n disabled={\r\n isEmpty(users?.items) ||\r\n loadingInvitation\r\n }\r\n dataTest=\"invite-users-save-as-draft\"\r\n />\r\n </StyledButtonContainer>\r\n </CheckPermission>\r\n )}\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.CREATE_STAGING]}\r\n >\r\n <Button\r\n action={onInviteSelectedUsers}\r\n label=\"Invite Selected Users\"\r\n width=\"184px\"\r\n height=\"40px\"\r\n buttonSize={16}\r\n disabled={\r\n !checkedUserIds.length ||\r\n !users ||\r\n (!!users && !users.items.length)\r\n }\r\n loading={loadingInvitation}\r\n loadingColor=\"white\"\r\n dataTest=\"invite-selected-users\"\r\n />\r\n </CheckPermission>\r\n </StyledFooterActions>\r\n </StyledFooter>\r\n </StyledContainer>\r\n );\r\n};\r\n\r\nexport const NewUserContainer: FC<ModalPageContainerProps> = ({\r\n closePath,\r\n closeGoingBack,\r\n}) => {\r\n const params: any = useParams();\r\n const history = useHistory();\r\n const state = useDraftEditState();\r\n const company = useSelector(getCompanyState);\r\n const searchDraftUsers = useSearchStagingUsersService();\r\n const modifyDraftUsers = useModifyDraftUsersService();\r\n const modifyDraftUsersWithoutValidation =\r\n useModifyDraftUsersWithoutValidationService();\r\n const resetDraftsPage = useResetDraftsPageService();\r\n const addStagingUser = useAddStagingUserService();\r\n const addMultipleStagingUsers = useAddMultipleStagingUsersService();\r\n const updateStagingUser = useUpdateStagingUserService();\r\n const deleteStagingUser = useDeleteStagingUserService();\r\n const inviteStagingUser = useInviteStagingUserService();\r\n const assignFiltersToStagingUsers = useAssignFiltersToStagingUsersService();\r\n const searchPractisSets = useGetFullPractisSetsService();\r\n const showConfirmationModalDialog = useShowConfirmModalDialog();\r\n const getCompanyUserStats = useGetCompanyUserStatsService();\r\n\r\n useEffect(() => {\r\n searchPractisSets({\r\n searchTerm: '',\r\n filters: [{ field: 'status', value: [LibraryItemsStatus.ACTIVE] }],\r\n orderBy: {\r\n field: 'updated_at',\r\n asc: false,\r\n },\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n });\r\n }, [searchPractisSets]);\r\n\r\n const isDraftSaved = params.draftId !== NEW_DRAFT_ID;\r\n const [goBackTwice, setGoBackTwice] = useState(false);\r\n\r\n const goBack = useCallback(() => {\r\n if (goBackTwice) {\r\n history.go(-2);\r\n } else {\r\n history.goBack();\r\n }\r\n }, [history, goBackTwice]);\r\n\r\n const showClosingWarning = () => {\r\n if (\r\n !isDraftSaved &&\r\n state &&\r\n state.data &&\r\n state.data.items &&\r\n state.data.items.length\r\n ) {\r\n showConfirmationModalDialog({\r\n modalTitle: 'Unsaved Progress',\r\n description:\r\n 'Are you sure you want to exit? Any unsaved progress will be lost.',\r\n cancelButtonText: 'Go Back',\r\n confirmButtonText: 'Exit Without Saving',\r\n customization: { width: 400, padding: '32px 40px' },\r\n onConfirm: goBack,\r\n });\r\n } else {\r\n goBack();\r\n }\r\n };\r\n\r\n const navigateToInvitations = () => {\r\n history.replace(ROUTES.INVITATIONS);\r\n };\r\n\r\n return (\r\n <WithLabelsContext.Provider value={{ reducerName: 'draftEdit' }}>\r\n <WithTeamsContext.Provider value={{ reducerName: 'draftEdit' }}>\r\n <WithPractisSetsContext.Provider\r\n value={{ reducerName: 'draftEdit' }}\r\n >\r\n <ModalPage\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n restrictClosing={true}\r\n restrictClosingAction={showClosingWarning}\r\n >\r\n <NewUser\r\n params={params}\r\n users={state && state.data}\r\n lastUpdated={\r\n state && state.data && state.data.lastUpdated\r\n }\r\n loading={state.loading}\r\n company={company}\r\n navigateToInvitations={navigateToInvitations}\r\n modifyDraftUsers={modifyDraftUsers}\r\n modifyDraftUsersWithoutValidation={\r\n modifyDraftUsersWithoutValidation\r\n }\r\n resetDraftsPage={resetDraftsPage}\r\n searchDraftUsers={searchDraftUsers}\r\n addStagingUser={addStagingUser}\r\n addMultipleStagingUsers={addMultipleStagingUsers}\r\n updateStagingUser={updateStagingUser}\r\n deleteStagingUser={deleteStagingUser}\r\n inviteStagingUser={inviteStagingUser}\r\n assignFiltersToStagingUsers={\r\n assignFiltersToStagingUsers\r\n }\r\n setGoBackTwice={setGoBackTwice}\r\n getCompanyUserStats={getCompanyUserStats}\r\n />\r\n </ModalPage>\r\n </WithPractisSetsContext.Provider>\r\n </WithTeamsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport { useChunkRequestsService } from '../../../../../services/ChunkRequestService/hooks';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../../ui/components/ModalDialogs/store/actions';\nimport { AssignedMemberToTeamType } from '../../../../../api/teams/types';\nimport {\n useAssignMembersToTeamsApi,\n useAssignUserLabelsApi,\n useEnrollPractisSetsToUserApi,\n useInviteUsers,\n} from '../../../../../api';\nimport {\n ChunkServiceUserDataInterface,\n InviteUsersParametersType,\n} from './types';\nimport { InviteUser } from '../../../../../api/invitations/types';\nimport { UserInterface } from '../../../../../constants/interfaces/User';\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\nimport { EnrollmentType } from '../../../../../api/enrollments/types';\nimport { ChunkRequestActionInterface } from '../../../../../services/ChunkRequestService/hooks/types';\nimport {\n ASSIGN_LABELS_TO_USERS_ACTION,\n INVITE_USERS_ACTION,\n INVITE_USERS_ITEM_PER_CHUNK_SIZE,\n} from './constants';\nimport { ITEM_PER_CHUNK_SIZE } from '../../../../../services/ChunkRequestService/hooks/constants';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\nimport { UserLabelType } from '../../../../../api/users/types';\n\n/**\n * @description function to invite users.\n * Create new user at first then assign labels, teams, practisSets to\n * new created user by using chunk service if needed.\n * @function useInviteUsersBulActionService\n * @param { Function | undefined } onSuccessCallback\n * @param { Function | undefined } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useInviteUsersBulActionService(\n onSuccessCallback?: (inviteUsers: ChunkServiceUserDataInterface[]) => void,\n onErrorCallback?: (error?: ErrorResult) => void\n) {\n const actionList = useRef<\n ChunkRequestActionInterface<InviteUsersParametersType>[]\n >([]);\n const usersDataRef = useRef<ChunkServiceUserDataInterface[] | null>(null);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n\n const inviteUsers = useInviteUsers();\n const assignLabelsToUsers = useAssignUserLabelsApi();\n const assignPractisSetsToUsers = useEnrollPractisSetsToUserApi();\n const assignMembersToTeams = useAssignMembersToTeamsApi();\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult) => {\n isRunning && setIsRunning(false);\n\n actionList.current = [];\n\n onErrorCallback?.(error);\n },\n [isRunning, onErrorCallback]\n );\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n\n actionList.current = [];\n onSuccessCallback?.(usersDataRef?.current ?? []);\n });\n }, [hideModalDialog, isRunning, onSuccessCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList.current,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback,\n false\n );\n\n /**\n * @function handleStopInviteUsersBulkActionService\n * @returns { void }\n */\n const handleStopInviteUsersBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n\n setIsRunning(false);\n actionList.current = [];\n });\n }, [hideModalDialog, setIsStopped]);\n\n /**\n * @description show progress modal and start chunk service action\n * @function handleStartActionModal\n * @returns { void }\n */\n const handleStartActionModal = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Inviting Users',\n onStopBulkActionService:\n handleStopInviteUsersBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopInviteUsersBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n /**\n * @function assignLabelsToUsersService\n * @param { UserInterface[] } users\n * @param { number[] } usersLabelIds\n * @return { Promise<void> }\n */\n const assignLabelsToUsersService = useCallback(\n async (users: UserInterface[], usersLabelIds: number[]) => {\n if (!isEmpty(users) && !isEmpty(usersLabelIds)) {\n const userId = users[0]?.id;\n\n const processedUsersLabels = usersLabelIds.map(\n labelId =>\n ({\n userId,\n labelId,\n } as UserLabelType)\n );\n\n !isEmpty(processedUsersLabels) &&\n (await assignLabelsToUsers(processedUsersLabels));\n }\n },\n [assignLabelsToUsers]\n );\n\n /**\n * @function assignPractisSetsToUsersService\n * @param { UserInterface[] } users\n * @param { PractisSetWithDueDate[] } usersPractisSets\n * @return { Promise<void> }\n */\n const assignPractisSetsToUsersService = useCallback(\n async (\n users: UserInterface[],\n usersPractisSets: PractisSetWithDueDate[]\n ) => {\n if (!isEmpty(users) && !isEmpty(usersPractisSets)) {\n const userId = users[0]?.id;\n\n const processedUsersPractisSet = usersPractisSets.map(\n practisSet =>\n ({\n userId,\n ...practisSet,\n } as EnrollmentType)\n );\n\n !isEmpty(processedUsersPractisSet) &&\n (await assignPractisSetsToUsers(processedUsersPractisSet));\n }\n },\n [assignPractisSetsToUsers]\n );\n\n /**\n * @function assignTeamsToUsersService\n * @param { UserInterface[] } users\n * @param { number[] } usersTeamIds\n * @return { Promise<void> }\n */\n const assignTeamsToUsersService = useCallback(\n async (users: UserInterface[], usersTeamIds: number[]) => {\n if (!isEmpty(users) && !isEmpty(usersTeamIds)) {\n const userId = users[0]?.id;\n\n const processedUsersTeams = usersTeamIds.map(\n teamId =>\n ({\n userId,\n teamId,\n } as AssignedMemberToTeamType)\n );\n\n !isEmpty(processedUsersTeams) &&\n (await assignMembersToTeams(processedUsersTeams));\n }\n },\n [assignMembersToTeams]\n );\n\n /**\n * @description create new users.\n * @function inviteUsersService\n * @param { InviteUser[] } users\n * @returns { Promise<void | number[]> }\n */\n const inviteUsersService = useCallback(\n (users: InviteUser[]) => {\n return inviteUsers(users).then((response: UserInterface[]) => {\n if (!isEmpty(response)) {\n return response;\n }\n });\n },\n [inviteUsers]\n );\n\n /**\n * @function handleStartInviteUsersBulkActionService\n * @returns { void }\n */\n const handleStartInviteUsersBulkActionService = useCallback(() => {\n if (usersDataRef.current) {\n const inviteUsersOptions = {\n parameters: {\n users: usersDataRef?.current?.map(user => ({\n firstName: user.firstName,\n lastName: user.lastName,\n email: user.email,\n roleId: user.roleId,\n companyId: user.companyId,\n })) as InviteUser[],\n },\n fieldName: 'users',\n };\n\n const InviteUsersAction = {\n actionName: INVITE_USERS_ACTION,\n actionFunction: inviteUsersService,\n actionFunctionOptions: inviteUsersOptions,\n itemPerChunk: INVITE_USERS_ITEM_PER_CHUNK_SIZE,\n childActionList: [\n {\n actionName: ASSIGN_LABELS_TO_USERS_ACTION,\n actionFunction: assignLabelsToUsersService,\n actionFunctionOptions: {\n parameters: {\n users: [],\n labelIds: usersDataRef.current.map(\n user => user.labelIds\n ),\n },\n fieldName: 'labelIds',\n secondaryFieldName: 'users',\n },\n itemPerChunk: ITEM_PER_CHUNK_SIZE,\n },\n {\n actionFunction: assignTeamsToUsersService,\n actionFunctionOptions: {\n parameters: {\n users: [],\n teamIds: usersDataRef.current.map(\n user => user.teamsIds\n ),\n },\n fieldName: 'teamIds',\n secondaryFieldName: 'users',\n },\n itemPerChunk: ITEM_PER_CHUNK_SIZE,\n },\n {\n actionFunction: assignPractisSetsToUsersService,\n actionFunctionOptions: {\n parameters: {\n users: [],\n practisSets: usersDataRef.current.map(\n user => user.practisSets\n ),\n },\n fieldName: 'practisSets',\n secondaryFieldName: 'users',\n },\n itemPerChunk: ITEM_PER_CHUNK_SIZE,\n },\n ],\n } as ChunkRequestActionInterface<any>;\n\n actionList.current.push(InviteUsersAction);\n\n !isEmpty(actionList.current) && handleStartActionModal();\n }\n }, [\n assignLabelsToUsersService,\n assignPractisSetsToUsersService,\n assignTeamsToUsersService,\n handleStartActionModal,\n inviteUsersService,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartInviteUsersBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n /**\n * @description Call the service runner.\n * @function callback\n * @param { ChunkServiceUserDataInterface[] } usersData\n * @returns { void }\n */\n return useCallback((usersData: ChunkServiceUserDataInterface[]) => {\n usersDataRef.current = usersData;\n\n setIsRunning(true);\n }, []);\n}","export const INVITE_USERS_ITEM_PER_CHUNK_SIZE = 1;\nexport const INVITE_USERS_ACTION = 'INVITE_USERS_ACTION';\nexport const ASSIGN_LABELS_TO_USERS_ACTION = 'ASSIGN_LABELS_TO_USERS_ACTION';","import { NewUserContainer } from './NewUser';\n\nexport default NewUserContainer;\n","import { Keywords } from './Keywords';\n\nexport enum ScriptLineSpeaker {\n CUSTOMER = 'CUSTOMER',\n REP = 'REP',\n}\n\nexport interface ScriptLine {\n id: number | string;\n text: string;\n audioUrl?: string;\n audioId: number;\n speaker: ScriptLineSpeaker;\n position: number;\n duration: number;\n keywords: Keywords[];\n}\n","import {\n Scenario,\n ScenarioStatuses,\n} from '../../../../constants/interfaces/Scenario';\nimport { ScriptLine } from '../../../../constants/interfaces/ScriptLine';\nimport { AppState } from '../../../../store/reducers';\nimport {\n ACTIONS,\n createScriptLineAction,\n deleteScriptLineAction,\n fetchScenarioFailure,\n fetchScenarioStart,\n fetchScenarioSuccess,\n modifyScenarioAction,\n modifyScriptTextAction,\n resetScenarioAction,\n resetScenarioLogoAction,\n restoreScenarioFromTempAction,\n updateScriptLineKeywords,\n storeScenarioTempCopyAction,\n updateScenarioModifyCase,\n updateScriptLineAction,\n uploadScenarioAudioFailure,\n uploadScenarioAudioStart,\n uploadScenarioAudioSuccess,\n clearScriptLinesAction,\n} from './actions';\nimport {\n ACTIONS as LIBRARY_ACTIONS,\n updateLibraryScenarioSuccess,\n} from '../../../../features/library/store/actions';\n\nexport type ScenarioCases =\n | 'init'\n | 'created'\n | 'modified'\n | 'loaded'\n | 'updated'\n | 'error';\n\nexport interface ScenarioInterface {\n info: Scenario;\n temp_info?: Scenario;\n loading: boolean;\n case: ScenarioCases;\n errors: string;\n}\n\nexport const initialScenarioState: ScenarioInterface = {\n info: {\n title: '',\n description: '',\n instructions: '',\n status: ScenarioStatuses.DRAFT,\n script: {\n totalDuration: null,\n scenarioId: null,\n companyId: null,\n lines: [],\n },\n },\n loading: false,\n case: 'init',\n errors: '',\n};\n\ntype ScenarioActions =\n | ReturnType<typeof fetchScenarioStart>\n | ReturnType<typeof fetchScenarioSuccess>\n | ReturnType<typeof fetchScenarioFailure>\n | ReturnType<typeof modifyScenarioAction>\n | ReturnType<typeof createScriptLineAction>\n | ReturnType<typeof updateScriptLineAction>\n | ReturnType<typeof modifyScriptTextAction>\n | ReturnType<typeof deleteScriptLineAction>\n | ReturnType<typeof uploadScenarioAudioStart>\n | ReturnType<typeof uploadScenarioAudioSuccess>\n | ReturnType<typeof uploadScenarioAudioFailure>\n | ReturnType<typeof resetScenarioAction>\n | ReturnType<typeof resetScenarioLogoAction>\n | ReturnType<typeof updateScenarioModifyCase>\n | ReturnType<typeof updateLibraryScenarioSuccess>\n | ReturnType<typeof storeScenarioTempCopyAction>\n | ReturnType<typeof restoreScenarioFromTempAction>\n | ReturnType<typeof updateScriptLineKeywords>\n | ReturnType<typeof clearScriptLinesAction>;\n\nexport const scenarioReducer = (\n state = initialScenarioState,\n action: ScenarioActions\n): ScenarioInterface => {\n switch (action.type) {\n case ACTIONS.FETCH_SCENARIO_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.FETCH_SCENARIO_SUCCESS:\n return {\n info: {\n ...state.info,\n ...action.data,\n },\n loading: false,\n case: 'loaded',\n errors: '',\n };\n case ACTIONS.FETCH_SCENARIO_FAILURE:\n return {\n ...state,\n loading: false,\n case: 'error',\n errors: action.error,\n };\n case ACTIONS.UPLOAD_SCENARIO_AUDIO_START:\n return {\n ...state,\n };\n case ACTIONS.UPLOAD_SCENARIO_AUDIO_SUCCESS:\n const updatedLines = state.info.script.lines.map(\n (line: ScriptLine) => {\n if (line.id === action.data.scriptLineId) {\n const newLine = { ...line };\n newLine.audioUrl = action.data.response.url;\n newLine.audioId = action.data.response.id;\n newLine.duration =\n action.data.response.metadata.format.duration;\n return newLine;\n } else {\n return line;\n }\n }\n );\n\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n totalDuration: updatedLines\n .map((lines: ScriptLine) =>\n lines.duration ? lines.duration : 0\n )\n .reduce((a, b) => a + b, 0),\n lines: updatedLines,\n },\n },\n case: 'modified',\n };\n case ACTIONS.UPLOAD_SCENARIO_AUDIO_FAILURE:\n return {\n ...state,\n errors: action.error,\n case: 'error',\n };\n case ACTIONS.CREATE_SCRIPT_LINE:\n const createdScriptLine = { ...state.info.script };\n createdScriptLine.lines.push(action.data);\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...createdScriptLine,\n },\n },\n case: 'modified',\n errors: '',\n };\n case ACTIONS.UPDATE_SCRIPT_LINE:\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n lines: action.data.map(\n (line: ScriptLine, index: number) => {\n return { ...line, position: index };\n }\n ),\n },\n },\n case: 'modified',\n errors: '',\n };\n case ACTIONS.MODIFY_SCRIPT_TEXT:\n return {\n ...state,\n case: 'modified',\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n lines: state.info.script.lines.map(\n (line: ScriptLine) => {\n if (line.id === action.lineId) {\n return {\n ...line,\n text: action.value,\n audioId: 0,\n audioUrl: undefined\n };\n } else {\n return line;\n }\n }\n ),\n },\n },\n };\n case ACTIONS.DELETE_SCRIPT_LINE:\n const newScriptLines = [...state.info.script.lines];\n const newScriptLinesArr = [\n ...newScriptLines.filter(\n (line: ScriptLine) => line.id !== action.data\n ),\n ];\n const newDurations = newScriptLinesArr\n .filter((line: ScriptLine) => line.audioUrl)\n .map((line: ScriptLine) => line.duration);\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n totalDuration:\n newDurations.length > 0\n ? newDurations.reduce((a, b) => a + b)\n : 0,\n lines: newScriptLinesArr,\n },\n },\n case: 'modified',\n errors: '',\n };\n case ACTIONS.CLEAR_SCRIPT_LINES:\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n lines: []\n },\n },\n case: 'modified',\n errors: '',\n };\n case ACTIONS.MODIFY_SCENARIO:\n const newScenarioInfo: any = { ...state.info };\n newScenarioInfo[action.field] = action.data;\n return {\n ...state,\n info: {\n ...newScenarioInfo,\n },\n case: action.silent ? state.case : 'modified',\n };\n case ACTIONS.UPDATE_SCRIPT_LINE_KEYWORDS: {\n const newLines = [...state.info.script.lines];\n return {\n ...state,\n info: {\n ...state.info,\n script: {\n ...state.info.script,\n lines: newLines.map(line => {\n if (line.id === action.lineId) {\n return {\n ...line,\n keywords: action.keywords,\n };\n } else {\n return line;\n }\n }),\n },\n },\n case: 'modified',\n errors: '',\n };\n }\n case ACTIONS.STORE_SCENARIO_TEMP_COPY: {\n return {\n ...state,\n temp_info: JSON.parse(JSON.stringify(state.info)),\n };\n }\n case ACTIONS.RESTORE_SCENARIO_FROM_TEMP: {\n return {\n ...state,\n info: JSON.parse(JSON.stringify(state.temp_info)),\n case: 'init',\n };\n }\n case ACTIONS.RESET_SCENARIO: {\n return {\n ...initialScenarioState,\n info: {\n ...initialScenarioState.info,\n script: {\n ...initialScenarioState.info.script,\n lines: [],\n },\n },\n };\n }\n case ACTIONS.UPDATE_SCENARIO_CASE: {\n return {\n ...state,\n case: action.value,\n };\n }\n case LIBRARY_ACTIONS.UPDATE_LIBRARY_SCENARIO_SUCCESS: {\n return {\n ...state,\n case: 'updated',\n };\n }\n default:\n return state;\n }\n};\n\nexport const getScenarioState = (state: AppState) => state.scenario;\n","import { flatten, range } from 'lodash';\n\nconst imageColors = ['1EB0FF', '51D76A', '96DAFF', 'FF7836'];\nconst imageCount = 10;\n\nexport const SCENARIO_IMAGES: string[] = flatten(\n range(1, imageCount + 1).map(n =>\n imageColors.map(c => `image_${n}_${c}.png`)\n )\n);\n","import { useCallback } from 'react';\nimport { RoleplayData } from '../../pages/Roleplays/CreateRoleplay/types';\nimport { useHttp } from '../../tools/http/Http';\nimport { CreateRoleplayApiParams, GetRoleplayApiParams, GetRoleplaysApiParams, RevertRoleplayApiParams, GenerateRoleplayApiParams, DeleteRoleplayApiParams, DuplicateRoleplayApiParams, UpdateRoleplayApiParams, CreateCommandRoleplayApiParams, GetRoleplayContentApiParams, RegenerateRoleplayApiParams, ResetRoleplayApiParams, GetRoleplayContentByApiParams } from './types';\n\n/**\n * @function useGetRoleplays\n * @returns { GetRoleplaysApiParams }\n */\nexport function useGetRoleplaysApi(): GetRoleplaysApiParams {\n const http = useHttp();\n return useCallback(\n (params) => http.get('/roleplays', params, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useCreateRoleplayApi\n * @returns { Roleplay }\n */\nexport function useCreateRoleplayApi(): CreateRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n (roleplayData: RoleplayData) =>\n http.post(`/roleplays`, roleplayData, true),\n [http]\n );\n}\n\n/**\n * @function useDuplicateRoleplayApi\n * @returns { Roleplay }\n */\nexport function useDuplicateRoleplayApi(): DuplicateRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId, title}) =>\n http.post(`roleplays/${roleplayId}/clone`, {title}, true),\n [http]\n );\n}\n\n/**\n * @function useDeleteRoleplayApi\n * @returns { Roleplay }\n */\nexport function useDeleteRoleplayApi(): DeleteRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n (rolepayIds) =>\n http.delete(`roleplays`, rolepayIds, true),\n [http]\n );\n}\n\n/**\n * @function useGetRoleplay\n * @returns { GetRoleplayApiParams }\n */\nexport function useGetRoleplayApi(): GetRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) => http.get(`roleplays/${roleplayId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useUpdateRoleplayApi\n * @returns { Roleplay }\n */\nexport function useUpdateRoleplayApi(): UpdateRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n (roleplayId: string, roleplayData: RoleplayData) =>\n http.put(`/roleplays/${roleplayId}`, roleplayData, true),\n [http]\n );\n}\n\n/**\n * @function useGetRoleplayContent\n * @returns { RoleplayContent }\n */\nexport function useGetRoleplayContentApi(): GetRoleplayContentApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) => http.get(`roleplays/${roleplayId}/content`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useCreateCommandRoleplayApi\n * @returns { Roleplay }\n */\nexport function useCreateCommandRoleplayApi(): CreateCommandRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId, text}) =>\n http.post(`roleplays/${roleplayId}/command`, {text}, true),\n [http]\n );\n}\n\n/**\n * @function useGenerateRoleplayApi\n * @returns { Roleplay }\n */\nexport function useGenerateRoleplayApi(): GenerateRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) =>\n http.post(`roleplays/${roleplayId}/generate-initial`, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useRegenerateRoleplayApi\n * @returns { Roleplay }\n */\nexport function useRegenerateRoleplayApi(): RegenerateRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) =>\n http.post(`roleplays/${roleplayId}/regenerate`, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useResetRoleplayApi\n * @returns { Roleplay }\n */\nexport function useResetRoleplayApi(): ResetRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) =>\n http.post(`roleplays/${roleplayId}/clear`, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGetRoleplayContentById\n * @returns { RoleplayContent }\n */\nexport function useGetRoleplayContentByIdApi(): GetRoleplayContentByApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId, contentId}) => http.get(`roleplays/${roleplayId}/content/${contentId}`, undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useRevertRoleplayApi\n * @returns { Roleplay }\n */\nexport function useRevertRoleplayApi(): RevertRoleplayApiParams {\n const http = useHttp();\n return useCallback(\n ({roleplayId}) =>\n http.post(`roleplays/${roleplayId}/cancel/`, undefined, true),\n [http]\n );\n}","import { SCENARIO_IMAGES } from '../../../../constants/enums/scenarios';\nimport { Scenario } from '../../../../constants/interfaces/Scenario';\nimport { ScriptLine, ScriptLineSpeaker } from '../../../../constants/interfaces/ScriptLine';\nimport { randomArrayItem } from '../../../../helpers/functions/get-random-from-array';\nimport { getConfig } from '../../../../tools/config';\nimport {\n createScriptLineAction,\n deleteScriptLineAction,\n modifyScriptTextAction,\n updateScriptLineAction,\n uploadScenarioAudioStart,\n uploadScenarioAudioSuccess,\n uploadScenarioAudioFailure,\n uploadScenarioLogoFailure,\n uploadScenarioLogoStart,\n uploadScenarioLogoSuccess,\n modifyScenarioAction,\n fetchScenarioStart,\n fetchScenarioSuccess,\n fetchScenarioFailure,\n resetScenarioAction,\n resetScenarioLogoAction,\n updateScenarioModifyCase,\n restoreScenarioFromTempAction,\n storeScenarioTempCopyAction,\n updateScriptLineKeywords,\n clearScriptLinesAction,\n} from './actions';\nimport { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useFileUploadApi,\n useGetScenarioApi,\n} from '../../../../api';\nimport { ScenarioCases } from './reducers';\nimport { Keywords } from '../../../../constants/interfaces/Keywords';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useGetRoleplayApi, useGetRoleplayContentByIdApi } from '../../../../api/roleplay';\n\nexport const useCreateScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (data: ScriptLine) => {\n dispatch(createScriptLineAction(data));\n },\n [dispatch]\n );\n};\n\nexport const useDeleteScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (lineId: number) => {\n dispatch(deleteScriptLineAction(lineId));\n },\n [dispatch]\n );\n};\n\nexport const useModifyScriptTextService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: string, lineId: number | string) => {\n dispatch(modifyScriptTextAction(value, lineId));\n },\n [dispatch]\n );\n};\n\nexport const useUpdateScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLines: Array<ScriptLine>) => {\n dispatch(updateScriptLineAction(scriptLines));\n },\n [dispatch]\n );\n};\n\nexport const updateScriptLine = (scriptLines: Array<ScriptLine>) => {\n return (dispatch: any) => {\n dispatch(updateScriptLineAction(scriptLines));\n };\n};\n\nexport const useClearScriptLinesService = () => {\n const dispatch = useDispatch();\n return useCallback(\n () => {\n dispatch(clearScriptLinesAction());\n },\n [dispatch]\n );\n};\n\nexport const useGetScenarioService = () => {\n const dispatch = useDispatch();\n const getScenarioApi = useGetScenarioApi();\n const showMessage = useShowMessage();\n return useCallback(\n (scenarioId: number) => {\n dispatch(fetchScenarioStart());\n getScenarioApi(scenarioId)\n .then(data => {\n dispatch(fetchScenarioSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchScenarioFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getScenarioApi, showMessage]\n );\n};\n\nexport const useUploadScenarioImageService = () => {\n const dispatch = useDispatch();\n const fileUploadApi = useFileUploadApi();\n const showMessage = useShowMessage();\n return useCallback(\n (file: any, associatedEntityId?: number, filename?: string) => {\n dispatch(uploadScenarioLogoStart());\n const formData: FormData = new FormData();\n formData.set('file', file);\n formData.set('type', 'IMAGE');\n formData.set('associatedEntityType', 'Scenario');\n if (associatedEntityId)\n formData.set(\n 'associatedEntityId',\n associatedEntityId.toString()\n );\n if (filename) formData.set('filename', filename);\n\n fileUploadApi(formData)\n .then(data => {\n dispatch(uploadScenarioLogoSuccess(data));\n return 'success';\n })\n .catch((error: ErrorResult) => {\n dispatch(uploadScenarioLogoFailure(error.message));\n showMessage(error.message, 'error');\n return 'error';\n });\n },\n [dispatch, fileUploadApi, showMessage]\n );\n};\n\nexport const useUploadScenarioAudioService = () => {\n const dispatch = useDispatch();\n const fileUploadApi = useFileUploadApi();\n const showMessage = useShowMessage();\n return useCallback(\n (file: any, associatedEntityId: string | number, filename?: string) => {\n dispatch(uploadScenarioAudioStart());\n const formData: FormData = new FormData();\n formData.set('file', file);\n formData.set('type', 'AUDIO');\n formData.set('associatedEntityType', 'Line');\n if (!associatedEntityId.toString().includes('temp_'))\n formData.set(\n 'associatedEntityId',\n associatedEntityId.toString()\n );\n if (filename) formData.set('filename', filename);\n\n return fileUploadApi(formData)\n .then(data => {\n dispatch(\n uploadScenarioAudioSuccess(associatedEntityId, data)\n );\n return 'success';\n })\n .catch((error: ErrorResult) => {\n dispatch(uploadScenarioAudioFailure(error.message));\n showMessage(error.message, 'error');\n return 'error';\n });\n },\n [dispatch, fileUploadApi, showMessage]\n );\n};\n\nexport const generateRandomImageUrl = () => {\n const fileName = randomArrayItem(SCENARIO_IMAGES);\n return (\n getConfig().S3_FILES_BASE_URL + `scenarios/default-logos/${fileName}`\n );\n};\n\nexport const useModifyScenarioService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: any, field: keyof Scenario, silent?: boolean) => {\n dispatch(modifyScenarioAction(value, field, silent));\n },\n [dispatch]\n );\n};\n\nexport const useResetScenarioService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetScenarioAction());\n }, [dispatch]);\n};\n\nexport const useResetScenarioLogoService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetScenarioLogoAction());\n }, [dispatch]);\n};\n\nexport const useStoreScenarioTempCopyService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(storeScenarioTempCopyAction());\n }, [dispatch]);\n};\n\nexport const useRestoreScenarioFromTempActionService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(restoreScenarioFromTempAction());\n }, [dispatch]);\n};\n\nexport const useUpdateScenarioModifyCase = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: ScenarioCases) => {\n dispatch(updateScenarioModifyCase(value));\n },\n [dispatch]\n );\n};\n\nexport const useSaveScenarioKeywordsService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (keywords: Keywords[], lineId: number | string) => {\n dispatch(updateScriptLineKeywords(keywords, lineId));\n },\n [dispatch]\n );\n};\n\nexport const useGetRoleplayForScenario = () => {\n const getRoleplayContentByIdApi = useGetRoleplayContentByIdApi();\n const getRoleplayApi = useGetRoleplayApi();\n\n return useCallback(\n async (roleplayId: string, contentId: string) => {\n return getRoleplayContentByIdApi({roleplayId, contentId}).then(async ({conversation, summary}) => {\n const aiLines = conversation.map(({text, role}) => {\n return {\n text: text,\n speaker: role === 'prospect' ? ScriptLineSpeaker.CUSTOMER : ScriptLineSpeaker.REP\n }\n })\n const {title} = await getRoleplayApi({roleplayId});\n\n return {aiLines, title, description: summary};\n })\n },\n [getRoleplayContentByIdApi, getRoleplayApi]\n );\n};\n","export enum EditModeValues {\n EDIT = 'EDIT',\n VIEW = 'VIEW',\n}","import { ErrorResult } from \"../../../constants/interfaces/ErrorResult\";\n\nexport enum ACTIONS {\n VOICE_GENERATION_START = 'VOICE_GENERATION_START',\n VOICE_GENERATION_SUCCESS = 'VOICE_GENERATION_SUCCESS',\n VOICE_GENERATION_FAILURE = 'VOICE_GENERATION_FAILURE',\n VOICE_GENERATION_CLEAR = 'VOICE_GENERATION_CLEAR',\n}\n\nexport function voiceGenerationStart(feature: string, itemId: number | string) {\n return {\n type: ACTIONS.VOICE_GENERATION_START as ACTIONS.VOICE_GENERATION_START,\n itemId,\n feature,\n };\n}\n\nexport function voiceGenerationSuccess(\n feature: string,\n itemId: number | string,\n voice: Blob\n) {\n return {\n type: ACTIONS.VOICE_GENERATION_SUCCESS as ACTIONS.VOICE_GENERATION_SUCCESS,\n feature,\n itemId,\n voice,\n };\n}\n\nexport function voiceGenerationFailure(\n feature: string,\n itemId: number | string,\n error: ErrorResult\n) {\n return {\n type: ACTIONS.VOICE_GENERATION_FAILURE as ACTIONS.VOICE_GENERATION_FAILURE,\n feature,\n itemId,\n error,\n };\n}\n\nexport function voiceGenerationClear(feature: string, itemId: number | string) {\n return {\n type: ACTIONS.VOICE_GENERATION_CLEAR as ACTIONS.VOICE_GENERATION_CLEAR,\n feature,\n itemId,\n };\n}\n","import React, { FC, useState } from 'react';\nimport styled from 'styled-components';\nimport { Textarea } from '../Textarea/Textarea';\nimport { Variables } from '../../../theme/variables';\nimport { getIn } from 'formik';\n\nconst StyledFormikField = styled.div<{ marginRight?: string }>`\n ${props => !!props.marginRight && `margin-right: ${props.marginRight};`}\n`;\n\nconst StyledTextareaContainer = styled.div<{\n height?: string;\n width?: string;\n disabled?: boolean;\n color: string;\n background?: string;\n padding?: string;\n maxHeight?: string;\n hasError?: boolean;\n}>`\n ${props => (!!props.width ? `min-width: ${props.width}` : '')};\n position: relative;\n border-radius: 4px;\n padding: ${props => props.padding || '15px 23px'};\n background: ${props =>\n !!props.background\n ? props.background\n : props.disabled\n ? Variables.Colors.whiteTwo\n : props.color};\n border: 1px solid ${props =>\n props.hasError\n ? 'var(--ps-red-main)'\n : !!props.background\n ? props.background\n : props.disabled\n ? Variables.Colors.whiteTwo\n : props.color};\n max-height: ${props => props.maxHeight || 'auto'};\n`;\n\nconst StyledLabel = styled.div<{\n focused: boolean;\n titleFontColor?: string;\n titleFontWeight?: string;\n}>`\n font-size: 13px;\n margin-bottom: 2px;\n color: ${props =>\n !!props.titleFontColor\n ? props.titleFontColor\n : props.theme.Colors.steelGrey};\n font-weight: ${props =>\n !!props.titleFontWeight ? props.titleFontWeight : 'normal'};\n`;\n\nconst StyledCounter = styled.div<{ fontSize?: string }>`\n font-size: ${props => (!!props.fontSize ? props.fontSize : '11px')};\n font-weight: normal;\n text-align: right;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst ErrorContainer = styled.div<{ fontSize?: string }>`\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n color: var(--ps-red-main);\n font-weight: 500;\n`;\n\nexport const TextAreaBox: FC<{\n label?: string;\n value?: string;\n field?: any;\n form?: { touched: any; errors: any };\n name?: any;\n onChange?: any;\n type?: string;\n max?: number;\n width?: string;\n onBlur?: any;\n background?: string;\n color?: string;\n disabled?: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n readOnly?: boolean;\n padding?: string;\n fontSize?: string;\n marginTop?: string;\n titleFontColor?: string;\n titleFontWeight?: string;\n minRows?: number;\n marginRight?: string;\n className?: string;\n hideCounter?: boolean;\n counterFontSize?: string;\n maxHeight?: string\n dataTest?: string\n}> = props => {\n const [focused, setFocused] = useState(false);\n const error = props.form && props.field ? getIn(props.form.errors, props.field.name) : undefined;\n const touched = props.form && props.field ? getIn(props.form.touched, props.field.name) : undefined;\n\n const onFocus = () => {\n setFocused(true);\n };\n\n const onBlur = () => {\n setFocused(false);\n if (props.onBlur) props.onBlur();\n };\n\n const TextAreaStyles = {\n flex: 1,\n fontSize: `${!!props.fontSize ? props.fontSize : '13px'}`,\n marginTop: `${!!props.marginTop ? props.marginTop : '0'}`,\n };\n\n return (\n <StyledFormikField marginRight={props.marginRight}>\n <StyledTextareaContainer\n width={props.width}\n disabled={props.disabled}\n color={props.color ? props.color : Variables.Colors.white}\n background={props.background}\n padding={props.padding}\n maxHeight={props.maxHeight}\n hasError={!!error && !!touched}\n >\n <StyledLabel\n focused={focused}\n titleFontColor={props.titleFontColor}\n titleFontWeight={props.titleFontWeight}\n >\n {props.label}\n </StyledLabel>\n <Textarea\n value={props.value}\n styles={TextAreaStyles}\n {...props}\n {...props.field}\n label={props.label}\n placeholder={props.placeholder}\n max={props.max}\n onChange={props.onChange ?? props.field.onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n disabled={props.disabled}\n autoFocus={props.autoFocus}\n readOnly={props.readOnly}\n minRows={props.minRows}\n fontSize={props.fontSize}\n dataTest={props.dataTest}\n />\n {props.max && !props.hideCounter && (\n <StyledCounter fontSize={props.counterFontSize} data-test={`${props.dataTest}-counter`}>\n {props.value ? props.value.length : '0'}/{props.max}\n </StyledCounter>\n )}\n </StyledTextareaContainer>\n {error && touched && (\n <ErrorContainer data-test={`${props.dataTest}-error`}>\n {error}\n </ErrorContainer>\n )}\n </StyledFormikField>\n );\n};\n\nexport default TextAreaBox;\n","import React, { FC, useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport styled from 'styled-components';\nimport { Scenario } from '../../../../../../constants/interfaces/Scenario';\nimport { getScenarioState } from '../../../store/reducers';\nimport { useModifyScenarioService } from '../../../store/services';\nimport { EditModeContext } from '../../../NewScenario';\nimport { EditModeValues } from '../../../../../../constants/enums/EditModeValues';\nimport { Variables } from '../../../../../../theme/variables';\nimport TextAreaBox from '../../../../../../ui/components/TextAreaBox/TextAreaBox';\n\nconst StyledScenarioInfo = styled.div`\n flex: 2;\n margin-right: 32px;\n padding-top: 24px;\n`;\n\nconst StyledScenarioInfoContent = styled.div`\n border-radius: 4px;\n`;\n\nconst StyledInputDivs = styled.div``;\n\nconst ScenarioInfo: FC<{\n scenario: Scenario;\n modified: 'init' | 'created' | 'modified' | 'updated' | 'error' | 'loaded';\n modifyScenario: (value: any, field: keyof Scenario) => any;\n}> = ({ scenario, modifyScenario }) => {\n const edit = useContext(EditModeContext);\n\n return (\n <StyledScenarioInfo>\n <StyledScenarioInfoContent>\n <StyledInputDivs>\n <TextAreaBox\n background={Variables.Colors.whiteFive}\n value={scenario && scenario.description}\n onChange={(e: any) =>\n modifyScenario(e.target.value, 'description')\n }\n name=\"description\"\n placeholder=\"Description\"\n max={500}\n minRows={7.5}\n padding=\"12px 16px\"\n readOnly={edit.mode === EditModeValues.VIEW}\n dataTest='scenario-description'\n />\n </StyledInputDivs>\n </StyledScenarioInfoContent>\n </StyledScenarioInfo>\n );\n};\n\nexport const ScenarioInfoContainer: FC<{\n scenario: Scenario;\n}> = ({ scenario }) => {\n const modified = useSelector(getScenarioState).case;\n\n const modifyScenario = useModifyScenarioService();\n\n return (\n <ScenarioInfo\n scenario={scenario}\n modified={modified}\n modifyScenario={modifyScenario}\n />\n );\n};\n\nexport default ScenarioInfoContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { ScriptLineSpeaker } from '../../../../../../../../constants/interfaces/ScriptLine';\nimport LinkText from '../../../../../../../../ui/components/LinkText/link-text';\n\nconst StyledEmptyScriptContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n`;\n\nconst ScriptAction: FC<{\n handleAdd: any;\n}> = ({ handleAdd }) => {\n return (\n <StyledEmptyScriptContainer>\n <LinkText onClick={() => handleAdd(ScriptLineSpeaker.CUSTOMER)} dataTest='add-scenario-customer-line'>\n + Add a customer line\n </LinkText>\n <LinkText onClick={() => handleAdd(ScriptLineSpeaker.REP)} dataTest='add-scenario-rep-line'>\n Add a rep line +\n </LinkText>\n </StyledEmptyScriptContainer>\n );\n};\n\nexport default ScriptAction;\n","export const ElevenLabsUrl = 'https://api.elevenlabs.io/v1';","import { ElevenLabsUrl } from './constants';\nimport { getConfig } from \"../../tools/config\";\nimport { GenerateAudioType, GetVoicesResult } from './types';\nimport { ErrorResult } from '../../constants/interfaces/ErrorResult';\n\nexport const generateAudioWithElevenLabs = async ({text, stability, voiceId, similarityBoost, style}: GenerateAudioType) => {\n const config = getConfig();\n\n const res = await fetch(ElevenLabsUrl + `/text-to-speech/${voiceId || 'EXAVITQu4vr4xnSDxMaL'}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'xi-api-key': config.ELEVEN_LABS_KEY,\n 'accept': 'audio/mpeg'\n },\n body: JSON.stringify({\n text,\n \"voice_settings\": {\n \"stability\": stability,\n \"similarity_boost\": similarityBoost,\n \"style\": style\n }\n }),\n });\n\n if (!res.ok) {\n return Promise.reject({\n code: res.status,\n status: res.statusText\n } as ErrorResult);\n }\n\n return await res.blob();\n};\n\nexport const getElevenLabsVoices = async () => {\n const config = getConfig();\n\n const res = await fetch(ElevenLabsUrl + `/voices`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'xi-api-key': config.ELEVEN_LABS_KEY,\n 'accept': 'audio/mpeg'\n }\n });\n \n return await res.json() as Promise<GetVoicesResult>;\n};","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n voiceGenerationClear,\n voiceGenerationFailure,\n voiceGenerationStart,\n voiceGenerationSuccess,\n} from './actions';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { TextToSpeechSettings } from '../../../constants/interfaces/CompanyVoiceSettings';\nimport { generateAudioWithElevenLabs } from '../../../services/ElevenLabs';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\n\nexport const useTextToSpeechService = () => {\n const showMessage = useShowMessage();\n const dispatch = useDispatch();\n return useCallback(\n (\n text: string,\n settings: TextToSpeechSettings,\n params: { feature: string; itemId: number | string }\n ) => {\n dispatch(voiceGenerationStart(params.feature, params.itemId));\n return generateAudioWithElevenLabs({\n text,\n voiceId: settings.voiceId,\n stability: settings.stability,\n similarityBoost: settings.similarityBoost,\n })\n .then(data => {\n dispatch(voiceGenerationSuccess(params.feature, params.itemId, data));\n return data;\n })\n .catch((error: ErrorResult) => {\n const errorMessage = error.code === 429\n ? 'Our voice generation system is experiencing high load. Please try again in a few minutes.'\n : 'Something went wrong while generating audio';\n showMessage(errorMessage, 'error');\n dispatch(\n voiceGenerationFailure(params.feature, params.itemId, error)\n );\n throw error;\n });\n },\n [dispatch, showMessage]\n );\n};\n\nexport const useClearVoiceService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (s: { feature: string; itemId: number | string }) => {\n dispatch(voiceGenerationClear(s.feature, s.itemId));\n },\n [dispatch]\n );\n};\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\n\nexport interface VoiceGenerationState {\n [key: string]: {\n generating?: boolean;\n error?: ErrorResult;\n data: Array<{\n id?: number | string;\n voice?: Blob;\n }>;\n };\n}\n\nexport type VoiceGenerationSelector = (state: any) => VoiceGenerationState;\n\nexport const VoiceGenerationSelectorContext = React.createContext<\n VoiceGenerationSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useVoiceGenerationState(): VoiceGenerationState {\n return useSelector(useContext(VoiceGenerationSelectorContext));\n}\n","const R = require('ramda');\n\nexport const appendItem = (array: any, action: any) => R.append(action, array);\nexport const removeItem = (array: Array<any>, action: any, field?: string) =>\n array.filter((item: any) =>\n field ? item[field] === action[field] : item.id !== action.id\n );\n\nexport const findItem = (array: any, field: string, value: any) => {\n if (!array) return null;\n return R.find(R.propEq(field, value))(array);\n};\n\nexport const modifyArrayItem = (\n array: Array<any>,\n index: number | string,\n field: string,\n value: any\n) => {\n const itemIdx = (id: number | string) =>\n R.findIndex(R.propEq('id', id), array);\n const fieldLens = (idx: string) => R.lensPath([idx, field]);\n const wField = fieldLens(itemIdx(index));\n return R.over(wField, (item: any) => value, array);\n};\n","export enum ACTIONS {\n CREATE_AUDIO_PLAYLIST = 'CREATE_AUDIO_PLAYLIST',\n PLAY_AUDIO = 'PLAY_AUDIO',\n STOP_AUDIO = 'STOP_AUDIO',\n RESET_PLAYLIST = 'RESET_PLAYLIST',\n START_AUDIO_RECORDING = 'START_AUDIO_RECORDING',\n STOP_AUDIO_RECORDING = 'STOP_AUDIO_RECORDING',\n GO_NEXT = 'GO_NEXT',\n}\n\nexport function createPlaylistAction(data: any) {\n return {\n type: ACTIONS.CREATE_AUDIO_PLAYLIST as ACTIONS.CREATE_AUDIO_PLAYLIST,\n data,\n };\n}\n\nexport function playAudioAction(scriptLineId: number | string) {\n return {\n type: ACTIONS.PLAY_AUDIO as ACTIONS.PLAY_AUDIO,\n scriptLineId,\n };\n}\n\nexport function stopAudioAction(scriptLineId: number | string) {\n return {\n type: ACTIONS.STOP_AUDIO as ACTIONS.STOP_AUDIO,\n scriptLineId,\n };\n}\n\nexport function resetPlaylistAction() {\n return {\n type: ACTIONS.RESET_PLAYLIST as ACTIONS.RESET_PLAYLIST,\n };\n}\n\nexport function startAudioRecordingAction(scriptLineId: number | string) {\n return {\n type: ACTIONS.START_AUDIO_RECORDING as ACTIONS.START_AUDIO_RECORDING,\n scriptLineId,\n };\n}\n\nexport function stopAudioRecordingAction() {\n return {\n type: ACTIONS.STOP_AUDIO_RECORDING as ACTIONS.STOP_AUDIO_RECORDING,\n };\n}\n\nexport function goNextAction() {\n return {\n type: ACTIONS.GO_NEXT as ACTIONS.GO_NEXT,\n };\n}\n","import { Reducer } from 'redux';\nimport {\n ACTIONS,\n createPlaylistAction,\n goNextAction,\n playAudioAction,\n resetPlaylistAction,\n startAudioRecordingAction,\n stopAudioAction,\n stopAudioRecordingAction,\n} from './actions';\nimport { AppState } from '../../../store/reducers';\n\nexport interface AudioInterface {\n playlist: number[];\n status: 'single' | 'playlist' | 'off';\n recording: false | number | string;\n current: number | string | null;\n next: number | null;\n}\n\nconst initialAudioState: AudioInterface = {\n playlist: [],\n recording: false,\n status: 'off',\n current: null,\n next: null,\n};\n\ntype AudioAction =\n | ReturnType<typeof createPlaylistAction>\n | ReturnType<typeof playAudioAction>\n | ReturnType<typeof stopAudioAction>\n | ReturnType<typeof resetPlaylistAction>\n | ReturnType<typeof startAudioRecordingAction>\n | ReturnType<typeof stopAudioRecordingAction>\n | ReturnType<typeof goNextAction>;\n\nexport const audioReducer: Reducer<AudioInterface, AudioAction> = (\n state: AudioInterface = initialAudioState,\n action: AudioAction\n): AudioInterface => {\n switch (action.type) {\n case ACTIONS.CREATE_AUDIO_PLAYLIST:\n return {\n ...state,\n status: 'playlist',\n playlist: action.data,\n current: action.data[0],\n next: action.data[1],\n };\n case ACTIONS.PLAY_AUDIO:\n return {\n ...state,\n status: 'single',\n current: action.scriptLineId,\n next: null,\n };\n case ACTIONS.STOP_AUDIO:\n return {\n ...state,\n status: 'off',\n current: null,\n };\n case ACTIONS.START_AUDIO_RECORDING:\n return {\n ...state,\n recording: action.scriptLineId,\n };\n case ACTIONS.STOP_AUDIO_RECORDING:\n return {\n ...state,\n recording: false,\n };\n case ACTIONS.GO_NEXT:\n const newPlaylist = state.playlist;\n let newState = { ...state };\n if (state.status === 'playlist') {\n newPlaylist.shift();\n newState = {\n ...state,\n status: newPlaylist[0] ? 'playlist' : 'off',\n playlist: newPlaylist,\n current: newPlaylist[0] ? newPlaylist[0] : null,\n next: newPlaylist[1] ? newPlaylist[1] : null,\n };\n }\n return newState;\n case ACTIONS.RESET_PLAYLIST:\n return {\n ...initialAudioState,\n };\n default:\n return state;\n }\n};\n\nexport const getAudioState = (state: AppState) => state.player;\n","import { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport {\n createPlaylistAction,\n goNextAction,\n playAudioAction,\n resetPlaylistAction,\n startAudioRecordingAction,\n stopAudioAction,\n stopAudioRecordingAction,\n} from './actions';\n\nexport const useCreatePlaylistService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (data: any) => {\n dispatch(createPlaylistAction(data));\n },\n [dispatch]\n );\n};\n\nexport const usePlayAudioService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLineId: number | string) => {\n dispatch(playAudioAction(scriptLineId));\n },\n [dispatch]\n );\n};\n\nexport const useStopAudioService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLineId: number | string) => {\n dispatch(stopAudioAction(scriptLineId));\n },\n [dispatch]\n );\n};\n\nexport const useResetAudioService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetPlaylistAction());\n }, [dispatch]);\n};\n\nexport const useStartAudioRecordingService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLineId: number | string) => {\n dispatch(startAudioRecordingAction(scriptLineId));\n },\n [dispatch]\n );\n};\n\nexport const useStopAudioRecordingService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(stopAudioRecordingAction());\n }, [dispatch]);\n};\n\nexport const useGoNextService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(goNextAction());\n }, [dispatch]);\n};\n","import { useCallback } from 'react';\n\nexport const useGetSelectionCharacterOffsetWithin = () => {\n return useCallback((element: any) => {\n let start = 0;\n let end = 0;\n const doc = element.ownerDocument || element.document;\n const win = doc.defaultView || doc.parentWindow;\n let sel: any;\n let selectionRect;\n if (typeof win.getSelection !== 'undefined') {\n sel = win.getSelection();\n if (sel.rangeCount > 0) {\n const range = win.getSelection().getRangeAt(0);\n selectionRect = range.getBoundingClientRect();\n const preCaretRange = range.cloneRange();\n preCaretRange.selectNodeContents(element);\n preCaretRange.setEnd(range.startContainer, range.startOffset);\n start = preCaretRange.toString().length;\n preCaretRange.setEnd(range.endContainer, range.endOffset);\n end = preCaretRange.toString().length;\n }\n } else if (sel && sel === doc.selection && sel.type !== 'Control') {\n const textRange = sel.createRange();\n const preCaretTextRange = doc.body.createTextRange();\n preCaretTextRange.moveToElementText(element);\n preCaretTextRange.setEndPoint('EndToStart', textRange);\n start = preCaretTextRange.text.length;\n preCaretTextRange.setEndPoint('EndToEnd', textRange);\n end = preCaretTextRange.text.length;\n }\n return { start: start, end: end, selectionRect: selectionRect };\n }, []);\n};\n\nexport function getCaretPosition(context: any) {\n const selection = window.getSelection();\n if (!selection) return null;\n const range: any = selection.getRangeAt(0);\n range.setStart(context, 0);\n return range.toString().length;\n}\n\nexport function getTextNodeAtPosition(root: any, index: any) {\n const NODE_TYPE = NodeFilter.SHOW_TEXT;\n // @ts-ignore\n const treeWalker = document.createTreeWalker(root, NODE_TYPE, function next(\n elem: any\n ): number {\n if (index > root.textContent.length) {\n index -= elem.textContent.length;\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n });\n\n const c = treeWalker.nextNode();\n return {\n node: c ? c : root,\n position: index,\n };\n}\n\nexport function useSetCaretPosition() {\n return useCallback((element?: any, offset?: any) => {\n const range: any = document.createRange();\n const sel: any = window.getSelection();\n let currentNode = null;\n let currentNodeLength = null;\n let previousNodeLength = null;\n for (let i = 0; i < element.childNodes.length; i++) {\n previousNodeLength = currentNodeLength;\n currentNode = element.childNodes[i];\n currentNodeLength = (\n element.childNodes[i].innerText ||\n element.childNodes[i].textContent\n ).length;\n while (currentNode.childNodes.length > 0) {\n currentNode = currentNode.childNodes[0];\n }\n\n //calc offset in current node\n if (previousNodeLength) {\n offset -= previousNodeLength;\n }\n //check whether current node has enough length\n if (offset <= currentNodeLength) {\n break;\n }\n }\n //move caret to specified offset\n if (currentNode != null) {\n if (offset > currentNode.length) {\n offset = currentNode.length;\n }\n range.setStart(currentNode, offset);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }, []);\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const KeywordIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M1155.998 494.994v-1H1165v1h-9.002zm3.971-11.125l-.364.616-5.276 8.916-1.11-.625-2.205 2.224-1.776-1 .872-2.975-1.11-.626 5.64-9.532-.888-.5-2.564 4.333-.888-.5 3.077-5.2.888.5.888.5.514-.866 5.329 3.002-1.027 1.733zm-8.886 10.014l1.321-1.566-1.48-.834-.73 1.9.889.5zm3.932-11.649l-4.614 7.799 1.565.882-.677-.381 1.776 1 .888.5 4.615-7.799-3.553-2zm1.026-1.733l-.513.866 3.553 2.002.513-.867-3.553-2z\"\n transform=\"translate(-1149 -479)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default KeywordIcon;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport KeywordIcon from '../../../../../../../../ui/icons/Keyword';\n\nconst StyledTooltip = styled.div<{ top: number; left: number; color?: string }>`\n position: fixed;\n top: ${props => props.top}px;\n left: ${props => props.left}px;\n background: ${props => props.theme.Colors.darkTwo};\n font-size: 13px;\n font-weight: 600;\n height: 42px;\n width: 112px;\n color: ${props => (props.color ? props.color : props.theme.Colors.white)};\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n z-index: 5;\n &::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: black transparent transparent transparent;\n }\n\n &:active {\n opacity: 0.95;\n }\n`;\n\nconst StyledIconContainer = styled.div`\n width: 16px;\n height: 16px;\n margin-right: 8px;\n`;\n\nconst Tooltip: FC<{\n top?: number;\n left?: number;\n label?: string;\n onClick?: (args: any) => void;\n textColor?: string;\n withIcon?: boolean;\n}> = ({ top, left, label, onClick, textColor }) => {\n return (\n <StyledTooltip\n top={top ? top : 0}\n left={left ? left : 0}\n onClick={onClick}\n color={textColor}\n >\n <StyledIconContainer>\n <KeywordIcon />\n </StyledIconContainer>\n\n {label ? label : 'Keyword'}\n </StyledTooltip>\n );\n};\n\nexport default Tooltip;\n","import React, {\n FC,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n RefObject,\n ChangeEvent,\n} from 'react';\nimport styled from 'styled-components';\n\nconst KEYWORDS_CLASS = '__keywords';\n\n//region Styles\nconst StyledContentEditable = styled.div<{\n fontSize: string;\n disabled?: boolean;\n}>`\n text-align: left;\n font-size: ${props => props.fontSize};\n white-space: break-spaces;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: normal;\n letter-spacing: normal;\n margin: 0;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.dark};\n height: 100%;\n .${KEYWORDS_CLASS} {\n color: ${props => props.theme.Colors.softBlue};\n font-weight: bold;\n cursor: pointer;\n display: inline;\n\n &:hover {\n opacity: 0.85;\n }\n &:active {\n opacity: 0.7;\n }\n }\n &[contenteditable='true']:empty:before {\n content: attr(placeholder);\n display: block;\n font-size: 13px;\n color: ${props => props.theme.Colors.cloudyBlue};\n }\n &::placeholder {\n color: ${props => props.theme.Colors.cloudyBlue};\n font-size: 13px;\n }\n`;\n//endregion\n\nexport const ContentEditable: FC<{\n value: string;\n onChange: (value: string) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void;\n onMouseUp?: (event: MouseEvent<HTMLDivElement>) => void;\n onFocus?: (e: FocusEvent<HTMLDivElement>) => void;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n fontSize?: string;\n placeholder?: string;\n disabled?: boolean;\n innerRef?: RefObject<HTMLDivElement>;\n dataTest?: string;\n}> = ({\n value,\n onChange,\n onKeyDown,\n onMouseUp,\n onFocus,\n onClick,\n fontSize,\n placeholder,\n disabled,\n innerRef,\n dataTest\n}) => {\n const handleInput = (event: ChangeEvent<HTMLDivElement>) => {\n if (onChange) {\n onChange(event.target.innerText);\n }\n };\n\n return (\n <StyledContentEditable\n ref={innerRef}\n fontSize={fontSize ? fontSize : '11px'}\n contentEditable={!disabled}\n onInput={handleInput}\n dangerouslySetInnerHTML={{ __html: value }}\n onKeyDown={onKeyDown}\n onMouseUp={onMouseUp}\n placeholder={placeholder}\n onFocus={onFocus}\n onClick={onClick}\n disabled={disabled}\n data-test={dataTest}\n />\n );\n};\n","import React, { FC, useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { Keywords } from '../../../constants/interfaces/Keywords';\nimport {\n useGetSelectionCharacterOffsetWithin,\n useSetCaretPosition,\n} from '../../../features/keywords/hooks';\nimport { ContentEditable } from './ContentEditable';\n\nconst KEYWORDS_CLASS = '__keywords';\n\nconst StyledContainer = styled.div`\n flex: 1;\n height: 100%;\n`;\n\nexport const ContentEditableInput: FC<{\n value: string;\n handleChange?: (value: string, caretPosition: number) => void;\n placeholder?: string;\n max?: number;\n onChange?: any;\n autoFocus?: boolean;\n viewMode?: boolean;\n selections?: Keywords[];\n setSelections?: (keyword: Keywords[]) => void;\n setCreateTooltip?: (arg: any) => void;\n setRemoveTooltip?: (arg: any) => void;\n setKeywordIdToRemove?: (arg: string) => void;\n deleteKeyword?: (id: string) => void;\n recording?: boolean;\n scriptLineId?: number | string;\n className?: string;\n onMouseUp?(ref: any): void;\n dataTest?: string;\n}> = ({\n value,\n handleChange,\n placeholder,\n selections,\n autoFocus,\n viewMode,\n setCreateTooltip,\n setRemoveTooltip,\n setKeywordIdToRemove,\n recording,\n scriptLineId,\n className,\n onMouseUp,\n dataTest\n}) => {\n const textareaRef = useRef<any>(null);\n const [localValue, setLocalValue] = useState(value);\n const [caretPosition, saveCaretPosition] = useState<null | number>(null);\n const setCaretPosition = useSetCaretPosition();\n\n const getSelectionCharacterOffsetWithin = useGetSelectionCharacterOffsetWithin();\n const timeoutRef = useRef<any>(null);\n const selectionRef = useRef<any>(null);\n\n useEffect(() => {\n setLocalValue(value);\n }, [value]);\n\n const handleTextChange = (value: string) => {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n if (setRemoveTooltip) {\n setRemoveTooltip({\n visible: false,\n });\n }\n if (setCreateTooltip) {\n setCreateTooltip({\n visible: false,\n });\n }\n\n const selection = getSelectionCharacterOffsetWithin(\n textareaRef.current\n );\n saveCaretPosition(selection.end);\n\n selectionRef.current = selectionRef.current\n ? selection.end < selectionRef.current\n ? selection.end\n : selectionRef.current\n : selection.end;\n timeoutRef.current = setTimeout(() => {\n setLocalValue(value);\n if (handleChange) {\n handleChange(value, selectionRef.current);\n }\n setCaretPosition(textareaRef.current, selection.end);\n timeoutRef.current = null;\n selectionRef.current = selection.end;\n }, 100);\n };\n\n const handleTextFocus = () => {\n const selection = getSelectionCharacterOffsetWithin(\n textareaRef.current\n );\n selectionRef.current = selection.end;\n };\n\n const handleKeyPress = (event: any) => {\n if (event.key === 'Enter') {\n document.execCommand('insertLineBreak');\n event.preventDefault();\n }\n if (\n event.keyCode === 37 ||\n event.keyCode === 38 ||\n event.keyCode === 39 ||\n event.keyCode === 40\n ) {\n const selection = getSelectionCharacterOffsetWithin(\n textareaRef.current\n );\n selectionRef.current = selection.end;\n }\n };\n\n const selectedValues = selections\n ? selections.map((selection: Keywords) => {\n return [selection.start, selection.end, selection.id];\n })\n : [];\n\n useEffect(() => {\n if (autoFocus) {\n textareaRef.current.focus();\n }\n }, [autoFocus]);\n\n useEffect(() => {\n const handleKeywordClick = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n const selectionRect = e.target.getBoundingClientRect();\n setCreateTooltip && setCreateTooltip({ visible: false });\n setRemoveTooltip &&\n setRemoveTooltip({\n visible: true,\n top: selectionRect.top - 50,\n left: selectionRect.left + selectionRect.width * 0.5 - 56,\n });\n if (setKeywordIdToRemove) {\n setKeywordIdToRemove(e.target.dataset.id);\n }\n };\n\n const keywords = document.getElementsByClassName(\n `${KEYWORDS_CLASS}_${scriptLineId}`\n );\n if (viewMode) {\n for (let keyword of Array.from(keywords)) {\n keyword.removeEventListener('click', handleKeywordClick);\n }\n } else {\n for (let keyword of Array.from(keywords)) {\n keyword.addEventListener('click', handleKeywordClick);\n }\n }\n return () => {\n for (let keyword of Array.from(keywords)) {\n keyword.removeEventListener('click', handleKeywordClick);\n }\n };\n }, [\n setCreateTooltip,\n setKeywordIdToRemove,\n setRemoveTooltip,\n viewMode,\n selections,\n scriptLineId,\n ]);\n\n function renderDetails(data: string): string {\n return selectedValues\n .reduce((str: any, [start, end, id]: any) => {\n str[\n start\n ] = `<span class=\"${KEYWORDS_CLASS} ${KEYWORDS_CLASS}_${scriptLineId}\" data-id=\"${id}\">${str[start]}`;\n str[end] = `${str[end]}</span>`;\n return str;\n }, data.split(''))\n .join('');\n }\n\n useEffect(() => {\n if (caretPosition && textareaRef.current) {\n setCaretPosition(textareaRef.current, caretPosition);\n }\n }, [caretPosition, setCaretPosition]);\n\n return (\n <StyledContainer>\n <ContentEditable\n onKeyDown={handleKeyPress}\n innerRef={textareaRef}\n disabled={viewMode}\n value={renderDetails(localValue)}\n fontSize={recording ? '15px' : '13px'}\n onChange={handleTextChange}\n placeholder={placeholder}\n onMouseUp={() =>\n onMouseUp && !viewMode && onMouseUp(textareaRef)\n }\n onClick={handleTextFocus}\n dataTest={dataTest}\n />\n </StyledContainer>\n );\n};\n\nexport default ContentEditableInput;\n","import React, { FC, useCallback, useEffect, useState } from 'react';\nimport { useGetSelectionCharacterOffsetWithin } from '../../../../../../../../features/keywords/hooks';\nimport Tooltip from './Tooltip';\nimport styled from 'styled-components';\nimport { ClickAwayListener } from '@material-ui/core';\nimport { Keywords } from '../../../../../../../../constants/interfaces/Keywords';\nimport { Variables } from '../../../../../../../../theme/variables';\nimport { useSaveScenarioKeywordsService } from '../../../../../store/services';\nimport ContentEditableInput from '../../../../../../../../ui/components/ContentEditableDiv/ContentEditableDiv';\n\n\nconst StyledContainer = styled.div`\n z-index: 1;\n height: 100%;\n min-height: 62px;\n`;\n\nconst StyledScriptItemTextarea = styled.div`\n height: 100%;\n`;\n\nexport const ScriptItemTextarea: FC<{\n value: string;\n handleValueChange: (text: string) => void;\n viewMode?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n scriptLineKeywords?: Keywords[];\n scriptLineId: number | string;\n recording?: boolean;\n dataTest?: string;\n}> = ({\n value,\n handleValueChange,\n viewMode,\n autoFocus,\n placeholder,\n scriptLineKeywords,\n scriptLineId,\n recording,\n dataTest\n}) => {\n const getSelectionCharacterOffsetWithin = useGetSelectionCharacterOffsetWithin();\n\n const [createToolTip, setCreateTooltip] = useState<{\n visible: boolean;\n top?: number;\n left?: number;\n }>({\n visible: false,\n top: 0,\n left: 0,\n });\n\n const [removeToolTip, setRemoveTooltip] = useState<{\n visible: boolean;\n top?: number;\n left?: number;\n }>({\n visible: false,\n top: 0,\n left: 0,\n });\n\n const [keywords, setKeywords] = useState({ start: 0, end: 0 });\n const [saveKeyword, setSaveKeyword] = useState(false);\n const [removeKeyword, setRemoveKeyword] = useState(false);\n const [keywordIdToRemove, setKeywordIdToRemove] = useState('');\n const [selections, setSelections] = useState<Keywords[]>(\n scriptLineKeywords ? scriptLineKeywords : []\n );\n\n useEffect(() => {\n if (scriptLineKeywords) {\n setSelections(scriptLineKeywords);\n }\n }, [scriptLineKeywords, setSelections]);\n\n const reportSelection = (refs: any) => {\n const selection = getSelectionCharacterOffsetWithin(refs.current);\n if (selection.start === selection.end) {\n return;\n }\n setRemoveTooltip({ visible: false });\n setCreateTooltip({\n visible: true,\n top: selection.selectionRect.top - 50,\n left:\n selection.selectionRect.left +\n selection.selectionRect.width * 0.5 -\n 56,\n });\n setKeywords({ start: selection.start, end: selection.end - 1 });\n };\n\n const clearSelection = () => {\n const doc: any = document;\n const win: any = window;\n if (doc.selection) {\n doc.selection.empty();\n } else if (window.getSelection()) {\n win.getSelection().removeAllRanges();\n }\n };\n\n const handleModifyText = (text: string, caretPosition: number) => {\n if (viewMode) {\n return false;\n }\n const valueLength = text.length;\n const valueDiff = text.length - value.length;\n handleValueChange(text);\n let updatedSelections = [...selections];\n updatedSelections = updatedSelections.filter(selection => {\n return selection.end < valueLength;\n });\n updatedSelections = updatedSelections.filter(selection => {\n return (\n caretPosition < selection.start || caretPosition > selection.end\n );\n });\n\n updatedSelections = updatedSelections.map(selection => {\n if (selection.start >= caretPosition) {\n const start = selection.start + valueDiff;\n const end = selection.end + valueDiff;\n return { start: start, end: end, id: `${start}-${end}` };\n } else {\n return selection;\n }\n });\n setSelections(updatedSelections);\n };\n\n const handleAddKeyword = (id: string, start: number, end: number) => {\n let newSelections: Keywords[] = [...selections];\n let startIndex = start;\n let endIndex = end;\n const selectionConflict = selections.filter((selection: Keywords) => {\n return (\n (start >= selection.start && start <= selection.end) ||\n (end >= selection.start && end <= selection.end) ||\n (selection.end <= end && selection.start >= start)\n );\n });\n\n if (selectionConflict.length > 0) {\n for (let conflict of selectionConflict) {\n startIndex = Math.min(startIndex, conflict.start);\n endIndex = Math.max(endIndex, conflict.end);\n newSelections = newSelections.filter(\n selection => selection.id !== conflict.id\n );\n }\n }\n\n newSelections.push({ start: startIndex, end: endIndex, id: id });\n setSelections(newSelections);\n setSaveToScenario(true);\n };\n\n const handleRemoveKeyword = useCallback(\n (id: string) => {\n setSelections(\n selections.filter((selection: any) => {\n return selection.id !== id;\n })\n );\n },\n [selections]\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleToggleKeyword = (start: number, end: number) => {\n const findSelection = selections.filter(\n (selection: any) => selection.id === `${start}-${end}`\n );\n if (findSelection[0]) {\n handleRemoveKeyword(`${start}-${end}`);\n } else {\n handleAddKeyword(`${start}-${end}`, start, end);\n }\n };\n\n useEffect(() => {\n if (saveKeyword) {\n handleToggleKeyword(keywords.start, keywords.end);\n setSaveKeyword(false);\n }\n }, [keywords, saveKeyword, selections, handleToggleKeyword]);\n\n useEffect(() => {\n if (removeKeyword) {\n handleRemoveKeyword(keywordIdToRemove);\n setSaveToScenario(true);\n setRemoveKeyword(false);\n }\n }, [keywordIdToRemove, removeKeyword, selections, handleRemoveKeyword]);\n\n // Handle case when deleting text to remove keywords that would exceed the boundaries\n useEffect(() => {\n const newSelections = [...selections].filter((selection: Keywords) => {\n return selection.end <= value.length;\n });\n if (newSelections.length !== selections.length) {\n setSelections(newSelections);\n setSaveToScenario(true);\n }\n }, [value, selections, setSelections]);\n\n const saveScenarioKeyword = useSaveScenarioKeywordsService();\n const [saveToScenario, setSaveToScenario] = useState(false);\n\n useEffect(() => {\n if (saveToScenario) {\n saveScenarioKeyword(selections, scriptLineId);\n setSaveToScenario(false);\n }\n }, [\n selections,\n saveScenarioKeyword,\n scriptLineId,\n saveToScenario,\n setSaveToScenario,\n ]);\n\n return (\n <ClickAwayListener\n onClickAway={() => {\n setCreateTooltip({ visible: false });\n setRemoveTooltip({ visible: false });\n }}\n >\n <StyledContainer>\n {createToolTip.visible && (\n <Tooltip\n top={createToolTip.top}\n left={createToolTip.left}\n onClick={() => {\n setCreateTooltip({ visible: false });\n setSaveKeyword(true);\n clearSelection();\n }}\n />\n )}\n {removeToolTip.visible && (\n <Tooltip\n top={removeToolTip.top}\n left={removeToolTip.left}\n onClick={() => {\n setRemoveTooltip({ visible: false });\n setRemoveKeyword(true);\n clearSelection();\n }}\n textColor={Variables.Colors.softBlue}\n />\n )}\n <StyledScriptItemTextarea>\n <ContentEditableInput\n value={value}\n selections={selections}\n setSelections={setSelections}\n handleChange={(text, caretPosition) =>\n handleModifyText(text, caretPosition)\n }\n viewMode={viewMode}\n deleteKeyword={handleRemoveKeyword}\n autoFocus={autoFocus}\n setCreateTooltip={setCreateTooltip}\n setRemoveTooltip={setRemoveTooltip}\n setKeywordIdToRemove={setKeywordIdToRemove}\n placeholder={placeholder}\n recording={recording}\n scriptLineId={scriptLineId}\n onMouseUp={reportSelection}\n dataTest={dataTest}\n />\n </StyledScriptItemTextarea>\n </StyledContainer>\n </ClickAwayListener>\n );\n};\n\nexport default ScriptItemTextarea;\n","import React, { createContext, FC } from 'react';\nimport styled from 'styled-components';\n\nconst CommentInner = styled.div<{ reverse?: boolean }>`\n display: flex;\n flex: 1;\n flex-direction: ${props => (props.reverse ? 'row-reverse' : 'row')};\n`;\n\nexport const CommentContext = createContext<{\n reverse?: boolean;\n disabled?: boolean;\n background?: string;\n}>({\n reverse: false,\n disabled: false,\n});\nconst CommentProvider = CommentContext.Provider;\n\nexport const Comment: FC<{\n className?: string;\n reverse?: boolean;\n disabled?: boolean;\n background?: string;\n}> = ({ children, className, reverse, disabled, background }) => {\n return (\n <CommentInner className={className} reverse={reverse}>\n <CommentProvider\n value={{\n reverse: reverse,\n disabled: disabled,\n background: background,\n }}\n >\n {children}\n </CommentProvider>\n </CommentInner>\n );\n};\n","import React, { FC, useContext } from 'react';\nimport styled from 'styled-components';\nimport { CommentContext } from './Comment';\nimport { Variables } from '../../../../theme/variables';\n\nconst Body = styled.div<{ reverse?: boolean; background: string }>`\n flex: 1;\n position: relative;\n background: ${props => props.background};\n border-top-right-radius: ${props => (props.reverse ? '0' : '8px')};\n border-top-left-radius: ${props => (props.reverse ? '8px' : '0')};\n border-bottom-right-radius: ${props => (props.reverse ? '16px' : '8px')};\n border-bottom-left-radius: ${props => (props.reverse ? '8px' : '16px')};\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n flex-direction: column;\n word-break: break-word;\n overflow: hidden;\n`;\n\nconst Blacker = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n`;\n\nexport const CommentBody: FC<{ className?: string }> = ({\n children,\n className,\n}) => {\n const params = useContext(CommentContext);\n\n return (\n <Body\n reverse={params.reverse}\n background={\n params.background ? params.background : Variables.Colors.white\n }\n className={className}\n >\n {params.disabled && <Blacker />}\n {children}\n </Body>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Actions = styled.div`\n display: flex;\n padding: 8px 24px 16px 24px;\n`;\n\nexport const CommentTools: FC<{\n className?: string;\n}> = ({ children, className }) => (\n <Actions className={className}>{children}</Actions>\n);\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Title = styled.div`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n margin-bottom: 8px;\n`;\n\nexport const CommentTitle: FC<{\n className?: string;\n dataTest?: string;\n}> = ({ children, className, dataTest }) => (\n <Title className={className} data-test={dataTest}>{children}</Title>\n);\n","import React, { FC, MouseEvent, useContext } from 'react';\nimport styled from 'styled-components';\n\nimport { CommentContext } from './Comment';\n\n//region Styles\nconst Description = styled.div<{\n reverse?: boolean;\n disabled?: boolean;\n}>`\n padding: 16px 32px 12px 24px;\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nconst StyledRemoveIcon = styled.div`\n font-size: 11px;\n color: ${props => props.theme.Colors.fadedRed};\n user-select: none;\n position: absolute;\n cursor: pointer;\n right: 16px;\n top: 16px;\n font-weight: bold;\n &:hover {\n opacity: 0.8;\n }\n &:active {\n opacity: 0.7;\n }\n`;\n//endregion\n\nexport const CommentDescription: FC<{\n reverse?: boolean;\n onDelete?: (e: MouseEvent<HTMLDivElement>) => void;\n hideRemoveIcon?: boolean;\n dataTest?: string;\n}> = ({ children, onDelete, hideRemoveIcon, dataTest }) => {\n const params = useContext(CommentContext);\n\n return (\n <Description reverse={!params.reverse} disabled={params.disabled}>\n {!hideRemoveIcon && (\n <StyledRemoveIcon onClick={onDelete} data-test={dataTest}>Delete</StyledRemoveIcon>\n )}\n {children}\n </Description>\n );\n};\n","import React, { FC, useContext } from 'react';\nimport styled from 'styled-components';\nimport { CommentContext } from './Comment';\n\nconst Avatar = styled.div<{ disabled?: boolean }>`\n width: 28px;\n height: 28px;\n opacity: ${props => (props.disabled ? 0.4 : 1)};\n margin: 0 8px;\n`;\n\nconst AvatarImage = styled.img<{ disabled?: boolean }>`\n height: 100%;\n width: 100%;\n opacity: ${props => (props.disabled ? 0.4 : 1)};\n`;\n\nexport const CommentAvatar: FC<{\n image?: string;\n}> = ({ children, image }) => {\n const params = useContext(CommentContext);\n\n if (image) {\n return (\n <Avatar disabled={params.disabled}>\n <AvatarImage src={image} alt=\"company\" />\n </Avatar>\n );\n }\n return <Avatar disabled={params.disabled}>{children}</Avatar>;\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Save = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 12 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path\n fill=\"#73BBE5\"\n stroke=\"#73BBE5\"\n strokeWidth=\".5\"\n d=\"M1 11V1h10v10H1zm7.5-9.375h-5V4.75h5V1.625zm1.875 0h-1.25v3.75h-6.25v-3.75h-1.25v8.75h8.75v-8.75zm-3.125 2.5h-.625V2.25h.625v1.875z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Save;\n","import styled from \"styled-components\";\nimport { ReactMic } from \"@cleandersonlobo/react-mic\";\n\n//region Styles\nexport const StyledScriptPlayingAudioAction = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-radius: 4px;\n overflow: hidden;\n height: 48px;\n`;\n\nexport const StyledPlayingAudioButton = styled.div`\n height: 100%;\n background: ${props => props.theme.Colors.darkTwo};\n display: flex;\n justify-content: center;\n align-items: flex-end;\n padding: 16px;\n`;\n\nexport const StyledButton = styled.div`\n font-size: 11px;\n display: flex;\n justify-content: center;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const IconContainer = styled.div`\n width: 14px;\n height: 14px;\n color: ${props => props.theme.Colors.darkSkyBlue};\n margin-right: 8px;\n`;\n\nexport const ButtonText = styled.div`\n color: ${props => props.theme.Colors.darkSkyBlue};\n font-size: 11px;\n font-weight: 600;\n`;\n\nexport const StyledReactMicContainer = styled.div`\n height: 100%;\n flex: 1;\n padding-left: 16px;\n background: ${props => props.theme.Colors.darkTwo};\n`;\n\nexport const StyledReactMic = styled(ReactMic)`\n height: 100%;\n width: 100%;\n`;\n//endregion","import { FC } from 'react';\nimport { ClickAwayListener } from '@material-ui/core';\n\nimport { Variables } from '../../../theme/variables';\nimport { useShowMessage } from '../ErrorMessages/ErrorMessages';\nimport Save from '../../icons/Save';\nimport {\n ButtonText,\n IconContainer,\n StyledButton,\n StyledPlayingAudioButton,\n StyledReactMic,\n StyledReactMicContainer,\n StyledScriptPlayingAudioAction,\n} from './style';\nimport { AudioRecorderProps } from './type';\n\nconst AudioRecorder: FC<AudioRecorderProps> = ({\n record,\n onClickAway,\n onSave,\n onStop,\n onData,\n backgroundColor,\n strokeColor,\n}) => {\n const showMessage = useShowMessage();\n\n const handleNoPermission = () => {\n onStop(null);\n showMessage('Microphone permission has been denied', 'error');\n };\n\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(\n stream => {\n stream.getTracks().forEach(function (track) {\n track.stop();\n });\n },\n () => {\n handleNoPermission();\n }\n );\n\n return (\n <ClickAwayListener onClickAway={onClickAway}>\n <StyledScriptPlayingAudioAction>\n <StyledReactMicContainer>\n <StyledReactMic\n record={record}\n className=\"sound-wave\"\n onStop={onStop}\n onData={onData}\n mimeType={'audio/mp3'}\n strokeColor={\n strokeColor\n ? strokeColor\n : Variables.Colors.softBlue\n }\n backgroundColor={\n backgroundColor\n ? backgroundColor\n : Variables.Colors.darkTwo\n }\n />\n </StyledReactMicContainer>\n <StyledPlayingAudioButton>\n <StyledButton onClick={onSave}>\n <IconContainer>\n <Save />\n </IconContainer>\n <ButtonText>Save</ButtonText>\n </StyledButton>\n </StyledPlayingAudioButton>\n </StyledScriptPlayingAudioAction>\n </ClickAwayListener>\n );\n};\n\nexport default AudioRecorder;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PauseCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7.5\" stroke=\"#4AA9E2\"/>\n <path d=\"M6 5.267c0-.207.222-.335.397-.229l4.476 2.733a.27.27 0 0 1 0 .458l-4.476 2.732A.262.262 0 0 1 6 10.733V5.267z\" fill=\"#4AA9E2\"/>\n </svg>\n );\n }\n);\n\nexport default PauseCircle;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PauseCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7.5\" stroke=\"#4AA9E2\"/>\n <path d=\"M6 5v6M10 5v6\" stroke=\"#4AA9E2\" stroke-linecap=\"round\"/>\n </svg>\n );\n }\n);\n\nexport default PauseCircle;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const StopCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7.5\" stroke=\"#4AA9E2\"/>\n <rect x=\"5\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" fill=\"#4AA9E2\"/>\n </svg>\n );\n }\n);\n\nexport default StopCircle;\n","import styled from 'styled-components';\n\nexport const StyledAudioPlayer = styled.div<{ color: string }>`\n width: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 16px;\n`;\n\nexport const StyledActionPanel = styled.div`\n display: flex;\n padding: 0;\n justify-content: space-between;\n align-items: center;\n margin-top: 4px;\n`;\n\nexport const StyledActionButtons = styled.div`\n display: flex;\n`;\n\nexport const StyledButton = styled.div`\n width: 16px;\n height: 16px;\n cursor: pointer;\n\n &:last-child {\n margin-left: 8px;\n }\n`;\n\nexport const AudioDuration = styled.div`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 13px;\n`;\n\nexport const StyledAudioWrapper = styled.div`\n display: flex;\n justify-content: center;\n padding: 4px 0;\n`;\n\nexport const StyledAudioLine = styled.div`\n width: 100%;\n height: 8px;\n border-radius: 12px;\n border: solid 1px ${props => props.theme.Colors.cloudyBlue};\n background: ${props => props.theme.Colors.whiteFive};\n cursor: pointer;\n position: relative;\n`;\n\nexport const StyledLine = styled.div<{ active: number | null }>`\n width: ${props => (props.active ? `${props.active}%` : 0)};\n max-width: 100%;\n position: absolute;\n top: -1px;\n bottom: -1px;\n border-radius: 12px;\n border: solid 1px ${props => props.theme.Colors.darkSkyBlue};\n background: ${props => props.theme.Colors.darkSkyBlueTwo15Full};\n`;\n","import React from 'react';\n\nimport { Variables } from '../../../theme/variables';\nimport { secondsToMinFormatted } from '../../../helpers/functions/convert-time';\nimport PlayCircle from '../../icons/PlayCircle';\nimport PauseCircle from '../../icons/PauseCircle';\nimport StopCircle from '../../icons/StopCircle';\nimport {\n AudioDuration,\n StyledActionButtons,\n StyledActionPanel,\n StyledAudioLine,\n StyledAudioPlayer,\n StyledAudioWrapper,\n StyledButton,\n StyledLine,\n} from './style';\nimport { AudioPlayerInterface } from './type';\n\nexport class AudioPlayer extends React.Component<AudioPlayerInterface> {\n state = {\n duration: this.props.duration,\n current: null,\n isPaused: false,\n };\n\n _isMounted = false;\n audio: any;\n customAudioUiPlayer: any;\n slider: any;\n currentTimeInterval: any;\n\n handlePlay = () => {\n this.audio.play();\n };\n\n handlePause = () => {\n this.audio.pause();\n };\n\n handleStop = () => {\n if (!this._isMounted) return;\n this.audio.currentTime = 0;\n this.slider.value = 0;\n this.setState({\n current: 0,\n });\n this.audio.pause();\n if (this.props.onStop) {\n this.props.onStop();\n }\n };\n\n handleRewind = (time?: number) => {\n if (!time) return;\n this.audio.currentTime = time;\n this.audio.play();\n };\n\n getCurrentAudioClickDuration = (e: any) => {\n if (!this.audio) return;\n const clickPosition = e.clientX - this.getSliderLeftPosition();\n const totalWidth = this.getSliderTotalWidth();\n const clickFraction = (clickPosition / totalWidth).toFixed(2);\n\n return this.state.duration * Number(clickFraction);\n };\n\n getSliderLeftPosition = () => {\n return this.customAudioUiPlayer.getBoundingClientRect().left;\n };\n\n getSliderTotalWidth = () => {\n return this.customAudioUiPlayer.getBoundingClientRect().width;\n };\n\n componentDidMount = () => {\n this._isMounted = true;\n\n this.slider.value = 0;\n this.currentTimeInterval = null;\n if (this.props.autoPlay) {\n this.audio.play();\n }\n this.audio.onplay = () => {\n this.currentTimeInterval = setInterval(() => {\n if (this.audio) {\n this.slider.value = this.audio.currentTime;\n this.setState({\n current:\n (this.audio.currentTime * 100) /\n this.state.duration,\n });\n }\n }, 500);\n this.setState({ isPaused: false });\n };\n\n this.audio.onpause = () => {\n if (!this._isMounted) return;\n this.setState({ isPaused: true });\n clearInterval(this.currentTimeInterval);\n }\n\n this.audio.onended = () => {\n this.setState({\n current: 100,\n isPaused: true,\n });\n if (this.props.goNext) {\n this.props.goNext();\n }\n clearInterval(this.currentTimeInterval);\n };\n\n this.slider.onchange = (e: any) => {\n clearInterval(this.currentTimeInterval);\n this.audio.currentTime = e.target.value;\n };\n };\n\n componentWillUnmount() {\n this._isMounted = false;\n }\n\n render() {\n const src = this.props.audio;\n\n return (\n <StyledAudioPlayer\n color={\n this.props.color\n ? this.props.color\n : Variables.Colors.softBlue\n }\n >\n <audio\n ref={audio => {\n this.audio = audio;\n }}\n src={src}\n />\n <StyledAudioWrapper>\n <StyledAudioLine\n ref={customAudioPlayer => {\n this.customAudioUiPlayer = customAudioPlayer;\n }}\n onClick={e =>\n this.handleRewind(\n this.getCurrentAudioClickDuration(e)\n )\n }\n >\n <StyledLine\n ref={slider => {\n this.slider = slider;\n }}\n active={this.state.current}\n />\n </StyledAudioLine>\n </StyledAudioWrapper>\n <StyledActionPanel>\n <StyledActionButtons>\n {\n this.state.isPaused\n ? <StyledButton onClick={this.handlePlay}><PlayCircle /></StyledButton>\n : <StyledButton onClick={this.handlePause}><PauseCircle /></StyledButton>\n }\n <StyledButton onClick={this.handleStop}><StopCircle /></StyledButton>\n </StyledActionButtons>\n <AudioDuration>\n {secondsToMinFormatted(\n this.audio && this.audio.currentTime\n )}\n </AudioDuration>\n </StyledActionPanel>\n </StyledAudioPlayer>\n );\n }\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Generate = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 13 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path d=\"M6.625 0v12h-1V0h1zM8.5 1.688V10.5h-1V1.687h1zm-5.625 0V10.5h-1V1.687h1zM4.75 2.813v6.485h-1V2.812h1zm5.625 1.312v3.75h-1v-3.75h1zm1.875.375v3h-1v-3h1zM1 4.5v3H0v-3h1z\" />\n </g>\n </svg>\n );\n }\n);\n\nexport default Generate;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Record = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 12 12\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <circle\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n cx=\"30\"\n cy=\"116\"\n r=\"6\"\n transform=\"translate(-24 -110)\"\n />\n </svg>\n );\n }\n);\n\nexport default Record;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Play = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 7\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"currentColor\" fillRule=\"evenodd\">\n <path d=\"M12.5 7h-9C1.567 7 0 5.433 0 3.5S1.567 0 3.5 0 7 1.567 7 3.5c0 .98-.406 1.865-1.056 2.5h4.112C9.406 5.365 9 4.48 9 3.5 9 1.567 10.567 0 12.5 0S16 1.567 16 3.5 14.433 7 12.5 7zM6 3.5C6 2.119 4.88 1 3.5 1S1 2.119 1 3.5C1 4.88 2.12 6 3.5 6S6 4.88 6 3.5zM12.5 1C11.12 1 10 2.12 10 3.5 10 4.881 11.12 6 12.5 6 13.881 6 15 4.881 15 3.5S13.881 1 12.5 1z\" />\n </g>\n </svg>\n );\n }\n);\n\nexport default Play;\n","export const DEFAULT_CUSTOMER_VOICE_ID = 'EXAVITQu4vr4xnSDxMaL';\nexport const DEFAULT_CUSTOMER_VOICE_STABILITY = 0.4;\nexport const DEFAULT_CUSTOMER_VOICE_SIMILARITY = 0.65;\n\nexport const DEFAULT_REP_VOICE_ID = 'flq6f7yk4E4fJM5XTYuZ';\nexport const DEFAULT_REP_VOICE_STABILITY = 0.4;\nexport const DEFAULT_REP_VOICE_SIMILARITY = 0.65;","import { TextToSpeechSettings, TextToSpeechSettingsByRoles } from '../../constants/interfaces/CompanyVoiceSettings';\nimport {\n DEFAULT_CUSTOMER_VOICE_ID,\n DEFAULT_CUSTOMER_VOICE_SIMILARITY,\n DEFAULT_CUSTOMER_VOICE_STABILITY,\n DEFAULT_REP_VOICE_ID,\n DEFAULT_REP_VOICE_SIMILARITY,\n DEFAULT_REP_VOICE_STABILITY,\n} from './constants';\n\nexport const getTextToSpeechSettingsOrDefault = (settings?: TextToSpeechSettings[]): TextToSpeechSettingsByRoles => {\n const customer = settings?.find(item => item.role === 'customer') ?? {\n role: 'customer',\n voiceId: DEFAULT_CUSTOMER_VOICE_ID,\n stability: DEFAULT_CUSTOMER_VOICE_STABILITY,\n similarityBoost: DEFAULT_CUSTOMER_VOICE_SIMILARITY,\n } as TextToSpeechSettings;\n const representative = settings?.find(item => item.role === 'representative') ?? {\n role: 'representative',\n voiceId: DEFAULT_REP_VOICE_ID,\n stability: DEFAULT_REP_VOICE_STABILITY,\n similarityBoost: DEFAULT_REP_VOICE_SIMILARITY,\n } as TextToSpeechSettings;\n return { customer, representative };\n}","import { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../../../../../constants/interfaces/ScriptLine';\nimport styled from 'styled-components';\nimport { Dispatch } from 'redux';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../../UserProfile/store/reducers';\nimport { UserProfile } from '../../../../../../../../constants/interfaces/User';\nimport {\n useDeleteScriptLineService,\n useModifyScriptTextService,\n useUploadScenarioAudioService,\n} from '../../../../../store/services';\nimport {\n useClearVoiceService,\n useTextToSpeechService,\n} from '../../../../../../../../features/textToSpeech/store/services';\nimport { useVoiceGenerationState } from '../../../../../../../../features/textToSpeech/store/states';\nimport { findItem } from '../../../../../../../../tools/ramda';\nimport { getCompanyState } from '../../../../../../../CompanySettings/store/reducers';\nimport { CompanyInterface } from '../../../../../../../../constants/interfaces/Company';\nimport { CompanyVoiceSettings } from '../../../../../../../../constants/interfaces/CompanyVoiceSettings';\nimport {\n AudioInterface,\n getAudioState,\n} from '../../../../../../../../features/player/store/reducers';\nimport {\n useGoNextService,\n usePlayAudioService,\n useResetAudioService,\n useStartAudioRecordingService,\n useStopAudioRecordingService,\n useStopAudioService,\n} from '../../../../../../../../features/player/store/services';\nimport { useCompanyVoiceSettingsState } from '../../../../../../../CompanySettings/store/states';\nimport ScriptItemTextarea from '../ScriptItemTextArea/ScriptItemTextArea';\nimport { Button } from '../../../../../../../../ui/components/Button';\nimport {\n Comment,\n CommentBody,\n CommentDescription,\n CommentTitle,\n CommentTools,\n} from '../../../../../../../../ui/components/Comment';\nimport AudioRecorder from '../../../../../../../../ui/components/AudioRecorder/AudioRecorder';\nimport { AudioPlayer } from '../../../../../../../../ui/components/AudioPlayer/AudioPlayer';\nimport Generate from '../../../../../../../../ui/icons/Generate';\nimport Record from '../../../../../../../../ui/icons/Record';\nimport Play from '../../../../../../../../ui/icons/Play';\nimport { useShowConfirmModalDialog } from '../../../../../../../../ui/components/ModalDialogs/store/actions';\nimport { getTextToSpeechSettingsOrDefault } from '../../../../../../../../features/textToSpeech/helpers';\n\nconst StyledScriptItem = styled.div`\n width: 100%;\n`;\n\nconst StyledButton = styled(Button)`\n margin-right: 8px;\n font-size: 11px;\n font-weight: 600;\n`;\n\nconst StyledScriptAction = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n`;\n\nconst StyledAudioSection = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\n\nconst StyledTextarea = styled(ScriptItemTextarea)`\n color: ${props => props.theme.Colors.blackTwo};\n`;\n\nconst DisabledArea = styled.div`\n position: absolute;\n height: 100%;\n background: transparent;\n width: 100%;\n`;\n\nconst ScriptItem: FC<{\n script: ScriptLine;\n handleScriptLineDelete: any;\n handleScriptTextModify: (\n value: string,\n id: number | string\n ) => void;\n handleUploadAudio: (\n file: any,\n associatedEntityId: number | string,\n filename?: string\n ) => any;\n profile?: UserProfile;\n company: CompanyInterface;\n player: AudioInterface;\n handlePlayAudio: (scriptLineId: number | string) => void;\n handleStopAudio: (scriptLineId: number | string) => void;\n handleStartRecording: (scriptLineId: number | string) => void;\n handleStopRecording: () => void;\n handleGoNext: () => void;\n handleResetPlaylist: () => void;\n disabled: boolean;\n editable: boolean;\n dispatch: Dispatch;\n voiceSettings?: CompanyVoiceSettings[];\n}> = ({\n script,\n handleScriptLineDelete,\n handleScriptTextModify,\n handleUploadAudio,\n editable,\n player,\n handlePlayAudio,\n handleStopAudio,\n handleGoNext,\n handleResetPlaylist,\n handleStartRecording,\n handleStopRecording,\n voiceSettings,\n}) => {\n const textToSpeech = useTextToSpeechService();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const clearAudio = useClearVoiceService();\n const voice = useVoiceGenerationState().scenarios;\n const generatingAudio = voice && voice.generating;\n const loadingAudio = !!(\n voice &&\n voice.data &&\n findItem(voice.data, 'id', script.id)\n );\n const voiceData =\n voice &&\n voice.data &&\n findItem(voice.data, 'id', script.id) &&\n findItem(voice.data, 'id', script.id).voice;\n\n const [record, setRecord] = useState({ state: false, open: false });\n const [save, setSave] = useState(false);\n const [audio, setAudio] = useState<any>({});\n const disabled =\n (!!player.recording && player.recording !== script.id) ||\n generatingAudio;\n const isRepSpeaker = script.speaker === ScriptLineSpeaker.REP;\n\n useEffect(() => {\n return () => {\n handleClickAway();\n };\n // eslint-disable-next-line\n }, []);\n\n useEffect(() => {\n if (save) {\n if (audio) {\n handleUploadAudio(audio, script.id).then(\n (result: string) => {\n if (generatingAudio) {\n clearAudio({\n feature: 'scenarios',\n itemId: script.id,\n });\n }\n }\n );\n }\n }\n // eslint-disable-next-line\n }, [audio]);\n\n const startRecording = (): void => {\n handleResetPlaylist();\n setTimeout(() => {\n handleStartRecording(script.id);\n setRecord({ open: true, state: true });\n }, 100);\n };\n\n const generateAudio = () => {\n const settingsOrDefault = getTextToSpeechSettingsOrDefault(voiceSettings);\n const settings = script.speaker === ScriptLineSpeaker.CUSTOMER\n ? settingsOrDefault.customer\n : settingsOrDefault.representative;\n\n handleResetPlaylist();\n textToSpeech(\n script.text,\n settings,\n { feature: 'scenarios', itemId: script.id }\n );\n };\n\n useEffect(() => {\n if (voiceData) {\n setSave(true);\n setAudio(voiceData);\n }\n }, [voiceData]);\n\n const saveRecording = (): void => {\n setSave(true);\n setRecord({ ...record, state: false });\n };\n\n const handleClickAway = (): void => {\n setSave(false);\n setRecord({ ...record, state: false });\n };\n\n const handleStop = (audio: any) => {\n setAudio(audio.blob);\n handleStopRecording();\n setRecord({ state: false, open: false });\n };\n\n const startPlayingAudio = (): void => {\n handleResetPlaylist();\n handlePlayAudio(script.id);\n };\n\n const myRef = useRef<any>(null);\n\n const onHandleGoNext = () => {\n if (player.status === 'playlist' && myRef.current) {\n myRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n handleGoNext();\n }\n };\n\n const handleRemoveItem = useCallback(() => {\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description: 'Are you sure you want to delete the line?',\n onConfirm: () => handleScriptLineDelete(script.id),\n });\n }, [handleScriptLineDelete, script.id, showConfirmationModalDialog]);\n\n return (\n <>\n <StyledScriptItem ref={myRef}>\n <Comment\n reverse={isRepSpeaker}\n disabled={disabled || generatingAudio}\n >\n <CommentBody>\n <CommentDescription\n hideRemoveIcon={!editable}\n onDelete={handleRemoveItem}\n dataTest={\n isRepSpeaker\n ? 'delete-scenario-rep-line'\n : 'delete-scenario-customer-line'\n }\n >\n {(!editable || disabled) && <DisabledArea />}\n <CommentTitle>\n {isRepSpeaker ? 'Rep' : 'Customer'}\n </CommentTitle>\n <StyledTextarea\n handleValueChange={(value: string) =>\n handleScriptTextModify(value, script.id)\n }\n scriptLineId={script.id}\n scriptLineKeywords={script.keywords}\n value={script.text}\n autoFocus={!script.text}\n viewMode={!editable || disabled}\n recording={\n !!player.recording &&\n player.recording === script.id\n }\n placeholder={\n isRepSpeaker\n ? 'Write representative’s line here'\n : 'Write customer’s line here'\n }\n dataTest={\n isRepSpeaker\n ? 'scenario-rep-line-input'\n : 'scenario-customer-line-input'\n }\n />\n </CommentDescription>\n <CommentTools>\n {!record.open && player.current !== script.id && (\n <StyledScriptAction>\n <StyledAudioSection>\n {editable && (\n <StyledButton\n label=\"Record Audio\"\n action={startRecording}\n iconRender={<Record />}\n color=\"warning\"\n variant=\"transparent\"\n buttonSize={12}\n width={'90px'}\n dataTest={\n isRepSpeaker\n ? 'record-scenario-rep-line-audio'\n : 'record-scenario-customer-line-audio'\n }\n />\n )}\n {editable && script.text.length > 0 && (\n <StyledButton\n label=\"Generate Audio\"\n iconRender={<Generate />}\n action={generateAudio}\n variant=\"transparent\"\n loading={loadingAudio}\n buttonSize={14}\n dataTest={\n isRepSpeaker\n ? 'generate-scenario-rep-line-audio'\n : 'generate-scenario-customer-line-audio'\n }\n />\n )}\n {script.audioUrl && (\n <StyledButton\n label=\"Play\"\n iconRender={<Play />}\n action={startPlayingAudio}\n variant=\"transparent\"\n buttonSize={14}\n width={'40px'}\n dataTest={\n isRepSpeaker\n ? 'play-scenario-rep-line'\n : 'play-scenario-customer-line'\n }\n />\n )}\n </StyledAudioSection>\n </StyledScriptAction>\n )}\n {record.open && (\n <AudioRecorder\n record={record.state}\n onClickAway={handleClickAway}\n onStop={handleStop}\n onSave={saveRecording}\n />\n )}\n {player.current === script.id && (\n <AudioPlayer\n audio={script.audioUrl}\n duration={\n script.duration ? script.duration : 10\n }\n onStop={() => handleStopAudio(script.id)}\n autoPlay={true}\n goNext={onHandleGoNext}\n />\n )}\n </CommentTools>\n </CommentBody>\n </Comment>\n </StyledScriptItem>\n </>\n );\n};\n\nexport const ScriptItemContainer: FC<{\n script: ScriptLine;\n disabled: boolean;\n editable: boolean;\n}> = ({ script, disabled, editable }) => {\n const dispatch = useDispatch();\n\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n const player = useSelector(getAudioState);\n\n const resetPlaylist = useResetAudioService();\n const goNext = useGoNextService();\n const playAudio = usePlayAudioService();\n const stopAudio = useStopAudioService();\n const startRecording = useStartAudioRecordingService();\n const stopRecording = useStopAudioRecordingService();\n\n const deleteScriptLine = useDeleteScriptLineService();\n const modifyScriptText = useModifyScriptTextService();\n\n const uploadScenarioAudio = useUploadScenarioAudioService();\n const voiceSettings = useCompanyVoiceSettingsState();\n\n return (\n <ScriptItem\n script={script}\n handleScriptLineDelete={deleteScriptLine}\n handleScriptTextModify={modifyScriptText}\n handleUploadAudio={uploadScenarioAudio}\n profile={profile}\n company={company}\n player={player}\n handlePlayAudio={playAudio}\n handleStopAudio={stopAudio}\n handleStartRecording={startRecording}\n handleStopRecording={stopRecording}\n handleGoNext={goNext}\n handleResetPlaylist={resetPlaylist}\n voiceSettings={voiceSettings.data}\n disabled={disabled}\n editable={editable}\n dispatch={dispatch}\n />\n );\n};\n\nexport default ScriptItemContainer;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Drag = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 11 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\">\n <g>\n <g transform=\"translate(-1368 -472) translate(1368 472) translate(6.4)\">\n <circle cx=\"1.6\" cy=\"1.6\" r=\"1.6\" />\n <circle cx=\"1.6\" cy=\"8\" r=\"1.6\" />\n <circle cx=\"1.6\" cy=\"14.4\" r=\"1.6\" />\n </g>\n <g transform=\"translate(-1368 -472) translate(1368 472)\">\n <circle cx=\"1.6\" cy=\"1.6\" r=\"1.6\" />\n <circle cx=\"1.6\" cy=\"8\" r=\"1.6\" />\n <circle cx=\"1.6\" cy=\"14.4\" r=\"1.6\" />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Drag;\n","import React, { FC, useContext, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../../../../../constants/interfaces/ScriptLine';\nimport ScriptItem from '../ScriptItem/ScriptItem';\nimport {\n DragDropContext,\n Draggable,\n Droppable,\n DropResult,\n} from 'react-beautiful-dnd';\nimport { useUpdateScriptLineService } from '../../../../../store/services';\nimport { useSelector } from 'react-redux';\nimport {\n AudioInterface,\n getAudioState,\n} from '../../../../../../../../features/player/store/reducers';\nimport {\n EditModeContext,\n ScenarioContainerContext,\n} from '../../../../../NewScenario';\nimport { EditModeValues } from '../../../../../../../../constants/enums/EditModeValues';\nimport Drag from '../../../../../../../../ui/icons/Drag';\n\n\nconst StyledScriptLineContent = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst StyledDroppableContainer = styled.div<{ isDraggingOver: boolean }>``;\n\nconst StyledScriptHandle = styled.div<{ reverse?: boolean; hidden?: boolean }>`\n color: #b1c0cb;\n display: flex;\n flex-shrink: 0;\n width: 11px;\n align-items: center;\n height: 30px;\n margin-left: ${props => (props.reverse ? 29 : 8)}px;\n margin-right: ${props => (props.reverse ? 8 : 29)}px;\n visibility: ${props => (props.hidden ? 'hidden' : 'visible')};\n`;\n\nconst StyledDraggableItem = styled.div<{ reverse?: boolean }>`\n display: flex;\n flex-direction: ${props => (props.reverse ? 'row' : 'row-reverse')};\n margin-bottom: 16px;\n`;\n\nconst ScriptLineContent: FC<{\n script: Array<ScriptLine>;\n player?: AudioInterface;\n handleScriptLineUpdate: (value: any) => void;\n}> = ({ script, player, handleScriptLineUpdate }) => {\n const [scriptLines, setScriptLines] = useState(script);\n const parentRef = useContext(ScenarioContainerContext);\n const edit = useContext(EditModeContext);\n\n useEffect(() => {\n parentRef && parentRef.current.scrollTo(0, 0);\n }, [parentRef]);\n\n useEffect(() => {\n setScriptLines(script);\n }, [script, setScriptLines]);\n\n const Reorder = (startIndex: number, endIndex: number) => {\n const result = Array.from(scriptLines);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n setScriptLines(result);\n handleScriptLineUpdate(result);\n };\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n Reorder(result.source.index, result.destination.index);\n };\n\n return (\n <StyledScriptLineContent>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`scenario-drop-list`}>\n {(provided: any, snapshot) => (\n <StyledDroppableContainer\n ref={provided.innerRef}\n isDraggingOver={snapshot.isDraggingOver}\n >\n {scriptLines.map((item: ScriptLine, index) => {\n let disabled = false;\n if (\n player &&\n player.recording &&\n player.recording !== item.id\n ) {\n disabled = true;\n }\n return (\n <Draggable\n key={`draggable-item_${item.id}`}\n draggableId={item.id.toString()}\n index={index}\n >\n {(provided, snapshot) => (\n <StyledDraggableItem\n ref={provided.innerRef}\n {...provided.draggableProps}\n reverse={\n item.speaker ===\n ScriptLineSpeaker.REP\n }\n >\n <StyledScriptHandle\n className=\"handle\"\n reverse={\n item.speaker ===\n ScriptLineSpeaker.REP\n }\n hidden={\n edit.mode ===\n EditModeValues.VIEW\n }\n {...provided.dragHandleProps}\n data-test={\n item.speaker === ScriptLineSpeaker.REP\n ? 'scenario-rep-line-drag-handle'\n : 'scenario-customer-line-drag-handle'\n }\n >\n <Drag />\n </StyledScriptHandle>\n <ScriptItem\n key={item.id}\n script={item}\n disabled={disabled}\n editable={\n edit.mode ===\n EditModeValues.EDIT\n }\n />\n </StyledDraggableItem>\n )}\n </Draggable>\n );\n })}\n {provided.placeholder}\n </StyledDroppableContainer>\n )}\n </Droppable>\n </DragDropContext>\n </StyledScriptLineContent>\n );\n};\n\nexport const ScriptLineContentContainer: FC<{\n script: ScriptLine[];\n}> = ({ script }) => {\n const player = useSelector(getAudioState);\n const updateScriptLine = useUpdateScriptLineService();\n\n return (\n <ScriptLineContent\n script={script}\n player={player}\n handleScriptLineUpdate={updateScriptLine}\n />\n );\n};\n\nexport default ScriptLineContentContainer;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Stop = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"-2 0 24 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path d=\"M0 0h20v20H0z\" />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M7 13h6V7H7v6zm3-13C4.48 0 0 4.48 0 10s4.48 10 10 10 10-4.48 10-10S15.52 0 10 0zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"\n />\n </g>\n </svg>\n );\n }\n);\n\nexport default Stop;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Phone = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 12 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <path\n d=\"M247 28h-6c-1.656 0-3-1.343-3-3V15c0-1.657 1.344-3 3-3h6c1.657 0 3 1.343 3 3v10c0 1.657-1.343 3-3 3zm2-13c0-1.103-.897-2-2-2h-6c-1.103 0-2 .897-2 2v10c0 1.103.897 2 2 2h6c1.103 0 2-.897 2-2V15zm-3.5-.002h-3c-.276 0-.5-.223-.5-.5 0-.275.224-.5.5-.5h3c.276 0 .5.225.5.5 0 .277-.224.5-.5.5zm-1.5 9c.552 0 1 .449 1 1 0 .553-.448 1-1 1s-1-.447-1-1c0-.551.448-1 1-1z\"\n transform=\"translate(-1382 -324) translate(504 103) translate(640 209)\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Phone;\n","import { useState, useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { ScriptLine } from '../../../constants/interfaces/ScriptLine';\nimport { useCompanyVoiceSettingsState } from '../../../pages/CompanySettings/store/states';\nimport { showModalDialog, useHideModalDialog } from '../../../ui/components/ModalDialogs/store/actions';\nimport { ChunkRequestActionInterface } from '../../../services/ChunkRequestService/hooks/types';\nimport { TextToSpeechChunkRequestParameters } from './types';\nimport { GeneralBulkActionModalInterface } from '../../../ui/components/ModalDialogs/types';\nimport { useChunkRequestsService } from '../../../services/ChunkRequestService/hooks';\nimport { getTextToSpeechSettingsOrDefault } from '../helpers';\nimport { useTextToSpeechForScriptLine } from './helpers';\n\n/**\n * @function useTextToSpeechBulkActionService\n * @description Custom hook to generate speech for script lines with chunk service\n * @param { ScriptLine[] } lines\n * @param { string } featureName\n * @param { Function } onSuccess\n * @param { Function } onError\n * @returns { CallableFunction }\n */\nexport function useTextToSpeechBulkActionService(\n lines: ScriptLine[],\n featureName: string,\n onSuccess?: () => void,\n onError?: () => void\n) {\n const dispatch = useDispatch();\n const voiceSettings = useCompanyVoiceSettingsState().data;\n const textToSpeechForScriptLine = useTextToSpeechForScriptLine();\n const hideModalDialog = useHideModalDialog();\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<TextToSpeechChunkRequestParameters>[] =\n [\n {\n actionName: 'TEXT_TO_SPEECH_ACTION',\n actionFunction: textToSpeechForScriptLine,\n actionFunctionOptions: {\n parameters: {\n lines,\n index: lines.length,\n featureName,\n settings: getTextToSpeechSettingsOrDefault(voiceSettings),\n },\n fieldName: 'index',\n },\n itemPerChunk: 1,\n },\n ];\n\n /**\n * @function handleSuccess\n * @returns { void }\n */\n const handleSuccess = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n\n onSuccess?.();\n });\n }, [hideModalDialog, isRunning, onSuccess]);\n\n /**\n * @function handleFailed\n * @returns { void }\n */\n const handleFailed = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'AI Voice Processing',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n isRunning && setIsRunning(false);\n\n onError?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onError]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccess,\n handleFailed\n );\n\n /**\n * @function handleStop\n * @returns { void }\n */\n const handleStop = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n onSuccess?.();\n });\n }, [hideModalDialog, onSuccess, setIsStopped]);\n\n /**\n * @function handleStart\n * @returns { void }\n */\n const handleStart = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'AI Voice Processing',\n onStopBulkActionService:\n handleStop,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStop,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStart();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}","import { useCallback } from 'react';\nimport { useTextToSpeechService } from '../store/services';\nimport { ScriptLine, ScriptLineSpeaker } from '../../../constants/interfaces/ScriptLine';\nimport { TextToSpeechSettingsByRoles } from '../../../constants/interfaces/CompanyVoiceSettings';\n\n/**\n * @function useTextToSpeechForScriptLine\n * @description Custom hook to generate speech for a separate script line by its index\n * @returns { CallableFunction }\n */\nexport const useTextToSpeechForScriptLine = () => {\n const textToSpeech = useTextToSpeechService();\n\n /**\n * @function callback\n * @param { ScriptLine[] } lines\n * @param { number } index\n * @param { string } featureName\n * @param { TextToSpeechSettingsByRoles } settings\n * @returns { Promise }\n */\n return useCallback((\n lines: ScriptLine[],\n index: number,\n featureName: string,\n settings: TextToSpeechSettingsByRoles\n ) => {\n const line = lines[index];\n if (!line?.text?.length) return Promise.resolve();\n\n const lineSettings = line.speaker === ScriptLineSpeaker.CUSTOMER\n ? settings.customer\n : settings.representative;\n return textToSpeech(\n line.text,\n lineSettings,\n { feature: featureName, itemId: line.id }\n );\n }, [textToSpeech]);\n};","import React, { FC, useContext } from 'react';\nimport styled from 'styled-components';\n\nimport {\n AudioInterface,\n getAudioState,\n} from '../../../../../../../features/player/store/reducers';\nimport { useSelector } from 'react-redux';\nimport { EditModeContext, PlayAudioContext } from '../../../../NewScenario';\nimport { useResetAudioService } from '../../../../../../../features/player/store/services';\nimport { ScriptLine } from '../../../../../../../constants/interfaces/ScriptLine';\nimport {\n Scenario,\n ScenarioStatuses,\n} from '../../../../../../../constants/interfaces/Scenario';\nimport { useVoiceGenerationState } from '../../../../../../../features/textToSpeech/store/states';\nimport { getScenarioState } from '../../../../store/reducers';\nimport { EditModeValues } from '../../../../../../../constants/enums/EditModeValues';\nimport { useHistory } from '../../../../../../../tools/router';\nimport ROUTES from '../../../../../../../routes/routes';\nimport { Button } from '../../../../../../../ui/components/Button';\nimport Generate from '../../../../../../../ui/icons/Generate';\nimport Play from '../../../../../../../ui/icons/Play';\nimport Stop from '../../../../../../../ui/icons/Stop';\nimport Phone from '../../../../../../../ui/icons/Phone';\nimport { isProductionEnvironment } from '../../../../../../../helpers/functions/general';\nimport { useTextToSpeechBulkActionService } from '../../../../../../../features/textToSpeech/BulkActionService';\n\nconst StyledScriptHeaderActions = styled.div`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n`;\n\nconst StyledButton = styled(Button)<{ width?: string }>`\n min-width: 100px;\n ${props => (!!props.width ? `width: ${props.width}` : '')};\n`;\n\nconst ScriptHeaderActions: FC<{\n scenario: Scenario;\n player: AudioInterface;\n stopPlaylist: () => void;\n generating?: boolean;\n playAudio?: () => void;\n textToSpeech: () => void;\n}> = ({\n player,\n stopPlaylist,\n scenario,\n generating,\n playAudio,\n textToSpeech\n}) => {\n const edit = useContext(EditModeContext);\n const history = useHistory();\n\n const handlePreviewScenario = () => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.TRAINING.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n };\n\n return (\n <>\n <StyledScriptHeaderActions>\n <StyledButton\n label=\"Generate for All\"\n iconRender={<Generate />}\n disabled={\n (!!scenario.script &&\n (scenario.script.lines.filter(\n (line: ScriptLine) => line.text\n ).length === 0 ||\n player.status !== 'off' ||\n !!player.recording ||\n generating)) ||\n edit.mode === EditModeValues.VIEW\n }\n width={'136px'}\n height=\"40px\"\n action={textToSpeech}\n dataTest='scenario-generate-for-all'\n />\n {player.status !== 'playlist' ? (\n <StyledButton\n label=\"Play All\"\n iconRender={<Play />}\n disabled={\n !!scenario.script &&\n (scenario.script.lines.filter(\n (line: ScriptLine) => line.audioUrl\n ).length === 0 ||\n !!player.recording ||\n generating)\n }\n action={playAudio}\n height=\"40px\"\n dataTest='scenario-play-all'\n />\n ) : (\n <StyledButton\n label=\"Stop\"\n iconRender={<Stop />}\n color=\"warning\"\n action={stopPlaylist}\n height=\"40px\"\n dataTest='scenario-stop'\n />\n )}\n {!isProductionEnvironment() && (\n <StyledButton\n label=\"Preview\"\n iconRender={<Phone />}\n disabled={scenario.status !== ScenarioStatuses.ACTIVE}\n height=\"40px\"\n action={handlePreviewScenario}\n dataTest='scenario-preview'\n />\n )}\n </StyledScriptHeaderActions>\n </>\n );\n};\n\nexport const ScriptHeaderActionsContainer: FC<{\n}> = () => {\n const player = useSelector(getAudioState);\n const scenario = useSelector(getScenarioState).info;\n const resetPlaylist = useResetAudioService();\n const voice = useVoiceGenerationState().scenarios;\n const generating = voice && voice.generating;\n const playAudio = useContext(PlayAudioContext);\n const textToSpeechBulkAction = useTextToSpeechBulkActionService(\n scenario.script.lines,\n 'scenarios'\n );\n\n return (\n <ScriptHeaderActions\n player={player}\n stopPlaylist={resetPlaylist}\n scenario={scenario}\n generating={generating}\n playAudio={playAudio}\n textToSpeech={textToSpeechBulkAction}\n />\n );\n};\n\nexport default ScriptHeaderActionsContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport secondsToMin from '../../../../../../../helpers/functions/convert-time';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../../../../constants/interfaces/ScriptLine';\nimport ScriptHeaderActionsContainer from './ScriptHeaderActions';\n\nconst StyledScenarioScriptHeader = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 24px;\n padding-top: 24px;\n`;\n\nconst BuilderActions = styled.div`\n height: 96px;\n display: flex;\n background: ${props => props.theme.Colors.dark};\n border-radius: 4px;\n margin-bottom: 16px;\n`;\n\nconst BuilderConfigs = styled.div`\n flex: 2;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n background: ${props => props.theme.Colors.darkTwo};\n display: flex;\n align-items: center;\n justify-content: space-evenly;\n`;\n\nconst ConfigItem = styled.div`\n text-align: center;\n`;\n\nconst BuilderDuration = styled.div`\n flex: 1;\n text-align: center;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n`;\n\nconst StyledValue = styled.div`\n font-size: 20px;\n font-weight: bold;\n color: ${props => props.theme.Colors.white};\n margin: 0;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 8px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst ScenarioScriptHeader: FC<{\n totalDuration?: number | null;\n customerLineCount?: number;\n repLineCount?: number;\n}> = ({ totalDuration, customerLineCount, repLineCount }) => {\n return (\n <StyledScenarioScriptHeader>\n <BuilderActions>\n <BuilderConfigs>\n <ConfigItem>\n <StyledDescription data-test='scenario-customer-lines-text'>Customer Lines</StyledDescription>\n <StyledValue data-test='scenario-customer-lines-value'>{customerLineCount}</StyledValue>\n </ConfigItem>\n <ConfigItem>\n <StyledDescription data-test='scenario-rep-lines-text'>Rep Lines</StyledDescription>\n <StyledValue data-test='scenario-rep-lines-value'>{repLineCount}</StyledValue>\n </ConfigItem>\n </BuilderConfigs>\n <BuilderDuration>\n <StyledDescription data-test='scenario-total-duration-text'>Total Duration</StyledDescription>\n <StyledValue data-test='scenario-total-duration-value'>{secondsToMin(totalDuration)}</StyledValue>\n </BuilderDuration>\n </BuilderActions>\n <ScriptHeaderActionsContainer/>\n </StyledScenarioScriptHeader>\n );\n};\n\nexport const ScenarioScriptHeaderContainer: FC<{\n totalDuration?: number | null;\n scriptLines?: ScriptLine[];\n}> = ({ totalDuration, scriptLines }) => {\n const customerLineCount =\n scriptLines &&\n scriptLines.filter(\n (line: ScriptLine) => line.speaker === ScriptLineSpeaker.CUSTOMER\n ).length;\n const repLineCount =\n scriptLines &&\n scriptLines.filter(\n (line: ScriptLine) => line.speaker === ScriptLineSpeaker.REP\n ).length;\n\n return (\n <ScenarioScriptHeader\n totalDuration={totalDuration}\n customerLineCount={customerLineCount}\n repLineCount={repLineCount}\n />\n );\n};\n\nexport default ScenarioScriptHeaderContainer;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Customer = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 19 20\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M18.194 20H.564c-.977-1.499-.581-4.498.397-5.497.465-.476 3.956-1.376 5.627-1.786-1.765-1.37-2.84-3.912-2.84-6.337C3.748 2.857 4.77 0 9.377 0s5.63 2.857 5.63 6.38c0 2.417-1.07 4.953-2.826 6.326 1.633.407 5.176 1.332 5.627 1.797.97.999 1.356 3.998.386 5.497zm-1.19-4.443c-.64-.344-3.399-1.118-5.75-1.682v-1.98c1.567-1.067 2.496-3.385 2.496-5.491 0-2.85-.729-5.159-4.373-5.159s-4.373 2.31-4.373 5.159c0 2.108.93 4.427 2.5 5.493v1.996c-2.364.556-5.108 1.317-5.74 1.663-.408.515-.764 2.165-.511 3.196h16.251c.252-1.031-.097-2.676-.5-3.195z\"\n />\n </svg>\n );\n }\n);\n\nexport default Customer;\n","import React, { FC, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport ScriptAction from './components/ScriptAction/ScriptAction';\nimport ScriptLineContent from './components/ScriptLineContent/ScriptLineContent';\nimport { Scenario } from '../../../../../../constants/interfaces/Scenario';\nimport { getProfileState } from '../../../../../UserProfile/store/reducers';\nimport { getCompanyState } from '../../../../../CompanySettings/store/reducers';\nimport { useGetCompanyService } from '../../../../../CompanySettings/store/services';\nimport { useSelector } from 'react-redux';\nimport ScenarioScriptHeader from './ScenarioScriptHeader/ScenarioScriptHeader';\nimport { EditModeContext } from '../../../NewScenario';\nimport { EditModeValues } from '../../../../../../constants/enums/EditModeValues';\nimport AvatarPlaceholder from '../../../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport Customer from '../../../../../../ui/icons/Customer';\nimport { CompanyInterface } from '../../../../../../constants/interfaces/Company';\n\nexport interface RightPanelInterface {\n scenario: Scenario;\n createScriptLine: any;\n company?: CompanyInterface;\n}\n\nconst StyledScenarioScript = styled.div`\n flex: 3;\n display: flex;\n flex-direction: column;\n min-width: 400px;\n`;\n\nconst UserAvatarPanel = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n`;\n\nconst StyledCustomer = styled.div<{ reverse?: boolean }>`\n display: flex;\n align-items: center;\n flex-direction: ${props => (props.reverse ? 'row-reverse' : 'row')};\n`;\n\nconst ImageContainer = styled.div`\n height: 40px;\n width: 40px;\n border-radius: 4px;\n overflow: hidden;\n background: ${props => props.theme.Colors.white};\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledImage = styled.img`\n height: 100%;\n width: 100%;\n`;\n\nconst StyledCustomerImage = styled(Customer)`\n height: 20px;\n width: 20px;\n`;\n\nconst StyledText = styled.p`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n margin: 0 8px;\n`;\n\nconst ScriptsBody = styled.div``;\n\nconst PlaceholderWrapper = styled.div`\n width: 100%;\n height: 100%;\n border-radius: 4px;\n align-items: center;\n justify-content: center;\n display: flex;\n`;\n\nconst ScenarioScripts = ({\n scenario,\n createScriptLine,\n company,\n}: RightPanelInterface) => {\n const edit = useContext(EditModeContext);\n let logo;\n if (company?.logoUrl) {\n logo = <StyledImage src={company.logoUrl} alt=\"company\" data-test=\"scenario-rep-logo\" />;\n } else if (company) {\n logo = (\n <AvatarPlaceholder\n profile={company}\n size={'sm'}\n customWrapper={PlaceholderWrapper}\n dataTest=\"scenario-rep-logo\"\n />\n );\n }\n return (\n <StyledScenarioScript>\n <ScenarioScriptHeader\n totalDuration={\n scenario && scenario.script && scenario.script.totalDuration\n }\n scriptLines={scenario.script && scenario.script.lines}\n />\n <ScriptsBody>\n <UserAvatarPanel>\n <StyledCustomer>\n <ImageContainer data-test=\"scenario-customer-avatar\">\n <StyledCustomerImage />\n </ImageContainer>\n <StyledText data-test=\"scenario-customer-label\">Customer</StyledText>\n </StyledCustomer>\n <StyledCustomer reverse>\n <ImageContainer>{logo}</ImageContainer>\n <StyledText data-test=\"scenario-rep-label\">Rep</StyledText>\n </StyledCustomer>\n </UserAvatarPanel>\n {scenario.script && (\n <ScriptLineContent script={scenario.script.lines} />\n )}\n {edit.mode === EditModeValues.EDIT && (\n <ScriptAction handleAdd={createScriptLine} />\n )}\n </ScriptsBody>\n </StyledScenarioScript>\n );\n};\n\nexport const ScenarioScriptsContainer: FC<{\n scenario: Scenario;\n createScriptLine: any;\n}> = ({ scenario, createScriptLine }) => {\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n const getCompany = useGetCompanyService();\n\n useEffect(() => {\n if (!company?.id && profile?.companyId) {\n getCompany(profile.companyId);\n }\n }, [company?.id, getCompany, profile?.companyId]);\n\n return (\n <ScenarioScripts\n scenario={scenario}\n createScriptLine={createScriptLine}\n company={company}\n />\n );\n};\n\nexport default ScenarioScriptsContainer;\n","import React from 'react';\nimport styled from 'styled-components';\nimport ScenarioInfo from './ScenarioInfo/ScenarioInfo';\nimport ScenarioScripts from './ScenarioScript/ScenarioScripts';\nimport { Scenario } from '../../../../../constants/interfaces/Scenario';\n\nexport interface CustomBodyInterface {\n scenario: Scenario;\n createScriptLine: any;\n}\n\nconst CustomBodyContainerWrapper = styled.div`\n display: flex;\n`;\n\nconst CustomBodyContainer = styled.div`\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n`;\n\nconst CustomBody = ({ scenario, createScriptLine }: CustomBodyInterface) => {\n return (\n <CustomBodyContainerWrapper>\n <CustomBodyContainer>\n <ScenarioInfo scenario={scenario} />\n <ScenarioScripts\n scenario={scenario}\n createScriptLine={createScriptLine}\n />\n </CustomBodyContainer>\n </CustomBodyContainerWrapper>\n );\n};\n\nexport default CustomBody;\n","import { FC, useState } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../theme/variables';\nimport { useLocalStorage } from '../../../tools/localStorage/LocalStorage';\nimport { Button } from '../../../ui/components/Button';\nimport Checkbox from '../../../ui/components/Checkbox';\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\n\nconst StyledTitle = styled.div`\n font-size: 20px;\n font-weight: bold;\n width: 100%;\n color: var(--ps-black-main);\n`;\n\nconst StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledDescription = styled.div<{ marginTop?: string }>`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n ${props => !!props.marginTop && `margin-top: ${props.marginTop};`}\n align-self: flex-start;\n`;\n\nconst StyledActions = styled.div`\n width: 100%;\n display: flex;\n justify-content: flex-end;\n margin-top: 37px;\n`;\n\nconst StyledButtonContainer = styled.div`\n margin-left: 16px;\n`;\n\nconst StyledCheckboxContainer = styled.div`\n display: flex;\n align-items: center;\n margin-top: 11px;\n margin-bottom: 5px;\n align-self: flex-start;\n`;\n\nconst StyledReminderTitle = styled.div`\n font-size: 13px;\n font-weight: 500;\n margin-left: 11px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const StatusModalConfirmation: FC<{\n onCancel(): void;\n onConfirm(): void;\n title?: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n displayDontShow?: boolean;\n dontShowHandle?: string;\n danger?: boolean;\n}> = ({\n onCancel,\n onConfirm,\n title,\n confirmButtonText,\n cancelButtonText,\n children,\n displayDontShow,\n dontShowHandle,\n danger,\n}) => {\n const [notShow, setNotShow] = useState(false);\n const localStorage = useLocalStorage();\n\n const handleConfirm = () => {\n if (notShow) {\n localStorage.set(\n `${dontShowHandle ? dontShowHandle : 'default'}_dont_show`,\n 'true'\n );\n }\n onConfirm();\n };\n\n if (\n localStorage.get(\n `${dontShowHandle ? dontShowHandle : 'default'}_dont_show`\n )\n ) {\n onConfirm();\n return null;\n }\n\n return (\n <DialogWrapper\n customization={{ width: 400, padding: '22px 32px' }}\n >\n <StyledTitle data-test=\"confirmation-modal-title\">\n {title || 'Are You Sure?'}\n </StyledTitle>\n <StyledContent>\n <StyledDescription\n marginTop=\"15px\"\n data-test=\"confirmation-modal-description\"\n >\n {children}\n </StyledDescription>\n {displayDontShow && (\n <StyledCheckboxContainer>\n <Checkbox\n size={16}\n checked={notShow}\n border={Variables.Colors.coral}\n checkedBackground={Variables.Colors.coral}\n handleChange={() => setNotShow(!notShow)}\n dataTest=\"confirmation-modal-checkbox\"\n />\n <StyledReminderTitle data-test=\"confirmation-modal-checkbox-label\">\n Don’t show this message again\n </StyledReminderTitle>\n </StyledCheckboxContainer>\n )}\n <StyledActions>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onCancel}\n color=\"warning\"\n variant=\"inverse\"\n dataTest=\"confirmation-modal-cancel\"\n >\n Go Back\n </Button>\n <StyledButtonContainer>\n <Button\n width=\"128px\"\n height=\"40px\"\n color=\"warning\"\n action={() => !!handleConfirm && handleConfirm()}\n dataTest=\"confirmation-modal-confirm\"\n >\n {confirmButtonText || 'Confirm'}\n </Button>\n </StyledButtonContainer>\n </StyledActions>\n </StyledContent>\n </DialogWrapper>\n );\n};\n","import { EditModeValues } from \"../../constants/enums/EditModeValues\";\n\nexport const buildPageTitle = (\n entityName: 'Challenge' | 'Scenario' | 'Practis Set',\n editMode: EditModeValues,\n isNew: boolean) => {\n return isNew\n ? `Add New ${entityName}`\n : editMode === EditModeValues.EDIT\n ? `Edit ${entityName}`\n : `View ${entityName}`;\n}","import { FC, useContext, useState } from 'react';\r\nimport { EditModeContext, LoadingSaveContext } from '../../NewScenario';\r\nimport styled from 'styled-components';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n Scenario,\r\n ScenarioStatuses,\r\n Status,\r\n} from '../../../../../constants/interfaces/Scenario';\r\nimport { useVoiceGenerationState } from '../../../../../features/textToSpeech/store/states';\r\nimport {\r\n AudioInterface,\r\n getAudioState,\r\n} from '../../../../../features/player/store/reducers';\r\nimport {\r\n useModifyScenarioService,\r\n useRestoreScenarioFromTempActionService,\r\n useStoreScenarioTempCopyService,\r\n} from '../../store/services';\r\nimport { useResetAudioService } from '../../../../../features/player/store/services';\r\nimport { StatusModalConfirmation } from '../../../StatusModalConfirmation/StatusModalConfirmation';\r\nimport { buildPageTitle } from '../../../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\r\nimport { formatDate } from '../../../../../helpers/functions/date-convert';\r\nimport { Button } from '../../../../../ui/components/Button';\r\nimport { TableDivider } from '../../../../../ui/components/table-wrapper/table-divider';\r\nimport { useHandleRestoreArchivedScenario } from '../../services';\r\n\r\nconst StyledCustomWrapper = styled.div``;\r\n\r\nconst StyledCustomHeader = styled.div`\r\n padding-left: 16px;\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n height: 103px;\r\n`;\r\n\r\nconst StyledHeaderInput = styled.div`\r\n flex: 1;\r\n min-width: 150px;\r\n margin-right: 16px;\r\n`;\r\n\r\nconst HeaderTitle = styled.div`\r\n font-size: 20px;\r\n font-weight: 800;\r\n color: ${props => props.theme.Colors.black};\r\n`;\r\n\r\nconst StyledHeaderActions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 10px 0;\r\n flex-wrap: wrap;\r\n`;\r\n\r\nconst StyledHeaderActionItemsWrapper = styled.div`\r\n display: flex;\r\n`;\r\n\r\nconst StyledHeaderActionItems = styled.div`\r\n margin-left: 16px;\r\n`;\r\n\r\nconst PublishedDate = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n margin-right: 16px;\r\n`;\r\n\r\nconst EDIT_MODAL_INFO = {\r\n id: 'scenario_edit_message',\r\n message: 'Are you sure you want to edit Scenario.',\r\n buttonText: 'Proceed',\r\n cancelButtonText: 'Go Back',\r\n title: 'Are you sure?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst CANCEL_EDIT_MODAL_INFO = {\r\n id: 'scenario_cancel_edit_message',\r\n message: 'Do you want to discard changes?',\r\n buttonText: 'Discard',\r\n cancelButtonText: 'No',\r\n title: 'Discard Changes?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst MODAL_INFO = {\r\n DELETED: {\r\n message: 'Are you sure you want to delete?',\r\n buttonText: 'Yes, Delete',\r\n title: 'Delete Scenario',\r\n notShow: false,\r\n danger: false,\r\n },\r\n DRAFT: {\r\n message: 'Are you sure you want to archive?',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Scenario',\r\n notShow: false,\r\n danger: false,\r\n },\r\n ARCHIVED: {\r\n message:\r\n 'Removing the active items will effectively RESET progress for related Practis Sets for all currently enrolled Trainees. They will receive a notification and will be asked to start again.',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Scenario',\r\n notShow: false,\r\n danger: true,\r\n },\r\n ACTIVE: {\r\n message: 'Are you sure you want to archive?',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Scenario',\r\n notShow: false,\r\n danger: false,\r\n },\r\n};\r\n\r\nconst EDIT_VIEW_STATUS = [ScenarioStatuses.ACTIVE];\r\n\r\nconst CustomHeader: FC<{\r\n modifyScenario: (\r\n value: any,\r\n field: keyof Scenario,\r\n silent?: boolean\r\n ) => any;\r\n storeScenarioTemp: () => void;\r\n restoreScenarioFromTemp: () => void;\r\n handleUpdateScenario: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status,\r\n keepModal?: boolean\r\n ) => any;\r\n stopPlaylist: () => void;\r\n scenario: any;\r\n modified?: boolean;\r\n player: AudioInterface;\r\n isViewMode?: boolean;\r\n}> = ({\r\n scenario,\r\n modifyScenario,\r\n handleUpdateScenario,\r\n player,\r\n storeScenarioTemp,\r\n restoreScenarioFromTemp,\r\n modified,\r\n isViewMode,\r\n}) => {\r\n const handleRestoreArchivedScenario = useHandleRestoreArchivedScenario();\r\n const voice = useVoiceGenerationState().scenarios;\r\n const generating = voice && voice.generating;\r\n const [publishModal, setPublishModal] = useState(false);\r\n const [editModal, setEditModal] = useState(false);\r\n const [cancelEditModal, setCancelEditModal] = useState(false);\r\n const [saveState, setSaveState] = useState<Status>(ScenarioStatuses.ACTIVE);\r\n\r\n const handleSaveWithModalAction = (status: ScenarioStatuses) => {\r\n setSaveState(status);\r\n setPublishModal(true);\r\n };\r\n\r\n const loadingSave = useContext(LoadingSaveContext);\r\n const edit = useContext(EditModeContext);\r\n\r\n const cancelEditing = () => {\r\n if (modified) {\r\n setCancelEditModal(true);\r\n } else {\r\n restoreScenarioFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }\r\n };\r\n\r\n return (\r\n <StyledCustomWrapper>\r\n {publishModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setPublishModal(false);\r\n }}\r\n onConfirm={() => {\r\n setPublishModal(false);\r\n handleUpdateScenario(null, saveState);\r\n }}\r\n title={MODAL_INFO[saveState].title}\r\n confirmButtonText={MODAL_INFO[saveState].buttonText}\r\n displayDontShow={MODAL_INFO[saveState].notShow}\r\n danger={MODAL_INFO[saveState].danger}\r\n >\r\n {MODAL_INFO[saveState].message}\r\n </StatusModalConfirmation>\r\n )}\r\n {editModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setEditModal(false);\r\n storeScenarioTemp();\r\n edit.action(EditModeValues.EDIT);\r\n }}\r\n title={EDIT_MODAL_INFO.title}\r\n confirmButtonText={EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={EDIT_MODAL_INFO.cancelButtonText}\r\n displayDontShow={EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={EDIT_MODAL_INFO.id}\r\n danger={EDIT_MODAL_INFO.danger}\r\n >\r\n {EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n {cancelEditModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setCancelEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setCancelEditModal(false);\r\n restoreScenarioFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }}\r\n title={CANCEL_EDIT_MODAL_INFO.title}\r\n confirmButtonText={CANCEL_EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={CANCEL_EDIT_MODAL_INFO.cancelButtonText}\r\n displayDontShow={CANCEL_EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={CANCEL_EDIT_MODAL_INFO.id}\r\n danger={CANCEL_EDIT_MODAL_INFO.danger}\r\n >\r\n {CANCEL_EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n <StyledCustomHeader>\r\n <StyledHeaderInput>\r\n <HeaderTitle data-test=\"scenario-page-title\">\r\n {buildPageTitle('Scenario', edit.mode as EditModeValues, !scenario.id)}\r\n </HeaderTitle>\r\n </StyledHeaderInput>\r\n <StyledHeaderActions>\r\n <StyledHeaderActionItems>\r\n <PublishedDate>\r\n {scenario.status === ScenarioStatuses.ACTIVE &&\r\n edit.mode === EditModeValues.VIEW && (\r\n <span data-test=\"scenario-publish-date\">\r\n Published{' '}\r\n {formatDate(scenario.updatedAt, true)}\r\n </span>\r\n )}\r\n {scenario.status === ScenarioStatuses.ARCHIVED &&\r\n edit.mode === EditModeValues.VIEW && (\r\n <span data-test=\"scenario-archive-date\">\r\n Archived{' '}\r\n {formatDate(scenario.updatedAt, true)}\r\n </span>\r\n )}\r\n {scenario.status === ScenarioStatuses.DRAFT && (\r\n <span data-test=\"scenario-not-published-yet\">\r\n Not Published Yet\r\n </span>\r\n )}\r\n </PublishedDate>\r\n </StyledHeaderActionItems>\r\n {EDIT_VIEW_STATUS.includes(scenario.status) ? (\r\n edit.mode === EditModeValues.VIEW ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n width=\"144px\"\r\n height=\"40px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleSaveWithModalAction(\r\n ScenarioStatuses.ARCHIVED\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"archive-scenario\"\r\n >\r\n Archive\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() => setEditModal(true)}\r\n dataTest=\"edit-scenario\"\r\n >\r\n Edit\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"144px\"\r\n disabled={loadingSave}\r\n action={() => cancelEditing()}\r\n variant=\"inverse\"\r\n dataTest=\"cancel-edit\"\r\n >\r\n Cancel\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave}\r\n action={() =>\r\n handleUpdateScenario(null)\r\n }\r\n dataTest=\"save-scenario-changes\"\r\n >\r\n Save\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )\r\n ) : scenario.status === ScenarioStatuses.ARCHIVED ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleRestoreArchivedScenario(\r\n scenario.id\r\n )\r\n }\r\n dataTest=\"restore-scenario\"\r\n >\r\n Restore\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"144px\"\r\n disabled={\r\n player.status !== 'off' ||\r\n !!player.recording ||\r\n generating ||\r\n loadingSave ||\r\n isViewMode\r\n }\r\n action={() =>\r\n handleUpdateScenario(\r\n null,\r\n ScenarioStatuses.DRAFT\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"save-scenario-as-draft\"\r\n >\r\n Save as Draft\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={\r\n player.status !== 'off' ||\r\n !!player.recording ||\r\n generating ||\r\n loadingSave ||\r\n isViewMode\r\n }\r\n action={() =>\r\n handleUpdateScenario(\r\n null,\r\n ScenarioStatuses.ACTIVE\r\n )\r\n }\r\n dataTest=\"publish-scenario\"\r\n >\r\n Publish\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )}\r\n </StyledHeaderActions>\r\n </StyledCustomHeader>\r\n <TableDivider />\r\n </StyledCustomWrapper>\r\n );\r\n};\r\n\r\nexport const CustomHeaderContainer: FC<{\r\n handleUpdateScenario: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status,\r\n keepModal?: boolean\r\n ) => any;\r\n scenario: Scenario;\r\n modified?: boolean;\r\n isViewMode?: boolean;\r\n}> = ({ handleUpdateScenario, scenario, modified, isViewMode }) => {\r\n const player = useSelector(getAudioState);\r\n const modifyScenario = useModifyScenarioService();\r\n const resetPlaylist = useResetAudioService();\r\n const storeScenarioTemp = useStoreScenarioTempCopyService();\r\n const restoreScenarioFromTemp = useRestoreScenarioFromTempActionService();\r\n\r\n return (\r\n <CustomHeader\r\n handleUpdateScenario={handleUpdateScenario}\r\n scenario={scenario}\r\n player={player}\r\n modified={modified}\r\n modifyScenario={modifyScenario}\r\n storeScenarioTemp={storeScenarioTemp}\r\n restoreScenarioFromTemp={restoreScenarioFromTemp}\r\n stopPlaylist={resetPlaylist}\r\n isViewMode={isViewMode}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomHeaderContainer;","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport { updateLibraryScenarioSuccess } from '../../../features/library/store/actions';\nimport {\n CREATE_SCENARIO_ACTION,\n UPDATE_SCENARIO_ACTION,\n UPDATE_SCENARIO_STATUS_ACTION,\n} from '../../../features/library/services/LibraryBulkActionsService/constants';\nimport {\n Scenario,\n ScenarioStatuses,\n} from '../../../constants/interfaces/Scenario';\nimport { useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\nimport { useUpdateScenarioStatusApi } from '../../../api';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { useModifyScenarioService } from './store/services';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { StatusItems } from './NewScenario';\n\n/**\n * @function useCreateEditScenarioSuccessCallback\n * @param { Function } setLoadingSave\n * @param { Record<string, unknown> | undefined } responses\n * @returns { void }\n */\nexport const useCreateEditScenarioSuccessCallback = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const showMessage = useShowMessage();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n responses?: Record<string, unknown>\n ) => {\n setLoadingSave(false);\n\n if (!isEmpty(responses)) {\n const createScenarioResponse = responses![\n CREATE_SCENARIO_ACTION\n ] as Scenario | undefined;\n\n const editScenarioResponse = responses![\n UPDATE_SCENARIO_ACTION\n ] as Scenario | undefined;\n\n const updateScenarioResponse = responses![\n UPDATE_SCENARIO_STATUS_ACTION\n ] as Scenario | undefined;\n if (createScenarioResponse) {\n dispatch(\n updateLibraryScenarioSuccess(\n createScenarioResponse,\n 'update'\n )\n );\n\n const currentStatus = !isEmpty(updateScenarioResponse)\n ? ScenarioStatuses.ACTIVE\n : ScenarioStatuses.DRAFT;\n\n const actionMessage = StatusItems.filter(\n (item: any) => item.value === currentStatus\n );\n showMessage(actionMessage[0].message, 'success');\n } else if (editScenarioResponse) {\n dispatch(\n updateLibraryScenarioSuccess(\n editScenarioResponse,\n 'update'\n )\n );\n }\n }\n\n history.push(ROUTES.LIBRARY_SETTINGS.SCENARIOS.ALL);\n },\n [dispatch, history, showMessage]\n );\n};\n\n/**\n * @function createEditScenarioFailedCallback\n * @param { Function } setIsLoading\n * @param { ErrorResult | undefined } error\n * @param { Record<string, unknown> | undefined } completedResponses\n * @returns { void }\n */\nexport const useCreateEditScenarioFailedCallback = () => {\n const modifyScenario = useModifyScenarioService();\n const showMessage = useShowMessage();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => {\n if (!isEmpty(completedResponses)) {\n const createScenarioResponse = completedResponses![\n CREATE_SCENARIO_ACTION\n ] as Scenario | undefined;\n\n const createdScenarioId = createScenarioResponse?.id;\n\n // The bulk action failed in other steps\n // but new scenario created\n // in the next try it goes to\n // edit scenario action.\n if (createdScenarioId) {\n modifyScenario(createdScenarioId, 'id');\n }\n }\n\n error?.message && showMessage(error.message, 'error');\n setLoadingSave(false);\n },\n [modifyScenario, showMessage]\n );\n};\n\n/**\n * @function useHandleArchiveScenario\n * @returns { Promise<void> }\n */\nexport const useHandleArchiveScenario = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const updateScenarioStatus = useUpdateScenarioStatusApi();\n\n return useCallback(\n (scenarioId: number) => {\n updateScenarioStatus('archive', [scenarioId]).then(response => {\n dispatch(updateLibraryScenarioSuccess(response, 'update'));\n\n history.goBack();\n });\n },\n [dispatch, history, updateScenarioStatus]\n );\n};\n\n/**\n * @function useHandleRestoreArchivedScenario\n * @param { number } scenarioId\n * @returns { void }\n */\nexport const useHandleRestoreArchivedScenario = () => {\n const dispatch = useDispatch();\n const modifyScenario = useModifyScenarioService();\n const updateScenarioStatus = useUpdateScenarioStatusApi();\n\n return useCallback(\n (scenarioId: number) => {\n updateScenarioStatus('draft', [scenarioId]).then(\n (response: Scenario) => {\n dispatch(updateLibraryScenarioSuccess(response, 'update'));\n modifyScenario(ScenarioStatuses.DRAFT, 'status', true);\n }\n );\n },\n [dispatch, modifyScenario, updateScenarioStatus]\n );\n};","import { motion } from 'framer-motion';\nimport styled from 'styled-components';\n\nimport OutsideActionBox from '../../../../../OutsideActionBox/OutsideActionBox';\n\nexport const StyledSelectForm = styled.div<{\n disabled?: boolean;\n border?: boolean;\n minWidth?: string;\n height?: number;\n error?: boolean;\n isInput?: boolean;\n}>`\n box-sizing: border-box;\n position: relative;\n border-radius: 4px;\n min-width: 128px;\n cursor: pointer;\n height: ${props =>\n props.height ? `${props.height}px` : !!props.isInput ? '100%' : '40px'};\n width: 100%;\n background: ${props =>\n !!props.isInput\n ? props.theme.Colors.white\n : props.theme.Colors.whiteFive};\n color: ${props => props.theme.Colors.black};\n ${props =>\n !props.isInput &&\n `\n box-shadow: inset 0 0 0 ${props.error ? '2px' : '-1px'}\n ${props.theme.Colors.coral};\n ${props.border && `border: 1px solid ${props.theme.Colors.cloudyBlue}`};\n -webkit-appearance: none;\n `}\n\n &.is-disabled {\n color: ${props => props.theme.Colors.cloudyBlue};\n pointer-events: none;\n }\n`;\n\nexport const SelectContainer = styled(OutsideActionBox)`\n position: relative;\n width: 100%;\n`;\n\nexport const IconHolder = styled.div<{\n disabled?: boolean;\n}>`\n width: 8px;\n height: 100%;\n display: flex;\n position: absolute;\n right: 15px;\n top: 0;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n`;\n\nexport const StyledButtonContainer = styled.div`\n margin-top: 32px;\n`;\n\nexport const LabelsContainer = styled(motion.div)<{\n displayOver?: boolean;\n topMargin: number;\n left?: string;\n isInput?: boolean;\n}>`\n padding: 24px;\n min-width: 208px;\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n left: ${props =>\n props.displayOver ? '16px' : !!props.left ? props.left : '0'};\n right: ${props => (props.displayOver ? '16px' : '0')};\n ${props =>\n !!props.isInput\n ? 'bottom: 55px;'\n : `top: ${props.displayOver ? `-${props.topMargin}px` : '8px'}`};\n border-radius: 8px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n\nexport const StyledLabelsList = styled.div``;\n\nexport const ScrollableLabelContainer = styled.div`\n max-height: 312px;\n overflow: auto;\n overflow-y: scroll;\n`;\n\nexport const TitleContainer = styled.div`\n margin-bottom: 15px;\n font-size: 13px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n`;\n\nexport const SelectedPanel = styled.div`\n display: flex;\n justify-content: space-between;\n height: 24px;\n align-items: center;\n margin-bottom: 8px;\n`;\n\nexport const SelectedLabelsStyle = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const ClearSelectedLabels = styled.div<{ disabled?: boolean }>`\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n user-select: none;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.darkSkyBlue};\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n ${props => props.disabled && 'pointer-events: none'}\n`;\n\nexport const StyledLabelListItemContainer = styled.div`\n overflow: hidden;\n white-space: nowrap;\n`;\n\nexport const ChildLabelsContainer = styled.div<{\n expanded: boolean;\n}>`\n display: ${props => (props.expanded ? 'block' : 'none')};\n margin-left: 8px;\n`;\n\nexport const LabelItemActions = styled.div<{ menuOpen?: boolean }>`\n display: flex;\n user-select: none;\n align-items: center;\n height: 100%;\n width: 30px;\n`;\n\nexport const LabelListItemNameContainer = styled.div`\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`;\n\nexport const LabelListItemLabel = styled.label`\n font-size: 13px;\n padding: 0 4px;\n cursor: pointer;\n text-overflow: ellipsis;\n white-space: nowrap;\n height: 100%;\n width: 100%;\n`;\n\nexport const ArrowContainer = styled.div`\n width: 8px;\n margin-right: 4px;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const CollapseArrow = styled.div`\n height: 8px;\n display: flex;\n`;\n\nexport const StyledTitleContainer = styled.div<{ disabled?: boolean }>`\n display: flex;\n align-items: center;\n height: 100%;\n overflow: hidden;\n cursor: pointer;\n flex: 1;\n &:active {\n opacity: 0.7;\n }\n ${props => props.disabled && 'pointer-events: none'}\n`;\n\nexport const StyledLabelListItem = styled.div<{\n selected?: boolean;\n}>`\n height: 32px;\n color: ${props =>\n props.selected\n ? props.theme.Colors.black\n : props.theme.Colors.steelGrey};\n border-radius: 4px;\n font-size: 13px;\n align-items: center;\n font-weight: 600;\n display: flex;\n ${LabelItemActions} {\n display: flex;\n }\n ${ArrowContainer} ${StyledTitleContainer} {\n color: ${props =>\n props.selected\n ? props.theme.Colors.black\n : props.theme.Colors.steelGrey};\n }\n &:hover,\n :hover ${ArrowContainer} ${StyledTitleContainer} {\n background: ${props => props.theme.Colors.whiteTwo};\n color: ${props => props.theme.Colors.black};\n }\n`;\n\nexport const StyledEmptyLabels = styled.div`\n display: flex;\n padding-top: 8px;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const StyledEmptyLabelsContent = styled.div`\n max-width: 140px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const NoLabelsIcon = styled.div`\n width: 30px;\n height: 40px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 16px;\n`;\n\nexport const NoLabelsTitle = styled.div`\n font-weight: bold;\n font-size: 13px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nexport const NoLabelsDescription = styled.div`\n font-size: 11px;\n color: ${props => props.theme.Colors.cloudyBlue};\n width: 100%;\n white-space: break-spaces;\n`;\n","import { FC, useState } from 'react';\nimport Checkbox from '../../../../../Checkbox';\nimport { Label } from '../../../../../../../constants/interfaces/Label';\nimport TriangleDown from '../../../../../../icons/TriangleDown';\nimport TriangleRight from '../../../../../../icons/TriangleRight';\nimport { Variables } from '../../../../../../../theme/variables';\nimport {\n useSetAssignLabelsActionService,\n useToggleCollapseAssignLabelFieldService,\n} from '../../../../../../../features/labels/store/services';\nimport { useLabelsState } from '../../../../../../../features/labels/store/states';\nimport { useHandleSelectLabels } from '../../../../../../../features/labels/tools';\nimport { listToTree } from '../../../../../../../helpers/functions/list-to-tree';\nimport { usePortableLabelsState } from '../../../../../../../features/portableLabels/store/states';\nimport {\n ArrowContainer,\n ChildLabelsContainer,\n CollapseArrow,\n LabelItemActions,\n LabelListItemLabel,\n LabelListItemNameContainer,\n StyledLabelListItem,\n StyledLabelListItemContainer,\n StyledTitleContainer,\n} from './styles';\n\nexport const LabelsActionItem: FC<{\n label: Label;\n labelsCollapseState: number[];\n onToggleLabelsCollapse(labelId: number): void;\n openActions: boolean;\n toggleOpenActions: (open: boolean) => void;\n selectedLabels: number[];\n setAssignLabelsAction(labelIds: number[]): void;\n allLabels?: Label[];\n dataTest?: string;\n}> = ({\n label,\n labelsCollapseState,\n onToggleLabelsCollapse,\n openActions,\n selectedLabels,\n setAssignLabelsAction,\n allLabels,\n dataTest\n}) => {\n const isLabelSelected = selectedLabels.includes(label.id);\n const isLabelPartiallySelected = selectedLabels.includes(-label.id);\n\n const hasChildren = (label?: Label) => {\n return label && label.children && label.children.length > 0;\n };\n\n const handleSelectLabels = useHandleSelectLabels();\n\n const handleLabelSelection = () => {\n const labelsTree = listToTree(allLabels);\n setAssignLabelsAction(\n handleSelectLabels(label, selectedLabels, labelsTree)\n );\n };\n\n return (\n <>\n <StyledLabelListItemContainer data-test={dataTest}>\n <StyledLabelListItem\n selected={isLabelSelected || isLabelPartiallySelected}\n >\n <StyledTitleContainer\n onClick={() => onToggleLabelsCollapse(label.id)}\n disabled={!hasChildren(label)}\n >\n <ArrowContainer>\n {hasChildren(label) && (\n <CollapseArrow>\n {labelsCollapseState.includes(label.id) ? (\n <TriangleDown />\n ) : (\n <TriangleRight />\n )}\n </CollapseArrow>\n )}\n </ArrowContainer>\n <LabelListItemNameContainer>\n <LabelListItemLabel data-test={dataTest && `${dataTest}-name`}>\n {label.name}\n </LabelListItemLabel>\n </LabelListItemNameContainer>\n </StyledTitleContainer>\n <LabelItemActions menuOpen={openActions}>\n <Checkbox\n checked={\n isLabelSelected || isLabelPartiallySelected\n }\n partial={isLabelPartiallySelected}\n handleChange={handleLabelSelection}\n size={12}\n border={Variables.Colors.cloudyBlue}\n dataTest={dataTest && `${dataTest}-checkbox`}\n />\n </LabelItemActions>\n </StyledLabelListItem>\n </StyledLabelListItemContainer>\n {hasChildren(label) && (\n <ChildLabelsContainer\n expanded={labelsCollapseState.includes(label.id)}\n >\n {label.children!.map(childLabel => (\n <LabelsActionItemContainer\n key={childLabel.id}\n label={childLabel}\n dataTest={dataTest}\n />\n ))}\n </ChildLabelsContainer>\n )}\n </>\n );\n};\n\nconst LabelsActionItemContainer: FC<{\n label: Label;\n dataTest?: string;\n}> = ({ label, dataTest }) => {\n const [open, setOpen] = useState(false);\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const onToggleCollapse = useToggleCollapseAssignLabelFieldService();\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n\n return (\n <LabelsActionItem\n label={label}\n openActions={open}\n toggleOpenActions={setOpen}\n selectedLabels={labels.assignedLabels}\n allLabels={labelsList.data.items}\n labelsCollapseState={labels.collapseAssignLabels}\n onToggleLabelsCollapse={onToggleCollapse}\n setAssignLabelsAction={setAssignLabelsAction}\n dataTest={dataTest}\n />\n );\n};\n\nexport default LabelsActionItemContainer;\n","import { FC } from 'react';\n\nimport NoLabels from '../../../../../../icons/NoLabels';\nimport {\n NoLabelsDescription,\n NoLabelsIcon,\n NoLabelsTitle,\n StyledEmptyLabels,\n StyledEmptyLabelsContent,\n} from './styles';\n\nconst NoAddedLabels: FC = () => {\n return (\n <StyledEmptyLabels>\n <StyledEmptyLabelsContent>\n <NoLabelsIcon>\n <NoLabels />\n </NoLabelsIcon>\n <NoLabelsTitle>No Labels</NoLabelsTitle>\n <NoLabelsDescription>\n There are no labels created\n </NoLabelsDescription>\n </StyledEmptyLabelsContent>\n </StyledEmptyLabels>\n );\n};\n\nexport default NoAddedLabels;\n","import { FC, useState } from 'react';\nimport { ClickAwayListener } from '@material-ui/core';\n\nimport { PaginationResult } from '../../../../../../../constants/interfaces/PaginationResult';\nimport { Label } from '../../../../../../../constants/interfaces/Label';\nimport LabelsActionItem from './LabelsActionItem';\nimport { listToTree } from '../../../../../../../helpers/functions/list-to-tree';\nimport { Button } from '../../../../../Button';\nimport NoAddedLabels from './NoLabels';\nimport { SelectInput, SelectLabel } from '../../../../../SelectDropdown';\nimport UpArrow from '../../../../../../icons/UpArrow';\nimport DownArrow from '../../../../../../icons/DownArrow';\n\nimport { Variables } from '../../../../../../../theme/variables';\nimport {\n ClearSelectedLabels,\n IconHolder,\n LabelsContainer,\n ScrollableLabelContainer,\n SelectContainer,\n SelectedLabelsStyle,\n SelectedPanel,\n StyledButtonContainer,\n StyledLabelsList,\n StyledSelectForm,\n TitleContainer,\n} from './styles';\nimport { ANIMATION_SCALE } from './constants';\n\nexport const LabelsAction: FC<{\n labels?: PaginationResult<Label>;\n disabled?: boolean;\n onAssignLabelsSubmit?(): void;\n title?: string;\n minWidth?: string;\n assignedLabelsCount?: number;\n setAssignLabelsAction?(labelIds: number[]): void;\n showSelectedPanel?: boolean;\n buttonTitle?: string;\n className?: string;\n textAlignedLeft?: boolean;\n containerLeftPosition?: string;\n height?: number;\n error?: boolean;\n isInput?: boolean;\n labelColor?: string;\n dataTest?: string;\n}> = ({\n labels,\n disabled,\n onAssignLabelsSubmit,\n title,\n minWidth,\n assignedLabelsCount,\n setAssignLabelsAction,\n showSelectedPanel,\n buttonTitle,\n className,\n containerLeftPosition,\n height,\n error,\n isInput,\n labelColor,\n dataTest\n}) => {\n const [show, setShow] = useState(false);\n\n const isDropdownDisabled =\n disabled || !labels || (!!labels && !labels.items.length);\n\n return (\n <ClickAwayListener onClickAway={() => setShow(false)}>\n <StyledSelectForm\n disabled={isDropdownDisabled}\n border={show}\n minWidth={minWidth}\n className={[\n className,\n isDropdownDisabled ? 'is-disabled' : undefined,\n ].join(' ')}\n height={height}\n error={error}\n isInput={isInput}\n >\n <SelectLabel\n label={title || 'Assign Labels'}\n color={\n (!!isInput && !assignedLabelsCount) ||\n isDropdownDisabled\n ? Variables.Colors.cloudyBlue\n : !!labelColor\n ? labelColor\n : Variables.Colors.steelGrey\n }\n dataTest={dataTest && `${dataTest}-label`}\n />\n <IconHolder disabled={disabled}>\n {show && !disabled ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n <SelectInput toggleSelect={() => setShow(!show)} dataTest={dataTest && `${dataTest}-button`} />\n <SelectContainer open={show && !disabled}>\n <LabelsContainer\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n topMargin={5}\n left={containerLeftPosition}\n isInput={isInput}\n >\n {labels && labels.items.length < 1 ? (\n <NoAddedLabels />\n ) : (\n <StyledLabelsList>\n {!!showSelectedPanel && (\n <>\n <TitleContainer>\n Assign Labels\n </TitleContainer>\n <SelectedPanel>\n <SelectedLabelsStyle>\n {assignedLabelsCount &&\n assignedLabelsCount > 0\n ? `${assignedLabelsCount} ${\n assignedLabelsCount >\n 1\n ? ' labels selected'\n : ' label selected'\n }`\n : 'No label selected'}\n </SelectedLabelsStyle>\n <ClearSelectedLabels\n onClick={() => {\n setAssignLabelsAction &&\n setAssignLabelsAction(\n []\n );\n }}\n disabled={\n !(\n assignedLabelsCount &&\n assignedLabelsCount > 0\n )\n }\n >\n Clear\n </ClearSelectedLabels>\n </SelectedPanel>\n </>\n )}\n <ScrollableLabelContainer>\n {labels &&\n listToTree(labels.items || []).map(\n label => {\n return (\n <LabelsActionItem\n key={label.id}\n label={label}\n dataTest={`${dataTest}-item`}\n />\n );\n }\n )}\n </ScrollableLabelContainer>\n <StyledButtonContainer>\n <Button\n width=\"160px\"\n height=\"40px\"\n action={() => {\n setShow(false);\n onAssignLabelsSubmit &&\n onAssignLabelsSubmit();\n }}\n dataTest={`${dataTest}-save-changes`}\n >\n {buttonTitle || 'Save Changes'}\n </Button>\n </StyledButtonContainer>\n </StyledLabelsList>\n )}\n </LabelsContainer>\n </SelectContainer>\n </StyledSelectForm>\n </ClickAwayListener>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const DownloadPDF = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 13 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M12 15.999H1c-.552 0-1-.448-1-1v-10c0-.553.448-1 1-1h1.5v1h-1c-.276 0-.5.224-.5.5v9c0 .276.224.5.5.5h10c.276 0 .5-.224.5-.5v-9c0-.276-.224-.5-.5-.5h-1v-1H12c.552 0 1 .447 1 1v10c0 .552-.448 1-1 1zm-5.126-4.184c-.004.005-.003.012-.007.017-.006.006-.003.017-.01.024-.006.007-.017.004-.024.01-.083.075-.19.122-.309.128-.005 0-.01.004-.016.004h-.015c-.009 0-.016-.006-.025-.007-.1-.007-.185-.048-.26-.107-.02-.015-.047-.01-.065-.028-.013-.012-.008-.031-.019-.044-.003-.004-.008-.006-.012-.01l-2.47-2.47c-.19-.19-.19-.5 0-.69.192-.191.5-.191.691 0L6 10.308V.5c0-.276.224-.5.5-.5s.5.224.5.5v9.81l1.667-1.667c.19-.191.5-.191.69 0 .191.19.191.5 0 .69l-2.483 2.483z\"\n transform=\"translate(-1381 -132) translate(1381 132)\"\n />\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default DownloadPDF;\n","import React, { FC, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { Scenario } from '../../../../../constants/interfaces/Scenario';\nimport { useModifyScenarioService } from '../../store/services';\nimport { EditModeContext } from '../../NewScenario';\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\nimport { useLabelsState } from '../../../../../features/labels/store/states';\nimport { useDownloadScenarioReportService } from '../../../../../features/library/store/services';\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { LabelsAction } from '../../../../../ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction';\nimport { Tooltip } from '../../../../../ui/components/Tooltip';\nimport DownloadPDF from '../../../../../ui/icons/DownloadPDF';\nimport { Input } from '../../../../../ui/components/input';\n\nconst Container = styled.div`\n padding: 15px 0;\n display: flex;\n`;\n\nconst TextInputContainer = styled.div`\n flex: 1;\n`;\n\nconst LabelsContainer = styled.div`\n width: 128px;\n margin-left: 8px;\n`;\n\nconst DownloadContainer = styled.div<{ disabled?: boolean }>`\n width: 40px;\n height: 40px;\n margin-left: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n background: ${props => props.theme.Colors.whiteFive};\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n &:active {\n opacity: ${props => (props.disabled ? '1' : '0.7')};\n }\n`;\n\nconst DownloadIcon = styled.div<{ disabled?: boolean }>`\n width: 13px;\n height: 16px;\n display: flex;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n`;\n\nconst TitleTextInput = styled(Input)`\n padding: 12px 16px;\n font-size: 13px;\n font-weight: normal;\n`;\n\nconst ActionPanel: FC<{ scenario: Scenario, titleError: boolean }> = ({ scenario, titleError }) => {\n const modifyScenario = useModifyScenarioService();\n const edit = useContext(EditModeContext);\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState().data;\n const showMessage = useShowMessage();\n const downloadScenario = useDownloadScenarioReportService();\n const disableDownload = !scenario.id;\n\n useEffect(() => {}, []);\n\n const handleSaveScenarioLabels = () => {\n modifyScenario(labels.assignedLabels, 'updatedLabels');\n showMessage(`labels have been assigned to Scenario`, 'success');\n };\n\n const handleDownloadAsPDF = (id?: number) => {\n if (!id) return;\n downloadScenario(id);\n };\n\n return (\n <Container>\n <TextInputContainer>\n <TitleTextInput\n placeholder=\"Scenario Title\"\n height={'40px'}\n maxLength={100}\n handleChange={(event: any) =>\n modifyScenario(event.target.value, 'title')\n }\n value={scenario.title}\n readOnly={edit.mode === EditModeValues.VIEW}\n error={titleError}\n dataTest='scenario-title'\n />\n </TextInputContainer>\n <LabelsContainer>\n <LabelsAction\n title={'Labels'}\n labels={labelsList}\n disabled={edit.mode === EditModeValues.VIEW}\n onAssignLabelsSubmit={handleSaveScenarioLabels}\n containerLeftPosition={'unset'}\n dataTest='scenario-labels'\n />\n </LabelsContainer>\n <Tooltip label={'Download as PDF'} preset={'button-icon'}>\n <DownloadContainer\n disabled={disableDownload}\n onClick={() => {\n handleDownloadAsPDF(scenario.id);\n }}\n data-test='download-scenario-as-pdf'\n >\n <DownloadIcon disabled={disableDownload}>\n <DownloadPDF />\n </DownloadIcon>\n </DownloadContainer>\n </Tooltip>\n </Container>\n );\n};\n\nexport default ActionPanel;\n","import { useCallback } from 'react';\nimport { isEmpty, uniqBy } from 'lodash';\n\nimport {\n useAssignChallengeLabelsApi,\n useAssignLinesToChallengeApi,\n useAssignLinesToScenarioApi,\n useAssignPractisSetContentApi,\n useAssignPractisSetLabelsApi,\n useAssignScenarioLabelApi,\n useCreateChallengeApi,\n useCreateNewPractisSetApi,\n useCreateScenarioApi,\n useDeleteChallengeLabelsApi,\n useDeletePractisSetLabelsApi,\n useDeleteScenarioLabelApi,\n useGetPractisSetContentApi,\n useUpdateChallengeInfoApi,\n useUpdateChallengeStatusApi,\n useUpdatePractisSetApi,\n useUpdatePractisSetStatusApi,\n useUpdateScenarioApi,\n useUpdateScenarioStatusApi,\n} from '../../../../api';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport { LibraryEntityName } from '../../store/types';\nimport {\n CreatePractisSetInfo,\n CreateNewChallengeInfo,\n CreateNewScenarioInfo,\n NewPractisSetInfo,\n EditPractisSetInfo,\n EditScenarioInfo,\n EditChallengeInfo,\n} from './types';\nimport {\n PractisSetContent,\n PractisSetStatuses,\n PractisSetStatusType,\n} from '../../../../constants/interfaces/PractisSets';\nimport { ScriptLine } from '../../../../constants/interfaces/ScriptLine';\nimport { ScenarioLabel, ScenarioLine } from '../../../../api/scenarios/types';\nimport {\n ChallengeLabel,\n ChallengeLine,\n} from '../../../../api/challenges/types';\nimport {\n NewPractisSetType,\n PractisSetLabel,\n UpdatePractisSetStatusType,\n} from '../../../../api/practis-set/types';\nimport {\n ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION,\n ASSIGN_LABELS_TO_CHALLENGE_ACTION,\n ASSIGN_LABELS_TO_PRACTIS_SET_ACTION,\n ASSIGN_LABELS_TO_SCENARIO_ACTION,\n ASSIGN_LINES_TO_CHALLENGE_ACTION,\n ASSIGN_LINES_TO_SCENARIO_ACTION,\n CREATE_CHALLENGE_ACTION,\n CREATE_PRACTIS_SET_ACTION,\n CREATE_SCENARIO_ACTION,\n DELETE_LABELS_FROM_CHALLENGE_ACTION,\n DELETE_LABELS_FROM_PRACTIS_SET_ACTION,\n DELETE_LABELS_FROM_SCENARIO_ACTION,\n DELETE_LINES_FROM_SCENARIO_ACTION,\n GET_PRACTIS_SET_CONTENT_ACTION,\n UPDATE_CHALLENGE_ACTION,\n UPDATE_CHALLENGE_STATUS_ACTION,\n UPDATE_PRACTIS_SET_ACTION,\n UPDATE_PRACTIS_SET_STATUS_ACTION,\n UPDATE_SCENARIO_ACTION,\n UPDATE_SCENARIO_STATUS_ACTION,\n} from './constants';\nimport {\n ScenarioStatuses,\n Status as ScenarioStatusType,\n} from '../../../../constants/interfaces/Scenario';\nimport {\n ChallengeStatuses,\n Status as ChallengeStatusType,\n} from '../../../../constants/interfaces/Challenge';\n\n/**\n * @dev Use this to assign labels to 'practisSet' | 'scenario' | 'challenge' entities.\n * @function useAssignLibraryEntityLabelsService\n * @returns { CallableFunction }\n */\nexport function useAssignLibraryEntityLabelsService() {\n const assignPractisSetLabels = useAssignPractisSetLabelsApi();\n const assignScenarioLabels = useAssignScenarioLabelApi();\n const assignChallengeLabels = useAssignChallengeLabelsApi();\n\n /**\n * @function callback\n * @param { { id: number, labels: number[] }[] } entityData\n * @param { LibraryEntityName } entityName\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n labels: number[],\n entityData: { id: number },\n entityName: LibraryEntityName\n ) => {\n const assignLabelToLibraryActionList = {\n practisSet: assignPractisSetLabels,\n scenario: assignScenarioLabels,\n challenge: assignChallengeLabels,\n };\n\n const entityId = entityData?.id;\n\n if (entityId) {\n const processedAssignedLabelIds = labels.map(labelId => ({\n [`${entityName}Id`]: entityId,\n labelId,\n }));\n\n if (!isEmpty(processedAssignedLabelIds)) {\n const assignLabelFromLibraryAction =\n assignLabelToLibraryActionList[entityName];\n\n return await assignLabelFromLibraryAction?.(\n processedAssignedLabelIds as any\n );\n }\n }\n },\n [assignChallengeLabels, assignPractisSetLabels, assignScenarioLabels]\n );\n}\n\n/**\n * @dev Use this to update status of 'practisSet' | 'scenario' | 'challenge' entities.\n * @function useUpdateLibraryStatusService\n * @returns { CallableFunction }\n */\nexport const useUpdateLibraryStatusService = () => {\n const updatePractisSetStatus = useUpdatePractisSetStatusApi();\n const updateScenarioStatus = useUpdateScenarioStatusApi();\n const updateChallengeStatus = useUpdateChallengeStatusApi();\n\n /**\n * @param { {id: number} } entityData\n * @param { LibraryEntityName } entityName\n * @param { PractisSetStatusType } currentStatus\n */\n return useCallback(\n async (\n entityData: { id: number },\n entityName: LibraryEntityName,\n currentStatus: PractisSetStatusType\n ) => {\n const updateLibraryStatusActionList = {\n practisSet: updatePractisSetStatus,\n scenario: updateScenarioStatus,\n challenge: updateChallengeStatus,\n };\n\n const createdPractisSetId = entityData?.id;\n\n if (createdPractisSetId) {\n const updateLibraryStatusAction =\n updateLibraryStatusActionList[entityName];\n\n return await updateLibraryStatusAction?.(\n currentStatus?.toLowerCase() as UpdatePractisSetStatusType,\n [createdPractisSetId]\n );\n }\n },\n [updatePractisSetStatus, updateScenarioStatus, updateChallengeStatus]\n );\n};\n\n/**\n * @description Generates action list to pass to create practisSet service.\n * @function useGenerateCreatePractisSetActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateCreatePractisSetActionList() {\n const createNewPractisSet = useCreateNewPractisSetApi();\n const assignLibraryLabels = useAssignLibraryEntityLabelsService();\n const assignPractisSetContent = useAssignPractisSetContentApi();\n const updatePractisSetStatusService = useUpdateLibraryStatusService();\n\n /**\n * @function handleAssignPractisSetContent\n * @param { { id: number } } entityData\n * @returns { Promise<void> }\n */\n const handleAssignPractisSetContent = useCallback(\n async (\n practisSetContents: PractisSetContent[],\n entityData: {\n id: number;\n }\n ) => {\n const { id: practisSetId = 0 } = entityData || {};\n\n if (!isEmpty(practisSetContents)) {\n const practisSetContent = practisSetContents?.map(item => ({\n contentType: item.type,\n scenarioId: item.scenario?.id ?? null,\n challengeId: item.challenge?.id ?? null,\n minRepsCount:\n item.type === 'CHALLENGE'\n ? null\n : item.minRepsCount ?? null,\n position: item.position ?? 0,\n }));\n\n return await assignPractisSetContent(\n practisSetId,\n practisSetContent as any\n );\n }\n },\n [assignPractisSetContent]\n );\n\n /**\n * @function handleAssignLabelsToPractisSet\n * @param { number[] } labelIds\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLabelsToPractisSet = useCallback(\n (\n labelIds: number[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: uniqBy(labelIds, id => id),\n entityId: [],\n entityName: 'practisSet',\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityId',\n };\n\n childActionList.push({\n actionName: ASSIGN_LABELS_TO_PRACTIS_SET_ACTION,\n actionFunction: assignLibraryLabels,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n },\n [assignLibraryLabels]\n );\n\n /**\n * @function handleAssignContentToPractisSet\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignContentToPractisSet = useCallback(\n (\n practisSetContents: PractisSetContent[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignPractisSetContentOptions = {\n parameters: {\n practisSetContents,\n entityData: [],\n },\n fieldName: 'practisSetContents',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION,\n actionFunction: handleAssignPractisSetContent,\n actionFunctionOptions: assignPractisSetContentOptions as any,\n itemPerChunk: 10000\n });\n },\n [handleAssignPractisSetContent]\n );\n\n /**\n * @function handleUpdatePractisSetStatus\n * @param { PractisSetStatusType } currentStatus\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleUpdatePractisSetStatus = useCallback(\n (\n currentStatus: PractisSetStatusType,\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updatePractisSetStatusServiceOptions = {\n parameters: {\n entityData: [],\n entityName: 'practisSet',\n currentStatus,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: UPDATE_PRACTIS_SET_STATUS_ACTION,\n actionFunction: updatePractisSetStatusService,\n actionFunctionOptions:\n updatePractisSetStatusServiceOptions as any,\n });\n },\n [updatePractisSetStatusService]\n );\n\n /**\n * @param { CreatePractisSetInfo } newPractisSetInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newPractisSetInfo: CreatePractisSetInfo) => {\n const {\n name,\n description,\n pacingId,\n labelIds,\n status,\n practisSetContents,\n } = newPractisSetInfo;\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: CREATE_PRACTIS_SET_ACTION,\n actionFunction: createNewPractisSet,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n practisSet: { name, description, pacingId },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n };\n\n const childActionList: ChunkRequestActionInterface<any>[] = [];\n\n if (!isEmpty(labelIds)) {\n handleAssignLabelsToPractisSet(labelIds, childActionList);\n }\n\n if (!isEmpty(practisSetContents)) {\n handleAssignContentToPractisSet(\n practisSetContents,\n childActionList\n );\n }\n\n if (status && status !== PractisSetStatuses.DRAFT) {\n handleUpdatePractisSetStatus(status, childActionList);\n }\n\n actionList = { ...actionList, ...{ childActionList } };\n\n return actionList;\n },\n [\n createNewPractisSet,\n handleAssignContentToPractisSet,\n handleAssignLabelsToPractisSet,\n handleUpdatePractisSetStatus,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to edit practisSet service.\n * @function useGenerateEditPractisSetActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateEditPractisSetActionList() {\n const updatePractisSetInfo = useUpdatePractisSetApi();\n const assignPractisSetContent = useAssignPractisSetContentApi();\n const assignLabelsToPractisSet = useAssignPractisSetLabelsApi();\n const deleteLabelsFromPractisSet = useDeletePractisSetLabelsApi();\n const updatePractisSetStatusService = useUpdatePractisSetStatusApi();\n\n /**\n * @function handleUpdatePractisSetInfo\n * @param { number } practisSetId\n * @param { NewPractisSetType } practisSetInfo\n * @param { ChunkRequestActionInterface<any>[] } actionList\n */\n const handleUpdatePractisSetInfo = useCallback(\n async (\n practisSetId: number,\n practisSetInfo: NewPractisSetType,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updatePractisSetInfoActionOptions = {\n parameters: {\n practisSetId,\n data: practisSetInfo,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n };\n\n actionList.push({\n actionName: UPDATE_PRACTIS_SET_ACTION,\n actionFunction: updatePractisSetInfo,\n actionFunctionOptions: updatePractisSetInfoActionOptions,\n });\n },\n [updatePractisSetInfo]\n );\n\n /**\n * @function handleAssignPractisSetContent\n * @param { number } practisSetId\n * @param { PractisSetContent[] } practisSetContents\n * @param { ChunkRequestActionInterface<any>[] } actionList\n */\n const handleAssignPractisSetContent = useCallback(\n async (\n practisSetId: number,\n practisSetContents: PractisSetContent[],\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n if (!isEmpty(practisSetContents)) {\n const practisSetContentData = practisSetContents?.map(item => ({\n contentType: item.type,\n scenarioId: item.scenario?.id ?? null,\n challengeId: item.challenge?.id ?? null,\n minRepsCount:\n item.type === 'CHALLENGE'\n ? null\n : item.minRepsCount ?? null,\n position: item.position ?? 0,\n }));\n\n if (!isEmpty(practisSetContentData)) {\n actionList.push({\n actionName: ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION,\n actionFunction: assignPractisSetContent,\n actionFunctionOptions: {\n parameters: {\n practisSetId,\n practisSetContentData,\n },\n fieldName: 'practisSetContentData',\n },\n itemPerChunk: 10000\n });\n }\n }\n },\n [assignPractisSetContent]\n );\n\n /**\n * @function handleUpdatePractisSetLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleUpdatePractisSetLabels = useCallback(\n (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n practisSetId: number,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n if (!isEmpty(addedLabelIds)) {\n const addedLabels = addedLabelIds.map(\n labelId =>\n ({\n labelId,\n practisSetId,\n } as PractisSetLabel)\n );\n\n const assignLabelsToPractisSetServiceOptions = {\n parameters: {\n addedPractisSetLabels: addedLabels,\n },\n fieldName: 'addedPractisSetLabels',\n };\n\n actionList.push({\n actionName: ASSIGN_LABELS_TO_PRACTIS_SET_ACTION,\n actionFunction: assignLabelsToPractisSet,\n actionFunctionOptions:\n assignLabelsToPractisSetServiceOptions as any,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n const deletedLabels = deletedLabelIds.map(\n labelId =>\n ({\n labelId,\n practisSetId,\n } as PractisSetLabel)\n );\n\n const deleteLabelsFromPractisSetServiceOptions = {\n parameters: {\n deletedPractisSetLabels: deletedLabels,\n },\n fieldName: 'deletedPractisSetLabels',\n };\n\n actionList.push({\n actionName: DELETE_LABELS_FROM_PRACTIS_SET_ACTION,\n actionFunction: deleteLabelsFromPractisSet,\n actionFunctionOptions:\n deleteLabelsFromPractisSetServiceOptions as any,\n });\n }\n },\n [assignLabelsToPractisSet, deleteLabelsFromPractisSet]\n );\n\n /**\n * @function handleUpdatePractisSetStatus\n * @param { number } practisSetId\n * @param { string } status\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleUpdatePractisSetStatus = useCallback(\n (\n practisSetId: number,\n status: string,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updatePractisSetStatusServiceOptions = {\n parameters: {\n status,\n practisSetIds: [practisSetId],\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n };\n\n actionList.push({\n actionName: UPDATE_PRACTIS_SET_STATUS_ACTION,\n actionFunction: updatePractisSetStatusService,\n actionFunctionOptions:\n updatePractisSetStatusServiceOptions as any,\n });\n },\n [updatePractisSetStatusService]\n );\n\n /**\n * @param { EditPractisSetInfo } newPractisSetInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newPractisSetInfo: EditPractisSetInfo) => {\n const {\n practisSetId,\n name,\n description,\n pacingId,\n addedLabelIds,\n deletedLabelIds,\n practisSetContents,\n status,\n } = newPractisSetInfo;\n\n let actionList: ChunkRequestActionInterface<any>[] = [];\n\n if (!isEmpty(name) || !isEmpty(description) || !isEmpty(pacingId)) {\n handleUpdatePractisSetInfo(\n practisSetId,\n {\n name,\n description,\n pacingId,\n },\n actionList\n );\n }\n\n if (!isEmpty(addedLabelIds) || !isEmpty(deletedLabelIds)) {\n handleUpdatePractisSetLabels(\n addedLabelIds,\n deletedLabelIds,\n practisSetId,\n actionList\n );\n }\n\n if (!isEmpty(practisSetContents)) {\n handleAssignPractisSetContent(\n practisSetId,\n practisSetContents,\n actionList\n );\n }\n\n if (status && status !== PractisSetStatuses.DRAFT) {\n handleUpdatePractisSetStatus(\n practisSetId,\n status!.toLowerCase(),\n actionList\n );\n }\n\n return actionList;\n },\n [\n handleAssignPractisSetContent,\n handleUpdatePractisSetInfo,\n handleUpdatePractisSetLabels,\n handleUpdatePractisSetStatus,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to duplicate practisSet service.\n * @function useGenerateDuplicatePractisSetActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateDuplicatePractisSetActionList() {\n const createNewPractisSet = useCreateNewPractisSetApi();\n const assignLibraryLabels = useAssignLibraryEntityLabelsService();\n const getPractisSetContent = useGetPractisSetContentApi();\n const assignPractisSetContent = useAssignPractisSetContentApi();\n\n /**\n * @function handleGetPractisSetContent\n * @param { {id: number} } entityData\n * @param { number } currentPractisSetId\n * @returns { Promise<unknown> }\n */\n const handleGetPractisSetContent = useCallback(\n async (entityData: { id: number }, currentPractisSetId: number) => {\n const createdPractisSetId = entityData?.id;\n\n let newPractisSetContentData = {} as {\n content: PractisSetContent[];\n practisSetId: number;\n };\n\n if (createdPractisSetId) {\n await getPractisSetContent(currentPractisSetId).then(\n (response: PractisSetContent[]) => {\n newPractisSetContentData = {\n content: response,\n practisSetId: createdPractisSetId,\n };\n }\n );\n }\n\n return new Promise(resolve => {\n setTimeout(() => {\n resolve([newPractisSetContentData]);\n }, 0);\n });\n },\n [getPractisSetContent]\n );\n\n /**\n * @function handleAssignPractisSetContent\n * @param { { content: PractisSetContent[]; practisSetId: number }[] } entityData\n * @returns { Promise<void> }\n */\n const handleAssignPractisSetContent = useCallback(\n async (\n entityData: {\n content: PractisSetContent[];\n practisSetId: number;\n }[]\n ) => {\n const { content = [], practisSetId = 0 } = entityData?.[0] || {};\n\n if (!isEmpty(content)) {\n const practisSetContent = content?.map(item => ({\n contentType: item.type,\n scenarioId: item.scenario?.id ?? null,\n challengeId: item.challenge?.id ?? null,\n minRepsCount:\n item.type === 'CHALLENGE'\n ? null\n : item.minRepsCount ?? null,\n position: item.position ?? null,\n }));\n\n return assignPractisSetContent(\n practisSetId,\n practisSetContent as any\n );\n }\n },\n [assignPractisSetContent]\n );\n\n /**\n * @function handleAssignLabelsToPractisSet\n * @param { number[] } labelIds\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLabelsToPractisSet = useCallback(\n (\n labelIds: number[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: uniqBy(labelIds, id => id),\n entityId: [],\n entityName: 'practisSet',\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityId',\n };\n\n childActionList.push({\n actionName: ASSIGN_LABELS_TO_PRACTIS_SET_ACTION,\n actionFunction: assignLibraryLabels,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n },\n [assignLibraryLabels]\n );\n\n /**\n * @function handleAssignContentToPractisSet\n * @param { number } currentPractisSetId\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignContentToPractisSet = useCallback(\n (\n currentPractisSetId: number,\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const getPractisSetContentOptions = {\n parameters: {\n entityData: [],\n currentPractisSetId,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n const assignPractisSetContentOptions = {\n parameters: {\n entityData: [],\n },\n fieldName: 'entityData',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: GET_PRACTIS_SET_CONTENT_ACTION,\n actionFunction: handleGetPractisSetContent,\n actionFunctionOptions: getPractisSetContentOptions as any,\n itemPerChunk: 1,\n childActionList: [\n {\n actionName: ASSIGN_CONTENT_TO_PRACTIS_SET_ACTION,\n actionFunction: handleAssignPractisSetContent,\n actionFunctionOptions: assignPractisSetContentOptions,\n itemPerChunk: 10000\n },\n ],\n });\n },\n [handleAssignPractisSetContent, handleGetPractisSetContent]\n );\n\n /**\n * @param { NewPractisSetInfo } newPractisSetInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newPractisSetInfo: NewPractisSetInfo) => {\n const {\n currentPractisSetId,\n name,\n description,\n pacingId,\n labelIds,\n scenarioCount,\n challengeCount,\n } = newPractisSetInfo;\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: CREATE_PRACTIS_SET_ACTION,\n actionFunction: createNewPractisSet,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n practisSet: { name, description, pacingId },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n };\n\n const childActionList: ChunkRequestActionInterface<any>[] = [];\n\n if (!isEmpty(labelIds)) {\n handleAssignLabelsToPractisSet(labelIds, childActionList);\n }\n\n if (scenarioCount > 0 || challengeCount > 0) {\n handleAssignContentToPractisSet(\n currentPractisSetId,\n childActionList\n );\n }\n\n actionList = { ...actionList, ...{ childActionList } };\n\n return actionList;\n },\n [\n createNewPractisSet,\n handleAssignContentToPractisSet,\n handleAssignLabelsToPractisSet,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to create/duplicate scenario service.\n * @function useGenerateCreateDuplicateScenarioActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateCreateDuplicateScenarioActionList() {\n const createNewScenario = useCreateScenarioApi();\n const assignLibraryLabels = useAssignLibraryEntityLabelsService();\n const assignLinesToScenario = useAssignLinesToScenarioApi();\n const updateScenarioStatusService = useUpdateLibraryStatusService();\n\n /**\n * @function handleUpdateScenarioStatus\n * @param { ScenarioStatusType } currentStatus\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleUpdateScenarioStatus = useCallback(\n (\n currentStatus: ScenarioStatusType,\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updateScenarioStatusServiceOptions = {\n parameters: {\n entityData: [],\n entityName: 'scenario',\n currentStatus,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: UPDATE_SCENARIO_STATUS_ACTION,\n actionFunction: updateScenarioStatusService,\n actionFunctionOptions:\n updateScenarioStatusServiceOptions as any,\n });\n },\n [updateScenarioStatusService]\n );\n\n /**\n * @function handleAssignLabelsToScenario\n * @param { number[] } labelIds\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLabelsToScenario = useCallback(\n (\n labelIds: number[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: uniqBy(labelIds, id => id),\n entityId: [],\n entityName: 'scenario',\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityId',\n };\n\n childActionList.push({\n actionName: ASSIGN_LINES_TO_SCENARIO_ACTION,\n actionFunction: assignLibraryLabels,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n },\n [assignLibraryLabels]\n );\n\n /**\n * @function handleAssignLinesToScenarioService\n * @param { { id: number} } entityData\n * @param { ScriptLine[] } currentLines\n * @returns { Promise<void> }\n */\n const handleAssignLinesToScenarioService = useCallback(\n async (entityData: { id: number }, currentLines: ScriptLine[]) => {\n const createdScenarioId = entityData?.id;\n\n if (createdScenarioId) {\n const createdScenarioLines = currentLines?.map(line => {\n const {\n audioId = 0,\n duration = 0,\n position = null,\n text = '',\n speaker = '',\n keywords = [],\n } = line || {};\n\n return {\n audioId,\n duration,\n position,\n text,\n speaker,\n keywords,\n } as ScenarioLine;\n });\n\n await assignLinesToScenario(\n createdScenarioId,\n createdScenarioLines\n );\n }\n },\n [assignLinesToScenario]\n );\n\n /**\n * @function handleAssignLinesToScenario\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLinesToScenario = useCallback(\n (\n currentLines: ScriptLine[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToScenarioOptions = {\n parameters: {\n entityData: [],\n currentLines,\n },\n fieldName: 'currentLines',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: ASSIGN_LINES_TO_SCENARIO_ACTION,\n actionFunction: handleAssignLinesToScenarioService,\n actionFunctionOptions: assignLinesToScenarioOptions as any,\n itemPerChunk: 10000\n });\n },\n [handleAssignLinesToScenarioService]\n );\n\n /**\n * @param { CreateNewScenarioInfo } newScenarioInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newScenarioInfo: CreateNewScenarioInfo) => {\n const { title, description, labelIds, lines, status } =\n newScenarioInfo;\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: CREATE_SCENARIO_ACTION,\n actionFunction: createNewScenario,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n scenarioInfo: { title, description },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n };\n\n const childActionList: ChunkRequestActionInterface<any>[] = [];\n\n if (!isEmpty(labelIds)) {\n handleAssignLabelsToScenario(labelIds, childActionList);\n }\n\n if (!isEmpty(lines)) {\n handleAssignLinesToScenario(lines, childActionList);\n }\n\n if (status && status !== ScenarioStatuses.DRAFT) {\n handleUpdateScenarioStatus(status, childActionList);\n }\n\n actionList = { ...actionList, ...{ childActionList } };\n\n return actionList;\n },\n [\n createNewScenario,\n handleAssignLabelsToScenario,\n handleAssignLinesToScenario,\n handleUpdateScenarioStatus,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to edit scenario service.\n * @function useGenerateEditScenarioActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateEditScenarioActionList() {\n const updateScenarioInfo = useUpdateScenarioApi();\n const assignLabelsToScenario = useAssignScenarioLabelApi();\n const deleteLabelsFromScenario = useDeleteScenarioLabelApi();\n const assignLinesToScenario = useAssignLinesToScenarioApi();\n const updateScenarioStatusService = useUpdateScenarioStatusApi();\n\n /**\n * @function handleUpdateScenarioStatus\n * @param { number } scenarioId\n * @param { ScenarioStatusType } currentStatus\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleUpdateScenarioStatus = useCallback(\n (\n scenarioId: number,\n currentStatus: ScenarioStatusType,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updateScenarioStatusServiceOptions = {\n parameters: {\n currentStatus: currentStatus?.toLowerCase(),\n scenarioIds: [scenarioId],\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n };\n\n actionList.push({\n actionName: UPDATE_SCENARIO_STATUS_ACTION,\n actionFunction: updateScenarioStatusService,\n actionFunctionOptions:\n updateScenarioStatusServiceOptions as any,\n });\n },\n [updateScenarioStatusService]\n );\n\n /**\n * @function handleAssignLabelsToScenario\n * @param { number } scenarioId\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleAssignLabelsToScenario = useCallback(\n (\n scenarioId: number,\n addedLabelIds: number[],\n deletedLabelIds: number[],\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n if (!isEmpty(addedLabelIds)) {\n const addedLabels = addedLabelIds.map(\n labelId =>\n ({\n scenarioId,\n labelId,\n } as ScenarioLabel)\n );\n\n const assignLabelsToScenarioServiceOptions = {\n parameters: {\n labels: addedLabels,\n },\n fieldName: 'labels',\n };\n\n actionList.push({\n actionName: ASSIGN_LABELS_TO_SCENARIO_ACTION,\n actionFunction: assignLabelsToScenario,\n actionFunctionOptions:\n assignLabelsToScenarioServiceOptions as any,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n const deletedLabels = deletedLabelIds.map(\n labelId =>\n ({\n scenarioId,\n labelId,\n } as ScenarioLabel)\n );\n\n const deleteLabelsFromScenarioServiceOptions = {\n parameters: {\n labels: deletedLabels,\n },\n fieldName: 'labels',\n };\n\n actionList.push({\n actionName: DELETE_LABELS_FROM_SCENARIO_ACTION,\n actionFunction: deleteLabelsFromScenario,\n actionFunctionOptions:\n deleteLabelsFromScenarioServiceOptions as any,\n });\n }\n },\n [assignLabelsToScenario, deleteLabelsFromScenario]\n );\n\n /**\n * @function handleAssignLinesToScenarioService\n * @param { number } scenarioId\n * @param { ScriptLine[] } currentLines\n * @returns { Promise<void> }\n */\n const handleAssignLinesToScenarioService = useCallback(\n async (scenarioId: number, currentLines: ScriptLine[]) => {\n if (scenarioId) {\n const createdScenarioLines = currentLines?.map(line => {\n const {\n audioId = 0,\n duration = 0,\n position = null,\n text = '',\n speaker = '',\n keywords = [],\n } = line || {};\n\n return {\n audioId,\n duration,\n position,\n text,\n speaker,\n keywords,\n } as ScenarioLine;\n });\n\n await assignLinesToScenario(scenarioId, createdScenarioLines);\n }\n },\n [assignLinesToScenario]\n );\n\n /**\n * @function handleAssignLinesToScenario\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleAssignLinesToScenario = useCallback(\n (\n scenarioId: number,\n currentLines: ScriptLine[],\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToScenarioOptions = {\n parameters: {\n scenarioId,\n currentLines,\n },\n fieldName: 'currentLines',\n };\n\n actionList.push({\n actionName: ASSIGN_LINES_TO_SCENARIO_ACTION,\n actionFunction: handleAssignLinesToScenarioService,\n actionFunctionOptions: assignLinesToScenarioOptions as any,\n itemPerChunk: 10000,\n });\n },\n [handleAssignLinesToScenarioService]\n );\n\n /**\n * @function handleDeleteScenarioLines\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleDeleteScenarioLines = useCallback(\n (\n scenarioId: number,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToScenarioOptions = {\n parameters: {\n scenarioId,\n currentLines: [],\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n };\n\n actionList.push({\n actionName: DELETE_LINES_FROM_SCENARIO_ACTION,\n actionFunction: handleAssignLinesToScenarioService,\n actionFunctionOptions: assignLinesToScenarioOptions as any,\n });\n },\n [handleAssignLinesToScenarioService]\n );\n\n /**\n * @param { EditScenarioInfo } newScenarioInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newScenarioInfo: EditScenarioInfo) => {\n const {\n scenarioId,\n title,\n description,\n addedLabelIds,\n deletedLabelIds,\n lines,\n status,\n } = newScenarioInfo;\n\n let actionList: ChunkRequestActionInterface<any>[] = [\n {\n actionName: UPDATE_SCENARIO_ACTION,\n actionFunction: updateScenarioInfo,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n scenarioId,\n scenarioInfo: { title, description },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n },\n ];\n\n if (!isEmpty(addedLabelIds) || !isEmpty(deletedLabelIds)) {\n handleAssignLabelsToScenario(\n scenarioId,\n addedLabelIds,\n deletedLabelIds,\n actionList\n );\n }\n\n if (!isEmpty(lines)) {\n handleAssignLinesToScenario(scenarioId, lines, actionList);\n } else if (status === ScenarioStatuses.DRAFT) {\n handleDeleteScenarioLines(scenarioId, actionList);\n }\n\n if (status && status !== ScenarioStatuses.DRAFT) {\n handleUpdateScenarioStatus(scenarioId, status, actionList);\n }\n\n return actionList;\n },\n [\n handleAssignLabelsToScenario,\n handleAssignLinesToScenario,\n handleDeleteScenarioLines,\n handleUpdateScenarioStatus,\n updateScenarioInfo,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to create/duplicate challenge service.\n * @function useGenerateCreateDuplicateChallengeActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateCreateDuplicateChallengeActionList() {\n const createNewChallenge = useCreateChallengeApi();\n const assignLibraryLabels = useAssignLibraryEntityLabelsService();\n const assignLinesToChallenge = useAssignLinesToChallengeApi();\n const updateChallengeStatusService = useUpdateLibraryStatusService();\n\n /**\n * @function handleUpdateChallengeStatus\n * @param { ChallengeStatusType } currentStatus\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleUpdateChallengeStatus = useCallback(\n (\n currentStatus: ChallengeStatusType,\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updateChallengeStatusServiceOptions = {\n parameters: {\n entityData: [],\n entityName: 'challenge',\n currentStatus,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: UPDATE_CHALLENGE_STATUS_ACTION,\n actionFunction: updateChallengeStatusService,\n actionFunctionOptions:\n updateChallengeStatusServiceOptions as any,\n });\n },\n [updateChallengeStatusService]\n );\n\n /**\n * @function handleAssignLabelsToChallenge\n * @param { number[] } labelIds\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLabelsToChallenge = useCallback(\n (\n labelIds: number[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: uniqBy(labelIds, id => id),\n entityId: [],\n entityName: 'challenge',\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityId',\n };\n\n childActionList.push({\n actionName: ASSIGN_LABELS_TO_CHALLENGE_ACTION,\n actionFunction: assignLibraryLabels,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n },\n [assignLibraryLabels]\n );\n\n /**\n * @function handleAssignLinesToChallengeService\n * @param { { id: number} } entityData\n * @param { ScriptLine[] } currentLines\n * @returns { Promise<void> }\n */\n const handleAssignLinesToChallengeService = useCallback(\n async (entityData: { id: number }, currentLines: ScriptLine[]) => {\n const createdChallengeId = entityData?.id;\n\n if (createdChallengeId) {\n const createdChallengeLines = currentLines?.map(line => {\n const {\n audioId = 0,\n duration = 0,\n position = null,\n text = '',\n speaker = '',\n keywords = [],\n } = line || {};\n\n return {\n audioId,\n duration,\n position,\n text,\n speaker,\n keywords,\n } as ChallengeLine;\n });\n\n await assignLinesToChallenge(\n createdChallengeId,\n createdChallengeLines\n );\n }\n },\n [assignLinesToChallenge]\n );\n\n /**\n * @function handleAssignLinesToChallenge\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLinesToChallenge = useCallback(\n (\n currentLines: ScriptLine[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToChallengeOptions = {\n parameters: {\n entityData: [],\n currentLines,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: ASSIGN_LINES_TO_CHALLENGE_ACTION,\n actionFunction: handleAssignLinesToChallengeService,\n actionFunctionOptions: assignLinesToChallengeOptions as any,\n itemPerChunk: 10000,\n });\n },\n [handleAssignLinesToChallengeService]\n );\n\n /**\n * @param { CreateNewChallengeInfo } newChallengeInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newChallengeInfo: CreateNewChallengeInfo) => {\n const {\n title,\n description,\n sourceScenarioId,\n lines,\n labelIds,\n status,\n tryLimit,\n } = newChallengeInfo;\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: CREATE_CHALLENGE_ACTION,\n actionFunction: createNewChallenge,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n challengeInfo: { title, description, sourceScenarioId, tryLimit },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n };\n\n const childActionList: ChunkRequestActionInterface<any>[] = [];\n\n if (!isEmpty(labelIds)) {\n handleAssignLabelsToChallenge(labelIds, childActionList);\n }\n\n if (!isEmpty(lines)) {\n handleAssignLinesToChallenge(lines, childActionList);\n }\n\n if (status && status !== ChallengeStatuses.DRAFT) {\n handleUpdateChallengeStatus(status, childActionList);\n }\n\n actionList = { ...actionList, ...{ childActionList } };\n\n return actionList;\n },\n [\n createNewChallenge,\n handleAssignLabelsToChallenge,\n handleAssignLinesToChallenge,\n handleUpdateChallengeStatus,\n ]\n );\n}\n\n/**\n * @description Generates action list to pass to edit challenge service.\n * @function useGenerateEditChallengeActionList\n * @returns { CallableFunction }\n */\nexport function useGenerateEditChallengeActionList() {\n const updateChallengeInfo = useUpdateChallengeInfoApi();\n const assignLabelsToChallenge = useAssignChallengeLabelsApi();\n const deleteLabelsFromChallenge = useDeleteChallengeLabelsApi();\n const assignLinesToChallenge = useAssignLinesToChallengeApi();\n const updateChallengeStatusService = useUpdateChallengeStatusApi();\n\n /**\n * @function handleUpdateChallengeStatus\n * @param { number } challengeId\n * @param { ScenarioStatusType } currentStatus\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleUpdateChallengeStatus = useCallback(\n (\n challengeId: number,\n currentStatus: ChallengeStatusType,\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const updateChallengeStatusServiceOptions = {\n parameters: {\n currentStatus: currentStatus?.toLowerCase(),\n challengeIds: [challengeId],\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n };\n\n actionList.push({\n actionName: UPDATE_CHALLENGE_STATUS_ACTION,\n actionFunction: updateChallengeStatusService,\n actionFunctionOptions:\n updateChallengeStatusServiceOptions as any,\n });\n },\n [updateChallengeStatusService]\n );\n\n /**\n * @function handleAssignLabelsToChallenge\n * @param { number } challengeId\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleAssignLabelsToChallenge = useCallback(\n (\n challengeId: number,\n addedLabelIds: number[],\n deletedLabelIds: number[],\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n if (!isEmpty(addedLabelIds)) {\n const addedLabels = addedLabelIds.map(\n labelId =>\n ({\n challengeId,\n labelId,\n } as ChallengeLabel)\n );\n\n const assignLabelsToChallengeServiceOptions = {\n parameters: {\n labels: addedLabels,\n },\n fieldName: 'labels',\n };\n\n actionList.push({\n actionName: ASSIGN_LABELS_TO_CHALLENGE_ACTION,\n actionFunction: assignLabelsToChallenge,\n actionFunctionOptions:\n assignLabelsToChallengeServiceOptions as any,\n });\n }\n\n if (!isEmpty(deletedLabelIds)) {\n const deletedLabels = deletedLabelIds.map(\n labelId =>\n ({\n challengeId,\n labelId,\n } as ChallengeLabel)\n );\n\n const deleteLabelsFromChallengeServiceOptions = {\n parameters: {\n labels: deletedLabels,\n },\n fieldName: 'labels',\n };\n\n actionList.push({\n actionName: DELETE_LABELS_FROM_CHALLENGE_ACTION,\n actionFunction: deleteLabelsFromChallenge,\n actionFunctionOptions:\n deleteLabelsFromChallengeServiceOptions as any,\n });\n }\n },\n [assignLabelsToChallenge, deleteLabelsFromChallenge]\n );\n\n /**\n * @function handleAssignLinesToChallengeService\n * @param { number } challengeId\n * @param { ScriptLine[] } currentLines\n * @returns { Promise<void> }\n */\n const handleAssignLinesToChallengeService = useCallback(\n async (challengeId: number, currentLines: ScriptLine[]) => {\n if (challengeId) {\n const createdChallengeLines = currentLines?.map(line => {\n const {\n audioId = 0,\n duration = 0,\n position = null,\n text = '',\n speaker = '',\n keywords = [],\n } = line || {};\n\n return {\n audioId,\n duration,\n position,\n text,\n speaker,\n keywords,\n } as ScenarioLine;\n });\n\n await assignLinesToChallenge(\n challengeId,\n createdChallengeLines\n );\n }\n },\n [assignLinesToChallenge]\n );\n\n /**\n * @function handleAssignLinesToChallenge\n * @param { ChunkRequestActionInterface<any>[] } actionList\n * @returns { void }\n */\n const handleAssignLinesToChallenge = useCallback(\n (\n challengeId: number,\n currentLines: ScriptLine[],\n actionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToChallengeOptions = {\n parameters: {\n challengeId,\n currentLines,\n },\n fieldName: 'currentLines',\n };\n\n actionList.push({\n actionName: ASSIGN_LINES_TO_CHALLENGE_ACTION,\n actionFunction: handleAssignLinesToChallengeService,\n actionFunctionOptions: assignLinesToChallengeOptions as any,\n itemPerChunk: 10000,\n });\n },\n [handleAssignLinesToChallengeService]\n );\n\n /**\n * @param { EditChallengeInfo } newChallengeInfo\n * @returns { ChunkRequestActionInterface<any> }\n */\n return useCallback(\n (newChallengeInfo: EditChallengeInfo) => {\n const {\n challengeId,\n title,\n description,\n sourceScenarioId,\n addedLabelIds,\n deletedLabelIds,\n lines,\n status,\n tryLimit,\n } = newChallengeInfo;\n\n let actionList: ChunkRequestActionInterface<any>[] = [\n {\n actionName: UPDATE_CHALLENGE_ACTION,\n actionFunction: updateChallengeInfo,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n challengeId,\n challengeInfo: {\n title,\n description,\n sourceScenarioId,\n tryLimit,\n },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n },\n ];\n\n if (!isEmpty(addedLabelIds) || !isEmpty(deletedLabelIds)) {\n handleAssignLabelsToChallenge(\n challengeId,\n addedLabelIds,\n deletedLabelIds,\n actionList\n );\n }\n\n if (!isEmpty(lines)) {\n handleAssignLinesToChallenge(challengeId, lines, actionList);\n }\n\n if (status && status !== ChallengeStatuses.DRAFT) {\n handleUpdateChallengeStatus(challengeId, status, actionList);\n }\n\n return actionList;\n },\n [\n handleAssignLabelsToChallenge,\n handleAssignLinesToChallenge,\n handleUpdateChallengeStatus,\n updateChallengeInfo,\n ]\n );\n\n}","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { capitalize, isEmpty, uniqBy } from 'lodash';\n\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../ui/components/ModalDialogs/store/actions';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport { useChunkRequestsService } from '../../../../services/ChunkRequestService/hooks';\nimport { GeneralBulkActionModalInterface } from '../../../../ui/components/ModalDialogs/types';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { GenerateChallengeData, LibraryScope } from './types';\nimport { convertPresentVerbToPastVerb } from '../../../../helpers/functions/strings';\nimport {\n ASSIGN_LABELS_TO_CHALLENGE_ACTION,\n ASSIGN_LINES_TO_CHALLENGE_ACTION,\n CREATE_CHALLENGE_ACTION,\n initialGenerateChallengeData,\n} from './constants';\nimport {\n useAssignLinesToChallengeApi,\n useCreateChallengeApi,\n} from '../../../../api';\nimport { ScriptLine } from '../../../../constants/interfaces/ScriptLine';\nimport { ChallengeLine } from '../../../../api/challenges/types';\nimport { useAssignLibraryEntityLabelsService } from './helpers';\nimport {\n CLIENT_SIDE_ERROR_MESSAGE,\n PRACTIS_SET_ALREADY_EXISTED_ERROR_MESSAGE,\n} from '../../../../ui/components/ErrorMessages/constants';\n\n/**\n * @description function to create/edit/duplicate a selected library entity (PractisSet. Challenge, Scenario).\n * Create new entity by selected entity's details at first then assign relations to the result.\n * @function useCreateEditDuplicateLibraryBulActionService\n * @param { LibraryScope } scope\n * @param { string } entityTitle\n * @param { Function | undefined } onSuccessCallback\n * @param { Function | undefined } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useCreateEditDuplicateLibraryBulActionService(\n scope: LibraryScope,\n entityTitle: string,\n onSuccessCallback?: (responses?: Record<string, unknown>) => void,\n onErrorCallback?: (\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => void\n) {\n const actionList = useRef<ChunkRequestActionInterface<any>[]>([]);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const shouldShowModals = !isEmpty(actionList.current);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @param { ErrorResult | undefined } error\n * @param { Record<string, unknown> | undefined } completedResponses\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult, completedResponses?: Record<string, unknown>) => {\n const isAlreadyExistedErrorMessage =\n error?.message.includes('already exists');\n\n if (shouldShowModals) {\n if (isAlreadyExistedErrorMessage) {\n hideModalDialog();\n } else {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: `${capitalize(\n scope\n )} ${entityTitle}`,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n }\n\n actionList.current = [];\n isRunning && setIsRunning(false);\n\n if (error?.message) {\n const message = isAlreadyExistedErrorMessage\n ? CLIENT_SIDE_ERROR_MESSAGE[\n PRACTIS_SET_ALREADY_EXISTED_ERROR_MESSAGE\n ]\n : error.message;\n\n showMessage(message, 'error');\n }\n\n onErrorCallback?.(error, completedResponses);\n },\n [\n dispatch,\n entityTitle,\n hideModalDialog,\n isRunning,\n onErrorCallback,\n scope,\n shouldShowModals,\n showMessage,\n ]\n );\n\n /**\n * @function handleSuccessServiceCallback\n * @param { Record<string, unknown> | undefined } responses\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(\n (responses?: Record<string, unknown>) => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n actionList.current = [];\n isRunning && setIsRunning(false);\n showMessage(\n `${entityTitle} has been ${convertPresentVerbToPastVerb(\n scope\n )}`,\n 'success'\n );\n\n onSuccessCallback?.(responses);\n });\n },\n [\n entityTitle,\n hideModalDialog,\n isRunning,\n onSuccessCallback,\n scope,\n showMessage,\n ]\n );\n\n const { setIsStopped } = useChunkRequestsService(\n actionList.current,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDuplicateLibraryBulkActionService\n * @returns { void }\n */\n const handleStopDuplicateLibraryBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n isRunning && setIsRunning(false);\n actionList.current = [];\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, setIsStopped]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: `${capitalize(scope)} ${entityTitle}`,\n onStopBulkActionService:\n handleStopDuplicateLibraryBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n });\n }, [\n shouldShowModals,\n setIsStopped,\n dispatch,\n scope,\n entityTitle,\n handleStopDuplicateLibraryBulkActionService,\n hideModalDialog,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n /**\n * @description Call the service runner.\n * @function callback\n * @param { ChunkRequestActionInterface<any>[] } action\n * @returns { void }\n */\n return useCallback(\n (duplicateLibraryActionList: ChunkRequestActionInterface<any>[]) => {\n actionList.current = duplicateLibraryActionList;\n\n setIsRunning(true);\n },\n []\n );\n}\n\n/**\n * @description function to generate challenge from scenario.\n * @function useGenerateChallengeBulActionService\n * @param { Function | undefined } onSuccessCallback\n * @param { Function | undefined } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useGenerateChallengeBulActionService(\n onSuccessCallback?: (responses?: Record<string, unknown>) => void,\n onErrorCallback?: (\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => void\n) {\n const generateChallengeData = useRef<GenerateChallengeData>(\n initialGenerateChallengeData\n );\n\n const { title, description, sourceScenarioId, lines, labelIds, tryLimit } =\n generateChallengeData.current;\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const createNewChallenge = useCreateChallengeApi();\n const assignLibraryLabels = useAssignLibraryEntityLabelsService();\n const assignLinesToChallenge = useAssignLinesToChallengeApi();\n\n const dispatch = useDispatch();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n let actionList: ChunkRequestActionInterface<any> = {\n actionName: CREATE_CHALLENGE_ACTION,\n actionFunction: createNewChallenge,\n actionFunctionOptions: {\n parameters: {\n challengeInfo: {\n title,\n description,\n sourceScenarioId,\n tryLimit,\n },\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n },\n };\n\n const childActionList: ChunkRequestActionInterface<any>[] = [];\n\n /**\n * @function handleAssignLinesToChallengeService\n * @param { { id: number} } entityData\n * @param { ScriptLine[] } currentLines\n * @returns { Promise<void> }\n */\n const handleAssignLinesToChallengeService = useCallback(\n async (entityData: { id: number }, currentLines: ScriptLine[]) => {\n const createdChallengeId = entityData?.id;\n\n if (createdChallengeId) {\n const createdChallengeLines = currentLines?.map(line => {\n const {\n audioId = 0,\n duration = 0,\n position = null,\n text = '',\n speaker = '',\n keywords = [],\n } = line || {};\n\n return {\n audioId,\n duration,\n position,\n text,\n speaker,\n keywords,\n } as ChallengeLine;\n });\n\n await assignLinesToChallenge(\n createdChallengeId,\n createdChallengeLines\n );\n }\n },\n [assignLinesToChallenge]\n );\n\n /**\n * @function handleAssignLinesToChallenge\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLinesToChallenge = useCallback(\n (\n currentLines: ScriptLine[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLinesToChallengeOptions = {\n parameters: {\n entityData: [],\n currentLines,\n itemPerChunk: 1,\n },\n fieldName: 'itemPerChunk',\n secondaryFieldName: 'entityData',\n };\n\n childActionList.push({\n actionName: ASSIGN_LINES_TO_CHALLENGE_ACTION,\n actionFunction: handleAssignLinesToChallengeService,\n actionFunctionOptions: assignLinesToChallengeOptions as any,\n });\n },\n [handleAssignLinesToChallengeService]\n );\n\n /**\n * @function handleAssignLabelsToChallenge\n * @param { number[] } labelIds\n * @param { ChunkRequestActionInterface<any>[] } childActionList\n * @returns { void }\n */\n const handleAssignLabelsToChallenge = useCallback(\n (\n labelIds: number[],\n childActionList: ChunkRequestActionInterface<any>[]\n ) => {\n const assignLabelsToEntityServiceOptions = {\n parameters: {\n labels: uniqBy(labelIds, id => id),\n entityId: [],\n entityName: 'challenge',\n },\n fieldName: 'labels',\n secondaryFieldName: 'entityId',\n };\n\n childActionList.push({\n actionName: ASSIGN_LABELS_TO_CHALLENGE_ACTION,\n actionFunction: assignLibraryLabels,\n actionFunctionOptions:\n assignLabelsToEntityServiceOptions as any,\n });\n },\n [assignLibraryLabels]\n );\n\n if (!isEmpty(lines)) {\n handleAssignLinesToChallenge(lines, childActionList);\n }\n\n if (!isEmpty(labelIds)) {\n handleAssignLabelsToChallenge(labelIds, childActionList);\n }\n\n if (!isEmpty(childActionList)) {\n actionList = { ...actionList, ...{ childActionList } };\n }\n\n const shouldShowModals = !isEmpty(generateChallengeData.current);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @param { ErrorResult | undefined } error\n * @param { Record<string, unknown> | undefined } completedResponses\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(\n (error?: ErrorResult, completedResponses?: Record<string, unknown>) => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: `Generating Challenge`,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n }\n\n generateChallengeData.current = initialGenerateChallengeData;\n isRunning && setIsRunning(false);\n error?.message && showMessage(error.message, 'error');\n\n onErrorCallback?.(error, completedResponses);\n },\n [\n dispatch,\n hideModalDialog,\n isRunning,\n onErrorCallback,\n shouldShowModals,\n showMessage,\n ]\n );\n\n /**\n * @function handleSuccessServiceCallback\n * @param { Record<string, unknown> | undefined } responses\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(\n (responses?: Record<string, unknown>) => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n generateChallengeData.current = initialGenerateChallengeData;\n\n isRunning && setIsRunning(false);\n\n onSuccessCallback?.(responses);\n });\n },\n [hideModalDialog, isRunning, onSuccessCallback]\n );\n\n const { setIsStopped } = useChunkRequestsService(\n [actionList],\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDuplicateLibraryBulkActionService\n * @returns { void }\n */\n const handleStopDuplicateLibraryBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n hideModalDialog();\n isRunning && setIsRunning(false);\n generateChallengeData.current = initialGenerateChallengeData;\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, setIsStopped]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n if (shouldShowModals) {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: `Generating Challenge`,\n onStopBulkActionService:\n handleStopDuplicateLibraryBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n }\n\n setIsStopped(false);\n });\n }, [\n shouldShowModals,\n setIsStopped,\n dispatch,\n handleStopDuplicateLibraryBulkActionService,\n hideModalDialog,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n /**\n * @description Call the service runner.\n * @function callback\n * @param { GenerateChallengeData } generateChallengeData\n * @returns { void }\n */\n return useCallback((data: GenerateChallengeData) => {\n generateChallengeData.current = data;\n\n setIsRunning(true);\n }, []);\n}\n","import {\r\n createContext,\r\n FC,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { RouteComponentProps, useHistory, withRouter } from 'react-router-dom';\r\nimport NavigationPrompt from 'react-router-navigation-prompt';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport {\r\n Scenario,\r\n ScenarioStatuses,\r\n Status,\r\n} from '../../../constants/interfaces/Scenario';\r\nimport {\r\n ScriptLine,\r\n ScriptLineSpeaker,\r\n} from '../../../constants/interfaces/ScriptLine';\r\nimport CustomBody from './components/CustomBody';\r\nimport CustomHeader from './components/CustomHeader/CustomHeader';\r\nimport { getScenarioState, ScenarioCases } from './store/reducers';\r\nimport {\r\n useClearScriptLinesService,\r\n useCreateScriptLineService,\r\n useGetRoleplayForScenario,\r\n useGetScenarioService,\r\n useModifyScenarioService,\r\n useResetScenarioService,\r\n} from './store/services';\r\nimport {\r\n useCreatePlaylistService,\r\n useResetAudioService,\r\n} from '../../../features/player/store/services';\r\nimport { validationService } from './tools';\r\nimport { buildPageTitle } from '../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../constants/enums/EditModeValues';\r\nimport { useLoadVoiceSettingsService } from '../../CompanySettings/store/services';\r\nimport styled from 'styled-components';\r\nimport { usePermissionsState } from '../../../features/permissions/store/state';\r\nimport { CheckPermission } from '../../../features/permissions';\r\nimport ActionPanel from './components/ActionPanel/ActionPanel';\r\nimport { useLabelsState } from '../../../features/labels/store/states';\r\nimport {\r\n useSetAssignLabelsActionService,\r\n useSetPreviouslyAssignedLabelsAction,\r\n} from '../../../features/labels/store/services';\r\nimport {\r\n calculateAssignedLabels,\r\n calculateRemovedLabels,\r\n useCalculatePreSelectedLabelsForSingleItem,\r\n} from '../../../features/labels/tools';\r\nimport { isTeamLeader } from '../../../constants/enums';\r\nimport { usePortableLabelsState } from '../../../features/portableLabels/store/states';\r\nimport { UserProfile } from '../../../constants/interfaces/User';\r\nimport { getProfileState } from '../../UserProfile/store/reducers';\r\nimport { ModalPageContainer } from '../../../ui/components/ModalPage';\r\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\r\nimport {\r\n useGenerateCreateDuplicateScenarioActionList,\r\n useGenerateEditScenarioActionList,\r\n} from '../../../features/library/services/LibraryBulkActionsService/helpers';\r\nimport { useCreateEditDuplicateLibraryBulActionService } from '../../../features/library/services/LibraryBulkActionsService';\r\nimport {\r\n CreateNewScenarioInfo,\r\n EditScenarioInfo,\r\n} from '../../../features/library/services/LibraryBulkActionsService/types';\r\nimport {\r\n useCreateEditScenarioFailedCallback,\r\n useCreateEditScenarioSuccessCallback,\r\n useHandleArchiveScenario,\r\n} from './services';\r\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\r\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\r\n\r\nconst uuid = require('uuid/v1');\r\nconst qs = require('query-string');\r\n\r\nexport const StyledContainer = styled.div`\r\n overflow: auto;\r\n height: 100%;\r\n display: block;\r\n padding: 0 32px;\r\n background: ${props => props.theme.Colors.white};\r\n border-top-left-radius: 8px;\r\n border-bottom-left-radius: 8px;\r\n`;\r\n\r\nexport const StyledLoadingContainer = styled.div`\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst CreatedByWrapper = styled.div`\r\n padding: 0 16px 10px;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n font-size: 13px;\r\n`;\r\n\r\nexport const StatusItems: Array<{\r\n value: string;\r\n name: string;\r\n confirm: boolean;\r\n message: string;\r\n}> = [\r\n {\r\n value: 'DRAFT',\r\n name: 'Draft',\r\n message: 'Scenario saved as Draft',\r\n confirm: false,\r\n },\r\n {\r\n value: 'ACTIVE',\r\n name: 'Active',\r\n message: 'Scenario published',\r\n confirm: false,\r\n },\r\n {\r\n value: 'ARCHIVED',\r\n name: 'Archived',\r\n message: 'Scenario archived',\r\n confirm: true,\r\n },\r\n {\r\n value: 'DELETED',\r\n name: 'Deleted',\r\n message: 'Scenario deleted',\r\n confirm: true,\r\n },\r\n ];\r\n\r\nexport const LoadingSaveContext = createContext(false);\r\nexport const ScenarioContainerContext = createContext<any>(null);\r\nexport const PlayAudioContext = createContext<any>(null);\r\nexport const EditModeContext = createContext<{\r\n mode: string;\r\n action: (mode: EditModeValues) => void;\r\n}>({\r\n mode: 'view',\r\n action: () => { },\r\n});\r\n\r\nexport interface NewScenarioInterface extends RouteComponentProps {\r\n profile?: UserProfile;\r\n scenario: Scenario;\r\n scenarioId: string;\r\n loading: boolean;\r\n isNew: boolean;\r\n scenarioCase: ScenarioCases;\r\n handleFetchScenario: (scenarioId: number) => void;\r\n handleCreateScriptLine?: any;\r\n handleCreatePlaylist?: any;\r\n handleResetPlaylist: () => void;\r\n handleResetScenario: () => void;\r\n handleLoadVoiceSettings: () => void;\r\n itemId?: number;\r\n location: any;\r\n match: any;\r\n dispatch?: any;\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n showMessage: (\r\n message: string | string[],\r\n status: 'error' | 'success'\r\n ) => void;\r\n clearScriptLines: () => void;\r\n}\r\n\r\nconst NewScenario: FC<NewScenarioInterface> = ({\r\n history,\r\n profile,\r\n scenario,\r\n scenarioId,\r\n loading,\r\n isNew,\r\n scenarioCase,\r\n closeGoingBack,\r\n handleCreateScriptLine,\r\n handleResetScenario,\r\n handleFetchScenario,\r\n handleResetPlaylist,\r\n handleCreatePlaylist,\r\n handleLoadVoiceSettings,\r\n closePath,\r\n showMessage,\r\n clearScriptLines,\r\n}) => {\r\n const createEditScenarioSuccessCallback =\r\n useCreateEditScenarioSuccessCallback();\r\n const createEditScenarioFailedCallback =\r\n useCreateEditScenarioFailedCallback();\r\n const handleArchiveScenario = useHandleArchiveScenario();\r\n const getRoleplayForScenario = useGetRoleplayForScenario()\r\n const location = history.location;\r\n\r\n const [editMode, setEditMode] = useState<EditModeValues>(\r\n EditModeValues.VIEW\r\n );\r\n const [loadingSave, setLoadingSave] = useState(false);\r\n const parentRef = useRef(null);\r\n const permissions = usePermissionsState();\r\n const isTeamLead = isTeamLeader(profile?.role?.name);\r\n const [titleError, setTitleError] = useState(false);\r\n const roleplayId = qs.parse(location.search)?.roleplayId;\r\n const contentId = qs.parse(location.search)?.contentId;\r\n const modifyScenario = useModifyScenarioService();\r\n\r\n useHtmlPageTitle(\r\n buildPageTitle('Scenario', editMode, isNew),\r\n [scenario.title]\r\n );\r\n\r\n const isLoaded = !!scenario.id;\r\n\r\n const onUnload = useCallback(\r\n (e: any) => {\r\n e.preventDefault();\r\n if (\r\n scenarioCase === 'modified' &&\r\n permissions.includes(NEW_PERMISSIONS.UPDATE_SCENARIO)\r\n ) {\r\n e.returnValue = true;\r\n }\r\n },\r\n [scenarioCase, permissions]\r\n );\r\n\r\n useEffect(() => {\r\n setEditMode(\r\n (isLoaded || isNew) && scenario.status === ScenarioStatuses.DRAFT && !isTeamLead\r\n ? EditModeValues.EDIT\r\n : EditModeValues.VIEW\r\n );\r\n }, [isLoaded, isNew, scenario.status, setEditMode, isTeamLead]);\r\n\r\n useEffect(() => {\r\n if (!isTeamLeader(profile?.role?.name)) {\r\n handleLoadVoiceSettings();\r\n }\r\n }, [handleLoadVoiceSettings, profile?.role?.name]);\r\n\r\n useEffect(() => {\r\n if (scenarioId !== 'new') {\r\n handleFetchScenario(Number(scenarioId));\r\n } else {\r\n handleResetScenario();\r\n handleResetPlaylist();\r\n }\r\n return () => {\r\n handleResetScenario();\r\n handleResetPlaylist();\r\n };\r\n }, [\r\n handleResetScenario,\r\n handleFetchScenario,\r\n handleResetPlaylist,\r\n scenarioId,\r\n ]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('beforeunload', onUnload);\r\n return () => {\r\n window.removeEventListener('beforeunload', onUnload);\r\n };\r\n }, [onUnload]);\r\n\r\n const createScriptLine = (speaker: ScriptLineSpeaker, text?: string) => {\r\n const sendValues = {\r\n id: `temp_${uuid()}`,\r\n text: text ?? '',\r\n speaker: speaker,\r\n position: scenario.script ? scenario.script.lines.length + 1 : 1,\r\n scriptId: scenario.scriptId,\r\n keywords: [],\r\n };\r\n\r\n handleCreateScriptLine(sendValues);\r\n };\r\n\r\n const playAllAudio = () => {\r\n handleResetPlaylist();\r\n const filterItems = scenario.script.lines.filter(\r\n (script: ScriptLine) => script.audioUrl\r\n );\r\n const playlistItems = filterItems.map(\r\n (script: ScriptLine) => script.id\r\n );\r\n setTimeout(() => {\r\n handleCreatePlaylist(playlistItems);\r\n }, 150);\r\n };\r\n\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState().data;\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const setPreviouslyAssignedLabelsAction =\r\n useSetPreviouslyAssignedLabelsAction();\r\n const calculatePreSelectedLabels =\r\n useCalculatePreSelectedLabelsForSingleItem();\r\n\r\n const generateCreateScenarioActionList =\r\n useGenerateCreateDuplicateScenarioActionList();\r\n\r\n const generateEditScenarioActionList = useGenerateEditScenarioActionList();\r\n\r\n const createLibraryBulkActionService =\r\n useCreateEditDuplicateLibraryBulActionService(\r\n isNew ? 'create' : 'update',\r\n 'Scenario',\r\n responses =>\r\n createEditScenarioSuccessCallback(setLoadingSave, responses),\r\n (error, completedResponses) =>\r\n createEditScenarioFailedCallback(\r\n setLoadingSave,\r\n error,\r\n completedResponses\r\n )\r\n );\r\n\r\n const handleUpdateScenario = (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status\r\n ) => {\r\n setLoadingSave(true);\r\n const response = validationService(\r\n scenario,\r\n status ? status : scenario.status\r\n );\r\n\r\n if (!response.valid) {\r\n callbacks && callbacks.onCancel();\r\n showMessage(response.message, 'error');\r\n setLoadingSave(false);\r\n\r\n if (response.name === 'name') {\r\n setTitleError(true);\r\n } else {\r\n setTitleError(false);\r\n }\r\n return;\r\n } else {\r\n setTitleError(false);\r\n }\r\n\r\n const newScenarioInfo: CreateNewScenarioInfo = {\r\n title: scenario.title,\r\n description: scenario.description,\r\n labelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n lines: scenario.script?.lines ? scenario.script?.lines.map((line, index) => ({ ...line, position: index + 1 })) : [],\r\n status: status ?? scenario.status,\r\n };\r\n\r\n const editScenarioInfo: EditScenarioInfo = {\r\n scenarioId: scenario.id ?? 0,\r\n title: scenario.title,\r\n description: scenario.description,\r\n addedLabelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n deletedLabelIds: calculateRemovedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n lines: newScenarioInfo.lines ?? [],\r\n status: status ?? scenario.status,\r\n };\r\n\r\n const createScenarioActionList =\r\n generateCreateScenarioActionList(newScenarioInfo);\r\n\r\n const editScenarioActionList =\r\n generateEditScenarioActionList(editScenarioInfo);\r\n\r\n if (status !== ScenarioStatuses.ARCHIVED) {\r\n if (!scenario.id) {\r\n createLibraryBulkActionService([createScenarioActionList]);\r\n } else {\r\n createLibraryBulkActionService(editScenarioActionList);\r\n }\r\n } else {\r\n scenario?.id && handleArchiveScenario(scenario.id);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (scenario.labels && scenario.labels.length > 0) {\r\n const selectedLabelIds = scenario.labels;\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList\r\n );\r\n setAssignLabelsAction(preAssignedLabels);\r\n } else {\r\n setAssignLabelsAction([]);\r\n }\r\n return () => {\r\n setAssignLabelsAction([]);\r\n };\r\n }, [\r\n scenario.labels,\r\n labelsList,\r\n calculatePreSelectedLabels,\r\n setAssignLabelsAction,\r\n ]);\r\n\r\n //initially set previousAssignedLabels\r\n useEffect(() => {\r\n if (!isEmpty(scenario.labels)) {\r\n const selectedLabelIds = scenario.labels ?? [];\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList\r\n );\r\n setPreviouslyAssignedLabelsAction(preAssignedLabels);\r\n } else {\r\n setPreviouslyAssignedLabelsAction([]);\r\n }\r\n return () => {\r\n setPreviouslyAssignedLabelsAction([]);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [scenario.labels]);\r\n\r\n useEffect(() => {\r\n if (roleplayId && contentId) {\r\n getRoleplayForScenario(roleplayId, contentId).then(({ aiLines, title, description }) => {\r\n aiLines.forEach(line => createScriptLine(line.speaker, line.text));\r\n\r\n modifyScenario(title || '', 'title');\r\n modifyScenario(description || '', 'description');\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [roleplayId, contentId, getRoleplayForScenario])\r\n\r\n const willBeLoaded = !isNew && scenarioCase === 'init' && !scenario?.id;\r\n const showEmptyScreen = loading || willBeLoaded;\r\n if (showEmptyScreen)\r\n return (\r\n <ModalPageContainer\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n >\r\n <StyledLoadingContainer>\r\n {loading && <Loading />}\r\n </StyledLoadingContainer>\r\n </ModalPageContainer>\r\n );\r\n return (\r\n <ModalPageContainer\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n >\r\n <StyledContainer ref={parentRef}>\r\n <EditModeContext.Provider\r\n value={{ mode: editMode, action: setEditMode }}\r\n >\r\n <LoadingSaveContext.Provider value={loadingSave}>\r\n <CustomHeader\r\n scenario={scenario}\r\n handleUpdateScenario={handleUpdateScenario}\r\n modified={scenarioCase === 'modified'}\r\n isViewMode={isTeamLead}\r\n />\r\n </LoadingSaveContext.Provider>\r\n <ActionPanel scenario={scenario} titleError={titleError} />\r\n {scenario.creator && (\r\n <CreatedByWrapper data-test=\"created-by-subtitle\">\r\n Created by {scenario.creator?.firstName}{' '}\r\n {scenario.creator?.lastName}\r\n </CreatedByWrapper>\r\n )}\r\n <TableDivider />\r\n <ScenarioContainerContext.Provider value={parentRef}>\r\n <PlayAudioContext.Provider value={playAllAudio}>\r\n <CustomBody\r\n createScriptLine={createScriptLine}\r\n scenario={scenario}\r\n />\r\n </PlayAudioContext.Provider>\r\n </ScenarioContainerContext.Provider>\r\n </EditModeContext.Provider>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.UPDATE_SCENARIO]}\r\n >\r\n <NavigationPrompt when={scenarioCase === 'modified'}>\r\n {({ onConfirm, onCancel }) => (\r\n <DialogWrapper\r\n modalTitle=\"Discard changes?\"\r\n description={\r\n 'Do you want to save or discard changes?'\r\n }\r\n cancelButtonText={'Discard'}\r\n confirmButtonText={'Save'}\r\n onCancel={onConfirm}\r\n onConfirm={() => {\r\n handleUpdateScenario({\r\n onConfirm: onConfirm,\r\n onCancel: onCancel,\r\n });\r\n }}\r\n dataTest=\"confirmation-modal\"\r\n />\r\n )}\r\n </NavigationPrompt>\r\n </CheckPermission>\r\n </StyledContainer>\r\n </ModalPageContainer>\r\n );\r\n};\r\n\r\nexport interface NewScenarioContainerProps\r\n extends RouteComponentProps<{ scenarioId: string }> {\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n}\r\nexport const NewScenarioContainer: FC<NewScenarioContainerProps> = ({\r\n closePath,\r\n closeGoingBack,\r\n location,\r\n match,\r\n}) => {\r\n const history = useHistory();\r\n const profile = useSelector(getProfileState);\r\n const isNew = match.params.scenarioId === 'new';\r\n\r\n const scenario = useSelector(getScenarioState).info;\r\n const loading = useSelector(getScenarioState).loading;\r\n const scenarioCase = useSelector(getScenarioState).case;\r\n\r\n const getScenario = useGetScenarioService();\r\n const createScriptLine = useCreateScriptLineService();\r\n const clearScriptLines = useClearScriptLinesService();\r\n const resetScenario = useResetScenarioService();\r\n const createScriptPlaylist = useCreatePlaylistService();\r\n const resetPlaylist = useResetAudioService();\r\n const showMessage = useShowMessage();\r\n const loadVoiceSettings = useLoadVoiceSettingsService();\r\n const handleLoadVoiceSettings = useCallback(\r\n () => profile?.companyId && loadVoiceSettings(profile?.companyId),\r\n [loadVoiceSettings, profile?.companyId]\r\n );\r\n\r\n return (\r\n <NewScenario\r\n location={location}\r\n history={history}\r\n profile={profile}\r\n match={match}\r\n closeGoingBack={closeGoingBack}\r\n closePath={closePath}\r\n scenario={scenario}\r\n scenarioId={match.params.scenarioId}\r\n isNew={isNew}\r\n loading={loading}\r\n scenarioCase={scenarioCase}\r\n handleFetchScenario={getScenario}\r\n handleCreateScriptLine={createScriptLine}\r\n handleCreatePlaylist={createScriptPlaylist}\r\n handleResetPlaylist={resetPlaylist}\r\n handleResetScenario={resetScenario}\r\n handleLoadVoiceSettings={handleLoadVoiceSettings}\r\n showMessage={showMessage}\r\n clearScriptLines={clearScriptLines}\r\n />\r\n );\r\n};\r\n\r\nexport default withRouter(NewScenarioContainer);\r\n","import { Scenario } from '../../../../constants/interfaces/Scenario';\nimport {\n PractisSetContent,\n PractisSets,\n} from '../../../../constants/interfaces/PractisSets';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\n\nexport enum ACTIONS {\n GET_SINGLE_PRACTIS_SET_START = 'GET_SINGLE_PRACTIS_SET_START',\n GET_SINGLE_PRACTIS_SET_SUCCESS = 'GET_SINGLE_PRACTIS_SET_SUCCESS',\n GET_SINGLE_PRACTIS_SET_FAILURE = 'GET_SINGLE_PRACTIS_SET_FAILURE',\n\n SEARCH_PRACTIS_SCENARIOS_START = 'SEARCH_PRACTIS_SCENARIOS_START',\n SEARCH_PRACTIS_SCENARIOS_SUCCESS = 'SEARCH_PRACTIS_SCENARIOS_SUCCESS',\n SEARCH_PRACTIS_SCENARIOS_FAILURE = 'SEARCH_PRACTIS_SCENARIOS_FAILURE',\n\n GET_PRACTIS_SCENARIOS_COUNT_SUCCESS = 'GET_PRACTIS_SCENARIOS_COUNT_SUCCESS',\n\n SEARCH_PRACTIS_CHALLENGES_START = 'SEARCH_PRACTIS_CHALLENGES_START',\n SEARCH_PRACTIS_CHALLENGES_SUCCESS = 'SEARCH_PRACTIS_CHALLENGES_SUCCESS',\n SEARCH_PRACTIS_CHALLENGES_FAILURE = 'SEARCH_PRACTIS_CHALLENGES_FAILURE',\n\n GET_PRACTIS_CHALLENGES_COUNT_SUCCESS = 'GET_PRACTIS_CHALLENGES_COUNT_SUCCESS',\n\n RESET_PRACTIS_SETS = 'RESET_PRACTIS_SETS',\n UPDATE_PRACTIS_CONTENT = 'UPDATE_PRACTIS_CONTENT',\n PRACTIS_CONTENT_REP_COUNT_INCREASE = 'PRACTIS_CONTENT_REP_COUNT_INCREASE',\n PRACTIS_CONTENT_REP_COUNT_DECREASE = 'PRACTIS_CONTENT_REP_COUNT_DECREASE',\n\n STORE_PRACTIS_SET_TEMP_COPY = 'STORE_PRACTIS_SET_TEMP_COPY',\n RESTORE_PRACTIS_SET_FROM_TEMP = 'RESTORE_PRACTIS_SET_FROM_TEMP',\n\n MODIFY_PRACTIS_SET = 'MODIFY_PRACTIS_SET',\n}\n\nexport function searchPractisScenariosStart() {\n return {\n type: ACTIONS.SEARCH_PRACTIS_SCENARIOS_START as ACTIONS.SEARCH_PRACTIS_SCENARIOS_START,\n };\n}\n\nexport function searchPractisScenariosSuccess(data: Scenario[]) {\n return {\n type: ACTIONS.SEARCH_PRACTIS_SCENARIOS_SUCCESS as ACTIONS.SEARCH_PRACTIS_SCENARIOS_SUCCESS,\n data,\n };\n}\n\nexport function searchPractisScenariosFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_PRACTIS_SCENARIOS_FAILURE as ACTIONS.SEARCH_PRACTIS_SCENARIOS_FAILURE,\n error,\n };\n}\n\nexport function getPractisScenarioCountSuccess(count: number) {\n return {\n type: ACTIONS.GET_PRACTIS_SCENARIOS_COUNT_SUCCESS as ACTIONS.GET_PRACTIS_SCENARIOS_COUNT_SUCCESS,\n count,\n };\n}\n\nexport function searchPractisChallengesStart() {\n return {\n type: ACTIONS.SEARCH_PRACTIS_CHALLENGES_START as ACTIONS.SEARCH_PRACTIS_CHALLENGES_START,\n };\n}\n\nexport function searchPractisChallengesSuccess(data: Challenge[]) {\n return {\n type: ACTIONS.SEARCH_PRACTIS_CHALLENGES_SUCCESS as ACTIONS.SEARCH_PRACTIS_CHALLENGES_SUCCESS,\n data,\n };\n}\n\nexport function searchPractisChallengesFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_PRACTIS_CHALLENGES_FAILURE as ACTIONS.SEARCH_PRACTIS_CHALLENGES_FAILURE,\n error,\n };\n}\n\nexport function getPractisChallengesCountSuccess(count: number) {\n return {\n type: ACTIONS.GET_PRACTIS_CHALLENGES_COUNT_SUCCESS as ACTIONS.GET_PRACTIS_CHALLENGES_COUNT_SUCCESS,\n count,\n };\n}\n\nexport function updatePractisContentAction(data: PractisSetContent[]) {\n return {\n type: ACTIONS.UPDATE_PRACTIS_CONTENT as ACTIONS.UPDATE_PRACTIS_CONTENT,\n data,\n };\n}\n\nexport function practisContentRepCountIncrease(itemId: number) {\n return {\n type: ACTIONS.PRACTIS_CONTENT_REP_COUNT_INCREASE as ACTIONS.PRACTIS_CONTENT_REP_COUNT_INCREASE,\n itemId,\n };\n}\n\nexport function practisContentRepCountDecrease(itemId: number) {\n return {\n type: ACTIONS.PRACTIS_CONTENT_REP_COUNT_DECREASE as ACTIONS.PRACTIS_CONTENT_REP_COUNT_DECREASE,\n itemId,\n };\n}\n\nexport function resetPractisSetsAction() {\n return {\n type: ACTIONS.RESET_PRACTIS_SETS as ACTIONS.RESET_PRACTIS_SETS,\n };\n}\n\nexport function getSinglePractisSetStart() {\n return {\n type: ACTIONS.GET_SINGLE_PRACTIS_SET_START as ACTIONS.GET_SINGLE_PRACTIS_SET_START,\n };\n}\n\nexport function getSinglePractisSetSuccess(data: PractisSets) {\n return {\n type: ACTIONS.GET_SINGLE_PRACTIS_SET_SUCCESS as ACTIONS.GET_SINGLE_PRACTIS_SET_SUCCESS,\n data,\n };\n}\n\nexport function getSinglePractisSetFailure(error: any) {\n return {\n type: ACTIONS.GET_SINGLE_PRACTIS_SET_FAILURE as ACTIONS.GET_SINGLE_PRACTIS_SET_FAILURE,\n error,\n };\n}\n\nexport function modifyPractisSetAction(\n data: PractisSets,\n field: string,\n silent?: boolean\n) {\n return {\n type: ACTIONS.MODIFY_PRACTIS_SET as ACTIONS.MODIFY_PRACTIS_SET,\n field: field,\n data: data,\n silent: silent,\n };\n}\n\nexport function storePractisSetTempCopyAction() {\n return {\n type: ACTIONS.STORE_PRACTIS_SET_TEMP_COPY as ACTIONS.STORE_PRACTIS_SET_TEMP_COPY,\n };\n}\n\nexport function restorePractisSetFromTempAction() {\n return {\n type: ACTIONS.RESTORE_PRACTIS_SET_FROM_TEMP as ACTIONS.RESTORE_PRACTIS_SET_FROM_TEMP,\n };\n}\n","import {\n PractisSetContent,\n PractisSetStatuses,\n} from '../../../constants/interfaces/PractisSets';\nimport { Variables } from '../../../theme/variables';\n\nexport enum PractisSetEntityTypes {\n CHALLENGE = 'CHALLENGE',\n SCENARIO = 'SCENARIO',\n}\n\nconst PractisSetEntityTypeNames = {\n [PractisSetEntityTypes.CHALLENGE as string]: 'Challenge',\n [PractisSetEntityTypes.SCENARIO as string]: 'Scenario',\n};\n\nexport function practisSetEntityTypeName(type?: string): string {\n return (type && PractisSetEntityTypeNames[type]) || type || '';\n}\n\nconst practisSetEntityTypeColors = {\n [PractisSetEntityTypes.CHALLENGE as string]: Variables.Colors.coral,\n [PractisSetEntityTypes.SCENARIO as string]: Variables.Colors.softBlue,\n};\n\nexport function practisSetEntityTypeColor(type?: string): string {\n return (\n (type && practisSetEntityTypeColors[type]) || Variables.Colors.softBlue\n );\n}\n\nconst PractisSetStatusNames = {\n [PractisSetStatuses.ACTIVE as string]: 'Active',\n [PractisSetStatuses.ARCHIVED as string]: 'Archived',\n [PractisSetStatuses.DRAFT as string]: 'Draft',\n [PractisSetStatuses.DELETED as string]: 'Deleted',\n};\n\nexport function PractisSetStatusName(status?: string): string {\n return (status && PractisSetStatusNames[status]) || status || '';\n}\n\nexport function calculatePractisSetTotalDuration(data: any) {\n const newDurations = data\n .filter(\n (content: PractisSetContent) =>\n content.type === PractisSetEntityTypes.SCENARIO &&\n content.scenario?.script?.totalDuration\n )\n .map((content: PractisSetContent) => {\n if (content?.scenario?.script?.totalDuration && content.minRepsCount) {\n return content.scenario.script.totalDuration* content.minRepsCount;\n } else {\n return content.scenario?.script?.totalDuration;\n }\n });\n\n return newDurations.length > 0\n ? newDurations.reduce((a: number, b: number) => a! + b!)\n : 0;\n}","import { ScriptLine, ScriptLineSpeaker } from '../../../constants/interfaces/ScriptLine';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\n\nexport const validationService = (scenario: Scenario, status: string) => {\n const output = {\n valid: true,\n message: '',\n name: '',\n };\n\n switch (status) {\n case 'DELETED':\n output.valid = true;\n break;\n case 'ACTIVE':\n if (!scenario.title?.trim()) {\n output.valid = false;\n output.message = 'Title required';\n output.name = 'name';\n } else if (!scenario.script.lines.length) {\n output.valid = false;\n output.message = 'Scenario should have at least one line';\n } else if (!scenario.script.lines.find(line => line.speaker === ScriptLineSpeaker.REP)) {\n output.valid = false;\n output.message = 'Rep line required!';\n } else if (\n !scenario.script.totalDuration ||\n scenario.script.totalDuration < 0.1\n ) {\n output.valid = false;\n output.message = 'Audio records required';\n }\n scenario.script.lines.map((line: ScriptLine) => {\n if (!line.audioUrl) {\n output.valid = false;\n output.message = 'Audio records required';\n } else if (line.audioUrl && line.text.length === 0) {\n output.valid = false;\n output.message = 'Text is required';\n } \n return output;\n });\n break;\n case 'DRAFT':\n if (!scenario.title?.trim()) {\n output.valid = false;\n output.message = 'Title required';\n output.name = 'name';\n } else if (scenario.script.lines.some(line => !line.audioId)) {\n output.valid = false;\n output.message = 'Audio records required';\n }\n break;\n case 'ARCHIVED':\n default:\n if (scenario.title.length < 1) {\n output.valid = false;\n output.message = 'Title required';\n }\n }\n return output;\n};\n","import {\n PractisSetContent,\n PractisSets,\n PractisSetStatuses,\n} from '../../../../constants/interfaces/PractisSets';\nimport { Scenario } from '../../../../constants/interfaces/Scenario';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\nimport { AppState } from '../../../../store/reducers';\nimport {\n ACTIONS,\n getPractisChallengesCountSuccess,\n getPractisScenarioCountSuccess,\n getSinglePractisSetFailure,\n getSinglePractisSetStart,\n getSinglePractisSetSuccess,\n modifyPractisSetAction,\n practisContentRepCountDecrease,\n practisContentRepCountIncrease,\n resetPractisSetsAction,\n restorePractisSetFromTempAction,\n searchPractisChallengesFailure,\n searchPractisChallengesStart,\n searchPractisChallengesSuccess,\n searchPractisScenariosFailure,\n searchPractisScenariosStart,\n searchPractisScenariosSuccess,\n storePractisSetTempCopyAction,\n updatePractisContentAction,\n} from './actions';\nimport {\n ACTIONS as LIBRARY_ACTIONS,\n updateLibraryPractisSetSuccess,\n} from '../../../../features/library/store/actions';\nimport {\n calculatePractisSetTotalDuration,\n PractisSetEntityTypes,\n} from '../tools';\nimport {\n withLabelsInitialState,\n withLabelsReducer,\n} from '../../../../features/portableLabels/store/hors/withLabels';\nimport { compose, Reducer } from 'redux';\n\nexport interface PractisSetInterface {\n info: PractisSets;\n temp_info?: PractisSets;\n scenarios: Scenario[];\n totalScenarios?: number;\n challenges: Challenge[];\n totalChallenges?: number;\n case: 'init' | 'created' | 'modified' | 'loaded' | 'updated' | 'error';\n isScenariosLoading: boolean;\n isChallengesLoading: boolean;\n isLoading: boolean;\n errors: string;\n}\n\nexport const initialPractisSetsState: PractisSetInterface = withLabelsInitialState(\n {\n info: {\n name: '',\n description: '',\n scenarioCount: 0,\n challengeCount: 0,\n pacingId: null,\n status: PractisSetStatuses.DRAFT,\n content: [],\n totalDuration: null,\n },\n scenarios: [],\n totalScenarios: undefined,\n challenges: [],\n totalChallenges: undefined,\n isLoading: false,\n isScenariosLoading: false,\n isChallengesLoading: false,\n case: 'init',\n errors: '',\n },\n 'practisSet'\n);\n\ntype PractisSetActions =\n | ReturnType<typeof getSinglePractisSetStart>\n | ReturnType<typeof getSinglePractisSetSuccess>\n | ReturnType<typeof getSinglePractisSetFailure>\n | ReturnType<typeof modifyPractisSetAction>\n | ReturnType<typeof searchPractisScenariosStart>\n | ReturnType<typeof searchPractisScenariosSuccess>\n | ReturnType<typeof searchPractisScenariosFailure>\n | ReturnType<typeof searchPractisChallengesStart>\n | ReturnType<typeof searchPractisChallengesSuccess>\n | ReturnType<typeof searchPractisChallengesFailure>\n | ReturnType<typeof getPractisChallengesCountSuccess>\n | ReturnType<typeof getPractisScenarioCountSuccess>\n | ReturnType<typeof resetPractisSetsAction>\n | ReturnType<typeof updatePractisContentAction>\n | ReturnType<typeof practisContentRepCountIncrease>\n | ReturnType<typeof practisContentRepCountDecrease>\n | ReturnType<typeof updateLibraryPractisSetSuccess>\n | ReturnType<typeof storePractisSetTempCopyAction>\n | ReturnType<typeof restorePractisSetFromTempAction>;\n\nexport const practisSetBaseReducer = (\n state = initialPractisSetsState,\n action: PractisSetActions\n): PractisSetInterface => {\n switch (action.type) {\n case ACTIONS.GET_SINGLE_PRACTIS_SET_START:\n return {\n ...state,\n isLoading: true,\n };\n case ACTIONS.GET_SINGLE_PRACTIS_SET_SUCCESS:\n return {\n ...state,\n info: {\n ...state.info,\n ...action.data,\n },\n isLoading: false,\n case: 'created',\n errors: '',\n };\n case ACTIONS.GET_SINGLE_PRACTIS_SET_FAILURE:\n return {\n ...state,\n isLoading: false,\n case: 'error',\n errors: action.error,\n };\n case ACTIONS.MODIFY_PRACTIS_SET:\n const newPractisSetsInfo: any = { ...state.info };\n newPractisSetsInfo[action.field] = action.data;\n return {\n ...state,\n info: {\n ...newPractisSetsInfo,\n },\n case: action.silent ? state.case : 'modified',\n };\n case ACTIONS.SEARCH_PRACTIS_SCENARIOS_START:\n return {\n ...state,\n isScenariosLoading: true,\n }\n case ACTIONS.SEARCH_PRACTIS_SCENARIOS_SUCCESS:\n return {\n ...state,\n scenarios: [\n ...action.data.map((scenario: Scenario) => {\n scenario.type = 'SCENARIO';\n scenario.minRepsCount = 1;\n return scenario;\n }),\n ],\n isScenariosLoading: false,\n errors: '',\n };\n case ACTIONS.SEARCH_PRACTIS_SCENARIOS_FAILURE:\n return {\n ...state,\n case: 'error',\n isScenariosLoading: false,\n errors: action.error,\n };\n case ACTIONS.SEARCH_PRACTIS_CHALLENGES_START:\n return {\n ...state,\n isChallengesLoading: true,\n }\n case ACTIONS.SEARCH_PRACTIS_CHALLENGES_SUCCESS:\n return {\n ...state,\n challenges: [\n ...action.data.map((challenge: Challenge) => {\n challenge.type = 'CHALLENGE';\n return challenge;\n }),\n ],\n isChallengesLoading: false,\n errors: '',\n };\n case ACTIONS.SEARCH_PRACTIS_CHALLENGES_FAILURE:\n return {\n ...state,\n case: 'error',\n isChallengesLoading: false,\n errors: action.error,\n };\n case ACTIONS.GET_PRACTIS_SCENARIOS_COUNT_SUCCESS:\n return {\n ...state,\n errors: '',\n totalScenarios: +action.count,\n };\n case ACTIONS.GET_PRACTIS_CHALLENGES_COUNT_SUCCESS:\n return {\n ...state,\n errors: '',\n totalChallenges: +action.count,\n };\n case ACTIONS.UPDATE_PRACTIS_CONTENT:\n return {\n ...state,\n info: {\n ...state.info,\n totalDuration: calculatePractisSetTotalDuration(\n action.data\n ),\n content: [...action.data],\n },\n case: 'modified',\n };\n case ACTIONS.PRACTIS_CONTENT_REP_COUNT_INCREASE: {\n const newContent = state.info.content.map(\n (content: PractisSetContent) => {\n const isScenario =\n content.type === PractisSetEntityTypes.SCENARIO;\n\n const contentId = isScenario\n ? content.scenario!.id\n : content.challenge!.id; \n\n if (contentId === action.itemId && isScenario) {\n return {\n ...content,\n minRepsCount:\n content.minRepsCount &&\n content.minRepsCount + 1,\n };\n } else {\n return content;\n }\n }\n );\n return {\n ...state,\n info: {\n ...state.info,\n totalDuration: calculatePractisSetTotalDuration(newContent),\n content: newContent,\n },\n case: 'modified',\n };\n }\n case ACTIONS.PRACTIS_CONTENT_REP_COUNT_DECREASE: {\n const newContent = state.info.content.map(\n (content: PractisSetContent) => {\n const isScenario =\n content.type === PractisSetEntityTypes.SCENARIO;\n\n const contentId = isScenario\n ? content.scenario!.id\n : content.challenge!.id;\n if (contentId === action.itemId && isScenario) {\n return {\n ...content,\n minRepsCount: content.minRepsCount\n ? content.minRepsCount === 1\n ? 1\n : content.minRepsCount - 1\n : 1,\n };\n } else {\n return content;\n }\n }\n );\n return {\n ...state,\n info: {\n ...state.info,\n totalDuration: calculatePractisSetTotalDuration(newContent),\n content: newContent,\n },\n case: 'modified',\n };\n }\n case LIBRARY_ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_SUCCESS:\n return {\n ...state,\n case: 'updated',\n };\n case ACTIONS.STORE_PRACTIS_SET_TEMP_COPY:\n return {\n ...state,\n temp_info: JSON.parse(JSON.stringify(state.info)),\n };\n case ACTIONS.RESTORE_PRACTIS_SET_FROM_TEMP:\n return {\n ...state,\n info: JSON.parse(JSON.stringify(state.temp_info)),\n case: 'init',\n };\n case ACTIONS.RESET_PRACTIS_SETS:\n return {\n ...initialPractisSetsState,\n info: {\n ...initialPractisSetsState.info,\n content: [],\n },\n };\n default:\n return state;\n }\n};\n\nexport const practisSetReducer = compose<\n Reducer<PractisSetInterface, PractisSetActions>\n>(withLabelsReducer({ reducerName: 'practisSet' }))(practisSetBaseReducer);\n\nexport const getPractisSetState = (state: AppState) => state.practisSet;\n","export enum PacingType {\n SEQUENTIAL = 'SEQUENTIAL',\n FREE = 'FREE',\n}\n\nconst pacingTypeNames = {\n [PacingType.SEQUENTIAL as string]: 'Sequential',\n [PacingType.FREE as string]: 'Free-Form',\n};\n\nexport function pacingTypeName(type?: string): string {\n return (type && pacingTypeNames[type]) || type || '';\n}\n","import { SearchParams } from '../../../../constants/interfaces/filters';\nimport {\n getPractisChallengesCountSuccess,\n getPractisScenarioCountSuccess,\n getSinglePractisSetFailure,\n getSinglePractisSetStart,\n getSinglePractisSetSuccess,\n modifyPractisSetAction,\n practisContentRepCountDecrease,\n practisContentRepCountIncrease,\n resetPractisSetsAction,\n restorePractisSetFromTempAction,\n searchPractisChallengesFailure,\n searchPractisChallengesStart,\n searchPractisChallengesSuccess,\n searchPractisScenariosFailure,\n searchPractisScenariosStart,\n searchPractisScenariosSuccess,\n storePractisSetTempCopyAction,\n updatePractisContentAction,\n} from './actions';\nimport {\n PractisSetContent,\n PractisSets,\n} from '../../../../constants/interfaces/PractisSets';\nimport { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport {\n useGetPractisSetApi,\n useSearchChallengesApi,\n useSearchScenariosApi,\n useGetPractisSetContentApi,\n} from '../../../../api';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { createSearchLibraryParams } from '../../../../features/library/tools';\n\nexport const useSearchPractisScenarios = () => {\n const dispatch = useDispatch();\n const searchScenariosApi = useSearchScenariosApi();\n const showMessage = useShowMessage();\n return useCallback(\n (searchParams: SearchParams) => {\n const searchScenariosParams =\n createSearchLibraryParams(searchParams);\n\n dispatch(searchPractisScenariosStart());\n searchScenariosApi(searchScenariosParams)\n .then(data => {\n dispatch(searchPractisScenariosSuccess(data.items));\n if (\n !searchParams?.searchTerm &&\n !searchParams?.labelIDs?.length\n ) {\n dispatch(getPractisScenarioCountSuccess(data.count));\n }\n })\n .catch((error: ErrorResult) => {\n dispatch(searchPractisScenariosFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchScenariosApi, showMessage]\n );\n};\n\nexport const useSearchPractisChallenges = () => {\n const dispatch = useDispatch();\n const searchChallengesApi = useSearchChallengesApi();\n const showMessage = useShowMessage();\n return useCallback(\n (searchParams: SearchParams) => {\n const searchChallengesParams =\n createSearchLibraryParams(searchParams);\n dispatch(searchPractisChallengesStart());\n searchChallengesApi(searchChallengesParams)\n .then(data => {\n dispatch(searchPractisChallengesSuccess(data.items));\n if (\n !searchParams?.searchTerm &&\n !searchParams?.labelIDs?.length\n ) {\n dispatch(getPractisChallengesCountSuccess(data.count));\n }\n })\n .catch((error: ErrorResult) => {\n dispatch(searchPractisChallengesFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchChallengesApi, showMessage]\n );\n};\n\nexport const useGetSinglePractisSetService = () => {\n const dispatch = useDispatch();\n const getPractisSetApi = useGetPractisSetApi();\n const getPractisSetContent = useGetPractisSetContentApi();\n const showMessage = useShowMessage();\n return useCallback(\n (practisSetid: number) => {\n dispatch(getSinglePractisSetStart());\n getPractisSetApi(practisSetid)\n .then(data => {\n getPractisSetContent(practisSetid)\n .then(practisSetContentData => {\n const practisSetData = {\n ...data,\n content: practisSetContentData,\n };\n dispatch(\n getSinglePractisSetSuccess(practisSetData)\n );\n })\n .catch(() => {\n getSinglePractisSetSuccess(data);\n });\n })\n .catch((error: ErrorResult) => {\n dispatch(getSinglePractisSetFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getPractisSetApi, getPractisSetContent, showMessage]\n );\n};\n\nexport const useUpdatePractisContentService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (data: PractisSetContent[]) => {\n dispatch(updatePractisContentAction(data));\n },\n [dispatch]\n );\n};\n\nexport const usePractisContentRepCountIncrease = () => {\n const dispatch = useDispatch();\n return useCallback(\n (itemId: number) => {\n dispatch(practisContentRepCountIncrease(itemId));\n },\n [dispatch]\n );\n};\n\nexport const usePractisContentRepCountDecrease = () => {\n const dispatch = useDispatch();\n return useCallback(\n (itemId: number) => {\n dispatch(practisContentRepCountDecrease(itemId));\n },\n [dispatch]\n );\n};\n\nexport const useResetPractisSetService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetPractisSetsAction());\n }, [dispatch]);\n};\n\nexport const useStorePractisSetTempCopyService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(storePractisSetTempCopyAction());\n }, [dispatch]);\n};\n\nexport const useRestorePractisSetFromTempActionService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(restorePractisSetFromTempAction());\n }, [dispatch]);\n};\n\nexport const useModifyPractisSetService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: any, field: keyof PractisSets, silent?: boolean) => {\n dispatch(modifyPractisSetAction(value, field, silent));\n },\n [dispatch]\n );\n};","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ArchiveIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.5 1.75a.25.25 0 0 1 .25-.25h3a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h2.086a.25.25 0 0 1 .177.073l2.914 2.914a.25.25 0 0 1 .073.177v8.586a.25.25 0 0 1-.25.25h-.5a.75.75 0 0 0 0 1.5h.5A1.75 1.75 0 0 0 14 13.25V4.664c0-.464-.184-.909-.513-1.237L10.573.513A1.75 1.75 0 0 0 9.336 0H3.75A1.75 1.75 0 0 0 2 1.75v11.5c0 .649.353 1.214.874 1.515a.75.75 0 1 0 .752-1.298.25.25 0 0 1-.126-.217V1.75zM8.75 3a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h-.5zM6 5.25a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 6 5.25zm2 1.5A.75.75 0 0 1 8.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 6.75zm-1.25.75a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h-.5zM8 9.75A.75.75 0 0 1 8.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 9.75zm-.75.75a1.75 1.75 0 0 0-1.75 1.75v3c0 .414.336.75.75.75h2.5a.75.75 0 0 0 .75-.75v-3a1.75 1.75 0 0 0-1.75-1.75h-.5zM7 12.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v2.25H7v-2.25z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n\nexport default ArchiveIcon;\n","import React, { FC, useContext, useState } from 'react';\r\n\r\nimport { useSelector } from 'react-redux';\r\nimport styled from 'styled-components';\r\nimport { EditModeContext, LoadingSaveContext } from '../../PractisSets';\r\nimport { getPractisSetState } from '../../store/reducers';\r\nimport {\r\n PractisSets,\r\n PractisSetStatuses,\r\n} from '../../../../../constants/interfaces/PractisSets';\r\nimport { StatusModalConfirmation } from '../../../StatusModalConfirmation/StatusModalConfirmation';\r\nimport {\r\n useModifyPractisSetService,\r\n useRestorePractisSetFromTempActionService,\r\n useStorePractisSetTempCopyService,\r\n} from '../../store/services';\r\nimport { buildPageTitle } from '../../../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\r\nimport { formatDate } from '../../../../../helpers/functions/date-convert';\r\nimport { Button } from '../../../../../ui/components/Button';\r\nimport ArchiveIcon from '../../../../../ui/icons/ArchiveIcon';\r\nimport { TableDivider } from '../../../../../ui/components/table-wrapper/table-divider';\r\nimport { useHandleRestoreArchivedPractisSet } from '../../services';\r\n\r\nconst StyledCustomWrapper = styled.div``;\r\n\r\nconst StyledCustomHeader = styled.div`\r\n padding-left: 16px;\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n height: 90px;\r\n`;\r\n\r\nconst StyledHeaderInput = styled.div`\r\n flex: 1;\r\n min-width: 150px;\r\n margin-right: 16px;\r\n`;\r\n\r\nconst HeaderTitle = styled.div`\r\n font-size: 20px;\r\n font-weight: 800;\r\n color: ${props => props.theme.Colors.black};\r\n`;\r\n\r\nconst PublishedDate = styled.div`\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst StyledHeaderActionItems = styled.div`\r\n margin-left: 16px;\r\n`;\r\n\r\nconst StyledHeaderBottomActionItemsWrapper = styled.div`\r\n display: flex;\r\n flex-direction: row-reverse;\r\n margin-bottom: 6px;\r\n`;\r\n\r\nconst StyledHeaderActionItemsWrapper = styled.div`\r\n display: flex;\r\n`;\r\n\r\nconst StyledHeaderActions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 10px 0;\r\n flex-wrap: wrap;\r\n`;\r\n\r\nconst EDIT_MODAL_INFO = {\r\n id: 'practis_set_edit_message',\r\n message:\r\n 'Editing the items or the sequence of content in the Practis Set will effect all currently enrolled Users. They will receive a notification.',\r\n buttonText: 'Proceed',\r\n cancelButtonText: 'Go Back',\r\n title: 'Are you sure?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst CANCEL_EDIT_MODAL_INFO = {\r\n id: 'practis_set_cancel_edit_message',\r\n message: 'Do you want to discard changes?',\r\n buttonText: 'Discard',\r\n cancelButtonText: 'No',\r\n title: 'Discard Changes?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst VerticalDivider = styled.span`\r\n width: 1px;\r\n height: 18px;\r\n background-color: ${({ theme }) => theme.Colors.paleGrey};\r\n margin: 0 8px;\r\n`;\r\n\r\nconst ButtonIcon = styled.div<{ disabled?: boolean }>`\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n`;\r\n\r\nconst ButtonText = styled.span`\r\n margin-left: 4px;\r\n line-height: 18px;\r\n`;\r\n\r\nconst ArchiveButtonContainer = styled.button`\r\n background: none;\r\n display: flex;\r\n outline: none;\r\n border: none;\r\n font-size: 13px;\r\n font-family: ${props => props.theme.Fonts.manrope};\r\n font-weight: normal;\r\n color: ${({ theme, disabled }) =>\r\n disabled ? theme.Colors.cloudyBlue : theme.Colors.darkSkyBlue};\r\n cursor: pointer;\r\n pointer-events: ${({ disabled }) => (disabled ? 'none' : 'all')};\r\n\r\n &:hover {\r\n color: ${({ theme }) => theme.Colors.lightBlue};\r\n }\r\n &:active {\r\n color: ${({ theme }) => theme.Colors.windowBlue};\r\n }\r\n\r\n &:hover ${ButtonIcon} {\r\n color: ${({ theme }) => theme.Colors.lightBlue};\r\n }\r\n &:active ${ButtonIcon} {\r\n color: ${({ theme }) => theme.Colors.windowBlue};\r\n }\r\n\r\n padding: 0;\r\n`;\r\n\r\nconst MODAL_INFO = (pacing?: string) => {\r\n return {\r\n DELETED: {\r\n id: 'practis_set_delete_message',\r\n message: 'Are you sure you want to delete?',\r\n buttonText: 'Yes, Delete',\r\n title: 'Delete Practis Set',\r\n notShow: false,\r\n danger: false,\r\n },\r\n DRAFT: {\r\n id: 'practis_set_draft_message',\r\n message: '',\r\n buttonText: 'Proceed',\r\n title: 'Are you sure?',\r\n notShow: false,\r\n danger: true,\r\n },\r\n ARCHIVED: {\r\n id: 'practis_set_archive_message',\r\n message: 'Are you sure you want to archive?',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Practis Set',\r\n notShow: false,\r\n danger: true,\r\n },\r\n ACTIVE: {\r\n id: 'practis_set_active_message',\r\n message: `You're about to publish a Practis Set that has a '${\r\n pacing ? pacing : 'free-form'\r\n }' pacing setting. This means that once you publish it you will not be able to add, remove, or change the scenarios in the set.`,\r\n buttonText: 'Publish',\r\n title: 'Publish Practis Set',\r\n notShow: true,\r\n danger: false,\r\n },\r\n };\r\n};\r\n\r\nconst EDIT_VIEW_STATUS = [PractisSetStatuses.ACTIVE];\r\n\r\nconst CustomHeader: React.FC<{\r\n practisSet: PractisSets;\r\n modified?: boolean;\r\n modifyPractisSet: (\r\n value: any,\r\n field: keyof PractisSets,\r\n silent?: boolean\r\n ) => void;\r\n storePractisSetTemp: () => void;\r\n restorePractisSetFromTemp: () => void;\r\n handleUpdatePractisSet: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: string,\r\n keepModal?: boolean\r\n ) => any;\r\n handleViewAssignUsers?: (id: number | undefined) => void;\r\n isViewMode?: boolean;\r\n}> = ({\r\n practisSet,\r\n modified,\r\n modifyPractisSet,\r\n handleUpdatePractisSet,\r\n handleViewAssignUsers,\r\n storePractisSetTemp,\r\n restorePractisSetFromTemp,\r\n isViewMode,\r\n}) => {\r\n const [publishModal, setPublishModal] = useState(false);\r\n const [editModal, setEditModal] = useState(false);\r\n const [cancelEditModal, setCancelEditModal] = useState(false);\r\n const [saveState, setSaveState] = useState<PractisSetStatuses>(\r\n PractisSetStatuses.ACTIVE\r\n );\r\n\r\n const handleRestoreArchivedPractisSet =\r\n useHandleRestoreArchivedPractisSet();\r\n\r\n const handleSaveWithModalAction = (status: PractisSetStatuses) => {\r\n setSaveState(status);\r\n setPublishModal(true);\r\n };\r\n\r\n const loadingSave = useContext(LoadingSaveContext);\r\n const edit = useContext(EditModeContext);\r\n\r\n const cancelEditing = () => {\r\n if (modified) {\r\n setCancelEditModal(true);\r\n } else {\r\n restorePractisSetFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }\r\n };\r\n\r\n return (\r\n <StyledCustomWrapper>\r\n <StyledCustomHeader>\r\n {publishModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setPublishModal(false);\r\n }}\r\n onConfirm={() => {\r\n setPublishModal(false);\r\n handleUpdatePractisSet(null, saveState);\r\n }}\r\n title={MODAL_INFO()[saveState].title}\r\n confirmButtonText={MODAL_INFO()[saveState].buttonText}\r\n displayDontShow={MODAL_INFO()[saveState].notShow}\r\n dontShowHandle={MODAL_INFO()[saveState].id}\r\n danger={MODAL_INFO()[saveState].danger}\r\n >\r\n {\r\n MODAL_INFO(\r\n practisSet?.pacing?.type?.toLowerCase()\r\n )?.[saveState]?.message\r\n }\r\n </StatusModalConfirmation>\r\n )}\r\n {editModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setEditModal(false);\r\n storePractisSetTemp();\r\n edit.action(EditModeValues.EDIT);\r\n }}\r\n title={EDIT_MODAL_INFO.title}\r\n confirmButtonText={EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={EDIT_MODAL_INFO.cancelButtonText}\r\n displayDontShow={EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={EDIT_MODAL_INFO.id}\r\n danger={EDIT_MODAL_INFO.danger}\r\n >\r\n {EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n {cancelEditModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setCancelEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setCancelEditModal(false);\r\n restorePractisSetFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }}\r\n title={CANCEL_EDIT_MODAL_INFO.title}\r\n confirmButtonText={CANCEL_EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={\r\n CANCEL_EDIT_MODAL_INFO.cancelButtonText\r\n }\r\n displayDontShow={CANCEL_EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={CANCEL_EDIT_MODAL_INFO.id}\r\n danger={CANCEL_EDIT_MODAL_INFO.danger}\r\n >\r\n {CANCEL_EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n <StyledHeaderInput>\r\n <HeaderTitle data-test=\"practis-set-page-title\">\r\n {buildPageTitle('Practis Set', edit.mode as EditModeValues, !practisSet.id)}\r\n </HeaderTitle>\r\n </StyledHeaderInput>\r\n <StyledHeaderActions>\r\n {EDIT_VIEW_STATUS.includes(practisSet.status) ? (\r\n edit.mode === EditModeValues.VIEW ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n width=\"144px\"\r\n height=\"40px\"\r\n disabled={loadingSave}\r\n action={() =>\r\n handleViewAssignUsers?.(\r\n practisSet?.id\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"assign-practis-set-users\"\r\n >\r\n Assign Users\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() => setEditModal(true)}\r\n dataTest=\"edit-practis-set\"\r\n >\r\n Edit\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave}\r\n action={() => cancelEditing()}\r\n variant=\"inverse\"\r\n dataTest=\"cancel-practis-set\"\r\n >\r\n Cancel\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleUpdatePractisSet(null)\r\n }\r\n dataTest=\"save-practis-set\"\r\n >\r\n Save\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )\r\n ) : practisSet.status === PractisSetStatuses.ARCHIVED ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleRestoreArchivedPractisSet(\r\n practisSet.id\r\n )\r\n }\r\n dataTest=\"restore-practis-set\"\r\n >\r\n Restore\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"144px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleUpdatePractisSet(\r\n null,\r\n PractisSetStatuses.DRAFT\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"save-practis-set-as-draft\"\r\n >\r\n Save as Draft\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() =>\r\n handleSaveWithModalAction(\r\n PractisSetStatuses.ACTIVE\r\n )\r\n }\r\n dataTest=\"publish-practis-set\"\r\n >\r\n Publish\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )}\r\n </StyledHeaderActions>\r\n </StyledCustomHeader>\r\n\r\n <StyledHeaderBottomActionItemsWrapper>\r\n <PublishedDate>\r\n {practisSet.status === PractisSetStatuses.ACTIVE &&\r\n edit.mode === EditModeValues.VIEW && (\r\n <span data-test=\"practis-set-publish-date\">\r\n Published{' '}\r\n {formatDate(practisSet.updatedAt, true)}\r\n </span>\r\n )}\r\n {practisSet.status === PractisSetStatuses.ARCHIVED &&\r\n edit.mode === EditModeValues.VIEW && (\r\n <span data-test=\"practis-set-archive-date\">\r\n Archived{' '}\r\n {formatDate(practisSet.updatedAt, true)}\r\n </span>\r\n )}\r\n {practisSet.status === PractisSetStatuses.DRAFT && (\r\n <span data-test=\"practis-set-not-published-yet\">\r\n Not Published Yet\r\n </span>\r\n )}\r\n </PublishedDate>\r\n {practisSet.status === PractisSetStatuses.ACTIVE && (\r\n <>\r\n {edit.mode === EditModeValues.VIEW && (\r\n <VerticalDivider />\r\n )}\r\n\r\n <ArchiveButtonContainer\r\n onClick={() =>\r\n handleSaveWithModalAction(\r\n PractisSetStatuses.ARCHIVED\r\n )\r\n }\r\n disabled={loadingSave || isViewMode}\r\n data-test=\"archive-practis-set\"\r\n >\r\n <ButtonIcon>\r\n <ArchiveIcon />\r\n </ButtonIcon>\r\n <ButtonText>Archive</ButtonText>\r\n </ArchiveButtonContainer>\r\n </>\r\n )}\r\n </StyledHeaderBottomActionItemsWrapper>\r\n\r\n <TableDivider />\r\n </StyledCustomWrapper>\r\n );\r\n};\r\n\r\nexport const CustomHeaderContainer: FC<{\r\n handleUpdatePractisSet: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: string,\r\n keepModal?: boolean\r\n ) => void;\r\n handleViewAssignUsers?: (id: number | undefined) => void;\r\n isViewMode?: boolean;\r\n}> = ({ handleUpdatePractisSet, handleViewAssignUsers, isViewMode }) => {\r\n const practisSet = useSelector(getPractisSetState);\r\n const modifyPractisSet = useModifyPractisSetService();\r\n const storePractisSetTemp = useStorePractisSetTempCopyService();\r\n const restorePractisSetFromTemp =\r\n useRestorePractisSetFromTempActionService();\r\n\r\n return (\r\n <CustomHeader\r\n practisSet={practisSet.info}\r\n modified={practisSet.case === 'modified'}\r\n handleUpdatePractisSet={handleUpdatePractisSet}\r\n handleViewAssignUsers={handleViewAssignUsers}\r\n modifyPractisSet={modifyPractisSet}\r\n storePractisSetTemp={storePractisSetTemp}\r\n restorePractisSetFromTemp={restorePractisSetFromTemp}\r\n isViewMode={isViewMode}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomHeaderContainer;\r\n","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport {\n PractisSets,\n PractisSetStatuses,\n} from '../../../constants/interfaces/PractisSets';\nimport {\n CREATE_PRACTIS_SET_ACTION,\n UPDATE_PRACTIS_SET_ACTION,\n UPDATE_PRACTIS_SET_STATUS_ACTION,\n} from '../../../features/library/services/LibraryBulkActionsService/constants';\nimport { updateLibraryPractisSetSuccess } from '../../../features/library/store/actions';\nimport ROUTES from '../../../routes/routes';\nimport { pushModal, useHistory } from '../../../tools/router';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { useModifyPractisSetService } from './store/services';\nimport { useUpdatePractisSetStatusApi } from '../../../api';\n\n/**\n * @function useCreateEditPractisSetSuccessCallback\n * @param { Function } setLoadingSave\n * @param { number | undefined } existedPractisSetId\n * @param { Record<string, unknown> | undefined } responses\n * @returns { void }\n */\nexport const useCreateEditPractisSetSuccessCallback = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const showMessage = useShowMessage();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n existedPractisSetId?: number,\n responses?: Record<string, unknown>\n ) => {\n let newPractisSetId: number | null = null;\n\n setLoadingSave(false);\n\n if (!isEmpty(responses)) {\n const createPractisSetResponse = responses![\n CREATE_PRACTIS_SET_ACTION\n ] as PractisSets | undefined;\n\n const editPractisSetResponse = responses![\n UPDATE_PRACTIS_SET_ACTION\n ] as PractisSets | undefined;\n\n const updatePractisSetStatusResponse = responses![\n UPDATE_PRACTIS_SET_STATUS_ACTION\n ] as PractisSets[] | undefined;\n\n if (createPractisSetResponse) {\n dispatch(\n updateLibraryPractisSetSuccess(\n createPractisSetResponse,\n 'create'\n )\n );\n\n newPractisSetId = createPractisSetResponse?.id ?? null;\n }\n\n if (editPractisSetResponse) {\n dispatch(\n updateLibraryPractisSetSuccess(\n editPractisSetResponse,\n 'update'\n )\n );\n }\n\n const isPublished =\n updatePractisSetStatusResponse?.[0]?.status ===\n PractisSetStatuses.ACTIVE;\n\n const isEditMode = existedPractisSetId;\n\n if (!isPublished) {\n !isEditMode &&\n showMessage('Practis Set Saved as Draft', 'success');\n history.goBack();\n } else {\n history.push(ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL);\n if (newPractisSetId) {\n pushModal(\n history,\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.QUICK_ASSIGNMENT.replace(\n ':practisSetId',\n newPractisSetId.toString()\n )\n );\n }\n !isEditMode &&\n showMessage('Practis Set Published', 'success');\n }\n }\n },\n [dispatch, history, showMessage]\n );\n};\n\n/**\n * @function useCreateEditPractisSetFailedCallback\n * @param { Function } setLoadingSave\n * @param { Function } setTitleError\n * @param { ErrorResult | undefined } error\n * @param { Record<string, unknown> | undefined } completedResponses\n * @returns { void }\n */\nexport const useCreateEditPractisSetFailedCallback = () => {\n const modifyPractisSet = useModifyPractisSetService();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n setTitleError: (isError: boolean) => void,\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => {\n if (!isEmpty(completedResponses)) {\n const createPractisSetResponse = completedResponses![\n CREATE_PRACTIS_SET_ACTION\n ] as PractisSets | undefined;\n\n const createdPractisSetId = createPractisSetResponse?.id;\n\n // The bulk action failed in other steps\n // but new practisSet created\n // in the next try it goes to\n // edit practisSet action.\n if (createdPractisSetId) {\n modifyPractisSet(createdPractisSetId, 'id');\n }\n }\n\n setLoadingSave(false);\n\n if (error?.message?.includes('already exists')) {\n setTitleError(true);\n }\n },\n [modifyPractisSet]\n );\n};\n\n/**\n * @function useHandleArchivePractisSet\n * @returns { void }\n */\nexport const useHandleArchivePractisSet = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const updatePractisSetStatus = useUpdatePractisSetStatusApi();\n\n return useCallback(\n (practisSetId: number) => {\n updatePractisSetStatus('archive', [practisSetId]).then(response => {\n dispatch(updateLibraryPractisSetSuccess(response, 'update'));\n\n history.goBack();\n });\n },\n [dispatch, history, updatePractisSetStatus]\n );\n};\n\n/**\n * @function useHandleRestoreArchivedPractisSet\n * @param { number } practisSetId\n * @returns\n */\nexport const useHandleRestoreArchivedPractisSet = () => {\n const dispatch = useDispatch();\n const updatePractisSetStatus = useUpdatePractisSetStatusApi();\n const modifyPractisSet = useModifyPractisSetService();\n\n return useCallback(\n (practisSetId?: number) => {\n if (practisSetId) {\n updatePractisSetStatus('draft', [practisSetId]).then(\n (response: PractisSets) => {\n dispatch(\n updateLibraryPractisSetSuccess(response, 'update')\n );\n modifyPractisSet(\n PractisSetStatuses.DRAFT,\n 'status',\n true\n );\n }\n );\n }\n },\n [dispatch, modifyPractisSet, updatePractisSetStatus]\n );\n};","import { Challenge } from '../../../../../../../../constants/interfaces/Challenge';\nimport { Scenario } from '../../../../../../../../constants/interfaces/Scenario';\nimport { PractisSetContent } from '../../../../../../../../constants/interfaces/PractisSets';\nimport { PractisSetEntityTypes } from '../../../../../tools';\nimport { EditModeValues } from '../../../../../../../../constants/enums/EditModeValues';\n\n/**\n * @function isInViewMode\n * @param { string } edit\n * @returns { boolean }\n */\nconst isInViewMode = (mode: string): boolean => mode === EditModeValues.VIEW;\n\n/**\n * @function checkIsPractisContentDisabled\n * @param { PractisSetContent[] } practisSetsContent\n * @param { Scenario | Challenge } currentContent\n * @param { string } mode\n * @returns { boolean }\n */\nexport const checkIsPractisContentDisabled = (\n practisSetsContent: PractisSetContent[],\n currentContent: Scenario | Challenge,\n mode: string\n): boolean => {\n\n const allContents =\n practisSetsContent?.map(\n item =>\n item.scenario\n ? { ...item.scenario, type: PractisSetEntityTypes.SCENARIO }\n : { ...item.challenge, type: PractisSetEntityTypes.CHALLENGE }\n ) ?? [];\n\n return (\n allContents.filter(\n content =>\n content.id === currentContent.id &&\n content.type === currentContent.type\n ).length > 0 || isInViewMode(mode)\n );\n};","import { FC } from 'react';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { PRACTIS_SET_DRAGGABLE_ID } from '../../Content';\nimport secondsToMin from '../../../../../../../../helpers/functions/convert-time';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../../../../../theme/variables';\nimport { PractisSetContent } from '../../../../../../../../constants/interfaces/PractisSets';\nimport { checkIsPractisContentDisabled } from './helpers';\nimport { Scenario } from '../../../../../../../../constants/interfaces/Scenario';\nimport { Challenge } from '../../../../../../../../constants/interfaces/Challenge';\n\nconst StyledListItemRow = styled.div<{\n disabled?: boolean;\n isDragging: boolean;\n background?: string;\n}>`\n background: ${props =>\n !!props.background\n ? props.background\n : props.disabled\n ? Variables.Colors.lighterGray\n : Variables.Colors.white};\n border-radius: ${props => (props.isDragging ? '16px' : '2px')};\n display: flex;\n height: 48px;\n align-items: center;\n font-size: 13px;\n border-radius: 4px;\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n }\n`;\n\nconst StyledListTitleItemCell = styled.div<{\n disabled?: boolean;\n isDragging: boolean;\n flex: number;\n}>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.coolGray\n : props.theme.Colors.black};\n ${props =>\n !props.disabled &&\n `\n cursor: grab;\n `};\n padding: 8px 16px 8px 17px;\n flex: ${props => props.flex};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst StyledListItemCell = styled.div<{\n disabled?: boolean;\n isDragging: boolean;\n flex: number;\n}>`\n color: ${props =>\n props.disabled\n ? props => props.theme.Colors.coolGray\n : props.theme.Colors.black};\n ${props =>\n !props.disabled &&\n `\n cursor: grab;\n `};\n padding: 8px 16px 8px 17px;\n flex: ${props => props.flex};\n`;\n\nexport const GenerateTableCells: FC<{\n content: Scenario[] | Challenge[];\n practisSetContent: PractisSetContent[];\n mode: string;\n background?: string;\n addToBuilder?: (itemId?: number | string) => void;\n dataTest?: string;\n}> = ({\n content,\n practisSetContent,\n mode,\n background,\n addToBuilder,\n dataTest\n}): any => {\n return content.map((item: Scenario | Challenge, index: number) => {\n const isDisabled =\n checkIsPractisContentDisabled(practisSetContent, item, mode) ??\n false;\n\n\n return (\n <Draggable\n key={item.id}\n draggableId={`${PRACTIS_SET_DRAGGABLE_ID}-${item.id}`}\n index={index}\n isDragDisabled={isDisabled}\n >\n {(provided: any, snapshot: any) => {\n return (\n <StyledListItemRow\n provided={provided}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n disabled={isDisabled}\n isDragging={snapshot.isDragging}\n background={background}\n onDoubleClick={() =>\n !isDisabled &&\n addToBuilder &&\n addToBuilder(item.id)\n }\n data-test={dataTest}\n >\n <StyledListTitleItemCell\n disabled={isDisabled}\n isDragging={snapshot.isDragging}\n flex={62}\n data-test={dataTest && `${dataTest}-title`}\n >\n {item.title}\n </StyledListTitleItemCell>\n <StyledListItemCell\n disabled={isDisabled}\n isDragging={snapshot.isDragging}\n flex={38}\n data-test={dataTest && `${dataTest}-duration`}\n >\n {item.script.totalDuration\n ? secondsToMin(item.script.totalDuration)\n : '-'}\n </StyledListItemCell>\n </StyledListItemRow>\n );\n }}\n </Draggable>\n );\n });\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledNavigationItemContainer = styled.div<{\n isActive: boolean;\n}>`\n height: 43px;\n margin-bottom: 2px;\n flex: 1;\n font-size: 13px;\n font-weight: 600;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n border: 1px solid ${props => props.theme.Colors.paleGrey};\n border-radius: 4px;\n color: ${props =>\n props.isActive\n ? props.theme.Colors.black\n : props.theme.Colors.steelGrey};\n background: ${props =>\n props.isActive ? 'unset' : props.theme.Colors.whiteFive};\n position: relative;\n`;\n\nconst NavigationCover = styled.div`\n position: absolute;\n left: -1px;\n right: -1px;\n height: 10px;\n background: ${props => props.theme.Colors.white};\n bottom: -4px;\n border-left: 1px solid ${props => props.theme.Colors.paleGrey};\n border-right: 1px solid ${props => props.theme.Colors.paleGrey};\n`;\n\nconst NavigationItem: React.FC<{\n title: string;\n action?: () => void;\n active?: boolean;\n dataTest?: string;\n}> = ({ title, action, active, dataTest }) => {\n return (\n <StyledNavigationItemContainer onClick={action} isActive={!!active} data-test={dataTest}>\n {title}\n {active && <NavigationCover />}\n </StyledNavigationItemContainer>\n );\n};\n\nexport default NavigationItem;\n","import React from 'react';\nimport styled from 'styled-components';\nimport NavigationItem from './NavigationItem';\n\nexport type MenuInterface = {\n key: string;\n title: string;\n space?: boolean;\n url?: string;\n};\n\nconst StyledNavigationContainer = styled.div`\n display: flex;\n`;\n\nconst Spacer = styled.div`\n width: 5px;\n height: 100%;\n`;\n\nconst Navigation: React.FC<{\n menu: Array<MenuInterface>;\n active?: string;\n setActive?: (key: string) => void;\n dataTest: string;\n}> = ({ menu, active, setActive, dataTest }) => {\n let menuItems;\n menuItems = menu.map((menu: MenuInterface) => {\n return (\n <React.Fragment key={menu.key}>\n <NavigationItem\n title={menu.title}\n action={() => setActive && setActive(menu.key)}\n active={active === menu.key}\n dataTest={`${dataTest}-${menu.key}`}\n />\n {menu.space && <Spacer />}\n </React.Fragment>\n );\n });\n\n return <StyledNavigationContainer>{menuItems}</StyledNavigationContainer>;\n};\n\nexport default Navigation;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { useSelector } from 'react-redux';\nimport { getPractisSetState } from '../../store/reducers';\nimport Navigation from '../CustomBody/Content/ListContent/components/Navigation/Navigation';\n\nconst StyledLibraryNavigationContainer = styled.div``;\n\nconst PractisContentNavigation: React.FC<{\n scenariosCount?: number;\n scenarioCountFiltered?: number;\n challengeCountFiltered?: number;\n challengesCount?: number;\n page: string;\n setPage: (value: string) => void;\n}> = ({\n scenariosCount,\n scenarioCountFiltered,\n challengeCountFiltered,\n challengesCount,\n page,\n setPage,\n}) => {\n const scenarios =\n scenarioCountFiltered !== undefined\n ? scenarioCountFiltered\n : scenariosCount\n ? scenariosCount\n : '0';\n\n const challenges =\n challengeCountFiltered !== undefined\n ? challengeCountFiltered\n : challengesCount\n ? challengesCount\n : '0';\n\n return (\n <StyledLibraryNavigationContainer>\n <Navigation\n menu={[\n {\n key: 'scenarios',\n title: `Scenarios (${scenarios})`,\n space: true\n },\n {\n key: 'challenges',\n title: `Challenges (${challenges})`\n },\n ]}\n active={page}\n setActive={setPage}\n dataTest='practis-set-tab'\n />\n </StyledLibraryNavigationContainer>\n );\n};\n\nexport const PractisContentNavigationContainer: FC<{\n page: string;\n setPage: (value: string) => void;\n scenarioCountFiltered?: number;\n challengeCountFiltered?: number;\n}> = ({ page, setPage, scenarioCountFiltered, challengeCountFiltered }) => {\n const scenarios = useSelector(getPractisSetState).totalScenarios;\n const challenges = useSelector(getPractisSetState).totalChallenges;\n\n return (\n <PractisContentNavigation\n scenariosCount={scenarios}\n scenarioCountFiltered={scenarioCountFiltered}\n challengeCountFiltered={challengeCountFiltered}\n challengesCount={challenges}\n page={page}\n setPage={setPage}\n />\n );\n};\n\nexport default PractisContentNavigationContainer;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Stack = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 28 28\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M24.322 17.539c.533-.14 1.099.113 1.299.563.166.45-.134.901-.666 1.042L14.3 21.847c-.1.028-.2.028-.3.028-.1 0-.2 0-.3-.028L3.045 19.144c-.532-.113-.832-.591-.666-1.042.134-.45.7-.704 1.232-.563l10.356 2.618zm1.299-3.812c.154.418-.093.837-.556 1.007l-.11.035-10.661 2.703c-.1.028-.2.028-.3.028-.067 0-.133 0-.2-.008l-.1-.02-10.66-2.703c-.533-.113-.8-.591-.667-1.042.124-.418.621-.667 1.118-.587l.115.024 10.36 2.618 10.361-2.618c.533-.14 1.1.113 1.3.563zM14.165 5.849l.12.028 10.68 2.772c.401.115.702.462.702.837 0 .364-.217.658-.576.797l-.125.04-10.681 2.773c-.1.029-.2.029-.3.029-.067 0-.134 0-.2-.009l-.1-.02-10.682-2.772c-.4-.087-.7-.433-.667-.838 0-.363.216-.657.576-.796l.125-.041 10.68-2.772a.902.902 0 0 1 .448-.028z\"\n filter={!!shadow ? 'url(#a)' : undefined}\n />\n </svg>\n );\n }\n);\n\nexport default Stack;\n","import React, { FC, useCallback, useState } from 'react';\nimport styled from 'styled-components';\nimport { PortableLabelsWithStore } from '../../../../../../../../../features/portableLabels';\nimport { useDeselectAllLabels, useSaveLabels } from '../../../../../../../../../features/portableLabels/store/hors/withLabels/services';\nimport { useLabelsState } from '../../../../../../../../../features/portableLabels/store/hors/withLabels/states';\nimport { Button } from '../../../../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../../../../ui/components/Fieldset';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nexport const LabelFilters: FC<{\n onLabelsChange: (ids: number[]) => void;\n onSuccessApply: () => void;\n}> = ({ onLabelsChange, onSuccessApply }) => {\n const [labelIds, setLabelIds] = useState<number[]>([]);\n const saveLabels = useSaveLabels();\n const deselectLabels = useDeselectAllLabels();\n const labels = useLabelsState();\n\n const onLabelChangeHandler = useCallback(\n (ids: number[]) => setLabelIds(ids),\n [setLabelIds]\n );\n\n const onApplyHandler = useCallback(() => {\n onLabelsChange(labelIds);\n saveLabels();\n onSuccessApply();\n }, [onLabelsChange, labelIds, onSuccessApply, saveLabels]);\n\n const onClearHandler = useCallback(() => {\n deselectLabels();\n }, [deselectLabels])\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n onSetSelected={onLabelChangeHandler}\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <ButtonWrapper>\n <Button disabled={!labels.selected.length} variant='inverse' width={'122px'} action={() => onClearHandler()}>\n Clear\n </Button>\n </ButtonWrapper>\n <Button width={'122px'} action={() => onApplyHandler()}>\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import { FC, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Label } from '../../../../../../../../../constants/interfaces/Label';\r\nimport { useHandleSelectLabels } from '../../../../../../../../../features/labels/tools';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../../../../../../../features/portableLabels/store/hors/withLabels/services';\r\nimport { useLabelsState } from '../../../../../../../../../features/portableLabels/store/hors/withLabels/states';\r\nimport { LabelFilters } from './LabelFilters';\r\nimport { listToTree } from '../../../../../../../../../helpers/functions/list-to-tree';\r\nimport { usePortableLabelsState } from '../../../../../../../../../features/portableLabels/store/states';\r\nimport { TableSearchInput } from '../../../../../../../../../ui/components/table-wrapper/table-tools/table-search-input';\r\nimport { TableDivider } from '../../../../../../../../../ui/components/table-wrapper/table-divider';\r\nimport { TableHeaderFilter } from '../../../../../../../../../ui/components/table-wrapper/table-header-filter';\r\nimport { Popup } from '../../../../../../../../../ui/components/Popup';\r\nimport FilterByHandler from '../../../../../../../../../ui/components/Filters/FilterByHandler';\r\n\r\nconst Container = styled.div`\r\n padding: 0 24px;\r\n`;\r\n\r\nconst TableTools = styled.div`\r\n margin-top: 24px;\r\n margin-bottom: 16px;\r\n display: flex;\r\n`;\r\n\r\nconst FilteredByWrapper = styled.div`\r\n padding: 0 8px;\r\n display: flex;\r\n justify-content: center;\r\n flex-direction: column;\r\n`;\r\n\r\nconst SearchContainer = styled.div`\r\n flex: 1;\r\n`;\r\n\r\nconst LabelsContainer = styled.div`\r\n height: 40px;\r\n width: 40px;\r\n margin-left: 16px;\r\n`;\r\n\r\nconst TableFilters: FC<{\r\n setSearchTerm(value: string): void;\r\n setLabelIDs(labels: number[]): void;\r\n isViewMode?: boolean;\r\n dataTest?: string;\r\n}> = ({ setSearchTerm, setLabelIDs, isViewMode, dataTest }) => {\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState();\r\n const setSelectLabels = useSelectLabels();\r\n const saveLabels = useSaveLabels();\r\n\r\n useEffect(() => {\r\n setLabelIDs(labels.saved);\r\n }, [labels.saved, setLabelIDs]);\r\n\r\n const labelsTree = listToTree(labelsList.data.items);\r\n const handleSelectLabels = useHandleSelectLabels();\r\n\r\n const onRemoveLabel = (label: Label) => {\r\n setSelectLabels(handleSelectLabels(label, labels.saved, labelsTree));\r\n saveLabels();\r\n };\r\n\r\n return (\r\n <Container>\r\n <TableTools>\r\n <SearchContainer>\r\n <TableSearchInput\r\n onChange={setSearchTerm}\r\n disabled={isViewMode}\r\n dataTest={dataTest && `${dataTest}-search-input`}\r\n />\r\n </SearchContainer>\r\n <LabelsContainer>\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <LabelFilters\r\n onLabelsChange={setLabelIDs}\r\n onSuccessApply={() => hide()}\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n disabled={isViewMode}\r\n toggleOpen={toggleShown}\r\n filtersCount={labels.saved.length}\r\n dataTest={dataTest && `${dataTest}-filters`}\r\n />\r\n )}\r\n </Popup>\r\n </LabelsContainer>\r\n </TableTools>\r\n {labels.saved && !!labels.saved.length && (\r\n <FilteredByWrapper>\r\n <TableDivider />\r\n <TableHeaderFilter\r\n selectedLabels={labels.saved}\r\n onRemoveLabel={onRemoveLabel}\r\n />\r\n </FilteredByWrapper>\r\n )}\r\n <TableDivider />\r\n </Container>\r\n );\r\n};\r\n\r\nexport default TableFilters;\r\n","import { FC, useContext, useEffect, useRef } from 'react';\r\n\r\nimport { Droppable } from 'react-beautiful-dnd';\r\nimport { useSelector } from 'react-redux';\r\nimport { PRACTIS_SET_SCENARIO_LIST_DROP_ID } from '../../Content';\r\nimport { ScrollPagination } from '../../../../../../../../ui/components/ScrollPagination';\r\nimport styled from 'styled-components';\r\nimport { Variables } from '../../../../../../../../theme/variables';\r\nimport { GenerateTableCells } from './GenerateTableCells';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../../../../../constants/interfaces/filters';\r\nimport { PractisSetContent } from '../../../../../../../../constants/interfaces/PractisSets';\r\nimport { Scenario } from '../../../../../../../../constants/interfaces/Scenario';\r\nimport PractisContentNavigationContainer from '../../../../PractisContentNavigation/PractisContentNavigation';\r\nimport { EditModeContext } from '../../../../../PractisSets';\r\nimport StackIcon from '../../../../../../../../ui/icons/Stack';\r\nimport TableFilters from '../components/Filters/TableFilters';\r\nimport { UserProfile } from '../../../../../../../../constants/interfaces/User';\r\nimport { isTeamLeader } from '../../../../../../../../constants/enums';\r\nimport { TableRow } from '../../../../../../../../ui/components/table-wrapper/table/table-row';\r\nimport { TableContainer } from '../../../../../../../../ui/components/table-wrapper/styles';\r\nimport { getPractisSetState } from '../../../../../store/reducers';\r\nimport { useOrderBy } from '../../../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { TableNoResult } from '../../../../../../../../ui/components/table-wrapper/table/TableNoResult';\r\nimport { TableHead } from '../../../../../../../../ui/components/Table';\r\nimport { TableHeaderCell } from '../../../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell';\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst StyledScenarioList = styled.div`\r\n overflow: hidden;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst StyledTable = styled.table`\r\n border: none;\r\n overflow: hidden;\r\n width: 100%;\r\n border-spacing: 0;\r\n`;\r\n\r\nconst StyledTableHeaderRow = styled(TableRow)`\r\n border-radius: 2px;\r\n & > th {\r\n font-size: 13px;\r\n padding: 24px 14px 15px 14px;\r\n }\r\n`;\r\n\r\nconst StyledBodyWrapper = styled.div`\r\n border-radius: 0px 4px 4px 4px;\r\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst StyledBody = styled.div`\r\n background: ${props => props.theme.Colors.white};\r\n border-top-right-radius: 16px;\r\n border-bottom-right-radius: 16px;\r\n border-bottom-left-radius: 16px;\r\n padding: 0 24px;\r\n flex: 1;\r\n overflow: auto;\r\n`;\r\n\r\nconst StyledTableContainer = styled(TableContainer)`\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n`;\r\n\r\nconst StyledBodyContainer = styled.div`\r\n overflow: auto;\r\n flex: 1;\r\n height: 100%;\r\n padding-bottom: 16px;\r\n &::-webkit-scrollbar-thumb {\r\n background: ${props => props.theme.Colors.paleGrey};\r\n border-radius: 4px;\r\n }\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n height: 4px;\r\n }\r\n`;\r\n\r\nconst StyledTablePagination = styled(ScrollPagination)`\r\n width: 100%;\r\n`;\r\n\r\nconst StyledTableHeaderCell = styled(TableHeaderCell)`\r\n padding: 16px !important;\r\n`;\r\n\r\nconst TableBody = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n min-height: 100px;\r\n overflow: auto;\r\n`;\r\n\r\nexport const ScenarioList: FC<{\r\n profile?: UserProfile;\r\n scenarios: Array<Scenario>;\r\n practisSetContent: PractisSetContent[];\r\n initialSearchParams: SearchParams;\r\n onChangeSearchParams(searchParams: SearchParams): void;\r\n page: string;\r\n setPage: (value: string) => void;\r\n addToBuilder?: (scenarioId?: number | string) => void;\r\n isLoading: boolean;\r\n}> = ({\r\n profile,\r\n onChangeSearchParams,\r\n scenarios,\r\n practisSetContent,\r\n initialSearchParams,\r\n page,\r\n setPage,\r\n addToBuilder,\r\n isLoading,\r\n}) => {\r\n const isViewMode = isTeamLeader(profile?.role?.name);\r\n const totalScenarios = useSelector(getPractisSetState).totalScenarios;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLimit,\r\n setLabelIDs,\r\n } = useSearchParamsState(initialSearchParams);\r\n\r\n const edit = useContext(EditModeContext);\r\n const scrollableRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (searchParams !== initialSearchParams) {\r\n onChangeSearchParams(searchParams as SearchParams);\r\n }\r\n }, [searchParams, initialSearchParams, onChangeSearchParams]);\r\n\r\n const orderBy = searchParams.orderBy;\r\n const sortName = useOrderBy('title', orderBy, setOrderBy);\r\n const sortDuration = useOrderBy(\r\n 'total_duration',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n return (\r\n <StyledScenarioList>\r\n <PractisContentNavigationContainer\r\n page={page}\r\n setPage={setPage}\r\n scenarioCountFiltered={totalScenarios}\r\n />\r\n <StyledBodyWrapper>\r\n <TableFilters\r\n setSearchTerm={setSearchTerm}\r\n setLabelIDs={setLabelIDs}\r\n isViewMode={isViewMode}\r\n dataTest=\"practis-set-scenarios\"\r\n />\r\n <StyledBody>\r\n <StyledTableContainer>\r\n <StyledTable>\r\n <TableHead>\r\n <StyledTableHeaderRow>\r\n <StyledTableHeaderCell\r\n width={60}\r\n {...sortName}\r\n dataTest=\"practis-set-scenarios-column\"\r\n >\r\n Scenarios\r\n </StyledTableHeaderCell>\r\n <StyledTableHeaderCell\r\n width={40}\r\n {...sortDuration}\r\n dataTest=\"practis-set-scenarios-duration-column\"\r\n >\r\n Duration\r\n </StyledTableHeaderCell>\r\n </StyledTableHeaderRow>\r\n </TableHead>\r\n </StyledTable>\r\n {!isLoading && scenarios.length < 1 ? (\r\n <TableNoResult icon={StackIcon}>\r\n {searchParams.searchTerm.length > 0\r\n ? 'No Scenarios were found'\r\n : 'No Scenarios'}\r\n </TableNoResult>\r\n ) : (\r\n <TableBody ref={scrollableRef}>\r\n <StyledTablePagination\r\n itemsPerPage={ITEMS_PER_PAGE}\r\n itemCount={scenarios ? scenarios.length : 0}\r\n totalCount={totalScenarios}\r\n onLimitChange={setLimit}\r\n scrollableRef={scrollableRef}\r\n hideLoading={\r\n scenarios.length < ITEMS_PER_PAGE\r\n }\r\n >\r\n <Droppable\r\n droppableId={\r\n PRACTIS_SET_SCENARIO_LIST_DROP_ID\r\n }\r\n >\r\n {(provided: any) => {\r\n return (\r\n <StyledBodyContainer\r\n {...provided.droppableProps}\r\n ref={provided.innerRef}\r\n >\r\n {\r\n <GenerateTableCells\r\n content={scenarios}\r\n mode={edit.mode}\r\n practisSetContent={\r\n practisSetContent\r\n }\r\n background={\r\n Variables.Colors\r\n .white\r\n }\r\n addToBuilder={\r\n addToBuilder\r\n }\r\n dataTest=\"practis-set-scenario-item\"\r\n />\r\n }\r\n {provided.placeholder}\r\n </StyledBodyContainer>\r\n );\r\n }}\r\n </Droppable>\r\n </StyledTablePagination>\r\n </TableBody>\r\n )}\r\n </StyledTableContainer>\r\n </StyledBody>\r\n </StyledBodyWrapper>\r\n </StyledScenarioList>\r\n );\r\n};\r\n","import { FC, useContext, useEffect, useRef } from 'react';\r\n\r\nimport styled from 'styled-components';\r\nimport { useSelector } from 'react-redux';\r\nimport { Variables } from '../../../../../../../../theme/variables';\r\nimport { ScrollPagination } from '../../../../../../../../ui/components/ScrollPagination';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../../../../../constants/interfaces/filters';\r\nimport { PractisSetContent } from '../../../../../../../../constants/interfaces/PractisSets';\r\nimport { Challenge } from '../../../../../../../../constants/interfaces/Challenge';\r\nimport { Droppable } from 'react-beautiful-dnd';\r\nimport { PRACTIS_SET_CHALLENGER_LIST_DROP_ID } from '../../Content';\r\nimport { GenerateTableCells } from './GenerateTableCells';\r\nimport PractisContentNavigationContainer from '../../../../PractisContentNavigation/PractisContentNavigation';\r\nimport { EditModeContext } from '../../../../../PractisSets';\r\nimport TableFilters from '../components/Filters/TableFilters';\r\nimport { isTeamLeader } from '../../../../../../../../constants/enums';\r\nimport { UserProfile } from '../../../../../../../../constants/interfaces/User';\r\nimport { TableRow } from '../../../../../../../../ui/components/table-wrapper/table/table-row';\r\nimport { TableContainer } from '../../../../../../../../ui/components/table-wrapper/styles';\r\nimport { getPractisSetState } from '../../../../../store/reducers';\r\nimport { useOrderBy } from '../../../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { TableHead } from '../../../../../../../../ui/components/Table';\r\nimport { TableNoResult } from '../../../../../../../../ui/components/table-wrapper/table/TableNoResult';\r\nimport { TableHeaderCell } from '../../../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell';\r\nimport StackIcon from '../../../../../../../../ui/icons/Stack';\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst StyledChallengeList = styled.div`\r\n overflow: hidden;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst StyledTable = styled.table`\r\n width: 100%;\r\n border: none;\r\n overflow: hidden;\r\n border-spacing: 0;\r\n`;\r\n\r\nconst StyledTableHeaderRow = styled(TableRow)`\r\n border-radius: 2px;\r\n & > th {\r\n font-size: 13px;\r\n padding: 24px 14px 15px 14px;\r\n }\r\n`;\r\n\r\nconst StyledBodyWrapper = styled.div`\r\n border-radius: 4px;\r\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst StyledBody = styled.div`\r\n border-top-right-radius: 16px;\r\n border-bottom-right-radius: 16px;\r\n border-bottom-left-radius: 16px;\r\n padding: 0 24px;\r\n flex: 1;\r\n overflow: auto;\r\n`;\r\n\r\nconst StyledTableContainer = styled(TableContainer)`\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n`;\r\n\r\nconst StyledBodyContainer = styled.div`\r\n overflow: auto;\r\n flex: 1;\r\n height: 100%;\r\n padding-bottom: 16px;\r\n &::-webkit-scrollbar-thumb {\r\n background: ${props => props.theme.Colors.paleGrey};\r\n border-radius: 4px;\r\n }\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n height: 4px;\r\n }\r\n`;\r\n\r\nconst StyledTablePagination = styled(ScrollPagination)`\r\n width: 100%;\r\n`;\r\n\r\nconst StyledTableHeaderCell = styled(TableHeaderCell)`\r\n padding: 16px !important;\r\n`;\r\n\r\nconst TableBody = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n min-height: 100px;\r\n overflow: auto;\r\n`;\r\n\r\nexport const ChallengeList: FC<{\r\n profile?: UserProfile;\r\n challenges: Array<Challenge>;\r\n practisSetContent: PractisSetContent[];\r\n initialSearchParams: SearchParams;\r\n onChangeSearchParams(searchParams: SearchParams): void;\r\n page: string;\r\n setPage: (value: string) => void;\r\n addToBuilder?: (scenarioId?: number | string) => void;\r\n isLoading: boolean;\r\n}> = ({\r\n profile,\r\n onChangeSearchParams,\r\n challenges,\r\n practisSetContent,\r\n initialSearchParams,\r\n page,\r\n setPage,\r\n addToBuilder,\r\n isLoading,\r\n}) => {\r\n const isViewMode = isTeamLeader(profile?.role?.name);\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLimit,\r\n setLabelIDs,\r\n } = useSearchParamsState(initialSearchParams);\r\n const edit = useContext(EditModeContext);\r\n const scrollableRef = useRef<HTMLDivElement>(null);\r\n const totalChallenges = useSelector(getPractisSetState).totalChallenges;\r\n\r\n useEffect(() => {\r\n if (searchParams !== initialSearchParams) {\r\n onChangeSearchParams(searchParams as SearchParams);\r\n }\r\n }, [searchParams, initialSearchParams, onChangeSearchParams]);\r\n\r\n const orderBy = searchParams.orderBy;\r\n const sortName = useOrderBy('title', orderBy, setOrderBy);\r\n const sortDuration = useOrderBy(\r\n 'total_duration',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n return (\r\n <StyledChallengeList>\r\n <PractisContentNavigationContainer\r\n page={page}\r\n setPage={setPage}\r\n challengeCountFiltered={totalChallenges}\r\n />\r\n <StyledBodyWrapper>\r\n <TableFilters\r\n setSearchTerm={setSearchTerm}\r\n setLabelIDs={setLabelIDs}\r\n isViewMode={isViewMode}\r\n dataTest=\"practis-set-challenges\"\r\n />\r\n <StyledBody>\r\n <StyledTableContainer>\r\n <StyledTable>\r\n <TableHead>\r\n <StyledTableHeaderRow>\r\n <StyledTableHeaderCell\r\n width={60}\r\n {...sortName}\r\n dataTest=\"practis-set-challenges-column\"\r\n >\r\n Challenges\r\n </StyledTableHeaderCell>\r\n <StyledTableHeaderCell\r\n width={40}\r\n {...sortDuration}\r\n dataTest=\"practis-set-challenges-duration-column\"\r\n >\r\n Duration\r\n </StyledTableHeaderCell>\r\n </StyledTableHeaderRow>\r\n </TableHead>\r\n </StyledTable>\r\n {!isLoading && challenges.length < 1 ? (\r\n <TableNoResult icon={StackIcon}>\r\n {searchParams.searchTerm.length > 0\r\n ? 'No Challenges were found'\r\n : 'No Challenges'}\r\n </TableNoResult>\r\n ) : (\r\n <TableBody ref={scrollableRef}>\r\n <StyledTablePagination\r\n itemsPerPage={ITEMS_PER_PAGE}\r\n itemCount={\r\n challenges ? challenges.length : 0\r\n }\r\n totalCount={totalChallenges}\r\n onLimitChange={setLimit}\r\n scrollableRef={scrollableRef}\r\n hideLoading={\r\n challenges?.length < ITEMS_PER_PAGE\r\n }\r\n >\r\n <Droppable\r\n droppableId={\r\n PRACTIS_SET_CHALLENGER_LIST_DROP_ID\r\n }\r\n >\r\n {(provided: any) => {\r\n return (\r\n <StyledBodyContainer\r\n {...provided.droppableProps}\r\n ref={provided.innerRef}\r\n >\r\n {\r\n <GenerateTableCells\r\n content={challenges}\r\n mode={edit.mode}\r\n practisSetContent={\r\n practisSetContent\r\n }\r\n background={\r\n Variables.Colors\r\n .white\r\n }\r\n addToBuilder={\r\n addToBuilder\r\n }\r\n dataTest=\"practis-set-challenge-item\"\r\n />\r\n }\r\n {provided.placeholder}\r\n </StyledBodyContainer>\r\n );\r\n }}\r\n </Droppable>\r\n </StyledTablePagination>\r\n </TableBody>\r\n )}\r\n </StyledTableContainer>\r\n </StyledBody>\r\n </StyledBodyWrapper>\r\n </StyledChallengeList>\r\n );\r\n};\r\n","import { useState, FC, useContext, useMemo, useCallback, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { ScenarioList } from './pages/Scenarios';\nimport { ChallengeList } from './pages/Challenges';\nimport {\n PractisSetContent,\n PractisSets,\n} from '../../../../../../../constants/interfaces/PractisSets';\nimport { Variables } from '../../../../../../../theme/variables';\nimport { EditModeValues } from '../../../../../../../constants/enums/EditModeValues';\nimport { EditModeContext } from '../../../../PractisSets';\nimport { useModifyPractisSetService, useSearchPractisChallenges, useSearchPractisScenarios } from '../../../../store/services';\nimport { useSelector } from 'react-redux';\nimport { getPractisSetState } from '../../../../store/reducers';\nimport { WithLabelsContext } from '../../../../../../../features/portableLabels';\nimport { UserProfile } from '../../../../../../../constants/interfaces/User';\nimport { Scenario } from '../../../../../../../constants/interfaces/Scenario';\nimport { SearchParams } from '../../../../../../../constants/interfaces/filters';\nimport { Challenge } from '../../../../../../../constants/interfaces/Challenge';\nimport { getProfileState } from '../../../../../../UserProfile/store/reducers';\nimport { useSearchDebounced } from '../../../../../../../helpers/hooks/useSearch';\nimport { useLabelsState } from '../../../../../../../features/portableLabels/store/hors/withLabels/states';\nimport { LibraryItemsStatus } from '../../../../../../../features/library/tools';\nimport TextAreaBox from '../../../../../../../ui/components/TextAreaBox/TextAreaBox';\n\n\nconst ITEMS_PER_PAGE = 20;\n\nconst StyledListContent = styled.div`\n flex: 1;\n margin-bottom: 16px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst StyledDescriptionInfoContent = styled.div`\n padding: 16px;\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n margin-bottom: 16px;\n`;\n\nconst StyledInputDivs = styled.div``;\n\nconst ListContent: FC<{\n practisSet?: PractisSets;\n practisSetContent: PractisSetContent[];\n profile?: UserProfile;\n scenarios: Array<Scenario>;\n isScenariosLoading: boolean;\n isChallengesLoading: boolean;\n getScenarios(searchParams: SearchParams): void;\n challenges: Array<Challenge>;\n getChallenges(searchParams: SearchParams): void;\n addScenarioToBuilder?: (scenarioId?: number | string) => void;\n addChallengeToBuilder?: (challengeId?: number | string) => void;\n}> = ({\n practisSet,\n practisSetContent,\n profile,\n scenarios,\n getScenarios,\n challenges,\n isScenariosLoading,\n isChallengesLoading,\n getChallenges,\n addScenarioToBuilder,\n addChallengeToBuilder,\n}) => {\n const [page, setPage] = useState<string>('');\n const edit = useContext(EditModeContext);\n const modifyPractisSet = useModifyPractisSetService();\n const labels = useLabelsState();\n\n const initialSearchParams: SearchParams = useMemo(\n () => ({\n searchTerm: '',\n filters: [{ field: 'status', value: [LibraryItemsStatus.ACTIVE] }],\n orderBy: {\n field: 'updated_at',\n asc: false,\n },\n labelIDs: labels.saved,\n offset: 0,\n limit: ITEMS_PER_PAGE,\n totalCount: 0,\n numberOfPages: 0,\n companyId: profile?.companyId\n }),\n [labels.saved, profile?.companyId]\n );\n\n const handleChange = useCallback((event: { target: HTMLInputElement }) => {\n modifyPractisSet(event.target.value, 'description');\n }, [modifyPractisSet]);\n\n useEffect(() => {\n if (!page || page === 'scenarios') {\n getScenarios(initialSearchParams);\n }\n if (!page || page === 'challenges') {\n getChallenges(initialSearchParams);\n }\n }, [page, getScenarios, getChallenges, initialSearchParams]);\n\n return (\n <StyledListContent>\n <StyledDescriptionInfoContent>\n <StyledInputDivs>\n <TextAreaBox\n background={Variables.Colors.whiteFive}\n value={practisSet && practisSet.description}\n onChange={handleChange}\n name=\"description\"\n placeholder=\"Description\"\n max={500}\n minRows={1}\n padding=\"6px 12px\"\n readOnly={edit.mode === EditModeValues.VIEW}\n dataTest='practis-set-description'\n />\n </StyledInputDivs>\n </StyledDescriptionInfoContent>\n {!page || page === 'scenarios' ? (\n <ScenarioList\n profile={profile}\n initialSearchParams={initialSearchParams}\n scenarios={scenarios}\n onChangeSearchParams={getScenarios}\n practisSetContent={practisSetContent}\n addToBuilder={addScenarioToBuilder}\n page={page || 'scenarios'}\n setPage={setPage}\n isLoading={isScenariosLoading}\n />\n ) : (\n <ChallengeList\n profile={profile}\n initialSearchParams={initialSearchParams}\n challenges={challenges}\n onChangeSearchParams={getChallenges}\n practisSetContent={practisSetContent}\n addToBuilder={addChallengeToBuilder}\n page={page}\n setPage={setPage}\n isLoading={isChallengesLoading}\n />\n )}\n </StyledListContent>\n );\n};\n\nexport const ListContentContainer: FC<{\n practisSetContent: PractisSetContent[];\n addScenarioToBuilder?: (scenarioId?: number | string) => void;\n addChallengeToBuilder?: (challengeId?: number | string) => void;\n}> = ({ practisSetContent, addScenarioToBuilder, addChallengeToBuilder }) => {\n const practisSet = useSelector(getPractisSetState).info;\n const profile = useSelector(getProfileState);\n const scenarios = useSelector(getPractisSetState).scenarios;\n const isScenariosLoading = useSelector(getPractisSetState).isScenariosLoading;\n const isChallengesLoading = useSelector(getPractisSetState).isChallengesLoading;\n const searchPractisScenarios = useSearchPractisScenarios();\n const searchPractisScenariosDebounced = useSearchDebounced(\n searchPractisScenarios\n );\n const challenges = useSelector(getPractisSetState).challenges;\n const searchPractisChallenges = useSearchPractisChallenges();\n const searchPractisChallengesDebounced = useSearchDebounced(\n searchPractisChallenges\n );\n\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'practisSet',\n scope: 'applyLabels',\n }}\n >\n <ListContent\n practisSet={practisSet}\n practisSetContent={practisSetContent}\n profile={profile}\n scenarios={scenarios}\n isScenariosLoading={isScenariosLoading}\n isChallengesLoading={isChallengesLoading}\n getScenarios={searchPractisScenariosDebounced}\n challenges={challenges}\n getChallenges={searchPractisChallengesDebounced}\n addScenarioToBuilder={addScenarioToBuilder}\n addChallengeToBuilder={addChallengeToBuilder}\n />\n </WithLabelsContext.Provider>\n );\n};\n\nexport default ListContentContainer;\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../../UserProfile/store/reducers';\nimport { getCompanyState } from '../../../../../../../CompanySettings/store/reducers';\nimport { useGetCompanyService } from '../../../../../../../CompanySettings/store/services';\n\n//region Styles\nconst StyledBuilderConfigs = styled.div`\n flex: 1;\n background: ${props => props.theme.Colors.dark};\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 5px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst StyledValue = styled.div<{ disabled?: boolean }>`\n font-size: 17px;\n font-weight: bold;\n color: ${props => props.theme.Colors.white};\n margin: 0;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n`;\n\nconst MinimumAccuracy = () => {\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n const getCompany = useGetCompanyService();\n\n useEffect(() => {\n if (!company?.id && profile?.companyId) {\n getCompany(profile.companyId);\n }\n }, [company?.id, profile?.companyId, getCompany]);\n \n const minimumAccuracy = company?.minTrainingScore || 65;\n\n return (\n <StyledBuilderConfigs>\n <StyledDescription data-test='practis-set-minimum-accuracy-text'>\n Minimum Accuracy\n </StyledDescription>\n <StyledValue\n disabled={true}\n data-test='practis-set-minimum-accuracy-value'>\n {minimumAccuracy}%\n </StyledValue>\n </StyledBuilderConfigs>\n );\n};\n\nexport default MinimumAccuracy;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport secondsToMin from '../../../../../../../../helpers/functions/convert-time';\n\nconst StyledBuilderDuration = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n`;\n\nconst StyledValue = styled.div`\n font-size: 17px;\n font-weight: bold;\n color: ${props => props.theme.Colors.white};\n margin: 0;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 5px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst BuilderDuration: FC<{ duration?: number | null }> = ({ duration }) => {\n return (\n <StyledBuilderDuration>\n <StyledDescription data-test='practis-set-total-duration-text'>\n Total Duration\n </StyledDescription>\n <StyledValue data-test='practis-set-total-duration-value'>\n {secondsToMin(duration)}\n </StyledValue>\n </StyledBuilderDuration>\n );\n};\n\nexport default BuilderDuration;\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n practisSetEntityTypeName,\n PractisSetEntityTypes,\n} from '../../../../../../tools';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../../../../../../constants/interfaces/ScriptLine';\nimport { PractisSetContent } from '../../../../../../../../../constants/interfaces/PractisSets';\nimport useWindowDimensions from '../../../../../../../../../helpers/hooks/useWindowDimensions';\nimport Close from '../../../../../../../../../ui/icons/Close';\nimport { Keywords } from '../../../../../../../../../constants/interfaces/Keywords';\n\n\nconst PreviewItemContainer = styled.div<{\n top: number;\n left: number;\n bottom?: number;\n}>`\n padding: 15px 12px;\n box-shadow: 0 3px 20px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n background: ${props => props.theme.Colors.white};\n width: 344px;\n max-height: 496px;\n position: absolute;\n display: flex;\n flex-direction: column;\n left: ${props => props.left}px;\n top: ${props => (props.bottom ? 'unset' : `${props.top}px`)};\n bottom: ${props => (props.bottom ? `${props.bottom}px` : 'unset')};\n border-radius: 8px;\n\n .keyword-item {\n color: var(--ps-blue-main);\n font-weight: bold;\n display: inline;\n }\n`;\n\nconst ScrollContainer = styled.div`\n padding: 15px 12px;\n height: 100%;\n flex: 1;\n overflow: auto;\n position: relative;\n`;\n\nconst PreviewHeader = styled.div`\n padding: 0 8px;\n margin-bottom: 18px;\n`;\n\nconst IconContainer = styled.div`\n height: 10px;\n width: 10px;\n position: absolute;\n right: 0;\n top: 0;\n cursor: pointer;\n color: ${props => props.theme.Colors.paleGrey};\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst Content = styled.div`\n flex: 1;\n overflow: auto;\n`;\n\nconst Type = styled.div`\n font-size: 11px;\n font-weight: 600;\n`;\n\nconst ChallengeType = styled(Type)`\n color: ${props => props.theme.Colors.coral};\n`;\n\nconst ScenarioType = styled(Type)`\n color: ${props => props.theme.Colors.darkSkyBlue};\n`;\n\nconst Title = styled.div`\n font-size: 15px;\n font-weight: bold;\n color: ${props => props.theme.Colors.black};\n margin-bottom: 8px;\n`;\n\nconst Description = styled.div`\n font-size: 13px;\n font-weight: normal;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst ScriptLineCard = styled.div`\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n padding: 16px 24px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n margin-bottom: 8px;\n`;\n\nconst LineTitle = styled.div`\n font-size: 11px;\n font-weight: 600;\n margin-bottom: 8px;\n`;\n\nconst LineDescription = styled.div`\n font-size: 11px;\n font-weight: normal;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst LineCustomerTitle = styled(LineTitle)`\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst LineRepTitle = styled(LineTitle)`\n color: ${props => props.theme.Colors.darkSkyBlue};\n`;\n\nconst PreviewItem: FC<{\n item: PractisSetContent;\n position: { y: number; x: number };\n handleClose(): void;\n}> = ({ item, position, handleClose }) => {\n const windowDimensions = useWindowDimensions();\n const cardRef = useRef<any>(null);\n const [cardPositions, setCardPositions] = useState<{\n top: number | undefined;\n left: number | undefined;\n bottom: number | undefined;\n }>({\n top: position.y - 150,\n left: position.x - 600,\n bottom: undefined,\n });\n\n const isScenario = item.type === PractisSetEntityTypes.SCENARIO;\n const content = isScenario ? item.scenario : item.challenge;\n\n const buildText = useCallback((line: ScriptLine) => {\n if (!line.keywords.length || !isScenario) {\n return line.text;\n }\n\n return line.keywords\n .reduce((str: any, keyword: Keywords) => {\n str[\n keyword.start\n ] = `<span class=\"keyword-item\">${str[keyword.start]}`;\n str[keyword.end] = `${str[keyword.end]}</span>`;\n return str;\n }, line.text.split(''))\n .join('');\n }, [isScenario]);\n\n useEffect(() => {\n if (cardRef.current) {\n const cardPosition = cardRef.current.getBoundingClientRect();\n const bottom =\n position.y + cardPosition.height > windowDimensions.height\n ? 100\n : undefined;\n const top = position.y - 150;\n const left = position.x - 600;\n\n setCardPositions({\n top: top,\n left: left,\n bottom: bottom,\n });\n }\n }, [position.x, position.y, windowDimensions.height]);\n\n if (!cardPositions.top || !cardPositions.left) {\n return <div />;\n }\n return (\n <PreviewItemContainer\n top={cardPositions.top}\n left={cardPositions.left}\n bottom={cardPositions.bottom}\n ref={cardRef}\n >\n <ScrollContainer>\n <IconContainer onClick={handleClose}>\n <Close />\n </IconContainer>\n <PreviewHeader>\n {!isScenario ? (\n <ChallengeType>\n {practisSetEntityTypeName(item.type)}\n </ChallengeType>\n ) : (\n <ScenarioType>\n {practisSetEntityTypeName(item.type)}\n </ScenarioType>\n )}\n <Title>{content?.title}</Title>\n <Description>{content?.description}</Description>\n </PreviewHeader>\n <Content>\n {content?.script?.lines?.map((line: ScriptLine) => {\n return (\n <ScriptLineCard key={line.id}>\n {line.speaker === ScriptLineSpeaker.CUSTOMER ? (\n <LineCustomerTitle>\n Customer\n </LineCustomerTitle>\n ) : (\n <LineRepTitle>Rep</LineRepTitle>\n )}\n <LineDescription\n dangerouslySetInnerHTML={{ __html: buildText(line) }}\n />\n </ScriptLineCard>\n );\n })}\n </Content>\n </ScrollContainer>\n </PreviewItemContainer>\n );\n};\n\nexport default PreviewItem;\n","import React, { FC, useEffect, useRef, useState } from 'react';\nimport {\n practisSetEntityTypeColor,\n practisSetEntityTypeName,\n PractisSetEntityTypes,\n} from '../../../../../tools';\nimport secondsToMin from '../../../../../../../../helpers/functions/convert-time';\nimport {\n PractisSetContent,\n PractisSetContentEntities,\n} from '../../../../../../../../constants/interfaces/PractisSets';\nimport styled from 'styled-components';\nimport {\n usePractisContentRepCountDecrease,\n usePractisContentRepCountIncrease,\n} from '../../../../../store/services';\nimport PreviewItem from './PreviewItem/PreviewItem';\nimport OutsideActionBox from '../../../../../../../../ui/components/OutsideActionBox/OutsideActionBox';\nimport Trash from '../../../../../../../../ui/icons/Trash';\n\nconst StyledBuilderListItem = styled.div<{\n disabled?: boolean;\n isDragging: boolean;\n}>`\n background: ${props => props.theme.Colors.white};\n border-radius: 4px;\n padding: 14px 0 14px 32px;\n display: flex;\n margin-bottom: 16px;\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n`;\n\nconst StyledRemoveSection = styled.div`\n margin: 0 24px 0 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst StyledRemoveIcon = styled.div<{ disabled?: boolean }>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n width: 15px;\n height: 16px;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n &:hover {\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.paleRed};\n }\n`;\n\nconst InfoSection = styled.div`\n padding: 8px 0;\n flex: 1;\n`;\n\nconst EntityName = styled.div<{ color: string }>`\n font-size: 11px;\n font-weight: 600;\n color: ${props => props.color};\n`;\n\nconst EntityItemTitle = styled.div`\n font-size: 15px;\n font-weight: bold;\n color: ${props => props.theme.Colors.black};\n margin-bottom: 4px;\n word-break: break-all;\n`;\n\nconst EntityItemActions = styled.div`\n display: flex;\n`;\n\nconst EntityItemDuration = styled.div`\n font-size: 13px;\n font-weight: normal;\n color: ${props => props.theme.Colors.steelGrey};\n margin-right: 8px;\n`;\n\nconst PreviewButton = styled.div`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.darkSkyBlue};\n cursor: pointer;\n &:hover {\n color: ${props => props.theme.Colors.lightBlue};\n }\n &:active {\n color: ${props => props.theme.Colors.windowsBlue};\n }\n`;\n\nconst SectionDivider = styled.div`\n width: 1px;\n margin: 0 16px;\n background: ${props => props.theme.Colors.paleGrey};\n`;\n\nconst RepsSection = styled.div`\n padding: 8px 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nconst RepsTitle = styled.div<{ disabled?: boolean }>`\n font-size: 11px;\n font-weight: 600;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n margin-bottom: 8px;\n`;\n\nconst RepsCounter = styled.div`\n display: flex;\n height: 24px;\n justify-content: space-evenly;\n text-align: center;\n`;\n\nconst RepsCount = styled.div<{ disabled?: boolean }>`\n font-size: 17px;\n font-weight: bold;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n`;\n\nconst SetCountContainer = styled.div<{ disabled?: boolean }>`\n width: 24px;\n height: 24px;\n font-size: 15px;\n font-weight: bold;\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${props => (props.disabled ? 'auto' : 'pointer')};\n user-select: none;\n &:active {\n opacity: ${props => (props.disabled ? 1 : 0.7)};\n }\n`;\n\nconst BuilderListItem: FC<{\n item: PractisSetContent;\n provided: any;\n snapshot: any;\n onRemove(id: number | string, type: PractisSetContentEntities): void;\n disabled?: boolean;\n showPreview: any;\n setShowPreview(show: any): void;\n dataTest: string;\n}> = ({\n item,\n provided,\n snapshot,\n onRemove,\n disabled,\n showPreview,\n setShowPreview,\n dataTest\n}) => {\n const increaseContentMinRepCount = usePractisContentRepCountIncrease();\n const decreaseContentMinRepCount = usePractisContentRepCountDecrease();\n const isScenario = item.type === PractisSetEntityTypes.SCENARIO;\n const itemId = isScenario ? item.scenario!.id : item.challenge!.id;\n const content = isScenario ? item.scenario : item.challenge;\n const itemRef = useRef<any>(null);\n const [position, setPosition] = useState({ y: 0, x: 0 });\n\n useEffect(() => {\n if (itemRef && itemRef.current) {\n const itemPositions = itemRef.current.getBoundingClientRect();\n setPosition({ y: itemPositions.y, x: itemPositions.x });\n }\n }, [setPosition, snapshot.isDragging]);\n\n const decreaseContentDisabled = isScenario\n ? !item.minRepsCount || item.minRepsCount < 2\n : true;\n const dataTestPrefix = `${dataTest}-${item.type?.toLowerCase()}`;\n\n return (\n <StyledBuilderListItem\n provided={provided}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n disabled={disabled}\n isDragging={snapshot.isDragging}\n onMouseDown={() => {\n setShowPreview(null);\n }}\n >\n <InfoSection\n ref={itemRef}\n onDoubleClick={() =>\n !disabled && onRemove(item?.uniqueId!, item.type!)\n }\n >\n <EntityName\n color={practisSetEntityTypeColor(item.type)}\n data-test={`${dataTestPrefix}-label`}\n >\n {practisSetEntityTypeName(item.type)}\n </EntityName>\n <EntityItemTitle data-test={`${dataTestPrefix}-title`}>\n {content?.title}\n </EntityItemTitle>\n <EntityItemActions>\n {isScenario && (\n <EntityItemDuration\n data-test={`${dataTestPrefix}-duration`}\n >\n {item.scenario?.script?.totalDuration\n ? secondsToMin(\n content?.script?.totalDuration\n )\n : '-'}\n </EntityItemDuration>\n )}\n <PreviewButton\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setShowPreview(itemId);\n }}\n data-test={`${dataTestPrefix}-preview`}\n >\n Preview\n </PreviewButton>\n </EntityItemActions>\n </InfoSection>\n {isScenario && (\n <>\n <SectionDivider />\n <RepsSection>\n <RepsTitle\n disabled={disabled}\n data-test={`${dataTestPrefix}-min-reps-label`}\n >\n Minimum Reps\n </RepsTitle>\n <RepsCounter>\n <SetCountContainer\n disabled={decreaseContentDisabled || disabled}\n onClick={() =>\n itemId &&\n !decreaseContentDisabled &&\n !disabled &&\n decreaseContentMinRepCount(itemId)\n }\n data-test={`${dataTestPrefix}-min-reps-minus`}\n >\n -\n </SetCountContainer>\n <RepsCount\n disabled={disabled}\n data-test={`${dataTestPrefix}-min-reps-value`}\n >\n {item.minRepsCount}\n </RepsCount>\n <SetCountContainer\n disabled={disabled}\n onClick={() =>\n itemId &&\n !disabled &&\n increaseContentMinRepCount(itemId)\n }\n data-test={`${dataTestPrefix}-min-reps-plus`}\n >\n +\n </SetCountContainer>\n </RepsCounter>\n </RepsSection>\n </>\n )}\n <SectionDivider />\n <StyledRemoveSection>\n <StyledRemoveIcon\n onClick={() => {\n !disabled && onRemove(item?.uniqueId!, item.type!);\n }}\n disabled={disabled}\n data-test={`${dataTestPrefix}-delete`}\n >\n <Trash />\n </StyledRemoveIcon>\n </StyledRemoveSection>\n <OutsideActionBox\n open={showPreview === itemId}\n toggleOpen={setShowPreview}\n >\n <PreviewItem\n item={item}\n position={position}\n handleClose={() => setShowPreview(null)}\n />\n </OutsideActionBox>\n </StyledBuilderListItem>\n );\n};\n\nexport default BuilderListItem;","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst StyledBuilderDuration = styled.div`\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n`;\n\nconst StyledValue = styled.div`\n font-size: 17px;\n font-weight: bold;\n color: ${props => props.theme.Colors.white};\n margin: 0;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 5px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst RepsRequired: FC<{ reps?: number | null }> = ({ reps }) => {\n return (\n <StyledBuilderDuration>\n <StyledDescription data-test='practis-set-total-reps-text'>\n Total Reps Req'd\n </StyledDescription>\n <StyledValue data-test='practis-set-total-reps-value'>\n {reps ? reps : 0}\n </StyledValue>\n </StyledBuilderDuration>\n );\n};\n\nexport default RepsRequired;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Documents = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 64 64\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fillRule=\"evenodd\"\n fill=\"currentColor\"\n d=\"M59.429 55.465H13.714c-2.524 0-4.571-1.907-4.571-4.266V4.267C9.143 1.909 11.19 0 13.714 0H59.43C61.953 0 64 1.91 64 4.267v46.932c0 2.36-2.047 4.266-4.571 4.266zm0-49.064c0-1.179-1.023-2.133-2.286-2.133H16c-1.262 0-2.286.954-2.286 2.133v42.666c0 1.176 1.024 2.133 2.286 2.133h41.143c1.263 0 2.286-.956 2.286-2.133V6.4zM52.57 42.667h-32c-1.262 0-2.285-.956-2.285-2.135 0-1.178 1.024-2.134 2.285-2.134h32c1.262 0 2.286.956 2.286 2.134 0 1.18-1.023 2.135-2.286 2.135zm0-12.8h-32c-1.262 0-2.285-.957-2.285-2.134 0-1.178 1.024-2.133 2.285-2.133h32c1.262 0 2.286.955 2.286 2.133 0 1.177-1.023 2.133-2.286 2.133zm-13.714-12.8H20.571c-1.262 0-2.285-.955-2.285-2.133s1.024-2.133 2.285-2.133h18.286c1.262 0 2.286.955 2.286 2.133s-1.023 2.132-2.286 2.132zm16 46.933H4.571C2.047 64 0 62.09 0 59.732V12.801c0-2.356 2.047-4.265 4.571-4.265v51.196H59.43c0 2.358-2.047 4.268-4.572 4.268z\"\n />\n </svg>\n );\n }\n);\n\nexport default Documents;\n","import React, { FC, useContext, useState } from 'react';\nimport styled from 'styled-components';\nimport { getPractisSetState } from '../../../../store/reducers';\nimport { useSelector } from 'react-redux';\nimport {\n PractisSetContent,\n PractisSetContentEntities,\n PractisSets,\n} from '../../../../../../../constants/interfaces/PractisSets';\nimport { Draggable, Droppable } from 'react-beautiful-dnd';\nimport { PRACTIS_SET_BUILDER_DROP_ID } from '../Content';\nimport { useModifyPractisSetService } from '../../../../store/services';\nimport { PractisSetEntityTypes } from '../../../../tools';\nimport { EditModeValues } from '../../../../../../../constants/enums/EditModeValues';\nimport { EditModeContext } from '../../../../PractisSets';\nimport MinimumAccuracy from './components/MinimumAccuracy';\nimport BuilderDuration from './components/BuilderDuration';\nimport BuilderListItem from './components/BuilderListItem';\nimport RepsRequired from './components/RepsRequired';\nimport Documents from '../../../../../../../ui/icons/Documents';\nimport { TableContainer } from '../../../../../../../ui/components/table-wrapper/styles';\n\nconst StyledBuilderContent = styled.div`\n flex: 1;\n margin-bottom: 16px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n margin-left: 32px;\n`;\n\nconst BuilderContent = styled.div`\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n`;\n\nconst BuilderActions = styled.div`\n height: 96px;\n display: flex;\n background: ${props => props.theme.Colors.darkTwo};\n border-radius: 4px;\n margin-bottom: 16px;\n overflow: hidden;\n flex-shrink: 0;\n`;\n\nconst BuilderBody = styled.div`\n overflow: hidden;\n display: flex;\n flex: 1;\n`;\n\nconst StyledTableContainer = styled(TableContainer)`\n overflow: auto;\n flex-grow: 1;\n display: flex;\n && > div {\n overflow: auto;\n }\n &::-webkit-scrollbar-thumb {\n background: ${props => props.theme.Colors.paleGrey};\n border-radius: 4px;\n }\n &::-webkit-scrollbar {\n width: 4px;\n height: 4px;\n }\n`;\n\nconst StyledBuilderBodyArea = styled.div`\n flex: 1;\n height: 100%;\n`;\n\nconst NoResultContainer = styled.div`\n display: flex;\n justify-content: center;\n padding: 100px 0;\n font-size: 20px;\n color: ${props => props.theme.Colors.coolGray};\n flex-direction: column;\n align-items: center;\n`;\n\nconst NoResultLogo = styled.div`\n height: 64px;\n width: 64px;\n margin-bottom: 20px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst NoResultHeader = styled.div`\n font-size: 20px;\n font-weight: bold;\n margin: 8px 0;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst NoResultText = styled.div`\n font-size: 15px;\n text-align: center;\n margin: 8px 0;\n max-width: 224px;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst StyledEmptyDroppableArea = styled.div``;\n\nexport const StyledTableBody = styled('tbody')<{\n emptyDropArea?: boolean;\n isDraggingOver?: any;\n}>`\n min-height: 50px;\n`;\n\ninterface PractisSetBuilderProps {\n practisSetContent: PractisSetContent[];\n practisSet: PractisSets;\n handleRemoveContent: (\n index: number | string,\n type: PractisSetContentEntities\n ) => void;\n modifyPractisSet: (\n value: string | number,\n field: keyof PractisSets,\n silent?: boolean\n ) => void;\n}\n\nconst GenerateTableCells: FC<{\n content: PractisSetContent[];\n handleRemoveContent: (\n index: number | string,\n type: PractisSetContentEntities\n ) => void;\n disabled?: boolean;\n}> = ({ content, handleRemoveContent, disabled }): any => {\n const [showPreview, setShowPreview] = useState<any>(null);\n\n return content.map((item: PractisSetContent, index: number) => (\n <Draggable\n key={item?.uniqueId}\n draggableId={`${PRACTIS_SET_BUILDER_DROP_ID}-${item?.uniqueId}`}\n index={index}\n isDragDisabled={disabled}\n >\n {(provided: any, snapshot: any) => {\n return (\n <BuilderListItem\n item={item}\n provided={provided}\n snapshot={snapshot}\n disabled={disabled}\n onRemove={handleRemoveContent}\n showPreview={showPreview}\n setShowPreview={setShowPreview}\n dataTest=\"practis-set-content\"\n />\n );\n }}\n </Draggable>\n ));\n};\n\nconst PractisSetBuilder: React.FC<PractisSetBuilderProps> = ({\n practisSetContent,\n practisSet,\n handleRemoveContent,\n modifyPractisSet,\n}) => {\n const edit = useContext(EditModeContext);\n\n // Change to minRepsCountTotal TODO\n const totalRepsReqD = practisSet.content\n .filter(\n (item: PractisSetContent) =>\n item.type === PractisSetEntityTypes.SCENARIO\n )\n .reduce((prev: any, cur: any) => {\n return prev + cur.minRepsCount;\n }, 0);\n\n return (\n <StyledBuilderContent>\n <BuilderContent>\n <BuilderActions>\n <BuilderDuration duration={practisSet.totalDuration} />\n <RepsRequired reps={totalRepsReqD} />\n <MinimumAccuracy\n\n />\n </BuilderActions>\n <BuilderBody>\n <StyledTableContainer>\n <Droppable\n droppableId={\n practisSetContent &&\n practisSetContent.length < 1\n ? 'empty-drop'\n : PRACTIS_SET_BUILDER_DROP_ID\n }\n >\n {(provided: any) => {\n if (\n practisSetContent &&\n practisSetContent.length < 1\n ) {\n return (\n <StyledBuilderBodyArea\n ref={provided.innerRef}\n {...provided.droppableProps}\n >\n <StyledEmptyDroppableArea>\n <NoResultContainer>\n <NoResultLogo data-test='practis-set-no-result-logo'>\n <Documents />\n </NoResultLogo>\n <NoResultHeader data-test='practis-set-no-result-text'>\n No Content\n </NoResultHeader>\n <NoResultText data-test='practis-set-no-result-description'>\n Add Scenarios &\n Challenges from the left\n in order to build this\n practis set.\n </NoResultText>\n </NoResultContainer>\n </StyledEmptyDroppableArea>\n {provided.placeholder}\n </StyledBuilderBodyArea>\n );\n }\n return (\n <StyledBuilderBodyArea\n {...provided.droppableProps}\n ref={provided.innerRef}\n >\n <GenerateTableCells\n content={practisSetContent}\n disabled={\n edit.mode ===\n EditModeValues.VIEW\n }\n handleRemoveContent={\n handleRemoveContent\n }\n />\n {provided.placeholder}\n </StyledBuilderBodyArea>\n );\n }}\n </Droppable>\n </StyledTableContainer>\n </BuilderBody>\n </BuilderContent>\n </StyledBuilderContent>\n );\n};\n\nexport const PractisSetBuilderContainer: FC<{\n practisSetContent: PractisSetContent[];\n handleRemoveContent: (\n index: number | string,\n type: PractisSetContentEntities\n ) => void;\n}> = ({ practisSetContent, handleRemoveContent }) => {\n const practisSet = useSelector(getPractisSetState).info;\n const modifyPractisSet = useModifyPractisSetService();\n return (\n <PractisSetBuilder\n handleRemoveContent={handleRemoveContent}\n practisSetContent={practisSetContent}\n practisSet={practisSet}\n modifyPractisSet={modifyPractisSet}\n />\n );\n};\n\nexport default PractisSetBuilderContainer;\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport ListContentContainer from './ListContent';\nimport PractisSetBuilder from './PractisSetBuilder';\nimport { DragDropContext, DropResult } from 'react-beautiful-dnd';\nimport { getPractisSetState } from '../../../store/reducers';\nimport { useSelector } from 'react-redux';\nimport {\n PractisSetContent,\n PractisSetContentEntities,\n} from '../../../../../../constants/interfaces/PractisSets';\nimport { Scenario } from '../../../../../../constants/interfaces/Scenario';\nimport { useUpdatePractisContentService } from '../../../store/services';\nimport { Challenge } from '../../../../../../constants/interfaces/Challenge';\nimport { PractisSetEntityTypes } from '../../../tools';\n\nexport const PRACTIS_SET_BUILDER_DROP_ID = 'PRACTIS_SET_BUILDER_DROP_ID';\nexport const PRACTIS_SET_SCENARIO_LIST_DROP_ID =\n 'PRACTIS_SET_SCENARIO_LIST_DROP_ID';\nexport const PRACTIS_SET_CHALLENGER_LIST_DROP_ID =\n 'PRACTIS_SET_CHALLENGER_LIST_DROP_ID';\nexport const PRACTIS_SET_DRAGGABLE_ID = 'PRACTIS_SET_DRAGGABLE_ID';\n\nconst Content: React.FC<{\n allScenarios: Scenario[];\n allChallenges: Challenge[];\n practisSetContent: PractisSetContent[];\n handleUpdatePractisContent: (data: PractisSetContent[]) => void;\n}> = ({\n allScenarios,\n allChallenges,\n practisSetContent,\n handleUpdatePractisContent,\n}) => {\n const [content, setContent] =\n useState<PractisSetContent[]>(practisSetContent);\n\n const positionRef = useRef(0); \n\n useEffect(() => {\n setContent(practisSetContent);\n }, [practisSetContent]);\n\n const reorderAndUpdate = useCallback((result: PractisSetContent[]) => {\n const reOrderedResult = result.map((item, index) => ({\n ...item,\n position: index,\n }));\n setContent(reOrderedResult);\n handleUpdatePractisContent(reOrderedResult);\n }, [handleUpdatePractisContent]);\n\n const changePosition = useCallback((startIndex: number, endIndex: number) => {\n const result = Array.from(content);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n reorderAndUpdate(result);\n }, [reorderAndUpdate, content]);\n\n const addScenarioToPractisSet = useCallback((startIndex: number, endIndex: number) => {\n const addedScenario = allScenarios[startIndex];\n \n if (positionRef.current === endIndex) {\n positionRef.current++;\n }\n\n const addedContent = {\n id: addedScenario?.id ?? 0,\n uniqueId: addedScenario?.uniqueId ?? '',\n type: PractisSetEntityTypes.SCENARIO,\n position: endIndex,\n minRepsCount: 1,\n scenario: addedScenario,\n } as PractisSetContent;\n\n const result = Array.from(content);\n\n result.splice(endIndex, 0, addedContent);\n reorderAndUpdate(result);\n }, [allScenarios, content, reorderAndUpdate]);\n\n const addScenarioAsLastToPractisSet = useCallback((\n scenarioId: number | string | undefined\n ) => {\n\n if (!scenarioId) return;\n const result = Array.from(content);\n\n const addedScenario = allScenarios.filter(\n item => item.id === scenarioId\n )[0];\n\n const addedContent = {\n id: addedScenario?.id ?? 0,\n uniqueId: addedScenario?.uniqueId ?? '',\n type: PractisSetEntityTypes.SCENARIO,\n minRepsCount: 1,\n scenario: addedScenario,\n position: positionRef.current,\n } as PractisSetContent;\n\n positionRef.current++;\n result.splice(content.length, 0, addedContent);\n reorderAndUpdate(result);\n }, [allScenarios, content, reorderAndUpdate]);\n\n const addChallengeAsLastToPractisSet = useCallback((\n challengeId: number | string | undefined\n ) => {\n if (!challengeId) return;\n\n const addedChallenge = allChallenges.filter(\n item => item.id === challengeId\n )[0];\n\n const addedContent = {\n id: addedChallenge?.id ?? 0,\n uniqueId: addedChallenge?.uniqueId ?? '',\n type: PractisSetEntityTypes.CHALLENGE,\n minRepsCount: 1,\n challenge: addedChallenge,\n position: positionRef.current,\n } as PractisSetContent;\n\n positionRef.current++;\n const result = Array.from(content);\n result.splice(content.length, 0, addedContent);\n reorderAndUpdate(result);\n }, [allChallenges, content, reorderAndUpdate]);\n\n const addChallengeToPractisSet = useCallback((startIndex: number, endIndex: number) => {\n if (positionRef.current === endIndex) {\n positionRef.current++;\n }\n\n const result = Array.from(content);\n const addedChallenge = allChallenges[startIndex];\n const addedContent = {\n id: addedChallenge?.id ?? 0,\n uniqueId: addedChallenge?.uniqueId ?? '',\n type: PractisSetEntityTypes.CHALLENGE,\n minRepsCount: 1,\n challenge: addedChallenge,\n position: endIndex,\n } as PractisSetContent;\n\n result.splice(endIndex, 0, addedContent);\n reorderAndUpdate(result);\n }, [allChallenges, content, reorderAndUpdate]);\n\n const removeFromPractisSet = useCallback((startIndex: number) => {\n const result = Array.from(content);\n result.splice(result.indexOf(result[startIndex]), 1);\n reorderAndUpdate(result);\n }, [content, reorderAndUpdate]);\n\n const removePractisSetWithId = useCallback((\n uniqueId: number | string,\n type: PractisSetContentEntities\n ) => {\n const result = Array.from(content).filter(content => {\n return !(content.uniqueId === uniqueId && content.type === type);\n });\n reorderAndUpdate(result);\n }, [content, reorderAndUpdate]);\n\n const onDragEnd = useCallback((result: DropResult) => {\n if (!result.destination) {\n return;\n }\n\n if (\n result.destination.droppableId === PRACTIS_SET_BUILDER_DROP_ID &&\n result.source.droppableId === result.destination.droppableId\n ) {\n changePosition(result.source.index, result.destination.index);\n }\n\n if (\n (result.destination.droppableId === PRACTIS_SET_BUILDER_DROP_ID ||\n result.destination.droppableId === 'empty-drop') &&\n result.source.droppableId === PRACTIS_SET_SCENARIO_LIST_DROP_ID\n ) {\n addScenarioToPractisSet(\n result.source.index,\n result.destination.index\n );\n }\n\n if (\n result.destination.droppableId ===\n PRACTIS_SET_SCENARIO_LIST_DROP_ID &&\n result.source.droppableId !== result.destination.droppableId\n ) {\n removeFromPractisSet(result.source.index);\n }\n\n if (\n (result.destination.droppableId === PRACTIS_SET_BUILDER_DROP_ID ||\n result.destination.droppableId === 'empty-drop') &&\n result.source.droppableId === PRACTIS_SET_CHALLENGER_LIST_DROP_ID\n ) {\n addChallengeToPractisSet(\n result.source.index,\n result.destination.index\n );\n }\n\n if (\n result.destination.droppableId ===\n PRACTIS_SET_CHALLENGER_LIST_DROP_ID &&\n result.source.droppableId !== result.destination.droppableId\n ) {\n removeFromPractisSet(result.source.index);\n }\n }, [addChallengeToPractisSet, addScenarioToPractisSet, changePosition, removeFromPractisSet]);\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <ListContentContainer\n practisSetContent={content}\n addScenarioToBuilder={addScenarioAsLastToPractisSet}\n addChallengeToBuilder={addChallengeAsLastToPractisSet}\n />\n <PractisSetBuilder\n practisSetContent={content}\n handleRemoveContent={removePractisSetWithId}\n />\n </DragDropContext>\n );\n};\n\nexport const ContentContainer: FC = () => {\n const practisSetContent = useSelector(getPractisSetState).info.content;\n const allScenarios = useSelector(getPractisSetState).scenarios;\n const allChallenges = useSelector(getPractisSetState).challenges;\n const updatePractisContent = useUpdatePractisContentService();\n const uuid = require('uuid/v1');\n\n return (\n <Content\n practisSetContent={practisSetContent.map(item => ({\n ...item,\n uniqueId: uuid(),\n }))}\n allScenarios={allScenarios}\n allChallenges={allChallenges}\n handleUpdatePractisContent={updatePractisContent}\n />\n );\n};\n\nexport default ContentContainer;\n","import { FC } from 'react';\nimport styled from 'styled-components';\nimport Content from './Content/Content';\n\nexport type MenuInterface = { key: string; title: string };\n\nconst CustomBodyContainerWrapper = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n padding-top: 24px;\n`;\n\nconst ContainerBody = styled.div`\n display: flex;\n overflow: hidden;\n flex: 1;\n`;\n\nconst CustomBodyContainer: FC = () => {\n return (\n <CustomBodyContainerWrapper>\n <ContainerBody>\n <Content />\n </ContainerBody>\n </CustomBodyContainerWrapper>\n );\n};\n\nexport default CustomBodyContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Label = styled.div<{ focused?: boolean; color?: string }>`\n position: absolute;\n top: ${props => (props.focused ? '-10px' : '0')};\n left: 24px;\n pointer-events: none;\n font-size: ${props => (props.focused ? '11px' : '12px')};\n -webkit-transition: all 0.18s ease;\n transition: all 0.18s ease;\n display: flex;\n align-items: center;\n height: 100%;\n color: ${props =>\n props.color ? props.color : props.theme.Colors.steelGrey};\n font-weight: 500;\n`;\n\nexport const SelectLabel: FC<{\n label: string;\n children?: string;\n focused?: boolean;\n color?: string;\n className?: string;\n dataTest?: string;\n}> = ({ children, label, focused, color, className, dataTest }) => {\n return (\n <Label focused={focused} color={color} className={className} data-test={dataTest}>\n {children || label}\n </Label>\n );\n};\n","import React, { FC, ReactNode } from 'react';\nimport styled from 'styled-components';\nimport { motion } from 'framer-motion';\n\nconst MenuItem = styled(motion.div)<{\n displayOver?: 'bottom' | 'over' | 'top';\n}>`\n min-width: 150px;\n position: absolute;\n background: ${props => props.theme.Colors.white};\n z-index: 1100;\n left: ${props => (props.displayOver === 'over' ? '16px' : '0')};\n right: ${props => (props.displayOver === 'over' ? '16px' : '0')};\n top: ${props => (props.displayOver === 'top' ? 'unset' : '8px')};\n bottom: ${props => (props.displayOver === 'top' ? '44px' : 'unset')};\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n transition: max-height 1s;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n max-height: 300px;\n overflow-y: auto;\n padding: 16px;\n`;\n\nconst ANIMATION_SCALE = 5;\n\nexport const SelectMenu: FC<{\n children?: ReactNode;\n displayOver?: 'bottom' | 'over' | 'top';\n}> = ({ children, displayOver }) => {\n return (\n <MenuItem\n initial={{ scale: 1 / ANIMATION_SCALE }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n displayOver={displayOver}\n >\n <ContentArea className='content-area'>{children}</ContentArea>\n </MenuItem>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst MenuItem = styled.div<{ selected?: boolean }>`\n min-height: 40px;\n color: ${props => props.theme.Colors.black};\n border-radius: 4px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 8px;\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n word-break: break-word;\n background: ${props =>\n props.selected\n ? props.theme.Colors.whiteTwo\n : props.theme.Colors.white};\n &:hover {\n background: ${props => props.theme.Colors.whiteTwo};\n }\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const SelectMenuItem: FC<{\n forwardedRef?: any;\n name?: string;\n value: string | number;\n children: string | JSX.Element;\n onClick: any;\n hideAction: () => void;\n selected?: boolean;\n multiSelect?: boolean;\n dataTest?: string;\n}> = ({\n children,\n onClick,\n value,\n name,\n hideAction,\n selected,\n forwardedRef,\n multiSelect,\n dataTest\n}) => {\n const handleSelectItem = () => {\n onClick({ target: { value: value, name: name } });\n if (!multiSelect) hideAction();\n };\n\n return (\n <MenuItem\n onClick={handleSelectItem}\n selected={selected}\n ref={forwardedRef}\n className={selected ? 'selected-item' : undefined}\n data-test={dataTest}\n >\n {children}\n </MenuItem>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst StyledSelect = styled.div<{\n height?: number;\n padding?: string;\n fontSize?: string;\n}>`\n width: 100%;\n height: 100%;\n padding: ${props =>\n !!props.padding\n ? props.padding\n : `${props.height ? props.height / 2 - 4 : 29}px 24px\n 15px 24px;`};\n box-sizing: border-box;\n font-size: ${props => (!!props.fontSize ? props.fontSize : '13px')};\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n`;\n\nconst StyledSelectValue = styled.div<{\n color?: string;\n disabled?: boolean;\n}>`\n overflow: hidden;\n color: ${props => props.disabled ? props.theme.Colors.cloudyBlue : (props.color ?? props.theme.Colors.steelGrey)};\n text-overflow: ellipsis;\n padding-right: 4px;\n`;\n\nexport const SelectInput: FC<{\n children?: any;\n items?: any;\n value?: string | number;\n height?: number;\n padding?: string;\n toggleSelect?: (e?: any) => void;\n fontSize?: string;\n disabled?: boolean;\n color?: string;\n className?: string;\n dataTest?: string;\n}> = ({ value, toggleSelect, height, padding, fontSize, disabled, color, className, dataTest }) => {\n return (\n <StyledSelect\n height={height}\n onClick={toggleSelect}\n padding={padding}\n fontSize={fontSize}\n className={className}\n data-test={dataTest}\n >\n <StyledSelectValue color={color} disabled={disabled}>{value}</StyledSelectValue>\n </StyledSelect>\n );\n};\n","import React, { FC, useRef, useState } from 'react';\nimport styled, { css} from 'styled-components';\nimport OutsideActionBox from '../OutsideActionBox/OutsideActionBox';\nimport { Variables } from '../../../theme/variables';\nimport UpArrow from '../../icons/UpArrow';\nimport DownArrow from '../../icons/DownArrow';\nimport { SelectLabel } from './SelectLabel';\nimport { SelectMenu } from './SelectMenu';\nimport { SelectMenuItem } from './SelectMenuItem';\nimport { SelectInput } from './SelectInput';\n\nconst COLORS: any = {\n light: {\n background: Variables.Colors.whiteFive,\n color: Variables.Colors.black,\n },\n dark: {\n background: Variables.Colors.darkTwo,\n color: Variables.Colors.whiteTwo,\n },\n gray: {\n background: Variables.Colors.whiteTwo,\n color: Variables.Colors.black,\n },\n transparent: {\n background: Variables.Colors.transparent,\n color: Variables.Colors.black,\n },\n};\n\nconst StyledSelectForm = styled.div<{\n height?: number;\n error?: boolean;\n borderRadius?: number;\n variant: string;\n border?: boolean;\n disabled?: boolean;\n}>`\n box-sizing: border-box;\n position: relative;\n border-radius: ${props => (props.borderRadius ? props.borderRadius : 4)}px;\n border: ${props => (props.border ? 1 : 0)}px solid\n ${props => props.theme.Colors.cloudyBlue};\n min-width: 128px;\n cursor: pointer;\n height: ${props => (props.height ? `${props.height}px` : '56px')};\n width: 100%;\n background: ${props => COLORS[props.variant].background};\n color: ${props => COLORS[props.variant].color};\n box-shadow: inset 0 0 0 ${props => (props.error ? '2px' : '-1px')};\n ${props => props.theme.Colors.coral};\n -webkit-appearance: none;\n \n ${({ disabled, theme }) => disabled && css`\n color: ${theme.Colors.cloudyBlue};\n cursor: default;\n `}\n`;\n\nconst Container = styled(OutsideActionBox)`\n position: relative;\n`;\n\nconst IconHolder = styled.div<{\n disabled?: boolean;\n}>`\n position: absolute;\n right: 24px;\n width: 8px;\n height: 100%;\n display: flex;\n align-items: center;\n color: ${props => props.disabled ? props.theme.Colors.cloudyBlue : props.theme.Colors.steelGrey};\n`;\n\nexport const Select: FC<{\n label?: string;\n placeholder?: string;\n labelColor?: string;\n id?: string;\n items?: Array<any>;\n children?: Array<any>;\n value?: string | number | string[] | number[] | null;\n name?: string;\n defaultValue?: string | number;\n colorTheme?: 'light' | 'dark' | 'gray' | 'transparent';\n valueColor?: string;\n onChange?: any;\n disabled?: boolean;\n error?: boolean;\n menuPosition?: 'bottom' | 'over' | 'top';\n height?: number;\n fontSize?: string;\n className?: string;\n borderRadius?: number;\n dataTest?: string;\n customMenuItem?: (item: {name: string, value: string}) => JSX.Element\n}> = ({\n label,\n placeholder,\n labelColor,\n items,\n value,\n onChange,\n name,\n colorTheme,\n valueColor,\n menuPosition,\n height,\n fontSize,\n disabled,\n className,\n error,\n borderRadius,\n customMenuItem,\n dataTest\n}) => {\n const [show, setShow] = useState(false);\n const selectedRef = useRef(null);\n const multiSelect = Array.isArray(value);\n\n const findNameByValue = () => {\n if (items) {\n let selectedItems = items.filter(item =>\n Array.isArray(value)\n ? value.includes(item.value as never)\n : item.value === value\n );\n\n if (selectedItems.length < 2) {\n return selectedItems[0] && selectedItems[0].name;\n } else {\n return (\n selectedItems &&\n selectedItems\n .map(item => {\n return item.name;\n })\n .join(', ')\n );\n }\n }\n };\n\n const selectedName = findNameByValue();\n\n return (\n <StyledSelectForm\n variant={colorTheme ? colorTheme : 'light'}\n error={error}\n height={height}\n className={className && `${className} ${show ? `${className}-open` : ''}`}\n borderRadius={borderRadius}\n border={(show || !!value) && !disabled}\n disabled={disabled}\n >\n {label && (\n <SelectLabel\n focused={Array.isArray(value) ? value.length > 0 : !!value}\n label={label}\n color={labelColor}\n className={className && `${className}-label`}\n dataTest={dataTest && `${dataTest}-label`}\n />\n )}\n {placeholder && !value && (\n <SelectLabel\n label={placeholder}\n color={labelColor}\n className={className && `${className}-label`}\n dataTest={dataTest && `${dataTest}-label`}\n />\n )}\n <IconHolder\n disabled={disabled}\n className={className && `${className}-arrow`}\n onClick={() => !disabled && setShow(!show)}\n >\n {show ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n <SelectInput\n value={customMenuItem?.({name: selectedName, value: value as string}) || selectedName}\n toggleSelect={() => !disabled && setShow(!show)}\n height={height}\n fontSize={fontSize}\n padding={!label ? '0px 16px' : undefined}\n disabled={disabled}\n color={valueColor}\n className={className && `${className}-input`}\n dataTest={dataTest && `${dataTest}-selected-value`}\n />\n <Container open={show} toggleOpen={setShow}>\n <SelectMenu\n displayOver={menuPosition}\n >\n {items &&\n items.map((item: { value: string; name: string }) => (\n <SelectMenuItem\n forwardedRef={\n (\n Array.isArray(value)\n ? value.includes(\n item.value as never\n )\n : item.value === value\n )\n ? selectedRef\n : null\n }\n key={item.value}\n value={item.value}\n name={name}\n hideAction={() => setShow(false)}\n onClick={onChange}\n selected={\n Array.isArray(value)\n ? value.includes(item.value as never)\n : item.value === value\n }\n multiSelect={multiSelect}\n dataTest={dataTest && `${dataTest}-select-item`}\n > \n {customMenuItem?.(item) || item.name}\n </SelectMenuItem>\n ))}\n </SelectMenu>\n </Container>\n </StyledSelectForm>\n );\n};\n\nexport default Select;\n","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { Pacings } from '../../../constants/interfaces/Pacings';\n\nexport enum ACTIONS {\n SEARCH_PACINGS_START = 'SEARCH_PACINGS_START',\n SEARCH_PACINGS_SUCCESS = 'SEARCH_PACINGS_SUCCESS',\n SEARCH_PACINGS_FAILURE = 'SEARCH_PACINGS_FAILURE',\n}\n\nexport function searchPacingsStart() {\n return {\n type: ACTIONS.SEARCH_PACINGS_START as ACTIONS.SEARCH_PACINGS_START,\n };\n}\n\nexport function searchPacingsSuccess(pacings: PaginationResult<Pacings>) {\n return {\n type: ACTIONS.SEARCH_PACINGS_SUCCESS as ACTIONS.SEARCH_PACINGS_SUCCESS,\n pacings,\n };\n}\n\nexport function searchPacingsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_PACINGS_FAILURE as ACTIONS.SEARCH_PACINGS_FAILURE,\n error,\n };\n}\n","import { Reducer } from 'redux';\nimport {\n ACTIONS,\n searchPacingsFailure,\n searchPacingsStart,\n searchPacingsSuccess,\n} from './actions';\nimport { PacingsState } from './states';\nimport { AppState } from '../../../store/reducers';\n\nconst initialPacingsState: PacingsState = {};\n\nexport type PacingsAction =\n | ReturnType<typeof searchPacingsStart>\n | ReturnType<typeof searchPacingsSuccess>\n | ReturnType<typeof searchPacingsFailure>;\n\nexport const pacingsReducer: Reducer<PacingsState, PacingsAction> = (\n state = initialPacingsState,\n action: PacingsAction\n): PacingsState => {\n switch (action.type) {\n case ACTIONS.SEARCH_PACINGS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_PACINGS_SUCCESS:\n return {\n ...state,\n data: action.pacings,\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_PACINGS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n default:\n return state;\n }\n};\nexport const getPacingsState = (state: AppState) => state.pacings;\n","import { SearchParams } from '../../../constants/interfaces/filters';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n searchPacingsFailure,\n searchPacingsStart,\n searchPacingsSuccess,\n} from './actions';\nimport { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { useSearchPacingsApi } from '../../../api';\n\nexport const useSearchPacingsService = () => {\n const dispatch = useDispatch();\n const searchPacingsApi = useSearchPacingsApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p?: SearchParams) => {\n dispatch(searchPacingsStart());\n searchPacingsApi(p)\n .then(data => {\n dispatch(searchPacingsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchPacingsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchPacingsApi, showMessage]\n );\n};\n","import { FC, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\nimport { useLabelsState } from '../../../../../features/labels/store/states';\nimport { useModifyPractisSetService } from '../../store/services';\nimport { EditModeContext } from '../../PractisSets';\nimport { PractisSets } from '../../../../../constants/interfaces/PractisSets';\nimport PractisSelect from '../../../../../ui/components/Select/Select';\nimport { PacingType, pacingTypeName } from '../../../../../features/pacings/tools';\nimport { useSelector } from 'react-redux';\nimport { getPacingsState } from '../../../../../features/pacings/store/reducers';\nimport { useSearchPacingsService } from '../../../../../features/pacings/store/services';\nimport { useSearchDebounced } from '../../../../../helpers/hooks/useSearch';\nimport { usePortableLabelsState } from '../../../../../features/portableLabels/store/states';\nimport { LabelsAction } from '../../../../../ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction';\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { Input } from '../../../../../ui/components/input';\n\nconst Container = styled.div`\n padding: 15px 0;\n display: flex;\n`;\n\nconst TextInputContainer = styled.div`\n flex: 1;\n`;\n\nconst LabelsContainer = styled.div`\n width: 128px;\n margin-left: 16px;\n`;\n\nconst TitleTextInput = styled(Input)`\n padding: 12px 16px;\n font-size: 13px;\n font-weight: normal;\n`;\n\nconst ActionPanel: FC<{\n practisSet: PractisSets;\n titleError: boolean;\n isTeamLeader?: boolean;\n}> = ({ practisSet, titleError, isTeamLeader }) => {\n const modifyPractisSet = useModifyPractisSetService();\n const edit = useContext(EditModeContext);\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState().data;\n const showMessage = useShowMessage();\n const pacings = useSelector(getPacingsState).data;\n const searchPacings = useSearchPacingsService();\n const handleSearchPacings = useSearchDebounced(searchPacings);\n\n useEffect(() => {}, []);\n\n const handleSavePractisSetLabels = () => {\n modifyPractisSet(labels.assignedLabels, 'updatedLabels');\n showMessage(`labels have been assigned to Practis Set`, 'success');\n };\n\n useEffect(() => {\n handleSearchPacings();\n }, [handleSearchPacings]);\n\n useEffect(() => {\n if (!practisSet.pacing?.id && pacings) {\n const pacingId =\n pacings.items && pacings.items[1] && pacings.items[1].id;\n \n modifyPractisSet({ id: pacingId }, 'pacing', true);\n }\n }, [practisSet, pacings, modifyPractisSet]);\n\n const pacingItems =\n pacings &&\n pacings.items.map(pacing => {\n return { value: pacing.id, name: pacingTypeName(pacing.type) };\n });\n\n const handlePacingChange = (e: any) => {\n const newPacing = { id: e.target.value, type: e.target.name };\n modifyPractisSet(newPacing, 'pacing');\n };\n\n return (\n <Container>\n <TextInputContainer>\n <TitleTextInput\n placeholder=\"Practis Set Title\"\n height={'40px'}\n maxLength={90}\n handleChange={(event: any) =>\n modifyPractisSet(event.target.value, 'name')\n }\n value={practisSet.name}\n readOnly={edit.mode === EditModeValues.VIEW || isTeamLeader}\n error={titleError}\n dataTest=\"practis-set-title\"\n />\n </TextInputContainer>\n <LabelsContainer>\n <LabelsAction\n title={'Labels'}\n labels={labelsList}\n disabled={edit.mode === EditModeValues.VIEW || isTeamLeader}\n onAssignLabelsSubmit={handleSavePractisSetLabels}\n containerLeftPosition={'unset'}\n dataTest=\"practis-set-labels\"\n />\n </LabelsContainer>\n <LabelsContainer>\n <PractisSelect\n items={pacingItems}\n value={practisSet.pacing?.id ?? ''}\n name={\n practisSet.pacing?.id === 1\n ? pacingTypeName(PacingType.FREE)\n : pacingTypeName(PacingType.SEQUENTIAL)\n }\n placeholder={'Pacings'}\n height={40}\n onChange={handlePacingChange}\n disabled={edit.mode === EditModeValues.VIEW || isTeamLeader}\n dataTest=\"practis-set-pacing\"\n />\n </LabelsContainer>\n </Container>\n );\n};\n\nexport default ActionPanel;","import styled from 'styled-components';\n\nexport const StyledContainer = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n padding: 0 32px;\n background: ${props => props.theme.Colors.white};\n border-top-left-radius: 8px;\n border-bottom-left-radius: 8px;\n`;\n\nexport const StyledLoadingContainer = styled.div`\n height: 100%;\n display: flex;\n align-items: center;\n`;\n\nexport const CreatedByWrapper = styled.div`\n padding: 0 16px 10px;\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 13px;\n`;","import { createContext, FC, useCallback, useEffect, useState } from 'react';\r\nimport { Dispatch } from 'redux';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport CustomHeader from './components/CustomHeader/CustomHeader';\r\nimport {\r\n useGetSinglePractisSetService,\r\n useResetPractisSetService,\r\n} from './store/services';\r\nimport { getPractisSetState } from './store/reducers';\r\nimport {\r\n PractisSets,\r\n PractisSetStatuses,\r\n PractisSetStatusType,\r\n} from '../../../constants/interfaces/PractisSets';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport NavigationPrompt from 'react-router-navigation-prompt';\r\nimport ROUTES from '../../../routes/routes';\r\nimport CustomBodyContainer from './components/CustomBody';\r\nimport { PractisSetStatusName } from './tools';\r\nimport { buildPageTitle } from '../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../constants/enums/EditModeValues';\r\nimport { usePermissionsState } from '../../../features/permissions/store/state';\r\nimport { CheckPermission } from '../../../features/permissions';\r\nimport { pushModal } from '../../../tools/router';\r\nimport { useLabelsState } from '../../../features/labels/store/states';\r\nimport {\r\n calculateAssignedLabels,\r\n calculateRemovedLabels,\r\n useCalculatePreSelectedLabelsForSingleItem,\r\n} from '../../../features/labels/tools';\r\nimport { isTeamLeader } from '../../../constants/enums';\r\nimport {\r\n useSetAssignLabelsActionService,\r\n useSetPreviouslyAssignedLabelsAction,\r\n} from '../../../features/labels/store/services';\r\nimport { usePortableLabelsState } from '../../../features/portableLabels/store/states';\r\nimport { UserProfile } from '../../../constants/interfaces/User';\r\nimport { getProfileState } from '../../UserProfile/store/reducers';\r\nimport { handleMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { ModalPageContainer } from '../../../ui/components/ModalPage';\r\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\r\nimport ActionPanel from './components/ActionPanel/ActionPanel';\r\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\r\nimport { useCreateEditDuplicateLibraryBulActionService } from '../../../features/library/services/LibraryBulkActionsService';\r\nimport {\r\n useGenerateCreatePractisSetActionList,\r\n useGenerateEditPractisSetActionList,\r\n} from '../../../features/library/services/LibraryBulkActionsService/helpers';\r\nimport {\r\n CreatePractisSetInfo,\r\n EditPractisSetInfo,\r\n} from '../../../features/library/services/LibraryBulkActionsService/types';\r\nimport {\r\n CreatedByWrapper,\r\n StyledContainer,\r\n StyledLoadingContainer,\r\n} from './styles';\r\nimport {\r\n useCreateEditPractisSetFailedCallback,\r\n useCreateEditPractisSetSuccessCallback,\r\n useHandleArchivePractisSet,\r\n} from './services';\r\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\r\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\r\n\r\ninterface PractisSetsInterface {\r\n profile?: UserProfile;\r\n history: any;\r\n handleFetchPractisSet: (practisSetId: number) => void;\r\n practisSet: PractisSets;\r\n practisSetId: string;\r\n dispatch: Dispatch<any>;\r\n loading: boolean;\r\n handleResetPractisSet: () => void;\r\n isNew: boolean;\r\n modified: 'init' | 'created' | 'modified' | 'loaded' | 'updated' | 'error';\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n}\r\n\r\nexport const StatusItems: Array<{\r\n value: string;\r\n name: string;\r\n confirm: boolean;\r\n message: string;\r\n}> = [\r\n {\r\n value: PractisSetStatuses.DRAFT,\r\n name: PractisSetStatusName(PractisSetStatuses.DRAFT),\r\n message: 'Practis Set saved as Draft',\r\n confirm: true,\r\n },\r\n {\r\n value: PractisSetStatuses.ACTIVE,\r\n name: PractisSetStatusName(PractisSetStatuses.ACTIVE),\r\n message: 'Practis Set published',\r\n confirm: true,\r\n },\r\n {\r\n value: PractisSetStatuses.ARCHIVED,\r\n name: PractisSetStatusName(PractisSetStatuses.ARCHIVED),\r\n message: 'Practis Set archived',\r\n confirm: true,\r\n },\r\n {\r\n value: PractisSetStatuses.DELETED,\r\n name: PractisSetStatusName(PractisSetStatuses.DELETED),\r\n message: 'Practis Set deleted',\r\n confirm: true,\r\n },\r\n];\r\n\r\nexport const LoadingSaveContext = createContext(false);\r\nexport const EditModeContext = createContext<{\r\n mode: string;\r\n action: (mode: EditModeValues) => void;\r\n}>({\r\n mode: 'view',\r\n action: () => {},\r\n});\r\n\r\nconst PractisSetsComponent: FC<PractisSetsInterface> = ({\r\n history,\r\n profile,\r\n practisSet,\r\n loading,\r\n isNew,\r\n modified,\r\n closeGoingBack,\r\n practisSetId,\r\n closePath,\r\n dispatch,\r\n handleFetchPractisSet,\r\n handleResetPractisSet,\r\n}) => {\r\n const [editMode, setEditMode] = useState<EditModeValues>(\r\n EditModeValues.VIEW\r\n );\r\n const createEditPractisSetSuccessCallback =\r\n useCreateEditPractisSetSuccessCallback();\r\n const createEditPractisSetFailedCallback =\r\n useCreateEditPractisSetFailedCallback();\r\n\r\n useHtmlPageTitle(\r\n buildPageTitle('Practis Set', editMode, isNew),\r\n [practisSet.name]\r\n );\r\n\r\n const handleArchivePractisSet = useHandleArchivePractisSet();\r\n const [loadingSave, setLoadingSave] = useState(false);\r\n const [titleError, setTitleError] = useState(false);\r\n const isTeamLead = isTeamLeader(profile?.role?.name);\r\n const isLoaded = !!practisSet.id;\r\n const permissions = usePermissionsState();\r\n const onUnload = useCallback(\r\n (e: any) => {\r\n e.preventDefault();\r\n if (\r\n modified === 'modified' &&\r\n permissions.includes(NEW_PERMISSIONS.UPDATE_PRACTIS_SET)\r\n ) {\r\n e.returnValue = true;\r\n }\r\n },\r\n [modified, permissions]\r\n );\r\n\r\n useEffect(() => {\r\n window.addEventListener('beforeunload', onUnload);\r\n return () => {\r\n window.removeEventListener('beforeunload', onUnload);\r\n };\r\n }, [onUnload]);\r\n\r\n useEffect(() => {\r\n setEditMode(\r\n (isLoaded || isNew) && practisSet.status === PractisSetStatuses.DRAFT && !isTeamLead\r\n ? EditModeValues.EDIT\r\n : EditModeValues.VIEW\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isLoaded, isNew, practisSet.status, setEditMode]);\r\n\r\n useEffect(() => {\r\n if (practisSetId !== 'new') {\r\n handleFetchPractisSet(+practisSetId);\r\n } else {\r\n handleResetPractisSet();\r\n }\r\n return () => {\r\n handleResetPractisSet();\r\n };\r\n }, [handleResetPractisSet, handleFetchPractisSet, practisSetId]);\r\n\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState().data;\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const setPreviousAssignedLabelsAction =\r\n useSetPreviouslyAssignedLabelsAction();\r\n const calculatePreSelectedLabels =\r\n useCalculatePreSelectedLabelsForSingleItem();\r\n\r\n useEffect(() => {\r\n if (!isEmpty(practisSet.labels)) {\r\n const practisSetLabelIds = practisSet.labels ?? [];\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n practisSetLabelIds,\r\n labelsList\r\n );\r\n setAssignLabelsAction(preAssignedLabels);\r\n } else {\r\n setAssignLabelsAction([]);\r\n }\r\n return () => {\r\n setAssignLabelsAction([]);\r\n };\r\n }, [\r\n practisSet.labels,\r\n labelsList,\r\n calculatePreSelectedLabels,\r\n setAssignLabelsAction,\r\n ]);\r\n\r\n //initially set previousAssignedLabels\r\n useEffect(() => {\r\n if (!isEmpty(practisSet.labels)) {\r\n const practisSetLabelIds = practisSet.labels;\r\n\r\n if (practisSetLabelIds) {\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n practisSetLabelIds,\r\n labelsList\r\n );\r\n setPreviousAssignedLabelsAction(preAssignedLabels);\r\n }\r\n } else {\r\n setPreviousAssignedLabelsAction([]);\r\n }\r\n\r\n return () => {\r\n setPreviousAssignedLabelsAction([]);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [practisSet.labels]);\r\n\r\n /**\r\n * @function handleViewAssignUsers\r\n * @param { number } practisSetId\r\n * @returns { void }\r\n */\r\n const handleViewAssignUsers = useCallback(\r\n (practisSetId?: number): void => {\r\n if (!practisSetId) return;\r\n\r\n pushModal(\r\n history,\r\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ASSIGN_USERS.replace(\r\n ':practisSetId',\r\n practisSetId.toString()\r\n )\r\n );\r\n },\r\n [history]\r\n );\r\n\r\n const generateCreatePractisSetActionList =\r\n useGenerateCreatePractisSetActionList();\r\n const generateEditPractisSetActionList =\r\n useGenerateEditPractisSetActionList();\r\n\r\n const createEditPractisSetService =\r\n useCreateEditDuplicateLibraryBulActionService(\r\n isNew ? 'create' : 'update',\r\n 'Practis Set',\r\n responses =>\r\n createEditPractisSetSuccessCallback(\r\n setLoadingSave,\r\n practisSet.id,\r\n responses\r\n ),\r\n (error, completedResponses) =>\r\n createEditPractisSetFailedCallback(\r\n setLoadingSave,\r\n setTitleError,\r\n error,\r\n completedResponses\r\n )\r\n );\r\n\r\n const handleUpdatePractisSet = (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: string\r\n ) => {\r\n setLoadingSave(true);\r\n\r\n if (!validateUpdate(status ? status : practisSet.status)) {\r\n setLoadingSave(false);\r\n callbacks?.onCancel();\r\n return;\r\n }\r\n\r\n const newPractisSetInfo: CreatePractisSetInfo = {\r\n name: practisSet.name,\r\n description: practisSet.description,\r\n pacingId: practisSet.pacing?.id ?? 0,\r\n labelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n practisSetContents: practisSet.content ?? [],\r\n status: status as PractisSetStatusType,\r\n };\r\n\r\n const editedPractisSetInfo: EditPractisSetInfo = {\r\n practisSetId: practisSet.id ?? 0,\r\n name: practisSet.name,\r\n description: practisSet.description,\r\n pacingId: practisSet.pacing?.id ?? 0,\r\n addedLabelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n deletedLabelIds: calculateRemovedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n practisSetContents: practisSet.content ?? [],\r\n status: status as PractisSetStatusType,\r\n };\r\n\r\n const createPractisSetListAction =\r\n generateCreatePractisSetActionList(newPractisSetInfo);\r\n\r\n const editPractisSetListAction =\r\n generateEditPractisSetActionList(editedPractisSetInfo);\r\n\r\n if (status !== PractisSetStatuses.ARCHIVED) {\r\n if (!practisSet.id) {\r\n createEditPractisSetService([createPractisSetListAction]);\r\n } else {\r\n createEditPractisSetService(editPractisSetListAction);\r\n }\r\n } else {\r\n practisSet?.id && handleArchivePractisSet(practisSet.id);\r\n }\r\n };\r\n\r\n const validateUpdate = useCallback(\r\n (status: string): boolean => {\r\n if (\r\n practisSet &&\r\n practisSet.content &&\r\n practisSet.content.length > 99\r\n ) {\r\n handleMessage(\r\n dispatch,\r\n 'You’ve reached the limit of adding scenarios and challenges',\r\n 'error'\r\n );\r\n return false;\r\n }\r\n\r\n let output = true;\r\n switch (status) {\r\n case PractisSetStatuses.DELETED:\r\n output = true;\r\n break;\r\n case PractisSetStatuses.ACTIVE:\r\n if (!practisSet.name?.trim()) {\r\n handleMessage(dispatch, 'Title required', 'error');\r\n setTitleError(true);\r\n output = false;\r\n } else if (practisSet.content.length < 1) {\r\n handleMessage(\r\n dispatch,\r\n 'Active practis set should have at least one scenario',\r\n 'error'\r\n );\r\n output = false;\r\n setTitleError(false);\r\n } else {\r\n setTitleError(false);\r\n }\r\n break;\r\n case PractisSetStatuses.DRAFT:\r\n case PractisSetStatuses.ARCHIVED:\r\n default:\r\n if (practisSet.name.length < 1) {\r\n handleMessage(dispatch, 'Title required', 'error');\r\n output = false;\r\n setTitleError(true);\r\n } else {\r\n setTitleError(false);\r\n }\r\n }\r\n return output;\r\n },\r\n [dispatch, practisSet]\r\n );\r\n\r\n if (\r\n !isNew &&\r\n (loading || (!practisSet?.id && modified !== 'error'))\r\n ) {\r\n return (\r\n <ModalPageContainer\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n >\r\n <StyledLoadingContainer>\r\n <Loading />\r\n </StyledLoadingContainer>\r\n </ModalPageContainer>\r\n );\r\n }\r\n\r\n return (\r\n <ModalPageContainer closePath={closePath} closeGoingBack={true}>\r\n <StyledContainer>\r\n <EditModeContext.Provider\r\n value={{ mode: editMode, action: setEditMode }}\r\n >\r\n <LoadingSaveContext.Provider value={loadingSave}>\r\n <CustomHeader\r\n handleUpdatePractisSet={handleUpdatePractisSet}\r\n handleViewAssignUsers={handleViewAssignUsers}\r\n isViewMode={isTeamLead}\r\n />\r\n </LoadingSaveContext.Provider>\r\n <ActionPanel\r\n practisSet={practisSet}\r\n titleError={titleError}\r\n isTeamLeader={isTeamLead}\r\n />\r\n {practisSet.creator && (\r\n <CreatedByWrapper data-test=\"practis-set-created-by\">\r\n Created by {practisSet.creator?.firstName}{' '}\r\n {practisSet.creator?.lastName}\r\n </CreatedByWrapper>\r\n )}\r\n <TableDivider />\r\n <CustomBodyContainer />\r\n </EditModeContext.Provider>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.UPDATE_PRACTIS_SET]}\r\n >\r\n <NavigationPrompt when={modified === 'modified'}>\r\n {({ onConfirm, onCancel }) => (\r\n <DialogWrapper\r\n modalTitle=\"Discard changes?\"\r\n description={\r\n 'Do you want to save or discard changes?'\r\n }\r\n cancelButtonText={'Discard'}\r\n confirmButtonText={'Save'}\r\n onCancel={onConfirm}\r\n onConfirm={() => {\r\n handleUpdatePractisSet({\r\n onConfirm: onConfirm,\r\n onCancel: onCancel,\r\n });\r\n }}\r\n dataTest=\"confirmation-modal\"\r\n />\r\n )}\r\n </NavigationPrompt>\r\n </CheckPermission>\r\n </StyledContainer>\r\n </ModalPageContainer>\r\n );\r\n};\r\n\r\nexport interface PractisSetsComponentContainerProps\r\n extends RouteComponentProps<{ practisSetId: string }> {\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n}\r\n\r\nexport const PractisSetsComponentContainer: FC<\r\n PractisSetsComponentContainerProps\r\n> = ({ history, match, closePath, closeGoingBack }) => {\r\n const dispatch = useDispatch();\r\n const profile = useSelector(getProfileState);\r\n const isNew = match.params.practisSetId === 'new';\r\n const {\r\n info: practisSet,\r\n case: modified,\r\n isLoading: loading,\r\n } = useSelector(getPractisSetState);\r\n const getPractisSet = useGetSinglePractisSetService();\r\n const resetPractisSet = useResetPractisSetService();\r\n\r\n return (\r\n <PractisSetsComponent\r\n history={history}\r\n profile={profile}\r\n practisSet={practisSet}\r\n practisSetId={match.params.practisSetId}\r\n isNew={isNew}\r\n modified={modified}\r\n loading={loading}\r\n handleFetchPractisSet={getPractisSet}\r\n handleResetPractisSet={resetPractisSet}\r\n dispatch={dispatch}\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n />\r\n );\r\n};\r\n\r\nexport default withRouter(PractisSetsComponentContainer);\r\n","import React from 'react';\nimport ROUTES from '../../../routes/routes';\nimport Navigation from '../../../ui/components/Navigation/Navigation';\nimport styled from 'styled-components';\n\nconst StyledLibraryNavigationContainer = styled.div``;\n\nconst LibraryNavigation = () => {\n return (\n <StyledLibraryNavigationContainer>\n <Navigation\n menu={[\n {\n key: 'practisSets',\n title: `Practis Sets`,\n url: ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL,\n },\n {\n key: 'scenarios',\n title: `Scenarios`,\n url: ROUTES.LIBRARY_SETTINGS.SCENARIOS.ALL,\n },\n {\n key: 'challenges',\n title: `Challenges`,\n url: ROUTES.LIBRARY_SETTINGS.CHALLENGES.ALL,\n },\n ]}\n dataTest='library-nav'\n />\n </StyledLibraryNavigationContainer>\n );\n};\n\nexport const LibraryNavigationContainer = () => {\n return <LibraryNavigation />;\n};\n\nexport default LibraryNavigationContainer;\n","import React, { FC, useCallback, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport { Fieldset } from '../../../../ui/components/Fieldset';\r\nimport { PortableLabelsWithStore } from '../../../portableLabels';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport { LIBRARY_STATUS_ITEMS } from '../../tools';\r\nimport Checkbox from '../../../../ui/components/Checkbox';\r\nimport { Variables } from '../../../../theme/variables';\r\nimport { toggleItemInArray } from '../../../../helpers/functions/array-helpers';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n gap: 16px;\r\n max-height: 416px;\r\n flex-grow: 1;\r\n background-color: inherit;\r\n`;\r\n\r\nconst LabelsContainer = styled.div`\r\n width: 208px;\r\n min-height: 244px;\r\n height: 100%;\r\n overflow: auto;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Actions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n\r\n flex-shrink: 0;\r\n margin-top: 16px;\r\n`;\r\n\r\nconst SummaryCaption = styled.span`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n margin-right: 24px;\r\n\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst StatusContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 158px;\r\n background-color: inherit;\r\n`;\r\n\r\nconst CheckBoxWrapper = styled.div`\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst ButtonWrapper = styled.div`\r\n margin-right: 12px;\r\n`;\r\n\r\nexport const LibraryFilters: FC<{\r\n selectedStatuses: string[];\r\n savedStatuses: string[];\r\n handleSelectStatus: (ids: string[]) => void;\r\n handleSaveStatus: (ids: string[]) => void;\r\n preSelectedLabels: number[];\r\n onLabelsChange: (ids: number[]) => void;\r\n onSuccessApply: () => void;\r\n}> = ({\r\n selectedStatuses,\r\n savedStatuses,\r\n handleSelectStatus,\r\n handleSaveStatus,\r\n preSelectedLabels,\r\n onLabelsChange,\r\n onSuccessApply,\r\n}) => {\r\n \r\n useEffect(() => {\r\n handleSelectStatus(savedStatuses);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [savedStatuses]);\r\n\r\n const labels = useLabelsState();\r\n const selectLabels = useSelectLabels();\r\n const saveLabels = useSaveLabels();\r\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\r\n\r\n useEffect(() => {\r\n if (ifPreselectedLabelsChanged) {\r\n selectLabels(preSelectedLabels);\r\n saveLabels();\r\n }\r\n }, [\r\n ifPreselectedLabelsChanged,\r\n preSelectedLabels,\r\n saveLabels,\r\n selectLabels,\r\n ]);\r\n\r\n const handleStatusSelection = useCallback(\r\n (status: string) => {\r\n handleSelectStatus(toggleItemInArray(selectedStatuses, status));\r\n },\r\n [handleSelectStatus, selectedStatuses]\r\n );\r\n\r\n const onApplyHandler = useCallback(() => {\r\n onLabelsChange(labels.selected);\r\n handleSaveStatus(selectedStatuses);\r\n saveLabels();\r\n onSuccessApply();\r\n }, [\r\n onLabelsChange,\r\n labels.selected,\r\n handleSaveStatus,\r\n selectedStatuses,\r\n saveLabels,\r\n onSuccessApply,\r\n ]);\r\n\r\n const onClearHandler = useCallback(() => {\r\n handleSelectStatus([]);\r\n selectLabels([]);\r\n }, [handleSelectStatus, selectLabels]);\r\n\r\n const totalFiltersSelected =\r\n selectedStatuses.length +\r\n labels.selected.filter((id: any) => id > 0).length;\r\n\r\n return (\r\n <Container>\r\n <Wrapper>\r\n <Fieldset title={'Status'} dataTest=\"library-filters-status-title\">\r\n <StatusContainer>\r\n {LIBRARY_STATUS_ITEMS.map(item => {\r\n return (\r\n <CheckBoxWrapper key={item.value} data-test=\"status-item-container\">\r\n <Checkbox\r\n key={item.value}\r\n handleChange={() => {\r\n handleStatusSelection(item.value);\r\n }}\r\n checked={selectedStatuses.includes(\r\n item.value\r\n )}\r\n size={12}\r\n label={item.name}\r\n fontSize={13}\r\n fontColor={Variables.Colors.black}\r\n fontWeight={'500'}\r\n dataTest={`library-${item.name.toLowerCase()}-checkbox`}\r\n />\r\n </CheckBoxWrapper>\r\n );\r\n })}\r\n </StatusContainer>\r\n </Fieldset>\r\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\r\n <LabelsContainer>\r\n <PortableLabelsWithStore\r\n showSave={false}\r\n showSelectActions\r\n showSearch\r\n />\r\n </LabelsContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <SummaryCaption data-test=\"library-filters-selected-counter\">\r\n {totalFiltersSelected} Selected\r\n </SummaryCaption>\r\n <ButtonWrapper>\r\n <Button\r\n width={'122px'}\r\n variant={'inverse'}\r\n action={() => onClearHandler()}\r\n disabled={totalFiltersSelected < 1}\r\n dataTest=\"library-filters-clear\"\r\n >\r\n Clear\r\n </Button>\r\n </ButtonWrapper>\r\n <Button\r\n width={'122px'}\r\n action={() => onApplyHandler()}\r\n dataTest=\"library-filters-apply\"\r\n >\r\n Apply Filter\r\n </Button>\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import { FC, useRef, useState } from 'react';\r\nimport {\r\n ActionButton,\r\n ActionItem,\r\n} from '../../../../ui/components/ActionButton';\r\nimport { CheckPermission } from '../../../permissions';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { isTeamLeader } from '../../../../constants/enums';\r\nimport { PopupComponent } from '../../../../ui/components/Popup';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport {\r\n calculateAssignedLabels,\r\n calculateRemovedLabels,\r\n useCalculatePreSelectedLabelsForSingleItem,\r\n} from '../../../labels/tools';\r\nimport { AssignLabels } from '../../../portableLabels/templates/AssignLabels';\r\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\r\nimport { Scenario as ScenariosInterface } from '../../../../constants/interfaces/Scenario';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { useSelector } from 'react-redux';\r\nimport { ScenarioActionsHelper } from '../../tools';\r\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\n\r\nconst ScenariosListActions: FC<{\r\n scenario: ScenariosInterface;\r\n actionsHelper: ScenarioActionsHelper;\r\n restoreScenario: (scenarioIds: number[], isRowAction?: boolean) => void;\r\n handleItemEdit: (scenario: ScenariosInterface) => void;\r\n handleViewScenario: (scenario: ScenariosInterface) => void;\r\n handleGenerateChallenge: (scenario: ScenariosInterface) => void;\r\n onDuplicateScenario: (scenario: ScenariosInterface) => void;\r\n handleDeleteScenario: (scenarioId: number) => void;\r\n handleDownloadAsPDF: (scenarioId?: number) => void;\r\n archiveScenario: (scenarioIds: number[], isRowAction?: boolean) => void;\r\n assignLabelsToLibrary: (\r\n addedLabelIds: number[],\r\n deletedLabelIds: number[]\r\n ) => void;\r\n isHidden?: boolean;\r\n}> = ({\r\n scenario,\r\n actionsHelper,\r\n restoreScenario,\r\n handleItemEdit,\r\n handleViewScenario,\r\n handleGenerateChallenge,\r\n handleDeleteScenario,\r\n onDuplicateScenario,\r\n handleDownloadAsPDF,\r\n archiveScenario,\r\n assignLabelsToLibrary,\r\n isHidden,\r\n}) => {\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState();\r\n const setSelectLabels = useSelectLabels();\r\n const saveLabels = useSaveLabels();\r\n const calculatePreSelectedLabels =\r\n useCalculatePreSelectedLabelsForSingleItem();\r\n const profile = useSelector(getProfileState);\r\n\r\n const handleSetPreselectedLabels = () => {\r\n const selectedLabelIds = scenario?.labels || [];\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList.data\r\n );\r\n setSelectLabels(preAssignedLabels);\r\n saveLabels();\r\n };\r\n\r\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\r\n const addedLabelIds = calculateAssignedLabels(labelIDs, labels.saved);\r\n const deletedLabelIds = calculateRemovedLabels(labelIDs, labels.saved);\r\n\r\n assignLabelsToLibrary(addedLabelIds, deletedLabelIds);\r\n };\r\n\r\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\r\n null | number | undefined\r\n >(null);\r\n\r\n const triggerRef = useRef(null);\r\n\r\n return (\r\n <span>\r\n <div ref={triggerRef}>\r\n <ActionButton\r\n customWidth={192}\r\n isHidden={isHidden}\r\n dataTest=\"library-scenarios-item-menu\"\r\n >\r\n {actionsHelper.canEdit(scenario) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleItemEdit(scenario);\r\n }}\r\n dataTest=\"edit-scenario-action\"\r\n >\r\n View\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canAssignLabels(scenario) &&\r\n !!labelsList.data.items.length && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n setAssignSingleLabelOpen(scenario.id);\r\n handleSetPreselectedLabels();\r\n }}\r\n dataTest=\"assign-labels-scenario-action\"\r\n >\r\n Assign Labels\r\n </ActionItem>\r\n )}\r\n {isTeamLeader(profile?.role?.name) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewScenario(scenario);\r\n }}\r\n dataTest=\"view-scenario-action\"\r\n >\r\n View\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canDuplicate(scenario) && (\r\n <ActionItem\r\n onClick={e => {\r\n onDuplicateScenario(scenario);\r\n }}\r\n dataTest=\"duplicate-scenario-action\"\r\n >\r\n Duplicate\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canGenerateChallenge(scenario) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleGenerateChallenge(scenario);\r\n }}\r\n dataTest=\"generate-challenge-action\"\r\n >\r\n Generate Challenge\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canRestore(scenario) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n restoreScenario([scenario.id!], true);\r\n }}\r\n dataTest=\"restore-scenario-action\"\r\n >\r\n Restore\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canDelete(scenario) && (\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n scenario?.id &&\r\n handleDeleteScenario(scenario.id);\r\n }}\r\n dataTest=\"delete-scenario-action\"\r\n >\r\n Delete\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canDownloadPdf(scenario) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleDownloadAsPDF(scenario.id);\r\n }}\r\n dataTest=\"download-pdf-scenario-action\"\r\n >\r\n Download as PDF\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canArchive(scenario) && (\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.ARCHIVE_SCENARIO]}\r\n >\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n archiveScenario([scenario.id!], true);\r\n }}\r\n dataTest=\"archive-scenario-action\"\r\n >\r\n Archive\r\n </ActionItem>\r\n </CheckPermission>\r\n )}\r\n </ActionButton>\r\n </div>\r\n <PopupComponent\r\n triggerRef={triggerRef}\r\n open={assignSingleLabelOpen === scenario.id}\r\n onDismiss={() => {\r\n setAssignSingleLabelOpen(null);\r\n }}\r\n >\r\n <AssignLabels\r\n onLabelsChange={handleSaveSelectedLabels}\r\n onSuccessApply={() => {\r\n setAssignSingleLabelOpen(null);\r\n }}\r\n withBorder={true}\r\n />\r\n </PopupComponent>\r\n </span>\r\n );\r\n};\r\n\r\nexport default ScenariosListActions;\r\n","import { useEffect, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from '../../pages/CompanySettings/store/reducers';\nimport { getProfileState } from '../../pages/UserProfile/store/reducers';\n\nexport function useSession() {\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n\n return useMemo(\n () => !!profile?.id && (!!company?.id || !!profile?.companyId) \n ? `${profile.id}/${company?.id || profile.companyId}`\n : '',\n [profile?.id, profile?.companyId, company?.id]\n );\n}\n\nexport function useSessionEffect(effect: () => void, deps: any[] = []) {\n const session = useSession();\n\n useEffect(() => {\n if (session) {\n effect();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [session, ...deps]);\n}\n\n","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const countAppliedFiltersCount = (searchParams: SearchParams) => {\n let total = 0;\n\n if (searchParams && searchParams.teamIds && searchParams.teamIds.length) {\n total = total + searchParams.teamIds.length;\n }\n\n if (searchParams && searchParams.labelIDs && searchParams.labelIDs.length) {\n total = total + searchParams.labelIDs.filter(id => id > 0).length;\n }\n\n if (searchParams && searchParams.roleIDs && searchParams.roleIDs.length) {\n total = total + searchParams.roleIDs.length;\n }\n\n if (\n searchParams &&\n searchParams.teamLeadIds &&\n searchParams.teamLeadIds.length\n ) {\n total = total + searchParams.teamLeadIds.length;\n }\n\n if (\n searchParams?.invitersIDs?.length\n ) {\n total = total + searchParams.invitersIDs.length;\n }\n\n return total;\n};\n","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n}));\n\n","import { FC, useCallback } from 'react';\nimport { SelectDropdown } from '../../../SelectDropdown';\n\nexport const TableDropdown: FC<{\n items?: { value: string | number; name: string }[];\n value?: string | string[] | number | number[];\n defaultValue?: string;\n label?: string;\n disabled?: boolean;\n restrictShowAllName?: boolean;\n onChange?(value: string): void;\n openMenuWidth?: string;\n}> = ({\n value,\n defaultValue,\n items,\n label,\n disabled,\n restrictShowAllName,\n onChange,\n openMenuWidth,\n}) => {\n const handleChange = useCallback(\n (e: any) => onChange && onChange(e.target.value),\n [onChange]\n );\n return (\n <SelectDropdown\n label={label}\n items={items}\n defaultValue={defaultValue}\n value={value}\n restrictShowAllName={restrictShowAllName}\n onChange={handleChange}\n disabled={disabled}\n openMenuWidth={openMenuWidth}\n />\n );\n};\n\nexport function useFilter(\n field: string,\n onFilterChange: (filter: {\n field: string;\n value: string | number | string[] | number[];\n }) => void\n) {\n const onChange = useCallback(\n (value: string | number | string[] | number[]) =>\n onFilterChange({ field, value }),\n [field, onFilterChange]\n );\n return onChange;\n}\n","import { FC, useCallback, useEffect, useState, useMemo } from 'react';\nimport { useHistory } from 'react-router';\nimport { History } from 'history';\nimport { isEmpty } from 'lodash';\n\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport {\n LIBRARY_STATUS,\n libraryItemsStatusName,\n useScenarioActionsHelper,\n ScenarioActionsHelper,\n ScenarioActions,\n} from '../../tools';\nimport secondsToMin from '../../../../helpers/functions/convert-time';\nimport ROUTES from '../../../../routes/routes';\nimport { pushModal } from '../../../../tools/router';\nimport {\n useArchiveScenarioService,\n useDeleteLibraryLabelTag,\n useDeleteScenariosService,\n useDownloadScenarioReportService,\n useGenerateChallengeSuccessCallback,\n useRestoreScenarioService,\n useSearchScenariosService,\n useUpdateAllScenarioCheckedStateService,\n useUpdateLibraryScenarioCheckedStateService,\n} from '../../store/services';\nimport {\n selectSelectedScenarios,\n useLibraryScenariosState,\n useUpdatedLibraryScenariosState,\n} from '../../store/states';\nimport { Scenario as ScenarioInterface } from '../../../../constants/interfaces/Scenario';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport LibraryNavigationContainer from '../../components/LibraryNavigation';\nimport {\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../labels/store/states';\nimport {\n ASSIGN_LABEL_OPTIONS,\n LOAD_ASSIGNED_LABELS,\n} from '../../../../constants/enums';\nimport {\n clearSelectedItemIfNotLoaded,\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabels,\n} from '../../../labels/tools';\nimport {\n useSaveUserFiltersService,\n useSetAssignLabelsActionService,\n} from '../../../labels/store/services';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { Popup } from '../../../../ui/components/Popup';\nimport { LibraryFilters } from '../../components/Filters/LibraryFilters';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport ScenariosListActions from '../../components/ListActions/ScenariosListActions';\nimport Document from '../../../../ui/icons/Document';\nimport { useSessionEffect } from '../../../common';\nimport { countAppliedFiltersCount } from '../../../teams/pages/ListOfTeams/tools';\nimport {\n useAssignedLabelsIdsApi,\n useAssignScenarioLabelApi,\n useDeleteScenarioLabelApi,\n} from '../../../../api';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { useStyles } from './styles';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useFilter } from '../../../../ui/components/table-wrapper/table/TableDropdown';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { useFetchAllPractisSetsService } from '../../../portablePractisSets/store/hors/withPractisSets/services';\nimport {\n useUpdateLabelsBulkActionService,\n useUpdateMultipleEntityLabelsBulkActionService,\n} from '../../../../services/GeneralBulkActionServices';\nimport { generateCopyOfEntityName } from '../../../../services/GeneralBulkActionServices/helpers';\nimport { useGenerateCreateDuplicateScenarioActionList } from '../../services/LibraryBulkActionsService/helpers';\nimport { CreateNewScenarioInfo, GenerateChallengeData } from '../../services/LibraryBulkActionsService/types';\nimport { useCreateEditDuplicateLibraryBulActionService, useGenerateChallengeBulActionService } from '../../services/LibraryBulkActionsService';\nimport { UPDATE_MULTIPLE_LABEL_ACTION } from '../../../../services/GeneralBulkActionServices/constants';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\nimport { DEFAULT_CHALLENGE_TRY_LIMIT } from '../../../challenges/constants';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\nconst DEFAULT_FILTER_VALUE = [LIBRARY_STATUS.ACTIVE, LIBRARY_STATUS.DRAFT];\n\nconst Scenarios: FC<{\n scenarios?: ListResult<ScenarioInterface>;\n updatedScenarios?: ScenarioInterface;\n searchScenarios(searchParams: SearchParams): void;\n history: History<any>;\n onDeleteScenarios: (\n scenarioIds: number[],\n successCallback?: () => void\n ) => void;\n onArchiveScenario: (scenarioIds: number[]) => void;\n onRestoreScenario: (scenarioIds: number[]) => void;\n selectedLabels?: number[];\n selectedScenarioIds?: number[];\n selectedScenarios?: ScenarioInterface[];\n actionsHelper: ScenarioActionsHelper;\n loading?: boolean;\n setAssignLabelsAction(labels: number[]): void;\n assignedLabels?: number[];\n updateAllScenariosCheckedState(\n scenarioIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedScenarioCheckedState(scenarioId: number): void;\n updatedLabels?: any;\n downloadScenario(scenarioId: number): void;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n}> = ({\n scenarios,\n updatedScenarios,\n history,\n onDeleteScenarios,\n onArchiveScenario,\n onRestoreScenario,\n searchScenarios,\n selectedLabels,\n selectedScenarioIds,\n selectedScenarios,\n actionsHelper,\n setAssignLabelsAction,\n assignedLabels,\n updateAllScenariosCheckedState,\n updateSelectedScenarioCheckedState,\n updatedLabels,\n loading,\n downloadScenario,\n saveGlobalLabelFilters,\n}) => {\n const classes = useStyles();\n const fetchAllPractisSets = useFetchAllPractisSetsService();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n const deleteLibraryLabelTag = useDeleteLibraryLabelTag();\n const assignLabelsToScenarios = useAssignScenarioLabelApi();\n const deleteLabelsFromScenarios = useDeleteScenarioLabelApi();\n\n const [selectedStatuses, setSelectedStatuses] = useState<string[]>([\n 'active',\n 'draft',\n ]);\n const [savedStatuses, setSavedStatuses] = useState<string[]>([\n 'active',\n 'draft',\n ]);\n\n const canAccessPage = useHandleAccessPage();\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [{ field: 'status', value: DEFAULT_FILTER_VALUE }],\n labelIDs: selectedLabels,\n orderBy: {\n field: 'updated_at',\n asc: false,\n },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n refreshSearchParams,\n setFilter,\n } = useSearchParamsState(initialSearchParams);\n\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchScenarios(searchParams);\n setLastRefreshed(new Date());\n setIsSelectAll(false);\n updateAllScenariosCheckedState([], false, false);\n }, [\n searchParams,\n initialOffset,\n searchScenarios,\n updateAllScenariosCheckedState,\n ]);\n\n useEffect(() => {\n updateAllScenariosCheckedState([], false, false);\n setIsSelectAll(false);\n }, [location.pathname, updateAllScenariosCheckedState]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n useSessionEffect(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchScenarios(searchParams);\n }, [searchScenarios, searchParams]);\n\n useEffect(() => {\n if (updatedScenarios) refreshSearchParams();\n }, [updatedScenarios, refreshSearchParams]);\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (updatedLabels && updatedLabels.updateType === 'delete')\n refreshSearchParams();\n }, [updatedLabels, refreshSearchParams]);\n\n useEffect(() => {\n if (\n selectedScenarios?.length &&\n scenarios?.count &&\n selectedScenarios.length === +scenarios.count\n ) {\n setIsSelectAll(true);\n }\n }, [scenarios?.count, selectedScenarios]);\n\n const handleItemEdit = (scenarios: ScenarioInterface) => {\n updateAllScenariosCheckedState([], false, false);\n pushModal(\n history,\n ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n scenarios.id!.toString()\n )\n );\n };\n\n const generateChallengeSuccessCallback =\n useGenerateChallengeSuccessCallback();\n\n const generateChallengeService = useGenerateChallengeBulActionService(\n generateChallengeSuccessCallback\n );\n\n const handleGenerateChallenge = (scenario: ScenarioInterface) => {\n if (!scenario.id) {\n return;\n }\n\n const generateChallengeData: GenerateChallengeData = {\n title: `Challenge - ${scenario.title}`,\n description: scenario.description,\n sourceScenarioId: scenario.id,\n labelIds: (scenario.labels as number[]) ?? [],\n lines: scenario.script.lines ?? [],\n tryLimit: DEFAULT_CHALLENGE_TRY_LIMIT,\n };\n\n generateChallengeService(generateChallengeData);\n };\n\n const handleDownloadAsPDF = (id?: number) => {\n if (!id) return;\n downloadScenario(id);\n };\n\n const isCheckboxPartiallySelected =\n scenarios &&\n scenarios.items &&\n selectedScenarios &&\n selectedScenarios.length < scenarios.items.length;\n\n const updateAllScenariosCheck = useCallback(\n (checked: boolean) => {\n const ids =\n (scenarios &&\n scenarios.items.map(\n (item: ScenarioInterface) => item.id as number\n )) ||\n ([] as number[]);\n updateAllScenariosCheckedState(\n ids,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [scenarios, isCheckboxPartiallySelected, updateAllScenariosCheckedState]\n );\n\n const handleScenarioCheck = (e: any, sc: ScenarioInterface) => {\n e.stopPropagation();\n if (!!sc.id) {\n updateSelectedScenarioCheckedState(sc.id);\n }\n };\n\n const getDeletedLabels = useCalculateDeletedLabels();\n\n const updateMultipleScenariosLabels =\n useUpdateMultipleEntityLabelsBulkActionService(\n assignLabelsToScenarios,\n deleteLabelsFromScenarios,\n isSelectAll,\n {\n actionName: UPDATE_MULTIPLE_LABEL_ACTION,\n actionFunction: searchScenarios,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n limit: 1,\n offset: Number(scenarios?.count) ?? 0,\n },\n shouldSetStore: false,\n },\n fieldName: 'searchParams.offset',\n },\n },\n refreshData\n );\n\n const assignLabels = async () => {\n if (assignedLabels && selectedScenarioIds) {\n const { preAssignedLabels } = await getAssignedLabelsIds(\n selectedScenarioIds,\n LOAD_ASSIGNED_LABELS.SCENARIOS_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.SCENARIO,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n return calculatePreSelectedLabels(\n selectedScenarioIds,\n scenarios,\n data\n );\n });\n\n const deletedLabels = getDeletedLabels(assignedLabels);\n\n const deletedLabelsFiltered = deletedLabels.filter(\n x =>\n preAssignedLabels.includes(x) ||\n preAssignedLabels.includes(-x)\n );\n const selectedLabelsFiltered = assignedLabels.filter(\n x => x > 0 && !preAssignedLabels.includes(x)\n );\n\n updateMultipleScenariosLabels(\n {\n entityName: 'scenario',\n entityIds: selectedScenarioIds,\n },\n selectedLabelsFiltered,\n deletedLabelsFiltered\n );\n }\n };\n\n const getAssignedLabelsIds = useAssignedLabelsIdsApi();\n\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n\n const orderBy = searchParams.orderBy;\n const hcName = useOrderBy('title', orderBy, setOrderBy);\n const hcStatus = useOrderBy('status', orderBy, setOrderBy);\n const hcDuration = useOrderBy('total_duration', orderBy, setOrderBy);\n const hcUpdatedAt = useOrderBy('updated_at', orderBy, setOrderBy);\n const handleChangeEvent = useFilter('status', setFilter);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const labelChangeHandler = (ids: number[]) => {\n saveGlobalLabelFilters(ids);\n };\n\n const onSelectStatus = (status: string[]) => {\n setSelectedStatuses(status);\n };\n const onSaveStatus = (status: string[]) => {\n setSavedStatuses(status);\n };\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n countAppliedFiltersCount(searchParams) +\n (savedStatuses?.length || 0),\n itemsCount: scenarios?.items.length || 0,\n });\n\n const bulkActions = useMemo(\n () => actionsHelper.getBulkActions(selectedScenarios),\n [selectedScenarios, actionsHelper]\n );\n\n /**\n * @function successDeleteScenarioCallback\n * @returns { void }\n */\n const successDeleteScenarioCallback = useCallback((): void => {\n fetchAllPractisSets();\n refreshSearchParams();\n }, [fetchAllPractisSets, refreshSearchParams]);\n\n /**\n * @function onConfirmDeleteScenario\n * @param { number } scenarioIdToDelete\n * @returns { void }\n */\n const onConfirmDeleteScenario = useCallback(\n (scenarioIdToDelete: number): void => {\n onDeleteScenarios(\n [scenarioIdToDelete!],\n successDeleteScenarioCallback\n );\n },\n [onDeleteScenarios, successDeleteScenarioCallback]\n );\n\n /**\n * @function handleDeleteScenario\n * @param { number } id\n * @returns { void }\n */\n const handleDeleteScenario = useCallback(\n (id: number): void => {\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description:\n 'Are you sure you want to delete this item? This can’t be undone',\n onConfirm: () => onConfirmDeleteScenario(id),\n });\n },\n [onConfirmDeleteScenario, showConfirmationModalDialog]\n );\n\n /**\n * @function onOpenAssignLabelAction\n * @returns { void }\n */\n const onOpenAssignLabelAction = (): void => {\n if (scenarios && scenarios.items && selectedScenarioIds) {\n getAssignedLabelsIds(\n selectedScenarioIds,\n LOAD_ASSIGNED_LABELS.SCENARIOS_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.SCENARIO,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedScenarioIds,\n scenarios,\n data\n );\n\n setAssignLabelsAction(preAssignedLabels);\n });\n }\n };\n\n useEffect(() => {\n const filteredUsers = scenarios\n ? scenarios.items.map(scenario => Number(scenario.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedScenarioIds,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllScenariosCheckedState(usersToClear, false);\n }\n }, [selectedScenarioIds, scenarios, updateAllScenariosCheckedState]);\n\n useEffect(() => {\n return () => updateAllScenariosCheckedState([], false, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllScenariosCheckedState([], false, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scenarios]);\n\n useEffect(() => {\n handleChangeEvent(savedStatuses);\n }, [savedStatuses, handleChangeEvent]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_SCENARIO]);\n }, [canAccessPage]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onClearSelection\n * @returns { void }\n */\n const onClearSelection = () => {\n updateAllScenariosCheckedState([], false, false);\n setIsSelectAll(false);\n };\n\n /**\n * @function onSelectAll\n * @returns { void }\n */\n const onSelectAll = () => {\n const ids =\n (scenarios &&\n scenarios.items.map(\n (item: ScenarioInterface) => item.id as number\n )) ||\n ([] as number[]);\n updateAllScenariosCheckedState(ids, true, isCheckboxPartiallySelected);\n setIsSelectAll(true);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n updateAllScenariosCheck(event.target.checked);\n setIsSelectAll(false);\n };\n\n const isMasterCheckBoxChecked = !!selectedScenarioIds?.length;\n\n const isMasterCheckBoxDisabled =\n !scenarios || (scenarios && scenarios.items.length < 1);\n\n /**\n * @function checkIsRowChecked\n * @param { ScenarioInterface } scenario\n * @returns { boolean }\n */\n const checkIsRowChecked = (scenario: ScenarioInterface): boolean =>\n !!selectedScenarioIds &&\n !!scenario.id &&\n selectedScenarioIds.includes(scenario.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { ScenarioInterface } scenario\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, scenario: ScenarioInterface) => {\n setIsSelectAll(false);\n handleScenarioCheck(event, scenario);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { ScenarioInterface } scenario\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (scenario: ScenarioInterface): boolean => {\n return labelsOpen === scenario?.['id'];\n };\n\n /**\n * @function onDeleteLabelHandler\n * @param { number } labelId\n * @param { ScenarioInterface } scenario\n * @returns { void }\n */\n const onDeleteLabelHandler = useCallback(\n (labelId: number, scenario: ScenarioInterface): void => {\n const scnerioItem = scenarios?.items.find(\n item => item.id === scenario.id\n );\n\n if (!isEmpty(scnerioItem)) {\n deleteLibraryLabelTag(\n labelId,\n {\n entityItem: scnerioItem!,\n entityName: 'scenario',\n },\n refreshData\n );\n }\n },\n [deleteLibraryLabelTag, refreshData, scenarios]\n );\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToScenarios,\n deleteLabelsFromScenarios,\n refreshData\n );\n\n /**\n * @function handleUpdateScenariosLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { number } scenarioId\n * @returns { void }\n */\n const handleUpdateScenariosLabels = (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n scenarioId: number\n ): void => {\n updateLabelsBulkActionService(\n {\n entityName: 'scenario',\n entityId: scenarioId,\n },\n addedLabelIds,\n deletedLabelIds\n );\n };\n\n const generateDuplicateScenarioActionList =\n useGenerateCreateDuplicateScenarioActionList();\n\n const duplicateLibraryBulkActionService =\n useCreateEditDuplicateLibraryBulActionService(\n 'duplicate',\n 'Scenario',\n refreshData\n );\n\n /**\n * @function handleDuplicateScenario\n * @param { ScenarioInterface } scenario\n * @returns { void }\n */\n const handleDuplicateScenario = useCallback(\n (scenario: ScenarioInterface) => {\n const newScenario: CreateNewScenarioInfo = {\n title: generateCopyOfEntityName(scenario.title),\n description: scenario.description,\n labelIds: scenario?.labels ?? [],\n lines: scenario?.script?.lines ?? [],\n };\n\n const duplicateScenarioActionList =\n generateDuplicateScenarioActionList(newScenario);\n\n !isEmpty(duplicateScenarioActionList) &&\n duplicateLibraryBulkActionService([\n duplicateScenarioActionList,\n ]);\n },\n [duplicateLibraryBulkActionService, generateDuplicateScenarioActionList]\n );\n\n return (\n <MainWrapper\n subTitle=\"Library\"\n tabs={<LibraryNavigationContainer />}\n hideDivider={!!selectedScenarios?.length}\n htmlPageTitle=\"Library - Practis\"\n dataTest=\"library\"\n >\n {loading && !isSelectAll && <LoadingComponent />}\n <TableWrapper\n tableStates={tableStates}\n data={scenarios?.items}\n cornered={selectedLabels && !!selectedLabels.length}\n selectedLabels={selectedLabels}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'library-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: scenarios?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'library-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'library-search-input',\n },\n isSelectedItemOptionsVisible:\n !isEmpty(selectedScenarios) && !isEmpty(scenarios),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedScenarios?.length,\n totalCount: scenarios?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: onClearSelection,\n onSelectAll: onSelectAll,\n bulkActionsConfig: {\n disabled: bulkActions.areBulkActionsDisabled(),\n disabledLabel: bulkActions.areItemsEmpty()\n ? undefined\n : \"Bulk actions can't be applied\",\n assignLabelsPermissions:\n bulkActions.isBulkActionVisible(\n ScenarioActions.ASSIGN_LABELS\n )\n ? [NEW_PERMISSIONS.ASSIGN_SCENARIO_LABEL]\n : [],\n isAssignLabelsDisabled:\n bulkActions.isBulkActionDisabled(\n ScenarioActions.ASSIGN_LABELS\n ),\n onOpenAssignLabelAction: onOpenAssignLabelAction,\n onAssignLabelsSubmit: assignLabels,\n isSelectAll: isSelectAll,\n totalCount: scenarios?.count,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <LibraryFilters\n selectedStatuses={\n scenarios ? selectedStatuses : []\n }\n savedStatuses={savedStatuses}\n handleSelectStatus={onSelectStatus}\n handleSaveStatus={onSaveStatus}\n preSelectedLabels={selectedLabels || []}\n onLabelsChange={labelChangeHandler}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={250}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={\n scenarios\n ? savedStatuses.length +\n (searchParams.labelIDs\n ?.length || 0)\n : 0\n }\n disabled={tableStates.disableFilters}\n dataTest=\"library-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && scenarios?.items?.length === 0,\n noEntriesOptions: {\n icon: Document,\n text: 'No Scenarios Yet',\n dataTest: 'library-no-scenarios',\n },\n noSearchResultsOptions: {\n entityName: 'Scenarios',\n dataTest: 'library-no-found-scenarios',\n },\n noFilterResultsOptions: {\n dataTest: 'library-no-filtered-scenarios',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: isMasterCheckBoxChecked,\n disabled: isMasterCheckBoxDisabled,\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'library-scenarios-master-checkbox',\n },\n\n columns: [\n {\n title: 'Scenarios',\n width: 28,\n ...hcName,\n disabled: tableStates.disableSorting,\n dataTest: 'library-scenarios-title-column',\n },\n {\n title: 'Status',\n width: 17,\n ...hcStatus,\n disabled: tableStates.disableSorting,\n dataTest: 'library-scenarios-status-column',\n },\n {\n title: 'Duration',\n width: 17,\n ...hcDuration,\n disabled: tableStates.disableSorting,\n dataTest: 'library-scenarios-duration-column',\n },\n {\n title: ' Last Updated',\n width: 17,\n ...hcUpdatedAt,\n disabled: tableStates.disableSorting,\n dataTest: 'library-scenarios-date-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n rowConfig: {\n onRowClick: handleItemEdit,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (scenario: ScenarioInterface) => ({\n selectedLabels: scenario?.labels || [],\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_CHALLENGE_LABEL,\n ],\n\n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, scenario),\n }),\n dataTest: 'library-scenarios-item',\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n cellClassName: classes.customTableCellStyle,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (\n scenario: ScenarioInterface\n ) => scenario.title,\n dataTest: 'library-scenarios-item-title',\n },\n },\n {\n fieldType: 'BADGE_FIELD',\n cellClassName: classes.customTableCellStyle,\n shouldShowEmptyCell: (\n scenario: ScenarioInterface\n ) => !scenario?.status,\n fieldProps: {\n getBadgeFieldProps: (\n scenario: ScenarioInterface\n ) => ({\n status: scenario?.status,\n className: classes.customTableCellStyle,\n dataTest:\n 'library-scenarios-item-status',\n }),\n renderTitle: (\n scenario: ScenarioInterface\n ) =>\n libraryItemsStatusName(\n scenario?.status\n ),\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n scenario: ScenarioInterface\n ) => !scenario?.script?.totalDuration,\n fieldProps: {\n renderTitle: (\n scenario: ScenarioInterface\n ) =>\n secondsToMin(\n scenario?.script?.totalDuration\n ),\n dataTest: 'library-scenarios-item-duration',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n scenario: ScenarioInterface\n ) => !scenario?.updatedAt,\n fieldProps: {\n renderTitle: (\n scenario: ScenarioInterface\n ) => formatDate(scenario?.updatedAt),\n dataTest: 'library-scenarios-item-date',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (\n scenario: ScenarioInterface\n ) => ({\n open: labelsOpen === scenario.id,\n toggleOpen: () =>\n handleToggleLabels(\n Number(scenario.id)\n ),\n selectedLabels: scenario?.labels ?? [],\n dataTest:\n 'library-scenarios-item-labels',\n }),\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (\n scenario: ScenarioInterface\n ) => (\n <ScenariosListActions\n scenario={scenario}\n actionsHelper={actionsHelper}\n restoreScenario={onRestoreScenario}\n handleItemEdit={handleItemEdit}\n handleViewScenario={handleItemEdit}\n handleGenerateChallenge={\n handleGenerateChallenge\n }\n handleDeleteScenario={\n handleDeleteScenario\n }\n onDuplicateScenario={\n handleDuplicateScenario\n }\n handleDownloadAsPDF={\n handleDownloadAsPDF\n }\n archiveScenario={onArchiveScenario}\n assignLabelsToLibrary={(\n addedLabelIds,\n deletedLabelIds\n ) =>\n handleUpdateScenariosLabels(\n addedLabelIds,\n deletedLabelIds,\n scenario?.id ?? 0\n )\n }\n isHidden={\n !!selectedScenarios?.length\n }\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const ScenariosContainer: FC = () => {\n const state = useLibraryScenariosState();\n const history = useHistory();\n const deleteScenarios = useDeleteScenariosService();\n const archiveScenario = useArchiveScenarioService();\n const restoreScenario = useRestoreScenarioService();\n const searchScenarios = useSearchScenariosService();\n const updatedScenarios = useUpdatedLibraryScenariosState();\n const searchScenariosDebounced = useSearchDebounced(searchScenarios);\n const labels = useLabelsState();\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const updateAllScenariosCheckedState =\n useUpdateAllScenarioCheckedStateService();\n const updateSelectedScenarioCheckedState =\n useUpdateLibraryScenarioCheckedStateService();\n const updatedLabels = useUpdatedLabelsState();\n const downloadScenario = useDownloadScenarioReportService();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const actionsHelper = useScenarioActionsHelper();\n\n const selectedScenarios = useMemo(\n () => selectSelectedScenarios(state),\n [state]\n );\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'libraryScenarios' }}>\n <Scenarios\n onDeleteScenarios={deleteScenarios}\n onArchiveScenario={archiveScenario}\n onRestoreScenario={restoreScenario}\n history={history}\n searchScenarios={searchScenariosDebounced}\n scenarios={state.data}\n loading={state.loading}\n selectedScenarioIds={state.selectedScenarios}\n selectedScenarios={selectedScenarios}\n actionsHelper={actionsHelper}\n updatedScenarios={updatedScenarios.data}\n selectedLabels={labels.selected}\n setAssignLabelsAction={setAssignLabelsAction}\n assignedLabels={labels.assignedLabels}\n updateAllScenariosCheckedState={updateAllScenariosCheckedState}\n updateSelectedScenarioCheckedState={\n updateSelectedScenarioCheckedState\n }\n updatedLabels={updatedLabels}\n downloadScenario={downloadScenario}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n />\n </WithLabelsContext.Provider>\n );\n};\n\n\nexport default ScenariosContainer;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Box = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 20 20\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fillRule=\"evenodd\"\n fill=\"currentColor\"\n d=\"M18.75 8v10.667c0 .736-.56 1.333-1.25 1.333h-15c-.69 0-1.25-.597-1.25-1.333V8C.56 8 0 7.403 0 6.667V1.333C0 .597.56 0 1.25 0h17.5C19.44 0 20 .597 20 1.333v5.334C20 7.404 19.44 8 18.75 8zM2.5 18c0 .368.28.667.625.667h13.75c.345 0 .625-.299.625-.667V8.666c0-.367-.28-.665-.625-.665H13.75v2.666c0 .737-.56 1.333-1.25 1.333h-5c-.69 0-1.25-.596-1.25-1.333V8H3.125c-.345 0-.625.298-.625.665V18zm10-8V8.001h-5V10c0 .368.28.667.625.667h3.75c.345 0 .625-.299.625-.667zm6.25-8c0-.368-.28-.667-.625-.667H1.875c-.345 0-.625.299-.625.667v4c0 .368.28.667.625.667h16.25c.345 0 .625-.299.625-.667V2z\"\n />\n </svg>\n );\n }\n);\n\nexport default Box;\n","import { FC, useRef, useState } from 'react';\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../ui/components/ActionButton';\nimport { isTeamLeader } from '../../../../constants/enums';\nimport { PopupComponent } from '../../../../ui/components/Popup';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport {\n calculateAssignedLabels,\n calculateRemovedLabels,\n useCalculatePreSelectedLabelsForSingleItem,\n} from '../../../labels/tools';\nimport { AssignLabels } from '../../../portableLabels/templates/AssignLabels';\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { PractisSets as PractisSetsInterface } from '../../../../constants/interfaces/PractisSets';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport { useSelector } from 'react-redux';\nimport { PractisSetActionsHelper } from '../../tools';\nimport { useSetAssignLabelsActionService } from '../../../labels/store/services';\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\n\nconst PractisSetsListActions: FC<{\n practisSet: PractisSetsInterface;\n actionsHelper: PractisSetActionsHelper;\n onRestorePractisSet: (\n practisSetIds: number[]\n ) => void;\n handleItemEdit: (practisSet: PractisSetsInterface) => void;\n handleViewPractisSet: (practisSet: PractisSetsInterface) => void;\n handleViewAssignUsers: (id: number) => void;\n handleViewPractisSetProgress: (practisSet: PractisSetsInterface) => void;\n handleDeletePractisSet: (practisSetId: number) => void;\n onDuplicatePractisSet: (\n practisSet: PractisSetsInterface\n ) => void;\n onArchivePractisSet: (\n practisSetIds: number[],\n ) => void;\n assignLabelsToLibrary: (\n addedLabelIds: number[],\n deletedLabelIds: number[]\n ) => void;\n isHidden?: boolean;\n}> = ({\n practisSet,\n actionsHelper,\n onRestorePractisSet,\n handleItemEdit,\n handleViewPractisSet,\n handleViewAssignUsers,\n handleViewPractisSetProgress,\n handleDeletePractisSet,\n onDuplicatePractisSet,\n onArchivePractisSet,\n assignLabelsToLibrary,\n isHidden,\n}) => {\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const calculatePreSelectedLabels =\n useCalculatePreSelectedLabelsForSingleItem();\n const profile = useSelector(getProfileState);\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n\n const handleSetPreselectedLabels = () => {\n const selectedLabelIds = practisSet.labels || [];\n const preAssignedLabels = calculatePreSelectedLabels(\n selectedLabelIds,\n labelsList.data\n );\n setSelectLabels(preAssignedLabels);\n setAssignLabelsAction(preAssignedLabels);\n saveLabels();\n };\n\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\n const addedLabelIds = calculateAssignedLabels(labelIDs, labels.saved);\n const deletedLabelIds = calculateRemovedLabels(labelIDs, labels.saved);\n\n assignLabelsToLibrary(addedLabelIds, deletedLabelIds);\n };\n\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\n null | number | undefined\n >(null);\n\n const triggerRef = useRef(null);\n\n return (\n <span>\n <div ref={triggerRef}>\n <ActionButton\n customWidth={168}\n isHidden={isHidden}\n dataTest=\"library-practis-sets-item-menu\"\n >\n {actionsHelper.canEdit(practisSet) && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleItemEdit(practisSet);\n }}\n dataTest=\"edit-practis-set-action\"\n >\n View\n </ActionItem>\n )}\n {isTeamLeader(profile?.role?.name) && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleViewPractisSet(practisSet);\n }}\n dataTest=\"view-practis-set-action\"\n >\n View\n </ActionItem>\n )}\n {actionsHelper.canAssignUsers(practisSet) && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n if (practisSet?.id) {\n handleViewAssignUsers(practisSet?.id);\n }\n }}\n dataTest=\"assign-users-practis-set-action\"\n >\n Assign Users\n </ActionItem>\n )}\n {actionsHelper.canAssignLabels(practisSet) &&\n !!labelsList.data.items.length && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setAssignSingleLabelOpen(practisSet.id);\n handleSetPreselectedLabels();\n }}\n dataTest=\"assign-labels-practis-set-action\"\n >\n Assign Labels\n </ActionItem>\n )}\n {actionsHelper.canDuplicate(practisSet) && (\n <ActionItem\n onClick={e => {\n onDuplicatePractisSet(practisSet);\n }}\n dataTest=\"duplicate-practis-set-action\"\n >\n Duplicate\n </ActionItem>\n )}\n {actionsHelper.canArchive(practisSet) && (\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n onArchivePractisSet([practisSet.id!]);\n }}\n dataTest=\"archive-practis-set-action\"\n >\n Archive\n </ActionItem>\n )}\n {actionsHelper.canRestore(practisSet) && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n onRestorePractisSet([practisSet.id!]);\n }}\n dataTest=\"restore-practis-set-action\"\n >\n Restore\n </ActionItem>\n )}\n {actionsHelper.canDelete(practisSet) && (\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n practisSet?.id &&\n handleDeletePractisSet(practisSet.id);\n }}\n dataTest=\"delete-practis-set-action\"\n >\n Delete\n </ActionItem>\n )}\n </ActionButton>\n </div>\n <PopupComponent\n triggerRef={triggerRef}\n open={assignSingleLabelOpen === practisSet.id}\n onDismiss={() => {\n setAssignSingleLabelOpen(null);\n }}\n >\n <AssignLabels\n onLabelsChange={handleSaveSelectedLabels}\n onSuccessApply={() => {\n setAssignSingleLabelOpen(null);\n }}\n withBorder={true}\n />\n </PopupComponent>\n </span>\n );\n};\n\nexport default PractisSetsListActions;\n\n\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nexport const SeparatingDot = styled.span`\n display: inline-block;\n background: ${props => props.theme.Colors.black};\n width: 4px;\n height: 4px;\n border-radius: 50%;\n margin: 0px 5px 2px;\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n}));\n","import { FC, useCallback, useEffect, useState, useMemo } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { useHistory } from 'react-router';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { PractisSets as PractisSetsInterface } from '../../../../constants/interfaces/PractisSets';\nimport { History } from 'history';\nimport {\n LIBRARY_STATUS,\n libraryItemsStatusName,\n usePractisSetActionsHelper,\n PractisSetActionsHelper,\n PractisSetActions,\n} from '../../tools';\nimport ROUTES from '../../../../routes/routes';\nimport { pushModal } from '../../../../tools/router';\nimport {\n useArchivePractisSetService,\n useDeleteLibraryLabelTag,\n useDeletePractisSetsService,\n useRestorePractisSetService,\n useSearchPractisSetsService,\n useUpdateAllPractisSetsCheckedStateService,\n useUpdateLibraryPractisSetsCheckedStateService,\n} from '../../store/services';\nimport {\n useLibraryPractisSetState,\n useUpdatedLibraryPractisSetsState,\n selectSelectedPractisSets,\n} from '../../store/states';\nimport LibraryNavigationContainer from '../../components/LibraryNavigation';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport {\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../labels/store/states';\nimport {\n ASSIGN_LABEL_OPTIONS,\n LOAD_ASSIGNED_LABELS,\n} from '../../../../constants/enums';\nimport {\n clearSelectedItemIfNotLoaded,\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabels,\n} from '../../../labels/tools';\nimport {\n useSaveUserFiltersService,\n useSetAssignLabelsActionService,\n} from '../../../labels/store/services';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport Box from '../../../../ui/icons/Box';\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\nimport { Popup } from '../../../../ui/components/Popup';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport { LibraryFilters } from '../../components/Filters/LibraryFilters';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport PractisSetsListActions from '../../components/ListActions/PractisSetsListActions';\nimport { useSessionEffect } from '../../../common';\nimport { countAppliedFiltersCount } from '../../../teams/pages/ListOfTeams/tools';\nimport { plural } from '../../../../helpers/functions/plural';\nimport {\n useAssignedLabelsIdsApi,\n useAssignPractisSetLabelsApi,\n useDeletePractisSetLabelsApi,\n} from '../../../../api';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { SeparatingDot, useStyles } from './styles';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useFilter } from '../../../../ui/components/table-wrapper/table/TableDropdown';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport {\n useUpdateLabelsBulkActionService,\n useUpdateMultipleEntityLabelsBulkActionService,\n} from '../../../../services/GeneralBulkActionServices';\nimport { useCreateEditDuplicateLibraryBulActionService } from '../../services/LibraryBulkActionsService';\nimport { useGenerateDuplicatePractisSetActionList } from '../../services/LibraryBulkActionsService/helpers';\nimport { generateCopyOfEntityName } from '../../../../services/GeneralBulkActionServices/helpers';\nimport { NewPractisSetInfo } from '../../services/LibraryBulkActionsService/types';\nimport { UPDATE_MULTIPLE_LABEL_ACTION } from '../../../../services/GeneralBulkActionServices/constants';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\nconst DEFAULT_FILTER_VALUE = [LIBRARY_STATUS.ACTIVE, LIBRARY_STATUS.DRAFT];\n\nconst PractisSets: FC<{\n practisSets?: ListResult<PractisSetsInterface>;\n updatedPractisSets?: PractisSetsInterface;\n searchPractisSets(searchParams: SearchParams): void;\n history: History<any>;\n onDeletePractisSets: (\n practisSetIds: number[],\n successCallback?: () => void\n ) => Promise<unknown>;\n onArchivePractisSet: (practisSetIds: number[]) => void;\n onRestorePractisSet: (practisSetIds: number[]) => void;\n selectedLabels?: number[];\n selectedPractisSetIds?: number[];\n selectedPractisSets?: PractisSetsInterface[];\n actionsHelper: PractisSetActionsHelper;\n loading?: boolean;\n setAssignLabelsAction(labels: number[]): void;\n assignedLabels?: number[];\n updateAllPractisSetsCheckedState(\n practisSetIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedPractisSetCheckedState(practisSetId: number): void;\n updatedLabels?: any;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n}> = ({\n practisSets,\n searchPractisSets,\n history,\n onDeletePractisSets,\n onArchivePractisSet,\n onRestorePractisSet,\n updatedPractisSets,\n selectedLabels,\n selectedPractisSetIds,\n selectedPractisSets,\n actionsHelper,\n setAssignLabelsAction,\n assignedLabels,\n updateAllPractisSetsCheckedState,\n updateSelectedPractisSetCheckedState,\n updatedLabels,\n loading,\n saveGlobalLabelFilters,\n}) => {\n const location = history.location;\n const classes = useStyles();\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n const deleteLibraryLabelTag = useDeleteLibraryLabelTag();\n const assignLabelsToPractisSet = useAssignPractisSetLabelsApi();\n const deleteLabelsFromPractisSet = useDeletePractisSetLabelsApi();\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const [selectedStatuses, setSelectedStatuses] =\n useState<string[]>(DEFAULT_FILTER_VALUE);\n const [savedStatuses, setSavedStatuses] =\n useState<string[]>(DEFAULT_FILTER_VALUE);\n\n const canAccessPage = useHandleAccessPage();\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [{ field: 'status', value: DEFAULT_FILTER_VALUE }],\n labelIDs: selectedLabels,\n orderBy: {\n field: 'updated_at',\n asc: false,\n },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n refreshSearchParams,\n setFilter,\n } = useSearchParamsState(initialSearchParams);\n\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchPractisSets(searchParams);\n setLastRefreshed(new Date());\n updateAllPractisSetsCheckedState([], false, false);\n setIsSelectAll(false);\n }, [\n searchParams,\n initialOffset,\n searchPractisSets,\n updateAllPractisSetsCheckedState,\n ]);\n\n const handleItemEdit = (practisSet: PractisSetsInterface) => {\n updateAllPractisSetsCheckedState([], false, false);\n pushModal(\n history,\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\n ':practisSetId',\n practisSet.id!.toString()\n )\n );\n };\n\n const handleViewPractisSetProgress = (practisSet: PractisSetsInterface) => {\n history.push(\n ROUTES.PROGRESS_PAGES.PRACTIS_SETS_DETAILS.replace(\n ':practisSetId',\n practisSet.id!.toString()\n )\n );\n };\n\n /**\n * @function onConfirmDeletePractisSet\n * @param { number } practisSetIdToDelete\n * @returns { void }\n */\n const onConfirmDeletePractisSet = useCallback(\n (practisSetIdToDelete: number): void => {\n onDeletePractisSets(\n [practisSetIdToDelete!],\n refreshSearchParams\n );\n },\n [onDeletePractisSets, refreshSearchParams]\n );\n\n /**\n * @function handleDeletePractisSet\n * @returns { void }\n */\n const handleDeletePractisSet = useCallback((id: number): void => {\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description:\n 'Are you sure you want to delete this item? This can’t be undone',\n onConfirm: () => onConfirmDeletePractisSet(id),\n });\n }, [onConfirmDeletePractisSet, showConfirmationModalDialog]);\n\n const isCheckboxPartiallySelected =\n practisSets &&\n practisSets.items &&\n selectedPractisSets &&\n selectedPractisSets.length < practisSets.items.length;\n\n const updateAllPractisSetsCheck = useCallback(\n (checked: boolean) => {\n const ids =\n (practisSets &&\n practisSets.items.map(\n (item: PractisSetsInterface) => item.id as number\n )) ||\n ([] as number[]);\n updateAllPractisSetsCheckedState(\n ids,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [\n practisSets,\n isCheckboxPartiallySelected,\n updateAllPractisSetsCheckedState,\n ]\n );\n\n const handlePractisSetCheck = (e: any, set: PractisSetsInterface) => {\n e.stopPropagation();\n if (!!set.id) {\n updateSelectedPractisSetCheckedState(set.id);\n }\n };\n\n const getDeletedLabels = useCalculateDeletedLabels();\n\n const updateMultiplePractisSetLabels =\n useUpdateMultipleEntityLabelsBulkActionService(\n assignLabelsToPractisSet,\n deleteLabelsFromPractisSet,\n isSelectAll,\n {\n actionName: UPDATE_MULTIPLE_LABEL_ACTION,\n actionFunction: searchPractisSets,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n limit: 1,\n offset: practisSets?.count ?? 0,\n },\n shouldSetStore: false,\n },\n fieldName: 'searchParams.offset',\n },\n },\n refreshData\n );\n\n const assignLabels = async () => {\n if (assignedLabels && selectedPractisSetIds) {\n const { preAssignedLabels } = await getAssignedLabelsIds(\n selectedPractisSetIds,\n LOAD_ASSIGNED_LABELS.PRACTIS_SETS_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.PRACTIS_SET,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n return calculatePreSelectedLabels(\n selectedPractisSetIds,\n practisSets,\n data\n );\n });\n\n const deletedLabels = getDeletedLabels(assignedLabels);\n\n const deletedLabelsFiltered = deletedLabels.filter(\n x =>\n preAssignedLabels.includes(x) ||\n preAssignedLabels.includes(-x)\n );\n const selectedLabelsFiltered = assignedLabels.filter(\n x => x > 0 && !preAssignedLabels.includes(x)\n );\n\n updateMultiplePractisSetLabels(\n {\n entityName: 'practisSet',\n entityIds: selectedPractisSetIds,\n },\n selectedLabelsFiltered,\n deletedLabelsFiltered\n );\n }\n };\n\n const orderBy = searchParams.orderBy;\n const hcName = useOrderBy('name', orderBy, setOrderBy);\n const hcStatus = useOrderBy('status', orderBy, setOrderBy);\n const hcTotalCount = useOrderBy('content_count', orderBy, setOrderBy);\n const hcLastUpdated = useOrderBy('updated_at', orderBy, setOrderBy);\n const handleChangeEvent = useFilter('status', setFilter);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const labelChangeHandler = (ids: number[]) => {\n saveGlobalLabelFilters(ids);\n };\n\n const onSelectStatus = (status: string[]) => {\n setSelectedStatuses(status);\n };\n const onSaveStatus = (status: string[]) => {\n setSavedStatuses(status);\n };\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n countAppliedFiltersCount(searchParams) +\n (savedStatuses?.length || 0),\n itemsCount: practisSets?.items.length || 0,\n });\n\n const bulkActions = useMemo(\n () => actionsHelper.getBulkActions(selectedPractisSets),\n [selectedPractisSets, actionsHelper]\n );\n\n /**\n * @function handleViewAssignUsers\n * @param { number } practisSetId\n * @returns { void }\n */\n const handleViewAssignUsers = useCallback(\n (practisSetId?: number): void => {\n if (!practisSetId) return;\n\n pushModal(\n history,\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ASSIGN_USERS.replace(\n ':practisSetId',\n practisSetId.toString()\n )\n );\n },\n [history]\n );\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 300);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n useSessionEffect(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchPractisSets(searchParams);\n }, [searchPractisSets, searchParams]);\n\n useEffect(() => {\n if (updatedPractisSets) refreshSearchParams();\n }, [updatedPractisSets, refreshSearchParams, updatedLabels]);\n\n useEffect(() => {\n if (updatedLabels && updatedLabels.updateType === 'delete')\n refreshSearchParams();\n }, [updatedLabels, refreshSearchParams]);\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (\n selectedPractisSets?.length &&\n selectedPractisSets.length === practisSets?.count\n ) {\n setIsSelectAll(true);\n }\n }, [practisSets?.count, selectedPractisSets]);\n\n useEffect(() => {\n const filteredUsers = practisSets\n ? practisSets.items.map(practisSet => Number(practisSet.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedPractisSetIds,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllPractisSetsCheckedState(usersToClear, false);\n }\n }, [selectedPractisSetIds, practisSets, updateAllPractisSetsCheckedState]);\n\n const getAssignedLabelsIds = useAssignedLabelsIdsApi();\n\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToPractisSet,\n deleteLabelsFromPractisSet,\n refreshData\n );\n\n /**\n * @function handleUpdatePractisSetLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { number } practisSetId\n * @returns { void }\n */\n const handleUpdatePractisSetLabels = (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n practisSetId: number\n ): void => {\n updateLabelsBulkActionService(\n {\n entityName: 'practisSet',\n entityId: practisSetId,\n },\n addedLabelIds,\n deletedLabelIds\n );\n };\n\n /**\n * @function onOpenAssignLabelAction\n * @returns { void }\n */\n const onOpenAssignLabelAction = (): void => {\n if (practisSets && practisSets.items && selectedPractisSetIds) {\n getAssignedLabelsIds(\n selectedPractisSetIds,\n LOAD_ASSIGNED_LABELS.PRACTIS_SETS_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.PRACTIS_SET,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedPractisSetIds,\n practisSets,\n data\n );\n\n setAssignLabelsAction(preAssignedLabels);\n });\n }\n };\n\n useEffect(() => {\n return () => updateAllPractisSetsCheckedState([], false, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllPractisSetsCheckedState([], false, false);\n }, [practisSets, updateAllPractisSetsCheckedState]);\n\n useEffect(() => {\n handleChangeEvent(savedStatuses);\n }, [savedStatuses, handleChangeEvent]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_PRACTIS_SET]);\n }, [canAccessPage]);\n\n useEffect(() => {\n updateAllPractisSetsCheckedState([], false, false);\n setIsSelectAll(false);\n }, [location.pathname, updateAllPractisSetsCheckedState]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onClearSelection\n * @returns { void }\n */\n const onClearSelection = () => {\n updateAllPractisSetsCheckedState([], false, false);\n setIsSelectAll(false);\n };\n\n /**\n * @function onSelectAll\n * @returns { void }\n */\n const onSelectAll = () => {\n const ids =\n (practisSets &&\n practisSets.items.map(\n (item: PractisSetsInterface) => item.id as number\n )) ||\n ([] as number[]);\n updateAllPractisSetsCheckedState(\n ids,\n true,\n isCheckboxPartiallySelected\n );\n setIsSelectAll(true);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n updateAllPractisSetsCheck(event.target.checked);\n setIsSelectAll(false);\n };\n\n const isMasterCheckBoxChecked =\n !!selectedPractisSets && !!selectedPractisSets.length;\n\n const isMasterCheckBoxDisabled =\n !practisSets || (practisSets && practisSets.items.length < 1);\n\n /**\n * @function checkIsRowChecked\n * @param { PractisSetsInterface } set\n * @returns { boolean }\n */\n const checkIsRowChecked = (set: PractisSetsInterface): boolean =>\n !!selectedPractisSetIds &&\n !!set.id &&\n selectedPractisSetIds.includes(set.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { PractisSetsInterface } set\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, set: PractisSetsInterface) => {\n setIsSelectAll(false);\n handlePractisSetCheck(event, set);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { PractisSetsInterface } set\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (set: PractisSetsInterface): boolean => {\n return labelsOpen === set?.['id'];\n };\n\n /**\n * @function onDeleteLabelHandler\n * @param { number } labelId\n * @param { PractisSetsInterface } set\n * @returns { void }\n */\n const onDeleteLabelHandler = useCallback(\n (labelId: number, set: PractisSetsInterface): void => {\n const practisSetItem =\n practisSets &&\n practisSets.items.find(item => item.id === set.id);\n\n if (!isEmpty(practisSetItem)) {\n deleteLibraryLabelTag(\n labelId,\n {\n entityItem: practisSetItem!,\n entityName: 'practisSet',\n },\n refreshData\n );\n }\n },\n [deleteLibraryLabelTag, practisSets, refreshData]\n );\n\n const generateDuplicatePractisSetActionList =\n useGenerateDuplicatePractisSetActionList();\n\n const duplicateLibraryBulkActionService =\n useCreateEditDuplicateLibraryBulActionService(\n 'duplicate',\n 'Practis Set',\n refreshData\n );\n\n /**\n * @function handleDuplicatePractisSet\n * @param { PractisSetsInterface } practisSet\n * @returns { void }\n */\n const handleDuplicatePractisSet = useCallback(\n (practisSet: PractisSetsInterface) => {\n const newPractisSet: NewPractisSetInfo = {\n currentPractisSetId: practisSet.id ?? 0,\n name: generateCopyOfEntityName(practisSet.name),\n description: practisSet.description,\n pacingId: practisSet?.pacing?.id ?? 0,\n labelIds: practisSet?.labels ?? [],\n scenarioCount: practisSet.scenarioCount,\n challengeCount: practisSet.challengeCount,\n };\n\n const duplicatePractisSetActionList =\n generateDuplicatePractisSetActionList(newPractisSet);\n\n !isEmpty(duplicatePractisSetActionList) &&\n duplicateLibraryBulkActionService([\n duplicatePractisSetActionList,\n ]);\n },\n [\n duplicateLibraryBulkActionService,\n generateDuplicatePractisSetActionList,\n ]\n );\n\n return (\n <MainWrapper\n subTitle=\"Library\"\n tabs={<LibraryNavigationContainer />}\n hideDivider={!!selectedPractisSets?.length}\n htmlPageTitle=\"Library - Practis\"\n dataTest=\"library\"\n >\n {loading && !isSelectAll && <LoadingComponent />}\n <TableWrapper\n tableStates={tableStates}\n data={practisSets?.items}\n selectedLabels={selectedLabels}\n cornered={selectedLabels && !!selectedLabels.length}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'library-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: practisSets?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'library-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'library-search-input',\n },\n isSelectedItemOptionsVisible:\n !isEmpty(selectedPractisSets) && !isEmpty(practisSets),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedPractisSets?.length,\n totalCount: practisSets?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: onClearSelection,\n onSelectAll: onSelectAll,\n bulkActionsConfig: {\n disabled: bulkActions.areBulkActionsDisabled(),\n disabledLabel: bulkActions.areItemsEmpty()\n ? undefined\n : \"Bulk actions can't be applied\",\n onOpenAssignLabelAction: onOpenAssignLabelAction,\n assignLabelsPermissions:\n bulkActions.isBulkActionVisible(\n PractisSetActions.ASSIGN_LABELS\n )\n ? [NEW_PERMISSIONS.ASSIGN_PRACTIS_SET_LABEL]\n : [],\n isAssignLabelsDisabled:\n bulkActions.isBulkActionDisabled(\n PractisSetActions.ASSIGN_LABELS\n ),\n onAssignLabelsSubmit: assignLabels,\n isSelectAll: isSelectAll,\n totalCount: practisSets?.count,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <LibraryFilters\n selectedStatuses={\n practisSets ? selectedStatuses : []\n }\n savedStatuses={savedStatuses}\n handleSelectStatus={onSelectStatus}\n handleSaveStatus={onSaveStatus}\n preSelectedLabels={selectedLabels || []}\n onLabelsChange={labelChangeHandler}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={250}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={\n practisSets\n ? savedStatuses.length +\n (searchParams.labelIDs\n ?.length || 0)\n : 0\n }\n disabled={tableStates.disableFilters}\n dataTest=\"library-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && practisSets?.items?.length === 0,\n noEntriesOptions: {\n icon: Box,\n text: 'No Practis Sets Yet',\n dataTest: 'library-no-practis-sets',\n },\n noSearchResultsOptions: {\n entityName: 'Practis Sets',\n dataTest: 'library-no-found-practis-sets',\n },\n noFilterResultsOptions: {\n dataTest: 'library-no-filtered-practis-sets',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: isMasterCheckBoxChecked,\n disabled: isMasterCheckBoxDisabled,\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'library-practis-sets-master-checkbox',\n },\n columns: [\n {\n title: 'Practis Sets',\n width: 25,\n ...hcName,\n disabled: tableStates.disableSorting,\n dataTest: 'library-practis-sets-title-column',\n },\n {\n title: 'Status',\n width: 11,\n ...hcStatus,\n disabled: tableStates.disableSorting,\n dataTest: 'library-practis-sets-status-column',\n },\n {\n title: 'Content',\n width: 11,\n ...hcTotalCount,\n disabled: tableStates.disableSorting,\n dataTest: 'library-practis-sets-content-column',\n },\n {\n title: 'Last Updated',\n width: 10,\n ...hcLastUpdated,\n disabled: tableStates.disableSorting,\n dataTest: 'library-practis-sets-date-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n\n rowConfig: {\n onRowClick: handleItemEdit,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (set: PractisSetsInterface) => ({\n selectedLabels: set?.labels ?? [],\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_PRACTIS_SET_LABEL,\n ],\n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, set),\n }),\n dataTest: 'library-practis-sets-item',\n\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n cellClassName: classes.customTableCellStyle,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (set: PractisSetsInterface) =>\n set?.name,\n dataTest: 'library-practis-sets-item-title',\n },\n },\n {\n fieldType: 'BADGE_FIELD',\n cellClassName: classes.customTableCellStyle,\n shouldShowEmptyCell: (\n set: PractisSetsInterface\n ) => !set?.status,\n fieldProps: {\n getBadgeFieldProps: (\n set: PractisSetsInterface\n ) => ({\n status: set?.status,\n className: classes.customTableCellStyle,\n dataTest:\n 'library-practis-sets-item-status',\n }),\n renderTitle: (set: PractisSetsInterface) =>\n libraryItemsStatusName(set?.status),\n },\n },\n\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n set: PractisSetsInterface\n ) =>\n !set?.scenarioCount && !set?.challengeCount,\n fieldProps: {\n renderTitle: (\n set: PractisSetsInterface\n ) => (\n <>\n {set.scenarioCount\n ? `${\n set.scenarioCount\n } ${plural(\n set.scenarioCount,\n 'Scenario',\n 'Scenarios'\n )}`\n : null}\n {!!set.scenarioCount &&\n !!set.challengeCount && (\n <SeparatingDot></SeparatingDot>\n )}\n {set.challengeCount\n ? `${\n set.challengeCount\n } ${plural(\n set.challengeCount,\n 'Challenge',\n 'Challenges'\n )}`\n : null}\n </>\n ),\n dataTest:\n 'library-practis-sets-item-content',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n set: PractisSetsInterface\n ) => !set?.updatedAt,\n fieldProps: {\n renderTitle: (set: PractisSetsInterface) =>\n formatDate(set?.updatedAt),\n dataTest: 'library-practis-sets-item-date',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (\n set: PractisSetsInterface\n ) => ({\n open: labelsOpen === set.id,\n toggleOpen: () =>\n handleToggleLabels(set.id),\n selectedLabels: set.labels ?? [],\n dataTest:\n 'library-practis-sets-item-labels',\n }),\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (\n set: PractisSetsInterface\n ) => (\n <PractisSetsListActions\n practisSet={set}\n actionsHelper={actionsHelper}\n onRestorePractisSet={\n onRestorePractisSet\n }\n handleItemEdit={handleItemEdit}\n handleViewPractisSet={\n handleItemEdit\n }\n handleViewPractisSetProgress={\n handleViewPractisSetProgress\n }\n handleDeletePractisSet={\n handleDeletePractisSet\n }\n onDuplicatePractisSet={\n handleDuplicatePractisSet\n }\n onArchivePractisSet={\n onArchivePractisSet\n }\n handleViewAssignUsers={\n handleViewAssignUsers\n }\n assignLabelsToLibrary={(\n addedLabelIds,\n deletedLabelIds\n ) =>\n handleUpdatePractisSetLabels(\n addedLabelIds,\n deletedLabelIds,\n set?.id ?? 0\n )\n }\n isHidden={\n !!selectedPractisSets?.length\n }\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const PractisSetsContainer: FC = () => {\n const state = useLibraryPractisSetState();\n const history = useHistory();\n const deletePractisSets = useDeletePractisSetsService();\n const archivePractisSet = useArchivePractisSetService();\n const restorePractisSet = useRestorePractisSetService();\n const searchPractisSets = useSearchPractisSetsService();\n const updatedPractisSets = useUpdatedLibraryPractisSetsState();\n const searchPractisSetsDebounced = useSearchDebounced(searchPractisSets);\n\n const labels = useLabelsState();\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const updateAllPractisSetsCheckedState =\n useUpdateAllPractisSetsCheckedStateService();\n const updateSelectedPractisSetCheckedState =\n useUpdateLibraryPractisSetsCheckedStateService();\n const updatedLabels = useUpdatedLabelsState();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const actionsHelper = usePractisSetActionsHelper();\n\n const selectedPractisSets = useMemo(\n () => selectSelectedPractisSets(state),\n [state]\n );\n\n return (\n <WithLabelsContext.Provider\n value={{ reducerName: 'libraryPractisSets' }}\n >\n <PractisSets\n onDeletePractisSets={deletePractisSets}\n onArchivePractisSet={archivePractisSet}\n onRestorePractisSet={restorePractisSet}\n history={history}\n searchPractisSets={searchPractisSetsDebounced}\n practisSets={state.data}\n loading={state.loading}\n selectedPractisSetIds={state.selectedPractisSets}\n selectedPractisSets={selectedPractisSets}\n actionsHelper={actionsHelper}\n updatedPractisSets={updatedPractisSets.data}\n selectedLabels={labels.selected}\n setAssignLabelsAction={setAssignLabelsAction}\n assignedLabels={labels.assignedLabels}\n updateAllPractisSetsCheckedState={\n updateAllPractisSetsCheckedState\n }\n updateSelectedPractisSetCheckedState={\n updateSelectedPractisSetCheckedState\n }\n updatedLabels={updatedLabels}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n />\n </WithLabelsContext.Provider>\n );\n};\n\n\nexport default PractisSetsContainer;","import { FC, useRef, useState } from 'react';\r\nimport {\r\n ActionButton,\r\n ActionItem,\r\n} from '../../../../ui/components/ActionButton';\r\nimport { isTeamLeader } from '../../../../constants/enums';\r\nimport { PopupComponent } from '../../../../ui/components/Popup';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport {\r\n calculateAssignedLabels,\r\n calculateRemovedLabels,\r\n useCalculatePreSelectedLabelsForSingleItem,\r\n} from '../../../labels/tools';\r\nimport { AssignLabels } from '../../../portableLabels/templates/AssignLabels';\r\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\r\nimport { Challenge as ChallengesInterface } from '../../../../constants/interfaces/Challenge';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { ChallengeActionsHelper } from '../../tools';\r\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\n\r\nconst ChallengesListActions: FC<{\r\n challenge: ChallengesInterface;\r\n actionsHelper: ChallengeActionsHelper;\r\n restoreChallenge: (challengeIds: number[]) => void;\r\n handleItemEdit: (challenge: ChallengesInterface) => void;\r\n handleViewChallenge: (challenge: ChallengesInterface) => void;\r\n onDuplicateChallenge: (challenge: ChallengesInterface) => void;\r\n handleDeleteChallenge: (challengeId: number) => void;\r\n archiveChallenge: (challengeId: number[]) => void;\r\n assignLabelsToLibrary: (\r\n addedLabelIds: number[],\r\n deletedLabelIds: number[]\r\n ) => void;\r\n isHidden?: boolean;\r\n}> = ({\r\n challenge,\r\n actionsHelper,\r\n restoreChallenge,\r\n handleItemEdit,\r\n handleViewChallenge,\r\n handleDeleteChallenge,\r\n onDuplicateChallenge,\r\n archiveChallenge,\r\n assignLabelsToLibrary,\r\n isHidden,\r\n}) => {\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState();\r\n const setSelectLabels = useSelectLabels();\r\n const saveLabels = useSaveLabels();\r\n const calculatePreSelectedLabels =\r\n useCalculatePreSelectedLabelsForSingleItem();\r\n const profile = useSelector(getProfileState);\r\n\r\n const handleSetPreselectedLabels = () => {\r\n const selectedLabelIds = challenge?.labels || [];\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList.data\r\n );\r\n setSelectLabels(preAssignedLabels);\r\n saveLabels();\r\n };\r\n\r\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\r\n const addedLabelIds = calculateAssignedLabels(labelIDs, labels.saved);\r\n const deletedLabelIds = calculateRemovedLabels(labelIDs, labels.saved);\r\n\r\n assignLabelsToLibrary(addedLabelIds, deletedLabelIds);\r\n };\r\n\r\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\r\n null | number | undefined\r\n >(null);\r\n\r\n const triggerRef = useRef(null);\r\n\r\n return (\r\n <span>\r\n <div ref={triggerRef}>\r\n <ActionButton\r\n customWidth={168}\r\n isHidden={isHidden}\r\n dataTest=\"library-challenges-item-menu\"\r\n >\r\n {actionsHelper.canEdit(challenge) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleItemEdit(challenge);\r\n }}\r\n dataTest=\"edit-challenge-action\"\r\n >\r\n View\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canAssignLabels(challenge) &&\r\n !!labelsList.data.items.length && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n setAssignSingleLabelOpen(challenge.id);\r\n handleSetPreselectedLabels();\r\n }}\r\n dataTest=\"assign-labels-challenge-action\"\r\n >\r\n Assign Labels\r\n </ActionItem>\r\n )}\r\n {isTeamLeader(profile?.role?.name) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewChallenge(challenge);\r\n }}\r\n dataTest=\"view-challenge-action\"\r\n >\r\n View\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canRestore(challenge) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n restoreChallenge([challenge.id!]);\r\n }}\r\n dataTest=\"restore-challenge-action\"\r\n >\r\n Restore\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canDelete(challenge) && (\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n challenge?.id &&\r\n handleDeleteChallenge(challenge.id);\r\n }}\r\n dataTest=\"delete-challenge-action\"\r\n >\r\n Delete\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canDuplicate(challenge) && (\r\n <ActionItem\r\n onClick={e => {\r\n onDuplicateChallenge(challenge);\r\n }}\r\n dataTest=\"duplicate-challenge-action\"\r\n >\r\n Duplicate\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canArchive(challenge) && (\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n archiveChallenge([challenge.id!]);\r\n }}\r\n dataTest=\"archive-challenge-action\"\r\n >\r\n Archive\r\n </ActionItem>\r\n )}\r\n </ActionButton>\r\n </div>\r\n <PopupComponent\r\n triggerRef={triggerRef}\r\n open={assignSingleLabelOpen === challenge.id}\r\n onDismiss={() => {\r\n setAssignSingleLabelOpen(null);\r\n }}\r\n >\r\n <AssignLabels\r\n onLabelsChange={handleSaveSelectedLabels}\r\n onSuccessApply={() => {\r\n setAssignSingleLabelOpen(null);\r\n }}\r\n withBorder={true}\r\n />\r\n </PopupComponent>\r\n </span>\r\n );\r\n};\r\n\r\nexport default ChallengesListActions;\r\n","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n}));\n\n","import { FC, useCallback, useEffect, useState, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { useHistory } from 'react-router';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { History } from 'history';\nimport {\n LIBRARY_STATUS,\n libraryItemsStatusName,\n useChallengeActionsHelper,\n ChallengeActionsHelper,\n ChallengeActions,\n} from '../../tools';\nimport ROUTES from '../../../../routes/routes';\nimport { pushModal } from '../../../../tools/router';\nimport {\n useArchiveChallengeService,\n useDeleteChallengesService,\n useDeleteLibraryLabelTag,\n useRestoreChallengeService,\n useSearchChallengesService,\n useUpdateAllChallengeCheckedStateService,\n useUpdateLibraryChallengeCheckedStateService,\n} from '../../store/services';\nimport {\n useLibraryChallengesState,\n useUpdatedLibraryChallengesState,\n selectSelectedChallenges,\n} from '../../store/states';\nimport { Challenge as ChallengeInterface } from '../../../../constants/interfaces/Challenge';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport LibraryNavigationContainer from '../../components/LibraryNavigation';\nimport {\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../labels/store/states';\nimport {\n ASSIGN_LABEL_OPTIONS,\n LOAD_ASSIGNED_LABELS,\n} from '../../../../constants/enums';\nimport {\n clearSelectedItemIfNotLoaded,\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabels,\n} from '../../../labels/tools';\nimport {\n useSaveUserFiltersService,\n useSetAssignLabelsActionService,\n} from '../../../labels/store/services';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { Popup } from '../../../../ui/components/Popup';\nimport { LibraryFilters } from '../../components/Filters/LibraryFilters';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport ChallengesListActions from '../../components/ListActions/ChallengesListActions';\nimport { useSessionEffect } from '../../../common';\nimport { countAppliedFiltersCount } from '../../../teams/pages/ListOfTeams/tools';\nimport {\n useAssignChallengeLabelsApi,\n useAssignedLabelsIdsApi,\n useDeleteChallengeLabelsApi,\n} from '../../../../api';\nimport { isEmpty } from 'lodash';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { useStyles } from './styles';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useFilter } from '../../../../ui/components/table-wrapper/table/TableDropdown';\nimport { useFetchAllPractisSetsService } from '../../../portablePractisSets/store/hors/withPractisSets/services';\nimport {\n useUpdateLabelsBulkActionService,\n useUpdateMultipleEntityLabelsBulkActionService,\n} from '../../../../services/GeneralBulkActionServices';\nimport { CreateNewChallengeInfo } from '../../services/LibraryBulkActionsService/types';\nimport { generateCopyOfEntityName } from '../../../../services/GeneralBulkActionServices/helpers';\nimport { useCreateEditDuplicateLibraryBulActionService } from '../../services/LibraryBulkActionsService';\nimport { useGenerateCreateDuplicateChallengeActionList } from '../../services/LibraryBulkActionsService/helpers';\nimport { UPDATE_MULTIPLE_LABEL_ACTION } from '../../../../services/GeneralBulkActionServices/constants';\nimport Document from '../../../../ui/icons/Document';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\nconst DEFAULT_FILTER_VALUE = [LIBRARY_STATUS.ACTIVE, LIBRARY_STATUS.DRAFT];\n\nconst Challenges: FC<{\n challenges?: ListResult<ChallengeInterface>;\n updatedChallenges?: ChallengeInterface;\n searchChallenges(searchParams: SearchParams): void;\n history: History<any>;\n onDeleteChallenges: (\n challengeIds: number[],\n successCallback?: () => void\n ) => Promise<unknown>;\n onArchiveChallenge: (challengeIds: number[]) => void;\n onRestoreChallenge: (challengeIds: number[]) => void;\n selectedLabels?: number[];\n selectedChallengeIds?: number[];\n selectedChallenges?: ChallengeInterface[];\n actionsHelper: ChallengeActionsHelper;\n loading?: boolean;\n setAssignLabelsAction(labels: number[]): void;\n assignedLabels?: number[];\n updateAllChallengesCheckedState(\n challengeId: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedChallengeCheckedState(challengeId: number): void;\n updatedLabels?: any;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n companyId?: number;\n}> = ({\n challenges,\n updatedChallenges,\n history,\n onDeleteChallenges,\n onArchiveChallenge,\n onRestoreChallenge,\n searchChallenges,\n selectedLabels,\n selectedChallengeIds,\n selectedChallenges,\n actionsHelper,\n setAssignLabelsAction,\n assignedLabels,\n updateAllChallengesCheckedState,\n updateSelectedChallengeCheckedState,\n updatedLabels,\n loading,\n saveGlobalLabelFilters,\n companyId\n}) => {\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n const fetchAllPractisSets = useFetchAllPractisSetsService();\n const assignLabelsToChallenges = useAssignChallengeLabelsApi();\n const deleteLabelsFromChallenges = useDeleteChallengeLabelsApi();\n const deleteLibraryLabelTag = useDeleteLibraryLabelTag();\n\n const [selectedStatuses, setSelectedStatuses] = useState<string[]>([\n 'active',\n 'draft',\n ]);\n const [savedStatuses, setSavedStatuses] = useState<string[]>([\n 'active',\n 'draft',\n ]);\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const canAccessPage = useHandleAccessPage();\n const classes = useStyles();\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [{ field: 'status', value: DEFAULT_FILTER_VALUE }],\n labelIDs: selectedLabels,\n orderBy: {\n field: 'updated_at',\n asc: false,\n },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n refreshSearchParams,\n setFilter,\n } = useSearchParamsState(initialSearchParams);\n\n const isCheckboxPartiallySelected =\n challenges &&\n challenges.items &&\n selectedChallengeIds &&\n selectedChallengeIds.length < challenges.items.length;\n\n const updateAllChallengesCheck = useCallback(\n (checked: boolean) => {\n const ids =\n (challenges &&\n challenges.items.map((item: ChallengeInterface) =>\n Number(item.id)\n )) ||\n ([] as number[]);\n updateAllChallengesCheckedState(\n ids,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [\n challenges,\n isCheckboxPartiallySelected,\n updateAllChallengesCheckedState,\n ]\n );\n\n const handleChallengeCheck = (e: any, challenge: ChallengeInterface) => {\n e.stopPropagation();\n if (!!challenge.id) {\n updateSelectedChallengeCheckedState(Number(challenge.id));\n }\n };\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchChallenges(searchParams);\n setLastRefreshed(new Date());\n setIsSelectAll(false);\n updateAllChallengesCheckedState([], false, false);\n }, [\n initialOffset,\n searchChallenges,\n searchParams,\n updateAllChallengesCheckedState,\n ]);\n\n const getDeletedLabels = useCalculateDeletedLabels();\n\n const updateMultipleChallengesLabels =\n useUpdateMultipleEntityLabelsBulkActionService(\n assignLabelsToChallenges,\n deleteLabelsFromChallenges,\n isSelectAll,\n {\n actionName: UPDATE_MULTIPLE_LABEL_ACTION,\n actionFunction: searchChallenges,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n limit: 1,\n offset: Number(challenges?.count) ?? 0,\n },\n shouldSetStore: false,\n },\n fieldName: 'searchParams.offset',\n },\n },\n refreshData\n );\n\n const assignLabels = async () => {\n if (assignedLabels && selectedChallengeIds) {\n const { preAssignedLabels } = await getAssignedLabelsIds(\n selectedChallengeIds,\n LOAD_ASSIGNED_LABELS.CHALLENGES_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.CHALLENGE,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n return calculatePreSelectedLabels(\n selectedChallengeIds,\n challenges,\n data\n );\n });\n\n const deletedLabels = getDeletedLabels(assignedLabels);\n\n const deletedLabelsFiltered = deletedLabels.filter(\n x =>\n preAssignedLabels.includes(x) ||\n preAssignedLabels.includes(-x)\n );\n const selectedLabelsFiltered = assignedLabels.filter(\n x => x > 0 && !preAssignedLabels.includes(x)\n );\n\n updateMultipleChallengesLabels(\n {\n entityName: 'challenge',\n entityIds: selectedChallengeIds,\n },\n selectedLabelsFiltered,\n deletedLabelsFiltered\n );\n }\n };\n\n const orderBy = searchParams.orderBy;\n const chName = useOrderBy('title', orderBy, setOrderBy);\n const chStatus = useOrderBy('status', orderBy, setOrderBy);\n const chUpdatedAt = useOrderBy('updated_at', orderBy, setOrderBy);\n const handleChangeEvent = useFilter('status', setFilter);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const labelChangeHandler = (ids: number[]) => {\n saveGlobalLabelFilters(ids);\n };\n\n const onSelectStatus = (status: string[]) => {\n setSelectedStatuses(status);\n };\n const onSaveStatus = (status: string[]) => {\n setSavedStatuses(status);\n };\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n countAppliedFiltersCount(searchParams) +\n (savedStatuses?.length || 0),\n itemsCount: challenges?.items.length || 0,\n });\n\n const bulkActions = useMemo(\n () => actionsHelper.getBulkActions(selectedChallenges),\n [selectedChallenges, actionsHelper]\n );\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n useSessionEffect(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchParams.companyId = companyId;\n searchChallenges(searchParams);\n }, [searchChallenges, searchParams]);\n\n useEffect(() => {\n updateAllChallengesCheckedState([], false, false);\n setIsSelectAll(false);\n }, [location.pathname, updateAllChallengesCheckedState]);\n\n useEffect(() => {\n if (updatedChallenges) refreshSearchParams();\n }, [updatedChallenges, refreshSearchParams]);\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (updatedLabels && updatedLabels.updateType === 'delete')\n refreshSearchParams();\n }, [updatedLabels, refreshSearchParams]);\n\n useEffect(() => {\n return () => updateAllChallengesCheckedState([], false, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllChallengesCheckedState([], false, false);\n }, [challenges, updateAllChallengesCheckedState]);\n\n useEffect(() => {\n if (\n selectedChallenges?.length &&\n challenges?.count &&\n selectedChallenges.length === +challenges?.count\n ) {\n setIsSelectAll(true);\n }\n }, [challenges?.count, selectedChallenges]);\n\n const handleItemEdit = (challenges: ChallengeInterface) => {\n updateAllChallengesCheckedState([], false, false);\n pushModal(\n history,\n ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE.replace(\n ':challengeId',\n challenges.id!.toString()\n )\n );\n };\n\n /**\n * @function successDeleteChallengeCallback\n * @returns { void }\n */\n const successDeleteChallengeCallback = useCallback((): void => {\n fetchAllPractisSets();\n refreshSearchParams();\n }, [fetchAllPractisSets, refreshSearchParams]);\n\n /**\n * @function onConfirmDeleteChallenge\n * @param { number } challengeIdToDelete\n * @returns { void }\n */\n const onConfirmDeleteChallenge = useCallback(\n (challengeIdToDelete: number): void => {\n onDeleteChallenges(\n [challengeIdToDelete!],\n successDeleteChallengeCallback\n );\n },\n [onDeleteChallenges, successDeleteChallengeCallback]\n );\n\n /**\n * @function handleDeleteChallenge\n * @param { number } id\n * @returns { void }\n */\n const handleDeleteChallenge = useCallback(\n (id: number) => {\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description:\n 'Are you sure you want to delete this item? This can’t be undone',\n onConfirm: () => onConfirmDeleteChallenge(id),\n });\n },\n [onConfirmDeleteChallenge, showConfirmationModalDialog]\n );\n\n useEffect(() => {\n const filteredUsers = challenges\n ? challenges.items.map(challenge => Number(challenge.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedChallengeIds,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllChallengesCheckedState(usersToClear, false);\n }\n }, [selectedChallengeIds, challenges, updateAllChallengesCheckedState]);\n\n const getAssignedLabelsIds = useAssignedLabelsIdsApi();\n\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n\n /**\n * @function onOpenAssignLabelAction\n * @returns { void }\n */\n const onOpenAssignLabelAction = (): void => {\n if (challenges && challenges.items && selectedChallengeIds) {\n getAssignedLabelsIds(\n selectedChallengeIds,\n LOAD_ASSIGNED_LABELS.CHALLENGES_SCREEN_LIBRARY,\n ASSIGN_LABEL_OPTIONS.CHALLENGE,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedChallengeIds,\n challenges,\n data\n );\n\n setAssignLabelsAction(preAssignedLabels);\n });\n }\n };\n\n useEffect(() => {\n handleChangeEvent(savedStatuses);\n }, [savedStatuses, handleChangeEvent]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_CHALLENGE]);\n }, [canAccessPage]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onClearSelection\n * @returns { void }\n */\n const onClearSelection = () => {\n updateAllChallengesCheckedState([], false, false);\n setIsSelectAll(false);\n };\n\n /**\n * @function onSelectAll\n * @returns { void }\n */\n const onSelectAll = () => {\n const ids =\n (challenges &&\n challenges.items.map((item: ChallengeInterface) =>\n Number(item.id)\n )) ||\n ([] as number[]);\n updateAllChallengesCheckedState(ids, true, isCheckboxPartiallySelected);\n setIsSelectAll(true);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n updateAllChallengesCheck(event.target.checked);\n setIsSelectAll(false);\n };\n\n const isMasterCheckBoxChecked =\n !!selectedChallengeIds && !!selectedChallengeIds.length;\n\n const isMasterCheckBoxDisabled =\n !challenges || (challenges && challenges.items.length < 1);\n\n /**\n * @function checkIsRowChecked\n * @param { ChallengeInterface } challenge\n * @returns { boolean }\n */\n const checkIsRowChecked = (challenge: ChallengeInterface): boolean =>\n !!selectedChallengeIds &&\n !!challenge.id &&\n selectedChallengeIds.includes(challenge.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { ChallengeInterface } challenge\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, challenge: ChallengeInterface) => {\n setIsSelectAll(false);\n handleChallengeCheck(event, challenge);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { ChallengeInterface } challenge\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (challenge: ChallengeInterface): boolean => {\n return labelsOpen === challenge?.['id'];\n };\n\n /**\n * @function onDeleteLabelHandler\n * @param { number } labelId\n * @param { ChallengeInterface } challenge\n * @returns { void }\n */\n const onDeleteLabelHandler = (\n labelId: number,\n challenge: ChallengeInterface\n ): void => {\n const challengeItem = challenges?.items.find(\n item => item.id === challenge.id\n );\n\n if (!isEmpty(challengeItem)) {\n deleteLibraryLabelTag(\n labelId,\n {\n entityItem: challengeItem!,\n entityName: 'challenge',\n },\n refreshData\n );\n }\n };\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToChallenges,\n deleteLabelsFromChallenges,\n refreshData\n );\n\n /**\n * @function handleUpdateChallengesLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { number } challengeId\n * @returns { void }\n */\n const handleUpdateChallengesLabels = (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n challengeId: number\n ): void => {\n updateLabelsBulkActionService(\n {\n entityName: 'challenge',\n entityId: challengeId,\n },\n addedLabelIds,\n deletedLabelIds\n );\n };\n\n const generateDuplicateChallengeActionList =\n useGenerateCreateDuplicateChallengeActionList();\n\n const duplicateLibraryBulkActionService =\n useCreateEditDuplicateLibraryBulActionService(\n 'duplicate',\n 'Challenge',\n refreshData\n );\n\n /**\n * @function handleDuplicateChallenge\n * @param { ChallengeInterface } challenge\n * @returns { void }\n */\n const handleDuplicateChallenge = useCallback(\n (challenge: ChallengeInterface) => {\n const newChallenge: CreateNewChallengeInfo = {\n title: generateCopyOfEntityName(challenge.title),\n description: challenge.description,\n sourceScenarioId: challenge?.sourceScenarioId ?? null,\n lines: challenge?.script?.lines ?? [],\n labelIds: challenge?.labels ?? [],\n tryLimit: challenge.tryLimit\n };\n\n const duplicateChallengeActionList =\n generateDuplicateChallengeActionList(newChallenge);\n\n !isEmpty(duplicateChallengeActionList) &&\n duplicateLibraryBulkActionService([\n duplicateChallengeActionList,\n ]);\n },\n [\n duplicateLibraryBulkActionService,\n generateDuplicateChallengeActionList,\n ]\n );\n\n return (\n <MainWrapper\n subTitle=\"Library\"\n tabs={<LibraryNavigationContainer />}\n hideDivider={!!selectedChallenges?.length}\n htmlPageTitle=\"Library - Practis\"\n dataTest=\"library\"\n >\n {loading && !isSelectAll && <LoadingComponent />}\n <TableWrapper\n tableStates={tableStates}\n data={challenges?.items}\n cornered={selectedLabels && !!selectedLabels.length}\n selectedLabels={selectedLabels}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'library-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: challenges?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'library-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'library-search-input',\n },\n isSelectedItemOptionsVisible:\n !isEmpty(selectedChallenges) && !isEmpty(challenges),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedChallenges?.length,\n totalCount: challenges?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: onClearSelection,\n onSelectAll: onSelectAll,\n bulkActionsConfig: {\n disabled: bulkActions.areBulkActionsDisabled(),\n disabledLabel: bulkActions.areItemsEmpty()\n ? undefined\n : \"Bulk actions can't be applied\",\n assignLabelsPermissions:\n bulkActions.isBulkActionVisible(\n ChallengeActions.ASSIGN_LABELS\n )\n ? [NEW_PERMISSIONS.ASSIGN_CHALLENGE_LABEL]\n : [],\n isAssignLabelsDisabled:\n bulkActions.isBulkActionDisabled(\n ChallengeActions.ASSIGN_LABELS\n ),\n onOpenAssignLabelAction: onOpenAssignLabelAction,\n onAssignLabelsSubmit: assignLabels,\n isSelectAll: isSelectAll,\n totalCount: challenges?.count,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <LibraryFilters\n selectedStatuses={\n challenges ? selectedStatuses : []\n }\n savedStatuses={savedStatuses}\n handleSelectStatus={onSelectStatus}\n handleSaveStatus={onSaveStatus}\n preSelectedLabels={selectedLabels || []}\n onLabelsChange={labelChangeHandler}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={250}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={\n challenges\n ? savedStatuses.length +\n (searchParams.labelIDs\n ?.length || 0)\n : 0\n }\n disabled={tableStates.disableFilters}\n dataTest=\"library-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && challenges?.items?.length === 0,\n noEntriesOptions: {\n icon: Document,\n text: 'No Challenges Yet',\n dataTest: 'library-no-challenges',\n },\n noSearchResultsOptions: {\n entityName: 'Challenges',\n dataTest: 'library-no-found-challenges',\n },\n noFilterResultsOptions: {\n dataTest: 'library-no-filtered-challenges',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: isMasterCheckBoxChecked,\n disabled: isMasterCheckBoxDisabled,\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'library-challenges-master-checkbox',\n },\n columns: [\n {\n title: 'Challenges',\n width: 25,\n ...chName,\n disabled: tableStates.disableSorting,\n dataTest: 'library-challenges-title-column',\n },\n {\n title: 'Status',\n width: 20,\n ...chStatus,\n disabled: tableStates.disableSorting,\n dataTest: 'library-challenges-status-column',\n },\n {\n title: 'Last Updated',\n width: 20,\n ...chUpdatedAt,\n disabled: tableStates.disableSorting,\n dataTest: 'library-challenges-date-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n rowConfig: {\n onRowClick: handleItemEdit,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n dataTest: 'library-challenges-item',\n\n getLabelTagsProps: (challenge: ChallengeInterface) => ({\n selectedLabels: challenge.labels ?? [],\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_CHALLENGE_LABEL,\n ],\n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, challenge),\n }),\n\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n cellClassName: classes.customTableCellStyle,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (\n challenge: ChallengeInterface\n ) => challenge?.title,\n dataTest: 'library-challenges-item-title',\n },\n },\n {\n fieldType: 'BADGE_FIELD',\n cellClassName: classes.customTableCellStyle,\n shouldShowEmptyCell: (\n challenge: ChallengeInterface\n ) => !challenge?.status,\n fieldProps: {\n getBadgeFieldProps: (\n challenge: ChallengeInterface\n ) => ({\n status: challenge?.status,\n className: classes.customTableCellStyle,\n dataTest:\n 'library-challenges-item-status',\n }),\n renderTitle: (\n challenge: ChallengeInterface\n ) =>\n libraryItemsStatusName(\n challenge?.status\n ),\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n challenge: ChallengeInterface\n ) => !challenge?.updatedAt,\n fieldProps: {\n renderTitle: (\n challenge: ChallengeInterface\n ) => formatDate(challenge.updatedAt),\n dataTest: 'library-challenges-item-date',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (\n challenge: ChallengeInterface\n ) => ({\n open: labelsOpen === challenge.id,\n toggleOpen: () =>\n handleToggleLabels(\n Number(challenge.id)\n ),\n selectedLabels: challenge.labels ?? [],\n dataTest:\n 'library-challenges-item-labels',\n }),\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (\n challenge: ChallengeInterface\n ) => (\n <ChallengesListActions\n challenge={challenge}\n actionsHelper={actionsHelper}\n restoreChallenge={\n onRestoreChallenge\n }\n handleItemEdit={handleItemEdit}\n handleViewChallenge={handleItemEdit}\n handleDeleteChallenge={\n handleDeleteChallenge\n }\n onDuplicateChallenge={\n handleDuplicateChallenge\n }\n archiveChallenge={\n onArchiveChallenge\n }\n assignLabelsToLibrary={(\n addedLabelIds,\n deletedLabelIds\n ) =>\n handleUpdateChallengesLabels(\n addedLabelIds,\n deletedLabelIds,\n challenge?.id ?? 0\n )\n }\n isHidden={\n !!selectedChallenges?.length\n }\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const ChallengesContainer: FC = () => {\n const state = useLibraryChallengesState();\n const history = useHistory();\n const deleteChallenges = useDeleteChallengesService();\n const archiveChallenge = useArchiveChallengeService();\n const restoreChallenge = useRestoreChallengeService();\n const searchChallenges = useSearchChallengesService();\n const updatedChallenges = useUpdatedLibraryChallengesState();\n const searchChallengesDebounced = useSearchDebounced(searchChallenges);\n\n const labels = useLabelsState();\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const updateAllChallengesCheckedState =\n useUpdateAllChallengeCheckedStateService();\n const updateSelectedChallengeCheckedState =\n useUpdateLibraryChallengeCheckedStateService();\n const updatedLabels = useUpdatedLabelsState();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const actionsHelper = useChallengeActionsHelper();\n const profile = useSelector(getProfileState);\n\n const selectedChallenges = useMemo(\n () => selectSelectedChallenges(state),\n [state]\n );\n\n return (\n <WithLabelsContext.Provider\n value={{ reducerName: 'libraryChallenges' }}\n >\n <Challenges\n onDeleteChallenges={deleteChallenges}\n onArchiveChallenge={archiveChallenge}\n onRestoreChallenge={restoreChallenge}\n history={history}\n searchChallenges={searchChallengesDebounced}\n challenges={state.data}\n loading={state.loading}\n selectedChallengeIds={state.selectedChallenges}\n selectedChallenges={selectedChallenges}\n actionsHelper={actionsHelper}\n updatedChallenges={updatedChallenges.data}\n selectedLabels={labels.selected}\n setAssignLabelsAction={setAssignLabelsAction}\n assignedLabels={labels.assignedLabels}\n updateAllChallengesCheckedState={\n updateAllChallengesCheckedState\n }\n updateSelectedChallengeCheckedState={\n updateSelectedChallengeCheckedState\n }\n updatedLabels={updatedLabels}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n companyId={profile?.companyId}\n />\n </WithLabelsContext.Provider>\n );\n};\n\n\n\nexport default ChallengesContainer;","import React from 'react';\nimport Scenarios from './Scenarios/Scenarios';\nimport PractisSets from './PractisSets/PractisSets';\nimport Challenges from './Challenges/Challenges';\nimport { Switch, Redirect } from 'react-router-dom';\nimport PrivateRoute from '../../../routes/PrivateRouter';\nimport ROUTES from '../../../routes/routes';\n\nconst Library = () => (\n <Switch>\n <Redirect\n from={ROUTES.LIBRARY}\n exact\n to={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL}\n />\n <PrivateRoute\n path={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL}\n component={PractisSets}\n />\n <PrivateRoute\n path={ROUTES.LIBRARY_SETTINGS.SCENARIOS.ALL}\n component={Scenarios}\n />\n <PrivateRoute\n path={ROUTES.LIBRARY_SETTINGS.CHALLENGES.ALL}\n component={Challenges}\n />\n </Switch>\n);\n\nexport default Library;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport LandingWrapper from '../../ui/wrapper/LandingWrapper/LandingWrapper';\n\n\nconst TermsContainer = styled.div`\n margin: 50px 10%;\n`;\n\nconst ContentArea = styled.div``;\n\nclass TermsPage extends Component {\n render() {\n return (\n <LandingWrapper>\n <TermsContainer>\n <ContentArea>\n <h1>Terms and Conditions</h1>\n\n <p>Last updated: February 21, 2020</p>\n\n <p>\n Please read these terms and conditions carefully\n before using Our Service.\n </p>\n\n <h1>Interpretation and Definitions</h1>\n <h2>Interpretation</h2>\n <p>\n The words of which the initial letter is capitalized\n have meanings defined under the following\n conditions.\n </p>\n <p>\n The following definitions shall have the same\n meaning regardless of whether they appear in\n singular or in plural.\n </p>\n\n <h2>Definitions</h2>\n <p>For the purposes of these Terms and Conditions:</p>\n <ul>\n <li>\n <strong>Application</strong> means the software\n program provided by the Company downloaded by\n You on any electronic device, named Practis\n </li>{' '}\n <li>\n <strong>Application Store</strong> means the\n digital distribution service operated and\n developed by Apple Inc. (Apple App Store) or\n Google Inc. (Google Play Store) in which the\n Application has been downloaded.\n </li>{' '}\n <li>\n <strong>Affiliate</strong> means an entity that\n controls, is controlled by or is under common\n control with a party, where \"control\" means\n ownership of 50% or more of the shares, equity\n interest or other securities entitled to vote\n for election of directors or other managing\n authority.\n </li>\n <li>\n <strong>Account</strong> means a unique account\n created for You to access our Service or parts\n of our Service.\n </li>{' '}\n <li>\n <strong>Company</strong> (referred to as either\n \"the Company\", \"We\", \"Us\" or \"Our\" in this\n Agreement) refers to Mantra Systems, Inc., 2633\n Lincoln Boulevard, #925 Santa Monica, CA 90405.\n </li>\n <li>\n <strong>Content</strong> refers to content such\n as text, images, or other information that can\n be posted, uploaded, linked to or otherwise made\n available by You, regardless of the form of that\n content.\n </li>{' '}\n <li>\n <strong>Country</strong> refers to: California,\n United States\n </li>\n <li>\n <strong>Device</strong> means any device that\n can access the Service such as a computer, a\n cellphone or a digital tablet.\n </li>{' '}\n <li>\n <strong>Feedback</strong> means feedback,\n innovations or suggestions sent by You regarding\n the attributes, performance or features of our\n Service.\n </li>{' '}\n <li>\n <strong>Service</strong> refers to the\n Application.\n </li>\n <li>\n <strong>Terms and Conditions</strong> (also\n referred as \"Terms\") mean these Terms and\n Conditions that form the entire agreement\n between You and the Company regarding the use of\n the Service.\n </li>\n <li>\n <strong>\n Third-party Social Media Service\n </strong>{' '}\n means any services or content (including data,\n information, products or services) provided by a\n third-party that may be displayed, included or\n made available by the Service.\n </li>\n <li>\n <strong>You</strong> means the individual\n accessing or using the Service, or the company,\n or other legal entity on behalf of which such\n individual is accessing or using the Service, as\n applicable.\n </li>\n </ul>\n\n <h1>Acknowledgement</h1>\n <p>\n These are the Terms and Conditions governing the use\n of this Service and the agreement that operates\n between You and the Company. These Terms and\n Conditions set out the rights and obligations of all\n users regarding the use of the Service.\n </p>\n <p>\n Your access to and use of the Service is conditioned\n on Your acceptance of and compliance with these\n Terms and Conditions. These Terms and Conditions\n apply to all visitors, users and others who access\n or use the Service.\n </p>\n <p>\n By accessing or using the Service You agree to be\n bound by these Terms and Conditions. If You disagree\n with any part of these Terms and Conditions then You\n may not access the Service.\n </p>\n <p>\n Your access to and use of the Service is also\n conditioned on Your acceptance of and compliance\n with the Privacy Policy of the Company. Our Privacy\n Policy describes Our policies and procedures on the\n collection, use and disclosure of Your personal\n information when You use the Application or the\n Website and tells You about Your privacy rights and\n how the law protects You. Please read Our Privacy\n Policy carefully before using Our Service.\n </p>\n\n <h1>User Accounts</h1>\n <p>\n When You create an account with Us, You must provide\n Us information that is accurate, complete, and\n current at all times. Failure to do so constitutes a\n breach of the Terms, which may result in immediate\n termination of Your account on Our Service.\n </p>\n <p>\n You are responsible for safeguarding the password\n that You use to access the Service and for any\n activities or actions under Your password, whether\n Your password is with Our Service or a Third-Party\n Social Media Service.\n </p>\n <p>\n You agree not to disclose Your password to any third\n party. You must notify Us immediately upon becoming\n aware of any breach of security or unauthorized use\n of Your account.\n </p>\n <p>\n You may not use as a username the name of another\n person or entity or that is not lawfully available\n for use, a name or trademark that is subject to any\n rights of another person or entity other than You\n without appropriate authorization, or a name that is\n otherwise offensive, vulgar or obscene.\n </p>\n\n <h1>Content</h1>\n <h2>Your Right to Post Content</h2>\n <p>\n Our Service allows You to post Content. You are\n responsible for the Content that You post to the\n Service, including its legality, reliability, and\n appropriateness.\n </p>\n <p>\n By posting Content to the Service, You grant Us the\n right and license to use, modify, publicly perform,\n publicly display, reproduce, and distribute such\n Content on and through the Service. You retain any\n and all of Your rights to any Content You submit,\n post or display on or through the Service and You\n are responsible for protecting those rights. You\n agree that this license includes the right for Us to\n make Your Content available to other users of the\n Service, who may also use Your Content subject to\n these Terms.\n </p>\n <p>\n You represent and warrant that: (i) the Content is\n Yours (You own it) or You have the right to use it\n and grant Us the rights and license as provided in\n these Terms, and (ii) the posting of Your Content on\n or through the Service does not violate the privacy\n rights, publicity rights, copyrights, contract\n rights or any other rights of any person.\n </p>\n\n <h2>Content Restrictions</h2>\n <p>\n The Company is not responsible for the content of\n the Service's users. You expressly understand and\n agree that You are solely responsible for the\n Content and for all activity that occurs under your\n account, whether done so by You or any third person\n using Your account.\n </p>\n <p>\n You may not transmit any Content that is unlawful,\n offensive, upsetting, intended to disgust,\n threatening, libelous, defamatory, obscene or\n otherwise objectionable. Examples of such\n objectionable Content include, but are not limited\n to, the following:\n </p>\n <ul>\n <li>Unlawful or promoting unlawful activity.</li>\n <li>\n Defamatory, discriminatory, or mean-spirited\n content, including references or commentary\n about religion, race, sexual orientation,\n gender, national/ethnic origin, or other\n targeted groups.\n </li>\n <li>\n Spam, machine – or randomly – generated,\n constituting unauthorized or unsolicited\n advertising, chain letters, any other form of\n unauthorized solicitation, or any form of\n lottery or gambling.\n </li>\n <li>\n Containing or installing any viruses, worms,\n malware, trojan horses, or other content that is\n designed or intended to disrupt, damage, or\n limit the functioning of any software, hardware\n or telecommunications equipment or to damage or\n obtain unauthorized access to any data or other\n information of a third person.\n </li>\n <li>\n Infringing on any proprietary rights of any\n party, including patent, trademark, trade\n secret, copyright, right of publicity or other\n rights.\n </li>\n <li>\n Impersonating any person or entity including the\n Company and its employees or representatives.\n </li>\n <li>Violating the privacy of any third person.</li>\n <li>False information and features.</li>\n </ul>\n <p>\n The Company reserves the right, but not the\n obligation, to, in its sole discretion, determine\n whether or not any Content is appropriate and\n complies with this Terms, refuse or remove this\n Content. The Company further reserves the right to\n make formatting and edits and change the manner any\n Content. The Company can also limit or revoke the\n use of the Service if You post such objectionable\n Content.\n </p>\n <p>\n As the Company cannot control all content posted by\n users and/or third parties on the Service, you agree\n to use the Service at your own risk. You understand\n that by using the Service You may be exposed to\n content that You may find offensive, indecent,\n incorrect or objectionable, and You agree that under\n no circumstances will the Company be liable in any\n way for any content, including any errors or\n omissions in any content, or any loss or damage of\n any kind incurred as a result of your use of any\n content.\n </p>\n\n <h2>Content Backups</h2>\n <p>\n Although regular backups of Content are performed,\n the Company do not guarantee there will be no loss\n or corruption of data.\n </p>\n <p>\n Corrupt or invalid backup points may be caused by,\n without limitation, Content that is corrupted prior\n to being backed up or that changes during the time a\n backup is performed.\n </p>\n <p>\n The Company will provide support and attempt to\n troubleshoot any known or discovered issues that may\n affect the backups of Content. But You acknowledge\n that the Company has no liability related to the\n integrity of Content or the failure to successfully\n restore Content to a usable state.\n </p>\n <p>\n You agree to maintain a complete and accurate copy\n of any Content in a location independent of the\n Service.\n </p>\n\n <h1>Copyright Policy</h1>\n <h2>Intellectual Property Infringement</h2>\n <p>\n We respect the intellectual property rights of\n others. It is Our policy to respond to any claim\n that Content posted on the Service infringes a\n copyright or other intellectual property\n infringement of any person.\n </p>\n <p>\n If You are a copyright owner, or authorized on\n behalf of one, and You believe that the copyrighted\n work has been copied in a way that constitutes\n copyright infringement that is taking place through\n the Service, You must submit Your notice in writing\n to the attention of our copyright agent via email at\n dmca@gopractis.com and include in Your notice a\n detailed description of the alleged infringement.\n </p>\n <p>\n You may be held accountable for damages (including\n costs and attorneys' fees) for misrepresenting that\n any Content is infringing Your copyright.\n </p>\n\n <h2>\n DMCA Notice and DMCA Procedure for Copyright\n Infringement Claims\n </h2>\n <p>\n You may submit a notification pursuant to the\n Digital Millennium Copyright Act (DMCA) by providing\n our Copyright Agent with the following information\n in writing (see 17 U.S.C 512(c)(3) for further\n detail):\n </p>\n <ul>\n <li>\n An electronic or physical signature of the\n person authorized to act on behalf of the owner\n of the copyright's interest.\n </li>\n <li>\n A description of the copyrighted work that You\n claim has been infringed, including the URL\n (i.e., web page address) of the location where\n the copyrighted work exists or a copy of the\n copyrighted work.\n </li>\n <li>\n Identification of the URL or other specific\n location on the Service where the material that\n You claim is infringing is located.\n </li>\n <li>\n Your address, telephone number, and email\n address.\n </li>\n <li>\n A statement by You that You have a good faith\n belief that the disputed use is not authorized\n by the copyright owner, its agent, or the law.\n </li>\n <li>\n A statement by You, made under penalty of\n perjury, that the above information in Your\n notice is accurate and that You are the\n copyright owner or authorized to act on the\n copyright owner's behalf.\n </li>\n </ul>\n <p>\n You can contact our copyright agent via email at\n dmca@gopractis.com.\n </p>\n <p>\n Upon receipt of a notification, the Company will\n take whatever action, in its sole discretion, it\n deems appropriate, including removal of the\n challenged content from the Service.\n </p>\n\n <h1>Intellectual Property</h1>\n <p>\n The Service and its original content (excluding\n Content provided by You or other users), features\n and functionality are and will remain the exclusive\n property of the Company and its licensors.\n </p>\n <p>\n The Service is protected by copyright, trademark,\n and other laws of both the Country and foreign\n countries.\n </p>\n <p>\n Our trademarks and trade dress may not be used in\n connection with any product or service without the\n prior written consent of the Company.\n </p>\n\n <h1>Your Feedback to Us</h1>\n <p>\n You assign all rights, title and interest in any\n Feedback You provide the Company. If for any reason\n such assignment is ineffective, You agree to grant\n the Company a non-exclusive, perpetual, irrevocable,\n royalty free, worldwide right and licence to use,\n reproduce, disclose, sub-licence, distribute, modify\n and exploit such Feedback without restriction.\n </p>\n\n <h1>Links to Other Websites</h1>\n <p>\n Our Service may contain links to third-party web\n sites or services that are not owned or controlled\n by the Company.\n </p>\n <p>\n The Company has no control over, and assumes no\n responsibility for, the content, privacy policies,\n or practices of any third party web sites or\n services. You further acknowledge and agree that the\n Company shall not be responsible or liable, directly\n or indirectly, for any damage or loss caused or\n alleged to be caused by or in connection with the\n use of or reliance on any such content, goods or\n services available on or through any such web sites\n or services.\n </p>\n <p>\n We strongly advise You to read the terms and\n conditions and privacy policies of any third-party\n web sites or services that You visit.\n </p>\n\n <h1>Termination</h1>\n <p>\n We may terminate or suspend Your Account\n immediately, without prior notice or liability, for\n any reason whatsoever, including without limitation\n if You breach these Terms and Conditions.\n </p>\n <p>\n Upon termination, Your right to use the Service will\n cease immediately. If You wish to terminate Your\n Account, You may simply discontinue using the\n Service.\n </p>\n\n <h1>Limitation of Liability</h1>\n <p>\n Notwithstanding any damages that You might incur,\n the entire liability of the Company and any of its\n suppliers under any provision of this Terms and Your\n exclusive remedy for all of the foregoing shall be\n limited to the amount actually paid by You through\n the Service or 100 USD if You haven't purchased\n anything through the Service.\n </p>\n <p>\n To the maximum extent permitted by applicable law,\n in no event shall the Company or its suppliers be\n liable for any special, incidental, indirect, or\n consequential damages whatsoever (including, but not\n limited to, damages for loss of profits, loss of\n data or other information, for business\n interruption, for personal injury, loss of privacy\n arising out of or in any way related to the use of\n or inability to use the Service, third-party\n software and/or third-party hardware used with the\n Service, or otherwise in connection with any\n provision of this Terms), even if the Company or any\n supplier has been advised of the possibility of such\n damages and even if the remedy fails of its\n essential purpose.\n </p>\n <p>\n Some states do not allow the exclusion of implied\n warranties or limitation of liability for incidental\n or consequential damages, which means that some of\n the above limitations may not apply. In these\n states, each party's liability will be limited to\n the greatest extent permitted by law.\n </p>\n\n <h1>\"AS IS\" and \"AS AVAILABLE\" Disclaimer</h1>\n <p>\n The Service is provided to You \"AS IS\" and \"AS\n AVAILABLE\" and with all faults and defects without\n warranty of any kind. To the maximum extent\n permitted under applicable law, the Company, on its\n own behalf and on behalf of its Affiliates and its\n and their respective licensors and service\n providers, expressly disclaims all warranties,\n whether express, implied, statutory or otherwise,\n with respect to the Service, including all implied\n warranties of merchantability, fitness for a\n particular purpose, title and non-infringement, and\n warranties that may arise out of course of dealing,\n course of performance, usage or trade practice.\n Without limitation to the foregoing, the Company\n provides no warranty or undertaking, and makes no\n representation of any kind that the Service will\n meet Your requirements, achieve any intended\n results, be compatible or work with any other\n software, applications, systems or services, operate\n without interruption, meet any performance or\n reliability standards or be error free or that any\n errors or defects can or will be corrected.\n </p>\n <p>\n Without limiting the foregoing, neither the Company\n nor any of the company's provider makes any\n representation or warranty of any kind, express or\n implied: (i) as to the operation or availability of\n the Service, or the information, content, and\n materials or products included thereon; (ii) that\n the Service will be uninterrupted or error-free;\n (iii) as to the accuracy, reliability, or currency\n of any information or content provided through the\n Service; or (iv) that the Service, its servers, the\n content, or e-mails sent from or on behalf of the\n Company are free of viruses, scripts, trojan horses,\n worms, malware, timebombs or other harmful\n components.\n </p>\n <p>\n Some jurisdictions do not allow the exclusion of\n certain types of warranties or limitations on\n applicable statutory rights of a consumer, so some\n or all of the above exclusions and limitations may\n not apply to You. But in such a case the exclusions\n and limitations set forth in this section shall be\n applied to the greatest extent enforceable under\n applicable law.\n </p>\n\n <h1>Governing Law</h1>\n <p>\n The laws of the Country, excluding its conflicts of\n law rules, shall govern this Terms and Your use of\n the Service. Your use of the Application may also be\n subject to other local, state, national, or\n international laws.\n </p>\n\n <h1>Disputes Resolution</h1>\n <p>\n If You have any concern or dispute about the\n Service, You agree to first try to resolve the\n dispute informally by contacting the Company.\n </p>\n\n <h1>For European Union (EU) Users</h1>\n <p>\n If You are a European Union consumer, you will\n benefit from any mandatory provisions of the law of\n the country in which you are resident in.\n </p>\n\n <h1>United States Legal Compliance</h1>\n <p>\n You represent and warrant that (i) You are not\n located in a country that is subject to the United\n States government embargo, or that has been\n designated by the United States government as a\n “terrorist supporting†country, and (ii) You are not\n listed on any United States government list of\n prohibited or restricted parties.\n </p>\n\n <h1>Severability and Waiver</h1>\n <h2>Severability</h2>\n <p>\n If any provision of these Terms is held to be\n unenforceable or invalid, such provision will be\n changed and interpreted to accomplish the objectives\n of such provision to the greatest extent possible\n under applicable law and the remaining provisions\n will continue in full force and effect.\n </p>\n\n <h2>Waiver</h2>\n <p>\n Except as provided herein, the failure to exercise a\n right or to require performance of an obligation\n under this Terms shall not effect a party's ability\n to exercise such right or require such performance\n at any time thereafter nor shall be the waiver of a\n breach constitute a waiver of any subsequent breach.\n </p>\n\n <h1>Translation Interpretation</h1>\n <p>\n These Terms and Conditions may have been translated\n if We have made them available to You on our\n Service.\n </p>\n <p>\n You agree that the original English text shall\n prevail in the case of a dispute.\n </p>\n\n <h1>Changes to These Terms and Conditions</h1>\n <p>\n We reserve the right, at Our sole discretion, to\n modify or replace these Terms at any time. If a\n revision is material We will make reasonable efforts\n to provide at least 30 days' notice prior to any new\n terms taking effect. What constitutes a material\n change will be determined at Our sole discretion.\n </p>\n <p>\n By continuing to access or use Our Service after\n those revisions become effective, You agree to be\n bound by the revised terms. If You do not agree to\n the new terms, in whole or in part, please stop\n using the website and the Service.\n </p>\n\n <h1>Contact Us</h1>\n <p>\n If you have any questions about these Terms and\n Conditions, You can contact us:\n </p>\n\n <ul>\n <li>By email: support@gopractis.com</li>\n </ul>\n </ContentArea>\n </TermsContainer>\n </LandingWrapper>\n );\n }\n}\n\nexport default TermsPage;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport LandingWrapper from '../../ui/wrapper/LandingWrapper/LandingWrapper';\n\n\nconst PrivacyContainer = styled.div`\n margin: 50px 10%;\n`;\n\nconst ContentArea = styled.div``;\n\nclass PrivacyPage extends Component {\n render() {\n return (\n <LandingWrapper>\n <PrivacyContainer>\n <ContentArea>\n <h1>Privacy Policy</h1>\n\n <p>Last updated: February 21, 2020</p>\n\n <p>\n This Privacy Policy describes Our policies and\n procedures on the collection, use and disclosure of\n Your information when You use the Service and tells\n You about Your privacy rights and how the law\n protects You.\n </p>\n\n <p>\n We use Your Personal data to provide and improve the\n Service. By using the Service, You agree to the\n collection and use of information in accordance with\n this Privacy Policy.\n </p>\n\n <h1>Interpretation and Definitions</h1>\n <h2>Interpretation</h2>\n <p>\n The words of which the initial letter is capitalized\n have meanings defined under the following\n conditions.\n </p>\n <p>\n The following definitions shall have the same\n meaning regardless of whether they appear in\n singular or in plural.\n </p>\n\n <h2>Definitions</h2>\n <p>For the purposes of this Privacy Policy:</p>\n <ul>\n <li>\n <p>\n <strong>You</strong> means the individual\n accessing or using the Service, or the\n company, or other legal entity on behalf of\n which such individual is accessing or using\n the Service, as applicable.\n </p>\n <p>\n Under GDPR (General Data Protection\n Regulation), You can be referred to as the\n Data Subject or as the User as you are the\n individual using the Service.\n </p>{' '}\n </li>\n <li>\n <p>\n <strong>Company</strong> (referred to as\n either \"the Company\", \"We\", \"Us\" or \"Our\" in\n this Agreement) refers to Mantra Systems,\n Inc., 2633 Lincoln Boulevard #925 Santa\n Monica, CA 90405.\n </p>\n <p>\n For the purpose of the GDPR, the Company is\n the Data Controller.\n </p>{' '}\n </li>\n <li>\n <strong>Application</strong> means the software\n program provided by the Company downloaded by\n You on any electronic device, named Practis\n </li>{' '}\n <li>\n <strong>Affiliate</strong> means an entity that\n controls, is controlled by or is under common\n control with a party, where \"control\" means\n ownership of 50% or more of the shares, equity\n interest or other securities entitled to vote\n for election of directors or other managing\n authority.\n </li>\n <li>\n <strong>Account</strong> means a unique account\n created for You to access our Service or parts\n of our Service.\n </li>\n <li>\n <strong>Service</strong> refers to the\n Application.\n </li>\n <li>\n <strong>Country</strong> refers to: California,\n United States\n </li>\n <li>\n <p>\n <strong>Service Provider</strong> means any\n natural or legal person who processes the\n data on behalf of the Company. It refers to\n third-party companies or individuals\n employed by the Company to facilitate the\n Service, to provide the Service on behalf of\n the Company, to perform services related to\n the Service or to assist the Company in\n analyzing how the Service is used.\n </p>\n <p>\n For the purpose of the GDPR, Service\n Providers are considered Data Processors.\n </p>{' '}\n </li>\n <li>\n <strong>\n Third-party Social Media Service\n </strong>{' '}\n refers to any website or any social network\n website through which a User can log in or\n create an account to use the Service.\n </li>\n <li>\n <p>\n <strong>Personal Data</strong> is any\n information that relates to an identified or\n identifiable individual.\n </p>\n <p>\n For the purposes for GDPR, Personal Data\n means any information relating to You such\n as a name, an identification number,\n location data, online identifier or to one\n or more factors specific to the physical,\n physiological, genetic, mental, economic,\n cultural or social identity.\n </p>{' '}\n <p>\n For the purposes of the CCPA, Personal Data\n means any information that identifies,\n relates to, describes or is capable of being\n associated with, or could reasonably be\n linked, directly or indirectly, with You.\n </p>{' '}\n </li>\n <li>\n <strong>Device</strong> means any device that\n can access the Service such as a computer, a\n cellphone or a digital tablet.\n </li>{' '}\n <li>\n <strong>Usage Data</strong> refers to data\n collected automatically, either generated by the\n use of the Service or from the Service\n infrastructure itself (for example, the duration\n of a page visit).\n </li>\n <li>\n <strong>Data Controller</strong>, for the\n purposes of the GDPR (General Data Protection\n Regulation), refers to the Company as the legal\n person which alone or jointly with others\n determines the purposes and means of the\n processing of Personal Data.\n </li>{' '}\n <li>\n <strong>Do Not Track</strong> (DNT) is a concept\n that has been promoted by US regulatory\n authorities, in particular the U.S. Federal\n Trade Commission (FTC), for the Internet\n industry to develop and implement a mechanism\n for allowing internet users to control the\n tracking of their online activities across\n websites.\n </li>{' '}\n <li>\n <strong>Business</strong>, for the purpose of\n the CCPA (California Consumer Privacy Act),\n refers to the Company as the legal entity that\n collects Consumers' personal information and\n determines the purposes and means of the\n processing of Consumers' personal information,\n or on behalf of which such information is\n collected and that alone, or jointly with\n others, determines the purposes and means of the\n processing of consumers' personal information,\n that does business in the State of California.\n </li>\n <li>\n <strong>Consumer</strong>, for the purpose of\n the CCPA (California Consumer Privacy Act),\n means a natural person who is a California\n resident. A resident, as defined in the law,\n includes (1) every individual who is in the USA\n for other than a temporary or transitory\n purpose, and (2) every individual who is\n domiciled in the USA who is outside the USA for\n a temporary or transitory purpose.\n </li>\n <li>\n <strong>Sale</strong>, for the purpose of the\n CCPA (California Consumer Privacy Act), means\n selling, renting, releasing, disclosing,\n disseminating, making available, transferring,\n or otherwise communicating orally, in writing,\n or by electronic or other means, a Consumer’s\n Personal information to another business or a\n third party for monetary or other valuable\n consideration.\n </li>\n </ul>\n\n <h1>Collecting and Using Your Personal Data</h1>\n <h2>Types of Data Collected</h2>\n\n <h3>Personal Data</h3>\n <p>\n While using Our Service, We may ask You to provide\n Us with certain personally identifiable information\n that can be used to contact or identify You.\n Personally identifiable information may include, but\n is not limited to:\n </p>\n <ul>\n <li>Email address</li>{' '}\n <li>First name and last name</li>{' '}\n <li>Usage Data</li>\n </ul>\n\n <h3>Usage Data</h3>\n <p>\n Usage Data is collected automatically when using the\n Service.\n </p>\n <p>\n Usage Data may include information such as Your\n Device's Internet Protocol address (e.g. IP\n address), browser type, browser version, the pages\n of our Service that You visit, the time and date of\n Your visit, the time spent on those pages, unique\n device identifiers and other diagnostic data.\n </p>\n <p>\n When You access the Service by or through a mobile\n device, We may collect certain information\n automatically, including, but not limited to, the\n type of mobile device You use, Your mobile device\n unique ID, the IP address of Your mobile device,\n Your mobile operating system, the type of mobile\n Internet browser You use, unique device identifiers\n and other diagnostic data.\n </p>\n <p>\n We may also collect information that Your browser\n sends whenever You visit our Service or when You\n access the Service by or through a mobile device.\n </p>\n\n <h3>\n Information Collected while Using the Application\n </h3>\n <p>\n While using Our Application, in order to provide\n features of Our Application, We may collect, with\n your prior permission:\n </p>\n <ul>\n <li>\n Pictures and other information from your\n Device's camera and photo library\n </li>\n </ul>\n <p>\n We use this information to provide features of Our\n Service, to improve and customize Our Service. The\n information may be uploaded to the Company's servers\n and/or a Service Provider's server or it be simply\n stored on Your device.\n </p>\n <p>\n You can enable or disable access to this information\n at any time, through Your Device settings. You can\n also enable or disable location services when You\n use Our Service at any time, through Your Device\n settings.\n </p>\n\n <h2>Use of Your Personal Data</h2>\n <p>\n The Company may use Personal Data for the following\n purposes:\n </p>\n <ul>\n <li>\n <strong>\n To provide and maintain our Service\n </strong>\n , including to monitor the usage of our Service.\n </li>\n <li>\n <strong>To manage Your Account:</strong> to\n manage Your registration as a user of the\n Service. The Personal Data You provide can give\n You access to different functionalities of the\n Service that are available to You as a\n registered user.\n </li>\n <li>\n <strong>\n For the performance of a contract:\n </strong>{' '}\n the development, compliance and undertaking of\n the purchase contract for the products, items or\n services You have purchased or of any other\n contract with Us through the Service.\n </li>\n <li>\n <strong>To contact You:</strong> To contact You\n by email, telephone calls, SMS, or other\n equivalent forms of electronic communication,\n such as a mobile application's push\n notifications regarding updates or informative\n communications related to the functionalities,\n products or contracted services, including the\n security updates, when necessary or reasonable\n for their implementation.\n </li>\n <li>\n <strong>To provide You</strong> with news,\n special offers and general information about\n other goods, services and events which we offer\n that are similar to those that you have already\n purchased or enquired about unless You have\n opted not to receive such information.\n </li>\n <li>\n <strong>To manage Your requests:</strong> To\n attend and manage Your requests to Us.\n </li>\n </ul>\n\n <p>\n We may share your personal information in the\n following situations:\n </p>\n\n <ul>\n <li>\n <strong>With Service Providers:</strong> We may\n share Your personal information with Service\n Providers to monitor and analyze the use of our\n Service, to show advertisements to You to help\n support and maintain Our Service, to contact\n You, to advertise on third party websites to You\n after You visited our Service or for payment\n processing.\n </li>\n <li>\n <strong>For Business transfers:</strong> We may\n share or transfer Your personal information in\n connection with, or during negotiations of, any\n merger, sale of Company assets, financing, or\n acquisition of all or a portion of our business\n to another company.\n </li>\n <li>\n <strong>With Affiliates:</strong> We may share\n Your information with Our affiliates, in which\n case we will require those affiliates to honor\n this Privacy Policy. Affiliates include Our\n parent company and any other subsidiaries, joint\n venture partners or other companies that We\n control or that are under common control with\n Us.\n </li>\n <li>\n <strong>With Business partners:</strong> We may\n share Your information with Our business\n partners to offer You certain products, services\n or promotions.\n </li>\n <li>\n <strong>With other users:</strong> when You\n share personal information or otherwise interact\n in the public areas with other users, such\n information may be viewed by all users and may\n be publicly distributed outside. If You interact\n with other users or register through a\n Third-Party Social Media Service, Your contacts\n on the Third-Party Social Media Service may see\n Your name, profile, pictures and description of\n Your activity. Similarly, other users will be\n able to view descriptions of Your activity,\n communicate with You and view Your profile.\n </li>\n </ul>\n\n <h2>Retention of Your Personal Data</h2>\n <p>\n The Company will retain Your Personal Data only for\n as long as is necessary for the purposes set out in\n this Privacy Policy. We will retain and use Your\n Personal Data to the extent necessary to comply with\n our legal obligations (for example, if we are\n required to retain your data to comply with\n applicable laws), resolve disputes, and enforce our\n legal agreements and policies.\n </p>\n <p>\n The Company will also retain Usage Data for internal\n analysis purposes. Usage Data is generally retained\n for a shorter period of time, except when this data\n is used to strengthen the security or to improve the\n functionality of Our Service, or We are legally\n obligated to retain this data for longer time\n periods.\n </p>\n\n <h2>Transfer of Your Personal Data</h2>\n <p>\n Your information, including Personal Data, is\n processed at the Company's operating offices and in\n any other places where the parties involved in the\n processing are located. It means that this\n information may be transferred to — and maintained\n on — computers located outside of Your state,\n province, country or other governmental jurisdiction\n where the data protection laws may differ than those\n from Your jurisdiction.\n </p>\n <p>\n Your consent to this Privacy Policy followed by Your\n submission of such information represents Your\n agreement to that transfer.\n </p>\n <p>\n The Company will take all steps reasonably necessary\n to ensure that Your data is treated securely and in\n accordance with this Privacy Policy and no transfer\n of Your Personal Data will take place to an\n organization or a country unless there are adequate\n controls in place including the security of Your\n data and other personal information.\n </p>\n\n <h2>Disclosure of Your Personal Data</h2>\n <h3>Business Transactions</h3>\n <p>\n If the Company is involved in a merger, acquisition\n or asset sale, Your Personal Data may be\n transferred. We will provide notice before Your\n Personal Data is transferred and becomes subject to\n a different Privacy Policy.\n </p>\n <h3>Law enforcement</h3>\n <p>\n Under certain circumstances, the Company may be\n required to disclose Your Personal Data if required\n to do so by law or in response to valid requests by\n public authorities (e.g. a court or a government\n agency).\n </p>\n <h3>Other legal requirements</h3>\n <p>\n The Company may disclose Your Personal Data in the\n good faith belief that such action is necessary to:\n </p>\n <ul>\n <li>Comply with a legal obligation</li>\n <li>\n Protect and defend the rights or property of the\n Company\n </li>\n <li>\n Prevent or investigate possible wrongdoing in\n connection with the Service\n </li>\n <li>\n Protect the personal safety of Users of the\n Service or the public\n </li>\n <li>Protect against legal liability</li>\n </ul>\n\n <h2>Security of Your Personal Data</h2>\n <p>\n The security of Your Personal Data is important to\n Us, but remember that no method of transmission over\n the Internet, or method of electronic storage is\n 100% secure. While We strive to use commercially\n acceptable means to protect Your Personal Data, We\n cannot guarantee its absolute security.\n </p>\n\n <h1>\n Detailed Information on the Processing of Your\n Personal Data\n </h1>\n <p>\n Service Providers have access to Your Personal Data\n only to perform their tasks on Our behalf and are\n obligated not to disclose or use it for any other\n purpose.\n </p>\n\n <h2>Analytics</h2>\n <p>\n We may use third-party Service providers to monitor\n and analyze the use of our Service.\n </p>\n <ul>\n <li>\n <p>\n <strong>Google Analytics</strong>\n </p>\n <p>\n Google Analytics is a web analytics service\n offered by Google that tracks and reports\n website traffic. Google uses the data\n collected to track and monitor the use of\n our Service. This data is shared with other\n Google services. Google may use the\n collected data to contextualise and\n personalise the ads of its own advertising\n network.\n </p>\n <p>\n For more information on the privacy\n practices of Google, please visit the Google\n Privacy & Terms web page:{' '}\n <a href=\"https://policies.google.com/privacy?hl=en\">\n https://policies.google.com/privacy?hl=en\n </a>\n </p>\n </li>\n <li>\n <p>\n <strong>Firebase</strong>\n </p>\n <p>\n Firebase is an analytics service provided by\n Google Inc.\n </p>\n <p>\n You may opt-out of certain Firebase features\n through your mobile device settings, such as\n your device advertising settings or by\n following the instructions provided by\n Google in their Privacy Policy:{' '}\n <a href=\"https://policies.google.com/privacy?hl=en\">\n https://policies.google.com/privacy?hl=en\n </a>\n </p>\n <p>\n We also encourage you to review the Google's\n policy for safeguarding your data:{' '}\n <a href=\"https://support.google.com/analytics/answer/6004245\">\n https://support.google.com/analytics/answer/6004245\n </a>\n .\n </p>\n <p>\n For more information on what type of\n information Firebase collects, please visit\n the Google Privacy & Terms web page:{' '}\n <a href=\"https://policies.google.com/privacy?hl=en\">\n https://policies.google.com/privacy?hl=en\n </a>\n </p>\n </li>\n </ul>\n\n <h2>Email Marketing</h2>\n <p>\n We may use Your Personal Data to contact You with\n newsletters, marketing or promotional materials and\n other information that may be of interest to You.\n You may opt-out of receiving any, or all, of these\n communications from Us by following the unsubscribe\n link or instructions provided in any email We send\n or by contacting Us.\n </p>\n <p>\n We may use Email Marketing Service Providers to\n manage and send emails to You.\n </p>\n\n <h1>GDPR Privacy</h1>\n <h2>\n Legal Basis for Processing Personal Data under GDPR\n </h2>\n <p>\n We may process Personal Data under the following\n conditions:\n </p>\n\n <ul>\n <li>\n <strong>Consent:</strong> You have given Your\n consent for processing Personal Data for one or\n more specific purposes.\n </li>\n <li>\n <strong>Performance of a contract:</strong>{' '}\n Provision of Personal Data is necessary for the\n performance of an agreement with You and/or for\n any pre-contractual obligations thereof.\n </li>\n <li>\n <strong>Legal obligations:</strong> Processing\n Personal Data is necessary for compliance with a\n legal obligation to which the Company is\n subject.\n </li>\n <li>\n <strong>Vital interests:</strong> Processing\n Personal Data is necessary in order to protect\n Your vital interests or of another natural\n person.\n </li>\n <li>\n <strong>Public interests:</strong> Processing\n Personal Data is related to a task that is\n carried out in the public interest or in the\n exercise of official authority vested in the\n Company.\n </li>\n <li>\n <strong>Legitimate interests:</strong>{' '}\n Processing Personal Data is necessary for the\n purposes of the legitimate interests pursued by\n the Company.\n </li>\n </ul>\n <p>\n In any case, the Company will gladly help to clarify\n the specific legal basis that applies to the\n processing, and in particular whether the provision\n of Personal Data is a statutory or contractual\n requirement, or a requirement necessary to enter\n into a contract.\n </p>\n\n <h2>Your Rights under the GDPR</h2>\n <p>\n The Company undertakes to respect the\n confidentiality of Your Personal Data and to\n guarantee You can exercise Your rights.\n </p>\n <p>\n You have the right under this Privacy Policy, and by\n law if You are within the EU, to:\n </p>\n\n <ul>\n <li>\n <strong>\n Request access to Your Personal Data.\n </strong>{' '}\n The right to access, update or delete the\n information We have on You. Whenever made\n possible, you can access, update or request\n deletion of Your Personal Data directly within\n Your account settings section. If you are unable\n to perform these actions yourself, please\n contact Us to assist You. This also enables You\n to receive a copy of the Personal Data We hold\n about You.\n </li>\n <li>\n <strong>\n Request correction of the Personal Data that\n We hold about You.\n </strong>{' '}\n You have the right to to have any incomplete or\n inaccurate information We hold about You\n corrected.\n </li>\n <li>\n <strong>\n Object to processing of Your Personal Data.\n </strong>{' '}\n This right exists where We are relying on a\n legitimate interest as the legal basis for Our\n processing and there is something about Your\n particular situation, which makes You want to\n object to our processing of Your Personal Data\n on this ground. You also have the right to\n object where We are processing Your Personal\n Data for direct marketing purposes.\n </li>\n <li>\n <strong>\n Request erasure of Your Personal Data.\n </strong>{' '}\n You have the right to ask Us to delete or remove\n Personal Data when there is no good reason for\n Us to continue processing it.\n </li>\n <li>\n <strong>\n Request the transfer of Your Personal Data.\n </strong>{' '}\n We will provide to You, or to a third-party You\n have chosen, Your Personal Data in a structured,\n commonly used, machine-readable format. Please\n note that this right only applies to automated\n information which You initially provided consent\n for Us to use or where We used the information\n to perform a contract with You.\n </li>\n <li>\n <strong>Withdraw Your consent.</strong> You have\n the right to withdraw Your consent on using your\n Personal Data. If You withdraw Your consent, We\n may not be able to provide You with access to\n certain specific functionalities of the Service.\n </li>\n </ul>\n\n <h2>Exercising of Your GDPR Data Protection Rights</h2>\n <p>\n You may exercise Your rights of access,\n rectification, cancellation and opposition by\n contacting Us. Please note that we may ask You to\n verify Your identity before responding to such\n requests. If You make a request, We will try our\n best to respond to You as soon as possible.\n </p>\n <p>\n You have the right to complain to a Data Protection\n Authority about Our collection and use of Your\n Personal Data. For more information, if You are in\n the European Economic Area (EEA), please contact\n Your local data protection authority in the EEA.\n </p>\n\n <h1>CCPA Privacy</h1>\n <h2>Your Rights under the CCPA</h2>\n <p>\n Under this Privacy Policy, and by law if You are a\n resident of California, You have the following\n rights:\n </p>\n <ul>\n <li>\n <strong>The right to notice.</strong> You must\n be properly notified which categories of\n Personal Data are being collected and the\n purposes for which the Personal Data is being\n used.\n </li>\n <li>\n <strong>\n The right to access / the right to request.\n </strong>{' '}\n The CCPA permits You to request and obtain from\n the Company information regarding the disclosure\n of Your Personal Data that has been collected in\n the past 12 months by the Company or its\n subsidiaries to a third-party for the third\n party’s direct marketing purposes.\n </li>\n <li>\n <strong>\n The right to say no to the sale of Personal\n Data.\n </strong>{' '}\n You also have the right to ask the Company not\n to sell Your Personal Data to third parties. You\n can submit such a request by visiting our \"Do\n Not Sell My Personal Information\" section or web\n page.\n </li>\n <li>\n <p>\n <strong>\n The right to know about Your Personal\n Data.\n </strong>{' '}\n You have the right to request and obtain\n from the Company information regarding the\n disclosure of the following:\n </p>\n <ul>\n <li>\n The categories of Personal Data\n collected\n </li>\n <li>\n The sources from which the Personal Data\n was collected\n </li>\n <li>\n The business or commercial purpose for\n collecting or selling the Personal Data\n </li>\n <li>\n Categories of third parties with whom We\n share Personal Data\n </li>\n <li>\n The specific pieces of Personal Data we\n collected about You\n </li>\n </ul>\n </li>\n <li>\n <strong>\n The right to delete Personal Data.\n </strong>{' '}\n You also have the right to request the deletion\n of Your Personal Data that have been collected\n in the past 12 months.\n </li>\n <li>\n <p>\n <strong>\n The right not to be discriminated\n against.\n </strong>{' '}\n You have the right not to be discriminated\n against for exercising any of Your\n Consumer's rights, including by:\n </p>\n <ul>\n <li>Denying goods or services to You</li>\n <li>\n Charging different prices or rates for\n goods or services, including the use of\n discounts or other benefits or imposing\n penalties\n </li>\n <li>\n Providing a different level or quality\n of goods or services to You\n </li>\n <li>\n Suggesting that You will receive a\n different price or rate for goods or\n services or a different level or quality\n of goods or services.\n </li>\n </ul>\n </li>\n </ul>\n\n <h2>Exercising Your CCPA Data Protection Rights</h2>\n <p>\n In order to exercise any of Your rights under the\n CCPA, and if you are a California resident, You can\n email or call us or visit our \"Do Not Sell My\n Personal Information\" section or web page.\n </p>\n <p>\n The Company will disclose and deliver the required\n information free of charge within 45 days of\n receiving Your verifiable request. The time period\n to provide the required information may be extended\n once by an additional 45 days when reasonable\n necessary and with prior notice.\n </p>\n\n <h2>Do Not Sell My Personal Information</h2>\n <p>\n We do not sell personal information. However, the\n Service Providers we partner with (for example, our\n advertising partners) may use technology on the\n Service that \"sells\" personal information as defined\n by the CCPA law.\n </p>\n <p>\n If you wish to opt out of the use of your personal\n information for interest-based advertising purposes\n and these potential sales as defined under CCPA law,\n you may do so by following the instructions below.\n </p>\n <p>\n Please note that any opt out is specific to the\n browser You use. You may need to opt out on every\n browser that you use.\n </p>\n\n <h3>Website</h3>\n <p>\n You can opt out of receiving ads that are\n personalized as served by our Service Providers by\n following our instructions presented on the Service:\n </p>\n <ul>\n <li>From Our \"Cookie Consent\" notice banner</li>\n <li>Or from Our \"CCPA Opt-out\" notice banner</li>\n <li>\n Or from Our \"Do Not Sell My Personal\n Information\" notice banner\n </li>\n <li>\n Or from Our \"Do Not Sell My Personal\n Information\" link\n </li>\n </ul>\n <p>\n The opt out will place a cookie on Your computer\n that is unique to the browser You use to opt out. If\n you change browsers or delete the cookies saved by\n your browser, you will need to opt out again.\n </p>\n\n <h3>Mobile Devices</h3>\n <p>\n Your mobile device may give you the ability to opt\n out of the use of information about the apps you use\n in order to serve you ads that are targeted to your\n interests:\n </p>\n <ul>\n <li>\n \"Opt out of Interest-Based Ads\" or \"Opt out of\n Ads Personalization\" on Android devices\n </li>\n <li>\"Limit Ad Tracking\" on iOS devices</li>\n </ul>\n <p>\n You can also stop the collection of location\n information from Your mobile device by changing the\n preferences on your mobile device.\n </p>\n\n <h1>\n \"Do Not Track\" Policy as Required by California\n Online Privacy Protection Act (CalOPPA)\n </h1>\n <p>\n Our Service does not respond to Do Not Track\n signals.\n </p>\n <p>\n However, some third party websites do keep track of\n Your browsing activities. If You are visiting such\n websites, You can set Your preferences in Your web\n browser to inform websites that You do not want to\n be tracked. You can enable or disable DNT by\n visiting the preferences or settings page of Your\n web browser.\n </p>\n\n <h1>Children's Privacy</h1>\n <p>\n Our Service does not address anyone under the age of\n 13. We do not knowingly collect personally\n identifiable information from anyone under the age\n of 13. If You are a parent or guardian and You are\n aware that Your child has provided Us with Personal\n Data, please contact Us. If We become aware that We\n have collected Personal Data from anyone under the\n age of 13 without verification of parental consent,\n We take steps to remove that information from Our\n servers.\n </p>\n <p>\n We also may limit how We collect, use, and store\n some of the information of Users between 13 and 18\n years old. In some cases, this means We will be\n unable to provide certain functionality of the\n Service to these users.\n </p>\n <p>\n If We need to rely on consent as a legal basis for\n processing Your information and Your country\n requires consent from a parent, We may require Your\n parent's consent before We collect and use that\n information.\n </p>\n\n <h1>Links to Other Websites</h1>\n <p>\n Our Service may contain links to other websites that\n are not operated by Us. If You click on a third\n party link, You will be directed to that third\n party's site. We strongly advise You to review the\n Privacy Policy of every site You visit.\n </p>\n <p>\n We have no control over and assume no responsibility\n for the content, privacy policies or practices of\n any third party sites or services.\n </p>\n\n <h1>Changes to this Privacy Policy</h1>\n <p>\n We may update our Privacy Policy from time to time.\n We will notify You of any changes by posting the new\n Privacy Policy on this page.\n </p>\n <p>\n We will let You know via email and/or a prominent\n notice on Our Service, prior to the change becoming\n effective and update the \"Last updated\" date at the\n top of this Privacy Policy.\n </p>\n <p>\n You are advised to review this Privacy Policy\n periodically for any changes. Changes to this\n Privacy Policy are effective when they are posted on\n this page.\n </p>\n\n <h1>Contact Us</h1>\n <p>\n If you have any questions about this Privacy Policy,\n You can contact us:\n </p>\n <ul>\n <li>By email: privacy@gopractis.com</li>\n </ul>\n </ContentArea>\n </PrivacyContainer>\n </LandingWrapper>\n );\n }\n}\n\nexport default PrivacyPage;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nimport { Variables } from '../../theme/variables';\nimport LandingWrapper from '../../ui/wrapper/LandingWrapper/LandingWrapper';\n\nconst SupportContainer = styled.div`\n margin: 50px 10%;\n width: 100%;\n`;\n\nconst ContentArea = styled.div`\n text-align: center;\n width: 100%;\n font-size: 22px;\n padding: 100px 0;\n`;\n\nconst SupportMail = styled.a`\n display: block;\n text-decoration: none;\n color: ${Variables.Colors.dodgerBlue};\n font-weight: bold;\n padding: 25px 0;\n`;\n\nclass SupportPage extends Component {\n render() {\n return (\n <LandingWrapper>\n <SupportContainer>\n <ContentArea>\n To get support, please, send us an email to\n <SupportMail href=\"mailto:support@gopractis.com\">\n support@gopractis.com\n </SupportMail>\n </ContentArea>\n </SupportContainer>\n </LandingWrapper>\n );\n }\n}\n\nexport default SupportPage;\n","import React, { FC } from 'react';\nimport ROUTES from '../../../routes/routes';\nimport Navigation from '../../../ui/components/Navigation/Navigation';\nimport styled from 'styled-components';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\n\nconst StyledUsersPageNavigationContainer = styled.div`\n max-width: 400px;\n\n a.is-active:before{\n max-width: 148px;\n }\n`;\n\nconst UsersPageNavigation: React.FC<{}> = () => {\n return (\n <StyledUsersPageNavigationContainer>\n <Navigation\n fontSize=\"13px\"\n menu={[\n {\n key: 'users',\n title: 'Registered',\n url: ROUTES.USERS,\n permissions: [NEW_PERMISSIONS.LIST_USER],\n },\n {\n key: 'invitations',\n title: 'Pending',\n url: ROUTES.INVITATIONS,\n permissions: [NEW_PERMISSIONS.LIST_INVITATION],\n },\n {\n key: 'drafts',\n title: 'Drafts',\n url: ROUTES.DRAFTS,\n permissions: [NEW_PERMISSIONS.LIST_STAGING],\n },\n ]}\n dataTest=\"users-tab\"\n />\n </StyledUsersPageNavigationContainer>\n );\n};\n\nexport const UsersPageNavigationContainer: FC = () => {\n return <UsersPageNavigation />;\n};\n\nexport default UsersPageNavigationContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport EmptyBox from '../../../ui/icons/EmptyBox';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\n\nconst StyledEmptyInviters = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyInvitersContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst NoLabelsIcon = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoInvitersTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyInviters: FC<{ loading?: boolean; isEmpty?: boolean }> = ({\n loading,\n isEmpty,\n}) => {\n if (loading) {\n return (\n <StyledEmptyInviters>\n <Loading />\n </StyledEmptyInviters>\n );\n }\n\n return (\n <StyledEmptyInviters>\n <StyledEmptyInvitersContent>\n <NoLabelsIcon data-test={isEmpty ? 'no-inviters-icon' : 'no-inviters-found-icon'}>\n {isEmpty ? <EmptyBox /> : <NoSearchResult />}\n </NoLabelsIcon>\n <NoInvitersTitle data-test={isEmpty ? 'no-inviters-text' : 'no-inviters-found-text'}>\n {isEmpty ? 'No Inviters yet' : 'No Inviters found'}\n </NoInvitersTitle>\n </StyledEmptyInvitersContent>\n </StyledEmptyInviters>\n );\n};\n\nexport default EmptyInviters;\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport Checkbox from '../../../ui/components/Checkbox';\nimport { handleToggleSelectedItems } from '../../../pages/ActionPages/NewUser/tools';\nimport { Inviter } from '../../../constants/interfaces/Inviter';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\n\nconst StyledInvitersList = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst TopSideList = styled.span``;\n\nconst GeneralList = styled.span``;\n\nconst InviterItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n`;\nconst YouWrapper = styled.span`\n font-size: 13px;\n color: ${({ theme }) => theme.Colors.steelGrey};\n`;\nconst InviterItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;\nexport const PortableInvitersList: FC<{\n inviters?: Inviter[];\n selectedInviters: number[];\n disabled?: boolean;\n setInvitersFilters?: (inviterId: any[]) => void;\n}> = ({ inviters, selectedInviters, setInvitersFilters }) => {\n const isChecked = useCallback(\n (setId?: number) => {\n return (\n !!selectedInviters &&\n !!setId &&\n selectedInviters.includes(setId)\n );\n },\n [selectedInviters]\n );\n\n const isPartiallyChecked = useCallback(\n (invitersId?: number) => {\n return (\n !!selectedInviters &&\n !!invitersId &&\n selectedInviters.includes(-Number(invitersId))\n );\n },\n [selectedInviters]\n );\n\n const profile = useSelector(getProfileState);\n\n const changeHandler = (inviterId: number) => {\n if (inviterId && setInvitersFilters) {\n setInvitersFilters(\n handleToggleSelectedItems(selectedInviters, inviterId)\n );\n }\n };\n\n if (!inviters || (inviters && inviters.length === 0)) return null;\n\n const topListInviters = inviters.filter(\n inviter => inviter.id && selectedInviters.includes(inviter.id)\n );\n\n const bottomListInviters = inviters.filter(\n inviter => inviter.id && !selectedInviters.includes(inviter.id)\n );\n\n return (\n <StyledInvitersList>\n {topListInviters.length > 0 && (\n <TopSideList>\n {topListInviters.map(inviter => {\n return (\n <InviterItemWrapper key={inviter.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(inviter.id) ||\n isPartiallyChecked(inviter.id)\n }\n partial={isPartiallyChecked(inviter.id)}\n handleChange={() =>\n changeHandler(inviter.id)\n }\n dataTest=\"selected-inviters-item-checkbox\"\n />\n <InviterItem\n onClick={() => changeHandler(inviter.id)}\n data-test=\"selected-inviters-item-text\"\n >\n {inviter.firstName} {inviter.lastName}\n </InviterItem>\n </InviterItemWrapper>\n );\n })}\n {topListInviters.length < inviters.length && (\n <TableDivider width=\"98%\" />\n )}\n </TopSideList>\n )}\n <GeneralList>\n {bottomListInviters.map(inviter => {\n return (\n <InviterItemWrapper key={inviter.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(inviter.id) ||\n isPartiallyChecked(inviter.id)\n }\n partial={isPartiallyChecked(inviter.id)}\n handleChange={() => changeHandler(inviter.id)}\n dataTest=\"inviters-item-checkbox\"\n />\n <InviterItem\n onClick={() => changeHandler(inviter.id)}\n data-test=\"inviters-item-text\"\n >\n {inviter.firstName} {inviter.lastName}\n {profile && profile.id === inviter.id && (\n <YouWrapper>(You)</YouWrapper>\n )}\n </InviterItem>\n </InviterItemWrapper>\n );\n })}\n </GeneralList>\n </StyledInvitersList>\n );\n};\n","import React, { FC, useCallback, useMemo, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { Variables } from '../../../theme/variables';\r\nimport { compose } from 'redux';\r\nimport { Inviter } from '../../../constants/interfaces/Inviter';\r\nimport EmptyInviters from './EmptyInviters';\r\nimport { PortableInvitersList } from './PortableInvitersList';\r\nimport { InvitersResult } from '../../inviters/interfaces';\r\nimport { filterInviters } from '../tools';\r\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\n//region Types\r\ntype Action = 'clear' | 'select';\r\n\r\nexport type PortableInvitersProps = {\r\n inviters?: InvitersResult<Inviter>;\r\n selectedList: number[];\r\n loading?: boolean;\r\n onSelectMultiply?: (ids: number[]) => void;\r\n onSelectAll?: () => void;\r\n onDeselectAll?: () => void;\r\n filtersTitle?: string;\r\n disabled?: boolean;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n};\r\n//endregion\r\n\r\n//region Styles\r\nconst StyledCreateInviters = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n max-width: 300px;\r\n`;\r\n\r\nconst CreateInvitersBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.black};\r\n font-weight: 600;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n//endregion\r\n\r\nconst PortableInviters: FC<PortableInvitersProps> = ({\r\n inviters,\r\n selectedList,\r\n loading,\r\n onSelectMultiply,\r\n onSelectAll,\r\n onDeselectAll,\r\n filtersTitle,\r\n showSelectActions,\r\n showSearch,\r\n disabled,\r\n}) => {\r\n const actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n > = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n };\r\n\r\n const isAllSelected = useMemo(\r\n () => selectedList.length === inviters?.items.length,\r\n [selectedList, inviters]\r\n );\r\n\r\n const clearHandler = useCallback(() => {\r\n onDeselectAll?.();\r\n }, [onDeselectAll]);\r\n\r\n const deSelectAllHandler = useCallback(() => {\r\n if (isAllSelected && onDeselectAll) {\r\n onDeselectAll();\r\n } else if (onSelectAll) {\r\n onSelectAll();\r\n }\r\n }, [onDeselectAll, onSelectAll, isAllSelected]);\r\n\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const searchHandler = (value: string) => setSearchTerm(value);\r\n const [processedSelectedList, setProcessedSelectedList] = useState<\r\n number[]\r\n >([]);\r\n\r\n const getPrecessedInviters = useMemo(() => {\r\n if (inviters) {\r\n const result = compose<Inviter[]>(filterInviters(searchTerm))(\r\n inviters.items\r\n );\r\n\r\n if (result.length > 0) {\r\n const processedDataIds = result.map(item => item.id!);\r\n setProcessedSelectedList(\r\n selectedList.filter(item => processedDataIds.includes(item))\r\n );\r\n }\r\n\r\n return result;\r\n } else {\r\n return [];\r\n }\r\n }, [searchTerm, inviters, selectedList]);\r\n\r\n const showNoItems = !inviters?.items.length;\r\n const showEmptyState = !getPrecessedInviters.length || loading;\r\n const selectedInvitersLength = processedSelectedList.filter(id => id > 0)\r\n .length;\r\n\r\n return (\r\n <StyledCreateInviters>\r\n <CreateInvitersBody>\r\n {filtersTitle && (\r\n <FiltersHeader>\r\n <FilterTitle>{filtersTitle}</FilterTitle>\r\n </FiltersHeader>\r\n )}\r\n {showSearch && (\r\n <SearchWrapper>\r\n <TableSearchInput\r\n onChange={searchHandler}\r\n disabled={showNoItems}\r\n dataTest=\"inviters-search\"\r\n />\r\n </SearchWrapper>\r\n )}\r\n {showSelectActions && !showNoItems && (\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"inviters-selected-text\">\r\n {selectedInvitersLength > 0\r\n ? `${selectedInvitersLength} ${\r\n selectedInvitersLength > 1\r\n ? ' Inviters selected'\r\n : ' Inviter selected'\r\n }`\r\n : 'No Inviters selected'}\r\n </SelectedCaption>\r\n </div>\r\n <div>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n processedSelectedList.length === 0 ||\r\n showEmptyState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"inviters-unselect-all\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showEmptyState}\r\n color={actionConfig.select.color}\r\n colorActive={\r\n actionConfig.select.colorActive\r\n }\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={deSelectAllHandler}\r\n data-test=\"inviters-select-all\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </div>\r\n </SelectActions>\r\n )}\r\n {showEmptyState ? (\r\n <EmptyInviters\r\n loading={loading}\r\n isEmpty={!inviters?.items.length}\r\n />\r\n ) : (\r\n <>\r\n <PortableInvitersList\r\n inviters={getPrecessedInviters}\r\n selectedInviters={selectedList}\r\n disabled={disabled}\r\n setInvitersFilters={onSelectMultiply}\r\n />\r\n </>\r\n )}\r\n </CreateInvitersBody>\r\n </StyledCreateInviters>\r\n );\r\n};\r\n\r\nexport { PortableInviters };\r\n","import { useCallback } from 'react';\nimport {Inviter} from \"../../constants/interfaces/Inviter\";\n\nexport const filterInviters = (term: string) => (\n inviters: Inviter[]\n): Inviter[] => {\n if (!term) {\n return inviters;\n }\n\n return inviters.filter(\n item => item.firstName.toLowerCase().indexOf(term.toLowerCase()) !== -1 ||\n item.lastName.toLowerCase().indexOf(term.toLowerCase()) !== -1 ||\n `${item.firstName} ${item.lastName}`.trim().toLowerCase().indexOf(term.trim().toLowerCase()) !== -1\n );\n};\n\ntype Entity = {\n id: number;\n invitersIDs: number[];\n};\n\nexport const useCalculatePreSelectedInviters = <T extends Entity>() => {\n return useCallback((selectedItems: number[], entity: T[]) => {\n let countSelectedItems: Record<number, number> = {};\n let outputArray: number[] = [];\n\n const filteredEntities = entity.filter(entityItem => {\n return selectedItems.includes(entityItem.id);\n });\n for (let entity of filteredEntities) {\n for (let practisSetId of entity.invitersIDs) {\n countSelectedItems[practisSetId] =\n countSelectedItems[practisSetId] + 1 || 1;\n }\n }\n\n for (const key in countSelectedItems) {\n if (countSelectedItems[key] === selectedItems.length) {\n outputArray.push(Number(key));\n } else {\n outputArray.push(-Number(key));\n }\n }\n\n return outputArray;\n }, []);\n};\n\nexport const useCalculateDeletedPractisSets = () => {\n return useCallback((assignedPractisSets: number[], initialPractisSets: number[]) => {\n const deletedPractisSets: number[] = [];\n\n for (let practisSet of initialPractisSets) {\n if (\n !assignedPractisSets.includes(practisSet) &&\n !assignedPractisSets.includes(-practisSet)\n ) {\n deletedPractisSets.push(\n practisSet < 0 ? -practisSet : practisSet\n );\n }\n }\n\n return deletedPractisSets;\n }, []);\n};\n","import { Action } from 'redux';\nimport {Inviter} from \"../../../constants/interfaces/Inviter\";\nimport {InvitersResponse} from \"../interfaces\";\n\ntype ReturnTypeInvitersAction<\n T extends (...args: any) => any\n > = ReturnType<T> & ActionPayload;\n\ntype ActionPayload = any;\n\nexport type ActionInviter<T = any> = Action<T> & ActionPayload;\n\nexport type InvitersAction =\n | ReturnTypeInvitersAction<typeof searchInvitersStartAction>\n | ReturnTypeInvitersAction<typeof searchInvitersSuccessAction>\n | ReturnTypeInvitersAction<typeof searchInvitersFailureAction>\n | ReturnTypeInvitersAction<typeof selectInviterAction>\n | ReturnTypeInvitersAction<typeof deSelectInviterAction>\n | ReturnTypeInvitersAction<typeof selectMultipleInvitersAction>\n | ReturnTypeInvitersAction<typeof selectAllInvitersAction>\n | ReturnTypeInvitersAction<typeof deSelectAllInvitersAction>\n | ReturnTypeInvitersAction<typeof refreshInvitersAction>\n\nexport const searchInvitersStartAction = (): ActionInviter<'searchInvitersStartAction'> => ({\n type: 'searchInvitersStartAction',\n});\n\nexport const searchInvitersSuccessAction = (\n responseData: InvitersResponse<Inviter>\n): ActionInviter<'searchInvitersSuccessAction'> & {\n responseData: InvitersResponse<Inviter>;\n} => ({\n type: 'searchInvitersSuccessAction',\n responseData,\n});\n\nexport const searchInvitersFailureAction = (\n message: string\n): ActionInviter<'searchInvitersFailureAction'> & {\n message: string;\n} => ({\n type: 'searchInvitersFailureAction',\n message,\n});\n\nexport const selectInviterAction = (\n id: number\n): ActionInviter<'selectInviterAction'> & {\n id: number;\n} => ({\n type: 'selectInviterAction',\n id,\n});\n\nexport const deSelectInviterAction = (\n id: number\n): ActionInviter<'deSelectInviterAction'> & {\n id: number;\n} => ({\n type: 'deSelectInviterAction',\n id,\n});\n\nexport const selectMultipleInvitersAction = (\n ids: number[]\n): ActionInviter<'selectMultipleInvitersAction'> & { ids: number[] } => ({\n type: 'selectMultipleInvitersAction',\n ids,\n});\n\nexport const selectAllInvitersAction = (): ActionInviter<'selectAllInvitersAction'> => ({\n type: 'selectAllInvitersAction',\n});\n\nexport const deSelectAllInvitersAction = (): ActionInviter<'deSelectAllInvitersAction'> => ({\n type: 'deSelectAllInvitersAction',\n});\n\nexport const saveInvitersAction = (): ActionInviter<'saveInvitersAction'> => ({\n type: 'saveInvitersAction',\n});\n\nexport const refreshInvitersAction = (): ActionInviter<'refreshInvitersAction'> => ({\n type: 'refreshInvitersAction',\n});\n","import { SearchParams } from '../../../constants/interfaces/filters';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n deSelectAllInvitersAction, refreshInvitersAction, saveInvitersAction,\n searchInvitersFailureAction,\n searchInvitersStartAction, searchInvitersSuccessAction, selectAllInvitersAction, selectMultipleInvitersAction,\n} from './actions';\nimport { useDispatch } from 'react-redux';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport {useSearchInvitersApi} from '../../../api';\n\nexport const useSearchInvitersService = () => {\n const dispatch = useDispatch();\n const searchInvitersApi = useSearchInvitersApi();\n const showMessage = useShowMessage();\n \n return useCallback(\n (sp?: SearchParams) => {\n dispatch(searchInvitersStartAction());\n searchInvitersApi(sp)\n .then(data => {\n dispatch(searchInvitersSuccessAction(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchInvitersFailureAction(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchInvitersApi, showMessage]\n );\n};\n\n\nexport const useSelectMultipleInvitersAction = () => {\n const dispatch = useDispatch();\n return useCallback((ids: number[]) => {\n dispatch(selectMultipleInvitersAction(ids));\n }, [dispatch]);\n};\n\nexport const useSelectAllInvitersAction = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(selectAllInvitersAction());\n }, [dispatch]);\n};\n\nexport const useDeSelectAllInvitersAction = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(deSelectAllInvitersAction());\n }, [dispatch]);\n};\n\nexport const useSaveInvitersAction = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(saveInvitersAction());\n }, [dispatch]);\n};\n\n\nexport const useRefreshInviters = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(refreshInvitersAction());\n }, [dispatch]);\n};","export const filterUnique = (items: any[]):any[] => {\n return items.filter((item, index, self) => item && self.indexOf(item) === index);\n};\n","import { Reducer } from 'redux';\nimport {InvitersState} from './states';\nimport { AppState } from '../../../store/reducers';\nimport {InvitersAction} from \"./actions\";\nimport {InvitersResult} from \"../interfaces\";\nimport {Inviter} from \"../../../constants/interfaces/Inviter\";\nimport {filterUnique} from \"../tools\";\n\nconst initialInvitersState: InvitersState = {\n data: {\n items: [],\n },\n ready: false,\n loading: false,\n error: '',\n selected: [],\n saved: [],\n};\n\nexport const invitersReducer: Reducer<InvitersState, InvitersAction> = (\n state = initialInvitersState,\n action: InvitersAction\n): InvitersState => {\n switch (action.type) {\n case 'searchInvitersStartAction':\n return {\n ...state,\n loading: true,\n error: '',\n };\n case 'searchInvitersSuccessAction':\n const data: InvitersResult<Inviter> = {\n items: action.responseData.createdByUsers,\n };\n return {\n ...state,\n data,\n ready: true,\n loading: false,\n error: '',\n };\n case 'searchInvitersFailureAction':\n return {\n ...state,\n loading: false,\n error: action.message,\n };\n case 'selectInviterAction':\n return {\n ...state,\n selected: filterUnique([...state.selected, action.id]),\n };\n case 'deSelectInviterAction':\n const selectedIds = [...state.selected];\n const foundIdx = selectedIds.findIndex(x => x === action.id);\n if (foundIdx !== -1) {\n selectedIds.splice(foundIdx, 1);\n }\n return {\n ...state,\n selected: selectedIds,\n };\n case 'selectMultipleInvitersAction':\n return {\n ...state,\n selected: action.ids,\n };\n case 'selectAllInvitersAction':\n return {\n ...state,\n selected: state.data.items.map(x => x.id),\n };\n case 'deSelectAllInvitersAction':\n return {\n ...state,\n selected: [],\n };\n case 'saveInvitersAction':\n return {\n ...state,\n saved: state.selected,\n };\n case 'refreshInvitersAction':\n return {\n ...state,\n ready: false,\n };\n default:\n return state;\n }\n};\nexport const getInvitersState = (state: AppState) => state.inviters;\n","import { FC, useEffect } from 'react';\r\nimport { PortableInviters } from './PortableInviters';\r\nimport {\r\n useDeSelectAllInvitersAction,\r\n useSearchInvitersService,\r\n useSelectAllInvitersAction,\r\n useSelectMultipleInvitersAction,\r\n} from '../../inviters/store/services';\r\nimport { useSelector } from 'react-redux';\r\nimport { getInvitersState } from '../../inviters/store/reducers';\r\n\r\ntype Props = {\r\n fetchOnMount?: boolean;\r\n resetSelectedOnUnmount?: boolean;\r\n\r\n onSetSelected?: (ids: number[]) => void;\r\n filtersTitle?: string;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n showSave?: boolean;\r\n};\r\n\r\nexport const PortableInvitersWithStore: FC<Props> = ({\r\n fetchOnMount = true,\r\n resetSelectedOnUnmount = true,\r\n ...rest\r\n}) => {\r\n const invitersState = useSelector(getInvitersState);\r\n const { data, loading, selected, ready } = invitersState;\r\n const searchInviters = useSearchInvitersService();\r\n const selectMultiply = useSelectMultipleInvitersAction();\r\n const selectAll = useSelectAllInvitersAction();\r\n const deselectAll = useDeSelectAllInvitersAction();\r\n\r\n useEffect(() => {\r\n if (!ready || fetchOnMount) {\r\n searchInviters();\r\n }\r\n return () => {\r\n if (resetSelectedOnUnmount) {\r\n deselectAll();\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deselectAll, ready, fetchOnMount, searchInviters]);\r\n\r\n return (\r\n <PortableInviters\r\n inviters={data}\r\n selectedList={selected}\r\n loading={loading}\r\n onSelectMultiply={selectMultiply}\r\n onSelectAll={selectAll}\r\n onDeselectAll={deselectAll}\r\n showSearch={true}\r\n showSelectActions={true}\r\n {...rest}\r\n />\r\n );\r\n};\r\n","import React, { FC, useCallback, useEffect, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport { Fieldset } from '../../../../ui/components/Fieldset';\r\nimport { PortableLabelsWithStore } from '../../../portableLabels';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport { useSaveTeams } from '../../../portableTeams/store/hors/withTeams/services';\r\nimport { useTeamsState } from '../../../portableTeams/store/hors/withTeams/states';\r\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport PortableRolesWithMultiSelect from '../../../portableRoles/portableRolesWithMultiSelect';\r\nimport { PortableInvitersWithStore } from '../../../portableInviters';\r\nimport { getInvitersState } from '../../../inviters/store/reducers';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectMultipleInvitersAction } from '../../../inviters/store/actions';\r\nimport { useDeSelectAllInvitersAction, useSaveInvitersAction } from '../../../inviters/store/services';\r\nimport { useInvitersState } from '../../../inviters/store/states';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n gap: 16px;\r\n max-height: 416px;\r\n flex-grow: 1;\r\n background-color: inherit;\r\n`;\r\n\r\nconst CustomFieldContainer = styled.div`\r\n width: 208px;\r\n min-height: 244px;\r\n height: 100%;\r\n overflow: auto;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Actions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n\r\n flex-shrink: 0;\r\n margin-top: 16px;\r\n`;\r\n\r\nconst SummaryCaption = styled.span`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n margin-right: 24px;\r\n\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst RoleContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 152px;\r\n background-color: inherit;\r\n`;\r\n\r\nconst ButtonWrapper = styled.div`\r\n margin-right: 12px;\r\n`;\r\n\r\nexport const InvitationsFilter: FC<{\r\n preSelectedLabels: number[];\r\n onLabelsChange: (ids: number[]) => void;\r\n onRoleChange: (status: number[]) => void;\r\n onInvitersChange: (ids: number[]) => void;\r\n onSuccessApply: () => void;\r\n preSelectedRoles: number[];\r\n}> = ({\r\n preSelectedLabels,\r\n onLabelsChange,\r\n onRoleChange,\r\n onInvitersChange,\r\n onSuccessApply,\r\n preSelectedRoles,\r\n}) => {\r\n const [selectedRoles, setSelectedRoles] = useState(preSelectedRoles);\r\n const teams = useTeamsState();\r\n const labels = useLabelsState();\r\n const inviters = useInvitersState();\r\n const invitersState = useSelector(getInvitersState);\r\n const selectLabels = useSelectLabels();\r\n const saveLabels = useSaveLabels();\r\n const saveTeams = useSaveTeams();\r\n const saveInviters = useSaveInvitersAction();\r\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\r\n const selectMultipleInviters = selectMultipleInvitersAction;\r\n const deselectAllInviters = useDeSelectAllInvitersAction();\r\n\r\n useEffect(() => {\r\n if (ifPreselectedLabelsChanged) {\r\n selectLabels(preSelectedLabels);\r\n saveLabels();\r\n }\r\n }, [\r\n ifPreselectedLabelsChanged,\r\n preSelectedLabels,\r\n saveLabels,\r\n selectLabels,\r\n ]);\r\n\r\n const onApplyHandler = useCallback(() => {\r\n onLabelsChange(labels.selected);\r\n onRoleChange(selectedRoles);\r\n onInvitersChange(inviters.selected);\r\n saveLabels();\r\n saveTeams();\r\n saveInviters();\r\n onSuccessApply();\r\n }, [\r\n onLabelsChange,\r\n labels.selected,\r\n onRoleChange,\r\n selectedRoles,\r\n onInvitersChange,\r\n inviters.selected,\r\n saveLabels,\r\n saveTeams,\r\n saveInviters,\r\n onSuccessApply,\r\n ]);\r\n\r\n const totalFiltersSelected =\r\n teams.selected.length +\r\n labels.selected.filter((id: any) => id > 0).length +\r\n selectedRoles.length +\r\n invitersState.selected.length;\r\n\r\n const onClearHandler = useCallback(() => {\r\n setSelectedRoles([]);\r\n selectLabels([]);\r\n selectMultipleInviters([]);\r\n deselectAllInviters();\r\n }, [selectLabels, selectMultipleInviters, deselectAllInviters]);\r\n\r\n return (\r\n <Container>\r\n <Wrapper>\r\n <Fieldset title=\"Role\" dataTest=\"roles-section-title\">\r\n <RoleContainer>\r\n <PortableRolesWithMultiSelect\r\n selectedRoles={selectedRoles}\r\n setSelectedRoles={setSelectedRoles}\r\n />\r\n </RoleContainer>\r\n </Fieldset>\r\n <Fieldset title=\"Invited by\" dataTest=\"inviters-section-title\">\r\n <CustomFieldContainer>\r\n <PortableInvitersWithStore\r\n fetchOnMount={false}\r\n onSetSelected={selectMultipleInviters}\r\n resetSelectedOnUnmount={false}\r\n />\r\n </CustomFieldContainer>\r\n </Fieldset>\r\n <Fieldset title=\"Labels\" dataTest=\"labels-section-title\">\r\n <CustomFieldContainer>\r\n <PortableLabelsWithStore\r\n showSave={false}\r\n showSelectActions\r\n showSearch\r\n />\r\n </CustomFieldContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <SummaryCaption data-test=\"total-selected-filters-text\">\r\n {totalFiltersSelected} Selected\r\n </SummaryCaption>\r\n <ButtonWrapper>\r\n <Button\r\n width=\"122px\"\r\n variant=\"inverse\"\r\n action={onClearHandler}\r\n disabled={!totalFiltersSelected}\r\n dataTest=\"clear-button\"\r\n >\r\n Clear\r\n </Button>\r\n </ButtonWrapper>\r\n <Button\r\n width=\"122px\"\r\n action={onApplyHandler}\r\n dataTest=\"apply-filter-button\"\r\n >\r\n Apply Filter\r\n </Button>\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import {InvitersResult} from \"../interfaces\";\nimport {Inviter} from \"../../../constants/interfaces/Inviter\";\nimport {useSelector} from \"react-redux\";\n\nexport interface InvitersState {\n data: InvitersResult<Inviter>;\n ready: boolean,\n loading: boolean;\n error: string;\n selected: number[];\n saved: number[];\n}\n\nexport const useInvitersState = (): InvitersState => {\n const appState = useSelector(state => state);\n return appState.inviters;\n};","import React, { FC, useRef, useState } from 'react';\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../ui/components/ActionButton';\nimport { CheckPermission } from '../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { PopupComponent } from '../../../../ui/components/Popup';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport {\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabelsForSingleItem,\n} from '../../../labels/tools';\nimport { AssignLabels } from '../../../portableLabels/templates/AssignLabels';\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { InvitationActionsHelper } from '../../tools';\nimport { UserV2 } from '../../../../constants/interfaces/User';\n\nconst InvitationsListActions: FC<{\n invitation: UserV2;\n actionsHelper: InvitationActionsHelper;\n onViewProfile: (invitation: UserV2) => void;\n onCopyInviteText: (invitation: UserV2) => void;\n handleRevokeInvitation: (invitationIds: number[]) => void;\n handleResendInvitation: (invitationIds: number[]) => void;\n assignLabelsToUser: (\n addedLabelIds: number[],\n deletedLabelIds: number[]\n ) => void;\n isHidden?: boolean;\n}> = ({\n invitation,\n actionsHelper,\n onViewProfile,\n onCopyInviteText,\n handleRevokeInvitation,\n assignLabelsToUser,\n handleResendInvitation,\n isHidden,\n}) => {\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const calculatePreSelectedLabels = useCalculatePreSelectedLabelsForSingleItem();\n const getDeletedLabels = useCalculateDeletedLabels();\n\n const handleSetPreselectedLabels = () => {\n const selectedLabelIds = invitation.labels || [];\n const preAssignedLabels = calculatePreSelectedLabels(\n selectedLabelIds,\n labelsList.data\n );\n setSelectLabels(preAssignedLabels);\n saveLabels();\n };\n\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\n const addedLabelIds = labelIDs.filter(id => id > 0);\n const deletedLabelIds = getDeletedLabels(labelIDs)\n .filter(labelId => invitation.labels.includes(labelId));\n\n assignLabelsToUser(addedLabelIds, deletedLabelIds);\n };\n\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\n null | number | undefined\n >(null);\n\n const triggerRef = useRef(null);\n\n return (\n <span>\n <div ref={triggerRef}>\n <ActionButton customWidth={168} isHidden={isHidden} dataTest=\"list-item-menu\">\n <CheckPermission\n permissions={[NEW_PERMISSIONS.VIEW_USER_PERFORMANCE]}\n >\n <ActionItem onClick={() => onViewProfile(invitation)} dataTest=\"view-profile-action\">\n View Profile\n </ActionItem>\n </CheckPermission>\n {actionsHelper.canAssignInvitationLabel() && !!labelsList.data.items.length && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setAssignSingleLabelOpen(invitation.id);\n handleSetPreselectedLabels();\n }}\n dataTest=\"assign-labels-action\"\n >\n Assign Labels\n </ActionItem>\n )}\n {actionsHelper.canResendInvitation() && (\n <ActionItem\n onClick={() => {\n handleResendInvitation([invitation.id]);\n }}\n dataTest=\"resend-invite-action\"\n >\n Resend Invite\n </ActionItem>\n )}\n <ActionItem onClick={() => onCopyInviteText(invitation)} dataTest=\"copy-invite-text-action\">\n Copy Invite Text\n </ActionItem>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.REVOKE_INVITATION]}\n >\n <ActionItem\n destructive={true}\n onClick={() => {\n handleRevokeInvitation([invitation.id]);\n }}\n dataTest=\"revoke-action\"\n >\n Revoke\n </ActionItem>\n </CheckPermission>\n </ActionButton>\n </div>\n <PopupComponent\n triggerRef={triggerRef}\n open={assignSingleLabelOpen === invitation.id}\n onDismiss={() => {\n setAssignSingleLabelOpen(null);\n }}\n >\n <AssignLabels\n onLabelsChange={handleSaveSelectedLabels}\n onSuccessApply={() => {\n setAssignSingleLabelOpen(null);\n }}\n withBorder={true}\n />\n </PopupComponent>\n </span>\n );\n};\n\nexport default InvitationsListActions;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Pending = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg ref={ref} className={className} width=\"49\" height=\"49\" viewBox=\"0 0 49 49\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M39.946 38.426c-1.058-.953-9.622-3.015-11.287-3.41 4.297-2.26 6.955-7.734 6.956-12.892C35.615 15.429 33.578 10 24.414 10c-9.164 0-11.201 5.429-11.201 12.124 0 5.178 2.683 10.672 7.01 12.916-1.928.447-10.23 2.417-11.311 3.386-1.946 1.74-2.734 6.962-.789 9.574l16.37-.004L40.715 48c1.93-2.612 1.161-7.834-.768-9.574zM15.712 22.168c0-5.412 1.45-9.8 8.701-9.8 7.25 0 8.7 4.387 8.7 9.8 0 4.503-2.35 9.478-6.21 11.04v4.111h1.182c4.691.983 8.98 2.342 10.26 2.943.8.903 1.305 3.568.803 5.364l-14.656-.004-14.81.004c-.504-1.796.016-4.469.828-5.365 1.275-.611 5.637-1.969 10.385-2.942h1.034V33.21c-3.863-1.557-6.217-6.537-6.217-11.042z\" fill=\"#B1C0CB\" />\n <path d=\"m28.659 35.017-.117-.222-.59.311.649.154.058-.243zm11.287 3.409.167-.186-.167.186zm-4.331-16.302h.25-.25zM20.223 35.04l.057.243.66-.153-.602-.312-.115.222zM8.912 38.426l.167.186-.167-.186zM8.123 48l-.2.15.075.1h.125V48zm16.37-.004v-.25.25zM40.715 48v.25h.126l.075-.101-.2-.149zm-13.81-14.793-.094-.231-.156.063v.168h.25zm0 4.112h-.25v.25h.25v-.25zm1.181 0 .052-.245-.026-.005h-.026v.25zm10.26 2.943.187-.166-.034-.038-.046-.022-.107.226zm.803 5.364v.25h.19l.05-.183-.24-.067zm-14.656-.004v-.25.25zm-14.81.004-.24.067.051.183h.19v-.25zm.828-5.365-.108-.226-.044.021-.033.037.185.168zm10.385-2.942v-.25h-.026l-.025.005.05.245zm1.034 0v.25h.25v-.25h-.25zm0-4.109h.25v-.168l-.157-.064-.093.232zm6.672 2.05c.832.197 3.386.81 5.863 1.493 1.239.341 2.455.7 3.425 1.03.486.166.906.324 1.236.468.338.148.554.271.654.36l.334-.371c-.165-.149-.448-.299-.787-.447a16.808 16.808 0 0 0-1.275-.483 63.732 63.732 0 0 0-3.455-1.04 180.03 180.03 0 0 0-5.88-1.497l-.115.487zm6.764-13.136c0 5.09-2.628 10.465-6.823 12.671l.233.443c4.4-2.314 7.09-7.888 7.09-13.114h-.5zM24.414 10.25c4.531 0 7.244 1.34 8.837 3.452 1.605 2.127 2.114 5.09 2.114 8.422h.5c0-3.363-.51-6.463-2.215-8.723-1.716-2.276-4.603-3.651-9.236-3.651v.5zM13.463 22.124c0-3.332.509-6.295 2.113-8.422 1.593-2.113 4.307-3.452 8.838-3.452v-.5c-4.633 0-7.52 1.375-9.237 3.65-1.705 2.261-2.214 5.36-2.214 8.724h.5zm6.876 12.694c-4.225-2.19-6.876-7.584-6.876-12.694h-.5c0 5.247 2.714 10.84 7.145 13.138l.23-.444zm-11.26 3.794c.103-.092.318-.216.651-.363a15.65 15.65 0 0 1 1.215-.461 59.45 59.45 0 0 1 3.37-1.01 172.237 172.237 0 0 1 5.965-1.495l-.113-.487c-.966.224-3.527.83-5.983 1.5a60.026 60.026 0 0 0-3.4 1.019c-.484.165-.912.325-1.256.477-.335.148-.616.298-.783.448l.334.372zm-.755 9.239c-.92-1.236-1.21-3.121-1.017-4.939.194-1.821.865-3.49 1.772-4.3l-.334-.373c-1.039.93-1.735 2.743-1.935 4.62-.2 1.882.087 3.914 1.113 5.29l.4-.298zm16.17-.105-16.371.004v.5l16.37-.004v-.5zm16.22.004-16.22-.004v.5l16.22.004v-.5zm-.935-9.139c.898.81 1.56 2.479 1.75 4.3.189 1.818-.103 3.705-1.016 4.94l.402.298c1.017-1.377 1.306-3.408 1.111-5.289-.195-1.877-.882-3.69-1.913-4.62l-.334.371zM24.413 12.117c-3.678 0-5.943 1.117-7.273 2.976-1.316 1.84-1.678 4.358-1.678 7.075h.5c0-2.695.364-5.078 1.585-6.784 1.208-1.689 3.294-2.767 6.866-2.767v-.5zm8.95 10.05c0-2.717-.36-5.234-1.677-7.075-1.33-1.859-3.595-2.975-7.273-2.975v.5c3.572 0 5.658 1.078 6.866 2.766 1.221 1.707 1.585 4.09 1.585 6.785h.5zM26.998 33.44c1.999-.808 3.59-2.493 4.68-4.53a14.597 14.597 0 0 0 1.687-6.741h-.5c0 2.21-.578 4.54-1.629 6.505-1.051 1.967-2.565 3.55-4.425 4.303l.187.463zm.157 3.88v-4.112h-.5v4.112h.5zm.931-.25h-1.181v.5h1.181v-.5zm10.367 2.967c-1.307-.614-5.619-1.977-10.315-2.962l-.103.49c4.686.982 8.952 2.336 10.205 2.925l.213-.453zm.937 5.657c.263-.944.26-2.097.093-3.124-.166-1.017-.502-1.967-.95-2.473l-.374.332c.352.397.669 1.231.83 2.221.16.98.157 2.057-.08 2.91l.48.134zm-14.897.18 14.656.003v-.5l-14.656-.004v.5zm-14.81.003 14.81-.004v-.5l-14.81.004v.5zm.643-5.783c-.455.502-.798 1.453-.969 2.471-.172 1.029-.18 2.185.086 3.13l.481-.136c-.239-.852-.238-1.93-.074-2.91.166-.992.49-1.825.846-2.22l-.37-.335zm10.52-3.019c-4.752.974-9.14 2.336-10.443 2.961l.216.451c1.246-.597 5.584-1.95 10.327-2.922l-.1-.49zm1.084-.005h-1.034v.5h1.034v-.5zm-.25-3.859v4.11h.5v-4.11h-.5zm-6.217-11.042a14.6 14.6 0 0 0 1.69 6.745c1.09 2.038 2.682 3.723 4.683 4.53l.187-.465c-1.862-.75-3.377-2.334-4.43-4.301a14.1 14.1 0 0 1-1.63-6.51h-.5z\" fill=\"#fff\" />\n <rect x=\"1\" y=\"1\" width=\"46\" height=\"46\" rx=\"7\" stroke=\"#B1C0CB\" strokeWidth=\"2\" />\n <path d=\"M27 26h21v22H30v-8.25h-3V26z\" fill=\"#fff\" />\n <path d=\"M47.455 32.514v-1.7c.541-.28.91-.796.91-1.391v-.404c0-.223-.204-.404-.455-.404H32.455c-.252 0-.455.18-.455.404v.404c0 .595.368 1.11.91 1.39v1.701c0 1.6.767 3.133 2.106 4.203l1.99 1.59-1.99 1.591c-1.339 1.07-2.107 2.602-2.107 4.203v1.7c-.54.28-.909.796-.909 1.391v.404c0 .223.203.404.455.404H47.91c.251 0 .454-.18.454-.404v-.404c0-.595-.368-1.11-.909-1.39V44.1c0-1.6-.768-3.133-2.107-4.203l-1.989-1.59 1.99-1.591c1.338-1.07 2.106-2.602 2.106-4.203zm-3.323 3.002-2.74 2.191a.77.77 0 0 0-.3.6c0 .23.108.448.3.6l2.74 2.192c.956.764 1.505 1.859 1.505 3.002v1.476h-10.91V44.1c0-1.143.549-2.238 1.505-3.002l2.74-2.191a.77.77 0 0 0 .301-.6.77.77 0 0 0-.3-.6l-2.74-2.191c-.957-.765-1.506-1.86-1.506-3.003v-1.476h10.91v1.476c0 1.143-.549 2.238-1.505 3.002z\" fill=\"#B1C0CB\" />\n <path d=\"M43.04 33.461h-5.716a.417.417 0 0 0-.38.23.366.366 0 0 0 .073.417l2.887 2.484a.43.43 0 0 0 .278.1c.1 0 .2-.033.278-.1l2.887-2.484a.366.366 0 0 0 .072-.417.417.417 0 0 0-.38-.23zM37.324 46.385h5.716c.164 0 .313-.136.379-.346a.764.764 0 0 0-.072-.624l-2.887-3.727a.356.356 0 0 0-.278-.15c-.1 0-.2.05-.279.15l-2.886 3.727a.765.765 0 0 0-.072.624c.066.21.215.346.379.346z\" fill=\"#B1C0CB\" />\n </svg>\n\n );\n }\n);\n\nexport default Pending;\n","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableColumnStyle: {\n minWidth: 250,\n },\n\n avatarTableCellCustomStyle: {\n padding: 0,\n },\n}));\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\n\nimport { useChunkRequestsService } from '../../../../services/ChunkRequestService/hooks';\nimport { ITEM_PER_CHUNK_SIZE } from '../../../../services/ChunkRequestService/hooks/constants';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../ui/components/ModalDialogs/store/actions';\nimport { GeneralBulkActionModalInterface } from '../../../../ui/components/ModalDialogs/types';\nimport { DELETE_USER_ACTION, RESEND_INVITATION_ACTION, REVOKE_INVITATION_ACTION } from './constants';\nimport { useSearchUsersAndResendInvitation, useSearchUsersAndDeleteUser, useSearchUsersAndRevokeInvitation } from './helpers';\nimport { ResendInvitationChunkRequestParameters, DeleteUserChunkRequestParameters, RevokeInvitationChunkRequestParameters } from './types';\n/**\n *\n * @description Custom hook to revoke invitations with chunk service\n * when all items are selected.\n * @function useRevokeInvitationBulkActionService\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\n export function useRevokeInvitationBulkActionService(\n searchParams: SearchParams,\n companyId: number,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n ) {\n const dispatch = useDispatch();\n const searchUsersAndRevokeInvitation = useSearchUsersAndRevokeInvitation();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedRevokeInvitations = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<RevokeInvitationChunkRequestParameters>[] =\n [\n {\n actionName: REVOKE_INVITATION_ACTION,\n actionFunction: searchUsersAndRevokeInvitation,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n offset: totalUsersCount,\n },\n companyId,\n onSuccessCallback: () =>\n (totalCompletedRevokeInvitations.current =\n totalCompletedRevokeInvitations.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedRevokeInvitations\n * @returns { void }\n */\n const clearTotalCompletedRevokeInvitations = () =>\n (totalCompletedRevokeInvitations.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedRevokeInvitations();\n\n showMessage('All Invites have been revoked', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Revoke Invitations',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedRevokeInvitations();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopRevokeInvitationsBulkActionService\n * @returns { void }\n */\n const handleStopRevokeInvitationsBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n totalCompletedRevokeInvitations.current *\n ITEM_PER_CHUNK_SIZE\n } Invites have been revoked`,\n 'success'\n );\n\n clearTotalCompletedRevokeInvitations();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartRevokeInvitationBulkActionService\n * @returns { void }\n */\n const handleStartRevokeInvitationBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Revoke Invitations',\n onStopBulkActionService:\n handleStopRevokeInvitationsBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopRevokeInvitationsBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartRevokeInvitationBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n }\n\n/**\n *\n * @description Custom hook to resend invitations with chunk service\n * when all items are selected.\n * @function useResendInvitationBulkActionService\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useResendInvitationBulkActionService(\n searchParams: SearchParams,\n companyId: number,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const searchUsersAndResendInvitation = useSearchUsersAndResendInvitation();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedResendInvitations = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<ResendInvitationChunkRequestParameters>[] =\n [\n {\n actionName: RESEND_INVITATION_ACTION,\n actionFunction: searchUsersAndResendInvitation,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n offset: totalUsersCount,\n },\n companyId,\n onSuccessCallback: () =>\n (totalCompletedResendInvitations.current =\n totalCompletedResendInvitations.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedResendInvitations\n * @returns { void }\n */\n const clearTotalCompletedResendInvitations = () =>\n (totalCompletedResendInvitations.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedResendInvitations();\n\n showMessage('All Invites have been sent', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Resend Invitations',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedResendInvitations();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDuplicateTeamBulkActionService\n * @returns { void }\n */\n const handleStopDuplicateTeamBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n totalCompletedResendInvitations.current *\n ITEM_PER_CHUNK_SIZE\n } Invites have been sent`,\n 'success'\n );\n\n clearTotalCompletedResendInvitations();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartResendInvitationBulkActionService\n * @returns { void }\n */\n const handleStartResendInvitationBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Resend Invitations',\n onStopBulkActionService:\n handleStopDuplicateTeamBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopDuplicateTeamBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartResendInvitationBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n}\n\n\n/**\n *\n * @description Custom hook to delete users with chunk service\n * when all items are selected.\n * @function useDeleteUserBulkActionService\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\n export function useDeleteUserBulkActionService(\n searchParams: SearchParams,\n companyId: number,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const dispatch = useDispatch();\n const searchUsersAndDeleteUser = useSearchUsersAndDeleteUser();\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const deletedUsersTotalCount = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<DeleteUserChunkRequestParameters>[] =\n [\n {\n actionName: DELETE_USER_ACTION,\n actionFunction: searchUsersAndDeleteUser,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n offset: totalUsersCount,\n },\n companyId,\n onSuccessCallback: () =>\n (deletedUsersTotalCount.current =\n deletedUsersTotalCount.current + 1),\n },\n fieldName: 'searchParams.offset',\n },\n },\n ];\n\n /**\n * @function ResetDeletedUsersTotalCount\n * @returns { void }\n */\n const ResetDeletedUsersTotalCount = () =>\n (deletedUsersTotalCount.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n ResetDeletedUsersTotalCount();\n\n showMessage('Users have been deactivated.', 'success');\n onSuccessCallback?.();\n });\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: 'Deactivate Users',\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n ResetDeletedUsersTotalCount();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopDuplicateTeamBulkActionService\n * @returns { void }\n */\n const handleStopDuplicateTeamBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n showMessage(\n `${\n deletedUsersTotalCount.current *\n ITEM_PER_CHUNK_SIZE\n } Users have been deactivated.`,\n 'success'\n );\n\n ResetDeletedUsersTotalCount();\n\n onSuccessCallback?.();\n });\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartDeleteUserBulkActionService\n * @returns { void }\n */\n const handleStartDeleteUserBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: 'Deactivate Users',\n onStopBulkActionService:\n handleStopDuplicateTeamBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [\n dispatch,\n handleStopDuplicateTeamBulkActionService,\n hideModalDialog,\n setIsStopped,\n ]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartDeleteUserBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback(() => {\n setIsRunning(true);\n }, []);\n\n\n}","import { useCallback } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport { useResendInvitationApi, useSearchUsersApi, useDeleteUserApi, useRevokePendingUsers } from '../../../../api';\nimport { SearchUsersParams } from '../../../../api/users/types';\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { getSearchSortingValue } from '../../../../helpers/functions/search-params-helpers';\nimport { UserStatus } from '../../store/costants';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\n/**\n * @function useSearchUsersAndRevokeInvitation\n * @returns { CallableFunction }\n */\n export const useSearchUsersAndRevokeInvitation = () => {\n const searchUsersApi = useSearchUsersApi();\n const revokeInvitations = useRevokePendingUsers();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n searchParams: SearchParams,\n companyId: number,\n onSuccessCallback: () => void\n ) => {\n const searchPendingUsersParams: SearchUsersParams = {\n status: UserStatus.PENDING,\n roles: searchParams.roleIDs?.join(','),\n labels: searchParams.labelIDs?.join(','),\n invitedBy: searchParams.invitersIDs?.join(','),\n companies: companyId.toString(),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\n };\n\n await searchUsersApi({ ...searchPendingUsersParams })\n .then(async (response: Record<string, any>) => {\n const userIds = response?.items?.map(\n (item: { id: number }) => item.id\n ) as number[];\n\n if (!isEmpty(userIds)) {\n await revokeInvitations(userIds)\n .then(() => {\n onSuccessCallback();\n })\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [revokeInvitations, searchUsersApi, showMessage]\n );\n};\n\n/**\n * @function useSearchUsersAndResendInvitation\n * @returns { CallableFunction }\n */\nexport const useSearchUsersAndResendInvitation = () => {\n const searchUsersApi = useSearchUsersApi();\n const resendInvitation = useResendInvitationApi();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n searchParams: SearchParams,\n companyId: number,\n onSuccessCallback: () => void\n ) => {\n const searchPendingUsersParams: SearchUsersParams = {\n status: UserStatus.PENDING,\n roles: searchParams.roleIDs?.join(','),\n labels: searchParams.labelIDs?.join(','),\n invitedBy: searchParams.invitersIDs?.join(','),\n companies: companyId.toString(),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\n };\n\n await searchUsersApi({ ...searchPendingUsersParams })\n .then(async (response: Record<string, any>) => {\n const userIds = response?.items?.map(\n (item: { id: number }) => item.id\n ) as number[];\n\n if (!isEmpty(userIds)) {\n await resendInvitation(userIds)\n .then(() => {\n onSuccessCallback();\n })\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [resendInvitation, searchUsersApi, showMessage]\n );\n};\n\n/**\n * @function useSearchUsersAndDeleteUser\n * @returns { CallableFunction }\n */\n export const useSearchUsersAndDeleteUser = () => {\n const searchUsersApi = useSearchUsersApi();\n const deleteUser = useDeleteUserApi();\n\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @returns { Promise<void> }\n */\n return useCallback(\n async (\n searchParams: SearchParams,\n companyId: number,\n onSuccessCallback: () => void\n ) => {\n const searchRegisteredUsersParams: SearchUsersParams = {\n status: UserStatus.ACTIVE,\n roles: searchParams.roleIDs?.join(','),\n labels: searchParams.labelIDs?.join(','),\n teams: searchParams.teamIds?.join(','),\n companies: companyId.toString(),\n limit: searchParams.limit ?? 20,\n offset: 0,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'name', true),\n };\n\n await searchUsersApi({ ...searchRegisteredUsersParams })\n .then(async (response: Record<string, any>) => {\n const userIds = response?.items?.map(\n (item: { id: number }) => item.id\n ) as number[];\n\n if (!isEmpty(userIds)) {\n await deleteUser(userIds)\n .then(() => {\n onSuccessCallback();\n })\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [deleteUser, searchUsersApi, showMessage]\n );\n};\n\n","export const REVOKE_INVITATION_ACTION = 'REVOKE_INVITATION_ACTION';\nexport const RESEND_INVITATION_ACTION = 'RESEND_INVITATION_ACTION';\nexport const DELETE_USER_ACTION = 'DELETE_USER_ACTION';","import { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { History } from 'history';\nimport { useHistory } from 'react-router';\nimport { isEmpty as lodashIsEmpty, isEqual } from 'lodash';\n\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport {\n ASSIGN_LABEL_OPTIONS,\n LOAD_ASSIGNED_LABELS,\n isAdminRole,\n} from '../../../../constants/enums';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport {\n useCopyInviteTextService,\n useResendInvitationService,\n useRevokeInvitationService,\n useSearchInvitationsService,\n useUpdateAllSelectedInvitationsStateService,\n useUpdateSelectedInvitationStateService,\n useDeleteUserLabelService,\n} from '../../store/services';\nimport {\n selectSelectedInvitations,\n useInvitationsState,\n useUpdateInvitationsState,\n} from '../../store/states';\nimport {\n hasPermission,\n NEW_PERMISSIONS,\n} from '../../tools';\nimport UsersPageNavigationContainer from '../../components/UsersPageNavigation';\nimport { UserV2, UserProfile } from '../../../../constants/interfaces/User';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport {\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../labels/store/states';\nimport {\n clearSelectedItemIfNotLoaded,\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabels,\n} from '../../../labels/tools';\nimport {\n useSaveUserFiltersService,\n useSetAssignLabelsActionService,\n} from '../../../labels/store/services';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport ROUTES from '../../../../routes/routes';\nimport { usePermissionsState } from '../../../permissions/store/state';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { countAppliedFiltersCount } from '../../../teams/pages/ListOfTeams/tools';\nimport { Popup } from '../../../../ui/components/Popup';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport { InvitationsFilter } from '../../components/Filters/InvitationsFilter';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { WithTeamsContext } from '../../../portableTeams';\nimport InvitationsListActions from '../../components/ListActions/InvitationsListActions';\nimport {\n InvitationActions,\n InvitationActionsHelper,\n useInvitationActionsHelper,\n} from '../../tools';\nimport { useSessionEffect } from '../../../common';\nimport {\n useDeselectAllTeams,\n useSaveTeams,\n} from '../../../portableTeams/store/hors/withTeams/services';\nimport {\n useDeSelectAllInvitersAction,\n useRefreshInviters,\n} from '../../../inviters/store/services';\nimport {\n useDraftEditState,\n DraftEditState,\n} from '../../../../pages/ActionPages/NewUser/store/states';\nimport Pending from '../../../../ui/icons/Pending';\nimport { normalizeSP } from '../../../../helpers/functions/searchparams-normalize';\nimport {\n useAssignedLabelsIdsApi,\n useAssignUserLabelsApi,\n useDeleteUserLabelsApi,\n} from '../../../../api';\nimport { getSearchState } from '../../../searchState/store/reducer';\nimport { SearchStateInterface } from '../../../searchState/store/states';\nimport { SEARCH_STATE } from '../../../searchState/constants';\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { useStyles } from './styles';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport {\n onListenEvent,\n onRemoveEvent,\n onTriggerEvent,\n} from '../../../../helpers/functions/Events';\nimport {\n CLEAR_PAGING,\n EventNameList,\n REFRESH_PENDING_USERS_PAGE,\n} from '../../../../helpers/functions/Events/types';\nimport { usePreviousData } from '../../../../helpers/hooks/usePreviousData';\nimport {\n useUpdateLabelsBulkActionService,\n useUpdateMultipleEntityLabelsBulkActionService,\n} from '../../../../services/GeneralBulkActionServices';\nimport {\n useResendInvitationBulkActionService,\n useRevokeInvitationBulkActionService,\n} from '../../services/UserBulkActionsService';\nimport { useGetCompanyService, useGetCompanyUserStatsService } from '../../../../pages/CompanySettings/store/services';\nimport { UPDATE_MULTIPLE_LABEL_ACTION } from '../../../../services/GeneralBulkActionServices/constants';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\nimport { CompanyUserStatsText } from '../../../../ui/components/CompanyUserStatsText';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nconst Invitations: FC<{\n history: History<any>;\n searchInvitations: (sp: SearchParams, companyId: number) => void;\n deleteUserLabel: (userId: number, labelId: number) => void;\n setAssignLabelsAction(labels: number[]): void;\n onResendInvitation: (\n invitationIds: number[],\n isRowResend?: boolean,\n search?: SearchParams,\n selectAll?: boolean\n ) => void;\n onRevokeInvitation: (\n invitationIds: number[],\n successCallback?: () => void\n ) => void;\n onCopyInviteText: (invitation: UserV2) => void;\n users?: ListResult<UserV2>;\n selectedInvitationIds?: number[];\n selectedInvitations?: UserV2[];\n actionsHelper: InvitationActionsHelper;\n updatedInvitations?: { id: number };\n loading?: boolean;\n selectedLabels?: number[];\n assignedLabels?: number[];\n updateAllSelectedInvitations(\n invitationIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedInvitation(invitationId: number): void;\n updatedLabels?: any;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n draftEdit?: DraftEditState;\n searchState: SearchStateInterface;\n profile?: UserProfile;\n getCompanyUserStats: (companyId: number) => void;\n}> = ({\n users,\n searchInvitations,\n setAssignLabelsAction,\n onResendInvitation,\n onRevokeInvitation,\n onCopyInviteText,\n updatedInvitations,\n selectedLabels,\n selectedInvitationIds,\n selectedInvitations,\n actionsHelper,\n assignedLabels,\n updateAllSelectedInvitations,\n updateSelectedInvitation,\n deleteUserLabel,\n updatedLabels,\n loading,\n history,\n saveGlobalLabelFilters,\n draftEdit,\n searchState,\n profile,\n getCompanyUserStats,\n}) => {\n const classes = useStyles();\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n\n const refreshInvitersList = useRefreshInviters();\n\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n const prevCompanyId = usePreviousData(profile?.companyId);\n\n const canAccessPage = useHandleAccessPage();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n labelIDs: selectedLabels,\n filters: [],\n orderBy: {\n field: 'date_created',\n asc: false,\n },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const usableParams: SearchParams =\n !isEmpty(searchState) &&\n !!searchState?.params &&\n searchState.key === SEARCH_STATE.PENDING_USERS.name\n ? searchState.params\n : initialSearchParams;\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n refreshSearchParams,\n setCustom,\n setFilter,\n } = useSearchParamsState(usableParams);\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n const isCheckboxPartiallySelected =\n users &&\n users.items &&\n selectedInvitationIds &&\n selectedInvitationIds.length < users.items.length;\n\n const showMessage = useShowMessage();\n\n const handleTableStates = useTableStateHelper();\n\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: searchParams.labelIDs?.length,\n itemsCount: users?.items.length || 0,\n });\n\n const refreshData = useCallback(() => {\n if (!profile?.companyId) return;\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchInvitations(searchParams, profile.companyId);\n setLastRefreshed(new Date());\n updateAllSelectedInvitations([], true, isCheckboxPartiallySelected);\n setIsSelectAll(false);\n }, [\n profile?.companyId,\n initialOffset,\n searchInvitations,\n searchParams,\n updateAllSelectedInvitations,\n isCheckboxPartiallySelected,\n ]);\n\n /**\n * @function onConfirmRevokeInvitationsSuccessCallback\n * @param { number[] } ids\n * @returns { void }\n */\n const onConfirmRevokeInvitationsSuccessCallback = (ids: number[]): void => {\n let message;\n\n Promise.resolve().then(() => {\n if (!pageIndex || pageIndex === 1) {\n refreshData();\n } else {\n // if the current page is not page 1,\n // move paging to page 1\n onTriggerEvent(EventNameList[CLEAR_PAGING]);\n }\n });\n\n // refresh inviters list on filters.\n refreshInvitersList();\n getCompanyUserStats(profile!.companyId);\n\n if (ids?.length === 1) {\n message = 'Invite has been revoked';\n } else {\n message =\n ids.length > 1\n ? `${\n isSelectAll ? users?.count : ids.length\n } Invites have been revoked`\n : '1 Invite has been revoked';\n }\n showMessage(message, 'success');\n };\n\n /**\n * @function onConfirmRevokeInvitations\n * @param { number[] } revokeInvitationIds\n * @returns { void }\n */\n const onConfirmRevokeInvitations = (\n revokeInvitationIds: number[]\n ): void => {\n onRevokeInvitation(revokeInvitationIds, () =>\n onConfirmRevokeInvitationsSuccessCallback(revokeInvitationIds)\n );\n };\n\n /**\n * @function handleRevokeInvitation\n * @param { number[] } revokeInvitationIds\n * @returns { void }\n */\n const handleRevokeInvitation = (revokeInvitationIds: number[]): void => {\n showConfirmationModalDialog({\n modalTitle: 'Revoke Invitation',\n description: `Are you sure you want to revoke the ${\n revokeInvitationIds.length > 1\n ? 'invitations for these users'\n : 'invitation for this user'\n }?`,\n cancelButtonText: 'Go Back',\n confirmButtonText: 'Yes, Revoke',\n onConfirm: () => onConfirmRevokeInvitations(revokeInvitationIds),\n customization: {\n padding: '45px 32px 40px 40px',\n descriptionMarginBottom: 9\n },\n });\n };\n\n const onSuccessRevokeInvitationBulkActionService = useCallback(() => {\n refreshData();\n // refresh inviters list on filters.\n refreshInvitersList();\n }, [refreshData, refreshInvitersList]);\n\n const revokeInvitationBulkActionService =\n useRevokeInvitationBulkActionService(\n searchParams,\n profile?.companyId ?? 0,\n users?.count ?? 0,\n onSuccessRevokeInvitationBulkActionService\n );\n\n /**\n * @function handleRevokeMultipleInvitations\n * @returns { void }\n */\n const handleRevokeMultipleInvitations = (): void => {\n selectedInvitationIds &&\n (isSelectAll\n ? revokeInvitationBulkActionService()\n : handleRevokeInvitation(selectedInvitationIds));\n };\n\n /**\n * @function handleResendInvitation\n * @returns { void }\n */\n const handleResendInvitation = useCallback(\n (\n invitationIds: number[],\n search?: SearchParams,\n isSelectAll?: boolean\n ) => {\n onResendInvitation(\n invitationIds,\n invitationIds.length === 1,\n isSelectAll\n ? normalizeSP(searchParams, users!.count)\n : searchParams,\n isSelectAll\n );\n },\n [onResendInvitation, searchParams, users]\n );\n\n const handleResendInvitationBulkActionService =\n useResendInvitationBulkActionService(\n searchParams,\n profile?.companyId ?? 0,\n users?.count ?? 0,\n refreshData\n );\n\n /**\n * @function handleResendMultipleInvitation\n * @returns { void }\n */\n const handleResendMultipleInvitation = (): void => {\n if (\n !selectedInvitationIds ||\n (!!selectedInvitationIds && !selectedInvitationIds.length)\n )\n return;\n\n isSelectAll\n ? handleResendInvitationBulkActionService()\n : handleResendInvitation(\n selectedInvitationIds,\n searchParams,\n isSelectAll\n );\n };\n\n const getDeletedLabels = useCalculateDeletedLabels();\n const assignLabelsToUser = useAssignUserLabelsApi();\n const deleteLabelsFromUser = useDeleteUserLabelsApi();\n\n const updateMultipleUsersLabels =\n useUpdateMultipleEntityLabelsBulkActionService(\n assignLabelsToUser,\n deleteLabelsFromUser,\n isSelectAll,\n {\n actionName: UPDATE_MULTIPLE_LABEL_ACTION,\n actionFunction: searchInvitations,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n limit: 1,\n offset: users?.count ?? 0,\n },\n companyId: profile?.companyId ?? 0,\n shouldSetStore: false,\n },\n fieldName: 'searchParams.offset',\n },\n },\n refreshData\n );\n\n const assignLabels = async () => {\n if (assignedLabels && selectedInvitationIds) {\n const { preAssignedLabels } = await getAssignedLabelsIds(\n selectedInvitationIds,\n LOAD_ASSIGNED_LABELS.USERS_PENDING,\n ASSIGN_LABEL_OPTIONS.USER,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n return calculatePreSelectedLabels(\n selectedInvitationIds,\n users,\n data\n );\n });\n\n const deletedLabels = getDeletedLabels(assignedLabels);\n\n const deletedLabelsFiltered = deletedLabels.filter(\n x =>\n preAssignedLabels.includes(x) ||\n preAssignedLabels.includes(-x)\n );\n const selectedLabelsFiltered = assignedLabels.filter(\n x => x > 0 && !preAssignedLabels.includes(x)\n );\n\n updateMultipleUsersLabels(\n {\n entityName: 'user',\n entityIds: selectedInvitationIds,\n },\n selectedLabelsFiltered,\n deletedLabelsFiltered\n );\n }\n };\n\n const getAssignedLabelsIds = useAssignedLabelsIdsApi();\n\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n\n const updateAllUsersCheck = useCallback(\n (checked: boolean) => {\n const userIds =\n (users && users.items.map((user: UserV2) => Number(user.id))) ||\n [];\n updateAllSelectedInvitations(\n userIds,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [users, isCheckboxPartiallySelected, updateAllSelectedInvitations]\n );\n\n const handleUserCheck = (e: any, user: UserV2) => {\n e.stopPropagation();\n if (!!user.id) {\n updateSelectedInvitation(user.id);\n }\n };\n\n const permissions = usePermissionsState();\n\n const handleViewProfile = (user: UserV2) => {\n if (permissions.includes(NEW_PERMISSIONS.VIEW_USER_PERFORMANCE)) {\n history.push(\n ROUTES.INVITATION_PERFORMANCE.replace(\n ':userId',\n user.id!.toString()\n ),\n { useGoBack: true }\n );\n } else {\n return false;\n }\n };\n\n const orderBy = searchParams.orderBy;\n const hcFirstName = useOrderBy('name', orderBy, setOrderBy);\n const hcEmail = useOrderBy('email', orderBy, setOrderBy);\n const hcRole = useOrderBy('role_name', orderBy, setOrderBy);\n const hcInvitedOn = useOrderBy('date_created', orderBy, setOrderBy);\n const hcInvitedby = useOrderBy('invited_by', orderBy, setOrderBy);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const isListEmpty = !users || (users && !users.items.length);\n\n const filterRoleHandler = (roleIds: number[]) => {\n setCustom('roleIDs', roleIds);\n };\n\n const labelChangeHandler = (ids: number[]) => {\n saveGlobalLabelFilters(ids);\n };\n\n const filterInvitersHandler = (invitersIDs: number[]) => {\n setCustom('invitersIDs', invitersIDs);\n setFilter({ field: 'creatorId', value: invitersIDs });\n };\n\n const bulkActions = useMemo(\n () => actionsHelper.getBulkActions(selectedInvitations),\n [selectedInvitations, actionsHelper]\n );\n\n const assignedFiltersCount = countAppliedFiltersCount(searchParams);\n\n const deselectTeams = useDeselectAllTeams();\n const deselectAllInviters = useDeSelectAllInvitersAction();\n const saveTeams = useSaveTeams();\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n updateAllUsersCheck(event.target.checked);\n setIsSelectAll(false);\n };\n\n /**\n * @function checkIsRowChecked\n * @param { UserV2 } row\n * @returns { boolean }\n */\n const checkIsRowChecked = (row: UserV2): boolean =>\n !!selectedInvitationIds &&\n !!row.id &&\n selectedInvitationIds.includes(row.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { UserV2 } row\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, row: UserV2) => {\n handleUserCheck(event, row);\n setIsSelectAll(false);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { UserV2 } row\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (row: UserV2): boolean => {\n return labelsOpen === row.id;\n };\n\n /**\n * @function onDeleteLabelHandler\n * @param { number } labelId\n * @param { number } userId\n * @returns { void }\n */\n const onDeleteLabelHandler = (labelId: number, userId: number): void => {\n deleteUserLabel(userId, labelId);\n };\n\n useSessionEffect(() => {\n if (!profile?.companyId) return;\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchInvitations(searchParams, profile.companyId);\n }, [profile?.companyId, searchInvitations, searchParams, history]);\n\n useEffect(() => {\n if (updatedInvitations || !!draftEdit?.updateData?.id) {\n refreshSearchParams();\n }\n }, [updatedInvitations, refreshSearchParams, draftEdit?.updateData?.id]);\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (updatedLabels && updatedLabels.updateType === 'delete')\n refreshSearchParams();\n }, [updatedLabels, refreshSearchParams]);\n\n useEffect(() => {\n setLastRefreshed(new Date());\n }, [users]);\n\n useEffect(() => {\n return () =>\n updateAllSelectedInvitations([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllSelectedInvitations([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [users, history.location.pathname]);\n\n useEffect(() => {\n if (\n selectedInvitations?.length &&\n selectedInvitations.length === users?.count\n ) {\n setIsSelectAll(true);\n }\n }, [users?.count, selectedInvitations]);\n\n /**\n * @function onOpenAssignLabelAction\n * @returns { void }\n */\n const onOpenAssignLabelAction = (): void => {\n if (users?.items && !lodashIsEmpty(selectedInvitationIds)) {\n getAssignedLabelsIds(\n selectedInvitationIds as number[],\n LOAD_ASSIGNED_LABELS.USERS_PENDING,\n ASSIGN_LABEL_OPTIONS.USER,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedInvitationIds as number[],\n users,\n data\n );\n\n setAssignLabelsAction(preAssignedLabels);\n });\n }\n };\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n }, [initialOffset, pageIndex, setOffset]);\n\n useEffect(() => {\n const filteredUsers = users\n ? users.items.map(user => Number(user.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedInvitationIds,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllSelectedInvitations(usersToClear, false);\n }\n }, [selectedInvitationIds, users, updateAllSelectedInvitations]);\n\n useEffect(() => {\n return () => {\n deselectTeams();\n saveTeams();\n deselectAllInviters();\n };\n }, [deselectTeams, saveTeams, deselectAllInviters]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_INVITATION]);\n }, [canAccessPage]);\n\n // Listen to Invite Users Screen Refresh dispatch\n useEffect(() => {\n onListenEvent(EventNameList[REFRESH_PENDING_USERS_PAGE], () => {\n if (\n profile?.companyId &&\n !isEqual(prevCompanyId, profile.companyId)\n ) {\n refreshData();\n }\n });\n\n return () => {\n onRemoveEvent(\n EventNameList[REFRESH_PENDING_USERS_PAGE],\n refreshData\n );\n };\n }, [prevCompanyId, profile, refreshData]);\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToUser,\n deleteLabelsFromUser,\n refreshData\n );\n\n /**\n * @function handleUpdateUserLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { number } userId\n * @returns { void }\n */\n const handleUpdateUserLabels = (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n userId: number\n ): void => {\n updateLabelsBulkActionService(\n {\n entityName: 'user',\n entityId: userId,\n },\n addedLabelIds,\n deletedLabelIds\n );\n };\n\n return (\n <MainWrapper\n subTitle=\"Users\"\n subHeader={profile?.companyId &&\n <CompanyUserStatsText\n companyId={profile.companyId}\n showSettingsButton={isAdminRole(profile?.role?.name)}\n />\n }\n tabs={<UsersPageNavigationContainer />}\n htmlPageTitle=\"Users - Practis\"\n dataTest=\"users\"\n >\n {loading && !isSelectAll && <LoadingComponent />}\n\n <TableWrapper\n tableStates={tableStates}\n data={users?.items}\n selectedLabels={selectedLabels}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'users-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: users?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'users-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled:\n isListEmpty && searchParams.searchTerm.length === 0,\n },\n isSelectedItemOptionsVisible:\n !lodashIsEmpty(selectedInvitations) &&\n !lodashIsEmpty(users),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedInvitations?.length,\n totalCount: users?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: () => {\n updateAllSelectedInvitations(\n [],\n true,\n isCheckboxPartiallySelected\n );\n setIsSelectAll(false);\n },\n onSelectAll: () => {\n setIsSelectAll(true);\n updateAllUsersCheck(true);\n },\n bulkActionsConfig: {\n disabled: bulkActions.areBulkActionsDisabled(),\n disabledLabel: bulkActions.areItemsEmpty()\n ? undefined\n : \"Bulk actions can't be applied\",\n assignLabelsPermissions:\n bulkActions.isBulkActionVisible(\n InvitationActions.ASSIGN_INVITATION_LABEL\n )\n ? [NEW_PERMISSIONS.ASSIGN_INVITATION_LABEL]\n : [],\n isAssignLabelsDisabled:\n bulkActions.isBulkActionDisabled(\n InvitationActions.ASSIGN_INVITATION_LABEL\n ),\n onOpenAssignLabelAction: onOpenAssignLabelAction,\n onAssignLabelsSubmit: assignLabels,\n resendInvitesPermissions:\n bulkActions.isBulkActionVisible(\n InvitationActions.RESEND_INVITATION\n )\n ? [NEW_PERMISSIONS.RESEND_INVITATION]\n : [],\n isResendDisabled: bulkActions.isBulkActionDisabled(\n InvitationActions.RESEND_INVITATION\n ),\n onResendInvitesSubmit:\n handleResendMultipleInvitation,\n\n revokePermissions: bulkActions.isBulkActionVisible(\n InvitationActions.REVOKE_INVITATION\n )\n ? [NEW_PERMISSIONS.REVOKE_INVITATION]\n : [],\n isRevokeDisabled: !hasPermission(\n profile,\n NEW_PERMISSIONS.REVOKE_INVITATION\n ),\n onRevokeSubmit: handleRevokeMultipleInvitations,\n isSelectAll: isSelectAll,\n totalCount: users?.count,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <InvitationsFilter\n preSelectedLabels={selectedLabels || []}\n onInvitersChange={filterInvitersHandler}\n onRoleChange={filterRoleHandler}\n preSelectedRoles={\n searchParams.roleIDs\n ? searchParams.roleIDs\n : []\n }\n onLabelsChange={labelChangeHandler}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={256}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={assignedFiltersCount}\n disabled={\n (searchParams.searchTerm.length >\n 0 ||\n assignedFiltersCount === 0) &&\n isListEmpty\n }\n dataTest=\"users-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && users?.items?.length === 0,\n noEntriesOptions: {\n icon: Pending,\n text: 'No Pending Users Yet',\n dataTest: 'no-results',\n },\n noSearchResultsOptions: {\n entityName: 'Users',\n dataTest: 'no-found-results',\n },\n noFilterResultsOptions: {\n dataTest: 'no-filtered-results',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: !!selectedInvitationIds?.length,\n disabled: !users || users?.items.length < 1,\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'master-checkbox',\n },\n columns: [\n {\n title: 'Users',\n width: 28,\n ...(isListEmpty ? null : hcFirstName),\n disabled: isListEmpty,\n className: classes.customTableColumnStyle,\n dataTest: 'name-column',\n },\n {\n title: 'Email Address',\n width: 15,\n ...(isListEmpty ? null : hcEmail),\n disabled: isListEmpty,\n className: classes.customTableColumnStyle,\n dataTest: 'email-column',\n },\n {\n title: 'Role',\n width: 15,\n ...(isListEmpty ? null : hcRole),\n disabled: isListEmpty,\n dataTest: 'role-column',\n },\n {\n title: 'Invited by',\n width: 15,\n ...(isListEmpty ? null : hcInvitedby),\n disabled: isListEmpty,\n dataTest: 'inviter-column',\n },\n {\n title: 'Invited on',\n width: 12,\n ...(isListEmpty ? null : hcInvitedOn),\n disabled: isListEmpty,\n dataTest: 'invitation-date-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n rowConfig: {\n onRowClick: handleViewProfile,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (user: UserV2) => ({\n selectedLabels: user.labels,\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_INVITATION_LABEL,\n ],\n\n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, user.id),\n }),\n dataTest: 'user-item',\n cells: [\n {\n fieldType: 'AVATAR_FIELD',\n fieldProps: {\n renderTitle: (item: UserV2) =>\n `${item.firstName} ${item.lastName}`,\n getAvatarProps: (user: UserV2) => ({\n customProfile: {\n firstName: user.firstName,\n lastName: user.lastName,\n picture: user.imageUrl,\n status: user.status,\n },\n size: 'sm',\n hidePending: true,\n }),\n dataTest: 'user',\n className:\n classes.avatarTableCellCustomStyle,\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (item: UserV2) => item.email,\n dataTest: 'user-email',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (item: UserV2) =>\n item.role?.title,\n dataTest: 'user-role',\n },\n },\n {\n fieldType: 'AVATAR_FIELD',\n shouldShowEmptyCell: (item: UserV2) =>\n !item.invitedBy,\n fieldProps: {\n renderTitle: (item: UserV2) =>\n `${item.invitedBy!.firstName} ${\n item.invitedBy!.lastName\n }`,\n getAvatarProps: (user: UserV2) => ({\n customProfile: {\n firstName:\n user.invitedBy!.firstName,\n lastName: user.invitedBy!.lastName,\n picture: user.invitedBy!.imageUrl,\n status: user.invitedBy!.status,\n },\n size: 'sm',\n }),\n dataTest: 'inviter',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (item: UserV2) =>\n formatDate(item.createdAt),\n dataTest: 'invitation-date',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (item: UserV2) => {\n return {\n open: labelsOpen === item.id,\n toggleOpen: () =>\n handleToggleLabels(item.id),\n selectedLabels: item.labels,\n dataTest: 'user-labels',\n };\n },\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (row: UserV2) => (\n <InvitationsListActions\n invitation={row}\n actionsHelper={actionsHelper}\n onViewProfile={handleViewProfile}\n onCopyInviteText={onCopyInviteText}\n handleRevokeInvitation={\n handleRevokeInvitation\n }\n assignLabelsToUser={(\n addedLabelIds,\n deletedLabelIds\n ) =>\n handleUpdateUserLabels(\n addedLabelIds,\n deletedLabelIds,\n row.id\n )\n }\n handleResendInvitation={\n handleResendInvitation\n }\n isHidden={\n !!selectedInvitations?.length\n }\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const InvitationsContainer: FC = () => {\n const state = useInvitationsState();\n const updatedInvitationsState = useUpdateInvitationsState();\n const history = useHistory();\n const company: CompanyInterface = useSelector(getCompanyState);\n const searchInvitationUsers = useSearchInvitationsService();\n const resendInvitation = useResendInvitationService();\n const copyInviteText = useCopyInviteTextService();\n const revokeInvitation = useRevokeInvitationService();\n\n const labels = useLabelsState();\n const deleteUserLabel = useDeleteUserLabelService(true);\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const updateAllSelectedInvitations =\n useUpdateAllSelectedInvitationsStateService();\n const updateSelectedInvitation = useUpdateSelectedInvitationStateService();\n const updatedLabels = useUpdatedLabelsState();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const actionsHelper = useInvitationActionsHelper();\n const draftEdit = useDraftEditState();\n const getCompany = useGetCompanyService();\n const getCompanyUserStats = useGetCompanyUserStatsService();\n\n const selectedInvitations = useMemo(\n () => selectSelectedInvitations(state),\n [state]\n );\n const searchState = useSelector(getSearchState);\n const profile = useSelector(getProfileState, isEqual);\n\n const handleCopyInviteText = useCallback(\n (invitation: UserV2) => {\n copyInviteText(invitation, company);\n },\n [company, copyInviteText]\n );\n\n useEffect(() => {\n if (!company.id && profile?.companyId) {\n getCompany(profile.companyId!);\n }\n }, [company?.id, profile?.companyId, getCompany]);\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'invitations' }}>\n <WithTeamsContext.Provider value={{ reducerName: 'invitations' }}>\n <Invitations\n history={history}\n searchInvitations={searchInvitationUsers}\n onResendInvitation={resendInvitation}\n onCopyInviteText={handleCopyInviteText}\n onRevokeInvitation={revokeInvitation}\n users={state.data}\n selectedInvitationIds={state.selectedInvitations}\n selectedInvitations={selectedInvitations}\n actionsHelper={actionsHelper}\n loading={state.loading}\n updatedInvitations={updatedInvitationsState.data}\n selectedLabels={labels.selected}\n setAssignLabelsAction={setAssignLabelsAction}\n assignedLabels={labels.assignedLabels}\n updateAllSelectedInvitations={updateAllSelectedInvitations}\n updateSelectedInvitation={updateSelectedInvitation}\n deleteUserLabel={deleteUserLabel}\n updatedLabels={updatedLabels}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n draftEdit={draftEdit}\n searchState={searchState}\n profile={profile}\n getCompanyUserStats={getCompanyUserStats}\n />\n </WithTeamsContext.Provider>\n </WithLabelsContext.Provider>\n );\n};\n\n\nexport default InvitationsContainer;","export enum ACTIONS {\n UPLOAD_CHALLENGE_AUDIO_START = 'UPLOAD_CHALLENGE_AUDIO_START',\n UPLOAD_CHALLENGE_AUDIO_SUCCESS = 'UPLOAD_CHALLENGE_AUDIO_SUCCESS',\n UPLOAD_CHALLENGE_AUDIO_FAILURE = 'UPLOAD_CHALLENGE_AUDIO_FAILURE',\n\n CREATE_CHALLENGES_SCRIPT_LINE = 'CREATE_CHALLENGES_SCRIPT_LINE',\n UPDATE_CHALLENGES_SCRIPT_LINE = 'UPDATE_CHALLENGES_SCRIPT_LINE',\n DELETE_CHALLENGES_SCRIPT_LINE = 'DELETE_CHALLENGES_SCRIPT_LINE',\n MODIFY_CHALLENGES_SCRIPT_LINE = 'MODIFY_CHALLENGES_SCRIPT_LINE',\n\n RESET_CHALLENGE = 'RESET_CHALLENGE',\n RESET_CHALLENGE_LOGO = 'RESET_CHALLENGE_LOGO',\n\n FETCH_CHALLENGE_START = 'FETCH_CHALLENGE_START',\n FETCH_CHALLENGE_SUCCESS = 'FETCH_CHALLENGE_SUCCESS',\n FETCH_CHALLENGE_FAILURE = 'FETCH_CHALLENGE_FAILURE',\n\n STORE_CHALLENGE_TEMP_COPY = 'STORE_CHALLENGE_TEMP_COPY',\n RESTORE_CHALLENGE_FROM_TEMP = 'RESTORE_CHALLENGE_FROM_TEMP',\n\n MODIFY_CHALLENGE = 'MODIFY_CHALLENGE',\n}\n\nexport function createChallengeScriptLineAction(data: any, silent?: boolean) {\n return {\n type: ACTIONS.CREATE_CHALLENGES_SCRIPT_LINE as ACTIONS.CREATE_CHALLENGES_SCRIPT_LINE,\n data,\n silent,\n };\n}\n\nexport function updateChallengeScriptLineAction(data: any) {\n return {\n type: ACTIONS.UPDATE_CHALLENGES_SCRIPT_LINE as ACTIONS.UPDATE_CHALLENGES_SCRIPT_LINE,\n data,\n };\n}\n\nexport function modifyChallengeScriptLineAction(\n data: any,\n field: string,\n lineId: number | string\n) {\n return {\n type: ACTIONS.MODIFY_CHALLENGES_SCRIPT_LINE as ACTIONS.MODIFY_CHALLENGES_SCRIPT_LINE,\n lineId: lineId,\n data: data,\n field: field,\n };\n}\n\nexport function deleteChallengeScriptLineAction(data: any) {\n return {\n type: ACTIONS.DELETE_CHALLENGES_SCRIPT_LINE as ACTIONS.DELETE_CHALLENGES_SCRIPT_LINE,\n data,\n };\n}\n\nexport function uploadChallengeAudioStart() {\n return {\n type: ACTIONS.UPLOAD_CHALLENGE_AUDIO_START as ACTIONS.UPLOAD_CHALLENGE_AUDIO_START,\n };\n}\n\nexport function uploadChallengeAudioSuccess(\n scriptLineId: string | number,\n response: any\n) {\n return {\n type: ACTIONS.UPLOAD_CHALLENGE_AUDIO_SUCCESS as ACTIONS.UPLOAD_CHALLENGE_AUDIO_SUCCESS,\n data: {\n scriptLineId,\n response,\n },\n };\n}\n\nexport function uploadChallengeAudioFailure(error: any) {\n return {\n type: ACTIONS.UPLOAD_CHALLENGE_AUDIO_FAILURE as ACTIONS.UPLOAD_CHALLENGE_AUDIO_FAILURE,\n error,\n };\n}\n\nexport function resetChallengeAction() {\n return {\n type: ACTIONS.RESET_CHALLENGE as ACTIONS.RESET_CHALLENGE,\n };\n}\n\nexport function resetChallengeLogoAction() {\n return {\n type: ACTIONS.RESET_CHALLENGE_LOGO as ACTIONS.RESET_CHALLENGE_LOGO,\n };\n}\n\nexport function fetchChallengeStart() {\n return {\n type: ACTIONS.FETCH_CHALLENGE_START as ACTIONS.FETCH_CHALLENGE_START,\n };\n}\n\nexport function fetchChallengeSuccess(data: any) {\n return {\n type: ACTIONS.FETCH_CHALLENGE_SUCCESS as ACTIONS.FETCH_CHALLENGE_SUCCESS,\n data,\n };\n}\n\nexport function fetchChallengeFailure(error: any) {\n return {\n type: ACTIONS.FETCH_CHALLENGE_FAILURE as ACTIONS.FETCH_CHALLENGE_FAILURE,\n error,\n };\n}\n\nexport function modifyChallengeAction(\n data: any,\n field: string,\n silent?: boolean\n) {\n return {\n type: ACTIONS.MODIFY_CHALLENGE as ACTIONS.MODIFY_CHALLENGE,\n field: field,\n data: data,\n silent: silent,\n };\n}\n\nexport function storeChallengeTempCopyAction() {\n return {\n type: ACTIONS.STORE_CHALLENGE_TEMP_COPY as ACTIONS.STORE_CHALLENGE_TEMP_COPY,\n };\n}\n\nexport function restoreChallengeFromTempAction() {\n return {\n type: ACTIONS.RESTORE_CHALLENGE_FROM_TEMP as ACTIONS.RESTORE_CHALLENGE_FROM_TEMP,\n };\n}\n","import React, { FC, useCallback, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../../ui/components/Button';\nimport { Fieldset } from '../../../../ui/components/Fieldset';\nimport { PortableLabelsWithStore } from '../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport { PortableTeamsWithStore } from '../../../portableTeams';\nimport { useDeselectAllTeams, useSaveTeams } from '../../../portableTeams/store/hors/withTeams/services';\nimport { useTeamsState } from '../../../portableTeams/store/hors/withTeams/states';\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\nimport PortableRolesWithMultiSelect from '../../../portableRoles/portableRolesWithMultiSelect';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst RoleContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n background-color: inherit;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nexport const UsersFilter: FC<{\n preSelectedLabels: number[];\n onLabelsChange: (ids: number[]) => void;\n onTeamsChange: (ids: number[]) => void;\n onRoleChange: (status: number[]) => void;\n onSuccessApply: () => void;\n preSelectedRoles: number[];\n}> = ({\n preSelectedLabels,\n onLabelsChange,\n onTeamsChange,\n onRoleChange,\n onSuccessApply,\n preSelectedRoles,\n}) => {\n const [selectedRoles, setSelectedRoles] = useState(preSelectedRoles);\n const teams = useTeamsState();\n const labels = useLabelsState();\n const selectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const saveTeams = useSaveTeams();\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(preSelectedLabels);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n preSelectedLabels,\n saveLabels,\n selectLabels,\n ]);\n\n const onApplyHandler = useCallback(() => {\n onLabelsChange(labels.selected);\n onTeamsChange(teams.selected);\n onRoleChange(selectedRoles);\n saveLabels();\n saveTeams();\n onSuccessApply();\n }, [\n onLabelsChange,\n labels.selected,\n onTeamsChange,\n teams.selected,\n onRoleChange,\n selectedRoles,\n saveLabels,\n saveTeams,\n onSuccessApply,\n ]);\n\n const totalFiltersSelected =\n teams.selected.length +\n labels.selected.filter((id: any) => id > 0).length +\n selectedRoles.length;\n\n const deselectLabels = useDeselectAllLabels();\n const deselectTeams = useDeselectAllTeams();\n\n const onClearHandler = () => {\n setSelectedRoles([]);\n deselectLabels();\n deselectTeams();\n }\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Role'} dataTest=\"roles-section-title\">\n <RoleContainer>\n <PortableRolesWithMultiSelect\n selectedRoles={selectedRoles}\n setSelectedRoles={setSelectedRoles}\n />\n </RoleContainer>\n </Fieldset>\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant='inverse'\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={() => onApplyHandler()}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { FC, useRef, useState } from 'react';\n\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../ui/components/ActionButton';\nimport { CheckPermission } from '../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { PopupComponent } from '../../../../ui/components/Popup';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport {\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabelsForSingleItem,\n} from '../../../labels/tools';\nimport { AssignLabels } from '../../../portableLabels/templates/AssignLabels';\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { UserV2 } from '../../../../constants/interfaces/User';\nimport { usePractisSetsEnrollmentsService } from '../../store/services';\nimport { AssignPractisSets } from '../../../../features/assign-practisSets';\n\nconst UsersListActions: FC<{\n user: UserV2;\n handleViewProfile: (user: UserV2) => void;\n handleUserSettings: (user: UserV2) => void;\n handleItemEdit: (user: UserV2) => void;\n setShowNudgeDialogMemberId: (userId: number) => void;\n onExportClicked: (userIds: number[]) => void;\n setUserIdsToDelete: (userIds: number[]) => void;\n assignLabelsToUser: (\n addedLabelIds: number[],\n deletedLabelIds: number[]\n ) => void;\n isHidden?: boolean;\n successApplyPractisSetsCallback: () => void;\n}> = ({\n user,\n handleViewProfile,\n handleUserSettings,\n handleItemEdit,\n setShowNudgeDialogMemberId,\n onExportClicked,\n setUserIdsToDelete,\n assignLabelsToUser,\n isHidden,\n successApplyPractisSetsCallback,\n}) => {\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const calculatePreSelectedLabels =\n useCalculatePreSelectedLabelsForSingleItem();\n const getDeletedLabels = useCalculateDeletedLabels();\n const getUserPractisSets = usePractisSetsEnrollmentsService(\n user.id?.toString()\n );\n\n const [isAssignPractisSetPopupOpen, setIsAssignPractisSetPopupOpen] =\n useState(false);\n\n const handleSetPreselectedLabels = () => {\n const selectedLabelIds = user.labels;\n const preAssignedLabels = calculatePreSelectedLabels(\n selectedLabelIds,\n labelsList.data\n );\n setSelectLabels(preAssignedLabels);\n saveLabels();\n };\n\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\n const addedLabelIds = labelIDs.filter(id => id > 0);\n const deletedLabelIds = getDeletedLabels(labelIDs);\n\n assignLabelsToUser(addedLabelIds, deletedLabelIds);\n };\n\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\n null | number | undefined\n >(null);\n\n const triggerRef = useRef(null);\n\n /**\n * @function handleOpenAssignPractisSetPopup\n * @returns { void }\n */\n const handleOpenAssignPractisSetPopup = (): void => {\n getUserPractisSets(() => setIsAssignPractisSetPopupOpen(true));\n };\n\n /**\n * @function handleCloseAssignPractisSetPopup\n * @returns { void }\n */\n const handleCloseAssignPractisSetPopup = (): void => {\n setIsAssignPractisSetPopupOpen(false);\n };\n\n return (\n <span>\n <div ref={triggerRef}>\n <ActionButton customWidth={200} isHidden={isHidden} dataTest=\"list-item-menu\">\n <CheckPermission\n permissions={[NEW_PERMISSIONS.VIEW_USER_PERFORMANCE]}\n >\n <ActionItem onClick={() => handleViewProfile(user)} dataTest=\"view-profile-action\">\n View Profile\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.VIEW_USER_PERFORMANCE]}\n >\n <ActionItem onClick={() => handleUserSettings(user)} dataTest=\"user-settings-action\">\n User Settings\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.ASSIGN_ENROLLMENT]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleOpenAssignPractisSetPopup();\n }}\n dataTest=\"assign-practis-sets-action\"\n >\n Assign Practis Sets\n </ActionItem>\n </CheckPermission>\n {!!labelsList.data.items.length && (\n <CheckPermission\n permissions={[NEW_PERMISSIONS.ASSIGN_USER_LABEL]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setAssignSingleLabelOpen(user.id);\n handleSetPreselectedLabels();\n }}\n dataTest=\"assign-labels-action\"\n >\n Assign Labels\n </ActionItem>\n </CheckPermission>\n )}\n <CheckPermission permissions={[NEW_PERMISSIONS.SEND_NUDGE]}>\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setShowNudgeDialogMemberId(user.id!);\n }}\n dataTest=\"nudge-user-action\"\n >\n Nudge User\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.EXPORT_LIST_USER]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n onExportClicked([user.id!]);\n }}\n dataTest=\"export-report-action\"\n >\n Export Report\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.DELETE_USER]}\n >\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n setUserIdsToDelete([user.id!]);\n }}\n dataTest=\"delete-user-action\"\n >\n Deactivate User\n </ActionItem>\n </CheckPermission>\n </ActionButton>\n </div>\n <PopupComponent\n triggerRef={triggerRef}\n open={assignSingleLabelOpen === user.id}\n onDismiss={() => {\n setAssignSingleLabelOpen(null);\n }}\n >\n <AssignLabels\n onLabelsChange={handleSaveSelectedLabels}\n onSuccessApply={() => {\n setAssignSingleLabelOpen(null);\n }}\n withBorder={true}\n />\n </PopupComponent>\n\n {isAssignPractisSetPopupOpen && (\n <AssignPractisSets\n triggerRef={triggerRef}\n isOpen={isAssignPractisSetPopupOpen}\n onClose={handleCloseAssignPractisSetPopup}\n users={[user.id]}\n successApplyPractisSetsCallback={\n successApplyPractisSetsCallback\n }\n />\n )}\n </span>\n );\n};\n\nexport default UsersListActions;\n\n\n\n","import React, { FC } from 'react';\r\nimport styled from 'styled-components';\r\nimport { usePortableTeamsState } from '../../portableTeams/store/states';\r\nimport { Popup } from '../../../ui/components/Popup';\r\nimport { AssignTeams } from '../../portableTeams/templates/AssignTeams';\r\nimport { Tooltip } from '../../../ui/components/Tooltip';\r\nimport { Variables } from '../../../theme/variables';\r\nimport UpArrow from '../../../ui/icons/UpArrow';\r\nimport DownArrow from '../../../ui/icons/DownArrow';\r\n\r\nconst Container = styled.div`\r\n position: relative;\r\n height: 100%;\r\n width: 85px;\r\n`;\r\n\r\nconst SelectHead = styled.div<{ disabled?: boolean }>`\r\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\r\n display: flex;\r\n height: 100%;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n`;\r\n\r\nconst SelectButtonWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\r\n width: 100%;\r\n`;\r\n\r\nconst SelectLabel = styled.div<{ color?: string; disabled?: boolean }>`\r\n pointer-events: none;\r\n font-size: 13px;\r\n -webkit-transition: all 0.18s ease;\r\n transition: all 0.18s ease;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n color: ${props =>\r\n props.disabled ? props.theme.Colors.lightBlueGray : props.color};\r\n font-weight: 500;\r\n margin-bottom: 1px;\r\n`;\r\n\r\nconst SelectInputContainer = styled.div<{ noText?: boolean }>`\r\n width: ${props =>\r\n props.noText ? 30 : 80}px;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n`;\r\n\r\nconst IconHolder = styled.div<{ disabled?: boolean }>`\r\n width: 8px;\r\n height: 100%;\r\n display: flex;\r\n pointer-events: none;\r\n align-items: center;\r\n justify-content: center;\r\n color: ${props =>\r\n props.disabled\r\n ? props.theme.Colors.cloudyBlue\r\n : props.theme.Colors.steelGrey};\r\n align-self: center;\r\n`;\r\n\r\nconst SelectedUserTeamsComponent: FC<{\r\n teamsCount: number;\r\n selectedTeams: number[];\r\n saveTeams?(): void;\r\n onSelectTeams(teamIds?: number[]): void;\r\n noText?: boolean;\r\n}> = ({ teamsCount, selectedTeams, noText, onSelectTeams }) => {\r\n const { data } = usePortableTeamsState();\r\n\r\n const teamsDisabled = !data || data.items.length < 1;\r\n\r\n return (\r\n <Container>\r\n <Popup<HTMLDivElement>\r\n content={({ hide }) => (\r\n <AssignTeams\r\n onSuccessApply={(teamIds: number[]) => {\r\n hide();\r\n onSelectTeams(teamIds);\r\n }}\r\n onCancel={() => {\r\n hide();\r\n }}\r\n selectedTeams={selectedTeams}\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <span ref={ref}>\r\n <Tooltip\r\n label={'No Teams added yet'}\r\n preset={'table-item'}\r\n disabled={!teamsDisabled}\r\n >\r\n <SelectHead\r\n onClick={e => {\r\n e.stopPropagation();\r\n !teamsDisabled && toggleShown();\r\n }}\r\n disabled={teamsDisabled}\r\n >\r\n <SelectButtonWrapper>\r\n <SelectInputContainer noText={noText}>\r\n {noText ? <SelectLabel\r\n color={\r\n teamsCount < 1\r\n ? Variables.Colors\r\n .cloudyBlue\r\n : Variables.Colors.black\r\n }\r\n disabled={teamsDisabled}\r\n data-test=\"teams-count\"\r\n >\r\n {teamsCount}\r\n </SelectLabel> : <SelectLabel\r\n color={\r\n teamsCount < 1\r\n ? Variables.Colors\r\n .cloudyBlue\r\n : Variables.Colors.black\r\n }\r\n disabled={teamsDisabled}\r\n data-test=\"teams-count\"\r\n >\r\n {teamsCount < 1\r\n ? 'Teams'\r\n : `${teamsCount} ${\r\n teamsCount > 1\r\n ? 'Teams'\r\n : 'Team'\r\n }`}\r\n </SelectLabel>}\r\n <IconHolder disabled={teamsDisabled}>\r\n {shown ? (\r\n <UpArrow />\r\n ) : (\r\n <DownArrow />\r\n )}\r\n </IconHolder>\r\n </SelectInputContainer>\r\n </SelectButtonWrapper>\r\n </SelectHead>\r\n </Tooltip>\r\n </span>\r\n )}\r\n </Popup>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default SelectedUserTeamsComponent;\r\n","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableColumnStyle: {\n minWidth: 120,\n },\n\n customTableCellStyle: {\n padding: 0,\n },\n\n teamsTableCellStyle: {\n width: 85,\n },\n}));\n\n","import { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\n\n/**\n * @function handleBuildUserName - builds user name by first name, last name\n * and (you) if user is logged in\n * @param { UserV2 } user\n * @returns { string }\n */\nexport const useBuildUserName = () => {\n const profile = useSelector(getProfileState);\n\n return useCallback(\n (user: UserV2): string => {\n const name = `${user.firstName} ${user.lastName}`;\n return profile?.id === user.id ? `${name} (You)` : name;\n },\n [profile]\n );\n};","import { FC, useCallback, useEffect, useState } from 'react';\nimport { History } from 'history';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router';\n\nimport User from '../../../../ui/icons/User';\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport {\n ASSIGN_LABEL_OPTIONS,\n LOAD_ASSIGNED_LABELS,\n isAdminRole,\n isPractisAdminRole,\n} from '../../../../constants/enums';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { UserV2, UserProfile } from '../../../../constants/interfaces/User';\nimport ROUTES from '../../../../routes/routes';\nimport {\n useAssignTeamsToUsersService,\n useDeleteUserLabelService,\n useDeleteUserService,\n useGetUsersReportService,\n useNudgeTraineesService,\n useSearchUsersService,\n useUpdateAllSelectedUsersStateService,\n useUpdateSelectedUserStateService,\n} from '../../store/services';\nimport { useUsersState } from '../../store/states';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport UsersPageNavigationContainer from '../../components/UsersPageNavigation';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport {\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../../labels/store/states';\nimport {\n clearSelectedItemIfNotLoaded,\n useCalculateDeletedLabels,\n useCalculatePreSelectedLabels,\n} from '../../../labels/tools';\nimport {\n useSaveUserFiltersService,\n useSetAssignLabelsActionService,\n} from '../../../labels/store/services';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport { usePermissionsState } from '../../../permissions/store/state';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport { countAppliedFiltersCount } from '../../../teams/pages/ListOfTeams/tools';\nimport { Popup } from '../../../../ui/components/Popup';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport { UsersFilter } from '../../components/Filters/UsersFilter';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { WithTeamsContext } from '../../../portableTeams';\nimport UsersListActions from '../../components/ListActions/UsersListActions';\nimport SelectedUserTeamsComponent from '../../components/SelectedUserTeams';\nimport { useLoggedInUserPermissionsHelper } from '../../tools';\nimport { arrayIdsDiff } from '../../../../helpers/functions/array-diff';\nimport {\n useDeselectAllTeams,\n useSaveTeams,\n} from '../../../portableTeams/store/hors/withTeams/services';\nimport { useSessionEffect } from '../../../common';\nimport { normalizeSP } from '../../../../helpers/functions/searchparams-normalize';\nimport {\n useAssignedLabelsIdsApi,\n useAssignUserLabelsApi,\n useDeleteUserLabelsApi,\n} from '../../../../api';\nimport { getSearchState } from '../../../searchState/store/reducer';\nimport { SearchStateInterface } from '../../../searchState/store/states';\nimport { SEARCH_STATE } from '../../../searchState/constants';\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\nimport { isEmpty as isLodashEmpty } from 'lodash';\nimport { WithPractisSetsContext } from '../../../portablePractisSets';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { useStyles } from './styles';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\nimport { EmptyCellDash } from '../../../../ui/components/table-wrapper/table/EmptyCellDash';\nimport {\n useNudgeUsersBulkActionService,\n useUpdateLabelsBulkActionService,\n useUpdateMultipleEntityLabelsBulkActionService,\n} from '../../../../services/GeneralBulkActionServices';\nimport { useDeleteUserBulkActionService } from '../../services/UserBulkActionsService';\nimport { onTriggerEvent } from '../../../../helpers/functions/Events';\nimport {\n CLEAR_PAGING,\n EventNameList,\n} from '../../../../helpers/functions/Events/types';\nimport { NudgeData } from '../../../../api/alert/types';\nimport { UPDATE_MULTIPLE_LABEL_ACTION } from '../../../../services/GeneralBulkActionServices/constants';\nimport { UserStatus } from '../../store/costants';\nimport { useBuildUserName } from '../../tools/hooks';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\nimport { CompanyUserStatsText } from '../../../../ui/components/CompanyUserStatsText';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nconst Users: FC<{\n history: History<any>;\n searchUsers: (\n sp: SearchParams,\n userStatuses: (keyof typeof UserStatus)[],\n companyId: number\n ) => void;\n assignTeamsToUsers: (\n userId: number,\n teams: number[],\n deleted: number[],\n hideMessage?: boolean,\n successCallback?: () => void\n ) => void;\n deleteUserLabel: (\n userId: number,\n labelId: number,\n successCallback?: () => void\n ) => void;\n setAssignLabelsAction(labels: number[]): void;\n onDeleteUser: (\n userIds: number[],\n search?: SearchParams,\n selectAll?: boolean,\n successCallback?: () => void\n ) => void;\n profile?: UserProfile;\n users: ListResult<UserV2>;\n selectedUsers?: number[];\n loading?: boolean;\n selectedLabels?: number[];\n assignedLabels?: number[];\n updateAllSelectedUsers(\n userIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedUser(userId: number): void;\n updatedLabels?: any;\n getUsersReportService?(\n searchParams: SearchParams,\n companyId?: number,\n userIds?: number[],\n totalCount?: number\n ): void;\n onNudgeTrainees(\n nudgeUserDate: NudgeData[],\n successCallback?: () => void\n ): void;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n searchState: SearchStateInterface;\n}> = ({\n users,\n history,\n searchUsers,\n assignTeamsToUsers,\n setAssignLabelsAction,\n onDeleteUser,\n profile,\n selectedLabels,\n selectedUsers,\n assignedLabels,\n deleteUserLabel,\n updateAllSelectedUsers,\n updateSelectedUser,\n updatedLabels,\n loading,\n getUsersReportService,\n onNudgeTrainees,\n saveGlobalLabelFilters,\n searchState,\n}) => {\n const classes = useStyles();\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n\n const buildUserName = useBuildUserName();\n\n const [showNudgeDialogMemberId, setShowNudgeDialogMemberId] =\n useState<any>(null);\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const canAccessPage = useHandleAccessPage();\n const loggedInUserPermissions = useLoggedInUserPermissionsHelper();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n labelIDs: selectedLabels,\n orderBy: null,\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const usableParams: SearchParams =\n !isEmpty(searchState) &&\n !!searchState?.params &&\n searchState.key === SEARCH_STATE.ACTIVE_USERS.name\n ? searchState.params\n : initialSearchParams;\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n refreshSearchParams,\n setCustom,\n } = useSearchParamsState(usableParams);\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const isCheckboxPartiallySelected =\n users &&\n users.items &&\n selectedUsers &&\n selectedUsers.length < users.items.length;\n\n const updateAllUsersCheck = useCallback(\n (checked: boolean) => {\n const userIds =\n (users && users.items.map((user: UserV2) => user.id)) || [];\n updateAllSelectedUsers(\n userIds,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [users, isCheckboxPartiallySelected, updateAllSelectedUsers]\n );\n\n const permissions = usePermissionsState();\n\n const handleViewProfile = (user: UserV2) => {\n if (\n !user ||\n !profile ||\n !permissions.includes(NEW_PERMISSIONS.VIEW_USER_PERFORMANCE)\n )\n return;\n\n history.push(\n ROUTES.USER_PERFORMANCE.replace(':userId', user.id.toString()),\n { useGoBack: true }\n );\n };\n\n const handleUserSettings = (user: UserV2) => {\n if (\n !user ||\n !profile ||\n !permissions.includes(NEW_PERMISSIONS.VIEW_PROFILE)\n )\n return;\n\n history.push(ROUTES.PROFILE.replace(':userId', user.id.toString()));\n };\n\n const handleItemEdit = (user: UserV2) => {\n if (!user) return;\n history.push(ROUTES.PROFILE.replace(':userId', user.id.toString()));\n };\n\n const handleUserCheck = (e: any, user: UserV2) => {\n e.stopPropagation();\n if (!!user.id) {\n updateSelectedUser(user.id);\n }\n };\n\n const getDeletedLabels = useCalculateDeletedLabels();\n const assignLabelsToUser = useAssignUserLabelsApi();\n const deleteLabelsFromUser = useDeleteUserLabelsApi();\n\n const refreshData = useCallback(() => {\n if (!profile?.companyId) return;\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchUsers(searchParams, [UserStatus.ACTIVE], profile.companyId);\n setLastRefreshed(new Date());\n setIsSelectAll(false);\n updateAllSelectedUsers([], true, isCheckboxPartiallySelected);\n }, [\n searchParams,\n initialOffset,\n searchUsers,\n updateAllSelectedUsers,\n isCheckboxPartiallySelected,\n profile?.companyId,\n ]);\n\n const handleDeleteUserBulkActionService = useDeleteUserBulkActionService(\n searchParams,\n profile?.companyId ?? 0,\n users?.count ?? 0,\n refreshData\n );\n\n const updateMultipleUsersLabels =\n useUpdateMultipleEntityLabelsBulkActionService(\n assignLabelsToUser,\n deleteLabelsFromUser,\n isSelectAll,\n {\n actionName: UPDATE_MULTIPLE_LABEL_ACTION,\n actionFunction: searchUsers,\n itemPerChunk: 1,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n limit: 1,\n offset: users.count,\n },\n userStatuses: [UserStatus.ACTIVE],\n companyId: profile?.companyId ?? 0,\n shouldSetStore: false,\n },\n fieldName: 'searchParams.offset',\n },\n },\n refreshData\n );\n\n const assignLabels = async () => {\n if (assignedLabels && selectedUsers) {\n const { preAssignedLabels } = await getAssignedLabelsIds(\n selectedUsers,\n LOAD_ASSIGNED_LABELS.USERS_ACTIVE,\n ASSIGN_LABEL_OPTIONS.USER,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n return calculatePreSelectedLabels(selectedUsers, users, data);\n });\n\n const deletedLabels = getDeletedLabels(assignedLabels);\n\n const deletedLabelsFiltered = deletedLabels.filter(\n x =>\n preAssignedLabels.includes(x) ||\n preAssignedLabels.includes(-x)\n );\n const selectedLabelsFiltered = assignedLabels.filter(\n x => x > 0 && !preAssignedLabels.includes(x)\n );\n\n updateMultipleUsersLabels(\n {\n entityName: 'user',\n entityIds: selectedUsers,\n },\n selectedLabelsFiltered,\n deletedLabelsFiltered\n );\n }\n };\n\n const handleManageTeams = useCallback(\n (user: UserV2, selectedTeams) => {\n const diff = arrayIdsDiff(selectedTeams, user.teams ?? []);\n assignTeamsToUsers(\n user.id,\n diff.selected,\n diff.deleted,\n false,\n refreshData\n );\n },\n [assignTeamsToUsers, refreshData]\n );\n\n const getAssignedLabelsIds = useAssignedLabelsIdsApi();\n\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\n\n const onNudgeSingleUserSuccessCallback = () => {\n setShowNudgeDialogMemberId(null);\n };\n\n const handleNudgeSingleUser = useCallback(\n (data: any) => {\n const { text, name: senderName } = data;\n if (showNudgeDialogMemberId) {\n const nudgeUserDate: NudgeData = {\n type: 'common',\n enrollmentId: null,\n receiverId: showNudgeDialogMemberId,\n senderName,\n text,\n };\n\n onNudgeTrainees(\n [nudgeUserDate],\n onNudgeSingleUserSuccessCallback\n );\n }\n },\n [showNudgeDialogMemberId, onNudgeTrainees]\n );\n\n const onNudgeMultipleUsersSuccessCallback = useCallback(() => {\n updateAllSelectedUsers([], true, isCheckboxPartiallySelected);\n }, [isCheckboxPartiallySelected, updateAllSelectedUsers]);\n\n const nudgeUsersBulkActionService = useNudgeUsersBulkActionService(\n 'common',\n {\n companyId: profile?.companyId ?? 0,\n },\n searchParams,\n users.count,\n refreshData\n );\n\n const handleNudgeMultipleUsers = useCallback(\n (data: any) => {\n const { text, name: senderName } = data;\n\n if (isSelectAll) {\n nudgeUsersBulkActionService({ ...{ text }, ...{ senderName } });\n } else {\n if (selectedUsers) {\n const nudgeUserDate = selectedUsers.map(\n user =>\n ({\n type: 'common',\n enrollmentId: null,\n receiverId: user,\n text,\n senderName,\n } as NudgeData)\n );\n\n onNudgeTrainees(\n nudgeUserDate,\n onNudgeMultipleUsersSuccessCallback\n );\n }\n }\n },\n [\n isSelectAll,\n nudgeUsersBulkActionService,\n selectedUsers,\n onNudgeTrainees,\n onNudgeMultipleUsersSuccessCallback,\n ]\n );\n\n const onExportClickedSingle = useCallback(\n (userIds: any[]) => {\n if (profile?.companyId && userIds && getUsersReportService) {\n getUsersReportService(searchParams, profile.companyId, userIds);\n }\n },\n [profile?.companyId, getUsersReportService, searchParams]\n );\n\n const onExportClicked = useCallback(\n (userIds: any[]) => {\n if (profile?.companyId && userIds && getUsersReportService) {\n getUsersReportService(\n searchParams,\n profile.companyId,\n isSelectAll ? undefined : userIds,\n isSelectAll ? users.count : undefined\n );\n }\n },\n [\n profile?.companyId,\n getUsersReportService,\n searchParams,\n isSelectAll,\n users,\n ]\n );\n\n const isOptionsDisabled =\n !selectedUsers || (selectedUsers && !selectedUsers.length);\n\n const orderBy = searchParams.orderBy;\n const hcUserName = useOrderBy('name', orderBy, setOrderBy);\n const hcRole = useOrderBy('role_name', orderBy, setOrderBy);\n const hcTeam = useOrderBy('count_teams', orderBy, setOrderBy);\n const hcAssigned = useOrderBy('count_psets', orderBy, setOrderBy);\n const hcLastActivity = useOrderBy('date_login', orderBy, setOrderBy);\n const hcRegisteredAt = useOrderBy('date_registered', orderBy, setOrderBy);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const filterRoleHandler = (roleIds: number[]) => {\n setCustom('roleIDs', roleIds);\n };\n\n const teamsChangeHandler = (ids: number[]) => {\n setCustom('teamIds', ids);\n };\n\n const labelChangeHandler = (ids: number[]) => {\n saveGlobalLabelFilters(ids);\n };\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: countAppliedFiltersCount(searchParams),\n itemsCount: users?.items.length || 0,\n });\n\n const deselectTeams = useDeselectAllTeams();\n const saveTeams = useSaveTeams();\n\n /**\n * @function onDeleteUsersSuccessCallback\n * @returns { void }\n */\n const onDeleteUsersSuccessCallback = useCallback(() => {\n if (!pageIndex || pageIndex === 1) {\n refreshData();\n } else {\n // if the current page is not page 1,\n // move paging to page 1\n onTriggerEvent(EventNameList[CLEAR_PAGING]);\n }\n }, [pageIndex, refreshData]);\n\n /**\n * @function onConfirmDeleteUser\n * @param { number[] } userIds\n * @returns { void }\n */\n const onConfirmDeleteUser = useCallback(\n (userIds: number[]): void => {\n const selectAllState = userIds.length === 1 ? false : isSelectAll;\n onDeleteUser(\n userIds,\n isSelectAll\n ? normalizeSP(searchParams, users && users.count)\n : searchParams,\n selectAllState,\n onDeleteUsersSuccessCallback\n );\n },\n [\n isSelectAll,\n onDeleteUser,\n onDeleteUsersSuccessCallback,\n searchParams,\n users,\n ]\n );\n\n const handleOpenDeleteUsersConfirmDialog = useCallback(\n (userIds: number[]) => {\n const userText = userIds.length === 1 ? 'this user' : 'these users';\n showConfirmationModalDialog({\n modalTitle: `Deactivate ${userText}?`,\n description:\n `This action will prevent ${userText} from accessing the platform, but it will not delete their data. To re-activate ${userText} you will need to contact Practis Support.`,\n cancelButtonText: 'Cancel',\n confirmButtonText: 'Deactivate',\n dialogType: 'DANGER',\n onConfirm: () => onConfirmDeleteUser(userIds),\n });\n },\n [onConfirmDeleteUser, showConfirmationModalDialog]\n );\n\n /**\n * @function handleDeleteUsers\n * @returns { void }\n */\n const handleDeleteUsers = (ids: number[]): void => {\n isSelectAll\n ? handleDeleteUserBulkActionService()\n : handleOpenDeleteUsersConfirmDialog(ids);\n };\n\n useSessionEffect(() => {\n if (!profile?.companyId) return;\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchUsers(searchParams, [UserStatus.ACTIVE], profile.companyId);\n }, [searchUsers, searchParams, profile?.companyId]);\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (updatedLabels && updatedLabels.updateType === 'delete')\n refreshSearchParams();\n }, [updatedLabels, refreshSearchParams]);\n\n useEffect(() => {\n return () =>\n updateAllSelectedUsers([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllSelectedUsers([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [users, history.location.pathname]);\n\n useEffect(() => {\n if (selectedUsers?.length && selectedUsers.length === users.count) {\n setIsSelectAll(true);\n }\n }, [users.count, selectedUsers]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n }, [initialOffset, pageIndex, setOffset]);\n\n useEffect(() => {\n const filteredUsers = users\n ? users.items.map(user => Number(user.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedUsers,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllSelectedUsers(usersToClear, false);\n }\n }, [selectedUsers, users, updateAllSelectedUsers]);\n\n /**\n * @function onOpenAssignLabelAction\n * @returns { void }\n */\n const onOpenAssignLabelAction = (): void => {\n if (users && users.items && selectedUsers) {\n getAssignedLabelsIds(\n selectedUsers,\n LOAD_ASSIGNED_LABELS.USERS_ACTIVE,\n ASSIGN_LABEL_OPTIONS.USER,\n { ...searchParams, orderBy: {} },\n isSelectAll\n ).then((data: any) => {\n const { preAssignedLabels } = calculatePreSelectedLabels(\n selectedUsers,\n users,\n data\n );\n\n setAssignLabelsAction(preAssignedLabels);\n });\n }\n };\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_USER]);\n }, [canAccessPage]);\n\n useEffect(() => {\n return () => {\n deselectTeams();\n saveTeams();\n };\n }, [deselectTeams, saveTeams]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n updateAllUsersCheck(event.target.checked);\n setIsSelectAll(false);\n };\n\n /**\n * @function checkIsRowChecked\n * @param { UserV2 } user\n * @returns { boolean }\n */\n const checkIsRowChecked = (user: UserV2): boolean =>\n !!selectedUsers && !!user.id && selectedUsers.includes(user.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { UserV2 } row\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, user: UserV2) => {\n setIsSelectAll(false);\n handleUserCheck(event, user);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { UserV2 } row\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (row: UserV2): boolean => {\n return labelsOpen === row?.['id'];\n };\n\n /**\n * @function onDeleteLabelHandler\n * @param { number } labelId\n * @param { UserV2 } user\n * @returns { void }\n */\n const onDeleteLabelHandler = (labelId: number, user: UserV2): void => {\n deleteUserLabel(user.id, labelId, refreshData);\n };\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToUser,\n deleteLabelsFromUser,\n refreshData\n );\n\n /**\n * @function handleUpdateUserLabels\n * @param { number[] } addedLabelIds\n * @param { number[] } deletedLabelIds\n * @param { number } userId\n * @returns { void }\n */\n const handleUpdateUserLabels = (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n userId: number\n ): void => {\n updateLabelsBulkActionService(\n {\n entityName: 'user',\n entityId: userId,\n },\n addedLabelIds,\n deletedLabelIds\n );\n };\n\n return (\n <MainWrapper\n subTitle=\"Users\"\n subHeader={profile?.companyId &&\n <CompanyUserStatsText\n companyId={profile.companyId}\n showSettingsButton={isAdminRole(profile?.role?.name)}\n />\n }\n tabs={<UsersPageNavigationContainer />}\n htmlPageTitle=\"Users - Practis\"\n dataTest=\"users\"\n >\n {!!showNudgeDialogMemberId && (\n <DialogWrapper\n customization={{\n width: 480,\n padding: '49px 32px 32px 32px',\n }}\n >\n <NudgeUser\n fromUser={\n !!profile\n ? `${profile.firstName} ${profile.lastName}`\n : ''\n }\n onSend={handleNudgeSingleUser}\n onClose={() => setShowNudgeDialogMemberId(null)}\n />\n </DialogWrapper>\n )}\n {loading && !isSelectAll && <LoadingComponent />}\n\n <TableWrapper\n tableStates={tableStates}\n cornered={selectedLabels && !!selectedLabels.length}\n data={users?.items}\n selectedLabels={selectedLabels}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'users-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: users.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'users-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n },\n isSelectedItemOptionsVisible:\n !isLodashEmpty(selectedUsers) && !isLodashEmpty(users),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedUsers?.length,\n totalCount: users.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: () => {\n updateAllSelectedUsers(\n [],\n true,\n isCheckboxPartiallySelected\n );\n setIsSelectAll(false);\n },\n onSelectAll: () => {\n updateAllUsersCheck(true);\n setIsSelectAll(true);\n },\n bulkActionsConfig: {\n disabled: isOptionsDisabled,\n onAssignLabelsSubmit: assignLabels,\n assignPractisSetsAndDueDatePermissions: [\n NEW_PERMISSIONS.ASSIGN_ENROLLMENT,\n ],\n assignLabelsPermissions: [\n NEW_PERMISSIONS.ASSIGN_USER_LABEL,\n ],\n onOpenAssignLabelAction: onOpenAssignLabelAction,\n sendNudgePermissions: [NEW_PERMISSIONS.SEND_NUDGE],\n showNudgeWarning: false,\n nudgeButtonDisabled: isOptionsDisabled,\n onNudgeSendButtonClicked: handleNudgeMultipleUsers,\n showExportPermissions: [\n NEW_PERMISSIONS.EXPORT_LIST_USER,\n ],\n exportButtonDisabled: isOptionsDisabled,\n onExportClicked: () =>\n onExportClicked(\n selectedUsers && selectedUsers.length\n ? selectedUsers\n : []\n ),\n removeItemPermissions: [\n NEW_PERMISSIONS.DELETE_USER,\n ],\n removeItemTitle: 'Deactivate Users',\n onRemoveItemsSubmit: () =>\n handleDeleteUsers(\n selectedUsers && selectedUsers.length\n ? selectedUsers\n : []\n ),\n isSelectAll: isSelectAll,\n totalCount: users.count,\n searchQuery: {\n query: !isLodashEmpty(searchParams?.searchTerm)\n ? searchParams.searchTerm\n : null,\n\n labelId: !isLodashEmpty(searchParams?.labelIDs)\n ? searchParams.labelIDs\n : null,\n roleId: !isLodashEmpty(searchParams?.roleIDs)\n ? searchParams.roleIDs\n : null,\n status: !isLodashEmpty(\n searchParams?.filterByRegistrationStatus\n )\n ? searchParams.filterByRegistrationStatus\n : null,\n },\n selectedItems: selectedUsers,\n successApplyPractisSetsCallback: refreshData,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <UsersFilter\n preSelectedLabels={selectedLabels || []}\n onRoleChange={filterRoleHandler}\n preSelectedRoles={\n searchParams.roleIDs\n ? searchParams.roleIDs\n : []\n }\n onTeamsChange={teamsChangeHandler}\n onLabelsChange={labelChangeHandler}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={256}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={countAppliedFiltersCount(\n searchParams\n )}\n disabled={\n countAppliedFiltersCount(\n searchParams\n ) === 0 &&\n tableStates.disableFilters\n }\n dataTest=\"users-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && users?.items?.length === 0,\n noEntriesOptions: {\n icon: User,\n text: 'No Users Yet',\n dataTest: 'no-results',\n },\n noSearchResultsOptions: {\n entityName: 'Users',\n dataTest: 'no-found-results',\n },\n noFilterResultsOptions: {\n dataTest: 'no-filtered-results',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: !!selectedUsers && !!selectedUsers.length,\n disabled: !users || (users && users.items.length < 1),\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'master-checkbox',\n },\n\n columns: [\n {\n title: 'Users',\n width: 22,\n ...hcUserName,\n disabled: tableStates.disableSorting,\n className: classes.customTableColumnStyle,\n dataTest: 'name-column',\n },\n {\n title: 'Teams',\n width: 9,\n ...hcTeam,\n disabled: tableStates.disableSorting,\n dataTest: 'teams-column',\n },\n {\n title: 'Practis Sets',\n width: 9,\n ...hcAssigned,\n disabled: tableStates.disableSorting,\n dataTest: 'practis-sets-column',\n },\n {\n title: 'Role',\n width: 9,\n ...hcRole,\n disabled: tableStates.disableSorting,\n dataTest: 'role-column',\n },\n {\n title: 'Registered on',\n width: 9,\n ...hcRegisteredAt,\n disabled: tableStates.disableSorting,\n dataTest: 'registration-date-column',\n },\n {\n title: 'Last Login',\n width: 9,\n ...hcLastActivity,\n disabled: tableStates.disableSorting,\n dataTest: 'login-date-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n\n rowConfig: {\n onRowClick: handleViewProfile,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (user: UserV2) => ({\n selectedLabels: user.labels,\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\n ],\n\n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, user),\n }),\n dataTest: 'user-item',\n cells: [\n {\n fieldType: 'AVATAR_FIELD',\n cellClassName: classes.customTableCellStyle,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n buildUserName(user),\n getAvatarProps: (user: UserV2) => ({\n customProfile: {\n firstName: user.firstName,\n lastName: user.lastName,\n picture: user.imageUrl,\n status: user.status,\n },\n size: 'sm',\n }),\n dataTest: 'user'\n },\n },\n {\n fieldType: 'CUSTOM_FIELD',\n cellClassName: classes.teamsTableCellStyle,\n getCustomFieldComponent: (user: UserV2) => (\n <>\n {loggedInUserPermissions.hasActionPermission(\n NEW_PERMISSIONS.UPDATE_USER\n ) ? (\n isPractisAdminRole(\n user.role?.name\n ) ? (\n <EmptyCellDash />\n ) : (\n <SelectedUserTeamsComponent\n noText={true}\n teamsCount={\n user.countTeams || 0\n }\n selectedTeams={\n user.teams ?? []\n }\n onSelectTeams={(\n teamIds: number[]\n ) =>\n handleManageTeams(\n user,\n teamIds\n )\n }\n />\n )\n ) : (\n loggedInUserPermissions.isTeamLeader() && (\n <span>{user.countTeams} </span>\n )\n )}\n </>\n ),\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (user: UserV2) =>\n !user.countEnrollments,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n user.countEnrollments.toString(),\n dataTest: 'practis-sets-count',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (user: UserV2) =>\n !user.role,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n user.role?.title,\n dataTest: 'user-role'\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (user: UserV2) =>\n !user.registeredAt,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n formatDate(user.registeredAt),\n dataTest: 'registation-date',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (user: UserV2) =>\n !user.lastActivity,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n formatDate(user.lastActivity),\n dataTest: 'last-activity-date',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (user: UserV2) => {\n return {\n open: labelsOpen === user?.id,\n toggleOpen: () =>\n handleToggleLabels(user?.id),\n selectedLabels: user.labels,\n dataTest: 'user-labels',\n };\n },\n },\n },\n\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (user: UserV2) => (\n <UsersListActions\n user={user}\n handleViewProfile={\n handleViewProfile\n }\n handleUserSettings={\n handleUserSettings\n }\n handleItemEdit={handleItemEdit}\n setShowNudgeDialogMemberId={\n setShowNudgeDialogMemberId\n }\n onExportClicked={\n onExportClickedSingle\n }\n setUserIdsToDelete={\n handleDeleteUsers\n }\n assignLabelsToUser={(\n addedLabelIds,\n deletedLabelIds\n ) =>\n handleUpdateUserLabels(\n addedLabelIds,\n deletedLabelIds,\n user.id\n )\n }\n isHidden={!!selectedUsers?.length}\n successApplyPractisSetsCallback={\n refreshData\n }\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const UsersContainer: FC = () => {\n const state = useUsersState();\n const history = useHistory();\n const searchUsers = useSearchUsersService();\n const deleteUser = useDeleteUserService();\n const profile = useSelector(getProfileState);\n\n const labels = useLabelsState();\n const assignTeamsToUsers = useAssignTeamsToUsersService();\n const deleteUserLabel = useDeleteUserLabelService();\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const updateAllSelectedUsers = useUpdateAllSelectedUsersStateService();\n const updateSelectedUser = useUpdateSelectedUserStateService();\n const updatedLabels = useUpdatedLabelsState();\n const getUsersReportService = useGetUsersReportService();\n const nudgeTrainees = useNudgeTraineesService();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const searchState = useSelector(getSearchState);\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'users' }}>\n <WithTeamsContext.Provider value={{ reducerName: 'users' }}>\n <WithPractisSetsContext.Provider\n value={{\n reducerName: 'performance',\n }}\n >\n <Users\n history={history}\n searchUsers={searchUsers}\n onDeleteUser={deleteUser}\n profile={profile}\n users={state.list}\n selectedUsers={state.selectedUsers}\n loading={state.loading}\n selectedLabels={labels.selected}\n assignTeamsToUsers={assignTeamsToUsers}\n setAssignLabelsAction={setAssignLabelsAction}\n assignedLabels={labels.assignedLabels}\n deleteUserLabel={deleteUserLabel}\n updateAllSelectedUsers={updateAllSelectedUsers}\n updateSelectedUser={updateSelectedUser}\n updatedLabels={updatedLabels}\n getUsersReportService={getUsersReportService}\n onNudgeTrainees={nudgeTrainees}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n searchState={searchState}\n />\n </WithPractisSetsContext.Provider>\n </WithTeamsContext.Provider>\n </WithLabelsContext.Provider>\n );\n};\n\n\n\nexport default UsersContainer;","export const arrayIdsDiff = (currentState: number[], prevState: number[]): {selected: number[], deleted: number[]} => {\n return {\n selected: currentState,\n deleted: prevState.filter(x => !currentState.includes(x))\n }\n};\n","import { randomArrayItem } from '../../../helpers/functions/get-random-from-array';\nimport { SCENARIO_IMAGES } from '../../../constants/enums/scenarios';\nimport { getConfig } from '../../../tools/config';\nimport { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\nimport {\n createChallengeScriptLineAction,\n deleteChallengeScriptLineAction,\n fetchChallengeFailure,\n fetchChallengeStart,\n fetchChallengeSuccess,\n modifyChallengeAction,\n modifyChallengeScriptLineAction,\n resetChallengeAction,\n resetChallengeLogoAction,\n restoreChallengeFromTempAction,\n storeChallengeTempCopyAction,\n updateChallengeScriptLineAction,\n uploadChallengeAudioFailure,\n uploadChallengeAudioStart,\n uploadChallengeAudioSuccess,\n} from './actions';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ScriptLine } from '../../../constants/interfaces/ScriptLine';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n useFileUploadApi,\n useGetChallengeApi,\n} from '../../../api';\n\nexport const useGetChallengeService = () => {\n const dispatch = useDispatch();\n const getChallengeApi = useGetChallengeApi();\n const showMessage = useShowMessage();\n return useCallback(\n (scenarioId: number | string) => {\n dispatch(fetchChallengeStart());\n getChallengeApi(scenarioId)\n .then(data => {\n dispatch(fetchChallengeSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchChallengeFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getChallengeApi, showMessage]\n );\n};\n\nexport const useUploadChallengeAudioService = () => {\n const dispatch = useDispatch();\n const fileUploadApi = useFileUploadApi();\n const showMessage = useShowMessage();\n return useCallback(\n (file: any, associatedEntityId: string | number, filename?: string) => {\n dispatch(uploadChallengeAudioStart());\n const formData: FormData = new FormData();\n formData.set('file', file);\n formData.set('type', 'AUDIO');\n formData.set('associatedEntityType', 'Line');\n if (!associatedEntityId.toString().includes('temp_'))\n formData.set(\n 'associatedEntityId',\n associatedEntityId.toString()\n );\n if (filename) formData.set('filename', filename);\n\n return fileUploadApi(formData)\n .then(data => {\n dispatch(\n uploadChallengeAudioSuccess(associatedEntityId, data)\n );\n return 'success';\n })\n .catch((error: ErrorResult) => {\n dispatch(uploadChallengeAudioFailure(error.message));\n showMessage(error.message, 'error');\n return 'error';\n });\n },\n [dispatch, fileUploadApi, showMessage]\n );\n};\n\nexport const useCreateChallengeScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (data: Partial<ScriptLine>, silent?: boolean) => {\n dispatch(createChallengeScriptLineAction(data, silent));\n },\n [dispatch]\n );\n};\n\nexport const useDeleteChallengeScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (lineId: number) => {\n dispatch(deleteChallengeScriptLineAction(lineId));\n },\n [dispatch]\n );\n};\n\nexport const useModifyChallengeScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: any, field: string, lineId: number | string) => {\n dispatch(modifyChallengeScriptLineAction(value, field, lineId));\n },\n [dispatch]\n );\n};\n\nexport const useUpdateChallengeScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLines: Array<ScriptLine>) => {\n dispatch(updateChallengeScriptLineAction(scriptLines));\n },\n [dispatch]\n );\n};\n\nexport const generateRandomImageUrl = () => {\n const fileName = randomArrayItem(SCENARIO_IMAGES);\n return (\n getConfig().S3_FILES_BASE_URL + `scenarios/default-logos/${fileName}`\n );\n};\n\nexport const useModifyChallengeService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (value: any, field: keyof Challenge, silent?: boolean) => {\n dispatch(modifyChallengeAction(value, field, silent));\n },\n [dispatch]\n );\n};\n\nexport const useResetChallengeService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetChallengeAction());\n }, [dispatch]);\n};\n\nexport const useResetChallengeLogoService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetChallengeLogoAction());\n }, [dispatch]);\n};\n\nexport const useStoreChallengeTempCopyService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(storeChallengeTempCopyAction());\n }, [dispatch]);\n};\n\nexport const useRestoreChallengeFromTempActionService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(restoreChallengeFromTempAction());\n }, [dispatch]);\n};\n","import { FC, useContext, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n Challenge,\r\n ChallengeStatuses,\r\n Status,\r\n} from '../../../../constants/interfaces/Challenge';\r\nimport { useVoiceGenerationState } from '../../../textToSpeech/store/states';\r\nimport { CompanyVoiceSettings } from '../../../../constants/interfaces/CompanyVoiceSettings';\r\nimport { AudioInterface, getAudioState } from '../../../player/store/reducers';\r\nimport {\r\n useRestoreChallengeFromTempActionService,\r\n useStoreChallengeTempCopyService,\r\n} from '../../store/services';\r\nimport { EditModeContext, LoadingSaveContext } from '../../pages/EditChallenge';\r\nimport { useCompanyVoiceSettingsState } from '../../../../pages/CompanySettings/store/states';\r\nimport { buildPageTitle } from '../../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../../constants/enums/EditModeValues';\r\nimport { formatDate } from '../../../../helpers/functions/date-convert';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\r\nimport { useHandleRestoreArchivedChallenge } from '../../services';\r\nimport { StatusModalConfirmation } from '../../../../pages/ActionPages/StatusModalConfirmation/StatusModalConfirmation';\r\n\r\nconst StyledCustomWrapper = styled.div``;\r\n\r\nconst StyledCustomHeader = styled.div`\r\n padding-left: 16px;\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n height: 103px;\r\n`;\r\n\r\nconst StyledHeaderInput = styled.div`\r\n flex: 1;\r\n min-width: 150px;\r\n margin-right: 16px;\r\n`;\r\n\r\nconst HeaderTitle = styled.div`\r\n font-size: 20px;\r\n font-weight: 800;\r\n color: ${props => props.theme.Colors.black};\r\n`;\r\n\r\nconst StyledHeaderActions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 10px 0;\r\n flex-wrap: wrap;\r\n`;\r\n\r\nconst StyledHeaderActionItemsWrapper = styled.div`\r\n display: flex;\r\n`;\r\n\r\nconst StyledHeaderActionItems = styled.div`\r\n margin-left: 16px;\r\n`;\r\n\r\nconst PublishedDate = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n margin-right: 16px;\r\n`;\r\n\r\nconst EDIT_MODAL_INFO = {\r\n id: 'challenge_edit_message',\r\n message: 'Are you sure you want to edit Challenge.',\r\n buttonText: 'Proceed',\r\n cancelButtonText: 'Go Back',\r\n title: 'Are you sure?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst CANCEL_EDIT_MODAL_INFO = {\r\n id: 'challenge_cancel_edit_message',\r\n message: 'Do you want to discard changes?',\r\n buttonText: 'Discard',\r\n cancelButtonText: 'No',\r\n title: 'Discard Changes?',\r\n notShow: false,\r\n danger: true,\r\n};\r\n\r\nconst MODAL_INFO = {\r\n DELETED: {\r\n message: 'Are you sure you want to delete?',\r\n buttonText: 'Yes, Delete',\r\n title: 'Delete Challenge',\r\n notShow: false,\r\n danger: false,\r\n },\r\n DRAFT: {\r\n message: 'Are you sure you want to archive?',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Challenge',\r\n notShow: false,\r\n danger: false,\r\n },\r\n ARCHIVED: {\r\n message:\r\n 'Removing the active items will effectively RESET progress for related Practis Sets for all currently enrolled Trainees. They will receive a notification and will be asked to start again.',\r\n buttonText: 'Yes, Archive',\r\n title: 'Are You Sure?',\r\n notShow: false,\r\n danger: true,\r\n },\r\n ACTIVE: {\r\n message: 'Are you sure you want to archive?',\r\n buttonText: 'Yes, Archive',\r\n title: 'Archive Challenge',\r\n notShow: false,\r\n danger: false,\r\n },\r\n};\r\n\r\nconst EDIT_VIEW_STATUS = [ChallengeStatuses.ACTIVE];\r\n\r\nconst Header: FC<{\r\n handleUpdateChallenge: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status,\r\n keepModal?: boolean\r\n ) => any;\r\n storeChallengeTemp: () => void;\r\n restoreChallengeFromTemp: () => void;\r\n challenge: Challenge;\r\n voiceSettings?: CompanyVoiceSettings[];\r\n player: AudioInterface;\r\n modified?: boolean;\r\n isViewMode?: boolean;\r\n}> = ({\r\n challenge,\r\n handleUpdateChallenge,\r\n player,\r\n modified,\r\n storeChallengeTemp,\r\n restoreChallengeFromTemp,\r\n isViewMode,\r\n}) => {\r\n const handleRestoreArchivedChallenge = useHandleRestoreArchivedChallenge();\r\n const voice = useVoiceGenerationState().challenges;\r\n const generating = voice && voice.generating;\r\n const [publishModal, setPublishModal] = useState(false);\r\n const [editModal, setEditModal] = useState(false);\r\n const [cancelEditModal, setCancelEditModal] = useState(false);\r\n const [saveState, setSaveState] = useState<Status>(\r\n ChallengeStatuses.ACTIVE\r\n );\r\n\r\n const handleSaveWithModalAction = (status: ChallengeStatuses) => {\r\n setSaveState(status);\r\n setPublishModal(true);\r\n };\r\n\r\n const loadingSave = useContext(LoadingSaveContext);\r\n const edit = useContext(EditModeContext);\r\n\r\n const cancelEditing = () => {\r\n if (modified) {\r\n setCancelEditModal(true);\r\n } else {\r\n restoreChallengeFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }\r\n };\r\n const disableRestore = loadingSave || isViewMode\r\n\r\n return (\r\n <StyledCustomWrapper>\r\n {publishModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setPublishModal(false);\r\n }}\r\n onConfirm={() => {\r\n setPublishModal(false);\r\n handleUpdateChallenge(null, saveState);\r\n }}\r\n title={MODAL_INFO[saveState].title}\r\n confirmButtonText={MODAL_INFO[saveState].buttonText}\r\n displayDontShow={MODAL_INFO[saveState].notShow}\r\n danger={MODAL_INFO[saveState].danger}\r\n >\r\n {MODAL_INFO[saveState].message}\r\n </StatusModalConfirmation>\r\n )}\r\n {editModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setEditModal(false);\r\n storeChallengeTemp();\r\n edit.action(EditModeValues.EDIT);\r\n }}\r\n title={EDIT_MODAL_INFO.title}\r\n confirmButtonText={EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={EDIT_MODAL_INFO.cancelButtonText}\r\n displayDontShow={EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={EDIT_MODAL_INFO.id}\r\n danger={EDIT_MODAL_INFO.danger}\r\n >\r\n {EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n {cancelEditModal && (\r\n <StatusModalConfirmation\r\n onCancel={() => {\r\n setCancelEditModal(false);\r\n }}\r\n onConfirm={() => {\r\n setCancelEditModal(false);\r\n restoreChallengeFromTemp();\r\n edit.action(EditModeValues.VIEW);\r\n }}\r\n title={CANCEL_EDIT_MODAL_INFO.title}\r\n confirmButtonText={CANCEL_EDIT_MODAL_INFO.buttonText}\r\n cancelButtonText={CANCEL_EDIT_MODAL_INFO.cancelButtonText}\r\n displayDontShow={CANCEL_EDIT_MODAL_INFO.notShow}\r\n dontShowHandle={CANCEL_EDIT_MODAL_INFO.id}\r\n danger={CANCEL_EDIT_MODAL_INFO.danger}\r\n >\r\n {CANCEL_EDIT_MODAL_INFO.message}\r\n </StatusModalConfirmation>\r\n )}\r\n <StyledCustomHeader>\r\n <StyledHeaderInput>\r\n <HeaderTitle data-test=\"challenge-page-title\">\r\n {buildPageTitle('Challenge', edit.mode as EditModeValues, !challenge.id)}\r\n </HeaderTitle>\r\n </StyledHeaderInput>\r\n <StyledHeaderActions>\r\n <StyledHeaderActionItems>\r\n <PublishedDate>\r\n {challenge.status === ChallengeStatuses.ACTIVE &&\r\n edit.mode === EditModeValues.VIEW && (\r\n <span data-test=\"challenge-publish-date\">\r\n Published{' '}\r\n {formatDate(challenge.updatedAt, true)}\r\n </span>\r\n )}\r\n {challenge.status === ChallengeStatuses.DRAFT && (\r\n <span data-test=\"challenge-not-published-yet\">\r\n Not Published Yet\r\n </span>\r\n )}\r\n </PublishedDate>\r\n </StyledHeaderActionItems>\r\n {EDIT_VIEW_STATUS.includes(challenge.status) ? (\r\n edit.mode === EditModeValues.VIEW ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n width=\"144px\"\r\n height=\"40px\"\r\n disabled={disableRestore}\r\n action={() =>\r\n handleSaveWithModalAction(\r\n ChallengeStatuses.ARCHIVED\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"archive-challenge\"\r\n >\r\n Archive\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave || isViewMode}\r\n action={() => setEditModal(true)}\r\n dataTest=\"edit-challenge\"\r\n >\r\n Edit\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"144px\"\r\n disabled={loadingSave}\r\n action={() => cancelEditing()}\r\n variant=\"inverse\"\r\n dataTest=\"cancel-edit-challenge\"\r\n >\r\n Cancel\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={loadingSave}\r\n action={() =>\r\n handleUpdateChallenge(null)\r\n }\r\n dataTest=\"save-challenge\"\r\n >\r\n Save\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )\r\n ) : challenge.status === ChallengeStatuses.ARCHIVED ? (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={disableRestore}\r\n action={() =>\r\n handleRestoreArchivedChallenge(\r\n challenge.id\r\n )\r\n }\r\n dataTest=\"restore-challenge\"\r\n >\r\n Restore\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n ) : (\r\n <StyledHeaderActionItemsWrapper>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"144px\"\r\n disabled={\r\n player.status !== 'off' ||\r\n !!player.recording ||\r\n generating ||\r\n loadingSave ||\r\n isViewMode\r\n }\r\n action={() =>\r\n handleUpdateChallenge(\r\n null,\r\n ChallengeStatuses.DRAFT\r\n )\r\n }\r\n variant=\"inverse\"\r\n dataTest=\"save-challenge-as-draft\"\r\n >\r\n Save as Draft\r\n </Button>\r\n </StyledHeaderActionItems>\r\n <StyledHeaderActionItems>\r\n <Button\r\n height=\"40px\"\r\n width=\"128px\"\r\n disabled={\r\n player.status !== 'off' ||\r\n !!player.recording ||\r\n generating ||\r\n loadingSave ||\r\n isViewMode\r\n }\r\n action={() =>\r\n handleUpdateChallenge(\r\n null,\r\n ChallengeStatuses.ACTIVE\r\n )\r\n }\r\n dataTest=\"publish-challenge\"\r\n >\r\n Publish\r\n </Button>\r\n </StyledHeaderActionItems>\r\n </StyledHeaderActionItemsWrapper>\r\n )}\r\n </StyledHeaderActions>\r\n </StyledCustomHeader>\r\n <TableDivider />\r\n </StyledCustomWrapper>\r\n );\r\n};\r\n\r\nconst HeaderContainer: FC<{\r\n handleUpdateChallenge: (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status,\r\n keepModal?: boolean\r\n ) => any;\r\n challenge: Challenge;\r\n modified?: boolean;\r\n isViewMode?: boolean;\r\n}> = ({ challenge, handleUpdateChallenge, modified, isViewMode }) => {\r\n const player = useSelector(getAudioState);\r\n const voiceSettings = useCompanyVoiceSettingsState();\r\n const storeChallengeTemp = useStoreChallengeTempCopyService();\r\n const restoreChallengeFromTemp = useRestoreChallengeFromTempActionService();\r\n\r\n return (\r\n <Header\r\n player={player}\r\n handleUpdateChallenge={handleUpdateChallenge}\r\n modified={modified}\r\n storeChallengeTemp={storeChallengeTemp}\r\n restoreChallengeFromTemp={restoreChallengeFromTemp}\r\n challenge={challenge}\r\n voiceSettings={voiceSettings.data}\r\n isViewMode={isViewMode}\r\n />\r\n );\r\n};\r\n\r\nexport default HeaderContainer;\r\n","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport { useHistory } from '../../tools/router';\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n CREATE_CHALLENGE_ACTION,\n UPDATE_CHALLENGE_ACTION,\n UPDATE_CHALLENGE_STATUS_ACTION,\n} from '../library/services/LibraryBulkActionsService/constants';\nimport {\n Challenge,\n ChallengeStatuses,\n} from '../../constants/interfaces/Challenge';\nimport { updateLibraryChallengeSuccess } from '../library/store/actions';\nimport { StatusItems } from './pages/EditChallenge';\nimport ROUTES from '../../routes/routes';\nimport { useModifyChallengeService } from './store/services';\nimport { ErrorResult } from '../../constants/interfaces/ErrorResult';\nimport { useUpdateChallengeStatusApi } from '../../api';\n\n/**\n * @function useCreateEditChallengeSuccessCallback\n * @param { Function } setLoadingSave\n * @param { Record<string, unknown> | undefined } responses\n * @returns { void }\n */\nexport const useCreateEditChallengeSuccessCallback = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const showMessage = useShowMessage();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n responses?: Record<string, unknown>\n ) => {\n setLoadingSave(false);\n\n if (!isEmpty(responses)) {\n const createChallengeResponse = responses![\n CREATE_CHALLENGE_ACTION\n ] as Challenge | undefined;\n\n const editChallengeResponse = responses![\n UPDATE_CHALLENGE_ACTION\n ] as Challenge | undefined;\n\n const updateChallengeResponse = responses![\n UPDATE_CHALLENGE_STATUS_ACTION\n ] as Challenge | undefined;\n if (createChallengeResponse) {\n dispatch(\n updateLibraryChallengeSuccess(\n createChallengeResponse,\n 'update'\n )\n );\n\n const currentStatus = !isEmpty(updateChallengeResponse)\n ? ChallengeStatuses.ACTIVE\n : ChallengeStatuses.DRAFT;\n\n const actionMessage = StatusItems.filter(\n (item: any) => item.value === currentStatus\n );\n showMessage(actionMessage[0].message, 'success');\n } else if (editChallengeResponse) {\n dispatch(\n updateLibraryChallengeSuccess(\n editChallengeResponse,\n 'update'\n )\n );\n }\n }\n\n history.push(ROUTES.LIBRARY_SETTINGS.CHALLENGES.ALL);\n },\n [dispatch, history, showMessage]\n );\n};\n\n/**\n * @function useCreateEditChallengeFailedCallback\n * @param { Function } setIsLoading\n * @param { ErrorResult | undefined } error\n * @param { Record<string, unknown> | undefined } completedResponses\n * @returns { void }\n */\nexport const useCreateEditChallengeFailedCallback = () => {\n const modifyChallenge = useModifyChallengeService();\n const showMessage = useShowMessage();\n\n return useCallback(\n (\n setLoadingSave: (isLoading: boolean) => void,\n error?: ErrorResult,\n completedResponses?: Record<string, unknown>\n ) => {\n if (!isEmpty(completedResponses)) {\n const createChallengeResponse = completedResponses![\n CREATE_CHALLENGE_ACTION\n ] as Challenge | undefined;\n\n const createdChallengeId = createChallengeResponse?.id;\n\n // The bulk action failed in other steps\n // but new challenge created\n // in the next try it goes to\n // edit challenge action.\n if (createdChallengeId) {\n modifyChallenge(createdChallengeId, 'id');\n }\n }\n\n error?.message && showMessage(error.message, 'error');\n setLoadingSave(false);\n },\n [modifyChallenge, showMessage]\n );\n};\n\n/**\n * @function useHandleArchiveChallenge\n * @returns { Promise<void> }\n */\nexport const useHandleArchiveChallenge = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const updateChallengeStatus = useUpdateChallengeStatusApi();\n\n return useCallback(\n (challengeId: number) => {\n updateChallengeStatus('archive', [challengeId]).then(response => {\n dispatch(updateLibraryChallengeSuccess(response, 'update'));\n\n history.goBack();\n });\n },\n [dispatch, history, updateChallengeStatus]\n );\n};\n\n/**\n * @function useHandleRestoreArchivedChallenge\n * @param { number } challengeId\n * @returns { void }\n */\nexport const useHandleRestoreArchivedChallenge = () => {\n const dispatch = useDispatch();\n const modifyChallenge = useModifyChallengeService();\n const updateChallengeStatus = useUpdateChallengeStatusApi();\n\n return useCallback(\n (challengeId?: number) => {\n if (challengeId) {\n updateChallengeStatus('draft', [challengeId]).then(\n (response: Challenge) => {\n dispatch(\n updateLibraryChallengeSuccess(response, 'update')\n );\n modifyChallenge(\n ChallengeStatuses.DRAFT,\n 'status',\n true\n );\n }\n );\n }\n },\n [dispatch, modifyChallenge, updateChallengeStatus]\n );\n};","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\n\nexport type EditMode = 'create' | 'edit' | 'view';\nexport type ModifyCase =\n | 'init'\n | 'created'\n | 'modified'\n | 'loaded'\n | 'updated'\n | 'error';\n\nexport interface ChallengeState {\n data: Challenge;\n temp_data?: Challenge;\n loading?: boolean;\n case: ModifyCase;\n error?: string;\n}\n\nexport type ChallengeStateStateSelector = (state: any) => ChallengeState;\n\nexport const ChallengeStateSelectorContext = React.createContext<\n ChallengeStateStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useChallengeState(): ChallengeState {\n return useSelector(useContext(ChallengeStateSelectorContext));\n}\n","import { Challenge } from '../../constants/interfaces/Challenge';\nimport { ScriptLine } from '../../constants/interfaces/ScriptLine';\n\nexport const validationService = (challenge: Challenge, status: string) => {\n const output = {\n valid: true,\n message: '',\n name: ''\n };\n \n switch (status) {\n case 'DELETED':\n output.valid = true;\n break;\n case 'ACTIVE':\n if (!challenge.title?.trim()) {\n output.valid = false;\n output.message = 'Title required';\n output.name = 'name';\n } else if (challenge.script.lines.length < 1) {\n output.valid = false;\n output.message = 'Challenge should have at least one line';\n } else if (\n !challenge.script.totalDuration ||\n challenge.script.totalDuration < 0.1\n ) {\n output.valid = false;\n output.message = 'Audio records required';\n } else {\n challenge.script.lines.map((line: ScriptLine) => {\n if (!line.audioUrl && line.speaker === 'CUSTOMER') {\n output.valid = false;\n output.message = 'Audio records required';\n }\n return output;\n });\n }\n break;\n case 'DRAFT':\n if (!challenge.title?.trim()) {\n output.valid = false;\n output.message = 'Title required';\n output.name = 'name';\n } else if (challenge.script.lines.some(line => !line.audioId)) {\n output.valid = false;\n output.message = 'Audio records required';\n }\n break;\n case 'ARCHIVED':\n default:\n if (challenge.title.length < 1) {\n output.valid = false;\n output.message = 'Title required';\n }\n }\n return output;\n};\n\nexport enum ScriptLineSpeakers {\n EDIT = 'EDIT',\n VIEW = 'VIEW',\n}","import React, { FC, useContext } from 'react';\nimport styled from 'styled-components';\nimport { ModifyCase, useChallengeState } from '../../store/states';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\nimport {\n useModifyChallengeService,\n useResetChallengeLogoService,\n} from '../../store/services';\nimport { EditModeContext } from '../../pages/EditChallenge';\nimport { EditModeValues } from '../../../../constants/enums/EditModeValues';\nimport { Variables } from '../../../../theme/variables';\nimport TextAreaBox from '../../../../ui/components/TextAreaBox/TextAreaBox';\n\nconst StyledScenarioInfo = styled.div`\n flex: 2;\n margin-right: 32px;\n padding-top: 24px;\n`;\n\nconst StyledScenarioInfoContent = styled.div`\n border-radius: 4px;\n`;\n\nconst StyledInputDivs = styled.div``;\n\nconst ChallengeInfo: FC<{\n challenge: Challenge;\n modified: ModifyCase;\n modifyChallenge: (value: any, field: keyof Challenge) => any;\n onRefreshLogo?: () => void;\n}> = ({ challenge, modifyChallenge }) => {\n const edit = useContext(EditModeContext);\n\n return (\n <StyledScenarioInfo>\n <StyledScenarioInfoContent>\n <StyledInputDivs>\n <TextAreaBox\n background={Variables.Colors.whiteFive}\n value={challenge && challenge.description}\n onChange={(e: any) =>\n modifyChallenge(e.target.value, 'description')\n }\n name=\"description\"\n placeholder=\"Description\"\n max={500}\n minRows={7.5}\n padding=\"12px 16px\"\n readOnly={edit.mode === EditModeValues.VIEW}\n dataTest='chanllenge-description'\n />\n </StyledInputDivs>\n </StyledScenarioInfoContent>\n </StyledScenarioInfo>\n );\n};\n\nexport const ChallengeInfoContainer: FC<{\n challenge: Challenge;\n}> = ({ challenge }) => {\n const modified = useChallengeState().case;\n\n const modifyChallenge = useModifyChallengeService();\n const resetChallengeLogo = useResetChallengeLogoService();\n\n return (\n <ChallengeInfo\n challenge={challenge}\n modified={modified}\n modifyChallenge={modifyChallenge}\n onRefreshLogo={resetChallengeLogo}\n />\n );\n};\n\nexport default ChallengeInfoContainer;\n","import React, { FC, useEffect, useRef, useState } from 'react';\nimport { ScriptLine } from '../../../../../constants/interfaces/ScriptLine';\nimport styled from 'styled-components';\nimport {\n Comment,\n CommentBody,\n CommentDescription,\n CommentTitle,\n} from '../../../../../ui/components/Comment';\nimport ContentEditableInput from '../../../../../ui/components/ContentEditableDiv/ContentEditableDiv';\nimport { Variables } from '../../../../../theme/variables';\n\nconst StyledScriptItem = styled.div`\n width: 100%;\n margin-left: 48px;\n`;\n\nconst DisabledArea = styled.div`\n position: absolute;\n height: 100%;\n background: transparent;\n width: 100%;\n top: 0;\n left: 0;\n`;\n\nconst StyledCommentTitle = styled(CommentTitle)`\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst StyledContentEditableInput = styled(ContentEditableInput)`\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst RepScriptItem: FC<{\n script: ScriptLine;\n}> = ({ script }) => {\n const myRef = useRef<any>(null);\n const [localValue, setLocalValue] = useState(script.text);\n\n useEffect(() => {\n if (localValue !== script.text) {\n setLocalValue(script.text);\n }\n }, [script.text, localValue]);\n\n return (\n <StyledScriptItem ref={myRef}>\n <Comment\n reverse={true}\n disabled={true}\n background={Variables.Colors.whiteFive}\n >\n <CommentBody>\n <CommentDescription hideRemoveIcon={true}>\n <DisabledArea />\n <StyledCommentTitle dataTest=\"challenge-rep-line-title\">Rep</StyledCommentTitle>\n <StyledContentEditableInput\n value={localValue}\n placeholder={'Write rep’s line here'}\n viewMode={true}\n dataTest=\"challenge-rep-line\"\n />\n </CommentDescription>\n </CommentBody>\n </Comment>\n </StyledScriptItem>\n );\n};\n\nexport const RepScriptItemContainer: FC<{\n script: ScriptLine;\n}> = ({ script }) => {\n return <RepScriptItem script={script} />;\n};\n\nexport default RepScriptItemContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\nimport { ScriptLine } from '../../../../../constants/interfaces/ScriptLine';\nimport RepScriptItemContainer from './RepScriptLine';\nimport Drag from '../../../../../ui/icons/Drag';\n\nconst StyledScriptLineWrapper = styled.div<{ reverse?: boolean }>`\n display: flex;\n flex-direction: ${props => (props.reverse ? 'row' : 'row-reverse')};\n margin-bottom: 16px;\n`;\n\nconst StyledScriptHandle = styled.div<{ reverse?: boolean; hidden?: boolean }>`\n color: #b1c0cb;\n display: flex;\n flex-shrink: 0;\n width: 11px;\n align-items: center;\n height: 30px;\n margin-left: ${props => (props.reverse ? 29 : 8)}px;\n margin-right: ${props => (props.reverse ? 8 : 29)}px;\n visibility: ${props => (props.hidden ? 'hidden' : 'visible')};\n display: none;\n`;\n\nconst RepLine: FC<{\n item: ScriptLine;\n editMode: string;\n disabled: boolean;\n dragHandleProps: any;\n}> = ({ item, editMode, dragHandleProps }) => {\n return (\n <div>\n <StyledScriptLineWrapper>\n <StyledScriptHandle\n className=\"handle\"\n hidden={editMode === EditModeValues.VIEW}\n {...dragHandleProps}\n data-test='challenge-rep-line-drag-handle'\n >\n <Drag />\n </StyledScriptHandle>\n <RepScriptItemContainer key={item.id} script={item} />\n </StyledScriptLineWrapper>\n </div>\n );\n};\n\nexport default RepLine;\n","import { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../../constants/interfaces/ScriptLine';\nimport styled from 'styled-components';\nimport { Dispatch } from 'redux';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { UserProfile } from '../../../../../constants/interfaces/User';\nimport {\n useClearVoiceService,\n useTextToSpeechService,\n} from '../../../../textToSpeech/store/services';\nimport { useVoiceGenerationState } from '../../../../textToSpeech/store/states';\nimport { findItem } from '../../../../../tools/ramda';\nimport { CompanyInterface } from '../../../../../constants/interfaces/Company';\nimport { CompanyVoiceSettings } from '../../../../../constants/interfaces/CompanyVoiceSettings';\nimport {\n AudioInterface,\n getAudioState,\n} from '../../../../player/store/reducers';\nimport {\n useGoNextService,\n usePlayAudioService,\n useResetAudioService,\n useStartAudioRecordingService,\n useStopAudioRecordingService,\n useStopAudioService,\n} from '../../../../player/store/services';\nimport { getProfileState } from '../../../../../pages/UserProfile/store/reducers';\nimport { getCompanyState } from '../../../../../pages/CompanySettings/store/reducers';\nimport {\n useDeleteChallengeScriptLineService,\n useModifyChallengeScriptLineService,\n useUploadChallengeAudioService,\n} from '../../../store/services';\nimport { Button } from '../../../../../ui/components/Button';\nimport {\n Comment,\n CommentBody,\n CommentDescription,\n CommentTitle,\n CommentTools,\n} from '../../../../../ui/components/Comment';\nimport AudioRecorder from '../../../../../ui/components/AudioRecorder/AudioRecorder';\nimport { AudioPlayer } from '../../../../../ui/components/AudioPlayer/AudioPlayer';\nimport Play from '../../../../../ui/icons/Play';\nimport Generate from '../../../../../ui/icons/Generate';\nimport Record from '../../../../../ui/icons/Record';\nimport ContentEditableInput from '../../../../../ui/components/ContentEditableDiv/ContentEditableDiv';\nimport { useCompanyVoiceSettingsState } from '../../../../../pages/CompanySettings/store/states';\nimport { useShowConfirmModalDialog } from '../../../../../ui/components/ModalDialogs/store/actions';\nimport { getTextToSpeechSettingsOrDefault } from '../../../../textToSpeech/helpers';\n\nconst StyledContainer = styled.div`\n z-index: 1;\n height: 100%;\n min-height: 62px;\n`;\n\nconst StyledScriptItem = styled.div`\n width: 100%;\n`;\n\nconst StyledButton = styled(Button)`\n margin-right: 8px;\n font-size: 11px;\n font-weight: 600;\n`;\n\nconst StyledScriptAction = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n`;\n\nconst StyledAudioSection = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\n\nconst DisabledArea = styled.div`\n position: absolute;\n height: 100%;\n background: transparent;\n width: 100%;\n top: 0;\n left: 0;\n`;\n\nconst CustomerScriptItem: FC<{\n script: ScriptLine;\n handleScriptLineDelete: any;\n handleScriptLineModify: (\n value: any,\n field: string,\n id: number | string\n ) => void;\n handleUploadAudio: (\n file: any,\n associatedEntityId: number | string,\n filename?: string\n ) => any;\n profile?: UserProfile;\n company: CompanyInterface;\n player: AudioInterface;\n handlePlayAudio: (scriptLineId: number | string) => void;\n handleStopAudio: (scriptLineId: number | string) => void;\n handleStartRecording: (scriptLineId: number | string) => void;\n handleStopRecording: () => void;\n handleGoNext: () => void;\n handleResetPlaylist: () => void;\n voiceSettings?: CompanyVoiceSettings[];\n disabled: boolean;\n editable: boolean;\n dispatch: Dispatch;\n}> = ({\n script,\n handleScriptLineDelete,\n handleScriptLineModify,\n handleUploadAudio,\n editable,\n player,\n handlePlayAudio,\n handleStopAudio,\n handleGoNext,\n handleResetPlaylist,\n handleStartRecording,\n handleStopRecording,\n voiceSettings,\n}) => {\n const textToSpeech = useTextToSpeechService();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n const clearAudio = useClearVoiceService();\n const voice = useVoiceGenerationState().challenges;\n const generatingAudio = voice && voice.generating;\n const loadingAudio = !!(\n voice &&\n voice.data &&\n findItem(voice.data, 'id', script.id)\n );\n const voiceData =\n voice &&\n voice.data &&\n findItem(voice.data, 'id', script.id) &&\n findItem(voice.data, 'id', script.id).voice;\n\n const [record, setRecord] = useState({ state: false, open: false });\n const [save, setSave] = useState(false);\n const [audio, setAudio] = useState<any>({});\n const disabled =\n (!!player.recording && player.recording !== script.id) ||\n generatingAudio;\n\n useEffect(() => {\n return () => {\n handleClickAway();\n };\n // eslint-disable-next-line\n }, []);\n\n useEffect(() => {\n if (save) {\n if (audio) {\n handleUploadAudio(audio, script.id).then(() => {\n if (generatingAudio) {\n clearAudio({\n feature: 'challenges',\n itemId: script.id,\n });\n }\n });\n }\n }\n // eslint-disable-next-line\n }, [audio]);\n\n const startRecording = (): void => {\n handleResetPlaylist();\n setTimeout(() => {\n handleStartRecording(script.id);\n setRecord({ open: true, state: true });\n }, 100);\n };\n\n const generateAudio = async (): Promise<any> => {\n const settingsOrDefault = getTextToSpeechSettingsOrDefault(voiceSettings);\n\n handleResetPlaylist();\n textToSpeech(\n script.text,\n settingsOrDefault.customer,\n { feature: 'challenges', itemId: script.id }\n );\n };\n\n useEffect(() => {\n if (voiceData) {\n setSave(true);\n setAudio(voiceData);\n }\n }, [voiceData]);\n\n const saveRecording = (): void => {\n setSave(true);\n setRecord({ ...record, state: false });\n };\n\n const handleClickAway = (): void => {\n setSave(false);\n setRecord({ ...record, state: false });\n };\n\n const handleStop = (audio: any) => {\n setAudio(audio.blob);\n handleStopRecording();\n setRecord({ state: false, open: false });\n };\n\n const startPlayingAudio = (): void => {\n handleResetPlaylist();\n handlePlayAudio(script.id);\n };\n\n const myRef = useRef<any>(null);\n\n const onHandleGoNext = () => {\n if (player.status === 'playlist' && myRef.current) {\n myRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n handleGoNext();\n }\n };\n\n\n \n const handleRemoveItem = useCallback(() => {\n showConfirmationModalDialog({\n modalTitle: 'Are You Sure?',\n description: 'Are you sure you want to delete the line?',\n onConfirm: () => handleScriptLineDelete(script.id),\n });\n }, [handleScriptLineDelete, script.id, showConfirmationModalDialog]);\n \n\n const [localValue, setLocalValue] = useState(script.text);\n\n useEffect(() => {\n if (localValue !== script.text) {\n setLocalValue(script.text);\n }\n }, [script.text, localValue]);\n\n return (\n <StyledScriptItem ref={myRef}>\n <Comment\n reverse={script.speaker === ScriptLineSpeaker.REP}\n disabled={disabled || generatingAudio}\n >\n <CommentBody>\n <CommentDescription\n hideRemoveIcon={!editable}\n onDelete={handleRemoveItem}\n dataTest=\"delete-challenge-customer-line\"\n >\n {(!editable || disabled) && <DisabledArea />}\n <CommentTitle dataTest=\"challenge-customer-line-title\">\n Customer\n </CommentTitle>\n <StyledContainer>\n <ContentEditableInput\n value={localValue}\n handleChange={value => {\n handleScriptLineModify(\n value,\n 'text',\n script.id\n );\n }}\n placeholder={'Write customer’s line here'}\n autoFocus={!localValue}\n recording={\n !!player.recording &&\n player.recording === script.id\n }\n viewMode={!editable || disabled}\n dataTest=\"challenge-customer-line\"\n />\n </StyledContainer>\n </CommentDescription>\n <CommentTools>\n {!record.open && player.current !== script.id && (\n <StyledScriptAction>\n <StyledAudioSection>\n {editable && (\n <StyledButton\n label=\"Record Audio\"\n action={startRecording}\n iconRender={<Record />}\n color=\"warning\"\n variant=\"transparent\"\n buttonSize={12}\n width={'90px'}\n dataTest=\"record-challenge-customer-line-audio\"\n />\n )}\n {editable && localValue.length > 0 && (\n <StyledButton\n label=\"Generate Audio\"\n iconRender={<Generate />}\n action={generateAudio}\n variant=\"transparent\"\n loading={loadingAudio}\n buttonSize={14}\n dataTest=\"generate-challenge-customer-line-audio\"\n />\n )}\n {script.audioUrl && (\n <StyledButton\n label=\"Play\"\n iconRender={<Play />}\n action={startPlayingAudio}\n variant=\"transparent\"\n buttonSize={14}\n width={'40px'}\n dataTest=\"play-challenge-customer-line-audio\"\n />\n )}\n </StyledAudioSection>\n </StyledScriptAction>\n )}\n {record.open && (\n <AudioRecorder\n record={record.state}\n onClickAway={handleClickAway}\n onStop={handleStop}\n onSave={saveRecording}\n />\n )}\n {player.current === script.id && (\n <AudioPlayer\n audio={script.audioUrl}\n duration={\n script.duration ? script.duration : 10\n }\n onStop={() => handleStopAudio(script.id)}\n autoPlay={true}\n goNext={onHandleGoNext}\n />\n )}\n </CommentTools>\n </CommentBody>\n </Comment>\n </StyledScriptItem>\n );\n};\n\nexport const CustomerScriptItemContainer: FC<{\n script: ScriptLine;\n disabled: boolean;\n editable: boolean;\n}> = ({ script, disabled, editable }) => {\n const dispatch = useDispatch();\n\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n const player = useSelector(getAudioState);\n\n const resetPlaylist = useResetAudioService();\n const goNext = useGoNextService();\n const playAudio = usePlayAudioService();\n const stopAudio = useStopAudioService();\n const startRecording = useStartAudioRecordingService();\n const stopRecording = useStopAudioRecordingService();\n\n const deleteScriptLine = useDeleteChallengeScriptLineService();\n const modifyScriptLine = useModifyChallengeScriptLineService();\n\n const uploadChallengeAudio = useUploadChallengeAudioService();\n const voiceSettings = useCompanyVoiceSettingsState();\n\n return (\n <CustomerScriptItem\n script={script}\n handleScriptLineDelete={deleteScriptLine}\n handleScriptLineModify={modifyScriptLine}\n handleUploadAudio={uploadChallengeAudio}\n profile={profile}\n company={company}\n player={player}\n handlePlayAudio={playAudio}\n handleStopAudio={stopAudio}\n handleStartRecording={startRecording}\n handleStopRecording={stopRecording}\n handleGoNext={goNext}\n handleResetPlaylist={resetPlaylist}\n voiceSettings={voiceSettings.data}\n disabled={disabled}\n editable={editable}\n dispatch={dispatch}\n />\n );\n};\n\nexport default CustomerScriptItemContainer;","import React, { FC } from 'react';\r\nimport styled from 'styled-components';\r\nimport {\r\n Comment,\r\n CommentBody,\r\n CommentDescription,\r\n} from '../../../../../ui/components/Comment';\r\nimport { Variables } from '../../../../../theme/variables';\r\nimport { ScriptLine } from '../../../../../constants/interfaces/ScriptLine';\r\n\r\nconst StyledScriptItem = styled.div`\r\n margin-left: 24px;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst StyledCommentBody = styled(CommentBody)`\r\n min-height: 0;\r\n`;\r\n\r\nconst TraineeRespondLine: FC<{\r\n disabled: boolean;\r\n script?: ScriptLine;\r\n}> = ({ disabled }) => {\r\n return (\r\n <StyledScriptItem>\r\n <Comment\r\n disabled={disabled}\r\n reverse={true}\r\n background={Variables.Colors.whiteFive}\r\n >\r\n <StyledCommentBody>\r\n <CommentDescription hideRemoveIcon={true}>\r\n <span data-test='challenge-user-auto-reply'>User will respond here</span>\r\n </CommentDescription>\r\n </StyledCommentBody>\r\n </Comment>\r\n </StyledScriptItem>\r\n );\r\n};\r\n\r\nexport default TraineeRespondLine;\r\n","import React, { FC } from 'react';\nimport { EditModeValues } from '../../../../../constants/enums/EditModeValues';\nimport CustomerScriptItemContainer from '../CustomerScriptLine/CustomerScriptLine';\nimport TraineeRespondLine from '../TraineeRespondLine/TraineeRespondLine';\nimport styled from 'styled-components';\nimport { ScriptLine } from '../../../../../constants/interfaces/ScriptLine';\nimport Drag from '../../../../../ui/icons/Drag';\n\nconst StyledScriptLineWrapper = styled.div<{ reverse?: boolean }>`\n display: flex;\n flex-direction: ${props => (props.reverse ? 'row' : 'row-reverse')};\n margin-bottom: 16px;\n`;\n\nconst StyledScriptHandle = styled.div<{ reverse?: boolean; hidden?: boolean }>`\n color: #b1c0cb;\n display: flex;\n flex-shrink: 0;\n width: 11px;\n align-items: center;\n height: 30px;\n margin-left: ${props => (props.reverse ? 29 : 8)}px;\n margin-right: ${props => (props.reverse ? 8 : 29)}px;\n visibility: ${props => (props.hidden ? 'hidden' : 'visible')};\n`;\n\nconst CustomerLine: FC<{\n item: ScriptLine;\n editMode: string;\n disabled: boolean;\n dragHandleProps: any;\n hideRepPlaceholder?: boolean;\n}> = ({ item, editMode, disabled, dragHandleProps, hideRepPlaceholder }) => {\n return (\n <div>\n <StyledScriptLineWrapper>\n <StyledScriptHandle\n className=\"handle\"\n hidden={editMode === EditModeValues.VIEW}\n {...dragHandleProps}\n data-test='challenge-customer-line-drag-handle'\n >\n <Drag />\n </StyledScriptHandle>\n <CustomerScriptItemContainer\n key={item.id}\n script={item}\n editable={editMode === EditModeValues.EDIT}\n disabled={disabled}\n />\n </StyledScriptLineWrapper>\n {!hideRepPlaceholder && (\n <TraineeRespondLine script={item} disabled={disabled} />\n )}\n </div>\n );\n};\n\nexport default CustomerLine;\n","import React, { FC, useContext, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n DragDropContext,\n Draggable,\n Droppable,\n DropResult,\n} from 'react-beautiful-dnd';\nimport { useSelector } from 'react-redux';\nimport { AudioInterface, getAudioState } from '../../../player/store/reducers';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../constants/interfaces/ScriptLine';\nimport { useUpdateChallengeScriptLineService } from '../../store/services';\nimport {\n ChallengeContainerContext,\n EditModeContext,\n} from '../../pages/EditChallenge';\nimport RepLine from './RepScriptLine';\nimport CustomerLine from './CustomerScriptLine';\n\nconst StyledScriptLineContent = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst StyledDroppableContainer = styled.div<{ isDraggingOver: boolean }>``;\n\nconst StyledDraggableItem = styled.div<{ reverse?: boolean }>`\n margin-bottom: 16px;\n`;\n\nconst ScriptLineContent: FC<{\n script: Array<ScriptLine>;\n player?: AudioInterface;\n handleScriptLineUpdate: (value: any) => void;\n}> = ({ script, player, handleScriptLineUpdate }) => {\n const [scriptLines, setScriptLines] = useState(script);\n const parentRef = useContext(ChallengeContainerContext);\n const edit = useContext(EditModeContext);\n\n useEffect(() => {\n parentRef && parentRef.current.scrollTo(0, 0);\n }, [parentRef]);\n\n useEffect(() => {\n setScriptLines(script);\n }, [script, setScriptLines]);\n\n const Reorder = (startIndex: number, endIndex: number) => {\n const result = Array.from(scriptLines);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n setScriptLines(result);\n handleScriptLineUpdate(result);\n };\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n Reorder(result.source.index, result.destination.index);\n };\n\n const repLineCount = scriptLines.filter(\n item => item.speaker === ScriptLineSpeaker.REP\n ).length;\n\n return (\n <StyledScriptLineContent>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={`challenge-drop-list`}>\n {(provided: any, snapshot) => (\n <StyledDroppableContainer\n ref={provided.innerRef}\n isDraggingOver={snapshot.isDraggingOver}\n >\n {scriptLines.map((item: ScriptLine, index) => {\n let disabled = false;\n if (\n player &&\n player.recording &&\n player.recording !== item.id\n ) {\n disabled = true;\n }\n return (\n <Draggable\n key={`draggable-item_${item.id}`}\n draggableId={item.id.toString()}\n index={index}\n >\n {(provided, snapshot) => (\n <StyledDraggableItem\n ref={provided.innerRef}\n {...provided.draggableProps}\n >\n {item.speaker ===\n ScriptLineSpeaker.REP ? (\n <RepLine\n item={item}\n editMode={edit.mode}\n disabled={disabled}\n dragHandleProps={\n provided.dragHandleProps\n }\n />\n ) : (\n <CustomerLine\n item={item}\n editMode={edit.mode}\n disabled={disabled}\n dragHandleProps={\n provided.dragHandleProps\n }\n hideRepPlaceholder={\n repLineCount > 0\n }\n />\n )}\n </StyledDraggableItem>\n )}\n </Draggable>\n );\n })}\n {provided.placeholder}\n </StyledDroppableContainer>\n )}\n </Droppable>\n </DragDropContext>\n </StyledScriptLineContent>\n );\n};\n\nexport const ScriptLineContentContainer: FC<{\n script: Array<ScriptLine>;\n}> = ({ script }) => {\n const player = useSelector(getAudioState);\n const updateScriptLine = useUpdateChallengeScriptLineService();\n\n return (\n <ScriptLineContent\n script={script}\n player={player}\n handleScriptLineUpdate={updateScriptLine}\n />\n );\n};\n\nexport default ScriptLineContentContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport LinkText from '../../../../ui/components/LinkText/link-text';\n\nconst StyledEmptyScriptContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n`;\n\nconst ScriptAction: FC<{\n handleAdd: any;\n}> = ({ handleAdd }) => {\n return (\n <StyledEmptyScriptContainer>\n <LinkText\n onClick={() => handleAdd('CUSTOMER')}\n dataTest='add-challenge-customer-line'>\n + Add a customer line\n </LinkText>\n </StyledEmptyScriptContainer>\n );\n};\n\nexport default ScriptAction;\n","import styled from 'styled-components';\nimport { Button } from '../../../../ui/components/Button';\n\nexport const StyledChallengeScriptHeader = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 24px;\n padding-top: 24px;\n`;\n\nexport const AttemptsCountContainer = styled.div`\n padding: 16px 24px;\n background: var(--ps-graphite-2);\n border-radius: 4px;\n`;\n\nexport const AttemptsCountText = styled.div`\n font-size: 13px;\n font-weight: bold;\n color: var(--ps-grey-2);\n`;\n\nexport const AttemptsCountValue = styled.div`\n padding-top: 4px;\n font-size: 20px;\n font-weight: bold;\n color: var(--ps-white-1);\n`;\n\nexport const StyledScriptHeaderActions = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n margin-top: 16px;\n`;\n\nexport const StyledButton = styled(Button)<{ width?: string }>`\n ${props => (!!props.width ? `width: ${props.width}` : '')};\n`;\n\nexport const IconContainer = styled.div`\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n width: 16px;\n height: 16px;\n }\n`;\n\nexport const LeftButtons = styled.div`\n display: flex;\n flex-direction: row;\n\n & button {\n margin-right: 8px;\n }\n`;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Attempts = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#v0f9vgv80a)\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m14.357 3.143 1.216-1.216a.25.25 0 0 1 .427.177V5.75a.25.25 0 0 1-.25.25h-3.646a.25.25 0 0 1-.177-.427l1.358-1.358a6.5 6.5 0 1 0 1.18 4.458.75.75 0 0 1 1.493.154 8.001 8.001 0 1 1-1.6-5.684z\"/>\n <path d=\"M6 5.75A.75.75 0 0 1 6.75 5h1.5a.75.75 0 0 1 .75.75V9.5h.75a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5h.75v-3h-.75A.75.75 0 0 1 6 5.75z\"/>\n </g>\n <defs>\n <clipPath id=\"v0f9vgv80a\">\n <path fill=\"#fff\" transform=\"matrix(-1 0 0 1 16 0)\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Attempts;\n","import { makeStyles } from '@material-ui/core';\nimport { Form } from 'formik';\nimport { Input } from '../../../../../../ui/components/input';\nimport styled from 'styled-components';\n\nexport const StyledForm = styled(Form)`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nexport const Content = styled.div`\n height: 551px;\n box-sizing: border-box;\n padding: 24px 100px 24px 24px;\n`;\n\nexport const UnlimitedSetting = styled.div`\n padding-top: 16px;\n`;\n\nexport const SettingDescription = styled.div`\n padding-left: 20px;\n color: var(--ps-grey-1);\n`;\n\nexport const UnlimitedSettingDescription = styled(SettingDescription)`\n padding-top: 8px;\n font-size: 13px;\n`;\n\nexport const LimitedSetting = styled.div`\n font-size: 13px;\n`;\n\nexport const LimitedSettingValue = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const LimitNumberContainer = styled.div`\n padding-left: 4px;\n`;\n\nexport const LimitInput = styled(Input)<{ ref?: any; }>`\n width: 49px;\n padding: 4px 8px;\n font-weight: bold;\n border: 1px solid var(--ps-grey-3);\n border-radius: 4px;\n\n &:focus {\n border: 1px solid var(--ps-grey-2);\n }\n`;\n\nexport const LimitedSettingDescription = styled(SettingDescription)`\n padding-top: 3px;\n`;\n\nexport const LimitWarning = styled.div`\n margin-top: 24px;\n margin-left: 18px;\n padding: 12px;\n border-radius: 4px;\n background-color: var(--ps-blue-12);\n font-size: 13px;\n color: var(--ps-blue-1);\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n border-top: 1px solid var(--ps-grey-4);\n padding: 23px 5px 0 5px;\n width: 100%;\n box-sizing: border-box;\n height: 64px;\n align-items: center;\n padding: 0 24px 0 0;\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customRadioButton: {\n marginBottom: '0!important',\n },\n}));","import { Formik } from 'formik';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { RadioButton } from '../../../../../../ui/components/RadioButton';\nimport { useFocus } from '../../../../../../helpers/hooks/useFocus';\nimport { ChallengeAttemptsLimitViewProps, ChallengeAttemptsLimitFormValues } from './types';\nimport {\n Content,\n Footer,\n LimitedSetting,\n LimitedSettingDescription,\n LimitedSettingValue,\n LimitInput,\n LimitNumberContainer,\n LimitWarning,\n StyledForm,\n UnlimitedSetting,\n UnlimitedSettingDescription,\n useStyles,\n} from './styles';\n\nfunction ChallengeAttemptsLimitView({\n initialSettings,\n isValidLimitValue,\n validateSettings,\n onSubmit,\n}: ChallengeAttemptsLimitViewProps) {\n const [inputRef, setFocus] = useFocus();\n const classes = useStyles();\n\n return (\n <Formik<ChallengeAttemptsLimitFormValues>\n initialValues={initialSettings}\n validate={validateSettings}\n onSubmit={onSubmit}\n enableReinitialize={true}\n >\n {({ values, dirty, isValid, setFieldValue }) => {\n return (\n <StyledForm>\n <Content>\n <LimitedSetting>\n <LimitedSettingValue>\n <RadioButton\n checked={values.isLimited === true}\n size={12}\n handleChange={() => {\n setFieldValue('isLimited', true);\n setTimeout(setFocus, 0);\n }}\n label=\"Limit Attempts to\"\n disabled={false}\n labelStyles={{ fontWeight: 'bold' }}\n className={classes.customRadioButton}\n dataTest=\"limited-attempts-radio\"\n />\n <LimitNumberContainer>\n <LimitInput\n ref={inputRef}\n height=\"26px\"\n disabled={!values.isLimited}\n value={values.limitValue ?? ''}\n handleChange={e =>\n (!e.target.value || isValidLimitValue(e.target.value)) && setFieldValue('limitValue', e.target.value)\n }\n dataTest=\"limited-attempts-input\"\n />\n </LimitNumberContainer>\n </LimitedSettingValue>\n <LimitedSettingDescription data-test=\"limited-attempts-description\">\n Users have limited attempts. After reaching the limit, the App force them to submit last recording. Recommended value is 3 attempts.\n </LimitedSettingDescription>\n </LimitedSetting>\n <UnlimitedSetting>\n <RadioButton\n checked={values.isLimited === false}\n size={12}\n label=\"Unlimited attempts\"\n handleChange={() => {\n setFieldValue('isLimited', false);\n if (values.limitValue !== initialSettings.limitValue) {\n setFieldValue('limitValue', null);\n }\n }}\n disabled={false}\n labelStyles={{ fontWeight: 'bold' }}\n className={classes.customRadioButton}\n dataTest=\"unlimited-attempts\"\n />\n <UnlimitedSettingDescription data-test=\"unlimited-attempts-description\">\n Learners can record as many times as they want before they submit the challenge.\n </UnlimitedSettingDescription>\n </UnlimitedSetting>\n <LimitWarning data-test=\"attempts-warning\">\n <b>Important:</b> The new limitation will affect all newly assigned Learners and Learners who haven't submitted the challenge yet. This change won't affect users who already submitted the challenge.\n </LimitWarning>\n </Content>\n <Footer>\n <Button\n width=\"130px\"\n height=\"40px\"\n disabled={!dirty || !isValid}\n loadingColor=\"white\"\n loadingSize={24}\n dataTest=\"apply-button\"\n >\n Apply\n </Button>\n </Footer>\n </StyledForm>\n );\n }}\n </Formik>\n );\n}\n\nexport default ChallengeAttemptsLimitView;","import { useCallback, useMemo } from 'react';\nimport { ChallengeAttemptsLimitFormValues, ChallengeAttemptsLimitProps } from './types';\nimport ChallengeAttemptsLimitView from './view';\nimport { useModifyChallengeService } from '../../../../store/services';\n\nfunction ChallengeAttemptsLimit({\n challenge\n}: ChallengeAttemptsLimitProps) {\n const modifyChallenge = useModifyChallengeService();\n\n const initialSettings = useMemo((): ChallengeAttemptsLimitFormValues => {\n return {\n isLimited: !!challenge.tryLimit,\n limitValue: challenge.tryLimit?.toString() || null\n };\n }, [challenge.tryLimit]);\n\n const isValidLimitValue = (value: string) => Number(value) > 0;\n\n const validateSettings = (settings: ChallengeAttemptsLimitFormValues) => {\n const errors: Record<string, string> = {};\n if (settings.isLimited && !settings.limitValue) {\n errors.limitValue = 'Limit value is required';\n }\n return errors;\n };\n\n const handleSubmit = useCallback((settings: ChallengeAttemptsLimitFormValues) => {\n modifyChallenge(\n settings.isLimited ? Number(settings.limitValue) : null,\n 'tryLimit'\n );\n }, [modifyChallenge]);\n\n return (\n <ChallengeAttemptsLimitView\n initialSettings={initialSettings}\n isValidLimitValue={isValidLimitValue}\n validateSettings={validateSettings}\n onSubmit={handleSubmit}\n />\n );\n}\n\nexport default ChallengeAttemptsLimit;","import styled from 'styled-components';\n\nexport const ModalContent = styled.div`\n display: flex;\n flex-direction: row;\n min-height: 215px;\n`;\n\nexport const ModalSidebar = styled.div`\n width: 190px;\n background-color: var(--ps-grey-3);\n border-right: 1px solid var(--ps-grey-4);\n border-bottom-left-radius: 8px;\n`;\n\nexport const NavigationItem = styled.div`\n margin-top: 18px;\n padding-left: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n font-size: 13px;\n color: var(--ps-black-main);\n display: flex;\n text-decoration: none;\n position: relative;\n font-weight: bold;\n\n &:first-child {\n margin-top: 24px;\n }\n\n &::before {\n width: 4px;\n height: 24px;\n background: var(--ps-black-main);\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n border-radius: 0 10px 10px 0;\n }\n`;\n\nexport const NavigationIcon = styled.div`\n width: 16px;\n height: 16px;\n color: var(--ps-black-main);\n margin-right: 12px;\n`;\n\nexport const TabContent = styled.div`\n width: 600px;\n min-height: 615px;\n`;","import { ModalWithCross } from '../../../../ui/components/ModalWithCross';\nimport Attempts from '../../../../ui/icons/Attempts';\nimport { ChallengeAttemptsLimit } from './components/ChallengeAttemptsLimit';\nimport {\n ModalContent,\n ModalSidebar,\n NavigationIcon,\n NavigationItem,\n TabContent\n} from './styles';\nimport { ChallengeSettingsViewProps } from './types';\n\nfunction ChallengeSettingsView({\n challenge,\n onClose\n}: ChallengeSettingsViewProps) {\n\n return (\n <ModalWithCross\n title=\"Challenge Settings\"\n onClose={onClose}\n width={790}\n dataTest=\"challenge-settings-modal\"\n >\n <ModalContent>\n <ModalSidebar>\n <NavigationItem\n data-test=\"attempts-tab\"\n >\n <NavigationIcon><Attempts /></NavigationIcon>\n Attempts\n </NavigationItem>\n </ModalSidebar>\n <TabContent>\n <ChallengeAttemptsLimit challenge={challenge} />\n </TabContent>\n </ModalContent>\n </ModalWithCross>\n );\n}\n\nexport default ChallengeSettingsView;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SmartGear = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#hkbelzmt3a)\">\n <mask id=\"g10cud6qdb\" style={{ maskType: 'luminance' }} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"16\" height=\"16\">\n <path d=\"M0 0h16v16H0V0z\" fill=\"#fff\"/>\n </mask>\n <g mask=\"url(#g10cud6qdb)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.256 3.133a1 1 0 0 1-.75-.968v-.694l-.001-.001-.001-.001H7.497l-.002.001-.001.001v.694a1 1 0 0 1-.75.968c-.46.12-.895.301-1.295.538a1 1 0 0 1-1.216-.154l-.49-.49a.004.004 0 0 0-.005 0h-.001l-.71.71c-.001 0-.002.001-.002.003l.002.003.49.49a1 1 0 0 1 .154 1.216c-.237.4-.419.834-.538 1.295a1 1 0 0 1-.968.75h-.694l-.001.001-.001.001v1.008l.001.001.001.001h.694a1 1 0 0 1 .968.75c.12.46.301.895.538 1.295a1 1 0 0 1-.154 1.216l-.49.49-.002.003.001.003.71.71.004.002.002-.001.49-.49a1.001 1.001 0 0 1 1.217-.155c.4.237.835.419 1.295.538a1 1 0 0 1 .75.968v.694l.001.001.001.001h1.008l.001-.001.001-.001v-.694a1 1 0 0 1 .75-.968c.46-.12.895-.301 1.295-.538a1 1 0 0 1 1.216.154l.49.49.003.002h.002v-.001l.711-.71.001-.002v-.004l-.49-.49a1.001 1.001 0 0 1-.155-1.217c.237-.4.419-.835.538-1.295a1 1 0 0 1 .968-.75h.694l.001-.001.001-.001V7.496l-.001-.001-.001-.001h-.694a1 1 0 0 1-.968-.75 4.996 4.996 0 0 0-.538-1.295 1 1 0 0 1 .154-1.216l.49-.49.002-.003-.001-.003-.71-.71-.004-.002-.002.001-.49.491a1 1 0 0 1-1.217.154 4.993 4.993 0 0 0-1.295-.538zm.25-.968a5.994 5.994 0 0 1 1.554.645l.49-.49a1.004 1.004 0 0 1 1.42 0l.71.71a1.004 1.004 0 0 1 0 1.42l-.49.49c.283.48.502 1.001.645 1.554h.692c.555 0 1.004.45 1.004 1.004v1.004c0 .555-.45 1.004-1.004 1.004h-.692a5.997 5.997 0 0 1-.645 1.554l.49.49a1.004 1.004 0 0 1 0 1.42l-.71.71a1.004 1.004 0 0 1-1.42 0l-.49-.49a5.992 5.992 0 0 1-1.554.645v.692c0 .555-.45 1.004-1.004 1.004H7.498c-.555 0-1.004-.45-1.004-1.004v-.692a5.991 5.991 0 0 1-1.554-.645l-.49.49a1.004 1.004 0 0 1-1.42 0l-.71-.71a1.004 1.004 0 0 1 0-1.42l.49-.49a5.993 5.993 0 0 1-.645-1.554h-.692c-.555 0-1.004-.45-1.004-1.004V7.498c0-.555.45-1.004 1.004-1.004h.692A5.994 5.994 0 0 1 2.81 4.94l-.49-.49a1.004 1.004 0 0 1 0-1.42l.71-.71a1.004 1.004 0 0 1 1.42 0l.49.49a5.993 5.993 0 0 1 1.554-.645v-.692c0-.555.45-1.004 1.004-1.004h1.004c.555 0 1.004.45 1.004 1.004v.692zM8 11.513A3.514 3.514 0 0 1 4.487 8 3.514 3.514 0 0 1 8 4.488 3.514 3.514 0 0 1 11.512 8 3.514 3.514 0 0 1 8 11.513zM5.487 8A2.514 2.514 0 0 0 8 10.513 2.514 2.514 0 0 0 10.512 8 2.514 2.514 0 0 0 8 5.488 2.514 2.514 0 0 0 5.487 8z\" fill=\"#fff\"/>\n </g>\n </g>\n <defs>\n <clipPath id=\"hkbelzmt3a\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default SmartGear;\n","import { ChallengeScriptHeaderViewProps } from './types';\nimport {\n StyledChallengeScriptHeader,\n StyledScriptHeaderActions,\n StyledButton,\n LeftButtons,\n AttemptsCountContainer,\n AttemptsCountText,\n AttemptsCountValue,\n IconContainer,\n} from './styles';\nimport { ChallengeSettings } from '../ChallengeSettings';\nimport Generate from '../../../../ui/icons/Generate';\nimport { ScriptLine } from '../../../../constants/interfaces/ScriptLine';\nimport { EditModeValues } from '../../../../constants/enums/EditModeValues';\nimport Play from '../../../../ui/icons/Play';\nimport { Stop } from '@material-ui/icons';\nimport SmartGear from '../../../../ui/icons/SmartGear';\n\nfunction ChallengeScriptHeaderView({\n player,\n challenge,\n generating,\n showChallengeSettings,\n editMode,\n stopPlaylist,\n playAudio,\n textToSpeech,\n setShowChallengeSettings,\n}: ChallengeScriptHeaderViewProps) {\n const actionsDisabled = editMode === EditModeValues.VIEW;\n const isAudioProcessing = !!player.recording || generating;\n const isGenerateForAllDisabled = (\n !!challenge.script\n && (\n challenge.script.lines.filter((line: ScriptLine) => line.text).length === 0\n || player.status !== 'off'\n || isAudioProcessing\n )\n )\n || actionsDisabled;\n const isPlayDisabled = (\n !!challenge.script\n && (\n challenge.script.lines.filter((line: ScriptLine) => line.audioUrl).length === 0\n || isAudioProcessing\n )\n );\n return (\n <StyledChallengeScriptHeader>\n {showChallengeSettings && (\n <ChallengeSettings\n challenge={challenge}\n onClose={() => setShowChallengeSettings(false)}\n />\n )}\n <AttemptsCountContainer>\n <AttemptsCountText data-test=\"max-attempts-text\">Max. Attempts</AttemptsCountText>\n <AttemptsCountValue data-test=\"challenge-attempts-limit\">\n {challenge.tryLimit?.toString() || 'Unlimited'}\n </AttemptsCountValue>\n </AttemptsCountContainer>\n <StyledScriptHeaderActions>\n <LeftButtons>\n <StyledButton\n label=\"Generate for All\"\n iconRender={<IconContainer><Generate /></IconContainer>}\n disabled={isGenerateForAllDisabled}\n width=\"127px\"\n height=\"40px\"\n action={textToSpeech}\n dataTest='challenge-generate-for-all'\n />\n {player.status !== 'playlist' ? (\n <StyledButton\n label=\"Play\"\n iconRender={<IconContainer><Play /></IconContainer>}\n disabled={isPlayDisabled}\n action={playAudio}\n height=\"40px\"\n width=\"58px\"\n dataTest='challenge-play-all'\n />\n ) : (\n <StyledButton\n label=\"Stop\"\n iconRender={<IconContainer><Stop /></IconContainer>}\n color=\"warning\"\n action={stopPlaylist}\n height=\"40px\"\n width=\"58px\"\n dataTest='challenge-stop'\n />\n )}\n </LeftButtons>\n <div>\n <StyledButton\n label=\"Settings\"\n iconRender={<IconContainer><SmartGear /></IconContainer>}\n disabled={actionsDisabled}\n width=\"84px\"\n height=\"40px\"\n action={() => setShowChallengeSettings(true)}\n dataTest='challenge-settings'\n />\n </div>\n </StyledScriptHeaderActions>\n </StyledChallengeScriptHeader>\n );\n}\n\nexport default ChallengeScriptHeaderView;","import { useSelector } from 'react-redux';\nimport ChallengeScriptHeaderView from './view';\nimport { useContext, useState } from 'react';\nimport { ScriptLineSpeaker } from '../../../../constants/interfaces/ScriptLine';\nimport { getAudioState } from '../../../player/store/reducers';\nimport { useResetAudioService } from '../../../player/store/services';\nimport { useTextToSpeechBulkActionService } from '../../../textToSpeech/BulkActionService';\nimport { useVoiceGenerationState } from '../../../textToSpeech/store/states';\nimport { EditModeContext, PlayAudioContext } from '../../pages/EditChallenge';\nimport { useChallengeState } from '../../store/states';\n\nfunction ChallengeScriptHeader() {\n const edit = useContext(EditModeContext);\n const [showChallengeSettings, setShowChallengeSettings] = useState(false);\n\n const player = useSelector(getAudioState);\n const challenge = useChallengeState().data;\n const resetPlaylist = useResetAudioService();\n const voice = useVoiceGenerationState().challenges;\n const playAudio = useContext(PlayAudioContext);\n const textToSpeechBulkAction = useTextToSpeechBulkActionService(\n challenge.script.lines.filter(line => line.speaker === ScriptLineSpeaker.CUSTOMER),\n 'challenges'\n )\n\n return (\n <ChallengeScriptHeaderView\n challenge={challenge}\n player={player}\n generating={voice?.generating}\n showChallengeSettings={showChallengeSettings}\n editMode={edit.mode}\n stopPlaylist={resetPlaylist}\n playAudio={playAudio}\n textToSpeech={textToSpeechBulkAction}\n setShowChallengeSettings={setShowChallengeSettings}\n />\n );\n}\n\nexport default ChallengeScriptHeader;","import React, { FC, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\nimport { useGetCompanyService } from '../../../../pages/CompanySettings/store/services';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\nimport ScriptLineContent from '../ScriptLineContent';\nimport ScriptAction from '../ScriptAction/ScriptAction';\nimport { ChallengeScriptHeader } from '../ChallengeScriptHeader';\nimport { EditModeContext } from '../../pages/EditChallenge';\nimport { EditModeValues } from '../../../../constants/enums/EditModeValues';\nimport Customer from '../../../../ui/icons/Customer';\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\n\nexport interface RightPanelInterface {\n challenge: Challenge;\n createScriptLine: any;\n company?: CompanyInterface;\n}\n\nconst StyledScenarioScript = styled.div`\n flex: 3;\n display: flex;\n flex-direction: column;\n min-width: 400px;\n`;\n\nconst UserAvatarPanel = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n`;\n\nconst StyledCustomer = styled.div<{ reverse?: boolean }>`\n display: flex;\n align-items: center;\n flex-direction: ${props => (props.reverse ? 'row-reverse' : 'row')};\n`;\n\nconst ImageContainer = styled.div`\n height: 40px;\n width: 40px;\n border-radius: 4px;\n overflow: hidden;\n background: ${props => props.theme.Colors.white};\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledImage = styled.img`\n height: 100%;\n width: 100%;\n`;\n\nconst StyledCustomerImage = styled(Customer)`\n height: 20px;\n width: 20px;\n`;\n\nconst StyledText = styled.p`\n font-size: 13px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n margin: 0 8px;\n`;\n\nconst ScriptsBody = styled.div`\n padding: 8px;\n`;\n\nconst PlaceholderWrapper = styled.div`\n width: 100%;\n height: 100%;\n border-radius: 4px;\n align-items: center;\n justify-content: center;\n display: flex;\n`;\n\nconst ChallengeScripts = ({\n challenge,\n createScriptLine,\n company,\n}: RightPanelInterface) => {\n const edit = useContext(EditModeContext);\n let logo;\n const mediaUrl = company?.logoUrl;\n if (mediaUrl) {\n logo = <StyledImage src={mediaUrl} alt=\"company\" />;\n } else if (company) {\n logo = (\n <AvatarPlaceholder\n profile={company}\n size={'sm'}\n customWrapper={PlaceholderWrapper}\n />\n );\n }\n \n return (\n <StyledScenarioScript>\n <ChallengeScriptHeader />\n <ScriptsBody>\n <UserAvatarPanel>\n <StyledCustomer>\n <ImageContainer data-test='challenge-customer-avatar'>\n <StyledCustomerImage />\n </ImageContainer>\n <StyledText data-test='challenge-customer-label'>Customer</StyledText>\n </StyledCustomer>\n <StyledCustomer reverse>\n <ImageContainer data-test='challenge-rep-logo'>{logo}</ImageContainer>\n <StyledText data-test='challenge-rep-label'>Rep</StyledText>\n </StyledCustomer>\n </UserAvatarPanel>\n {challenge.script && (\n <ScriptLineContent script={challenge.script.lines} />\n )}\n {edit.mode === EditModeValues.EDIT && (\n <ScriptAction handleAdd={createScriptLine} />\n )}\n </ScriptsBody>\n </StyledScenarioScript>\n );\n};\n\nexport const ChallengeScriptsContainer: FC<{\n challenge: Challenge;\n createScriptLine: any;\n}> = ({ challenge, createScriptLine }) => {\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n const getCompany = useGetCompanyService();\n\n useEffect(() => {\n if (!company.id && profile?.companyId) {\n getCompany(profile?.companyId);\n }\n }, [company?.id, profile?.companyId, getCompany]);\n\n return (\n <ChallengeScripts\n challenge={challenge}\n createScriptLine={createScriptLine}\n company={company}\n />\n );\n};\n\nexport default ChallengeScriptsContainer;\n","import React from 'react';\nimport styled from 'styled-components';\nimport ChallengeInfo from './ChallengeInfo';\nimport ChallengeScripts from './ChallengeScripts';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\nimport { ScriptLineSpeaker } from '../../../../constants/interfaces/ScriptLine';\n\nexport interface CustomBodyInterface {\n challenge: Challenge;\n createScriptLine: (speaker: ScriptLineSpeaker) => void;\n}\n\nconst CustomBodyContainerWrapper = styled.div`\n display: flex;\n min-height: calc(100vh - 75px);\n`;\n\nconst CustomBodyContainer = styled.div`\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n`;\n\nconst ChallengeBody = ({\n challenge,\n createScriptLine,\n}: CustomBodyInterface) => {\n return (\n <CustomBodyContainerWrapper>\n <CustomBodyContainer>\n <ChallengeInfo challenge={challenge} />\n <ChallengeScripts\n challenge={challenge}\n createScriptLine={createScriptLine}\n />\n </CustomBodyContainer>\n </CustomBodyContainerWrapper>\n );\n};\n\nexport default ChallengeBody;\n","import React, { FC, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { useLabelsState } from '../../../labels/store/states';\nimport { useModifyChallengeService } from '../../store/services';\nimport { EditModeContext } from '../../pages/EditChallenge';\nimport { EditModeValues } from '../../../../constants/enums/EditModeValues';\nimport { Challenge } from '../../../../constants/interfaces/Challenge';\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { LabelsAction } from '../../../../ui/components/table-wrapper/table/TableAssignOptions/actions/LabelsAction';\nimport { Input } from '../../../../ui/components/input';\n\nconst Container = styled.div`\n padding: 15px 0;\n display: flex;\n`;\n\nconst TextInputContainer = styled.div`\n flex: 1;\n`;\n\nconst LabelsContainer = styled.div`\n width: 128px;\n margin-left: 16px;\n`;\n\nconst TitleTextInput = styled(Input)`\n padding: 12px 16px;\n font-size: 13px;\n font-weight: normal;\n`;\n\nconst ActionPanel: FC<{ challenge: Challenge, titleError: boolean }> = ({ challenge, titleError }) => {\n const modifyChallenge = useModifyChallengeService();\n const edit = useContext(EditModeContext);\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState().data;\n const showMessage = useShowMessage();\n\n useEffect(() => {}, []);\n\n const handleSaveChallengeLabels = () => {\n modifyChallenge(labels.assignedLabels, 'updatedLabels');\n showMessage(`labels have been assigned to Challenge`, 'success');\n };\n\n return (\n <Container>\n <TextInputContainer>\n <TitleTextInput\n placeholder=\"Challenge Title\"\n height={'40px'}\n maxLength={100}\n handleChange={(event: any) =>\n modifyChallenge(event.target.value, 'title')\n }\n value={challenge.title}\n readOnly={edit.mode === EditModeValues.VIEW}\n error={titleError}\n dataTest='challenge-title'\n />\n </TextInputContainer>\n <LabelsContainer>\n <LabelsAction\n title={'Labels'}\n labels={labelsList}\n disabled={edit.mode === EditModeValues.VIEW}\n onAssignLabelsSubmit={handleSaveChallengeLabels}\n containerLeftPosition={'unset'}\n dataTest='challenge-labels'\n />\n </LabelsContainer>\n </Container>\n );\n};\n\nexport default ActionPanel;\n","import {\r\n createContext,\r\n FC,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport { ModalPageContainer } from '../../../ui/components/ModalPage';\r\nimport styled from 'styled-components';\r\nimport HeaderContainer from '../components/Header';\r\nimport {\r\n Challenge,\r\n ChallengeStatuses,\r\n Status,\r\n} from '../../../constants/interfaces/Challenge';\r\nimport { ModifyCase, useChallengeState } from '../store/states';\r\nimport {\r\n useCreatePlaylistService,\r\n useResetAudioService,\r\n} from '../../player/store/services';\r\nimport {\r\n useCreateChallengeScriptLineService,\r\n useGetChallengeService,\r\n useModifyChallengeService,\r\n useResetChallengeService,\r\n} from '../store/services';\r\nimport NavigationPrompt from 'react-router-navigation-prompt';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { validationService } from '../tools';\r\nimport { buildPageTitle } from '../../../helpers/functions/page-title-helpers';\r\nimport { EditModeValues } from '../../../constants/enums/EditModeValues';\r\nimport ChallengeBody from '../components/ChallengeBody';\r\nimport {\r\n ScriptLine,\r\n ScriptLineSpeaker,\r\n} from '../../../constants/interfaces/ScriptLine';\r\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\r\nimport { useLoadVoiceSettingsService } from '../../../pages/CompanySettings/store/services';\r\nimport ActionPanel from '../components/ActionPanel/ActionPanel';\r\nimport { useLabelsState } from '../../labels/store/states';\r\nimport {\r\n useSetAssignLabelsActionService,\r\n useSetPreviouslyAssignedLabelsAction,\r\n} from '../../labels/store/services';\r\nimport {\r\n calculateAssignedLabels,\r\n calculateRemovedLabels,\r\n useCalculatePreSelectedLabelsForSingleItem,\r\n} from '../../labels/tools';\r\nimport { isTeamLeader } from '../../../constants/enums';\r\nimport { usePortableLabelsState } from '../../portableLabels/store/states';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { UserProfile } from '../../../constants/interfaces/User';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport { useLoggedInUserPermissionsHelper } from '../../users/tools';\r\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\r\nimport {\r\n useGenerateCreateDuplicateChallengeActionList,\r\n useGenerateEditChallengeActionList,\r\n} from '../../library/services/LibraryBulkActionsService/helpers';\r\nimport { useCreateEditDuplicateLibraryBulActionService } from '../../library/services/LibraryBulkActionsService';\r\nimport {\r\n CreateNewChallengeInfo,\r\n EditChallengeInfo,\r\n} from '../../library/services/LibraryBulkActionsService/types';\r\nimport {\r\n useCreateEditChallengeFailedCallback,\r\n useCreateEditChallengeSuccessCallback,\r\n useHandleArchiveChallenge,\r\n} from '../services';\r\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\r\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\r\nimport { useGetRoleplayForScenario } from '../../../pages/ActionPages/NewScenario/store/services';\r\n\r\nconst uuid = require('uuid/v1');\r\nconst qs = require('query-string');\r\n\r\nexport const StyledContainer = styled.div`\r\n overflow: auto;\r\n height: 100%;\r\n display: block;\r\n padding: 0 32px;\r\n background: ${props => props.theme.Colors.white};\r\n border-top-left-radius: 8px;\r\n border-bottom-left-radius: 8px;\r\n`;\r\n\r\nconst StyledLoadingContainer = styled.div`\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst CreatedByWrapper = styled.div`\r\n padding: 0 16px 10px;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n font-size: 13px;\r\n`;\r\n\r\nexport const StatusItems: Array<{\r\n value: string;\r\n name: string;\r\n confirm: boolean;\r\n message: string;\r\n}> = [\r\n {\r\n value: 'DRAFT',\r\n name: 'Draft',\r\n message: 'Challenge saved as Draft',\r\n confirm: false,\r\n },\r\n {\r\n value: 'ACTIVE',\r\n name: 'Active',\r\n message: 'Challenge published',\r\n confirm: false,\r\n },\r\n {\r\n value: 'ARCHIVED',\r\n name: 'Archived',\r\n message: 'Challenge archived',\r\n confirm: true,\r\n },\r\n {\r\n value: 'DELETED',\r\n name: 'Deleted',\r\n message: 'Challenge deleted',\r\n confirm: true,\r\n },\r\n];\r\n\r\nexport const LoadingSaveContext = createContext(false);\r\nexport const ChallengeContainerContext = createContext<any>(null);\r\nexport const PlayAudioContext = createContext<any>(null);\r\nexport const EditModeContext = createContext<{\r\n mode: string;\r\n action: (mode: EditModeValues) => void;\r\n}>({\r\n mode: 'view',\r\n action: () => {},\r\n});\r\n\r\nconst EditChallenge: FC<{\r\n challenge: Challenge;\r\n modified: ModifyCase;\r\n loading?: boolean;\r\n history?: any;\r\n profile?: UserProfile;\r\n challengeId?: number | string;\r\n getChallenge: (challengeId: number | string) => void;\r\n handleCreateScriptLine: (\r\n data: Partial<ScriptLine>,\r\n silent?: boolean\r\n ) => any;\r\n handleResetChallenge: () => void;\r\n handleCreatePlaylist: (data: any) => void;\r\n handleResetPlaylist: () => void;\r\n handleLoadVoiceSettings: () => void;\r\n showMessage: (\r\n message: string | string[],\r\n status: 'error' | 'success'\r\n ) => void;\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n isNew: boolean;\r\n}> = ({\r\n closeGoingBack,\r\n closePath,\r\n isNew,\r\n loading,\r\n modified,\r\n getChallenge,\r\n challenge,\r\n challengeId,\r\n handleCreateScriptLine,\r\n handleResetChallenge,\r\n handleCreatePlaylist,\r\n handleResetPlaylist,\r\n handleLoadVoiceSettings,\r\n showMessage,\r\n history,\r\n profile,\r\n}) => {\r\n const [editMode, setEditMode] = useState<EditModeValues>(\r\n EditModeValues.VIEW\r\n );\r\n\r\n const createEditChallengeSuccessCallback =\r\n useCreateEditChallengeSuccessCallback();\r\n const createEditChallengeFailedCallback =\r\n useCreateEditChallengeFailedCallback();\r\n const handleArchiveChallenge = useHandleArchiveChallenge();\r\n useHtmlPageTitle(\r\n buildPageTitle('Challenge', editMode, isNew),\r\n [challenge.title]\r\n );\r\n const getRoleplayForScenario = useGetRoleplayForScenario();\r\n const location = history.location;\r\n\r\n const [loadingSave, setLoadingSave] = useState(false);\r\n const isTeamLead = isTeamLeader(profile?.role?.name);\r\n const parentRef = useRef(null);\r\n const [titleError, setTitleError] = useState(false);\r\n const isLoaded = !!challenge?.id;\r\n\r\n const roleplayId = qs.parse(location.search)?.roleplayId;\r\n const contentId = qs.parse(location.search)?.contentId;\r\n const modifyChallenge = useModifyChallengeService();\r\n\r\n const createScriptLine = useCallback(\r\n (speaker: ScriptLineSpeaker, silent?: boolean, text?: string) => {\r\n const sendValues = {\r\n id: `temp_${uuid()}`,\r\n text: text ?? '',\r\n speaker: speaker,\r\n position: challenge.script\r\n ? challenge.script.lines.length + 1\r\n : 1,\r\n allowedResponseTime:\r\n speaker === ScriptLineSpeaker.REP ? 45 : null,\r\n scriptId: challenge.scriptId,\r\n };\r\n\r\n handleCreateScriptLine(sendValues, silent);\r\n },\r\n [challenge.script, challenge.scriptId, handleCreateScriptLine]\r\n );\r\n\r\n useEffect(() => {\r\n if (roleplayId && contentId) {\r\n getRoleplayForScenario(roleplayId, contentId).then(({ aiLines, title, description }) => {\r\n aiLines.forEach(line => line.speaker === 'CUSTOMER' && createScriptLine(line.speaker, false, line.text));\r\n modifyChallenge(title || '', 'title');\r\n modifyChallenge(description || '', 'description');\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [roleplayId, contentId, getRoleplayForScenario])\r\n\r\n useEffect(() => {\r\n if (\r\n !history?.location?.state?.prevLocation?.pathname?.includes(\r\n '/submissions/challenges/'\r\n )\r\n ) {\r\n handleResetChallenge();\r\n handleResetPlaylist();\r\n\r\n if (!isNew && challengeId) {\r\n getChallenge(challengeId);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n getChallenge,\r\n challengeId,\r\n isNew,\r\n handleResetPlaylist,\r\n handleResetChallenge,\r\n ]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n handleResetPlaylist();\r\n };\r\n }, [handleResetPlaylist]);\r\n\r\n useEffect(() => {\r\n setEditMode(\r\n (isLoaded || isNew) && challenge.status === ChallengeStatuses.DRAFT && !isTeamLead\r\n ? EditModeValues.EDIT\r\n : EditModeValues.VIEW\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isLoaded, isNew, challenge.status, setEditMode]);\r\n\r\n const labels = useLabelsState();\r\n const labelsList = usePortableLabelsState().data;\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const setPreviouslyAssignedLabelsAction =\r\n useSetPreviouslyAssignedLabelsAction();\r\n const calculatePreSelectedLabels =\r\n useCalculatePreSelectedLabelsForSingleItem();\r\n const loggedInActionsHelper = useLoggedInUserPermissionsHelper();\r\n\r\n useEffect(() => {\r\n if (challenge.labels && challenge.labels.length > 0) {\r\n const selectedLabelIds = challenge.labels;\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList\r\n );\r\n setAssignLabelsAction(preAssignedLabels);\r\n } else {\r\n setAssignLabelsAction([]);\r\n }\r\n return () => {\r\n setAssignLabelsAction([]);\r\n };\r\n }, [\r\n challenge.labels,\r\n labelsList,\r\n calculatePreSelectedLabels,\r\n setAssignLabelsAction,\r\n ]);\r\n\r\n //initially set previousAssignedLabels\r\n useEffect(() => {\r\n if (!isEmpty(challenge.labels)) {\r\n const selectedLabelIds = challenge.labels ?? [];\r\n const preAssignedLabels = calculatePreSelectedLabels(\r\n selectedLabelIds,\r\n labelsList\r\n );\r\n setPreviouslyAssignedLabelsAction(preAssignedLabels);\r\n } else {\r\n setPreviouslyAssignedLabelsAction([]);\r\n }\r\n return () => {\r\n setPreviouslyAssignedLabelsAction([]);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [challenge.labels]);\r\n\r\n const generateCreateChallengeActionList =\r\n useGenerateCreateDuplicateChallengeActionList();\r\n\r\n const generateEditChallengeActionList =\r\n useGenerateEditChallengeActionList();\r\n\r\n const createLibraryBulkActionService =\r\n useCreateEditDuplicateLibraryBulActionService(\r\n isNew ? 'create' : 'update',\r\n 'Challenge',\r\n responses =>\r\n createEditChallengeSuccessCallback(setLoadingSave, responses),\r\n (error, completedResponses) =>\r\n createEditChallengeFailedCallback(\r\n setLoadingSave,\r\n error,\r\n completedResponses\r\n )\r\n );\r\n\r\n const handleUpdateChallenge = (\r\n callbacks: { onConfirm: () => void; onCancel: () => void } | null,\r\n status?: Status\r\n ) => {\r\n setLoadingSave(true);\r\n const response = validationService(\r\n challenge,\r\n status ? status : challenge.status\r\n );\r\n if (!response.valid) {\r\n callbacks && callbacks.onCancel();\r\n showMessage(response.message, 'error');\r\n setLoadingSave(false);\r\n\r\n setTitleError(response.name === 'name');\r\n return;\r\n } else {\r\n setTitleError(false);\r\n }\r\n\r\n const newChallengeInfo: CreateNewChallengeInfo = {\r\n title: challenge.title,\r\n description: challenge.description,\r\n sourceScenarioId: challenge.sourceScenarioId ?? 0,\r\n labelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n lines:\r\n challenge.script?.lines?.filter(line => line.text.length > 0) ??\r\n [],\r\n status: status ?? challenge.status,\r\n tryLimit: challenge.tryLimit,\r\n };\r\n\r\n const editChallengeInfo: EditChallengeInfo = {\r\n challengeId: challenge.id ?? 0,\r\n title: challenge.title,\r\n description: challenge.description,\r\n addedLabelIds: calculateAssignedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n deletedLabelIds: calculateRemovedLabels(\r\n labels.assignedLabels,\r\n labels.previouslyAssignedLabels ?? []\r\n ),\r\n lines:\r\n challenge.script?.lines?.filter(line => line.text.length > 0) ??\r\n [],\r\n status: status ?? challenge.status,\r\n tryLimit: challenge.tryLimit,\r\n };\r\n\r\n const createChallengeActionList =\r\n generateCreateChallengeActionList(newChallengeInfo);\r\n\r\n const editChallengeActionList =\r\n generateEditChallengeActionList(editChallengeInfo);\r\n\r\n if (status !== ChallengeStatuses.ARCHIVED) {\r\n if (!challenge.id) {\r\n createLibraryBulkActionService([createChallengeActionList]);\r\n } else {\r\n createLibraryBulkActionService(editChallengeActionList);\r\n }\r\n } else {\r\n challenge?.id && handleArchiveChallenge(challenge.id);\r\n }\r\n };\r\n\r\n \r\n\r\n const playAllAudio = () => {\r\n handleResetPlaylist();\r\n const filterItems = challenge.script.lines.filter(\r\n (script: ScriptLine) => script.audioUrl\r\n );\r\n const playlistItems = filterItems\r\n .filter(script => script.speaker === ScriptLineSpeaker.CUSTOMER)\r\n .map((script: ScriptLine) => script.id);\r\n setTimeout(() => {\r\n handleCreatePlaylist(playlistItems);\r\n }, 150);\r\n };\r\n\r\n useEffect(() => {\r\n if (\r\n loggedInActionsHelper.hasActionPermission(\r\n NEW_PERMISSIONS.VIEW_TTS_SETTINGS\r\n )\r\n ) {\r\n handleLoadVoiceSettings();\r\n }\r\n }, [handleLoadVoiceSettings, loggedInActionsHelper]);\r\n\r\n useEffect(() => {\r\n if (isNew && challenge.script.lines.length < 1 && !roleplayId) {\r\n createScriptLine(ScriptLineSpeaker.CUSTOMER, true);\r\n }\r\n }, [challenge.script.lines.length, createScriptLine, isNew, roleplayId]);\r\n\r\n\r\n if (!isNew && loading) {\r\n return (\r\n <ModalPageContainer\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n >\r\n <StyledLoadingContainer>\r\n <Loading />\r\n </StyledLoadingContainer>\r\n </ModalPageContainer>\r\n );\r\n }\r\n\r\n return (\r\n <ModalPageContainer\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n >\r\n <StyledContainer ref={parentRef}>\r\n <EditModeContext.Provider\r\n value={{ mode: editMode, action: setEditMode }}\r\n >\r\n <LoadingSaveContext.Provider value={loadingSave}>\r\n <HeaderContainer\r\n challenge={challenge}\r\n handleUpdateChallenge={handleUpdateChallenge}\r\n modified={modified === 'modified'}\r\n isViewMode={isTeamLead}\r\n />\r\n <ActionPanel\r\n challenge={challenge}\r\n titleError={titleError}\r\n />\r\n {challenge.creator && (\r\n <CreatedByWrapper data-test=\"challenge-creator-text\">\r\n Created by {challenge.creator?.firstName}{' '}\r\n {challenge.creator?.lastName}\r\n </CreatedByWrapper>\r\n )}\r\n <TableDivider />\r\n <ChallengeContainerContext.Provider value={parentRef}>\r\n <PlayAudioContext.Provider value={playAllAudio}>\r\n <ChallengeBody\r\n challenge={challenge}\r\n createScriptLine={createScriptLine}\r\n />\r\n </PlayAudioContext.Provider>\r\n </ChallengeContainerContext.Provider>\r\n </LoadingSaveContext.Provider>\r\n </EditModeContext.Provider>\r\n <NavigationPrompt when={modified === 'modified'}>\r\n {({ onConfirm, onCancel }) => (\r\n <DialogWrapper\r\n modalTitle={'Discard changes?'}\r\n description={\r\n 'Do you want to save or discard changes?'\r\n }\r\n cancelButtonText={'Discard'}\r\n confirmButtonText={'Save'}\r\n onCancel={onConfirm}\r\n onConfirm={() => {\r\n handleUpdateChallenge({ onConfirm, onCancel });\r\n }}\r\n dataTest=\"confirmation-modal\"\r\n />\r\n )}\r\n </NavigationPrompt>\r\n </StyledContainer>\r\n </ModalPageContainer>\r\n );\r\n};\r\n\r\nexport const EditChallengeContainer: FC<{\r\n closePath: string;\r\n closeGoingBack: boolean;\r\n}> = ({ closePath, closeGoingBack }) => {\r\n const challenge = useChallengeState().data;\r\n const modified = useChallengeState().case;\r\n const loading = useChallengeState().loading;\r\n const history = useHistory();\r\n const profile = useSelector(getProfileState);\r\n\r\n const params: { challengeId?: string | number } = useParams();\r\n\r\n const getChallenge = useGetChallengeService();\r\n const resetChallenge = useResetChallengeService();\r\n const createScriptLine = useCreateChallengeScriptLineService();\r\n\r\n const createPlaylist = useCreatePlaylistService();\r\n const resetPlaylist = useResetAudioService();\r\n const showMessage = useShowMessage();\r\n\r\n const loadVoiceSettings = useLoadVoiceSettingsService();\r\n const handleLoadVoiceSettings = useCallback(\r\n () => profile?.companyId && loadVoiceSettings(profile?.companyId),\r\n [loadVoiceSettings, profile?.companyId]\r\n );\r\n\r\n return (\r\n <EditChallenge\r\n challenge={challenge}\r\n challengeId={params.challengeId}\r\n modified={modified}\r\n loading={loading}\r\n isNew={params.challengeId === 'new'}\r\n closeGoingBack={closeGoingBack}\r\n closePath={closePath}\r\n history={history}\r\n profile={profile}\r\n getChallenge={getChallenge}\r\n handleCreateScriptLine={createScriptLine}\r\n handleResetChallenge={resetChallenge}\r\n handleCreatePlaylist={createPlaylist}\r\n handleResetPlaylist={resetPlaylist}\r\n handleLoadVoiceSettings={handleLoadVoiceSettings}\r\n showMessage={showMessage}\r\n />\r\n );\r\n};\r\n\r\nexport default EditChallengeContainer;","function enableNewRelic({\n licenseKey,\n applicationID,\n}: {\n licenseKey: string;\n applicationID: string;\n}) {\n const beacon = 'bam.nr-data.net';\n const errorBeacon = 'bam.nr-data.net';\n const agent = 'js-agent.newrelic.com/nr-spa-1167.min.js';\n\n return `\n window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o||e)},o,o.exports)}return e[n].exports}if(\"function\"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e,n){function r(t){try{s.console&&console.log(t)}catch(e){}}var o,i=t(\"ee\"),a=t(25),s={};try{o=localStorage.getItem(\"__nr_flags\").split(\",\"),console&&\"function\"==typeof console.log&&(s.console=!0,o.indexOf(\"dev\")!==-1&&(s.dev=!0),o.indexOf(\"nr_dev\")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on(\"internal-error\",function(t){r(t.stack)}),s.dev&&i.on(\"fn-err\",function(t,e,n){r(n.stack)}),s.dev&&(r(\"NR AGENT IN DEVELOPMENT MODE\"),r(\"flags: \"+a(s,function(t,e){return t}).join(\", \")))},{}],2:[function(t,e,n){function r(t,e,n,r,s){try{l?l-=1:o(s||new UncaughtException(t,e,n),!0)}catch(f){try{i(\"ierr\",[f,c.now(),!0])}catch(d){}}return\"function\"==typeof u&&u.apply(this,a(arguments))}function UncaughtException(t,e,n){this.message=t||\"Uncaught error with no additional information\",this.sourceURL=e,this.line=n}function o(t,e){var n=e?null:c.now();i(\"err\",[t,n])}var i=t(\"handle\"),a=t(26),s=t(\"ee\"),c=t(\"loader\"),f=t(\"gos\"),u=window.onerror,d=!1,p=\"nr@seenError\",l=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(h){\"stack\"in h&&(t(13),t(12),\"addEventListener\"in window&&t(6),c.xhrWrappable&&t(14),d=!0)}s.on(\"fn-start\",function(t,e,n){d&&(l+=1)}),s.on(\"fn-err\",function(t,e,n){d&&!n[p]&&(f(n,p,function(){return!0}),this.thrown=!0,o(n))}),s.on(\"fn-end\",function(){d&&!this.thrown&&l>0&&(l-=1)}),s.on(\"internal-error\",function(t){i(\"ierr\",[t,c.now(),!0])})},{}],3:[function(t,e,n){t(\"loader\").features.ins=!0},{}],4:[function(t,e,n){function r(){L++,C=g.hash,this[u]=y.now()}function o(){L--,g.hash!==C&&i(0,!0);var t=y.now();this[h]=~~this[h]+t-this[u],this[d]=t}function i(t,e){E.emit(\"newURL\",[\"\"+g,e])}function a(t,e){t.on(e,function(){this[e]=y.now()})}var s=\"-start\",c=\"-end\",f=\"-body\",u=\"fn\"+s,d=\"fn\"+c,p=\"cb\"+s,l=\"cb\"+c,h=\"jsTime\",m=\"fetch\",v=\"addEventListener\",w=window,g=w.location,y=t(\"loader\");if(w[v]&&y.xhrWrappable){var x=t(10),b=t(11),E=t(8),O=t(6),R=t(13),P=t(7),T=t(14),N=t(9),M=t(\"ee\"),S=M.get(\"tracer\");t(16),y.features.spa=!0;var C,L=0;M.on(u,r),M.on(p,r),M.on(d,o),M.on(l,o),M.buffer([u,d,\"xhr-done\",\"xhr-resolved\"]),O.buffer([u]),R.buffer([\"setTimeout\"+c,\"clearTimeout\"+s,u]),T.buffer([u,\"new-xhr\",\"send-xhr\"+s]),P.buffer([m+s,m+\"-done\",m+f+s,m+f+c]),E.buffer([\"newURL\"]),x.buffer([u]),b.buffer([\"propagate\",p,l,\"executor-err\",\"resolve\"+s]),S.buffer([u,\"no-\"+u]),N.buffer([\"new-jsonp\",\"cb-start\",\"jsonp-error\",\"jsonp-end\"]),a(T,\"send-xhr\"+s),a(M,\"xhr-resolved\"),a(M,\"xhr-done\"),a(P,m+s),a(P,m+\"-done\"),a(N,\"new-jsonp\"),a(N,\"jsonp-end\"),a(N,\"cb-start\"),E.on(\"pushState-end\",i),E.on(\"replaceState-end\",i),w[v](\"hashchange\",i,!0),w[v](\"load\",i,!0),w[v](\"popstate\",function(){i(0,L>1)},!0)}},{}],5:[function(t,e,n){function r(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var o=t(\"ee\"),i=t(\"handle\"),a=t(13),s=t(12),c=\"learResourceTimings\",f=\"addEventListener\",u=\"resourcetimingbufferfull\",d=\"bstResource\",p=\"resource\",l=\"-start\",h=\"-end\",m=\"fn\"+l,v=\"fn\"+h,w=\"bstTimer\",g=\"pushState\",y=t(\"loader\");y.features.stn=!0,t(8),\"addEventListener\"in window&&t(6);var x=NREUM.o.EV;o.on(m,function(t,e){var n=t[0];n instanceof x&&(this.bstStart=y.now())}),o.on(v,function(t,e){var n=t[0];n instanceof x&&i(\"bst\",[n,e,this.bstStart,y.now()])}),a.on(m,function(t,e,n){this.bstStart=y.now(),this.bstType=n}),a.on(v,function(t,e){i(w,[e,this.bstStart,y.now(),this.bstType])}),s.on(m,function(){this.bstStart=y.now()}),s.on(v,function(t,e){i(w,[e,this.bstStart,y.now(),\"requestAnimationFrame\"])}),o.on(g+l,function(t){this.time=y.now(),this.startPath=location.pathname+location.hash}),o.on(g+h,function(t){i(\"bstHist\",[location.pathname+location.hash,this.startPath,this.time])}),f in window.performance&&(window.performance[\"c\"+c]?window.performance[f](u,function(t){i(d,[window.performance.getEntriesByType(p)]),window.performance[\"c\"+c]()},!1):window.performance[f](\"webkit\"+u,function(t){i(d,[window.performance.getEntriesByType(p)]),window.performance[\"webkitC\"+c]()},!1)),document[f](\"scroll\",r,{passive:!0}),document[f](\"keypress\",r,!1),document[f](\"click\",r,!1)}},{}],6:[function(t,e,n){function r(t){for(var e=t;e&&!e.hasOwnProperty(u);)e=Object.getPrototypeOf(e);e&&o(e)}function o(t){s.inPlace(t,[u,d],\"-\",i)}function i(t,e){return t[1]}var a=t(\"ee\").get(\"events\"),s=t(\"wrap-function\")(a,!0),c=t(\"gos\"),f=XMLHttpRequest,u=\"addEventListener\",d=\"removeEventListener\";e.exports=a,\"getPrototypeOf\"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+\"-start\",function(t,e){var n=t[1],r=c(n,\"nr@wrapped\",function(){function t(){if(\"function\"==typeof n.handleEvent)return n.handleEvent.apply(n,arguments)}var e={object:t,\"function\":n}[typeof n];return e?s(e,\"fn-\",null,e.name||\"anonymous\"):n});this.wrapped=t[1]=r}),a.on(d+\"-start\",function(t){t[1]=this.wrapped||t[1]})},{}],7:[function(t,e,n){function r(t,e,n){var r=t[e];\"function\"==typeof r&&(t[e]=function(){var t=i(arguments),e={};o.emit(n+\"before-start\",[t],e);var a;e[m]&&e[m].dt&&(a=e[m].dt);var s=r.apply(this,t);return o.emit(n+\"start\",[t,a],s),s.then(function(t){return o.emit(n+\"end\",[null,t],s),t},function(t){throw o.emit(n+\"end\",[t],s),t})})}var o=t(\"ee\").get(\"fetch\"),i=t(26),a=t(25);e.exports=o;var s=window,c=\"fetch-\",f=c+\"body-\",u=[\"arrayBuffer\",\"blob\",\"json\",\"text\",\"formData\"],d=s.Request,p=s.Response,l=s.fetch,h=\"prototype\",m=\"nr@context\";d&&p&&l&&(a(u,function(t,e){r(d[h],e,f),r(p[h],e,f)}),r(s,\"fetch\",c),o.on(c+\"end\",function(t,e){var n=this;if(e){var r=e.headers.get(\"content-length\");null!==r&&(n.rxSize=r),o.emit(c+\"done\",[null,e],n)}else o.emit(c+\"done\",[t],n)}))},{}],8:[function(t,e,n){var r=t(\"ee\").get(\"history\"),o=t(\"wrap-function\")(r);e.exports=r;var i=window.history&&window.history.constructor&&window.history.constructor.prototype,a=window.history;i&&i.pushState&&i.replaceState&&(a=i),o.inPlace(a,[\"pushState\",\"replaceState\"],\"-\")},{}],9:[function(t,e,n){function r(t){function e(){c.emit(\"jsonp-end\",[],p),t.removeEventListener(\"load\",e,!1),t.removeEventListener(\"error\",n,!1)}function n(){c.emit(\"jsonp-error\",[],p),c.emit(\"jsonp-end\",[],p),t.removeEventListener(\"load\",e,!1),t.removeEventListener(\"error\",n,!1)}var r=t&&\"string\"==typeof t.nodeName&&\"script\"===t.nodeName.toLowerCase();if(r){var o=\"function\"==typeof t.addEventListener;if(o){var a=i(t.src);if(a){var u=s(a),d=\"function\"==typeof u.parent[u.key];if(d){var p={};f.inPlace(u.parent,[u.key],\"cb-\",p),t.addEventListener(\"load\",e,!1),t.addEventListener(\"error\",n,!1),c.emit(\"new-jsonp\",[t.src],p)}}}}}function o(){return\"addEventListener\"in window}function i(t){var e=t.match(u);return e?e[1]:null}function a(t,e){var n=t.match(p),r=n[1],o=n[3];return o?a(o,e[r]):e[r]}function s(t){var e=t.match(d);return e&&e.length>=3?{key:e[2],parent:a(e[1],window)}:{key:t,parent:window}}var c=t(\"ee\").get(\"jsonp\"),f=t(\"wrap-function\")(c);if(e.exports=c,o()){var u=/[?&](?:callback|cb)=([^&#]+)/,d=/(.*)\\\\.([^.]+)/,p=/^(\\\\w+)(\\\\.|$)(.*)$/,l=[\"appendChild\",\"insertBefore\",\"replaceChild\"];Node&&Node.prototype&&Node.prototype.appendChild?f.inPlace(Node.prototype,l,\"dom-\"):(f.inPlace(HTMLElement.prototype,l,\"dom-\"),f.inPlace(HTMLHeadElement.prototype,l,\"dom-\"),f.inPlace(HTMLBodyElement.prototype,l,\"dom-\")),c.on(\"dom-start\",function(t){r(t[0])})}},{}],10:[function(t,e,n){var r=t(\"ee\").get(\"mutation\"),o=t(\"wrap-function\")(r),i=NREUM.o.MO;e.exports=r,i&&(window.MutationObserver=function(t){return this instanceof i?new i(o(t,\"fn-\")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype)},{}],11:[function(t,e,n){function r(t){var e=a.context(),n=s(t,\"executor-\",e),r=new f(n);return a.context(r).getCtx=function(){return e},a.emit(\"new-promise\",[r,e],e),r}function o(t,e){return e}var i=t(\"wrap-function\"),a=t(\"ee\").get(\"promise\"),s=i(a),c=t(25),f=NREUM.o.PR;e.exports=a,f&&(window.Promise=r,[\"all\",\"race\"].forEach(function(t){var e=f[t];f[t]=function(n){function r(t){return function(){a.emit(\"propagate\",[null,!o],i),o=o||!t}}var o=!1;c(n,function(e,n){Promise.resolve(n).then(r(\"all\"===t),r(!1))});var i=e.apply(f,arguments),s=f.resolve(i);return s}}),[\"resolve\",\"reject\"].forEach(function(t){var e=f[t];f[t]=function(t){var n=e.apply(f,arguments);return t!==n&&a.emit(\"propagate\",[t,!0],n),n}}),f.prototype[\"catch\"]=function(t){return this.then(null,t)},f.prototype=Object.create(f.prototype,{constructor:{value:r}}),c(Object.getOwnPropertyNames(f),function(t,e){try{r[e]=f[e]}catch(n){}}),a.on(\"executor-start\",function(t){t[0]=s(t[0],\"resolve-\",this),t[1]=s(t[1],\"resolve-\",this)}),a.on(\"executor-err\",function(t,e,n){t[1](n)}),s.inPlace(f.prototype,[\"then\"],\"then-\",o),a.on(\"then-start\",function(t,e){this.promise=e,t[0]=s(t[0],\"cb-\",this),t[1]=s(t[1],\"cb-\",this)}),a.on(\"then-end\",function(t,e,n){this.nextPromise=n;var r=this.promise;a.emit(\"propagate\",[r,!0],n)}),a.on(\"cb-end\",function(t,e,n){a.emit(\"propagate\",[n,!0],this.nextPromise)}),a.on(\"propagate\",function(t,e,n){this.getCtx&&!e||(this.getCtx=function(){if(t instanceof Promise)var e=a.context(t);return e&&e.getCtx?e.getCtx():this})}),r.toString=function(){return\"\"+f})},{}],12:[function(t,e,n){var r=t(\"ee\").get(\"raf\"),o=t(\"wrap-function\")(r),i=\"equestAnimationFrame\";e.exports=r,o.inPlace(window,[\"r\"+i,\"mozR\"+i,\"webkitR\"+i,\"msR\"+i],\"raf-\"),r.on(\"raf-start\",function(t){t[0]=o(t[0],\"fn-\")})},{}],13:[function(t,e,n){function r(t,e,n){t[0]=a(t[0],\"fn-\",null,n)}function o(t,e,n){this.method=n,this.timerDuration=isNaN(t[1])?0:+t[1],t[0]=a(t[0],\"fn-\",this,n)}var i=t(\"ee\").get(\"timer\"),a=t(\"wrap-function\")(i),s=\"setTimeout\",c=\"setInterval\",f=\"clearTimeout\",u=\"-start\",d=\"-\";e.exports=i,a.inPlace(window,[s,\"setImmediate\"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,\"clearImmediate\"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],14:[function(t,e,n){function r(t,e){d.inPlace(e,[\"onreadystatechange\"],\"fn-\",s)}function o(){var t=this,e=u.context(t);t.readyState>3&&!e.resolved&&(e.resolved=!0,u.emit(\"xhr-resolved\",[],t)),d.inPlace(t,g,\"fn-\",s)}function i(t){y.push(t),h&&(b?b.then(a):v?v(a):(E=-E,O.data=E))}function a(){for(var t=0;t<y.length;t++)r([],y[t]);y.length&&(y=[])}function s(t,e){return e}function c(t,e){for(var n in t)e[n]=t[n];return e}t(6);var f=t(\"ee\"),u=f.get(\"xhr\"),d=t(\"wrap-function\")(u),p=NREUM.o,l=p.XHR,h=p.MO,m=p.PR,v=p.SI,w=\"readystatechange\",g=[\"onload\",\"onerror\",\"onabort\",\"onloadstart\",\"onloadend\",\"onprogress\",\"ontimeout\"],y=[];e.exports=u;var x=window.XMLHttpRequest=function(t){var e=new l(t);try{u.emit(\"new-xhr\",[e],e),e.addEventListener(w,o,!1)}catch(n){try{u.emit(\"internal-error\",[n])}catch(r){}}return e};if(c(l,x),x.prototype=l.prototype,d.inPlace(x.prototype,[\"open\",\"send\"],\"-xhr-\",s),u.on(\"send-xhr-start\",function(t,e){r(t,e),i(e)}),u.on(\"open-xhr-start\",r),h){var b=m&&m.resolve();if(!v&&!m){var E=1,O=document.createTextNode(E);new h(a).observe(O,{characterData:!0})}}else f.on(\"fn-end\",function(t){t[0]&&t[0].type===w||a()})},{}],15:[function(t,e,n){function r(t){if(!i(t))return null;var e=window.NREUM;if(!e.loader_config)return null;var n=(e.loader_config.accountID||\"\").toString()||null,r=(e.loader_config.agentID||\"\").toString()||null,s=(e.loader_config.trustKey||\"\").toString()||null;if(!n||!r)return null;var c=a.generateCatId(),f=a.generateCatId(),u=Date.now(),d=o(c,f,u,n,r,s);return{header:d,guid:c,traceId:f,timestamp:u}}function o(t,e,n,r,o,i){var a=\"btoa\"in window&&\"function\"==typeof window.btoa;if(!a)return null;var s={v:[0,1],d:{ty:\"Browser\",ac:r,ap:o,id:t,tr:e,ti:n}};return i&&r!==i&&(s.d.tk=i),btoa(JSON.stringify(s))}function i(t){var e=!1,n=!1,r={};if(\"init\"in NREUM&&\"distributed_tracing\"in NREUM.init&&(r=NREUM.init.distributed_tracing,n=!!r.enabled),n)if(t.sameOrigin)e=!0;else if(r.allowed_origins instanceof Array)for(var o=0;o<r.allowed_origins.length;o++){var i=s(r.allowed_origins[o]);if(t.hostname===i.hostname&&t.protocol===i.protocol&&t.port===i.port){e=!0;break}}return n&&e}var a=t(23),s=t(17);e.exports={generateTracePayload:r,shouldGenerateTrace:i}},{}],16:[function(t,e,n){function r(t){var e=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<p;r++)t.removeEventListener(d[r],this.listener,!1);e.aborted||(n.duration=a.now()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==e.status&&(e.status=0):i(this,t),n.cbTime=this.cbTime,u.emit(\"xhr-done\",[t],t),s(\"xhr\",[e,n,this.startTime]))}}function o(t,e){var n=c(e),r=t.params;r.host=n.hostname+\":\"+n.port,r.pathname=n.pathname,t.parsedOrigin=c(e),t.sameOrigin=t.parsedOrigin.sameOrigin}function i(t,e){t.params.status=e.status;var n=v(e,t.lastSize);if(n&&(t.metrics.rxSize=n),t.sameOrigin){var r=e.getResponseHeader(\"X-NewRelic-App-Data\");r&&(t.params.cat=r.split(\", \").pop())}t.loadCaptureCalled=!0}var a=t(\"loader\");if(a.xhrWrappable){var s=t(\"handle\"),c=t(17),f=t(15).generateTracePayload,u=t(\"ee\"),d=[\"load\",\"error\",\"abort\",\"timeout\"],p=d.length,l=t(\"id\"),h=t(21),m=t(20),v=t(18),w=window.XMLHttpRequest;a.features.xhr=!0,t(14),t(7),u.on(\"new-xhr\",function(t){var e=this;e.totalCbs=0,e.called=0,e.cbTime=0,e.end=r,e.ended=!1,e.xhrGuids={},e.lastSize=null,e.loadCaptureCalled=!1,t.addEventListener(\"load\",function(n){i(e,t)},!1),h&&(h>34||h<10)||window.opera||t.addEventListener(\"progress\",function(t){e.lastSize=t.loaded},!1)}),u.on(\"open-xhr-start\",function(t){this.params={method:t[0]},o(this,t[1]),this.metrics={}}),u.on(\"open-xhr-end\",function(t,e){\"loader_config\"in NREUM&&\"xpid\"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader(\"X-NewRelic-ID\",NREUM.loader_config.xpid);var n=f(this.parsedOrigin);n&&n.header&&(e.setRequestHeader(\"newrelic\",n.header),this.dt=n)}),u.on(\"send-xhr-start\",function(t,e){var n=this.metrics,r=t[0],o=this;if(n&&r){var i=m(r);i&&(n.txSize=i)}this.startTime=a.now(),this.listener=function(t){try{\"abort\"!==t.type||o.loadCaptureCalled||(o.params.aborted=!0),(\"load\"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||\"function\"!=typeof e.onload))&&o.end(e)}catch(n){try{u.emit(\"internal-error\",[n])}catch(r){}}};for(var s=0;s<p;s++)e.addEventListener(d[s],this.listener,!1)}),u.on(\"xhr-cb-time\",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&\"function\"==typeof n.onload||this.end(n)}),u.on(\"xhr-load-added\",function(t,e){var n=\"\"+l(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),u.on(\"xhr-load-removed\",function(t,e){var n=\"\"+l(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),u.on(\"addEventListener-end\",function(t,e){e instanceof w&&\"load\"===t[0]&&u.emit(\"xhr-load-added\",[t[1],t[2]],e)}),u.on(\"removeEventListener-end\",function(t,e){e instanceof w&&\"load\"===t[0]&&u.emit(\"xhr-load-removed\",[t[1],t[2]],e)}),u.on(\"fn-start\",function(t,e,n){e instanceof w&&(\"onload\"===n&&(this.onload=!0),(\"load\"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=a.now()))}),u.on(\"fn-end\",function(t,e){this.xhrCbStart&&u.emit(\"xhr-cb-time\",[a.now()-this.xhrCbStart,this.onload,e],e)}),u.on(\"fetch-before-start\",function(t){var e,n=t[1]||{};\"string\"==typeof t[0]?e=t[0]:t[0]&&t[0].url&&(e=t[0].url),e&&(this.parsedOrigin=c(e),this.sameOrigin=this.parsedOrigin.sameOrigin);var r=f(this.parsedOrigin);if(r&&r.header){var o=r.header;if(\"string\"==typeof t[0]){var i={};for(var a in n)i[a]=n[a];i.headers=new Headers(n.headers||{}),i.headers.set(\"newrelic\",o),this.dt=r,t.length>1?t[1]=i:t.push(i)}else t[0]&&t[0].headers&&(t[0].headers.append(\"newrelic\",o),this.dt=r)}})}},{}],17:[function(t,e,n){var r={};e.exports=function(t){if(t in r)return r[t];var e=document.createElement(\"a\"),n=window.location,o={};e.href=t,o.port=e.port;var i=e.href.split(\"://\");!o.port&&i[1]&&(o.port=i[1].split(\"/\")[0].split(\"@\").pop().split(\":\")[1]),o.port&&\"0\"!==o.port||(o.port=\"https\"===i[0]?\"443\":\"80\"),o.hostname=e.hostname||n.hostname,o.pathname=e.pathname,o.protocol=i[0],\"/\"!==o.pathname.charAt(0)&&(o.pathname=\"/\"+o.pathname);var a=!e.protocol||\":\"===e.protocol||e.protocol===n.protocol,s=e.hostname===document.domain&&e.port===n.port;return o.sameOrigin=a&&(!e.hostname||s),\"/\"===o.pathname&&(r[t]=o),o}},{}],18:[function(t,e,n){function r(t,e){var n=t.responseType;return\"json\"===n&&null!==e?e:\"arraybuffer\"===n||\"blob\"===n||\"json\"===n?o(t.response):\"text\"===n||\"document\"===n||\"\"===n||void 0===n?o(t.responseText):void 0}var o=t(20);e.exports=r},{}],19:[function(t,e,n){function r(){}function o(t,e,n){return function(){return i(t,[f.now()].concat(s(arguments)),e?null:this,n),e?void 0:this}}var i=t(\"handle\"),a=t(25),s=t(26),c=t(\"ee\").get(\"tracer\"),f=t(\"loader\"),u=NREUM;\"undefined\"==typeof window.newrelic&&(newrelic=u);var d=[\"setPageViewName\",\"setCustomAttribute\",\"setErrorHandler\",\"finished\",\"addToTrace\",\"inlineHit\",\"addRelease\"],p=\"api-\",l=p+\"ixn-\";a(d,function(t,e){u[e]=o(p+e,!0,\"api\")}),u.addPageAction=o(p+\"addPageAction\",!0),u.setCurrentRouteName=o(p+\"routeName\",!0),e.exports=newrelic,u.interaction=function(){return(new r).get()};var h=r.prototype={createTracer:function(t,e){var n={},r=this,o=\"function\"==typeof e;return i(l+\"tracer\",[f.now(),t,n],r),function(){if(c.emit((o?\"\":\"no-\")+\"fn-start\",[f.now(),r,o],n),o)try{return e.apply(this,arguments)}catch(t){throw c.emit(\"fn-err\",[arguments,this,t],n),t}finally{c.emit(\"fn-end\",[f.now()],n)}}}};a(\"actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get\".split(\",\"),function(t,e){h[e]=o(l+e)}),newrelic.noticeError=function(t,e){\"string\"==typeof t&&(t=new Error(t)),i(\"err\",[t,f.now(),!1,e])}},{}],20:[function(t,e,n){e.exports=function(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"==typeof t){if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!(\"undefined\"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(e){return}}}},{}],21:[function(t,e,n){var r=0,o=navigator.userAgent.match(/Firefox[\\\\/\\\\s](\\\\d+\\\\.\\\\d+)/);o&&(r=+o[1]),e.exports=r},{}],22:[function(t,e,n){function r(t,e){var n=t.getEntries();n.forEach(function(t){\"first-paint\"===t.name?c(\"timing\",[\"fp\",Math.floor(t.startTime)]):\"first-contentful-paint\"===t.name&&c(\"timing\",[\"fcp\",Math.floor(t.startTime)])})}function o(t,e){var n=t.getEntries();n.length>0&&c(\"lcp\",[n[n.length-1]])}function i(t){if(t instanceof u&&!p){var e,n=Math.round(t.timeStamp);e=n>1e12?Date.now()-n:f.now()-n,p=!0,c(\"timing\",[\"fi\",n,{type:t.type,fid:e}])}}if(!(\"init\"in NREUM&&\"page_view_timing\"in NREUM.init&&\"enabled\"in NREUM.init.page_view_timing&&NREUM.init.page_view_timing.enabled===!1)){var a,s,c=t(\"handle\"),f=t(\"loader\"),u=NREUM.o.EV;if(\"PerformanceObserver\"in window&&\"function\"==typeof window.PerformanceObserver){a=new PerformanceObserver(r),s=new PerformanceObserver(o);try{a.observe({entryTypes:[\"paint\"]}),s.observe({entryTypes:[\"largest-contentful-paint\"]})}catch(d){}}if(\"addEventListener\"in document){var p=!1,l=[\"click\",\"keydown\",\"mousedown\",\"pointerdown\",\"touchstart\"];l.forEach(function(t){document.addEventListener(t,i,!1)})}}},{}],23:[function(t,e,n){function r(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(e=r.getRandomValues(new Uint8Array(31)));for(var o,i=\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\",a=\"\",s=0;s<i.length;s++)o=i[s],\"x\"===o?a+=t().toString(16):\"y\"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}function o(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&Uint8Array&&(e=r.getRandomValues(new Uint8Array(31)));for(var o=[],i=0;i<16;i++)o.push(t().toString(16));return o.join(\"\")}e.exports={generateUuid:r,generateCatId:o}},{}],24:[function(t,e,n){function r(t,e){if(!o)return!1;if(t!==o)return!1;if(!e)return!0;if(!i)return!1;for(var n=i.split(\".\"),r=e.split(\".\"),a=0;a<r.length;a++)if(r[a]!==n[a])return!1;return!0}var o=null,i=null,a=/Version\\\\/(\\\\S+)\\\\s+Safari/;if(navigator.userAgent){var s=navigator.userAgent,c=s.match(a);c&&s.indexOf(\"Chrome\")===-1&&s.indexOf(\"Chromium\")===-1&&(o=\"Safari\",i=c[1])}e.exports={agent:o,version:i,match:r}},{}],25:[function(t,e,n){function r(t,e){var n=[],r=\"\",i=0;for(r in t)o.call(t,r)&&(n[i]=e(r,t[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],26:[function(t,e,n){function r(t,e,n){e||(e=0),\"undefined\"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(o<0?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=r},{}],27:[function(t,e,n){e.exports={exists:\"undefined\"!=typeof window.performance&&window.performance.timing&&\"undefined\"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(t,e,n){function r(){}function o(t){function e(t){return t&&t instanceof r?t:t?c(t,s,i):i()}function n(n,r,o,i){if(!p.aborted||i){t&&t(n,r,o);for(var a=e(o),s=m(n),c=s.length,f=0;f<c;f++)s[f].apply(a,r);var d=u[y[n]];return d&&d.push([x,n,r,a]),a}}function l(t,e){g[t]=m(t).concat(e)}function h(t,e){var n=g[t];if(n)for(var r=0;r<n.length;r++)n[r]===e&&n.splice(r,1)}function m(t){return g[t]||[]}function v(t){return d[t]=d[t]||o(n)}function w(t,e){f(t,function(t,n){e=e||\"feature\",y[n]=e,e in u||(u[e]=[])})}var g={},y={},x={on:l,addEventListener:l,removeEventListener:h,emit:n,get:v,listeners:m,context:e,buffer:w,abort:a,aborted:!1};return x}function i(){return new r}function a(){(u.api||u.feature)&&(p.aborted=!0,u=p.backlog={})}var s=\"nr@context\",c=t(\"gos\"),f=t(25),u={},d={},p=e.exports=o();p.backlog=u},{}],gos:[function(t,e,n){function r(t,e,n){if(o.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[e]=r,r}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){o.buffer([t],r),o.emit(t,e,n)}var o=t(\"ee\").get(\"handle\");e.exports=r,r.ee=o},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||\"object\"!==e&&\"function\"!==e?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i=\"nr@id\",a=t(\"gos\");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!E++){var t=b.info=NREUM.info,e=l.getElementsByTagName(\"script\")[0];if(setTimeout(u.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&e))return u.abort();f(y,function(e,n){t[e]||(t[e]=n)}),c(\"mark\",[\"onload\",a()+b.offset],null,\"api\");var n=l.createElement(\"script\");n.src=\"https://\"+t.agent,e.parentNode.insertBefore(n,e)}}function o(){\"complete\"===l.readyState&&i()}function i(){c(\"mark\",[\"domContent\",a()+b.offset],null,\"api\")}function a(){return O.exists&&performance.now?Math.round(performance.now()):(s=Math.max((new Date).getTime(),s))-b.offset}var s=(new Date).getTime(),c=t(\"handle\"),f=t(25),u=t(\"ee\"),d=t(24),p=window,l=p.document,h=\"addEventListener\",m=\"attachEvent\",v=p.XMLHttpRequest,w=v&&v.prototype;NREUM.o={ST:setTimeout,SI:p.setImmediate,CT:clearTimeout,XHR:v,REQ:p.Request,EV:p.Event,PR:p.Promise,MO:p.MutationObserver};var g=\"\"+location,y={beacon:\"${beacon}\",errorBeacon:\"${errorBeacon}\",agent:\"${agent}\"},x=v&&w&&w[h]&&!/CriOS/.test(navigator.userAgent),b=e.exports={offset:s,now:a,origin:g,features:{},xhrWrappable:x,userAgent:d};t(19),t(22),l[h]?(l[h](\"DOMContentLoaded\",i,!1),p[h](\"load\",r,!1)):(l[m](\"onreadystatechange\",o),p[m](\"onload\",r)),c(\"mark\",[\"firstbyte\",s],null,\"api\");var E=0,O=t(27)},{}],\"wrap-function\":[function(t,e,n){function r(t){return!(t&&t instanceof Function&&t.apply&&!t[a])}var o=t(\"ee\"),i=t(26),a=\"nr@original\",s=Object.prototype.hasOwnProperty,c=!1;e.exports=function(t,e){function n(t,e,n,o){function nrWrapper(){var r,a,s,c;try{a=this,r=i(arguments),s=\"function\"==typeof n?n(r,a):n||{}}catch(f){p([f,\"\",[r,a,o],s])}u(e+\"start\",[r,a,o],s);try{return c=t.apply(a,r)}catch(d){throw u(e+\"err\",[r,a,d],s),d}finally{u(e+\"end\",[r,a,c],s)}}return r(t)?t:(e||(e=\"\"),nrWrapper[a]=t,d(t,nrWrapper),nrWrapper)}function f(t,e,o,i){o||(o=\"\");var a,s,c,f=\"-\"===o.charAt(0);for(c=0;c<e.length;c++)s=e[c],a=t[s],r(a)||(t[s]=n(a,f?s+o:o,i,s))}function u(n,r,o){if(!c||e){var i=c;c=!0;try{t.emit(n,r,o,e)}catch(a){p([a,n,r,o])}c=i}}function d(t,e){if(Object.defineProperty&&Object.keys)try{var n=Object.keys(t);return n.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(r){p([r])}for(var o in t)s.call(t,o)&&(e[o]=t[o]);return e}function p(e){try{t.emit(\"internal-error\",e)}catch(n){}}return t||(t=o),n.inPlace=f,n.flag=a,n}},{}]},{},[\"loader\",2,16,5,3,4]);\n ;NREUM.loader_config={accountID:\"2626105\",trustKey:\"2626105\",agentID:\"${applicationID}\",licenseKey:\"${licenseKey}\",applicationID:\"${applicationID}\"}\n ;NREUM.info={beacon:\"${beacon}\",errorBeacon:\"${errorBeacon}\",licenseKey:\"${licenseKey}\",applicationID:\"${applicationID}\",sa:1}\n `;\n}\n\nexport default enableNewRelic;\n","import { createContext, useContext } from 'react';\n\nexport interface NewRelicApi {\n getAppId(): string;\n getLicenseKey(): string;\n}\nexport const NewRelicApiContext = createContext<NewRelicApi>(undefined!);\n\nexport function useNewRelicApi() {\n return useContext(NewRelicApiContext);\n}\n","import { useEffect } from 'react';\nimport NewRelic from './generate';\nimport { useNewRelicApi } from '../../tools/newRelic/NewRelic';\n\nconst InjectNewRelic = () => {\n const config = useNewRelicApi();\n\n const script = document.createElement('script');\n script.async = true;\n script.innerHTML = NewRelic({\n applicationID: config.getAppId(),\n licenseKey: config.getLicenseKey(),\n });\n\n useEffect(() => {\n document.head.appendChild(script);\n\n return () => {\n document.head.removeChild(script);\n };\n }, [script]);\n\n return null;\n};\n\nexport default InjectNewRelic;\n","import { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport {\n SubmissionReview,\n SubmissionV2\n} from '../../../constants/interfaces/Reviews';\nimport { createSelectorContext, selectItemsByIds } from '../../../tools/redux';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface ExtraPaginationResult<TData = any> extends ListResult {\n timestamp: number;\n}\n\nexport interface SubmissionsState {\n data?: ListResult<SubmissionV2>;\n checked: number[];\n submissionChallenges?: ExtraPaginationResult<Challenge>;\n submissionPractisSets?: ExtraPaginationResult<PractisSets>;\n loading?: boolean;\n error?: string;\n}\n\nexport interface SubmissionPaginationState {\n submissionIds?: number[];\n totalCount?: number;\n loading?: boolean;\n error?: string;\n}\n\nexport interface AccuracyScoreState {\n data?: ListResult<SubmissionV2>;\n checked: number[];\n loading?: boolean;\n error?: string;\n}\n\nexport type SubmissionsStateSelector = (state: any) => SubmissionsState;\n\nexport type SubmissionPaginationStateSelector = (state: any) => SubmissionPaginationState;\n\nexport type AccuracyScoreStateSelector = (state: any) => AccuracyScoreState;\n\nexport const SubmissionsStateSelectorContext = React.createContext<SubmissionsStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport const SubmissionPaginationStateSelectorContext = React.createContext<SubmissionPaginationStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport const AccuracyScoreStateSelectorContext = React.createContext<AccuracyScoreStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useSubmissionsState(): SubmissionsState {\n return useSelector(useContext(SubmissionsStateSelectorContext));\n}\n\nexport function useSubmissionPaginationState(): SubmissionPaginationState {\n return useSelector(useContext(SubmissionPaginationStateSelectorContext));\n}\n\nexport function selectSelectedSubmissions(\n state: SubmissionsState\n): SubmissionV2[] {\n return selectItemsByIds<SubmissionV2>(state?.checked, state?.data?.items);\n}\n\nexport function selectSelectedAccuracyScores(\n state: AccuracyScoreState\n): SubmissionV2[] {\n return selectItemsByIds<SubmissionV2>(state?.checked, state?.data?.items);\n}\n\nexport function useAccuracyScoreState(): AccuracyScoreState {\n return useSelector(useContext(AccuracyScoreStateSelectorContext));\n}\n\nexport interface UpdatedSubmissionsState {\n data?: number[];\n updateType?: 'create' | 'update' | 'delete';\n loading?: boolean;\n}\n\nexport const UpdatedSubmissionsStateSelectorContext = createSelectorContext<UpdatedSubmissionsState>();\n\nexport function useUpdatedSubmissionsState(): UpdatedSubmissionsState {\n return useSelector(useContext(UpdatedSubmissionsStateSelectorContext));\n}\n\nexport interface SubmissionDetailsState {\n details?: SubmissionV2;\n review?: Partial<SubmissionReview>;\n loading?: boolean;\n error?: string;\n}\n\nexport const SubmissionDetailsStateSelectorContext = createSelectorContext<SubmissionDetailsState>();\n\nexport function useSubmissionDetailsState(): SubmissionDetailsState {\n return useSelector(useContext(SubmissionDetailsStateSelectorContext));\n}\nexport interface UpdatedAccuracyScoreState {\n data?: SubmissionV2;\n updateType?: 'create' | 'update' | 'delete';\n loading?: boolean;\n}\n\nexport const UpdatedAccuracyScoreStateSelectorContext = createSelectorContext<UpdatedAccuracyScoreState>();\n\n","import { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { SubmissionReview, SubmissionV2 } from '../../../constants/interfaces/Reviews';\n\nexport enum ACTIONS {\n SEARCH_CHALLENGE_SUBMISSIONS_START = 'SEARCH_CHALLENGE_SUBMISSIONS_START',\n SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS = 'SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS',\n SEARCH_CHALLENGE_SUBMISSIONS_FAILURE = 'SEARCH_CHALLENGE_SUBMISSIONS_FAILURE',\n\n SEARCH_SUBMISSION_PAGINATION_START = 'SEARCH_SUBMISSION_PAGINATION_START',\n SEARCH_SUBMISSION_PAGINATION_SUCCESS = 'SEARCH_SUBMISSION_PAGINATION_SUCCESS',\n SEARCH_SUBMISSION_PAGINATION_FAILURE = 'SEARCH_SUBMISSION_PAGINATION_FAILURE',\n\n SEARCH_CHALLENGES_FOR_SUBMISSIONS_START = 'SEARCH_CHALLENGES_FOR_SUBMISSIONS_START',\n SEARCH_CHALLENGES_FOR_SUBMISSIONS_SUCCESS = 'SEARCH_CHALLENGES_FOR_SUBMISSIONS_SUCCESS',\n SEARCH_CHALLENGES_FOR_SUBMISSIONS_FAILURE = 'SEARCH_CHALLENGES_FOR_SUBMISSIONS_FAILURE',\n\n SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_START = 'SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_START',\n SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_SUCCESS = 'SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_SUCCESS',\n SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_FAILURE = 'SEARCH_PRACTIS_SETS_FOR_SUBMISSIONS_FAILURE',\n\n UPDATE_CHALLENGE_SUBMISSION_START = 'UPDATE_CHALLENGE_SUBMISSION_START',\n UPDATE_CHALLENGE_SUBMISSION_SUCCESS = 'UPDATE_CHALLENGE_SUBMISSION_SUCCESS',\n UPDATE_CHALLENGE_SUBMISSION_FAILURE = 'UPDATE_CHALLENGE_SUBMISSION_FAILURE',\n\n GET_SUBMISSION_DETAILS_START = 'GET_SUBMISSION_DETAILS_START',\n GET_SUBMISSION_DETAILS_SUCCESS = 'GET_SUBMISSION_DETAILS_SUCCESS',\n GET_SUBMISSION_DETAILS_FAILURE = 'GET_SUBMISSION_DETAILS_FAILURE',\n GET_SUBMISSION_REVIEW_SUCCESS = 'GET_SUBMISSION_REVIEW_SUCCESS',\n\n UPDATE_SUBMISSION_DETAILS_START = 'UPDATE_SUBMISSION_DETAILS_START',\n UPDATE_SUBMISSION_DETAILS_SUCCESS = 'UPDATE_SUBMISSION_DETAILS_SUCCESS',\n UPDATE_SUBMISSION_DETAILS_FAILURE = 'UPDATE_SUBMISSION_DETAILS_FAILURE',\n\n UPDATE_SCORE_START = 'UPDATE_SCORE_START',\n UPDATE_SCORE_SUCCESS = 'UPDATE_SCORE_SUCCESS',\n UPDATE_SCORE_FAILURE = 'UPDATE_SCORE_FAILURE',\n\n MODIFY_SCORE = 'MODIFY_SCORE',\n\n CHECK_ALL_SUBMISSIONS = 'CHECK_ALL_SUBMISSIONS',\n CHECK_SINGLE_SUBMISSION = 'CHECK_SINGLE_SUBMISSION',\n\n UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS = 'UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS',\n\n SEARCH_ACCURACY_SCORE_START = 'SEARCH_ACCURACY_SCORE_START',\n SEARCH_ACCURACY_SCORE_SUCCESS = 'SEARCH_ACCURACY_SCORE_SUCCESS',\n SEARCH_ACCURACY_SCORE_FAILURE = 'SEARCH_ACCURACY_SCORE_FAILURE',\n\n CHECK_ALL_ACCURACY_SCORES = 'CHECK_ALL_ACCURACY_SCORES',\n CHECK_SINGLE_ACCURACY_SCORE = 'CHECK_SINGLE_ACCURACY_SCORE',\n}\n\nexport function searchAccuracyScoreStart() {\n return {\n type: ACTIONS.SEARCH_ACCURACY_SCORE_START as ACTIONS.SEARCH_ACCURACY_SCORE_START,\n };\n}\n\nexport function searchAccuracyScoreSuccess(\n accuracyScores: ListResult<SubmissionV2>\n) {\n return {\n type: ACTIONS.SEARCH_ACCURACY_SCORE_SUCCESS as ACTIONS.SEARCH_ACCURACY_SCORE_SUCCESS,\n accuracyScores,\n };\n}\n\nexport function searchAccuracyScoreFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_ACCURACY_SCORE_FAILURE as ACTIONS.SEARCH_ACCURACY_SCORE_FAILURE,\n error,\n };\n}\n\nexport function searchChallengeSubmissionsStart() {\n return {\n type: ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_START as ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_START,\n };\n}\n\nexport function searchChallengeSubmissionsSuccess(\n submissions: ListResult<SubmissionV2>\n) {\n return {\n type: ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS as ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS,\n submissions,\n };\n}\n\nexport function searchChallengeSubmissionsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_FAILURE as ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_FAILURE,\n error,\n };\n}\n\nexport function searchSubmissionPaginationStart() {\n return {\n type: ACTIONS.SEARCH_SUBMISSION_PAGINATION_START as ACTIONS.SEARCH_SUBMISSION_PAGINATION_START,\n };\n}\n\nexport function searchSubmissionPaginationSuccess(\n submissionIds: number[], totalCount: number\n) {\n return {\n type: ACTIONS.SEARCH_SUBMISSION_PAGINATION_SUCCESS as ACTIONS.SEARCH_SUBMISSION_PAGINATION_SUCCESS,\n submissionIds,\n totalCount\n };\n}\n\nexport function searchSubmissionPaginationFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_SUBMISSION_PAGINATION_FAILURE as ACTIONS.SEARCH_SUBMISSION_PAGINATION_FAILURE,\n error,\n };\n}\n\nexport function updateChallengeSubmissionStart() {\n return {\n type: ACTIONS.UPDATE_CHALLENGE_SUBMISSION_START as ACTIONS.UPDATE_CHALLENGE_SUBMISSION_START,\n };\n}\n\nexport function updateChallengeSubmissionSuccess(\n submissionIds: number[],\n updateType: 'create' | 'update' | 'delete'\n) {\n return {\n type: ACTIONS.UPDATE_CHALLENGE_SUBMISSION_SUCCESS as ACTIONS.UPDATE_CHALLENGE_SUBMISSION_SUCCESS,\n submissionIds,\n updateType,\n };\n}\n\nexport function updateChallengeSubmissionFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_CHALLENGE_SUBMISSION_FAILURE as ACTIONS.UPDATE_CHALLENGE_SUBMISSION_FAILURE,\n error,\n };\n}\n\nexport function getSubmissionDetailsStart() {\n return {\n type: ACTIONS.GET_SUBMISSION_DETAILS_START as ACTIONS.GET_SUBMISSION_DETAILS_START,\n };\n}\n\nexport function getSubmissionDetailsFailure(error: string) {\n return {\n type: ACTIONS.GET_SUBMISSION_DETAILS_FAILURE as ACTIONS.GET_SUBMISSION_DETAILS_FAILURE,\n error,\n };\n}\n\nexport function getSubmissionDetailsSuccess(submission: SubmissionV2, review?: SubmissionReview) {\n return {\n type: ACTIONS.GET_SUBMISSION_DETAILS_SUCCESS as ACTIONS.GET_SUBMISSION_DETAILS_SUCCESS,\n submission,\n review,\n };\n}\n\nexport function getSubmissionReviewSuccess(review: SubmissionReview) {\n return {\n type: ACTIONS.GET_SUBMISSION_REVIEW_SUCCESS as ACTIONS.GET_SUBMISSION_REVIEW_SUCCESS,\n review,\n };\n}\n\nexport function modifyScore(value: string | number, field: string) {\n return {\n type: ACTIONS.MODIFY_SCORE as ACTIONS.MODIFY_SCORE,\n field: field,\n value: value,\n };\n}\n\nexport function checkSingleSubmission(id: number) {\n return {\n type: ACTIONS.CHECK_SINGLE_SUBMISSION as ACTIONS.CHECK_SINGLE_SUBMISSION,\n id,\n };\n}\n\nexport function checkAllSubmissions(\n submissionId: any,\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.CHECK_ALL_SUBMISSIONS as ACTIONS.CHECK_ALL_SUBMISSIONS,\n submissionId,\n checked,\n partial,\n };\n}\n\nexport function checkAllAccuracyScores(\n submissionId: any,\n checked: boolean,\n partial?: boolean\n) {\n return {\n type: ACTIONS.CHECK_ALL_ACCURACY_SCORES as ACTIONS.CHECK_ALL_ACCURACY_SCORES,\n submissionId,\n checked,\n partial,\n };\n}\n\nexport function checkSingleAccuracyScore(id: number) {\n return {\n type: ACTIONS.CHECK_SINGLE_ACCURACY_SCORE as ACTIONS.CHECK_SINGLE_ACCURACY_SCORE,\n id,\n };\n}\n\nexport function updateSubmissionDeleteLabelSuccess(\n labelId: number,\n id: number\n) {\n return {\n type: ACTIONS.UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS as ACTIONS.UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS,\n labelId,\n id,\n };\n}\n","import { Challenge } from './Challenge';\r\nimport { UserInterface } from './User';\r\nimport { UserInfo } from './UserInfo';\r\nimport { CompanyInterface } from './Company';\r\nimport { PractisSets } from './PractisSets';\r\nimport { Score } from './Score';\r\nimport { Label } from './Label';\r\n\r\nexport interface Submission {\r\n id: number;\r\n challengeId?: number;\r\n title: '';\r\n status: 'PENDING' | 'REVIEWED' | 'ARCHIVED' | 'UPLOADING';\r\n video: string | null;\r\n note: string;\r\n reviewedAt: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n score: Score;\r\n scoreId?: string;\r\n challenge: Challenge;\r\n user: UserInterface;\r\n company: CompanyInterface;\r\n practisSet: PractisSets;\r\n submittedAt: string;\r\n labels: Label[];\r\n isViewed?: boolean;\r\n}\r\n\r\nexport enum SUBMISSION_TYPE {\r\n SCENARIO = 'scenario',\r\n CHALLENGE = 'challenge',\r\n}\r\n\r\nexport enum SUBMISSION_VISIBILITY {\r\n VISIBLE = 'visible',\r\n ARCHIVED = 'archived'\r\n}\r\n\r\nexport enum SUBMISSION_FLAG_TYPE {\r\n ADMIN = 'admin',\r\n COMPANY = 'company',\r\n}\r\n\r\nexport interface SubmissionFlag {\r\n id: number;\r\n type: SUBMISSION_FLAG_TYPE;\r\n createdAt: string;\r\n userId: number;\r\n}\r\n\r\nexport interface SubmissionV2 {\r\n id: number;\r\n type: SUBMISSION_TYPE.CHALLENGE | SUBMISSION_TYPE.SCENARIO;\r\n status: string;\r\n enrollmentId: number;\r\n challenge?: {\r\n id: number;\r\n title: string;\r\n description: string;\r\n status: string;\r\n companyId: number;\r\n sourceScenarioId?: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n };\r\n scenario?: {\r\n id: number;\r\n title: string;\r\n description: string;\r\n status: string;\r\n companyId: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n };\r\n practisSet?: {\r\n id: number;\r\n name: string;\r\n description: string;\r\n status: string;\r\n companyId: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n };\r\n user: UserInfo;\r\n userLabels?: number[];\r\n company: {\r\n id: number;\r\n name: string;\r\n logo: string;\r\n };\r\n createdAt: string;\r\n updatedAt: string;\r\n mediaUrl?: string;\r\n placeholderUrl?: string;\r\n accuracy: {\r\n accuracyId: number;\r\n state: string;\r\n modeAccuracy: string;\r\n modeScenario: string;\r\n accuracy: number;\r\n };\r\n flags: SubmissionFlag[];\r\n counters: {\r\n dislikesCount: number;\r\n likesCount: number;\r\n viewsCount: number;\r\n feedbacksCount: number;\r\n };\r\n relation: {\r\n isLiked: boolean;\r\n isDisliked: boolean;\r\n isViewed: boolean;\r\n };\r\n score: number;\r\n reviewedAt: string;\r\n isVisible: boolean;\r\n}\r\n\r\nexport interface SubmissionReview {\r\n id: number;\r\n submissionId: number;\r\n date: string;\r\n user: UserInfo;\r\n clarity: number;\r\n knowledge: number;\r\n confidence: number;\r\n enthusiasm: number;\r\n goalAchieved: number;\r\n value: number;\r\n note: string;\r\n}","import { useMemo } from \"react\";\nimport { SubmissionV2 } from \"../../../constants/interfaces/Reviews\";\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\n\nexport enum SubmissionActions {\n ARCHIVE,\n RESTORE,\n}\n\nfunction createSubmissionActionsHelper(loggedInUser: UserProfile | undefined) { \n const canArchive = (submission: SubmissionV2) =>\n submission.isVisible\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ARCHIVE_SUBMISSION);\n \n const canRestore = (submission: SubmissionV2) =>\n !submission.isVisible\n && hasPermission(loggedInUser, NEW_PERMISSIONS.RESTORE_SUBMISSION);\n \n\n const getBulkActions = (submissions: SubmissionV2[] | undefined) =>\n getBulkActionsAvailability(\n submissions,\n [\n getBulkActionAvailabilityItem(\n SubmissionActions.ARCHIVE,\n submissions,\n canArchive\n ),\n getBulkActionAvailabilityItem(\n SubmissionActions.RESTORE,\n submissions,\n canRestore\n ),\n ]\n );\n\n return {\n canArchive,\n canRestore,\n getBulkActions,\n };\n}\n\nexport type SubmissionActionsHelper = ReturnType<typeof createSubmissionActionsHelper>;\n\nexport function useSubmissionActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createSubmissionActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}","import { useMemo } from \"react\";\nimport { SubmissionV2 } from \"../../../constants/interfaces/Reviews\";\nimport { UserProfile } from \"../../../constants/interfaces/User\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\n\nexport enum AccuracyScoreActions {\n ARCHIVE,\n RESTORE,\n}\n\nfunction createAccuracyScoreActionsHelper(loggedInUser: UserProfile | undefined) { \n const canArchive = (submission: SubmissionV2) =>\n submission.isVisible\n && hasPermission(loggedInUser, NEW_PERMISSIONS.ARCHIVE_SUBMISSION);\n \n const canRestore = (submission: SubmissionV2) =>\n !submission.isVisible\n && hasPermission(loggedInUser, NEW_PERMISSIONS.RESTORE_SUBMISSION);\n \n\n const getBulkActions = (submissions: SubmissionV2[] | undefined) =>\n getBulkActionsAvailability(\n submissions,\n [\n getBulkActionAvailabilityItem(\n AccuracyScoreActions.ARCHIVE,\n submissions,\n canArchive\n ),\n getBulkActionAvailabilityItem(\n AccuracyScoreActions.RESTORE,\n submissions,\n canRestore\n ),\n ]\n );\n\n return {\n canArchive,\n canRestore,\n getBulkActions,\n };\n}\n\nexport type AccuracyScoreActionsHelper = ReturnType<typeof createAccuracyScoreActionsHelper>;\n\nexport function useAccuracyScoreActionsHelper() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createAccuracyScoreActionsHelper(loggedInUser),\n [loggedInUser]\n );\n}\n ","import { SearchSubmissionsParams } from '../../../api/submissions/types';\r\n\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport { SUBMISSION_VISIBILITY } from '../../../constants/interfaces/Reviews';\r\nimport { SubmissionFilters } from '../../../constants/interfaces/SubmissionSearchFilters';\r\nimport { getSearchSortingValue } from '../../../helpers/functions/search-params-helpers';\r\n\r\nexport const SUBMISSION_STATUS = {\r\n PENDING: 'pending',\r\n ACTIVE: 'active',\r\n ARCHIVED: 'deleted'\r\n};\r\n\r\nexport const CHALLENGE_SUBMISSION_REVIEW_STATUS = {\r\n NOT_REVIEWED: 'not_reviewed',\r\n REVIEWED: 'reviewed'\r\n};\r\n\r\nexport const CHALLENGE_SUBMISSION_REVIEW_STATUS_ITEMS: Array<{ name: string; value: string }> = [\r\n {\r\n name: 'Needs Review',\r\n value: CHALLENGE_SUBMISSION_REVIEW_STATUS.NOT_REVIEWED,\r\n },\r\n {\r\n name: 'Reviewed',\r\n value: CHALLENGE_SUBMISSION_REVIEW_STATUS.REVIEWED,\r\n },\r\n];\r\n\r\nexport const calculateScoreValue = (items: number[]): number => {\r\n return items.length && items.reduce((total, amount, index, array) => {\r\n total += amount;\r\n if (index === array.length - 1) {\r\n return total / array.length;\r\n } else {\r\n return total;\r\n }\r\n });\r\n};\r\n\r\nexport const generateScoreItemArray = (obj: any, fields: string[]) => {\r\n const arr = [];\r\n for (let field of fields) {\r\n if (!!obj[field]) {\r\n arr.push(obj[field]);\r\n }\r\n }\r\n return arr;\r\n};\r\n\r\nexport const countAppliedFiltersCount = (searchParams: SearchParams) => {\r\n let total = 0;\r\n\r\n if (searchParams && searchParams.teamIds && searchParams.teamIds.length) {\r\n total = total + searchParams.teamIds.length;\r\n }\r\n\r\n if (searchParams && searchParams.labelIDs && searchParams.labelIDs.length) {\r\n total = total + searchParams.labelIDs.filter(id => id > 0).length;\r\n }\r\n\r\n if (\r\n searchParams &&\r\n searchParams.filterByStatus &&\r\n searchParams.filterByStatus.length\r\n ) {\r\n total = total + searchParams.filterByStatus.length;\r\n }\r\n\r\n return total;\r\n};\r\n\r\n\r\n\r\nexport const countAppliedFiltersCountAccuracy = (searchParams: SearchParams) => {\r\n let total = 0;\r\n const scenariosFilter: any = searchParams?.filters?.find(item => item.field === 'scenarioId')?.value;\r\n\r\n\r\n if (searchParams && searchParams.teamIds && searchParams.teamIds.length) {\r\n total = total + searchParams.teamIds.length;\r\n }\r\n\r\n if (searchParams && searchParams.labelIDs && searchParams.labelIDs.length) {\r\n total = total + searchParams.labelIDs.filter(id => id > 0).length;\r\n }\r\n\r\n if (searchParams && searchParams.filters && scenariosFilter) {\r\n total = total + scenariosFilter?.length;\r\n }\r\n\r\n if (\r\n searchParams &&\r\n searchParams.filterByStatus &&\r\n searchParams.filterByStatus.length\r\n ) {\r\n total = total + searchParams.filterByStatus.length;\r\n }\r\n\r\n return total;\r\n};\r\n\r\n/**\r\n * @function createSearchSubmissionsParams\r\n * @returns { SearchSubmissionsParams }\r\n */\r\nexport const createSearchSubmissionsParams = (\r\n searchParams: SearchParams,\r\n companyId: number,\r\n type: string,\r\n filters: SubmissionFilters\r\n): SearchSubmissionsParams => {\r\n return {\r\n limit: searchParams.limit ?? 20,\r\n offset: searchParams.offset ?? 0,\r\n companyId: companyId?.toString(),\r\n query: searchParams.searchTerm,\r\n order: getSearchSortingValue(searchParams.orderBy, ''),\r\n status: SUBMISSION_STATUS.ACTIVE,\r\n visibility: filters.showArchived\r\n ? SUBMISSION_VISIBILITY.ARCHIVED\r\n : SUBMISSION_VISIBILITY.VISIBLE,\r\n teamId: filters.teamIds.join(','),\r\n labelId: filters.labelIds.join(','),\r\n type\r\n };\r\n};","export const UNAVAILABLE_SUBMISSION_ERROR = 'Submission was not found';\nexport const ALREADY_REQUESTED_REDO_ERROR = 'Someone has already sent a redo request';","import { SearchParams } from '../../../../constants/interfaces/filters';\nimport {\n AccuracyTestSubmissionFilters,\n ChallengeSubmissionFilters,\n} from '../../../../constants/interfaces/SubmissionSearchFilters';\n\nexport type UpdateSubmissionStatuses = 'Archive' | 'Restore';\nexport enum SubmissionUpdateActions {\n ARCHIVE = 'Archive',\n RESTORE = 'Restore',\n}\n\nexport type UpdateSubmissionStatusChunkRequestParameters = {\n searchParams: SearchParams;\n filters: AccuracyTestSubmissionFilters | ChallengeSubmissionFilters;\n onSuccessCallback: (numberOfDoneItems: number) => void;\n totalItems: number\n};","export const pluralize = (count: number, noun: string, suffix = 's') =>\n `${count} ${noun}${count !== 1 ? suffix : ''}`;\n","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\r\nimport {\r\n usePerformSubmissionActionApi,\r\n useRequestSubmissionRedoApi,\r\n useArchiveSubmissionsApi,\r\n useRestoreSubmissionsApi,\r\n useSearchSubmissionsApi,\r\n useGetSubmissionDetailsApi,\r\n useGetSubmissionReviewApi,\r\n usePerformSubmissionReviewApi,\r\n} from '../../../api';\r\nimport {\r\n checkAllAccuracyScores,\r\n checkAllSubmissions,\r\n checkSingleAccuracyScore,\r\n checkSingleSubmission,\r\n getSubmissionDetailsFailure,\r\n getSubmissionDetailsStart,\r\n getSubmissionDetailsSuccess,\r\n getSubmissionReviewSuccess,\r\n modifyScore,\r\n searchAccuracyScoreFailure,\r\n searchAccuracyScoreStart,\r\n searchAccuracyScoreSuccess,\r\n searchSubmissionPaginationFailure,\r\n searchSubmissionPaginationStart,\r\n searchSubmissionPaginationSuccess,\r\n searchChallengeSubmissionsFailure,\r\n searchChallengeSubmissionsStart,\r\n searchChallengeSubmissionsSuccess,\r\n updateChallengeSubmissionFailure,\r\n updateChallengeSubmissionStart,\r\n updateChallengeSubmissionSuccess,\r\n} from './actions';\r\nimport { SubmissionReview, SubmissionV2, SUBMISSION_TYPE } from '../../../constants/interfaces/Reviews';\r\nimport { setSearchState } from '../../searchState/store/actions';\r\nimport { SEARCH_STATE } from '../../searchState/constants';\r\nimport { SearchSubmissionsParams, SubmissionRedoParams, SubmissionReviewParams } from '../../../api/submissions/types';\r\nimport { copyTextToClipboard } from '../../../helpers/functions/copy-to-clipboard';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { createSearchSubmissionsParams } from '../tools';\r\nimport { AccuracyTestSubmissionFilters, ChallengeSubmissionFilters } from '../../../constants/interfaces/SubmissionSearchFilters';\r\nimport {\r\n UNAVAILABLE_SUBMISSION_ERROR,\r\n ALREADY_REQUESTED_REDO_ERROR\r\n} from './constants';\r\nimport { pluralize } from '../../../helpers/functions/pluralize';\r\n\r\n/**\r\n * @function useSearchChallengeSubmissionsService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useSearchChallengeSubmissionsService = () => {\r\n const dispatch = useDispatch();\r\n const searchSubmissionsApi = useSearchSubmissionsApi();\r\n const profile = useSelector(getProfileState);\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { SearchParams } searchParams\r\n * @param { ChallengeSubmissionFilters } filters\r\n * @param { boolean? } shouldRemainFilterState\r\n * @param { void }\r\n */\r\n return useCallback(\r\n (\r\n searchParams: SearchParams,\r\n filters: ChallengeSubmissionFilters,\r\n shouldRemainFilterState?: boolean\r\n ) => {\r\n dispatch(searchChallengeSubmissionsStart());\r\n\r\n const searchSubmissionsParams = createSearchSubmissionsParams(\r\n searchParams,\r\n profile?.companyId ?? 0,\r\n SUBMISSION_TYPE.CHALLENGE,\r\n filters\r\n );\r\n\r\n if (filters.reviewStatuses.length === 1) {\r\n searchSubmissionsParams.filterChallenge = filters.reviewStatuses[0];\r\n }\r\n\r\n searchSubmissionsApi(searchSubmissionsParams)\r\n .then(data => {\r\n if(!shouldRemainFilterState){\r\n const combinedParams: SearchParams = {\r\n ...searchParams,\r\n customFilters: filters\r\n };\r\n dispatch(setSearchState(SEARCH_STATE.SUBMISSIONS.name, SEARCH_STATE.SUBMISSIONS.childrenKeys, combinedParams));\r\n }\r\n dispatch(searchChallengeSubmissionsSuccess(data));\r\n dispatch(\r\n searchSubmissionPaginationSuccess(\r\n data.items.map(submission => submission.id),\r\n data.count\r\n ));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchChallengeSubmissionsFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, profile?.companyId, searchSubmissionsApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useSearchChallengeSubmissionPaginationService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useSearchChallengeSubmissionPaginationService = () => {\r\n const dispatch = useDispatch();\r\n const searchSubmissionsApi = useSearchSubmissionsApi();\r\n const profile = useSelector(getProfileState);\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { SearchParams } searchParams\r\n * @param { ChallengeSubmissionFilters } filters\r\n * @param { Function } successCallback\r\n * @param { void }\r\n */\r\n return useCallback(\r\n (\r\n searchParams: SearchParams,\r\n filters: ChallengeSubmissionFilters,\r\n successCallback?: ((data: number[]) => void)\r\n ) => {\r\n dispatch(searchSubmissionPaginationStart());\r\n\r\n const searchSubmissionsParams = createSearchSubmissionsParams(\r\n searchParams,\r\n profile?.companyId ?? 0,\r\n SUBMISSION_TYPE.CHALLENGE,\r\n filters\r\n );\r\n\r\n if (filters.reviewStatuses.length === 1) {\r\n searchSubmissionsParams.filterChallenge = filters.reviewStatuses[0];\r\n }\r\n\r\n searchSubmissionsApi(searchSubmissionsParams)\r\n .then(data => {\r\n const submissionIds = data.items.map(submission => submission.id);\r\n dispatch(\r\n searchSubmissionPaginationSuccess(\r\n submissionIds,\r\n data.count\r\n ));\r\n successCallback?.(submissionIds);\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchSubmissionPaginationFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, profile?.companyId, searchSubmissionsApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useGetSubmissionDetailsService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useGetSubmissionDetailsService = () => {\r\n const dispatch = useDispatch();\r\n const showMessage = useShowMessage();\r\n const getSubmissionDetailsApi = useGetSubmissionDetailsApi();\r\n const getSubmissionReviewApi = useGetSubmissionReviewApi();\r\n\r\n /**\r\n * @function callback\r\n * @param { string | number } submissionId\r\n * @param { Function } successCallback\r\n * @param { void }\r\n */\r\n return useCallback(\r\n (\r\n submissionId: number | string,\r\n successCallback?: (data: SubmissionV2) => void\r\n ) => {\r\n let submission: SubmissionV2;\r\n dispatch(getSubmissionDetailsStart());\r\n getSubmissionDetailsApi(submissionId)\r\n .then(data => {\r\n submission = data;\r\n if (submission.reviewedAt) {\r\n return getSubmissionReviewApi(submissionId)\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n return Promise.resolve(undefined);\r\n });\r\n } else {\r\n return Promise.resolve(undefined);\r\n }\r\n })\r\n .then((review?: SubmissionReview) => {\r\n dispatch(\r\n getSubmissionDetailsSuccess(submission, review)\r\n );\r\n successCallback?.(submission);\r\n })\r\n .catch((error: ErrorResult) => {\r\n if (error.code === 404) {\r\n dispatch(getSubmissionDetailsFailure(\r\n UNAVAILABLE_SUBMISSION_ERROR\r\n ));\r\n } else {\r\n dispatch(getSubmissionDetailsFailure(error.message));\r\n showMessage(error.message, 'error');\r\n }\r\n });\r\n },\r\n [dispatch, getSubmissionDetailsApi, getSubmissionReviewApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useGetSubmissionReviewService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useGetSubmissionReviewService = () => {\r\n const dispatch = useDispatch();\r\n const getSubmissionReviewApi = useGetSubmissionReviewApi();\r\n\r\n /**\r\n * @function callback\r\n * @param { number } submissionId\r\n * @param { Promise }\r\n */\r\n return useCallback((submissionId: number) => {\r\n return getSubmissionReviewApi(submissionId)\r\n .then((review: SubmissionReview) => {\r\n dispatch(\r\n getSubmissionReviewSuccess(review)\r\n );\r\n return Promise.resolve(review);\r\n });\r\n },\r\n [dispatch, getSubmissionReviewApi]\r\n );\r\n};\r\n\r\n/**\r\n * @function usePerformSubmissionReviewService\r\n * @returns { CallableFunction }\r\n */\r\nexport const usePerformSubmissionReviewService = () => {\r\n const dispatch = useDispatch();\r\n const performSubmissionReviewApi = usePerformSubmissionReviewApi();\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { number } submissionId\r\n * @param { Promise }\r\n */\r\n return useCallback(\r\n (submissionId: number, data: SubmissionReviewParams) => {\r\n dispatch(updateChallengeSubmissionStart());\r\n return performSubmissionReviewApi(submissionId, data)\r\n .then(data => {\r\n dispatch(updateChallengeSubmissionSuccess([submissionId], 'update'));\r\n showMessage('Review created!', 'success');\r\n return Promise.resolve(data);\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateChallengeSubmissionFailure(error.message));\r\n return Promise.reject(error);\r\n });\r\n },\r\n [dispatch, performSubmissionReviewApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useRequestSubmissionRedoService = () => {\r\n const dispatch = useDispatch();\r\n const requestSubmissionRedoApi = useRequestSubmissionRedoApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (submissionId: number, redo: SubmissionRedoParams) => {\r\n dispatch(updateChallengeSubmissionStart());\r\n\r\n return requestSubmissionRedoApi(submissionId, redo)\r\n .then(data => {\r\n dispatch(updateChallengeSubmissionSuccess([submissionId], 'update'));\r\n showMessage('Request Submitted', 'success');\r\n return 'success';\r\n })\r\n .catch((error: ErrorResult) => {\r\n if (error.code === 404) { // redo request was already submitted\r\n dispatch(updateChallengeSubmissionSuccess([submissionId], 'update'));\r\n showMessage(ALREADY_REQUESTED_REDO_ERROR, 'error');\r\n return 'success';\r\n } else {\r\n dispatch(updateChallengeSubmissionFailure(error.message));\r\n showMessage(error.message, 'error');\r\n return 'error';\r\n }\r\n });\r\n },\r\n [dispatch, requestSubmissionRedoApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useModifyScoreService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (value: any, field?: string) => {\r\n dispatch(modifyScore(value, field ? field : 'clarity'));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useCheckAllSubmissionsService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (submissionId: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(checkAllSubmissions(submissionId, checked, partial));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useCheckSingleSubmissionService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (submissionId: number) => {\r\n dispatch(checkSingleSubmission(submissionId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useCheckSingleAccuracyScoreService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (submissionId: number) => {\r\n dispatch(checkSingleAccuracyScore(submissionId));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\nexport const useCheckAllAccuracyScoresService = () => {\r\n const dispatch = useDispatch();\r\n return useCallback(\r\n (submissionId: number[], checked: boolean, partial?: boolean) => {\r\n dispatch(checkAllAccuracyScores(submissionId, checked, partial));\r\n },\r\n [dispatch]\r\n );\r\n};\r\n\r\n\r\nexport const useMarkSubmissionAsViewedService = () => {\r\n const dispatch = useDispatch();\r\n const performSubmissionActionApi = usePerformSubmissionActionApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (submissionId: any) => {\r\n performSubmissionActionApi(submissionId, 'view')\r\n .then(() => {\r\n dispatch(\r\n updateChallengeSubmissionSuccess(\r\n [submissionId],\r\n 'update'\r\n )\r\n );\r\n })\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [showMessage, performSubmissionActionApi, dispatch]\r\n );\r\n};\r\n\r\nexport const useSearchAccuracyScoreService = () => {\r\n const dispatch = useDispatch();\r\n const searchSubmissionsApi = useSearchSubmissionsApi();\r\n const profile = useSelector(getProfileState);\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (searchParams: SearchParams, filters: AccuracyTestSubmissionFilters) => {\r\n dispatch(searchAccuracyScoreStart());\r\n\r\n const searchSubmissionsParams = createSearchSubmissionsParams(\r\n searchParams,\r\n profile?.companyId ?? 0,\r\n SUBMISSION_TYPE.SCENARIO,\r\n filters\r\n );\r\n if (filters.scenarioIds.length > 0) {\r\n searchSubmissionsParams.scenarioId = filters.scenarioIds.join(',');\r\n }\r\n\r\n searchSubmissionsApi(searchSubmissionsParams)\r\n .then(data => {\r\n const combinedParams: SearchParams = {\r\n ...searchParams,\r\n customFilters: filters\r\n };\r\n dispatch(\r\n setSearchState(\r\n SEARCH_STATE.ACCURACY.name,\r\n SEARCH_STATE.ACCURACY.childrenKeys,\r\n combinedParams\r\n )\r\n );\r\n dispatch(searchAccuracyScoreSuccess(data));\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(searchAccuracyScoreFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [\r\n dispatch,\r\n profile?.companyId,\r\n searchSubmissionsApi,\r\n showMessage,\r\n ]\r\n );\r\n};\r\n\r\n/**\r\n * @function useGetSubmissionFromFeedService\r\n * @returns { CallableFunction }\r\n */\r\nexport const useGetSubmissionFromFeedService = () => {\r\n const dispatch = useDispatch();\r\n const searchSubmissionsApi = useSearchSubmissionsApi();\r\n const getSubmissionReviewApi = useGetSubmissionReviewApi();\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { string | number } submissionId\r\n * @param { boolean } loadReview\r\n * @param { Function } successCallback\r\n * @param { void }\r\n */\r\n return useCallback(\r\n (\r\n submissionId: number | string,\r\n successCallback?: (data: SubmissionV2) => void\r\n ) => {\r\n dispatch(getSubmissionDetailsStart());\r\n const params: SearchSubmissionsParams = {\r\n submissionId: submissionId.toString(),\r\n limit: 1,\r\n offset: 0\r\n };\r\n let submission: SubmissionV2;\r\n searchSubmissionsApi(params)\r\n .then((data) => {\r\n if (data.items.length > 0) {\r\n submission = data.items[0];\r\n if (submission.reviewedAt) {\r\n return getSubmissionReviewApi(submissionId)\r\n .catch((error: ErrorResult) => {\r\n showMessage(error.message, 'error');\r\n return Promise.resolve(undefined);\r\n });\r\n } else {\r\n return Promise.resolve(undefined);\r\n }\r\n } else {\r\n return Promise.reject({ message: UNAVAILABLE_SUBMISSION_ERROR });\r\n }\r\n })\r\n .then((review) => {\r\n successCallback?.(submission);\r\n dispatch(\r\n getSubmissionDetailsSuccess(submission, review)\r\n );\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(getSubmissionDetailsFailure(error.message));\r\n if (error.message !== UNAVAILABLE_SUBMISSION_ERROR) {\r\n showMessage(error.message, 'error');\r\n }\r\n });\r\n },\r\n [dispatch, searchSubmissionsApi, getSubmissionReviewApi, showMessage]\r\n );\r\n};\r\n\r\nexport const useArchiveSubmissionsService = (isAccuracyTest: boolean) => {\r\n const dispatch = useDispatch();\r\n const archiveSubmissionsApi = useArchiveSubmissionsApi();\r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (submissionIds: number[]) => {\r\n dispatch(updateChallengeSubmissionStart());\r\n return archiveSubmissionsApi(submissionIds)\r\n .then(data => {\r\n dispatch(\r\n updateChallengeSubmissionSuccess(submissionIds, 'update')\r\n );\r\n const countText = pluralize(submissionIds.length, isAccuracyTest ? 'Accuracy Test' : 'Challenge Submission');\r\n const message =\r\n submissionIds.length > 1\r\n ? `${countText} have been archived`\r\n : `${countText} has been archived`;\r\n showMessage(message, 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateChallengeSubmissionFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, archiveSubmissionsApi, isAccuracyTest, showMessage]\r\n );\r\n};\r\n\r\nexport const useRestoreSubmissionsService = (isAccuracyTest: boolean) => {\r\n const dispatch = useDispatch();\r\n const restoreSubmissionsApi = useRestoreSubmissionsApi();\r\n \r\n const showMessage = useShowMessage();\r\n return useCallback(\r\n (submissionIds: number[]) => {\r\n dispatch(updateChallengeSubmissionStart());\r\n return restoreSubmissionsApi(submissionIds)\r\n .then(data => {\r\n dispatch(\r\n updateChallengeSubmissionSuccess(submissionIds, 'update')\r\n );\r\n const countText = pluralize(submissionIds.length, isAccuracyTest ? 'Accuracy Test' : 'Challenge Submission');\r\n const message =\r\n submissionIds.length > 1\r\n ? `${countText} have been restored`\r\n : `${countText} has been restored`;\r\n showMessage(message, 'success');\r\n return data;\r\n })\r\n .catch((error: ErrorResult) => {\r\n dispatch(updateChallengeSubmissionFailure(error.message));\r\n showMessage(error.message, 'error');\r\n });\r\n },\r\n [dispatch, isAccuracyTest, restoreSubmissionsApi, showMessage]\r\n );\r\n};\r\n\r\n/**\r\n * @function useCopyAccuracyLink\r\n * @returns { CallableFunction }\r\n */\r\nexport const useCopyAccuracyLink = () => {\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { SubmissionV2 } submission\r\n * @param { void }\r\n */\r\n return useCallback((submission: SubmissionV2) => {\r\n const content = 'This is an Accuracy Test'\r\n + (submission.user ? ` from ${submission.user.firstName} ${submission.user.lastName}` : '')\r\n + (submission.scenario ? ` for Scenario ${submission.scenario.title}` : '')\r\n + `. Check it out: ${window.location.href}`;\r\n if (copyTextToClipboard(content)) {\r\n showMessage('Link copied to clipboard', 'success');\r\n }\r\n }, [showMessage]);\r\n}\r\n\r\n/**\r\n * @function useCopyChallengeLink\r\n * @returns { CallableFunction }\r\n */\r\n export const useCopyChallengeLink = () => {\r\n const showMessage = useShowMessage();\r\n\r\n /**\r\n * @function callback\r\n * @param { SubmissionV2 } submission\r\n * @param { void }\r\n */\r\n return useCallback((submission: SubmissionV2) => {\r\n const content = 'This is a Challenge'\r\n + (submission.user ? ` from ${submission.user.firstName} ${submission.user.lastName}` : '')\r\n + (submission.practisSet ? ` for Practis Set ${submission.practisSet.name}` : '')\r\n + `. Check it out: ${window.location.href}`;\r\n if (copyTextToClipboard(content)) {\r\n showMessage('Link copied to clipboard', 'success');\r\n }\r\n }, [showMessage]);\r\n}","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nexport const Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nexport const LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background-color: inherit;\n\n > div:last-child {\n flex-grow: 1;\n margin-top: 28px;\n }\n`;\n\nexport const StatusSection = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n`;\n\nexport const StatusItem = styled.div`\n margin-bottom: 8px;\n`;\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nexport const SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n margin-right: 24px;\n color: var(--ps-grey-1);\n`;\n\nexport const ButtonWrapper = styled.div`\n margin-right: 12px;\n`;","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport { kebabCase } from 'lodash';\nimport { Variables } from '../../../../theme/variables';\nimport { Button } from '../../../../ui/components/Button';\nimport { Fieldset } from '../../../../ui/components/Fieldset';\nimport Checkbox from '../../../../ui/components/Checkbox';\nimport { PortableLabelsWithStore } from '../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\nimport {\n CHALLENGE_SUBMISSION_REVIEW_STATUS_ITEMS\n} from '../../tools';\nimport { PortableTeamsWithStore } from '../../../portableTeams';\nimport { useTeamsState } from '../../../portableTeams/store/hors/withTeams/states';\nimport {\n useDeselectAllTeams,\n useSaveTeams,\n} from '../../../portableTeams/store/hors/withTeams/services';\nimport { toggleItemInArray } from '../../../../helpers/functions/array-helpers';\nimport { ChallengeSubmissionFilters } from '../../../../constants/interfaces/SubmissionSearchFilters';\nimport {\n Container,\n Wrapper,\n LabelsContainer,\n TeamsContainer,\n StatusContainer,\n StatusSection,\n StatusItem,\n Actions,\n SummaryCaption,\n ButtonWrapper\n} from './styles';\n\nexport const SubmissionFilters: FC<{\n filters: ChallengeSubmissionFilters;\n onSuccessApply: (filters: ChallengeSubmissionFilters) => void;\n}> = ({\n filters,\n onSuccessApply,\n}) => {\n const labels = useLabelsState();\n const teams = useTeamsState();\n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n const saveTeams = useSaveTeams();\n const ifPreselectedLabelsChanged = useIfChanged(filters.labelIds);\n\n const [reviewStatuses, setReviewStatuses] = useState<string[] | undefined>();\n const [showArchived, setShowArchived] = useState<boolean | undefined>();\n\n const handleReviewStatusSelection = useCallback(\n (reviewStatus: string) => {\n const statuses = toggleItemInArray(\n reviewStatuses ?? filters.reviewStatuses, reviewStatus);\n setReviewStatuses(statuses);\n },\n [setReviewStatuses, reviewStatuses, filters.reviewStatuses]\n );\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(filters.labelIds);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n filters.labelIds,\n saveLabels,\n selectLabels,\n ]);\n\n const onApplyHandler = useCallback(() => {\n saveLabels();\n saveTeams();\n onSuccessApply({\n reviewStatuses: reviewStatuses ?? filters.reviewStatuses,\n showArchived: showArchived ?? filters.showArchived,\n labelIds: labels.selected,\n teamIds: teams.selected\n })\n }, [\n reviewStatuses,\n showArchived,\n labels.selected,\n teams.selected,\n saveLabels,\n saveTeams,\n onSuccessApply,\n filters\n ]);\n\n const totalFiltersSelected =\n teams.selected.length +\n labels.selected.filter(id => id > 0).length +\n ((showArchived ?? filters.showArchived) ? 1 : 0) +\n (reviewStatuses ?? filters.reviewStatuses).length;\n\n const deselectTeams = useDeselectAllTeams();\n const deselectLabels = useDeselectAllLabels();\n\n const onClearHandler = () => {\n setShowArchived(false);\n setReviewStatuses([]);\n deselectTeams();\n deselectLabels();\n };\n\n return (\n <Container>\n <Wrapper>\n <StatusContainer>\n <Fieldset title={'Review Status'} dataTest=\"review-status-section-title\">\n <StatusSection>\n {CHALLENGE_SUBMISSION_REVIEW_STATUS_ITEMS.map(item => (\n <StatusItem key={item.value} data-test=\"review-status-item-container\">\n <Checkbox\n key={item.value}\n checked={\n (reviewStatuses ?? filters.reviewStatuses)\n .includes(item.value)\n }\n handleChange={() => {\n handleReviewStatusSelection(item.value);\n }}\n label={item.name}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={`${kebabCase(item.name)}-checkbox`}\n />\n </StatusItem>\n ))}\n </StatusSection>\n </Fieldset>\n <Fieldset title={'Status'} dataTest=\"status-section-title\">\n <StatusSection>\n <StatusItem data-test=\"status-item-container\">\n <Checkbox\n checked={showArchived ?? filters.showArchived}\n handleChange={e => {\n setShowArchived(e.target.checked);\n }}\n label=\"Archived\"\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest=\"archived-checkbox\"\n />\n </StatusItem>\n </StatusSection>\n </Fieldset>\n </StatusContainer>\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant={'inverse'}\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={onApplyHandler}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Files = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 20 20\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M18.75 20H1.25C.56 20 0 19.44 0 18.75v-7.5L2.5 0h15L20 11.25v7.5c0 .69-.56 1.25-1.25 1.25zm-2.5-18.75H3.75l-2.5 10h5.625v2.5h6.25v-2.5h5.625l-2.5-10zm2.5 11.875c0-.345-.28-.625-.625-.625h-3.75V15h-8.75v-2.5h-3.75c-.345 0-.625.28-.625.625v5c0 .346.28.625.625.625h16.25c.345 0 .625-.28.625-.626v-4.999zM14.375 8.75h-8.75C5.28 8.75 5 8.47 5 8.125s.28-.625.625-.625h8.75c.345 0 .625.28.625.625s-.28.625-.625.625zM13.125 5h-6.25c-.345 0-.625-.28-.625-.626 0-.344.28-.624.625-.624h6.25c.345 0 .625.28.625.624 0 .346-.28.626-.625.626z\"\n />\n </svg>\n );\n }\n);\n\nexport default Files;\n","import React, { FC } from 'react';\nimport ROUTES from '../../../routes/routes';\nimport Navigation from '../../../ui/components/Navigation/Navigation';\nimport styled from 'styled-components';\n\nconst StyledSubmissionsNavigationContainer = styled.div`\n *:before{\n max-width: 107px;\n }\n`;\n\n\nconst SubmissionsNavigation: FC<{\n notReviewedCount?: number;\n dataTest?: string;\n}> = ({\n notReviewedCount,\n dataTest\n}) => {\n return (\n <StyledSubmissionsNavigationContainer>\n <Navigation\n menu={[\n {\n key: 'accuracytests',\n title: 'Accuracy Tests',\n url: ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.ALL,\n },\n {\n key: 'challenges',\n title: 'Challenges',\n url: ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL,\n notReviewedCount: notReviewedCount\n }\n ]}\n dataTest={dataTest}\n />\n </StyledSubmissionsNavigationContainer>\n );\n};\n\nexport const SubmissionsNavigationContainer: FC<{\n notReviewedCount?: number;\n dataTest?: string;\n}> = ({\n notReviewedCount,\n dataTest\n}) => {\n return <SubmissionsNavigation notReviewedCount={notReviewedCount} dataTest={dataTest} />;\n};\n\nexport default SubmissionsNavigationContainer;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CheckMark = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 0 1 1.06-1.06L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0z\"\n fill=\"#066150\"\n />\n </svg>\n );\n }\n);\n\nexport default CheckMark;\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\nimport AvatarPlaceholder from '../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\n\nexport const AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nexport const StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 200px;\n`;\n\nexport const Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n`;\n\nexport const FlexWrapper = styled.div`\n display: flex;\n align-items: center;\n\n svg {\n margin-right: 4px;\n transform: translateY(-1px);\n }\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n\n minWidthTableCell: {\n padding: '0px !important',\n minWidth: 200,\n },\n}));\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { SUBMISSION_TYPE } from '../../../../constants/interfaces/Reviews';\nimport {\n AccuracyTestSubmissionFilters,\n ChallengeSubmissionFilters,\n} from '../../../../constants/interfaces/SubmissionSearchFilters';\nimport { convertPresentVerbToPastVerb } from '../../../../helpers/functions/strings';\nimport { useChunkRequestsService } from '../../../../services/ChunkRequestService/hooks';\nimport { ChunkRequestActionInterface } from '../../../../services/ChunkRequestService/hooks/types';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport {\n showModalDialog,\n useHideModalDialog,\n} from '../../../../ui/components/ModalDialogs/store/actions';\nimport { GeneralBulkActionModalInterface } from '../../../../ui/components/ModalDialogs/types';\nimport { UPDATE_SUBMISSION_STATUS_ACTION } from './constants';\nimport { useHandleSearchSubmissionsAndUpdateStatus } from './helpers';\nimport {\n UpdateSubmissionStatusChunkRequestParameters,\n UpdateSubmissionStatuses,\n} from './types';\n\n/**\n *\n * @description Custom hook to update submission status with chunk service\n * when all items are selected.\n * @function useUpdateSubmissionStatusBulkActionService\n * @param { SearchParams } searchParams\n * @param { number } companyId\n * @param { Function } onSuccessCallback\n * @param { Function } onErrorCallback\n * @returns { CallableFunction }\n */\nexport function useUpdateSubmissionStatusBulkActionService(\n scope: keyof typeof SUBMISSION_TYPE,\n searchParams: SearchParams,\n filters: AccuracyTestSubmissionFilters | ChallengeSubmissionFilters,\n totalUsersCount: number,\n onSuccessCallback?: () => void,\n onErrorCallback?: () => void\n) {\n const updateActionRef = useRef<UpdateSubmissionStatuses>('Archive');\n\n const dispatch = useDispatch();\n\n const searchSubmissionsAndUpdateStatus =\n useHandleSearchSubmissionsAndUpdateStatus(\n scope,\n updateActionRef.current\n );\n\n const hideModalDialog = useHideModalDialog();\n const showMessage = useShowMessage();\n\n const totalCompletedItems = useRef<number>(0);\n\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n const actionList: ChunkRequestActionInterface<UpdateSubmissionStatusChunkRequestParameters>[] =\n [\n {\n actionName: UPDATE_SUBMISSION_STATUS_ACTION,\n actionFunction: searchSubmissionsAndUpdateStatus,\n actionFunctionOptions: {\n parameters: {\n searchParams: {\n ...searchParams,\n offset: 0,\n },\n filters,\n onSuccessCallback: numberOfDoneItems =>\n (totalCompletedItems.current =\n totalCompletedItems.current +\n numberOfDoneItems),\n totalItems: totalUsersCount,\n },\n fieldName: 'totalItems',\n },\n },\n ];\n\n /**\n * @function clearTotalCompletedItems\n * @returns { void }\n */\n const clearTotalCompletedItems = () => (totalCompletedItems.current = 0);\n\n /**\n * @function handleSuccessServiceCallback\n * @returns { void }\n */\n const handleSuccessServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n setTimeout(() => {\n hideModalDialog();\n }, 900);\n\n isRunning && setIsRunning(false);\n clearTotalCompletedItems();\n\n onSuccessCallback?.();\n });\n\n showMessage(\n `${\n totalCompletedItems.current\n } submissions have been ${convertPresentVerbToPastVerb(\n updateActionRef.current\n )}`,\n 'success'\n );\n }, [hideModalDialog, isRunning, onSuccessCallback, showMessage]);\n\n /**\n * @function handleFailedBulkActionServiceCallback\n * @returns { void }\n */\n const handleFailedBulkActionServiceCallback = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_FAILED_MODAL',\n modalProps: {\n modalTitle: `${updateActionRef.current} submission`,\n onClose: hideModalDialog,\n } as GeneralBulkActionModalInterface,\n })\n );\n\n clearTotalCompletedItems();\n\n isRunning && setIsRunning(false);\n\n onErrorCallback?.();\n });\n }, [dispatch, hideModalDialog, isRunning, onErrorCallback]);\n\n const { setIsStopped } = useChunkRequestsService(\n actionList,\n handleSuccessServiceCallback,\n handleFailedBulkActionServiceCallback\n );\n\n /**\n * @function handleStopBulkActionService\n * @returns { void }\n */\n const handleStopBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n setIsStopped(true);\n setIsRunning(false);\n hideModalDialog();\n\n clearTotalCompletedItems();\n\n onSuccessCallback?.();\n });\n\n showMessage(\n `${\n totalCompletedItems.current\n } submissions have been ${convertPresentVerbToPastVerb(\n updateActionRef.current\n )}`,\n 'success'\n );\n }, [hideModalDialog, onSuccessCallback, setIsStopped, showMessage]);\n\n /**\n * @function handleStartBulkActionService\n * @returns { void }\n */\n const handleStartBulkActionService = useCallback(() => {\n Promise.resolve().then(() => {\n dispatch(\n showModalDialog({\n modalType: 'BULK_ACTION_PROGRESS_MODAL',\n modalProps: {\n modalTitle: `${updateActionRef.current} submission`,\n onStopBulkActionService: handleStopBulkActionService,\n onClose: hideModalDialog,\n },\n })\n );\n\n setIsStopped(false);\n });\n }, [dispatch, handleStopBulkActionService, hideModalDialog, setIsStopped]);\n\n useEffect(() => {\n if (isRunning) {\n handleStartBulkActionService();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isRunning]);\n\n return useCallback((action: UpdateSubmissionStatuses) => {\n updateActionRef.current = action;\n\n setIsRunning(true);\n }, []);\n}","import { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\nimport {\n useArchiveSubmissionsApi,\n useRestoreSubmissionsApi,\n useSearchSubmissionsApi,\n} from '../../../../api';\n\nimport { SearchParams } from '../../../../constants/interfaces/filters';\nimport { SUBMISSION_TYPE } from '../../../../constants/interfaces/Reviews';\nimport {\n AccuracyTestSubmissionFilters,\n ChallengeSubmissionFilters,\n} from '../../../../constants/interfaces/SubmissionSearchFilters';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport { createSearchSubmissionsParams } from '../../tools';\nimport {\n SubmissionUpdateActions,\n UpdateSubmissionStatuses,\n} from './types';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\n\n/**\n * @function useHandleSearchSubmissionsAndUpdateStatus\n * @param { keyof typeof SUBMISSION_TYPE } scope\n * @param { UpdateSubmissionStatuses } status\n * @returns { CallableFunction }\n */\nexport const useHandleSearchSubmissionsAndUpdateStatus = (\n scope: keyof typeof SUBMISSION_TYPE,\n status: UpdateSubmissionStatuses\n) => {\n const searchSubmissionsApi = useSearchSubmissionsApi();\n const archiveSubmissionApi = useArchiveSubmissionsApi();\n const restoreSubmissionApi = useRestoreSubmissionsApi();\n const profile = useSelector(getProfileState);\n const showMessage = useShowMessage();\n\n /**\n * @param { SearchParams } searchParams\n * @param { AccuracyTestSubmissionFilters | ChallengeSubmissionFilters } filters\n * @param { Function } onSuccessCallback\n */\n return useCallback(\n async (\n searchParams: SearchParams,\n filters: AccuracyTestSubmissionFilters | ChallengeSubmissionFilters,\n onSuccessCallback: (numberOfDoneItems: number) => void\n ) => {\n const UpdateSubmissionActionList = {\n [SubmissionUpdateActions.ARCHIVE]: archiveSubmissionApi,\n [SubmissionUpdateActions.RESTORE]: restoreSubmissionApi,\n };\n\n const searchSubmissionsParams = createSearchSubmissionsParams(\n searchParams,\n profile?.companyId ?? 0,\n scope === 'SCENARIO'\n ? SUBMISSION_TYPE.SCENARIO\n : SUBMISSION_TYPE.CHALLENGE,\n filters\n );\n\n if (\n (filters as AccuracyTestSubmissionFilters)?.scenarioIds\n ?.length > 0\n ) {\n searchSubmissionsParams.scenarioId = (\n filters as AccuracyTestSubmissionFilters\n ).scenarioIds.join(',');\n }\n\n if (\n (filters as ChallengeSubmissionFilters)?.reviewStatuses\n ?.length === 1\n ) {\n searchSubmissionsParams.filterChallenge = (\n filters as ChallengeSubmissionFilters\n ).reviewStatuses[0];\n }\n\n const updateSubmissionAction = UpdateSubmissionActionList[status];\n\n await searchSubmissionsApi(searchSubmissionsParams)\n .then(async response => {\n if (!isEmpty(response.items)) {\n const submissionIds = response.items.map(\n item => item.id\n );\n\n await updateSubmissionAction(submissionIds)\n .then(() => onSuccessCallback(submissionIds.length))\n .catch((error: ErrorResult) => {\n error?.message &&\n showMessage(error.message, 'error');\n throw error;\n });\n }\n })\n .catch((error: unknown) => {\n throw error;\n });\n },\n [\n archiveSubmissionApi,\n profile?.companyId,\n restoreSubmissionApi,\n scope,\n searchSubmissionsApi,\n showMessage,\n status,\n ]\n );\n};","export const UPDATE_SUBMISSION_STATUS_ACTION =\n 'UPDATE_SUBMISSION_STATUS_ACTION';","import { FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { isEmpty as lodashIsEmpty, difference } from 'lodash';\r\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport {\r\n selectSelectedSubmissions,\r\n useSubmissionsState,\r\n useUpdatedSubmissionsState,\r\n} from '../store/states';\r\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { SubmissionV2 } from '../../../constants/interfaces/Reviews';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../constants/interfaces/filters';\r\nimport {\r\n useArchiveSubmissionsService,\r\n useCheckAllSubmissionsService,\r\n useCheckSingleSubmissionService,\r\n useRestoreSubmissionsService,\r\n useSearchChallengeSubmissionsService,\r\n} from '../store/services';\r\nimport { useSelector } from 'react-redux';\r\nimport { CHALLENGE_SUBMISSION_REVIEW_STATUS } from '../tools';\r\nimport { formatDate } from '../../../helpers/functions/date-convert';\r\nimport { useHistory } from 'react-router';\r\nimport { History } from 'history';\r\nimport ROUTES from '../../../routes/routes';\r\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\r\nimport { Challenge } from '../../../constants/interfaces/Challenge';\r\nimport {\r\n UpdatedLabelsState,\r\n useLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../../labels/store/states';\r\nimport { LoadingComponent } from '../../../ui/components/LoadingCopmonent';\r\nimport { ActionButton, ActionItem } from '../../../ui/components/ActionButton';\r\nimport { CheckPermission } from '../../permissions';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport { useHandleAccessPage } from '../../../helpers/hooks/usePagePermissions';\r\nimport { UserProfile } from '../../../constants/interfaces/User';\r\nimport { usePermissionsState } from '../../permissions/store/state';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { Popup } from '../../../ui/components/Popup';\r\nimport FilterByHandler from '../../../ui/components/Filters/FilterByHandler';\r\nimport { useSaveUserFiltersService } from '../../labels/store/services';\r\nimport { SubmissionFilters } from '../components/SubmissionFilters/SubmissionFilters';\r\nimport { Team } from '../../../constants/interfaces/Team';\r\nimport { useUpdateTeamsState } from '../../teams/store/states';\r\nimport { WithLabelsContext } from '../../portableLabels';\r\nimport { WithTeamsContext } from '../../portableTeams';\r\nimport Files from '../../../ui/icons/Files';\r\nimport {\r\n SubmissionActions,\r\n SubmissionActionsHelper,\r\n useSubmissionActionsHelper,\r\n} from '../tools';\r\nimport { useSessionEffect } from '../../common';\r\nimport SubmissionsNavigationContainer from '../components/SubmissionsNavigation';\r\nimport CheckMark from '../../../ui/icons/CheckMark';\r\nimport { getSearchState } from '../../searchState/store/reducer';\r\nimport { SEARCH_STATE } from '../../searchState/constants';\r\nimport { isEmpty } from '../../../helpers/functions/object-helpers';\r\nimport { SearchStateInterface } from '../../searchState/store/states';\r\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\r\nimport {\r\n Avatar,\r\n AvatarTile,\r\n FlexWrapper,\r\n StyledFirstTableContent,\r\n useStyles,\r\n} from './styles';\r\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\r\nimport TableTitleOverflowText from '../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\r\nimport { ChallengeSubmissionFilters } from '../../../constants/interfaces/SubmissionSearchFilters';\r\nimport { useUpdateSubmissionStatusBulkActionService } from '../services/SubmissionsBulkActionsService';\r\n\r\nconst qs = require('query-string');\r\n\r\nexport const ITEMS_PER_PAGE = 20;\r\nconst DEFAULT_REVIEW_STATUSES = [\r\n CHALLENGE_SUBMISSION_REVIEW_STATUS.NOT_REVIEWED,\r\n CHALLENGE_SUBMISSION_REVIEW_STATUS.REVIEWED,\r\n];\r\n\r\nconst ChallengeSubmissions: FC<{\r\n profile?: UserProfile;\r\n submissions?: ListResult<SubmissionV2>;\r\n challenges?: ListResult<Challenge>;\r\n practisSets?: ListResult<PractisSets>;\r\n searchSubmissions(\r\n searchParams: SearchParams,\r\n filters: ChallengeSubmissionFilters\r\n ): void;\r\n loading?: boolean;\r\n updatedSubmissions?: number[];\r\n history: History<any>;\r\n selectedLabels?: number[];\r\n onArchiveSubmission?(submissionIds: number[]): Promise<void>;\r\n onRestoreSubmission?(submissionIds: number[]): Promise<void>;\r\n selectedSubmissionIds?: number[];\r\n selectedSubmissions?: SubmissionV2[];\r\n actionsHelper: SubmissionActionsHelper;\r\n updateAllSelectedSubmissions(\r\n submissionIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n updateSelectedSubmission(submissionId: number): void;\r\n saveGlobalLabelFilters: (labels: number[] | null) => void;\r\n updatedLabels?: UpdatedLabelsState;\r\n updatedTeams?: Team;\r\n searchState: SearchStateInterface;\r\n}> = ({\r\n profile,\r\n submissions,\r\n searchSubmissions,\r\n loading,\r\n updatedSubmissions,\r\n history,\r\n selectedLabels,\r\n onArchiveSubmission,\r\n selectedSubmissionIds,\r\n selectedSubmissions,\r\n actionsHelper,\r\n updateAllSelectedSubmissions,\r\n updateSelectedSubmission,\r\n onRestoreSubmission,\r\n saveGlobalLabelFilters,\r\n searchState,\r\n}) => {\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n orderBy: {},\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n };\r\n\r\n const usableParams: SearchParams =\r\n !isEmpty(searchState) &&\r\n !!searchState.params &&\r\n searchState.key === SEARCH_STATE.SUBMISSIONS.name\r\n ? searchState.params\r\n : initialSearchParams;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setOffset,\r\n refreshSearchParams,\r\n } = useSearchParamsState(usableParams);\r\n\r\n const classes = useStyles();\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n const [labelsOpen, setLabelsOpen] = useState<number | undefined>();\r\n\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(undefined);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n const [isSelectAll, setIsSelectAll] = useState<any>(false);\r\n const initialFilters = searchParams.customFilters as ChallengeSubmissionFilters ?? {\r\n reviewStatuses: DEFAULT_REVIEW_STATUSES,\r\n showArchived: false,\r\n teamIds: [],\r\n labelIds: selectedLabels ?? [],\r\n };\r\n const [filters, setFilters] = useState<ChallengeSubmissionFilters>(initialFilters);\r\n\r\n const canAccessPage = useHandleAccessPage();\r\n\r\n const refreshData = useCallback(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchSubmissions(searchParams, filters);\r\n setLastRefreshed(new Date());\r\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchSubmissions, searchParams, filters]);\r\n\r\n /**\r\n * @function handleViewSubmissionDetails\r\n * @param { Submission } submission\r\n * @returns { void }\r\n */\r\n const handleViewSubmissionDetails = (submission: SubmissionV2) => {\r\n if (!submission) return;\r\n history.push(\r\n ROUTES.SUBMISSION_SETTINGS.CHALLENGES.SINGLE.replace(\r\n ':submissionId',\r\n submission.id?.toString()\r\n ),\r\n {\r\n useGoBack: true,\r\n submissionId: submission.id,\r\n isNew: !submission.relation.isViewed,\r\n searchParams,\r\n filters\r\n }\r\n );\r\n };\r\n\r\n const handleViewPractisSetReport = (\r\n userId: number,\r\n enrollmentId: number\r\n ) => {\r\n history.push(\r\n ROUTES.TRAINEE_DETAILS\r\n .replace(\r\n ':userId',\r\n userId.toString()\r\n )\r\n .replace(\r\n ':enrollmentId',\r\n enrollmentId.toString()\r\n ),\r\n { useGoBack: true }\r\n );\r\n };\r\n\r\n const permissions = usePermissionsState();\r\n\r\n const handleViewProfile = (userId: number) => {\r\n if (permissions.includes(NEW_PERMISSIONS.VIEW_USER_PERFORMANCE)) {\r\n history.push(\r\n ROUTES.USER_PERFORMANCE.replace(':userId', userId!.toString()),\r\n { useGoBack: true }\r\n );\r\n } else {\r\n return;\r\n }\r\n };\r\n\r\n const archiveSubmission = (submissionIds: number[]) => {\r\n if (!submissionIds || (!!submissionIds && !submissionIds.length))\r\n return;\r\n onArchiveSubmission && onArchiveSubmission(submissionIds);\r\n };\r\n\r\n const restoreSubmission = (submissionIds: number[]) => {\r\n if (!submissionIds || (!!submissionIds && !submissionIds.length))\r\n return;\r\n onRestoreSubmission && onRestoreSubmission(submissionIds);\r\n };\r\n\r\n const isCheckboxPartiallySelected =\r\n submissions &&\r\n submissions.items &&\r\n selectedSubmissionIds &&\r\n selectedSubmissionIds.length < submissions.items.length;\r\n\r\n const updateAllSubmissionsCheck = useCallback(\r\n (checked: boolean) => {\r\n const submissionIds =\r\n (submissions &&\r\n submissions.items.map((submission: SubmissionV2) =>\r\n Number(submission.id)\r\n )) ||\r\n [];\r\n updateAllSelectedSubmissions(\r\n submissionIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [submissions, isCheckboxPartiallySelected, updateAllSelectedSubmissions]\r\n );\r\n\r\n const handleSubmissionCheck = (e: any, submission: SubmissionV2) => {\r\n e.stopPropagation();\r\n if (!!submission.id) {\r\n updateSelectedSubmission(submission.id);\r\n }\r\n };\r\n\r\n const updateSubmissionStatusBulkActionService =\r\n useUpdateSubmissionStatusBulkActionService(\r\n 'CHALLENGE',\r\n searchParams,\r\n filters,\r\n submissions?.count ?? 0,\r\n refreshData\r\n );\r\n\r\n const archiveSubmissions = useCallback(() => {\r\n if (isSelectAll) {\r\n updateSubmissionStatusBulkActionService('Archive');\r\n } else {\r\n if (\r\n !selectedSubmissionIds ||\r\n (!!selectedSubmissionIds && !selectedSubmissionIds.length) ||\r\n !onArchiveSubmission\r\n ) {\r\n return;\r\n }\r\n\r\n onArchiveSubmission(selectedSubmissionIds).then((result: any) => {\r\n if (!!result) {\r\n updateAllSelectedSubmissions(\r\n selectedSubmissionIds,\r\n false,\r\n false\r\n );\r\n }\r\n });\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n selectedSubmissionIds,\r\n onArchiveSubmission,\r\n updateAllSelectedSubmissions,\r\n ]);\r\n\r\n const restoreSubmissions = useCallback(() => {\r\n if (isSelectAll) {\r\n updateSubmissionStatusBulkActionService('Restore');\r\n } else {\r\n if (\r\n !selectedSubmissionIds ||\r\n (!!selectedSubmissionIds && !selectedSubmissionIds.length) ||\r\n !onRestoreSubmission\r\n ) {\r\n return;\r\n }\r\n\r\n onRestoreSubmission(selectedSubmissionIds).then((result: any) => {\r\n if (!!result) {\r\n updateAllSelectedSubmissions(\r\n selectedSubmissionIds,\r\n false,\r\n false\r\n );\r\n }\r\n });\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n selectedSubmissionIds,\r\n onRestoreSubmission,\r\n updateAllSelectedSubmissions,\r\n ]);\r\n\r\n const handleApplyFilters = useCallback(\r\n (newFilters: ChallengeSubmissionFilters) => {\r\n saveGlobalLabelFilters(newFilters.labelIds);\r\n setFilters(newFilters);\r\n },\r\n [saveGlobalLabelFilters]\r\n );\r\n\r\n const orderBy = searchParams.orderBy;\r\n const sbFirstName = useOrderBy('user_name', orderBy, setOrderBy);\r\n const sbPractisSetName = useOrderBy('pset_name', orderBy, setOrderBy);\r\n const sbChallengeTitle = useOrderBy('challenge_title', orderBy, setOrderBy);\r\n const sbReviewedAt = useOrderBy('reviewed', orderBy, setOrderBy);\r\n const sbScore = useOrderBy('score', orderBy, setOrderBy);\r\n const sbSubmittedAt = useOrderBy('submission_date', orderBy, setOrderBy);\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const appliedFiltersCount =\r\n filters.labelIds.length +\r\n filters.teamIds.length +\r\n (filters.showArchived ? 1 : 0) +\r\n (!lodashIsEmpty(filters.reviewStatuses) \r\n ? 1\r\n : 0);\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: appliedFiltersCount,\r\n itemsCount: submissions?.items.length || 0,\r\n filtersAreAlwaysEnabled: true,\r\n });\r\n\r\n const bulkActions = useMemo(\r\n () => actionsHelper.getBulkActions(selectedSubmissions),\r\n [selectedSubmissions, actionsHelper]\r\n );\r\n\r\n useSessionEffect(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchSubmissions(searchParams, filters);\r\n }, [searchSubmissions, searchParams, filters]);\r\n\r\n useEffect(() => {\r\n if (updatedSubmissions) refreshSearchParams();\r\n }, [updatedSubmissions, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedLabels &&\r\n (selectedLabels.length !== filters.labelIds.length ||\r\n difference(selectedLabels, filters.labelIds).length > 0)\r\n ) {\r\n setFilters({\r\n ...filters,\r\n labelIds: selectedLabels,\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedLabels, setFilters]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedSubmissions?.length &&\r\n selectedSubmissions.length === submissions?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [submissions?.count, selectedSubmissions]);\r\n\r\n useEffect(() => {\r\n return () =>\r\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [submissions]);\r\n\r\n useEffect(() => {\r\n if (pageIndex > 1) {\r\n setOffset(initialOffset);\r\n } else if (pageIndex === 1) {\r\n setOffset(0);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageIndex]);\r\n\r\n useEffect(() => {\r\n canAccessPage([NEW_PERMISSIONS.LIST_SUBMISSION]);\r\n }, [canAccessPage]);\r\n\r\n /**\r\n * @function handlePageChange\r\n * @param { number } limit\r\n * @param { number } offset\r\n * @returns { void }\r\n */\r\n const handlePageChange = (offset: number) => {\r\n setOffset(offset);\r\n };\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n updateAllSubmissionsCheck(true);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n setIsSelectAll(false);\r\n updateAllSubmissionsCheck(event.target.checked);\r\n };\r\n\r\n const isMasterCheckBoxChecked =\r\n !!selectedSubmissionIds && !!selectedSubmissionIds.length;\r\n\r\n const isMasterCheckBoxDisabled =\r\n !submissions || (submissions && submissions.items.length < 1);\r\n\r\n /**\r\n * @functiononRowClick\r\n * @param { AccuracyScore } submission\r\n * @returns { void }\r\n */\r\n const onRowClick = (submission: SubmissionV2) => {\r\n handleViewSubmissionDetails(submission);\r\n };\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { Submission } submission\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (submission: SubmissionV2): boolean =>\r\n !!selectedSubmissionIds &&\r\n !!submission.id &&\r\n selectedSubmissionIds.includes(submission.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { Submission } submission\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, submission: SubmissionV2) => {\r\n setIsSelectAll(false);\r\n handleSubmissionCheck(event, submission);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { Submission } accuracyScore\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (submission: SubmissionV2): boolean => {\r\n return labelsOpen === submission.id;\r\n };\r\n\r\n return (\r\n <MainWrapper\r\n subTitle=\"Feed\"\r\n tabs={<SubmissionsNavigationContainer dataTest=\"challenges-nav\" />}\r\n hideDivider={!!selectedSubmissions?.length}\r\n htmlPageTitle=\"Feed - Practis\"\r\n dataTest=\"challenges\"\r\n >\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={submissions?.items}\r\n cornered={selectedLabels && !!selectedLabels.length}\r\n shouldHideTableDivider={!!selectedSubmissions?.length}\r\n selectedLabels={selectedLabels}\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: 'challenges-timestamp',\r\n }}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: submissions?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: handlePageChange,\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n tableStates.showNoFilterResultsState,\r\n dataTest: 'challenges-paging',\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled: tableStates.disableSearch,\r\n dataTest: 'challenges-search-input',\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedSubmissions) &&\r\n !lodashIsEmpty(submissions),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedSubmissions?.length,\r\n totalCount: submissions?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled: bulkActions.areBulkActionsDisabled(),\r\n disabledLabel: bulkActions.areItemsEmpty()\r\n ? undefined\r\n : \"Bulk actions can't be applied\",\r\n archivePermissions: bulkActions.isBulkActionVisible(\r\n SubmissionActions.ARCHIVE\r\n )\r\n ? [NEW_PERMISSIONS.ARCHIVE_SUBMISSION]\r\n : [],\r\n isArchiveDisabled: bulkActions.isBulkActionDisabled(\r\n SubmissionActions.ARCHIVE\r\n ),\r\n onArchiveSubmissionsSubmit: archiveSubmissions,\r\n restorePermissions: bulkActions.isBulkActionVisible(\r\n SubmissionActions.RESTORE\r\n )\r\n ? [NEW_PERMISSIONS.RESTORE_SUBMISSION]\r\n : [],\r\n isRestoreDisabled: bulkActions.isBulkActionDisabled(\r\n SubmissionActions.RESTORE\r\n ),\r\n onRestoreSubmissionsSubmit: restoreSubmissions,\r\n isSelectAll: isSelectAll,\r\n totalCount: submissions?.count,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <SubmissionFilters\r\n filters={filters}\r\n onSuccessApply={newFilters => {\r\n handleApplyFilters(newFilters);\r\n hide();\r\n }}\r\n />\r\n )}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n horizontalOffset={256}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={\r\n submissions\r\n ? appliedFiltersCount\r\n : 0\r\n }\r\n disabled={tableStates.disableFilters}\r\n dataTest=\"challenges-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && submissions?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: Files,\r\n text: (\r\n <>\r\n {' '}\r\n No Challenge\r\n <br />\r\n Submissions Yet\r\n </>\r\n ),\r\n dataTest: 'challenges-no-entries',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: (\r\n <>\r\n Challenge\r\n <br />\r\n Submissions\r\n </>\r\n ),\r\n dataTest: 'challenges-no-search-results',\r\n },\r\n noFilterResultsOptions: {\r\n dataTest: 'challenges-no-filter-results',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial: isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: onCheckMasterCheckbox,\r\n dataTest: 'challenges-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Users',\r\n width: 20,\r\n ...sbFirstName,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenges-users-column',\r\n },\r\n {\r\n title: 'Challenge',\r\n width: 17,\r\n ...sbChallengeTitle,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenge-column',\r\n },\r\n {\r\n title: 'Review Status',\r\n width: 12,\r\n ...sbReviewedAt,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenges-review-status-column',\r\n },\r\n {\r\n title: 'Score',\r\n width: 12,\r\n ...sbScore,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenges-score-column',\r\n },\r\n {\r\n title: 'Submitted',\r\n width: 12,\r\n ...sbSubmittedAt,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenges-submitted-column',\r\n },\r\n {\r\n title: 'Practis Set',\r\n width: 17,\r\n ...sbPractisSetName,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'challenges-practis-set-column',\r\n },\r\n {\r\n width: 2,\r\n },\r\n {\r\n width: 2,\r\n },\r\n ],\r\n rowConfig: {\r\n onRowClick: onRowClick,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n getLabelTagsProps: (submission: SubmissionV2) => ({\r\n selectedLabels: submission.userLabels || [],\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_CHALLENGE_LABEL,\r\n ],\r\n }),\r\n dataTest: 'challenges-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n getCustomFieldComponent: (\r\n submission: SubmissionV2\r\n ) => (\r\n <StyledFirstTableContent>\r\n <AvatarTile>\r\n <Avatar\r\n profile={submission.user}\r\n size=\"sm\"\r\n dataTest=\"challenges-item-user-avatar\"\r\n />\r\n <TableTitleOverflowText\r\n isCurrent={\r\n submission.user &&\r\n profile &&\r\n submission.user.id ===\r\n profile.id\r\n }\r\n isNew={\r\n !submission.relation\r\n .isViewed\r\n }\r\n dataTest=\"challenges-item-user-full-name\"\r\n >\r\n {submission.user &&\r\n submission.user.firstName +\r\n ' ' +\r\n submission.user\r\n .lastName}\r\n </TableTitleOverflowText>\r\n </AvatarTile>\r\n </StyledFirstTableContent>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n submission: SubmissionV2\r\n ) => !submission.challenge?.title,\r\n fieldProps: {\r\n isOverFlowText: true,\r\n renderTitle: (submission: SubmissionV2) =>\r\n submission.challenge?.title,\r\n dataTest: 'challenges-item-challenge',\r\n },\r\n },\r\n {\r\n fieldType: 'BADGE_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n submission: SubmissionV2\r\n ) => !submission.reviewedAt,\r\n fieldProps: {\r\n getBadgeFieldProps: (\r\n submission: SubmissionV2\r\n ) => ({\r\n status: 'ACTIVE',\r\n className: classes.customTableCellStyle,\r\n }),\r\n\r\n renderTitle: (submission: SubmissionV2) => (\r\n <FlexWrapper data-test=\"challenges-item-review-status\">\r\n <CheckMark />\r\n {formatDate(submission.reviewedAt)}\r\n </FlexWrapper>\r\n ),\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n submission: SubmissionV2\r\n ) => !submission.score,\r\n fieldProps: {\r\n renderTitle: (submission: SubmissionV2) =>\r\n submission.score,\r\n dataTest: 'challenges-item-score',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n submission: SubmissionV2\r\n ) => !submission.createdAt,\r\n fieldProps: {\r\n renderTitle: (submission: SubmissionV2) =>\r\n formatDate(submission.createdAt),\r\n dataTest: 'challenges-item-submission-date',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n submission: SubmissionV2\r\n ) => !submission.practisSet?.name,\r\n fieldProps: {\r\n isOverFlowText: true,\r\n className: classes.minWidthTableCell,\r\n renderTitle: (submission: SubmissionV2) =>\r\n submission.practisSet?.name,\r\n dataTest: 'challenges-item-practis-set',\r\n },\r\n },\r\n {\r\n fieldType: 'LABEL_TAGS',\r\n fieldProps: {\r\n getLabelTagsProps: (\r\n submission: SubmissionV2\r\n ) => ({\r\n open: labelsOpen === submission.id,\r\n toggleOpen: () =>\r\n handleToggleLabels(submission.id),\r\n selectedLabels:\r\n submission.userLabels || [],\r\n dataTest: 'challenges-item-labels',\r\n }),\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n submission: SubmissionV2\r\n ) => (\r\n <ActionButton\r\n customWidth={224}\r\n isHidden={\r\n !!selectedSubmissions?.length\r\n }\r\n dataTest=\"challenges-item-menu\"\r\n >\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_SUBMISSION,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewSubmissionDetails(\r\n submission\r\n );\r\n }}\r\n dataTest=\"view-submission-action\"\r\n >\r\n View Submission\r\n </ActionItem>\r\n </CheckPermission>\r\n\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewPractisSetReport(\r\n submission.user.id,\r\n submission.enrollmentId\r\n );\r\n }}\r\n dataTest=\"view-practis-set-report-action\"\r\n >\r\n View Practis Set Report\r\n </ActionItem>\r\n </CheckPermission>\r\n\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_USER_PERFORMANCE,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewProfile(\r\n submission.user.id\r\n );\r\n }}\r\n dataTest=\"view-profile-action\"\r\n >\r\n View Profile\r\n </ActionItem>\r\n </CheckPermission>\r\n\r\n {actionsHelper.canRestore(\r\n submission\r\n ) && (\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n restoreSubmission([\r\n submission.id,\r\n ]);\r\n }}\r\n dataTest=\"restore-action\"\r\n >\r\n Restore\r\n </ActionItem>\r\n )}\r\n {actionsHelper.canArchive(\r\n submission\r\n ) && (\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n archiveSubmission([\r\n submission.id,\r\n ]);\r\n }}\r\n dataTest=\"archive-action\"\r\n >\r\n Archive\r\n </ActionItem>\r\n )}\r\n </ActionButton>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nconst ChallengeSubmissionsContainer = () => {\r\n const history = useHistory();\r\n const profile = useSelector(getProfileState);\r\n const submissions = useSubmissionsState();\r\n const loading = useSubmissionsState().loading;\r\n const updatedSubmissions = useUpdatedSubmissionsState();\r\n\r\n const searchSubmissions = useSearchChallengeSubmissionsService();\r\n const archiveSubmissions = useArchiveSubmissionsService(false);\r\n const restoreSubmissions = useRestoreSubmissionsService(false);\r\n const updateAllSelectedSubmissions = useCheckAllSubmissionsService();\r\n const updateSelectedSubmission = useCheckSingleSubmissionService();\r\n const saveGlobalLabelFilters = useSaveUserFiltersService();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const updatedTeamsState = useUpdateTeamsState();\r\n\r\n const actionsHelper = useSubmissionActionsHelper();\r\n\r\n const labels = useLabelsState();\r\n\r\n const selectedSubmissions = useMemo(\r\n () => selectSelectedSubmissions(submissions),\r\n [submissions]\r\n );\r\n const searchState = useSelector(getSearchState);\r\n\r\n return (\r\n <WithLabelsContext.Provider value={{ reducerName: 'submissions' }}>\r\n <WithTeamsContext.Provider value={{ reducerName: 'submissions' }}>\r\n <ChallengeSubmissions\r\n profile={profile}\r\n submissions={submissions.data}\r\n challenges={submissions.submissionChallenges}\r\n practisSets={submissions.submissionPractisSets}\r\n selectedSubmissionIds={submissions.checked}\r\n selectedSubmissions={selectedSubmissions}\r\n actionsHelper={actionsHelper}\r\n loading={loading || labels.saveLoading}\r\n searchSubmissions={searchSubmissions}\r\n updatedSubmissions={updatedSubmissions.data}\r\n history={history}\r\n selectedLabels={labels.selected}\r\n onArchiveSubmission={archiveSubmissions}\r\n onRestoreSubmission={restoreSubmissions}\r\n updateAllSelectedSubmissions={updateAllSelectedSubmissions}\r\n updateSelectedSubmission={updateSelectedSubmission}\r\n saveGlobalLabelFilters={saveGlobalLabelFilters}\r\n updatedLabels={updatedLabels}\r\n updatedTeams={updatedTeamsState.data}\r\n searchState={searchState}\r\n />\r\n </WithTeamsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport default ChallengeSubmissionsContainer;","import { AppState } from '../../../../../store/reducers';\n\nexport type Scope = typeof DEFAULT_SCENARIOS_SCOPE | string;\n\nexport const DEFAULT_SCENARIOS_SCOPE = 'primary';\n\nexport const WithScenarioScopes: Partial<Record<keyof AppState, Scope[]>> = {\n accuracyscore: ['assignFilters']\n};\n","import { createContext } from 'react';\n\nimport { AppState } from '../../../../../../store/reducers';\nimport { DEFAULT_SCENARIOS_SCOPE, Scope } from '../scopes';\n\nexport type WithScenariosContextProps<T = keyof AppState, K = Scope> = {\n reducerName?: T;\n scope?: K;\n};\n\nexport const WithScenariosContext = createContext<WithScenariosContextProps>({\n reducerName: 'portableScenarios',\n scope: DEFAULT_SCENARIOS_SCOPE,\n});\n","import { useContext } from 'react';\n\nimport { WithScenariosContextProps, WithScenariosContext } from './context';\n\nexport const useWithScenariosContext = (): WithScenariosContextProps => {\n const context = useContext(WithScenariosContext);\n\n if (!context) {\n throw new Error(\n 'Cannot find WithTeams context provider. Please make a sure that you are located on the children of WithTeamsProvider'\n );\n }\n return context;\n};\n","import { useDispatch } from 'react-redux';\nimport { useCallback } from 'react';\n\nimport { useWithScenariosContext } from '../context/useWithTeamsContext';\nimport { encapsulateAction } from '../../../../../../store/helpers/encapsulateAction';\nimport { ActionScenario } from '../actions';\nimport { DEFAULT_SCENARIOS_SCOPE, Scope, WithScenarioScopes } from '../scopes';\n\nexport const useEncapsulatedDispatch = () => {\n const dispatch = useDispatch();\n const { reducerName, scope } = useWithScenariosContext();\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithScenariosContext.Provider props'\n );\n }\n\n const targetScope = (scope || DEFAULT_SCENARIOS_SCOPE) as Scope;\n if (\n targetScope !== DEFAULT_SCENARIOS_SCOPE &&\n !WithScenarioScopes[reducerName]?.includes(targetScope)\n ) {\n throw new Error(\n `Undefined \"${targetScope}\" scope of portableTeams. Please check config (WithScenarioScopes) for \"${reducerName}\" reducer`\n );\n }\n\n return useCallback(\n <T extends ActionScenario>(action: T) => {\n action._scope = targetScope;\n dispatch(encapsulateAction(`accuracyscore/scenarios/`, action));\n },\n [dispatch, targetScope]\n );\n};\n","import { useCallback } from 'react';\n\nimport { useSearchScenariosApi } from '../../../../../api';\nimport {\n clearAction,\n saveAction,\n searchFailureAction,\n searchSuccessAction,\n clearPortableScenariosAction,\n selectAllAction,\n deselectAllAction,\n selectScenariosAction,\n searchStartAction,\n resetSelectedAction,\n resetAction,\n selectMultipleScenariosAction,\n} from './actions';\n\nimport { useEncapsulatedDispatch } from './helpers/useEncapsulatedDispatch';\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\nimport { useDispatch } from 'react-redux';\nimport { createSearchLibraryParams } from '../../../../library/tools';\n\nexport const useSearchScenariosService = (\n initialSearchParams?: SearchParams\n) => {\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const searchScenarios = useSearchScenariosApi();\n\n return useCallback(\n (searchParams: SearchParams) => {\n const searchScenariosParams = createSearchLibraryParams(\n initialSearchParams || searchParams\n );\n\n dispatch(searchStartAction());\n\n return searchScenarios(searchScenariosParams)\n .then(data => {\n dispatch(searchSuccessAction(data));\n return data;\n })\n .catch((e: ErrorResult) => {\n dispatch(searchFailureAction(e.message));\n showMessage(e.message, 'error');\n });\n },\n [dispatch, searchScenarios, initialSearchParams, showMessage]\n );\n};\n\n/**\n * @function useClearPortableScenarios\n * @returns { CallableFunction }\n */\nexport const useClearPortableScenarios = () => {\n const dispatch = useDispatch();\n\n /**\n * @function callback\n * @returns { void }\n */\n return useCallback(() => {\n dispatch(clearPortableScenariosAction());\n }, [dispatch]);\n}\n\nexport const useClearTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(clearAction());\n }, [dispatch]);\n};\n\nexport const useSaveScenarios = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(saveAction());\n }, [dispatch]);\n};\n\nexport const useSelectTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n return useCallback(\n (ids: number) => {\n dispatch(selectScenariosAction(ids));\n },\n [dispatch]\n );\n};\n\nexport const useSelectMultipleTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n return useCallback(\n (ids: number[]) => {\n \n dispatch(selectMultipleScenariosAction(ids));\n },\n [dispatch]\n );\n};\n\nexport const useSelectAllTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n \n return useCallback(\n (processedTeams: number[]) => {\n \n dispatch(selectAllAction(processedTeams));\n },\n [dispatch]\n );\n};\n\nexport const useDeselectAllScenarios = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(deselectAllAction());\n }, [dispatch]);\n};\n\nexport const useResetSelectedTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(resetSelectedAction());\n }, [dispatch]);\n};\n\nexport const useResetTeams = () => {\n const dispatch = useEncapsulatedDispatch();\n\n return useCallback(() => {\n dispatch(resetAction());\n }, [dispatch]);\n};\n","import { Action } from 'redux';\n\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { Scope } from './scopes';\nimport { Scenario } from '../../../../../constants/interfaces/Scenario';\n\n//region Types\ntype ReturnTypeScenarioAction<T extends (...args: any) => any> = ReturnType<T> &\n ActionPayload;\n\ntype ActionPayload = { _scope?: Scope };\n\nexport type ActionScenario<T = any> = Action<T> & ActionPayload;\n\nexport type Actions =\n | ReturnTypeScenarioAction<typeof selectAllAction>\n | ReturnTypeScenarioAction<typeof deselectAllAction>\n | ReturnTypeScenarioAction<typeof resetSelectedAction>\n | ReturnTypeScenarioAction<typeof selectScenariosAction>\n | ReturnTypeScenarioAction<typeof selectMultipleScenariosAction>\n | ReturnTypeScenarioAction<typeof clearAction>\n | ReturnTypeScenarioAction<typeof saveAction>\n | ReturnTypeScenarioAction<typeof resetAction>;\n\n//endregion\n\nexport const searchStartAction = (): ActionScenario<'searchStartScenarios'> => ({\n type: 'searchStartScenarios',\n});\n\nexport const searchSuccessAction = (\n result: ListResult<Scenario>\n): ActionScenario<'searchSuccessScenarios'> & {\n result: ListResult<Scenario>;\n} => ({\n type: 'searchSuccessScenarios',\n result,\n});\n\nexport const searchFailureAction = (\n message: string\n): ActionScenario<'searchFailureScenarios'> & { message: string } => ({\n type: 'searchFailureScenarios',\n message,\n});\n\nexport const clearPortableScenariosAction = (): ActionScenario<'clearPortableScenarios'> => ({\n type: 'clearPortableScenarios',\n});\n\nexport const selectAllAction = (\n allScenarios: number[]\n): ActionScenario<'selectAllScenarios'> & { allScenarios: number[] } => ({\n type: 'selectAllScenarios',\n allScenarios,\n});\n\nexport const deselectAllAction = (): ActionScenario<'deselectAllScenarios'> => ({\n type: 'deselectAllScenarios',\n});\n\nexport const resetSelectedAction = (): ActionScenario<'resetSelectedScenarios'> => ({\n type: 'resetSelectedScenarios',\n});\n\nexport const selectScenariosAction = (\n id: number\n): ActionScenario<'selectScenarios'> & { id: number } => ({\n type: 'selectScenarios',\n id,\n});\n\nexport const selectMultipleScenariosAction = (\n ids: number[]\n): ActionScenario<'selectMultipleScenarios'> & { ids: number[] } => ({\n type: 'selectMultipleScenarios',\n ids,\n});\n\nexport const clearAction = (): ActionScenario<'clearScenarios'> => ({\n type: 'clearScenarios',\n});\n\nexport const saveAction = (): ActionScenario<'saveScenarios'> => ({\n type: 'saveScenarios',\n});\n\nexport const resetAction = (): ActionScenario<'resetScenarios'> => ({\n type: 'resetScenarios',\n});\n","import { useSelector } from 'react-redux';\n\nimport { useWithScenariosContext } from './context/useWithTeamsContext';\nimport { ScenariosState } from './reducer';\nimport { DEFAULT_LABELS_SCOPE } from '../../../../portableLabels/store/hors/withLabels/scopes';\n\nexport const useScenariosState = (): ScenariosState => {\n const { reducerName, scope } = useWithScenariosContext();\n const appState = useSelector(state => state);\n\n if (reducerName === undefined) {\n throw new Error(\n '`Reducer name` cannot be an `undefined`. Please check WithTeamsContext.Provider props'\n );\n }\n\n const labelsState: ScenariosState | undefined =\n // @ts-ignore\n // TODO implement `_teams?: TeamsState` field into each reducer (create general type)\n // interface GeneralReducer {\n // ...\n // _teams?: StateWithTeams;\n // }\n appState['accuracyscore']?._scenarios?.[scope || DEFAULT_LABELS_SCOPE];\n // appState[reducerName].data.items;\n // console.log(appState)\n \n if (!labelsState) {\n throw new Error(\n `Wrap your reducer ${reducerName} via \"withScenariosReducer\" HOR`\n );\n }\n\n return labelsState;\n};\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\n\nimport Checkbox from '../../../ui/components/Checkbox';\nimport { handleToggleSelectedItems } from '../../../pages/ActionPages/NewUser/tools';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\n\nconst StyledTeamsList = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst TopSideList = styled.span``;\n\nconst GeneralList = styled.span``;\n\nconst TeamsItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n`;\n\n\nconst TeamsItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n cursor: ${props => props.disabled ? `default` : `pointer`};\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;\nexport const PortableScenariosList: FC<{\n teams?: Scenario[];\n selectedTeams: number[];\n disabled?: boolean;\n showDefaultMembers?: boolean\n setTeamFilters?: (teamIds: number[]) => void;\n}> = ({ teams, selectedTeams, showDefaultMembers, setTeamFilters }) => {\n const isChecked = useCallback(\n (setId?: number) => {\n return !!selectedTeams && !!setId && selectedTeams.includes(setId);\n },\n [selectedTeams]\n );\n\n\n\n const isPartiallyChecked = useCallback(\n (teamId?: number) => {\n return (\n !!selectedTeams &&\n !!teamId &&\n selectedTeams.includes(-Number(teamId))\n );\n },\n [selectedTeams]\n );\n\n const changeHandler = (teamId?: number) => {\n if (teamId && setTeamFilters) { \n setTeamFilters(handleToggleSelectedItems(selectedTeams, teamId));\n \n }\n };\n\n if (!teams || (teams && teams.length === 0)) return null;\n \n const topListScenarios = teams.filter(\n team => (team.id && selectedTeams.map(id => Math.abs(id)).includes(team.id))\n );\n\n const bottomListScenarios = teams.filter(\n team => team.id && !selectedTeams.map(id => Math.abs(id)).includes(team.id)\n );\n\n const processedTopListTeams = topListScenarios;\n\n \n return (\n <StyledTeamsList>\n {topListScenarios.length > 0 && (\n <TopSideList>\n {processedTopListTeams.map(team => {\n return (\n <TeamsItemWrapper key={team.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(team.id) ||\n isPartiallyChecked(team.id)\n }\n partial={isPartiallyChecked(team.id)}\n handleChange={() =>\n changeHandler(team.id)\n }\n />\n <TeamsItem\n onClick={() => changeHandler(team.id)}\n >\n {team.title}\n </TeamsItem>\n </TeamsItemWrapper>\n );\n })}\n {topListScenarios.length < teams.length && <TableDivider width=\"98%\" />}\n </TopSideList>\n )}\n <GeneralList>\n {bottomListScenarios.map(team => {\n return (\n <TeamsItemWrapper key={team.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(team.id) ||\n isPartiallyChecked(team.id)\n }\n partial={isPartiallyChecked(team.id)}\n handleChange={() => changeHandler(team.id)}\n />\n <TeamsItem onClick={() => changeHandler(team.id)}>\n {team.title}\n </TeamsItem>\n </TeamsItemWrapper>\n );\n })}\n </GeneralList>\n </StyledTeamsList>\n );\n};","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport EmptyBox from '../../../ui/icons/EmptyBox';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\n\nconst StyledEmptyScenarios = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyScenariosContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst IconWrapper = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoTeamsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyScenarios: FC<{ loading?: boolean; isEmpty?: boolean }> = ({\n loading,\n isEmpty,\n}) => {\n if (loading) {\n return (\n <StyledEmptyScenarios>\n <Loading />\n </StyledEmptyScenarios>\n );\n }\n\n return (\n <StyledEmptyScenarios>\n <StyledEmptyScenariosContent>\n <IconWrapper data-test={isEmpty ? 'no-scenarios-icon' : 'no-scenarios-found-icon'}>\n {isEmpty ? <EmptyBox /> : <NoSearchResult />}\n </IconWrapper>\n <NoTeamsTitle data-test={isEmpty ? 'no-scenarios-text' : 'no-scenarios-found-text'}>\n {isEmpty ? 'No Scenarios yet' : 'No Scenarios found'}\n </NoTeamsTitle>\n </StyledEmptyScenariosContent>\n </StyledEmptyScenarios>\n );\n};\n\nexport default EmptyScenarios;\n","import { FC, useCallback, useMemo, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { PortableScenariosList } from './PortableScenariosList';\nimport { Button } from '../../../ui/components/Button';\nimport { Variables } from '../../../theme/variables';\nimport EmptyScenarios from './EmptyScenarios';\nimport { sortBy } from 'lodash';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\n\n//region Types\ntype Action = 'clear' | 'select';\n\nexport type PortableScenariosProps = {\n teams?: ListResult<Scenario>;\n selectedList: number[];\n onSave?: () => void;\n onSelectAll?: (processedTeams: number[]) => void;\n onDeselectAll?: () => void;\n onClearSelected?: () => void;\n onSetSelected?: (teamIds: number[]) => void;\n filtersTitle?: string;\n disabled?: boolean;\n loading?: boolean;\n showSelectActions?: boolean;\n showSearch?: boolean;\n showSave?: boolean;\n showDefaultMembers?: boolean;\n};\n//endregion\n\n//region Styles\nconst StyledCreateTeams = styled.div`\n flex: 1;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst CreateTeamsBody = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst FiltersHeader = styled.div`\n padding: 0 16px;\n display: flex;\n justify-content: space-between;\n height: 24px;\n align-items: center;\n margin-bottom: 8px;\n flex-shrink: 0;\n`;\n\nconst FiltersSavePanel = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n`;\n\nconst SelectActions = styled.div`\n font-size: 11px;\n font-weight: 500;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n margin-bottom: 8px;\n`;\n\nconst PlainAction = styled.span<{\n disabled?: boolean;\n color: string;\n colorHover: string;\n colorActive: string;\n}>`\n cursor: pointer;\n user-select: none;\n\n ${props =>\n props.disabled\n ? css`\n color: ${props.theme.Colors.cloudyBlue};\n pointer-events: none;\n `\n : css`\n color: ${props.color};\n `}\n\n &:hover {\n color: ${({ colorHover }) => colorHover};\n }\n &:active {\n color: ${({ colorActive }) => colorActive};\n }\n &:not(:last-of-type) {\n margin-right: 8px;\n }\n`;\n\nconst SelectedCaption = styled.span`\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst FilterTitle = styled.p`\n margin: 0;\n font-size: 13px;\n color: ${props => props.theme.Colors.black};\n font-weight: 600;\n`;\n\nconst SearchWrapper = styled.div`\n margin-bottom: 16px;\n`;\n\nconst StyledPlainActionsWrapper = styled.div`\n padding-right: 15px;\n`;\n//endregion\n\nconst PortableScenarios: FC<PortableScenariosProps> = ({\n teams,\n selectedList,\n disabled,\n loading,\n onSave,\n onClearSelected,\n onDeselectAll,\n onSelectAll,\n onSetSelected,\n filtersTitle,\n showSelectActions,\n showSearch,\n showDefaultMembers,\n showSave = true,\n}) => {\n const actionConfig: Record<\n Action,\n {\n color: string;\n colorHover: string;\n colorActive: string;\n }\n > = {\n clear: {\n color: Variables.Colors.darkSkyBlue,\n colorHover: Variables.Colors.lightBlue,\n colorActive: Variables.Colors.windowsBlue,\n },\n select: {\n color: Variables.Colors.darkSkyBlue,\n colorHover: Variables.Colors.lightBlue,\n colorActive: Variables.Colors.windowsBlue,\n },\n };\n\n const clearHandler = useCallback(() => {\n onClearSelected?.();\n }, [onClearSelected]);\n\n const [processedSelectedList, setProcessedSelectedList] = useState<\n number[]\n >([]);\n\n const [searchTerm, setSearchTerm] = useState<string | undefined>(undefined);\n const searchHandler = (value: string) => setSearchTerm(value);\n const [, setAllSelected] = useState<boolean>(false);\n \n const processedTeams = useMemo(() => {\n let result = teams?.items || [];\n if (!!searchTerm) {\n result = result.filter(\n item =>\n item.title\n .toLowerCase()\n .indexOf(searchTerm.toLowerCase()) !== -1\n );\n }\n if (result.length > 0) {\n result = sortBy(result, t => t.title?.toLowerCase());\n const processedDataIds = result.map(item => item.id!); \n \n setProcessedSelectedList(\n selectedList.filter(item =>\n processedDataIds.includes(Math.abs(item))\n )\n );\n }\n return result;\n }, [teams?.items, searchTerm, selectedList]);\n\n const isAllSelected = useMemo(\n () => selectedList && selectedList.length === teams?.items?.length,\n [selectedList, teams]\n );\n\n //TODO: [MM]: Refactor: Use `deSelectAllHandler` either for both `Select All` and `Unselect All` buttons and delete `clearHandler`\n //or rename confusing `deSelectAllHandler` to `handleClickSelectAll` and get rid of `if (isAllSelected && onDeselectAll` statement.\n const toggleAllHandler = useCallback(() => {\n if (isAllSelected && onDeselectAll) {\n onDeselectAll();\n setAllSelected(false)\n } else if (onSelectAll) {\n setAllSelected(true)\n onSelectAll(processedTeams.map(item => item.id!));\n }\n }, [onDeselectAll, onSelectAll, isAllSelected, processedTeams]);\n\n\n const showNoItems = !teams?.count;\n const showEmptyState = !processedTeams.length || loading;\n const selectedTeamsLength = processedSelectedList.filter(id => id > 0)\n .length;\n \n return (\n <StyledCreateTeams>\n <CreateTeamsBody>\n {filtersTitle && (\n <FiltersHeader>\n <FilterTitle>{filtersTitle}</FilterTitle>\n </FiltersHeader>\n )}\n {showSearch && (\n <SearchWrapper>\n <TableSearchInput\n onChange={searchHandler}\n disabled={showNoItems}\n dataTest=\"scenarios-search\"\n />\n </SearchWrapper>\n )}\n {showSelectActions && !showNoItems && (\n <SelectActions>\n <div>\n <SelectedCaption data-test=\"scenarios-selected-text\">\n {selectedTeamsLength > 0\n ? `${selectedTeamsLength} ${selectedTeamsLength > 1\n ? ' Scenarios selected'\n : ' Scenario selected'\n }`\n : 'No Scenarios selected'}\n </SelectedCaption>\n </div>\n <StyledPlainActionsWrapper>\n {isAllSelected ? (\n <PlainAction\n disabled={\n selectedList.length === 0 ||\n showEmptyState\n }\n color={actionConfig.clear.color}\n colorActive={actionConfig.clear.colorActive}\n colorHover={actionConfig.clear.colorHover}\n onClick={clearHandler}\n data-test=\"scenarios-unselect-all\"\n >\n Unselect All\n </PlainAction>\n ) : (\n <PlainAction\n disabled={showEmptyState}\n color={actionConfig.select.color}\n colorActive={\n actionConfig.select.colorActive\n }\n colorHover={actionConfig.select.colorHover}\n onClick={toggleAllHandler}\n data-test=\"scenarios-select-all\"\n >\n Select All\n </PlainAction>\n )}\n </StyledPlainActionsWrapper>\n </SelectActions>\n )}\n {showEmptyState ? (\n <EmptyScenarios\n loading={loading}\n isEmpty={!teams?.count}\n />\n ) : (\n <>\n <PortableScenariosList\n showDefaultMembers={showDefaultMembers}\n teams={processedTeams}\n selectedTeams={selectedList}\n disabled={disabled}\n setTeamFilters={onSetSelected}\n />\n {onSave && showSave && (\n <FiltersSavePanel>\n <Button\n type={'button'}\n label={'Save'}\n action={() => onSave()}\n height={'48px'}\n width={'160px'}\n dataTest=\"scenarios-save\"\n />\n </FiltersSavePanel>\n )}\n </>\n )}\n </CreateTeamsBody>\n </StyledCreateTeams>\n );\n};\n\nexport { PortableScenarios };\n\n","import { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { useSelector } from 'react-redux';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\n\ntype PortableScenariosBaseState = {\n data: ListResult<Scenario>;\n loading: boolean;\n};\n\nexport type PortableScenariosState = PortableScenariosBaseState;\n\nexport const initialState = {\n data: {\n items: [],\n limit: 0,\n offset: 0,\n numberOfPages: 0,\n count: 0,\n lastUpdated: undefined,\n },\n loading: false,\n};\n\nexport const usePortableScenariosState = (): PortableScenariosBaseState => {\n const appState = useSelector(state => state);\n return appState.portableScenarios;\n};\n","import { FC, useEffect } from 'react';\n\nimport {\n useClearTeams,\n useDeselectAllScenarios,\n useResetSelectedTeams,\n useSaveScenarios,\n useSearchScenariosService,\n useSelectAllTeams,\n useSelectMultipleTeams,\n} from '../store/hors/withTeams/services';\nimport { useScenariosState } from '../store/hors/withTeams/states';\nimport { PortableScenarios, PortableScenariosProps } from './PortableScenarios';\nimport { usePortableScenariosState } from '../store/states';\nimport { LIBRARY_STATUS } from '../../library/tools';\n\ntype Props = Pick<\n PortableScenariosProps,\n | 'filtersTitle'\n | 'onSetSelected'\n | 'showSelectActions'\n | 'showSearch'\n | 'showSave'\n> & {\n fetchOnMount?: boolean;\n resetSelectedOnUnmount?: boolean;\n showDefaultMembers?: boolean;\n selectedTeams?: number[];\n};\n\nconst initialSearchParams: any = {\n searchTerm: '',\n labelIDs: [],\n filters: [{ field: 'status', value: [LIBRARY_STATUS.ACTIVE] }],\n orderBy: {\n field: 'title',\n asc: false,\n },\n limit: 100,\n offset: 0,\n};\n\nexport const PortableScenariosWithStore: FC<Props> = ({\n onSetSelected,\n selectedTeams,\n fetchOnMount = true,\n resetSelectedOnUnmount = true,\n showDefaultMembers,\n ...rest\n}) => {\n const search = useSearchScenariosService();\n const { selected } = useScenariosState();\n const { data, loading } = usePortableScenariosState();\n const clearHandler = useClearTeams();\n const saveHandler = useSaveScenarios();\n const select = useSelectMultipleTeams();\n const selectAll = useSelectAllTeams();\n const deselectAll = useDeselectAllScenarios();\n const resetSelected = useResetSelectedTeams();\n\n useEffect(() => {\n if (fetchOnMount && !data.items.length) {\n search(initialSearchParams);\n }\n\n return () => {\n if (resetSelectedOnUnmount) {\n resetSelected();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n \n useEffect(() => {\n if (selectedTeams) {\n selectAll(selectedTeams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <PortableScenarios\n teams={data}\n selectedList={selected}\n loading={loading}\n onClearSelected={() => {\n onSetSelected && onSetSelected([]);\n clearHandler();\n }}\n onSave={saveHandler}\n onSetSelected={(team) => { \n onSetSelected && onSetSelected(team);\n select(team);\n }}\n showDefaultMembers={showDefaultMembers}\n onSelectAll={(teams) => { \n onSetSelected && onSetSelected(teams);\n selectAll(teams);\n }}\n onDeselectAll={deselectAll}\n {...rest}\n />\n );\n};\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState\n} from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../theme/variables';\nimport { Button } from '../../../../ui/components/Button';\nimport { Fieldset } from '../../../../ui/components/Fieldset';\nimport Checkbox from '../../../../ui/components/Checkbox';\nimport { PortableLabelsWithStore } from '../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../portableLabels/store/hors/withLabels/services';\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\nimport { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\nimport { PortableTeamsWithStore } from '../../../portableTeams';\nimport { useTeamsState } from '../../../portableTeams/store/hors/withTeams/states';\nimport {\n useDeselectAllTeams,\n useSaveTeams,\n} from '../../../portableTeams/store/hors/withTeams/services';\nimport { PortableScenariosWithStore } from '../../../portableScenarios';\nimport { useScenariosState } from '../../../portableScenarios/store/hors/withTeams/states';\nimport { useDeselectAllScenarios, useSaveScenarios } from '../../../portableScenarios/store/hors/withTeams/services';\nimport { AccuracyTestSubmissionFilters } from '../../../../constants/interfaces/SubmissionSearchFilters';\n\n//region Styles\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n background-color: inherit;\n`;\n\nconst StatusItem = styled.div`\n margin-bottom: 8px;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n//endregion\n\nexport const AccuracyTestsFilters: FC<{\n filters: AccuracyTestSubmissionFilters;\n onSuccessApply: (filters: AccuracyTestSubmissionFilters) => void;\n}> = ({\n filters,\n onSuccessApply,\n}) => {\n const labels = useLabelsState();\n const teams = useTeamsState();\n const scenarios = useScenariosState();\n \n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n const saveTeams = useSaveTeams();\n const saveScenarios = useSaveScenarios();\n \n const [showArchived, setShowArchived] = useState<boolean | undefined>();\n const ifPreselectedLabelsChanged = useIfChanged(filters.labelIds);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(filters.labelIds);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n filters.labelIds,\n saveLabels,\n selectLabels,\n ]);\n\n const onApplyHandler = useCallback(() => {\n saveLabels();\n saveTeams();\n saveScenarios();\n onSuccessApply({\n showArchived: showArchived ?? filters.showArchived,\n labelIds: labels.selected,\n teamIds: teams.selected,\n scenarioIds: scenarios.selected\n });\n }, [\n saveLabels,\n saveTeams,\n saveScenarios,\n showArchived,\n labels.selected,\n teams.selected,\n scenarios.selected,\n onSuccessApply,\n filters\n ]);\n\n const totalFiltersSelected =\n labels &&\n teams.selected.length + scenarios.selected.length +\n labels.selected.filter(id => id > 0).length +\n ((showArchived ?? filters.showArchived) ? 1 : 0);\n\n const deselectTeams = useDeselectAllTeams();\n const deselectLabels = useDeselectAllLabels();\n const deselectScenarios = useDeselectAllScenarios();\n\n const onClearHandler = () => {\n setShowArchived(false);\n deselectTeams();\n deselectLabels();\n deselectScenarios();\n };\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Status'} dataTest=\"status-section-title\">\n <StatusContainer>\n <StatusItem data-test=\"status-item-container\">\n <Checkbox\n checked={showArchived ?? filters.showArchived}\n handleChange={e => {\n setShowArchived(e.target.checked);\n }}\n label=\"Archived\"\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest=\"archived-checkbox\"\n />\n </StatusItem>\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Scenarios'} dataTest=\"scenarios-section-title\">\n <TeamsContainer>\n <PortableScenariosWithStore\n showSearch\n showSelectActions\n showSave={false}\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant={'inverse'}\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={onApplyHandler}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Accuracy = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 49 48\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M3.5 4.7a1.8 1.8 0 1 0 0 3.6h4.999v15.011c-2.97 1.973-4.64 5.305-4.63 9.002v9.137a1.8 1.8 0 0 0 1.544 1.782l.427.062h.001l.008.001c1.405.204 2.787.405 4.38.405 1.507 0 2.832-.188 4.147-.374l.008-.001.65-.092a1.8 1.8 0 0 0 1.555-1.783v-8.92c0-.394-.019-.785-.057-1.172a35.32 35.32 0 0 0 23.311-1.934 1.8 1.8 0 0 0 1.066-1.644V8.3h5.87a1.8 1.8 0 0 0 0-3.6H3.5zm11.822 22.545c-.762-1.457-1.85-2.71-3.223-3.63V16.26h25.21v10.33a31.718 31.718 0 0 1-21.987.655zm1.174 3.794zM8.8 23.119h-.001V8 23.12zm-.001.355zm-.3.2c-2.776 1.926-4.34 5.104-4.33 8.638v9.138a1.5 1.5 0 0 0 1.287 1.485l.427.062c.706.102 1.4.203 2.114.279-.714-.076-1.407-.177-2.112-.279l-.428-.062A1.5 1.5 0 0 1 4.17 41.45v-9.138c-.01-3.533 1.553-6.711 4.329-8.637v-.001zm15.361 5.485a32.019 32.019 0 0 0 13.749-2.367V15.96v10.832a32.021 32.021 0 0 1-13.749 2.367zM46.871 5.003A1.524 1.524 0 0 0 46.78 5H3.5h43.28l.091.003zM37.31 12.66h-25.21V8.3h25.21v4.36zm-25.51.3h25.81V8v4.96h-25.81zm-1.726 13.277c1.956 1.214 3.216 3.535 3.216 6.293v7.615c-1.061.146-1.998.255-3.06.255a16.177 16.177 0 0 1 .001 0c1.062 0 1.998-.108 3.06-.255V32.53c0-2.758-1.26-5.08-3.216-6.294zM7.47 32.305c-.007-2.392.97-4.417 2.617-5.703 1.76 1.18 2.903 3.343 2.903 5.928v7.353c-.952.128-1.805.217-2.76.217-.954 0-1.812-.086-2.76-.212V32.305z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n\nexport default Accuracy;\n","import { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport { isEmpty as lodashIsEmpty, difference } from 'lodash';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport {\n useAccuracyScoreState,\n useUpdatedSubmissionsState,\n selectSelectedAccuracyScores,\n} from '../store/states';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { SubmissionV2 } from '../../../constants/interfaces/Reviews';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../constants/interfaces/filters';\nimport {\n useCheckAllAccuracyScoresService,\n useSearchAccuracyScoreService,\n useCheckSingleAccuracyScoreService,\n useArchiveSubmissionsService,\n useRestoreSubmissionsService,\n} from '../store/services';\nimport { useSelector } from 'react-redux';\nimport { AccuracyScoreActionsHelper } from '../tools';\nimport styled from 'styled-components';\nimport { formatDate } from '../../../helpers/functions/date-convert';\nimport { useHistory } from 'react-router';\nimport { History } from 'history';\nimport ROUTES from '../../../routes/routes';\n\nimport {\n UpdatedLabelsState,\n useLabelsState,\n useUpdatedLabelsState,\n} from '../../labels/store/states';\nimport { LoadingComponent } from '../../../ui/components/LoadingCopmonent';\nimport { ActionButton, ActionItem } from '../../../ui/components/ActionButton';\nimport { CheckPermission } from '../../permissions';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport { useHandleAccessPage } from '../../../helpers/hooks/usePagePermissions';\nimport { UserProfile } from '../../../constants/interfaces/User';\nimport { usePermissionsState } from '../../permissions/store/state';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport { Popup } from '../../../ui/components/Popup';\nimport FilterByHandler from '../../../ui/components/Filters/FilterByHandler';\nimport { useSaveUserFiltersService } from '../../labels/store/services';\nimport { Team } from '../../../constants/interfaces/Team';\nimport { useUpdateTeamsState } from '../../teams/store/states';\nimport { WithLabelsContext } from '../../portableLabels';\nimport { WithTeamsContext } from '../../portableTeams';\nimport { AccuracyScoreActions, useAccuracyScoreActionsHelper } from '../tools';\nimport { useSessionEffect } from '../../common';\nimport SubmissionsNavigationContainer from '../components/SubmissionsNavigation';\nimport { AccuracyTestsFilters } from '../components/Filters/AccuracyTestFilters';\nimport AvatarPlaceholder from '../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport Accuracy from '../../../ui/icons/Accuracy';\nimport { getSearchState } from '../../searchState/store/reducer';\nimport { isEmpty } from '../../../helpers/functions/object-helpers';\nimport { SearchStateInterface } from '../../searchState/store/states';\nimport { SEARCH_STATE } from '../../searchState/constants';\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\nimport { useStyles } from './styles';\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\nimport TableTitleOverflowText from '../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\nimport { AccuracyTestSubmissionFilters } from '../../../constants/interfaces/SubmissionSearchFilters';\nimport { useUpdateSubmissionStatusBulkActionService } from '../services/SubmissionsBulkActionsService';\nimport { useClearPortableScenarios } from '../../portableScenarios/store/hors/withTeams/services';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nconst Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n`;\n\nconst AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n\n & + span {\n transform: translateY(3px);\n display: inline-block;\n }\n`;\n\nconst StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n min-width: 200px;\n`;\n\nconst AccuracyScores: FC<{\n profile?: UserProfile;\n accuracyScores?: ListResult<SubmissionV2>;\n searchSubmissions(\n searchParams: SearchParams,\n filters: AccuracyTestSubmissionFilters\n ): void;\n loading?: boolean;\n updatedSubmissions?: number[];\n history: History<any>;\n selectedLabels?: number[];\n onArchiveSubmission?(submissionIds: number[]): Promise<void>;\n onRestoreSubmission?(submissionIds: number[]): Promise<void>;\n selectedSubmissionIds?: number[];\n selectedAccuracyScores?: SubmissionV2[];\n actionsHelper: AccuracyScoreActionsHelper;\n updateAllSelectedSubmissions(\n submissionIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedSubmission(submissionId: number): void;\n saveGlobalLabelFilters: (labels: number[] | null) => void;\n updatedLabels?: UpdatedLabelsState;\n updatedTeams?: Team;\n searchState?: SearchStateInterface;\n}> = ({\n profile,\n accuracyScores,\n searchSubmissions,\n loading,\n updatedSubmissions,\n history,\n selectedLabels,\n onArchiveSubmission,\n selectedSubmissionIds,\n selectedAccuracyScores,\n actionsHelper,\n updateAllSelectedSubmissions,\n updateSelectedSubmission,\n onRestoreSubmission,\n saveGlobalLabelFilters,\n searchState,\n}) => {\n const classes = useStyles();\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n orderBy: {},\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const useableParams: SearchParams =\n !isEmpty(searchState) &&\n !!searchState?.params &&\n searchState?.key === SEARCH_STATE.ACCURACY.name\n ? searchState?.params\n : initialSearchParams;\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setOffset,\n refreshSearchParams,\n } = useSearchParamsState(useableParams);\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [labelsOpen, setLabelsOpen] = useState<number | undefined>();\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n const initialFilters = searchParams.customFilters as AccuracyTestSubmissionFilters ?? {\n showArchived: false,\n teamIds: [],\n scenarioIds: [],\n labelIds: selectedLabels ?? [],\n };\n const [filters, setFilters] = useState<AccuracyTestSubmissionFilters>(initialFilters);\n\n const canAccessPage = useHandleAccessPage();\n const clearPortableScenarios = useClearPortableScenarios();\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const isCheckboxPartiallySelected =\n accuracyScores &&\n accuracyScores.items &&\n selectedSubmissionIds &&\n selectedSubmissionIds.length < accuracyScores.items.length;\n\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchSubmissions(searchParams, filters);\n setLastRefreshed(new Date());\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\n setIsSelectAll(false);\n }, [\n searchParams,\n initialOffset,\n searchSubmissions,\n updateAllSelectedSubmissions,\n isCheckboxPartiallySelected,\n filters,\n ]);\n\n const handleViewSubmissionDetails = (submissionId?: number | string) => {\n if (!submissionId) return;\n\n history.push(\n ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.SINGLE.replace(\n ':submissionId',\n submissionId.toString()\n ),\n {\n useGoBack: true,\n }\n );\n };\n\n const handleViewPractisSetReport = (\n userId: number,\n enrollmentId: number\n ) => {\n history.push(\n ROUTES.TRAINEE_DETAILS\n .replace(\n ':userId',\n userId.toString()\n )\n .replace(\n ':enrollmentId',\n enrollmentId.toString()\n ),\n { useGoBack: true }\n );\n };\n\n const permissions = usePermissionsState();\n\n const handleViewProfile = (userId: number) => {\n if (permissions.includes(NEW_PERMISSIONS.VIEW_USER_PERFORMANCE)) {\n history.push(\n ROUTES.USER_PERFORMANCE.replace(':userId', userId.toString()),\n { useGoBack: true }\n );\n } else {\n return;\n }\n };\n\n const archiveSubmission = (submissionIds: number[]) => {\n if (!submissionIds || (!!submissionIds && !submissionIds.length))\n return;\n\n onArchiveSubmission && onArchiveSubmission(submissionIds);\n };\n\n const restoreSubmission = (submissionIds: number[]) => {\n if (!submissionIds || (!!submissionIds && !submissionIds.length))\n return;\n onRestoreSubmission && onRestoreSubmission(submissionIds);\n };\n\n const updateAllSubmissionsCheck = useCallback(\n (checked: boolean) => {\n const submissionIds =\n (accuracyScores &&\n accuracyScores.items.map((accuracyScore: SubmissionV2) =>\n Number(accuracyScore.id)\n )) ||\n [];\n updateAllSelectedSubmissions(\n submissionIds,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [\n accuracyScores,\n isCheckboxPartiallySelected,\n updateAllSelectedSubmissions,\n ]\n );\n\n const handleSubmissionCheck = (e: any, accuracyScore: SubmissionV2) => {\n e.stopPropagation();\n if (!!accuracyScore.id) {\n updateSelectedSubmission(accuracyScore.id);\n }\n };\n const updateSubmissionStatusBulkActionService =\n useUpdateSubmissionStatusBulkActionService(\n 'SCENARIO',\n searchParams,\n filters,\n accuracyScores?.count ?? 0,\n refreshData\n );\n\n const archiveSubmissions = useCallback(() => {\n if (isSelectAll) {\n updateSubmissionStatusBulkActionService('Archive');\n } else {\n if (\n !selectedSubmissionIds ||\n (!!selectedSubmissionIds && !selectedSubmissionIds.length) ||\n !onArchiveSubmission\n ) {\n return;\n }\n\n onArchiveSubmission(selectedSubmissionIds).then((result: any) => {\n if (!!result) {\n updateAllSelectedSubmissions(\n selectedSubmissionIds,\n false,\n false\n );\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n selectedSubmissionIds,\n onArchiveSubmission,\n updateAllSelectedSubmissions,\n ]);\n\n const restoreSubmissions = useCallback(() => {\n if (isSelectAll) {\n updateSubmissionStatusBulkActionService('Restore');\n } else {\n if (\n !selectedSubmissionIds ||\n (!!selectedSubmissionIds && !selectedSubmissionIds.length) ||\n !onRestoreSubmission\n ) {\n return;\n }\n\n onRestoreSubmission(selectedSubmissionIds).then((result: any) => {\n if (!!result) {\n updateAllSelectedSubmissions(\n selectedSubmissionIds,\n false,\n false\n );\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n selectedSubmissionIds,\n onRestoreSubmission,\n updateAllSelectedSubmissions,\n ]);\n\n const handleApplyFilters = useCallback(\n (newFilters: AccuracyTestSubmissionFilters) => {\n saveGlobalLabelFilters(newFilters.labelIds);\n setFilters(newFilters);\n },\n [saveGlobalLabelFilters]\n );\n\n const orderBy = searchParams.orderBy;\n const sbFirstName = useOrderBy('user_name', orderBy, setOrderBy);\n const sbPractisSetName = useOrderBy('pset_name', orderBy, setOrderBy);\n const sbScenarioTitle = useOrderBy('scenario_title', orderBy, setOrderBy);\n const sbScore = useOrderBy('accuracy', orderBy, setOrderBy);\n const sbSubmittedAt = useOrderBy('submission_date', orderBy, setOrderBy);\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(undefined);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const appliedFiltersCount =\n filters.labelIds.length +\n filters.teamIds.length +\n filters.scenarioIds.length +\n (filters.showArchived ? 1 : 0);\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: appliedFiltersCount,\n itemsCount: accuracyScores?.items.length || 0,\n filtersAreAlwaysEnabled: true,\n });\n\n const bulkActions = useMemo(\n () => actionsHelper.getBulkActions(selectedAccuracyScores),\n [selectedAccuracyScores, actionsHelper]\n );\n\n useSessionEffect(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchSubmissions(searchParams, filters);\n }, [searchSubmissions, searchParams, filters]);\n\n useEffect(() => {\n if (updatedSubmissions) refreshSearchParams();\n }, [updatedSubmissions, refreshSearchParams]);\n\n useEffect(() => {\n if (\n selectedLabels &&\n (selectedLabels.length !== filters.labelIds.length ||\n difference(selectedLabels, filters.labelIds).length > 0)\n ) {\n setFilters({\n ...filters,\n labelIds: selectedLabels,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedLabels, setFilters]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setOffset(initialOffset);\n } else if (pageIndex === 1) {\n setOffset(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n useEffect(() => {\n return () => {\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\n clearPortableScenarios();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accuracyScores]);\n\n useEffect(() => {\n if (\n selectedAccuracyScores?.length &&\n selectedAccuracyScores.length === accuracyScores?.count\n ) {\n setIsSelectAll(true);\n }\n }, [accuracyScores?.count, selectedAccuracyScores]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_SUBMISSION]);\n }, [canAccessPage]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (offset: number) => {\n setOffset(offset);\n };\n\n /**\n * @function onClearSelection\n * @returns { void }\n */\n const onClearSelection = () => {\n updateAllSelectedSubmissions([], true, isCheckboxPartiallySelected);\n setIsSelectAll(false);\n };\n\n /**\n * @function onSelectAll\n * @returns { void }\n */\n const onSelectAll = () => {\n updateAllSubmissionsCheck(true);\n setIsSelectAll(true);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n setIsSelectAll(false);\n updateAllSubmissionsCheck(event.target.checked);\n };\n\n const isMasterCheckBoxChecked =\n !!selectedSubmissionIds && !!selectedSubmissionIds.length;\n\n const isMasterCheckBoxDisabled =\n !accuracyScores || (accuracyScores && accuracyScores.items.length < 1);\n\n /**\n * @functiononRowClick\n * @param { SubmissionV2 } accuracyScore\n * @returns { void }\n */\n const onRowClick = (accuracyScore: SubmissionV2) => {\n handleViewSubmissionDetails(accuracyScore.id);\n };\n\n /**\n * @function checkIsRowChecked\n * @param { SubmissionV2 } challenge\n * @returns { boolean }\n */\n const checkIsRowChecked = (accuracyScore: SubmissionV2): boolean =>\n !!selectedSubmissionIds &&\n !!accuracyScore.id &&\n selectedSubmissionIds.includes(accuracyScore.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { SubmissionV2 } accuracyScore\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, accuracyScore: SubmissionV2) => {\n setIsSelectAll(false);\n handleSubmissionCheck(event, accuracyScore);\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { SubmissionV2 } accuracyScore\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (accuracyScore: SubmissionV2): boolean => {\n return labelsOpen === accuracyScore.id;\n };\n\n return (\n <MainWrapper\n subTitle=\"Feed\"\n tabs={<SubmissionsNavigationContainer dataTest=\"accuracy-nav\" />}\n hideDivider={!!selectedAccuracyScores?.length}\n htmlPageTitle=\"Feed - Practis\"\n dataTest=\"accuracy\"\n >\n {loading && !isSelectAll && <LoadingComponent />}\n <TableWrapper\n tableStates={tableStates}\n data={accuracyScores?.items}\n cornered={selectedLabels && !!selectedLabels.length}\n shouldHideTableDivider={!!selectedAccuracyScores?.length}\n selectedLabels={selectedLabels}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'accuracy-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: accuracyScores?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n tableStates.showNoFilterResultsState,\n dataTest: 'accuracy-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'accuracy-search-input',\n },\n isSelectedItemOptionsVisible:\n !lodashIsEmpty(selectedAccuracyScores) &&\n !lodashIsEmpty(accuracyScores),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedAccuracyScores?.length,\n totalCount: accuracyScores?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: onClearSelection,\n onSelectAll: onSelectAll,\n bulkActionsConfig: {\n disabled: bulkActions.areBulkActionsDisabled(),\n disabledLabel: bulkActions.areItemsEmpty()\n ? undefined\n : \"Bulk actions can't be applied\",\n archivePermissions: bulkActions.isBulkActionVisible(\n AccuracyScoreActions.ARCHIVE\n )\n ? [NEW_PERMISSIONS.ARCHIVE_SUBMISSION]\n : [],\n isArchiveDisabled: bulkActions.isBulkActionDisabled(\n AccuracyScoreActions.ARCHIVE\n ),\n onArchiveSubmissionsSubmit: archiveSubmissions,\n restorePermissions: bulkActions.isBulkActionVisible(\n AccuracyScoreActions.RESTORE\n )\n ? [NEW_PERMISSIONS.RESTORE_SUBMISSION]\n : [],\n isRestoreDisabled: bulkActions.isBulkActionDisabled(\n AccuracyScoreActions.RESTORE\n ),\n onRestoreSubmissionsSubmit: restoreSubmissions,\n isSelectAll: isSelectAll,\n totalCount: accuracyScores?.count,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <AccuracyTestsFilters\n filters={filters}\n onSuccessApply={newFilters => {\n handleApplyFilters(newFilters);\n hide();\n }}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={256}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={appliedFiltersCount}\n disabled={\n // tableStates.disableFilters\n false\n }\n dataTest=\"accuracy-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && accuracyScores?.items?.length === 0,\n noEntriesOptions: {\n icon: Accuracy,\n text: 'No Accuracy Tests Yet',\n dataTest: 'accuracy-no-entries',\n },\n noSearchResultsOptions: {\n entityName: <>Accuracy Tests</>,\n dataTest: 'accuracy-no-search-results',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: isMasterCheckBoxChecked,\n disabled: isMasterCheckBoxDisabled,\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'accuracy-master-checkbox',\n },\n columns: [\n {\n title: 'Users',\n width: 24,\n ...sbFirstName,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-users-column',\n },\n {\n title: 'Accuracy Test',\n width: 14,\n ...sbScore,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-test-column',\n },\n {\n title: 'Submitted',\n width: 12,\n ...sbSubmittedAt,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-submitted-column',\n },\n {\n title: 'Scenario',\n width: 10,\n ...sbScenarioTitle,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-scenario-column',\n },\n\n {\n title: 'Practis Set',\n width: 15,\n ...sbPractisSetName,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-practis-set-column',\n },\n {\n width: 2,\n },\n {\n width: 2,\n },\n ],\n rowConfig: {\n onRowClick: onRowClick,\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (accuracyScore: SubmissionV2) => ({\n selectedLabels: accuracyScore.userLabels ?? [],\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_CHALLENGE_LABEL,\n ],\n }),\n dataTest: 'accuracy-item',\n cells: [\n {\n fieldType: 'CUSTOM_FIELD',\n cellClassName: classes.customTableCellStyle,\n getCustomFieldComponent: (\n accuracyScore: SubmissionV2\n ) => (\n <StyledFirstTableContent>\n <AvatarTile>\n <Avatar\n className=\"avatar\"\n customProfile={{\n firstName:\n accuracyScore.user\n .firstName,\n lastName:\n accuracyScore.user\n .lastName,\n picture:\n accuracyScore.user\n .imageUrl,\n status: accuracyScore.user\n .status,\n }}\n size=\"sm\"\n dataTest=\"accuracy-item-user-avatar\"\n />\n <TableTitleOverflowText\n isCurrent={\n accuracyScore.user &&\n profile &&\n accuracyScore.user.id ===\n profile.id\n }\n dataTest=\"accuracy-item-user-full-name\"\n >\n {accuracyScore.user &&\n accuracyScore.user\n .firstName +\n ' ' +\n accuracyScore.user\n .lastName}\n </TableTitleOverflowText>\n </AvatarTile>\n </StyledFirstTableContent>\n ),\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n accuracyScore: SubmissionV2\n ) => !accuracyScore.accuracy?.accuracy,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (\n accuracyScore: SubmissionV2\n ) =>\n `${Math.floor(\n accuracyScore.accuracy.accuracy *\n 100\n )}%`,\n dataTest: 'accuracy-item-score',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n accuracyScore: SubmissionV2\n ) => !accuracyScore.createdAt,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (\n accuracyScore: SubmissionV2\n ) => formatDate(accuracyScore.createdAt),\n dataTest: 'accuracy-item-submission-date',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n cellClassName: classes.minWidthTableCell,\n shouldShowEmptyCell: (\n accuracyScore: SubmissionV2\n ) => !accuracyScore.scenario?.title,\n fieldProps: {\n isOverFlowText: true,\n className: classes.minWidthTableCell,\n renderTitle: (\n accuracyScore: SubmissionV2\n ) => accuracyScore.scenario?.title,\n dataTest: 'accuracy-item-scenario',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n accuracyScore: SubmissionV2\n ) => !accuracyScore.practisSet?.name,\n fieldProps: {\n isOverFlowText: true,\n renderTitle: (\n accuracyScore: SubmissionV2\n ) => accuracyScore.practisSet?.name,\n dataTest: 'accuracy-item-practis-set',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (\n accuracyScore: SubmissionV2\n ) => ({\n open: labelsOpen === accuracyScore.id,\n toggleOpen: () =>\n handleToggleLabels(\n accuracyScore.id\n ),\n selectedLabels:\n accuracyScore.userLabels ?? [],\n dataTest: 'accuracy-item-labels',\n }),\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (\n accuracyScore: SubmissionV2\n ) => (\n <ActionButton\n customWidth={224}\n isHidden={\n !!selectedAccuracyScores?.length\n }\n dataTest=\"accuracy-item-menu\"\n >\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.VIEW_SUBMISSION,\n ]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleViewSubmissionDetails(\n accuracyScore.id\n );\n }}\n dataTest=\"view-accuracy-test-action\"\n >\n View Accuracy Test\n </ActionItem>\n </CheckPermission>\n\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT,\n ]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleViewPractisSetReport(\n accuracyScore.user\n .id,\n accuracyScore.enrollmentId\n );\n }}\n dataTest=\"view-practis-set-report-action\"\n >\n View Practis Set Report\n </ActionItem>\n </CheckPermission>\n\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.VIEW_USER_PERFORMANCE,\n ]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleViewProfile(\n accuracyScore.user\n .id\n );\n }}\n dataTest=\"view-profile-action\"\n >\n View Profile\n </ActionItem>\n </CheckPermission>\n\n {actionsHelper.canArchive(\n accuracyScore\n ) && (\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n archiveSubmission([\n accuracyScore.id,\n ]);\n }}\n dataTest=\"archive-action\"\n >\n Archive\n </ActionItem>\n )}\n {actionsHelper.canRestore(\n accuracyScore\n ) && (\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n restoreSubmission([\n accuracyScore.id,\n ]);\n }}\n dataTest=\"restore-action\"\n >\n Restore\n </ActionItem>\n )}\n </ActionButton>\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nconst AccuracyScoreContainer = () => {\n const history = useHistory();\n const profile = useSelector(getProfileState);\n const accuracyScores = useAccuracyScoreState();\n const loading = useAccuracyScoreState().loading;\n const updatedSubmissions = useUpdatedSubmissionsState();\n\n const searchAccuracyScores = useSearchAccuracyScoreService();\n const archiveSubmissions = useArchiveSubmissionsService(true);\n\n const restoreSubmissions = useRestoreSubmissionsService(true);\n const updateAllSelectedSubmissions = useCheckAllAccuracyScoresService();\n const updateSelectedSubmission = useCheckSingleAccuracyScoreService();\n\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const updatedLabels = useUpdatedLabelsState();\n const updatedTeamsState = useUpdateTeamsState();\n const actionsHelper = useAccuracyScoreActionsHelper();\n\n const labels = useLabelsState();\n const searchState = useSelector(getSearchState);\n\n const selectedAccuracyScores = useMemo(\n () => selectSelectedAccuracyScores(accuracyScores),\n [accuracyScores]\n );\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'submissions' }}>\n <WithTeamsContext.Provider value={{ reducerName: 'submissions' }}>\n <AccuracyScores\n profile={profile}\n accuracyScores={accuracyScores.data}\n selectedSubmissionIds={accuracyScores.checked}\n selectedAccuracyScores={selectedAccuracyScores}\n actionsHelper={actionsHelper}\n loading={loading || labels.saveLoading}\n searchSubmissions={searchAccuracyScores}\n updatedSubmissions={updatedSubmissions.data}\n history={history}\n selectedLabels={labels.selected}\n onArchiveSubmission={archiveSubmissions}\n onRestoreSubmission={restoreSubmissions}\n updateAllSelectedSubmissions={updateAllSelectedSubmissions}\n updateSelectedSubmission={updateSelectedSubmission}\n saveGlobalLabelFilters={saveGlobalLabelFilters}\n updatedLabels={updatedLabels}\n updatedTeams={updatedTeamsState.data}\n searchState={searchState}\n />\n </WithTeamsContext.Provider>\n </WithLabelsContext.Provider>\n );\n};\n\nexport default AccuracyScoreContainer;","import React from 'react';\nimport AccuracyTests from './AccuracyTests';\nimport Challenges from './ChallengeSubmissions';\nimport { Switch, Redirect } from 'react-router-dom';\nimport PrivateRoute from '../../../routes/PrivateRouter';\nimport ROUTES from '../../../routes/routes';\n\nconst Submissions = () => (\n <Switch>\n <Redirect\n from={ROUTES.SUBMISSIONS}\n exact\n to={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.ALL}\n />\n <PrivateRoute\n path={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL}\n component={AccuracyTests}\n />\n <PrivateRoute\n path={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL}\n component={Challenges}\n />\n </Switch>\n);\n\nexport default Submissions;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PlayIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 14 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n data-test={dataTest}\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M366.08 564L352 572 352 556z\"\n transform=\"translate(-352 -556)\"\n />\n </svg>\n );\n }\n);\n\nexport default PlayIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PauseIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"-45 0 327 327\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"m158 0h71c4.417969 0 8 3.582031 8 8v311c0 4.417969-3.582031 8-8 8h-71c-4.417969 0-8-3.582031-8-8v-311c0-4.417969 3.582031-8 8-8zm0 0\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"m8 0h71c4.417969 0 8 3.582031 8 8v311c0 4.417969-3.582031 8-8 8h-71c-4.417969 0-8-3.582031-8-8v-311c0-4.417969 3.582031-8 8-8zm0 0\"\n />\n </svg>\n );\n }\n);\n\nexport default PauseIcon;\n","import { FC } from 'react';\nimport { Slider, withStyles } from '@material-ui/core';\n\nconst CustomSlider = withStyles({\n root: {\n height: 4,\n padding: '8px 0',\n },\n rail: {\n height: 4,\n opacity: 0.18,\n borderRadius: 4,\n backgroundColor: 'var(--ps-white-1)',\n color: 'var(--ps-black)'\n },\n track: {\n height: 4,\n borderRadius: 4,\n backgroundColor: 'var(--ps-blue-main)',\n },\n thumb: {\n height: 16,\n width: 16,\n marginTop: -6,\n marginLeft: -7,\n backgroundColor: 'var(--ps-blue-main)',\n '&:focus': {\n boxShadow: `none`,\n },\n '&:hover': {\n boxShadow: `0 0 0 6px var(--ps-grey-12)`,\n },\n '&:active': {\n boxShadow: `0 0 0 8px var(--ps-grey-12)`,\n },\n },\n})(Slider);\n\nconst VideoRangeSlider: FC<{\n played: number;\n onChange(e: any, newValue: any): void;\n onMouseDown(e: any): void;\n onChangeCommitted(e: any, newValue: any): void;\n}> = ({ played, onChange, onChangeCommitted, onMouseDown }) => {\n return (\n <CustomSlider\n min={0}\n max={1}\n step={0.01}\n value={played}\n onChange={onChange}\n onChangeCommitted={onChangeCommitted}\n onMouseDown={onMouseDown}\n />\n );\n};\n\nexport default VideoRangeSlider;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const DownloadIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M351.467 192h-14.934c-.294 0-.533-.257-.533-.574v-4.592c0-.317.239-.574.533-.574.295 0 .534.257.534.574v4.018h13.866v-4.018c0-.317.24-.574.534-.574.294 0 .533.257.533.574v4.592c0 .318-.239.574-.533.574zm-7.085-4.687c-.005.006-.014.004-.02.01-.09.091-.211.148-.345.153h-.003c-.143.005-.287-.045-.396-.163l-3.197-4.014c-.21-.226-.21-.593 0-.82.21-.225.551-.225.761 0l2.285 2.87v-8.775c0-.317.239-.574.533-.574.295 0 .533.257.533.574v8.775l2.285-2.87c.21-.225.55-.225.76 0 .211.227.211.594 0 .82l-3.196 4.014z\"\n transform=\"translate(-656 -576) translate(320 400)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default DownloadIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const FullScreenIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M0 11.296l1.434-.002v2.354c0 .506.396.933.918 1.029l.114.015.124.006 3.057-.001V16H2.59c-1.308 0-2.398-.883-2.568-2.046l-.016-.153L0 13.648v-2.352zm14.566 2.352v-2.354l1.434.002v2.352c0 1.187-.972 2.178-2.252 2.332l-.169.015-.168.005h-3.058v-1.303h3.058c.557 0 1.027-.36 1.132-.834l.017-.103.006-.112zM5.647 0v1.324H2.59c-.557 0-1.028.366-1.133.848l-.017.105-.006.114v3.255L0 5.647V2.391C0 1.184.972.177 2.252.021l.169-.016L2.59 0h3.057zm7.764 0c1.307 0 2.397.897 2.567 2.08l.016.155.006.156v3.256l-1.434-.001V2.39c0-.514-.395-.949-.918-1.046l-.114-.015-.123-.006h-3.058V0h3.058z\"\n />\n </svg>\n );\n }\n);\n\nexport default FullScreenIcon;\n","import { FC } from 'react';\nimport { Slider, withStyles } from '@material-ui/core';\n\nconst CustomSlider = withStyles({\n root: {\n height: 3,\n padding: '5px 0',\n },\n rail: {\n height: 3,\n opacity: 0.18,\n borderRadius: 4,\n backgroundColor: 'var(--ps-white-1)',\n color: 'var(--ps-black)'\n },\n track: {\n height: 3,\n borderRadius: 4,\n backgroundColor: 'var(--ps-white-1)',\n },\n thumb: {\n display: 'none',\n height: 9,\n width: 9,\n marginTop: -3,\n marginLeft: -3,\n backgroundColor: 'var(--ps-blue-main)',\n '&:focus': {\n boxShadow: `none`,\n },\n '&:hover': {\n boxShadow: `0 0 0 2px var(--ps-grey-12)`,\n },\n '&:active': {\n boxShadow: `0 0 0 3px var(--ps-grey-12)`,\n },\n },\n})(Slider);\n\nconst VolumeRangeSlider: FC<{\n volume: number;\n onChange(e: any, newValue: any): void;\n onChangeCommitted(e: any, newValue: any): void;\n}> = ({ volume, onChange, onChangeCommitted }) => {\n return (\n <CustomSlider\n min={0}\n max={1}\n step={0.01}\n value={volume}\n onChange={onChange}\n onChangeCommitted={onChangeCommitted}\n />\n );\n};\n\nexport default VolumeRangeSlider;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CopyLink = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path d=\"M9.06 7.44a.498.498 0 0 1-.353-.147 2.002 2.002 0 0 0-2.828 0 .5.5 0 1 1-.707-.707 3.003 3.003 0 0 1 4.242 0 .5.5 0 0 1-.353.853zM8.707 10.292a2.99 2.99 0 0 1-2.121-.878.5.5 0 1 1 .707-.707c.78.78 2.049.78 2.828 0a.5.5 0 1 1 .707.707 2.992 2.992 0 0 1-2.12.878z\" fill=\"currentColor\"/>\n <path d=\"M10.475 9.56a.5.5 0 0 1-.354-.854l2.793-2.792a.5.5 0 1 1 .707.707l-2.793 2.793a.498.498 0 0 1-.353.147zM6.268 13.768a.5.5 0 0 1-.354-.854l1.562-1.561a.5.5 0 1 1 .707.707L6.62 13.621a.497.497 0 0 1-.353.147zM2.732 10.232a.5.5 0 0 1-.353-.854l2.793-2.792a.5.5 0 1 1 .707.707l-2.793 2.793a.5.5 0 0 1-.354.146zM8.171 4.794a.499.499 0 0 1-.354-.854L9.38 2.38a.5.5 0 0 1 .707.707L8.525 4.647a.5.5 0 0 1-.354.147z\" fill=\"currentColor\"/>\n <path d=\"M4.5 14.484a2.991 2.991 0 0 1-2.121-.863c-1.15-1.15-1.15-3.093 0-4.243a.5.5 0 1 1 .707.707c-.767.767-.767 2.063 0 2.829.766.767 2.062.767 2.828 0a.5.5 0 1 1 .707.707 2.99 2.99 0 0 1-2.121.863zM13.268 6.768a.5.5 0 0 1-.354-.853c.767-.767.767-2.063 0-2.83-.766-.766-2.062-.766-2.828 0a.5.5 0 1 1-.707-.706c1.15-1.15 3.093-1.15 4.242 0 1.15 1.15 1.15 3.092 0 4.242a.5.5 0 0 1-.353.147z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n\nexport default CopyLink;\n","import { FC } from 'react';\nimport { VolumeUp, VolumeOff } from '@material-ui/icons';\nimport styled from 'styled-components';\n\nimport PlayIcon from '../../../icons/PlayIcon';\nimport PauseIcon from '../../../icons/PauseIcon';\nimport VideoRangeSlider from '../components/VideoRangeSlider';\nimport DownloadIcon from '../..//../icons/DownloadIcon';\nimport FullScreenIcon from '../..//../icons/FullScreenIcon';\nimport VolumeRangeSlider from '../components/VolumeRangeSlider';\nimport CopyLink from '../../../icons/CopyLink';\nimport { Loading } from '../../LoadingCopmonent';\n\nconst StyledVideoPlayerControls = styled.div`\n width: 100%;\n`;\n\nconst ControlsWrapper = styled.div`\n position: absolute;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 0 24px 21px 24px;\n box-sizing: content-box;\n z-index: 10;\n`;\n\nconst Controls = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n margin-top: 4px;\n`;\n\nconst IconContainerSpacer = styled.div`\n margin: 0 8px;\n display: flex;\n align-items: center;\n`;\n\nconst VolumeRangeContainer = styled.div`\n width: 50px;\n`;\n\nconst IconContainer = styled.div<{ disabled?: boolean }>`\n height: 16px;\n width: 16px;\n color: ${props => props.theme.Colors.white};\n border-radius: 100%;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n &:hover {\n opacity: 0.9;\n box-shadow: 0 0 0 6px ${props => props.theme.Colors.hoverGray};\n background: ${props => props.theme.Colors.hoverGray};\n }\n ${props =>\n !props.disabled &&\n `\n &:active {\n opacity: 0.7;\n box-shadow: 0 0 0 8px ${props.theme.Colors.hoverGray};\n background: ${props.theme.Colors.hoverGray};\n }\n `}\n`;\n\nconst LeftControls = styled.div`\n width: 16px;\n margin-right: 18px;\n`;\n\nconst RangeControls = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nconst InfoControls = styled.div`\n display: flex;\n justify-content: space-between;\n flex: 1;\n`;\n\nconst StyledTimer = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors.white};\n width: 40px;\n display: flex;\n align-items: center;\n`;\n\nconst StyledVolume = styled.div`\n display: flex;\n`;\n\nconst StyledInfoTools = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\n\nexport const VideoPlayerControls: FC<{\n playing: boolean;\n muted: boolean;\n volume: number;\n played: number;\n elapsedTime: string;\n totalDuration?: string;\n setPlaying(): void;\n setMuted(): void;\n onRewind(): void;\n onVolumeChange(e: any, newValue: any): void;\n onVolumeSeekDown(e: any, newValue: any): void;\n onToggleFullScreen(): void;\n onSeek(e: any, newValue: any): void;\n onSeekMouseDown(e: any): void;\n onSeekMouseUp(e: any, newValue: any): void;\n onDownloadVideo?(): void;\n onCopyLink?(): void;\n videoLoading?: boolean;\n}> = ({\n playing,\n muted,\n volume,\n played,\n setPlaying,\n setMuted,\n onVolumeChange,\n onVolumeSeekDown,\n onToggleFullScreen,\n onSeek,\n onSeekMouseDown,\n onSeekMouseUp,\n onDownloadVideo,\n onCopyLink,\n videoLoading,\n elapsedTime,\n}) => {\n return (\n <StyledVideoPlayerControls>\n <ControlsWrapper\n onClick={e => {\n e.stopPropagation();\n }}\n onDoubleClick={e => {\n e.stopPropagation();\n }}\n >\n <Controls>\n <LeftControls>\n <IconContainer onClick={setPlaying}>\n {playing ? <PauseIcon /> : <PlayIcon />}\n </IconContainer>\n </LeftControls>\n <RangeControls>\n <VideoRangeSlider\n played={played}\n onChange={onSeek}\n onMouseDown={onSeekMouseDown}\n onChangeCommitted={onSeekMouseUp}\n />\n </RangeControls>\n </Controls>\n <Controls>\n <LeftControls />\n <InfoControls>\n <StyledInfoTools>\n <StyledTimer>{elapsedTime}</StyledTimer>\n <StyledVolume>\n <IconContainerSpacer>\n {muted ? (\n <IconContainer onClick={setMuted}>\n <VolumeOff fontSize={'small'} />\n </IconContainer>\n ) : (\n <IconContainer onClick={setMuted}>\n <VolumeUp fontSize={'small'} />\n </IconContainer>\n )}\n </IconContainerSpacer>\n <VolumeRangeContainer>\n <VolumeRangeSlider\n volume={volume}\n onChange={onVolumeChange}\n onChangeCommitted={onVolumeSeekDown}\n />\n </VolumeRangeContainer>\n </StyledVolume>\n </StyledInfoTools>\n <StyledInfoTools>\n {onCopyLink && (\n <IconContainerSpacer>\n <IconContainer\n onClick={onCopyLink}\n title=\"Copy link\"\n >\n <CopyLink />\n </IconContainer>\n </IconContainerSpacer>\n )}\n {onDownloadVideo && (\n <IconContainerSpacer>\n {videoLoading ? (\n <IconContainer disabled={true}>\n <Loading size={16} />\n </IconContainer>\n ) : (\n <IconContainer\n onClick={onDownloadVideo}\n title=\"Download\"\n >\n <DownloadIcon />\n </IconContainer>\n )}\n </IconContainerSpacer>\n )}\n <IconContainerSpacer>\n <IconContainer\n onClick={onToggleFullScreen}\n title=\"Full screen mode\"\n >\n <FullScreenIcon />\n </IconContainer>\n </IconContainerSpacer>\n </StyledInfoTools>\n </InfoControls>\n </Controls>\n </ControlsWrapper>\n </StyledVideoPlayerControls>\n );\n};\n","export default __webpack_public_path__ + \"static/media/no-video.a29fdc78.svg\";","import { FC, useEffect, useRef, useState } from 'react';\nimport { Box } from '@material-ui/core';\nimport ReactPlayer from 'react-player';\nimport styled from 'styled-components';\nimport screenfull from 'screenfull';\n\nimport { VideoPlayerControls } from './VideoPlayerControls';\nimport { Variables } from '../../../../theme/variables';\nimport { Loading } from '../../LoadingCopmonent';\nimport novideo from '../../../../assets/images/no-video.svg'\n\nconst formatDisplayDate = (seconds: any) => {\n if (isNaN(seconds)) {\n return '00:00';\n }\n\n const date = new Date(seconds * 1000);\n const hh = date.getUTCHours();\n const mm = date.getUTCMinutes();\n const ss = date\n .getUTCSeconds()\n .toString()\n .padStart(2, '0');\n\n if (hh) {\n return `${hh}:${mm.toString().padStart(2, '0')}:${ss}`;\n }\n\n return `${mm}:${ss}`;\n};\n\nconst ReactPlayerContainer = styled.div`\n position: relative;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n overflow: hidden;\n max-height: 421px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n max-width: 416px;\n`;\n\nconst LoadingContainer = styled.div`\n position: absolute;\n margin: 0 auto;\n left:0;\n right:0;\n width: 32px;\n z-index: 1;\n`;\n\nconst NoVideoContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n color: white;\n width: 416px;\n font-size: 13px;\n color: #b0bdc6;\n`;\n\nexport const VideoPlayer: FC<{\n url?: string;\n onDownloadVideo?(): void;\n onCopyLink?(): void;\n videoLoading?: boolean;\n className?: string;\n getDuration?(duration: number): void;\n getPlaying?(playing: boolean): void;\n muteVideo?: boolean;\n autoPlay?: boolean;\n}> = ({\n url,\n onDownloadVideo,\n onCopyLink,\n videoLoading,\n className,\n getDuration,\n getPlaying,\n muteVideo,\n autoPlay,\n}) => {\n const [showControls, setShowControls] = useState(false);\n const [state, setState] = useState({\n playing: !!autoPlay,\n muted: false,\n volume: 0.5,\n played: 0,\n playedSeconds: 0,\n });\n const [seeking, setSeeking] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n\n const { playing, muted, volume, played, playedSeconds } = state;\n\n const playerRef = useRef<any>(null);\n const playerContainerRef = useRef<any>(null);\n\n const handlePlayPause = () => {\n setState({ ...state, playing: !state.playing });\n };\n\n const handleMute = () => {\n setState({ ...state, muted: !state.muted });\n };\n\n const handleRewind = () => {\n playerRef.current.seekTo(playerRef.current.getCurrentTime() - 10);\n };\n\n const handleVolumeChange = (e: any, newValue: any) => {\n setState({\n ...state,\n volume: parseFloat(newValue),\n muted: newValue === 0,\n });\n };\n\n const handleVolumeSeekDown = (e: any, newValue: any) => {\n setState({\n ...state,\n volume: parseFloat(newValue),\n muted: newValue === 0,\n });\n };\n\n const handleToggleFullScreen = () => {\n if (screenfull.isEnabled) {\n screenfull.toggle(playerContainerRef.current);\n }\n };\n\n const handleProgress = (changeState: any) => {\n if (!seeking) {\n setState({ ...state, ...changeState });\n if (changeState.played === 1) {\n setState({ ...state, playing: false, played: 1 });\n }\n }\n };\n\n const handleSeekChange = (e: any, newValue: any) => {\n setState({\n ...state,\n playedSeconds: parseFloat(newValue),\n });\n };\n\n const handleSeekMouseDown = () => {\n setSeeking(true);\n };\n\n const handleSeekMouseUp = (e: any, newValue: any) => {\n setSeeking(false);\n if (playerRef.current.getDuration() === Infinity) {\n return;\n }\n //This check is needed due to library bug, when value is 1 (1oo%) it jumps to 0:01 time frame instead\n if (newValue === 1) {\n playerRef.current.seekTo(playerRef.current.getDuration());\n } else {\n playerRef.current.seekTo(newValue);\n }\n };\n\n const currentTime = playerRef.current\n ? playerRef.current.getCurrentTime()\n : '00:00';\n\n const elapsedTime = formatDisplayDate(currentTime);\n\n useEffect(() => {\n if (getDuration) {\n getDuration(playedSeconds);\n }\n }, [playedSeconds, getDuration]);\n\n useEffect(() => {\n if (getPlaying) {\n getPlaying(playing);\n }\n }, [playing, getPlaying]);\n\n useEffect(() => {\n if(!url){\n setShowLoading(false);\n }\n }, [url])\n \n\n return (\n <ReactPlayerContainer\n onClick={handlePlayPause}\n onDoubleClick={handleToggleFullScreen}\n ref={playerContainerRef}\n className={className}\n >\n {url && (\n <ReactPlayer\n ref={playerRef}\n config={{\n file: {\n attributes: {\n preload: 'auto',\n },\n },\n }}\n width={'100%'}\n height={'100%'}\n style={{\n background: Variables.Colors.backgroundDark,\n zIndex: 1,\n }}\n url={url}\n className=\"player-background\"\n playing={playing}\n muted={muteVideo || muted}\n volume={volume}\n onReady={() => {\n setShowControls(true);\n setShowLoading(false);\n }}\n onProgress={handleProgress}\n />\n )}\n {showLoading && (\n <LoadingContainer>\n <Loading width={'32px'} />\n </LoadingContainer>\n )}\n\n {!url && (\n <NoVideoContainer>\n <img src={novideo} alt=\"org\" />\n <Box component=\"span\" mt={1}>\n This video is not available for playback\n </Box>\n </NoVideoContainer>\n )}\n\n {showControls && url && (\n <VideoPlayerControls\n played={played}\n playing={playing}\n muted={muted}\n volume={volume}\n setPlaying={handlePlayPause}\n setMuted={handleMute}\n onRewind={handleRewind}\n onVolumeChange={handleVolumeChange}\n onVolumeSeekDown={handleVolumeSeekDown}\n onToggleFullScreen={handleToggleFullScreen}\n onSeek={handleSeekChange}\n onSeekMouseDown={handleSeekMouseDown}\n onSeekMouseUp={handleSeekMouseUp}\n onDownloadVideo={onDownloadVideo}\n onCopyLink={onCopyLink}\n videoLoading={videoLoading}\n elapsedTime={elapsedTime}\n />\n )}\n </ReactPlayerContainer>\n );\n };\n","import React, { FC } from 'react';\nimport { UserInterface, UserProfile } from '../../../constants/interfaces/User';\nimport AvatarPlaceholder from '../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport styled from 'styled-components';\n\nconst StyledDetailsHeader = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n height: 48px;\n margin-bottom: 8px;\n`;\n\nconst StyledAvatar = styled.div`\n width: 32px;\n height: 32px;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst StyledName = styled.div`\n margin-left: 16px;\n font-size: 15px;\n font-weight: 700;\n letter-spacing: normal;\n cursor: pointer;\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst StyledAdditionalInfo = styled.span`\n font-size: 13px;\n font-weight: 600;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.steelGrey};\n margin-left: 3px;\n`;\n\nconst DetailsHeader: FC<{\n user?: UserInterface;\n profile?: UserProfile;\n action: (traineeId?: number) => void;\n}> = ({ user, profile, action }) => {\n return (\n <StyledDetailsHeader>\n <StyledAvatar onClick={() => user && action(user.id)}>\n <AvatarPlaceholder size=\"sm\" profile={user} />\n </StyledAvatar>\n <StyledName onClick={() => user && action(user.id)}>\n {user && `${user.firstName} ${user.lastName}`}\n {profile && user && user.id === profile.id && (\n <StyledAdditionalInfo> (You)</StyledAdditionalInfo>\n )}\n </StyledName>\n </StyledDetailsHeader>\n );\n};\n\nexport default DetailsHeader;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { VideoPlayer } from '../../../ui/components/VideoPlayer';\nimport DetailsHeader from './DetailsHeader';\nimport { UserInterface } from '../../../constants/interfaces/User';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\n\nconst StyledDetailsSubmissionInfo = styled.div`\n margin: 8px 10px;\n flex: 20;\n max-width: 416px;\n min-width: 416px;\n margin-bottom: 25px;\n \n display: flex;\n flex-direction: column;\n\n .video{\n min-height: 421px;\n \n\n .player-background{\n min-height: 421px;\n }\n }\n`;\n\nconst StyledInfoSection = styled.div`\n padding: 24px 32px 0 32px;\n margin-top: -5px;\n background-color: ${props => props.theme.Colors.white};\n min-height: 168px;\n border-radius: 0 0 8px 8px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border-top: none;\n z-index: 1;\n\n @media (max-width: 1440px){\n min-height: 167px;\n }\n`;\n\nconst Header = styled.div`\n font-size: 11px;\n font-weight: 600;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.tomato};\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.black};\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 15px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n margin-bottom: 5px;\n word-break: break-word;\n\n &:active {\n opacity: 0.7;\n }\n\n &:hover {\n cursor: pointer;\n opacity: 0.7;\n }\n`;\n\nconst Description = styled.div`\n color: ${props => props.theme.Colors.black};\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 13px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n padding-bottom: 20px;\n\n &:active {\n opacity: 0.7;\n }\n`;\n\nconst Row = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst DetailsSubmissionInfo: FC<{\n url?: string | null;\n challenge: { id: number; title: string; description: string; };\n redirectToChallenge: (challengeId?: number | string) => void;\n user?: UserInterface;\n action: (traineeId?: number) => void;\n handleDownloadVideo: () => void;\n videoLoading?: boolean;\n handleCopyLink: () => void;\n}> = ({\n url,\n challenge,\n redirectToChallenge,\n user,\n action,\n handleDownloadVideo,\n videoLoading,\n handleCopyLink,\n}) => {\n const profile = useSelector(getProfileState);\n\n return (\n <StyledDetailsSubmissionInfo>\n <DetailsHeader user={user} profile={profile} action={action} />\n <VideoPlayer\n url={url ? url : 'unknown'}\n onDownloadVideo={handleDownloadVideo}\n videoLoading={videoLoading}\n className='video'\n onCopyLink={handleCopyLink}\n />\n <StyledInfoSection>\n <Row>\n <Header>Challenge</Header>\n </Row>\n <Row>\n <Title\n onClick={() =>\n challenge.id && redirectToChallenge(challenge.id)\n }\n >\n {challenge?.title}\n </Title>\n </Row>\n <Row>\n <Description\n onClick={() =>\n challenge.id && redirectToChallenge(challenge.id)\n }\n >\n {challenge?.description}\n </Description>\n </Row>\n </StyledInfoSection>\n </StyledDetailsSubmissionInfo>\n );\n};\n\nexport default DetailsSubmissionInfo;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../theme/variables';\n\nconst StyledSelectBoxItemContainer = styled.div<{ widthPercent?: number }>`\n position: relative;\n width: ${props => props.widthPercent || 24}%;\n`;\n\nconst StyledSelectBoxItemWrapper = styled.div`\n display: flex;\n align-items: center;\n position: relative;\n`;\n\nconst StyledBulletBackground = styled.div`\n width: 16px;\n height: 2px;\n background: ${props => props.theme.Colors.white};\n position: absolute;\n right: 0;\n`;\n\nconst StyledSelectBoxItem = styled.div<{\n selected: boolean;\n color: string;\n round?: boolean;\n spacing?: string;\n}>`\n width: 100%;\n background: ${props =>\n props.selected ? props.color : Variables.Colors.paleGrey};\n color: ${props =>\n props.selected ? Variables.Colors.white : Variables.Colors.coolGray};\n height: 2px;\n margin: 25px 0;\n cursor: pointer;\n user-select: none;\n &:hover {\n opacity: 0.9;\n }\n &:active {\n opacity: 0.7;\n }\n`;\nconst StyledBullet = styled.div<{\n alignRight?: boolean;\n selected?: boolean;\n color?: string;\n}>`\n width: 16px;\n height: 16px;\n background: ${props =>\n props.selected\n ? props.theme.Colors.darkSkyBlue15\n : props.theme.Colors.paleGreyTwo};\n border: solid 1px\n ${props =>\n props.selected\n ? props.theme.Colors.darkSkyBlue\n : props.theme.Colors.cloudyBlue};\n position: absolute;\n ${props => (props.alignRight ? `right: 0` : `left: 0`)};\n top: 18px;\n border-radius: 50%;\n`;\n\nconst SelectBoxItem: FC<{\n selected: boolean;\n finalSpot: boolean;\n finalItem: boolean;\n firstItem: boolean;\n name: string | number;\n color?: string;\n handleSelect: (value: string | number) => void;\n isRound?: boolean;\n spacing?: string;\n}> = ({\n name,\n selected,\n finalSpot,\n finalItem,\n firstItem,\n color,\n handleSelect,\n isRound,\n spacing,\n}) => {\n return (\n <StyledSelectBoxItemContainer\n onClick={() => handleSelect(name)}\n widthPercent={firstItem ? 1.8 : 24}\n >\n <StyledSelectBoxItemWrapper>\n <StyledSelectBoxItem\n selected={selected || (finalItem && finalSpot)}\n color={\n color ? color : Variables.Colors.transparentSoftBlueTwo\n }\n round={isRound}\n spacing={spacing}\n />\n <StyledBulletBackground />\n </StyledSelectBoxItemWrapper>\n <StyledBullet\n alignRight={true}\n selected={selected}\n color={color ? color : Variables.Colors.transparentSoftBlueTwo}\n />\n </StyledSelectBoxItemContainer>\n );\n};\n\nexport default SelectBoxItem;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../theme/variables';\n\nconst Label = styled.div<{ color: string }>`\n font-size: 17px;\n font-weight: 600;\n color: ${props => props.color};\n margin-right: 15px;\n padding: 10px;\n`;\n\nconst SelectBoxLabel: FC<{\n label: string;\n color?: string;\n}> = ({ label, color }) => {\n return (\n <Label color={color ? color : Variables.Colors.coolGray}>{label}</Label>\n );\n};\n\nexport default SelectBoxLabel;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport SelectBoxItem from './SelectBoxItem';\nimport SelectBoxLabel from './SelectBoxLabel';\n\nconst StyledSelectBoxContainer = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n`;\n\nconst BoxArea = styled.div<{ marginLeft?: string }>`\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n margin-left: ${props => (!!props.marginLeft ? props.marginLeft : '43px')};\n margin-right: 4px;\n max-height: 50px;\n min-width: 100px;\n flex-shrink: 0;\n cursor: pointer;\n`;\n\ntype Item = string | number;\n\nexport const SelectBox: FC<{\n items: Item[];\n name?: string;\n value?: Item | null;\n label?: string;\n handleSelect?: (value: string | number, field?: string) => void;\n formatValueLabel?: string;\n labelColor?: string;\n color?: string;\n isRound?: boolean;\n readOnly?: boolean;\n spacing?: string;\n className?: string;\n marginLeft?: string;\n}> = ({\n name,\n items,\n label,\n value,\n handleSelect,\n formatValueLabel,\n labelColor,\n color,\n spacing,\n isRound,\n readOnly,\n className,\n marginLeft,\n}) => {\n return (\n <StyledSelectBoxContainer className={className}>\n {label && (\n <SelectBoxLabel\n color={labelColor && labelColor}\n label={label}\n />\n )}\n <BoxArea marginLeft={marginLeft}>\n {items.map((item: Item, index: number) => (\n <SelectBoxItem\n key={`${item}_${index}`}\n selected={!!value && item <= value}\n finalSpot={item === value}\n finalItem={item === items.length}\n firstItem={index === 0}\n name={`${item}${\n formatValueLabel ? formatValueLabel : ''\n }`}\n handleSelect={() =>\n !readOnly &&\n handleSelect &&\n handleSelect(item, name)\n }\n color={color}\n spacing={spacing}\n isRound={isRound}\n />\n ))}\n </BoxArea>\n </StyledSelectBoxContainer>\n );\n};\n","import styled from 'styled-components';\n\nexport const IconHolder = styled.div<{ scaleX?: number }>`\n width: 7px;\n height: 14px;\n color: ${props => props.theme.Colors.steelGrey};\n transform: scaleX(${props => props.scaleX || 1});\n`;\n\nexport const StyledButton = styled.div<{ disabled?: boolean }>`\n width: 48px;\n height: 48px;\n align-items: center;\n border-radius: 4px;\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n background-color: ${props => props.theme.Colors.white};\n cursor: pointer;\n display: flex;\n justify-content: center;\n user-select: none;\n &:hover ${IconHolder} {\n color: ${props => props.theme.Colors.black};\n }\n &:active ${IconHolder} {\n color: ${props => props.theme.Colors.black};\n }\n &:active {\n border: solid 1px ${props => props.theme.Colors.cloudyBlue};\n }\n`;\n\n","import { FC, memo } from 'react';\n\nimport ArrowRightIcon from '../../icons/ArrowRight';\nimport { IconHolder, StyledButton } from './style';\nimport { ButtonArrowProps } from './type';\n\nexport const ButtonArrow: FC<ButtonArrowProps> = ({\n action,\n disabled,\n loading,\n className,\n left,\n}) => {\n return (\n <StyledButton\n disabled={disabled || loading}\n onClick={action}\n className={className}\n >\n <IconHolder scaleX={left ? -1 : 1}>\n <ArrowRightIcon />\n </IconHolder>\n </StyledButton>\n );\n};\n\nexport default memo(ButtonArrow);\n","import React, { FC, useMemo } from 'react';\r\nimport styled from 'styled-components';\r\nimport { SubmissionReview } from '../../../constants/interfaces/Reviews';\r\nimport { Variables } from '../../../theme/variables';\r\nimport { SelectBox } from '../../../ui/components/SelectBox';\r\nimport TextAreaBox from '../../../ui/components/TextAreaBox/TextAreaBox';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { formatDate } from '../../../helpers/functions/date-convert';\r\nimport { ButtonArrow } from '../../../ui/components/ButtonArrow';\r\nimport { CheckPermission } from '../../permissions';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport { calculateScoreValue, generateScoreItemArray } from '../tools';\r\n\r\nconst StyledDetailsSubmissionReview = styled.div`\r\n margin: 8px 24px;\r\n flex: 54;\r\n`;\r\n\r\nconst StyledDetailsBody = styled.div`\r\n background: ${Variables.Colors.white};\r\n border-radius: 8px;\r\n border: solid 1px ${props => props.theme.Colors.paleGrey};\r\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\r\n padding: 41px 0 32px 32px;\r\n`;\r\n\r\nconst Divider = styled.div<{ margin?: number }>`\r\n height: 1px;\r\n width: 94%;\r\n border: 1px solid ${Variables.Colors.paleGrey};\r\n background: ${Variables.Colors.paleGrey};\r\n margin-bottom: 9px;\r\n`;\r\n\r\nconst ScoreRow = styled.div<{ padding?: string; margin?: string }>`\r\n display: flex;\r\n width: 100%;\r\n justify-content: space-between;\r\n padding: ${props => props.padding || '0 40px 0 16px'};\r\n margin: ${props => props.margin || '0 0 0 0'};\r\n align-items: center;\r\n`;\r\n\r\nconst ActionRow = styled.div`\r\n display: flex;\r\n width: 100%;\r\n margin: 24px 0;\r\n flex-direction: row-reverse;\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 17px;\r\n font-weight: bold;\r\n`;\r\n\r\nconst ExampleContent = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n margin-left: 15px;\r\n justify-content: flex-end;\r\n margin-top: 8px;\r\n`;\r\n\r\nconst Example = styled.div`\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: ${Variables.Colors.cloudyBlue};\r\n margin: 0 5px;\r\n`;\r\n\r\nconst Field = styled.div`\r\n font-size: 15px;\r\n color: ${Variables.Colors.dark};\r\n font-weight: 600;\r\n min-width: 110px;\r\n`;\r\n\r\nconst StyledSelectBox = styled(SelectBox)`\r\n flex: 1;\r\n`;\r\n\r\nconst Value = styled.div<{ empty?: boolean }>`\r\n font-size: 40px;\r\n color: ${props =>\r\n props.empty\r\n ? Variables.Colors.cloudyBlue\r\n : Variables.Colors.darkSkyBlue};\r\n line-height: 1.06;\r\n font-weight: bold;\r\n`;\r\n\r\nconst Description = styled.div<{ marginRight?: string }>`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n padding-left: 14px;\r\n font-size: 15px;\r\n font-weight: 500;\r\n margin-right: ${props => props.marginRight || '0px'};\r\n`;\r\n\r\nconst StyledSelectBoxHeader = styled.div`\r\n display: flex;\r\n margin: 0 27px 9px 173px;\r\n`;\r\n\r\nconst StyledSelectBoxHeaderItem = styled.div<{ widthPercent?: number }>`\r\n font-size: 15px;\r\n font-weight: 500;\r\n width: ${props => props.widthPercent || 23}%;\r\n text-align: right;\r\n color: ${props => props.theme.Colors.cloudyBlue};\r\n`;\r\n\r\nconst StyledDetailsHeader = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n height: 48px;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst StyledDetailsArrowsContainer = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nconst StyledLeftArrowContainer = styled.div`\r\n margin-right: 8px;\r\n`;\r\n\r\nconst StyledButtonContainer = styled.div`\r\n margin-right: 24px;\r\n`;\r\n\r\nconst StyledRightArrowContainer = styled.div``;\r\n\r\nconst SCORE_ITEMS = [1, 2, 3, 4, 5];\r\n\r\nconst DetailsSubmissionReview: FC<{\r\n mode?: 'edit' | 'view';\r\n review?: Partial<SubmissionReview>;\r\n submitted?: string;\r\n canRedo: boolean;\r\n modifyScore: (value: string | number, field?: string) => void;\r\n onCompleteReviewClicked: () => void;\r\n changeSubmission: (next: boolean) => void;\r\n itemsTotalCount?: number;\r\n currentItemPosition: number;\r\n requestRedoClicked?: () => void;\r\n reviewPermissionDenied?: boolean;\r\n}> = ({\r\n mode,\r\n review,\r\n submitted,\r\n canRedo,\r\n modifyScore,\r\n onCompleteReviewClicked,\r\n changeSubmission,\r\n itemsTotalCount,\r\n currentItemPosition,\r\n requestRedoClicked,\r\n reviewPermissionDenied,\r\n}) => {\r\n const reviewValue = useMemo(() => {\r\n if (!review)\r\n return 0;\r\n if (review.value)\r\n return review.value;\r\n return calculateScoreValue(\r\n generateScoreItemArray(review, [\r\n 'clarity',\r\n 'knowledge',\r\n 'confidence',\r\n 'enthusiasm',\r\n 'goalAchieved',\r\n ])\r\n );\r\n }, [review]);\r\n\r\n return (\r\n <StyledDetailsSubmissionReview>\r\n <StyledDetailsHeader>\r\n <Description>\r\n Submitted {formatDate(submitted, true)}\r\n </Description>\r\n {itemsTotalCount && (\r\n <StyledDetailsArrowsContainer>\r\n <Description marginRight=\"16px\">\r\n {currentItemPosition + 1} of {itemsTotalCount}\r\n </Description>\r\n <StyledLeftArrowContainer>\r\n <ButtonArrow\r\n left\r\n action={() => changeSubmission(false)}\r\n />\r\n </StyledLeftArrowContainer>\r\n <StyledRightArrowContainer>\r\n <ButtonArrow action={() => changeSubmission(true)} />\r\n </StyledRightArrowContainer>\r\n </StyledDetailsArrowsContainer>\r\n )}\r\n </StyledDetailsHeader>\r\n <StyledDetailsBody>\r\n <ScoreRow>\r\n <Title>Challenge Score</Title>\r\n </ScoreRow>\r\n <ScoreRow\r\n style={{\r\n alignItems: 'flex-start',\r\n paddingTop: '9px',\r\n paddingLeft: '14px',\r\n }}\r\n >\r\n <Value empty={!(reviewValue > 0)}>\r\n {reviewValue.toFixed(1)}\r\n </Value>\r\n <ExampleContent>\r\n <Example>1 - Poor;</Example>\r\n <Example>3 - Average;</Example>\r\n <Example>5 - Excellent</Example>\r\n </ExampleContent>\r\n </ScoreRow>\r\n <StyledSelectBoxHeader>\r\n {SCORE_ITEMS.map(item => (\r\n <StyledSelectBoxHeaderItem\r\n key={item}\r\n widthPercent={item === 1 ? 1 : 23}\r\n >\r\n {item}\r\n </StyledSelectBoxHeaderItem>\r\n ))}\r\n </StyledSelectBoxHeader>\r\n <Divider />\r\n <ScoreRow>\r\n <Field>Clarity</Field>\r\n <StyledSelectBox\r\n color={Variables.Colors.darkSkyBlue50}\r\n items={SCORE_ITEMS}\r\n name={'clarity'}\r\n isRound={true}\r\n spacing={'3px'}\r\n value={review?.clarity}\r\n handleSelect={modifyScore}\r\n readOnly={mode !== 'edit'}\r\n />\r\n </ScoreRow>\r\n <ScoreRow>\r\n <Field>Knowledge</Field>\r\n <StyledSelectBox\r\n color={Variables.Colors.darkSkyBlue50}\r\n items={SCORE_ITEMS}\r\n name={'knowledge'}\r\n isRound={true}\r\n spacing={'3px'}\r\n value={review?.knowledge}\r\n handleSelect={modifyScore}\r\n readOnly={mode !== 'edit'}\r\n />\r\n </ScoreRow>\r\n <ScoreRow>\r\n <Field>Confidence</Field>\r\n <StyledSelectBox\r\n color={Variables.Colors.darkSkyBlue50}\r\n items={SCORE_ITEMS}\r\n name={'confidence'}\r\n isRound={true}\r\n spacing={'3px'}\r\n value={review?.confidence}\r\n handleSelect={modifyScore}\r\n readOnly={mode !== 'edit'}\r\n />\r\n </ScoreRow>\r\n <ScoreRow>\r\n <Field>Enthusiasm</Field>\r\n <StyledSelectBox\r\n color={Variables.Colors.darkSkyBlue50}\r\n items={SCORE_ITEMS}\r\n name={'enthusiasm'}\r\n isRound={true}\r\n spacing={'3px'}\r\n value={review?.enthusiasm}\r\n handleSelect={modifyScore}\r\n readOnly={mode !== 'edit'}\r\n />\r\n </ScoreRow>\r\n <ScoreRow margin=\"0 0 14px 0\">\r\n <Field>Goal Achieved</Field>\r\n <StyledSelectBox\r\n color={Variables.Colors.darkSkyBlue50}\r\n items={SCORE_ITEMS}\r\n name={'goalAchieved'}\r\n isRound={true}\r\n spacing={'3px'}\r\n value={review?.goalAchieved}\r\n handleSelect={modifyScore}\r\n readOnly={mode !== 'edit'}\r\n />\r\n </ScoreRow>\r\n <TextAreaBox\r\n value={review?.note ?? ''}\r\n name=\"notes\"\r\n placeholder=\"Write review notes…\"\r\n minRows={3}\r\n onChange={(event: { target: HTMLInputElement }) =>\r\n modifyScore(event.target.value, 'note')\r\n }\r\n background={Variables.Colors.whiteTwo}\r\n disabled={mode !== 'edit'}\r\n max={500}\r\n marginRight=\"31px\"\r\n fontSize=\"15px\"\r\n counterFontSize=\"13px\"\r\n />\r\n </StyledDetailsBody>\r\n <ActionRow>\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.REVIEW_SUBMISSION]}\r\n >\r\n <Button\r\n height=\"40px\"\r\n width=\"176px\"\r\n disabled={\r\n !review ||\r\n !(\r\n review.knowledge &&\r\n review.clarity &&\r\n review.confidence &&\r\n review.enthusiasm &&\r\n review.goalAchieved\r\n ) ||\r\n mode === 'view' ||\r\n reviewPermissionDenied\r\n }\r\n customDisabledColor={Variables.Colors.cloudyBlue}\r\n action={onCompleteReviewClicked}\r\n >\r\n {mode === 'view'\r\n ? 'Review Completed'\r\n : 'Complete Review'}\r\n </Button>\r\n </CheckPermission>\r\n {canRedo && !reviewPermissionDenied && (\r\n <CheckPermission\r\n permissions={[NEW_PERMISSIONS.REQUEST_SUBMISSION_REDO]}\r\n >\r\n <StyledButtonContainer>\r\n <Button\r\n height=\"40px\"\r\n width=\"160px\"\r\n action={requestRedoClicked}\r\n color=\"warning-inverse\"\r\n variant=\"inverse\"\r\n >\r\n Request Redo\r\n </Button>\r\n </StyledButtonContainer>\r\n </CheckPermission>\r\n )}\r\n </ActionRow>\r\n </StyledDetailsSubmissionReview>\r\n );\r\n};\r\n\r\nexport default DetailsSubmissionReview;\r\n","import React, { FC, useState } from 'react';\nimport styled from 'styled-components';\nimport TextAreaPlaceholderBox from '../../../ui/components/TextAreaPlaceholderBox/TextAreaPlaceholderBox';\nimport { Button } from '../../../ui/components/Button';\nimport { Input } from '../../../ui/components/input';\nimport { Variables } from '../../../theme/variables';\n\nconst StyledTitle = styled.div`\n font-size: 20px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n width: 100%;\n`;\n\nconst StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n margin-top: 9px;\n height: 37px;\n margin-bottom: 16px;\n`;\n\nconst StyledFormArea = styled.div`\n width: 410px;\n`;\n\nconst StyledActions = styled.div`\n width: 272px;\n display: flex;\n justify-content: space-between;\n margin-top: 24px;\n margin-bottom: 8px;\n align-self: flex-end;\n`;\n\nconst StyledInput = styled(Input)`\n font-family: ${props => props.theme.Fonts.manrope};\n border-radius: 4px;\n background-color: ${props => props.theme.Colors.whiteTwo};\n`;\n\nconst StyledInputContainer = styled.div`\n margin-bottom: 12px;\n`;\n\nexport const RequestRedo: FC<{\n fromUser?: string;\n onSend?(data: any): void;\n onClose?(): void;\n}> = ({ onSend, onClose, fromUser }) => {\n const [messageData, setMessageData] = useState({\n name: fromUser,\n text: '',\n });\n\n const handleMessageDataChange = (key: string, value: any) => {\n setMessageData(prevState => ({ ...prevState, [key]: value }));\n };\n\n return (\n <>\n <StyledTitle>Request a Redo</StyledTitle>\n <StyledContent>\n <StyledDescription>\n Clicking \"Submit\" will delete the submission from the list\n and the User will be asked to redo this challenge.\n </StyledDescription>\n <StyledFormArea>\n <StyledInputContainer>\n <StyledInput\n type=\"text\"\n name=\"name\"\n inputPadding=\"29px 24px 15px 24px\"\n value={messageData.name}\n label=\"From\"\n labelFontSize=\"13px\"\n labelLeftPosition=\"24px\"\n labelFontWeight={500}\n maxLength={100}\n height=\"40px\"\n handleChange={(e: any) =>\n handleMessageDataChange('name', e.target.value)\n }\n />\n </StyledInputContainer>\n <TextAreaPlaceholderBox\n value={messageData.text}\n onChange={(e: any) =>\n handleMessageDataChange('text', e.target.value)\n }\n name=\"messageToTrainee\"\n placeholder=\"Message to User\"\n max={200}\n minRows={7}\n fontSize=\"13px\"\n padding=\"23px 24px\"\n borderRadius=\"8px\"\n minHeight=\"178px\"\n placeholderFontWeight={500}\n />\n </StyledFormArea>\n <StyledActions>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n variant=\"inverse\"\n color=\"warning\"\n customColor={Variables.Colors.tomato}\n >\n Cancel\n </Button>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={() => !!onSend && onSend(messageData)}\n disabled={!messageData.name || !messageData.text}\n color=\"warning\"\n customColor={Variables.Colors.tomato}\n >\n Submit\n </Button>\n </StyledActions>\n </StyledContent>\n </>\n );\n};\n","import React, { ChangeEvent, FC } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../ui/components/Button';\nimport { Variables } from '../../../theme/variables';\nimport Checkbox from '../../../ui/components/Checkbox';\n\nconst StyledTitle = styled.div`\n font-size: 20px;\n font-weight: 800;\n width: 100%;\n`;\n\nconst StyledContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst StyledDescription = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n margin-top: 7px;\n`;\n\nconst StyledActions = styled.div`\n width: 272px;\n display: flex;\n justify-content: space-between;\n margin-top: 25px;\n align-self: flex-end;\n`;\n\nconst StyledCheckboxContainer = styled.div`\n display: flex;\n align-items: center;\n margin-top: 11px;\n margin-bottom: 5px;\n align-self: flex-start;\n`;\n\nconst StyledReminderTitle = styled.div`\n font-size: 13px;\n font-weight: 500;\n margin-left: 11px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const RequestReminder: FC<{\n doNotShowWarning?: boolean;\n onProceed?(): void;\n onClose?(): void;\n onShowWarningClicked: (e: ChangeEvent<HTMLInputElement>) => void;\n}> = ({ doNotShowWarning, onProceed, onClose, onShowWarningClicked }) => {\n return (\n <>\n <StyledTitle>Reminder</StyledTitle>\n <StyledContent>\n <StyledDescription>\n Once you submit this review, you won't be able to request a\n redo for this submission.\n </StyledDescription>\n <StyledCheckboxContainer>\n <Checkbox\n size={16}\n checked={!!doNotShowWarning}\n border={Variables.Colors.coral}\n checkedBackground={Variables.Colors.coral}\n handleChange={onShowWarningClicked}\n checkboxMarginLeft=\"1px\"\n />\n <StyledReminderTitle>\n Don’t show this message again\n </StyledReminderTitle>\n </StyledCheckboxContainer>\n <StyledActions>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n variant=\"inverse\"\n color=\"warning\"\n >\n Go Back\n </Button>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={() => !!onProceed && onProceed()}\n color=\"warning\"\n >\n Proceed\n </Button>\n </StyledActions>\n </StyledContent>\n </>\n );\n};\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n box-sizing: content-box;\n`;\n\nexport const Title = styled.div`\n font-size: 20px;\n font-weight: 800;\n line-height: 1.25;\n color: var(--ps-black-main);\n padding-top: 32px;\n`;\n\nexport const Description = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n padding-top: 16px;\n padding-right: 16px;\n`;\n\nexport const ButtonContainer = styled.div`\n display: flex;\n justify-content: right;\n padding-top: 32px;\n`;","import DialogWrapper from '../DialogWrapper/DialogWrapper';\nimport { Button } from '../Button';\nimport { CopyLinkNotificationViewProps } from './types';\nimport {\n Container,\n Title,\n Description,\n ButtonContainer\n} from './styles';\n\nfunction CopyLinkNotificationView({ onClose }: CopyLinkNotificationViewProps) {\n return (\n <Container>\n <DialogWrapper\n customization={{ width: 328, padding: '0 32px 22px 40px' }}\n >\n <Title>Heads Up</Title>\n <Description>\n Only Admins or Team Leaders of this specific Team will be\n able to view this submission you're sharing.\n </Description>\n <ButtonContainer>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n color=\"default\"\n >\n Got it\n </Button>\n </ButtonContainer>\n </DialogWrapper>\n </Container>\n );\n}\n\nexport default CopyLinkNotificationView;","import CopyLinkNotification from './view';\n\nexport default CopyLinkNotification;","import { forwardRef } from 'react';\n\nimport { IconProps } from './types';\n\nexport const BrokenVideo = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"73\"\n height=\"72\"\n viewBox=\"0 0 73 72\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#dopteucapa)\" fill-rule=\"evenodd\" clip-rule=\"evenodd\">\n <path d=\"m68.66 60.75-7.6-7.6 7.6-7.61-3.54-3.53-7.6 7.6-7.6-7.6-3.53 3.53 7.6 7.61-7.6 7.6 3.53 3.53 7.6-7.6 7.6 7.6 3.54-3.53z\" fill=\"#EC513D\"/>\n <path d=\"M27.21 42.42V27.15c0-1.12 1.22-1.82 2.18-1.25l13.09 7.64c.96.56.96 1.95 0 2.51l-13.09 7.64c-.97.56-2.18-.13-2.18-1.25v-.02zm34.31-7.63h5.39c-.02-5.83-.42-11.72-1.22-17.32h.03l-.15-.85h-.01v-.03c-.06-.21-.11-.42-.19-.69-.91-3.03-2.96-5.37-5.57-6.28C54.92 8.02 36.04 8 35.24 8c-.8 0-19.63.02-24.57 1.62-1.05.36-2.02.97-2.88 1.79l-.13.14c-.19.19-.38.39-.56.6-.16.19-.31.38-.51.66l-.1.14c-.75 1.09-1.3 2.32-1.61 3.64l-.02.1c-1.8 11.32-1.82 24.66-.05 36.6l.03.22c.03.17.08.33.13.49l.07.23c.91 3.03 2.96 5.37 5.57 6.28 4.87 1.59 23.75 1.61 24.55 1.61.25 0 2.27 0 5.08-.05V56.7c-.75.01-1.44.02-2.02.03-.94.01-1.71.02-2.24.02h-1.64c-.53 0-1.3 0-2.25-.02-1.72-.02-4.35-.07-7.14-.17-3.1-.11-5.76-.26-7.9-.46-2.27-.2-4.06-.46-4.8-.7-.77-.3-1.75-1.27-2.17-3.04-1.63-11.04-1.64-23.45-.04-34.11.04-.2.07-.41.13-.62.2-.78.52-1.45.96-1.99.37-.42.79-.74 1.17-.88.41-.13 1.67-.45 4.63-.72l.44-.04c.21-.02.43-.04.61-.06l.43.09.03-.12c1.94-.15 4.15-.27 6.59-.35 2.79-.1 5.41-.15 7.12-.17.94-.01 1.71-.02 2.24-.02h1.64c.53 0 1.3 0 2.25.02 1.72.02 4.35.07 7.14.17 3.11.11 5.77.27 7.9.46 2.28.2 4.06.46 4.8.7.77.3 1.75 1.27 2.17 3.04.81 5.48 1.2 11.28 1.21 17.03h.02z\" fill=\"#fff\"/>\n </g>\n <defs>\n <clipPath id=\"dopteucapa\">\n <path fill=\"#fff\" transform=\"translate(3.5 8)\" d=\"M0 0h65.16v56.28H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default BrokenVideo;\n\n","import styled from 'styled-components';\n\nexport const ErrorTitle = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 24px;\n font-weight: 600;\n font-size: 20px;\n line-height: 25px;\n text-align: center;\n`;\n\nexport const ErrorDescription = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n padding-bottom: 4px;\n\n &:last-child {\n padding-bottom: 0;\n }\n\n a {\n color: var(--ps-blue-main);\n text-decoration: none;\n }\n`;","import BrokenVideo from '../../icons/BrokenVideo';\nimport {\n ErrorTitle,\n ErrorDescription\n} from './styles';\nimport LoginAuthWrapper from '../../wrapper/LoginAuthWrapper';\nimport { UnavailableContentProps } from './types';\n\nfunction UnavailableContentView({ title, description }: UnavailableContentProps) {\n return (\n <LoginAuthWrapper contentWidth={324} heightToShowScroll={500}>\n <BrokenVideo />\n <ErrorTitle>{title}</ErrorTitle>\n <ErrorDescription>\n {description}\n </ErrorDescription>\n <ErrorDescription>\n You can also <a href='mailto:support@gopractis.com'>contact us</a> at Practis and we may be able to help.\n </ErrorDescription>\n </LoginAuthWrapper>\n );\n}\n\nexport default UnavailableContentView;","import UnavailableContent from './view';\n\nexport default UnavailableContent;","import UnavailableContent from '../../../../ui/components/UnavailableContent';\n\nfunction UnavailableChallengeView() {\n return <UnavailableContent\n title=\"This Challenge cannot be viewed\"\n description=\"Looks like this Challenge was either deleted or it is being re-submitted by a learner.\"\n />\n}\n\nexport default UnavailableChallengeView;","import UnavailableChallenge from './view';\n\nexport default UnavailableChallenge;","import styled from 'styled-components';\n\nexport const Header = styled.div`\n height: 145px;\n border-bottom: 1px solid var(--ps-grey-4);\n padding-left: 16px;\n padding-top: 32px;\n`;\n\nexport const Title = styled.div`\n width: 137px;\n height: 8px;\n background-color: var(--ps-grey-4);\n`;\n\nexport const SubTitle = styled.div`\n width: 296px;\n height: 12px;\n background-color: var(--ps-grey-4);\n margin-top: 20px;\n`;\n\nexport const Content = styled.div`\n padding: 22px 24px 0 10px;\n`;\n\nexport const UserInfo = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const UserImage = styled.div`\n width: 32px;\n height: 32px;\n margin-right: 16px;\n border-radius: 8px;\n background-color: var(--ps-grey-4);\n`;\n\nexport const UserText = styled.div`\n width: 162px;\n height: 8px;\n background-color: var(--ps-grey-4);\n`;\n\nexport const MainContent = styled.div`\n display: flex;\n flex-direction: row;\n margin-top: 16px;\n`;\n\nexport const ThumbnailContainer = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const Thumbnail = styled.div`\n width: 416px;\n height: 416px;\n border-radius: 8px;\n background-color: var(--ps-grey-4);\n display: flex;\n align-items: center;\n`\n\nexport const ThumbnailTitle = styled.div`\n width: 312px;\n height: 8px;\n margin-top: 16px;\n background-color: var(--ps-grey-4);\n`;\n\nexport const ThumbnailDescription = styled.div`\n width: 244px;\n height: 8px;\n margin-top: 12px;\n background-color: var(--ps-grey-4);\n`;\n\nexport const StatsContainer = styled.div`\n display: flex;\n flex-direction: column;\n padding-left: 34px;\n flex: 54 1 0%;\n`;\n\nexport const Stats = styled.div`\n border-radius: 8px;\n border: 1px solid var(--ps-grey-4);\n box-shadow: rgb(0 0 0 / 5%) 0px 3px 10px 0px;\n width: 100%;\n height: 591px;\n padding: 48px 33px;\n`\n\nexport const StatsTitle = styled.div`\n width: 133px;\n height: 12px;\n background-color: var(--ps-grey-4);\n margin-left: 15px;\n`;\n\nexport const StatsScore = styled.div`\n width: 63px;\n height: 32px;\n background-color: var(--ps-grey-4);\n margin-top: 21px;\n margin-left: 15px;\n`;\n\nexport const StatsDelimiter = styled.div`\n height: 2px;\n background-color: var(--ps-grey-4);\n width: 100%;\n margin-top: 34px;\n margin-bottom: 10px;\n`;\n\nexport const StatsItem = styled.div`\n padding: 0 25px 0 15px;\n height: 50px;\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const StatsItemTitle = styled.div`\n width: 100px;\n height: 8px;\n background-color: var(--ps-grey-4);\n margin-right: 49px;\n`;\n\nexport const StatsItemPoints = styled.div`\n flex: 1 0 0%;\n display: flex;\n`;\n\nexport const StatsItemLine = styled.div`\n width: 100%;\n position: relative;\n height: 2px;\n background-color: var(--ps-grey-4);\n z-index: 1;\n`;\n\nexport const StatsItemPoint = styled.div<{ index: number }>`\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background-color: var(--ps-white-4);\n border: 1px solid var(--ps-grey-2);\n position: absolute;\n z-index: 2;\n left: calc(${props => `${props.index * 25}% - 8px`});\n top: -7px;\n`;\n\nexport const Buttons = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding-top: 24px;\n`;\n\nexport const WhiteButton = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 160px;\n height: 40px;\n border-radius: 4px;\n border: solid 2px var(--ps-grey-4);\n background-color: var(--ps-white-1);\n`;\n\nexport const WhiteButtonTitle = styled.div`\n width: 85px;\n height: 8px;\n background-color: var(--ps-grey-4);\n`;\n\n\nexport const GreyButton = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 176px;\n height: 40px;\n border-radius: 4px;\n border: solid 2px var(--ps-grey-4);\n background-color: var(--ps-grey-4);\n margin-left: 24px;\n`;\n\nexport const GreyButtonTitle = styled.div`\n width: 85px;\n height: 8px;\n background-color: var(--ps-white-1);\n`;","import { Loading } from '../../../../ui/components/LoadingCopmonent';\nimport {\n Header,\n Title,\n SubTitle,\n Content,\n UserInfo,\n UserImage,\n UserText,\n MainContent,\n ThumbnailContainer,\n Thumbnail,\n ThumbnailTitle,\n ThumbnailDescription,\n StatsContainer,\n Stats,\n StatsTitle,\n StatsScore,\n StatsDelimiter,\n StatsItem,\n StatsItemTitle,\n StatsItemPoints,\n StatsItemLine,\n StatsItemPoint,\n Buttons,\n GreyButton,\n GreyButtonTitle,\n WhiteButton,\n WhiteButtonTitle,\n} from './styles';\nimport {\n StatsItemCount,\n StatsItemPointCount,\n} from './constants';\nimport { range } from 'lodash';\n\nconst StatsItemsList = range(StatsItemCount);\nconst StatsItemPointList = range(StatsItemPointCount);\n\nfunction ScreenLoadingView() {\n return <>\n <Header>\n <Title />\n <SubTitle />\n </Header>\n <Content>\n <UserInfo>\n <UserImage />\n <UserText />\n </UserInfo>\n <MainContent>\n <ThumbnailContainer>\n <Thumbnail>\n <Loading size={44} />\n </Thumbnail>\n <ThumbnailTitle />\n <ThumbnailDescription />\n </ThumbnailContainer>\n <StatsContainer>\n <Stats>\n <StatsTitle />\n <StatsScore />\n <StatsDelimiter />\n {\n StatsItemsList.map(i =>\n <StatsItem>\n <StatsItemTitle />\n <StatsItemPoints>\n <StatsItemLine>\n {\n StatsItemPointList.map(j =>\n <StatsItemPoint index={j} />\n )\n }\n </StatsItemLine>\n </StatsItemPoints>\n </StatsItem>\n )\n }\n </Stats>\n <Buttons>\n <WhiteButton>\n <WhiteButtonTitle />\n </WhiteButton>\n <GreyButton>\n <GreyButtonTitle />\n </GreyButton>\n </Buttons>\n </StatsContainer>\n </MainContent>\n </Content>\n </>;\n}\n\nexport default ScreenLoadingView;","export const StatsItemCount = 5;\nexport const StatsItemPointCount = 5;","export enum LogEvent {\n CREATE_COMPANY = 'CREATE_COMPANY',\n DELETE_COMPANY = 'DELETE_COMPANY',\n UPDATE_COMPANY = 'UPDATE_COMPANY',\n CREATE_PRACTIS_ADMIN = 'CREATE_PRACTIS_ADMIN',\n DELETE_PRACTIS_ADMIN = 'DELETE_PRACTIS_ADMIN',\n UPDATE_PRACTIS_ADMIN = 'UPDATE_PRACTIS_ADMIN',\n CREATE_SCENARIO = 'CREATE_SCENARIO',\n DELETE_SCENARIO = 'DELETE_SCENARIO',\n UPDATE_SCENARIO = 'UPDATE_SCENARIO',\n CREATE_CHALLENGE = 'CREATE_CHALLENGE',\n DELETE_CHALLENGE = 'DELETE_CHALLENGE',\n UPDATE_CHALLENGE = 'UPDATE_CHALLENGE',\n GENERATE_CHALLENGE_FROM_SCENARIO = 'GENERATE_CHALLENGE_FROM_SCENARIO',\n CREATE_PRACTIS_SET = 'CREATE_PRACTIS_SET',\n DELETE_PRACTIS_SET = 'DELETE_PRACTIS_SET',\n UPDATE_PRACTIS_SET = 'UPDATE_PRACTIS_SET',\n INVITE_USER = 'INVITE_USER',\n REVOKE_INVITATION = 'REVOKE_INVITATION',\n RESEND_INVITATION = 'RESEND_INVITATION',\n UPDATE_SETTING = 'UPDATE_SETTING',\n CREATE_SUBMISSION = 'CREATE_SUBMISSION',\n UPDATE_SUBMISSION = 'UPDATE_SUBMISSION',\n DELETE_SUBMISSION = 'DELETE_SUBMISSION',\n REVIEW_SUBMISSION = 'REVIEW_SUBMISSION',\n CREATE_SCORE = 'CREATE_SCORE',\n UPDATE_SCORE = 'UPDATE_SCORE',\n DELETE_SCORE = 'DELETE_SCORE',\n DELETE_USER = 'DELETE_USER',\n CREATE_STAGING = 'CREATE_STAGING',\n UPDATE_STAGING = 'UPDATE_STAGING',\n DELETE_STAGING = 'DELETE_STAGING',\n CREATE_TEAM = 'CREATE_TEAM',\n DUPLICATE_TEAM = 'DUPLICATE_TEAM',\n UPDATE_TEAM = 'UPDATE_TEAM',\n DELETE_TEAM = 'DELETE_TEAM',\n USER_TEAM_LEAD_PROMOTION = 'USER_TEAM_LEAD_PROMOTION',\n USER_TEAM_LEAD_REVOKE = 'USER_TEAM_LEAD_REVOKE',\n USER_ADDED_INTO_TEAM = 'USER_ADDED_INTO_TEAM',\n CREATE_THEME = 'CREATE_THEME',\n ADD_COVER_INTO_THEME = 'ADD_COVER_INTO_THEME',\n DELETE_THEME = 'DELETE_THEME',\n UPDATE_THEME = 'UPDATE_THEME',\n REMOVE_COVER = 'REMOVE_COVER',\n ASSIGN_THEME_TO_PRACTISE_SET = 'ASSIGN_THEME_TO_PRACTISE_SET',\n ASSIGN_COVER_TO_PRACTISE_SET = 'ASSIGN_COVER_TO_PRACTISE_SET',\n ASSIGN_COVER_TO_SCENARIO = 'ASSIGN_COVER_TO_SCENARIO',\n}\n","import ScreenLoading from './view';\n\nexport default ScreenLoading;","import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport {\r\n useSubmissionDetailsState,\r\n useSubmissionPaginationState,\r\n} from '../store/states';\r\nimport { SubmissionReview, SubmissionV2 } from '../../../constants/interfaces/Reviews';\r\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { History } from 'history';\r\nimport ROUTES from '../../../routes/routes';\r\nimport { pushModal } from '../../../tools/router';\r\nimport {\r\n useGetSubmissionDetailsService,\r\n useGetSubmissionFromFeedService,\r\n useMarkSubmissionAsViewedService,\r\n useModifyScoreService,\r\n useRequestSubmissionRedoService,\r\n usePerformSubmissionReviewService,\r\n useGetSubmissionReviewService,\r\n useSearchChallengeSubmissionPaginationService,\r\n} from '../store/services';\r\nimport DetailsSubmissionInfo from '../components/DetailsSubmissionInfo';\r\nimport DetailsSubmissionReview from '../components/DetailsSubmissionReview';\r\nimport styled from 'styled-components';\r\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport {\r\n LocalStorage,\r\n useLocalStorage,\r\n} from '../../../tools/localStorage/LocalStorage';\r\nimport { RequestRedo } from '../components/RequestRedo';\r\nimport { RequestReminder } from '../components/RequestReminder';\r\nimport { UserProfile } from '../../../constants/interfaces/User';\r\nimport { useGetChallengeService } from '../../challenges/store/services';\r\nimport { useChallengeState } from '../../challenges/store/states';\r\nimport { Challenge } from '../../../constants/interfaces/Challenge';\r\nimport { useCopyChallengeLink } from '../store/services';\r\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\r\nimport CopyLinkNotification from '../../../ui/components/CopyLinkNotification';\r\nimport UnavailableChallenge from '../components/UnavailableChallenge';\r\nimport ScreenLoading from '../components/ScreenLoading';\r\nimport { SubmissionRedoParams, SubmissionReviewParams } from '../../../api/submissions/types';\r\nimport { handleDownloadVideoFile } from '../../../helpers/functions/file-download';\r\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport { SearchParams } from '../../../constants/interfaces/filters';\r\nimport { ChallengeSubmissionFilters } from '../../../constants/interfaces/SubmissionSearchFilters';\r\nimport { ITEMS_PER_PAGE } from './ChallengeSubmissions';\r\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\r\n\r\nconst StyledDetailsContainer = styled.div`\r\n display: flex;\r\n width: 100%;\r\n justify-content: center;\r\n`;\r\n\r\nconst StyledDetailsContainerInner = styled.div`\r\n display: flex;\r\n width: 100%;\r\n flex-wrap: wrap;\r\n align-items: flex-start;\r\n padding-top: 6px;\r\n`;\r\n\r\nconst ChallengeCopiedKeyName = 'challengeLinkWasCopied';\r\n\r\nconst SubmissionDetails: FC<{\r\n submission?: SubmissionV2;\r\n review?: Partial<SubmissionReview>;\r\n challenge?: Challenge;\r\n loading?: boolean;\r\n modifyScore: (value: string | number, field?: string) => void;\r\n company: CompanyInterface;\r\n history: History<any>;\r\n handleSaveSubmissionReview: (\r\n submissionId: number,\r\n data: SubmissionReviewParams\r\n ) => any;\r\n changeSubmission: (next: boolean) => void;\r\n itemsTotalCount?: number;\r\n currentItemPosition: number;\r\n localStorage?: LocalStorage;\r\n requestSubmissionRedo: (\r\n submissionId: number,\r\n redo: SubmissionRedoParams\r\n ) => Promise<string>;\r\n profile?: UserProfile;\r\n markSubmissionAsViewedService(teamId: any): void;\r\n handleCopyChallengeLink: () => void;\r\n showCopyLinkNotification: boolean;\r\n handleHideCopyLinkNotification: () => void;\r\n getSubmissionReview: (submissionId: number) => Promise<SubmissionReview>;\r\n}> = ({\r\n loading,\r\n submission,\r\n review,\r\n challenge,\r\n history,\r\n company,\r\n modifyScore,\r\n handleSaveSubmissionReview,\r\n changeSubmission,\r\n itemsTotalCount,\r\n currentItemPosition,\r\n localStorage,\r\n requestSubmissionRedo,\r\n profile,\r\n markSubmissionAsViewedService,\r\n handleCopyChallengeLink,\r\n showCopyLinkNotification,\r\n handleHideCopyLinkNotification,\r\n getSubmissionReview\r\n}) => {\r\n const prevCompanyRef = useRef(company);\r\n const DO_NOT_SHOW_WARNINGS = 'do_not_show_request_redo_warnings';\r\n\r\n const [requestRedoOpened, setRequestRedoOpened] = useState(false);\r\n const [requestRedoReminderOpened, setRequestRedoReminderOpened] =\r\n useState(false);\r\n const [doNotShowWarning, setDoNotShowWarning] = useState(false);\r\n const [reviewPermissionDenied, setReviewPermissionDenied] = useState(false);\r\n\r\n const showMessage = useShowMessage();\r\n\r\n useEffect(() => {\r\n prevCompanyRef.current = company;\r\n });\r\n const prevCompany = prevCompanyRef.current;\r\n\r\n useEffect(() => {\r\n if ((company && !company.id) || (prevCompany && !prevCompany.id))\r\n return;\r\n if (company.id !== prevCompany.id) {\r\n history.push(ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL);\r\n }\r\n }, [company, prevCompany, history]);\r\n\r\n useEffect(() => {\r\n const isNew = history.location.state?.isNew;\r\n const submissionId = history.location.state?.submissionId;\r\n\r\n if (isNew && submissionId) {\r\n markSubmissionAsViewedService(submissionId);\r\n }\r\n }, [markSubmissionAsViewedService, history]);\r\n\r\n const saveReview = useCallback(() => {\r\n if (!review) return;\r\n\r\n const data: SubmissionReviewParams = {\r\n note: review.note ?? '',\r\n clarity: review.clarity ?? 0,\r\n knowledge: review.knowledge ?? 0,\r\n confidence: review.confidence ?? 0,\r\n enthusiasm: review.enthusiasm ?? 0,\r\n goalAchieved: review.goalAchieved ?? 0\r\n };\r\n handleSaveSubmissionReview(submission!.id, data)\r\n .then(() => history.push(ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL))\r\n .catch((error: ErrorResult) => {\r\n switch (error.code) {\r\n case 404:\r\n showMessage('Challenge has been requested to redo', 'error');\r\n history.push(ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL);\r\n break;\r\n case 409:\r\n getSubmissionReview(submission!.id)\r\n .then((newReview) => {\r\n setRequestRedoReminderOpened(false);\r\n showMessage(\r\n `Challenge has been already reviewed by ${newReview.user.firstName} ${newReview.user.lastName}`,\r\n 'error'\r\n );\r\n });\r\n break;\r\n case 500:\r\n case 403:\r\n setReviewPermissionDenied(true);\r\n showMessage(error.message, 'error');\r\n break;\r\n default:\r\n showMessage(error.message, 'error');\r\n break;\r\n }\r\n }\r\n );\r\n\r\n if (doNotShowWarning && !!localStorage && !!profile) {\r\n const restrictedUsersList = localStorage.get(DO_NOT_SHOW_WARNINGS);\r\n let finalUsersList = [];\r\n if (restrictedUsersList) {\r\n finalUsersList = JSON.parse(restrictedUsersList);\r\n }\r\n\r\n finalUsersList.push(profile.id);\r\n localStorage.set(\r\n DO_NOT_SHOW_WARNINGS,\r\n JSON.stringify(finalUsersList)\r\n );\r\n }\r\n }, [\r\n localStorage,\r\n doNotShowWarning,\r\n handleSaveSubmissionReview,\r\n submission,\r\n history,\r\n profile,\r\n review,\r\n getSubmissionReview,\r\n showMessage\r\n ]);\r\n\r\n const onCompleteReviewClicked = useCallback(() => {\r\n let doNotShowRequestRedoWarning = false;\r\n const restrictedUsersList =\r\n localStorage && localStorage.get(DO_NOT_SHOW_WARNINGS);\r\n if (restrictedUsersList && !!profile) {\r\n const finalUsersList = JSON.parse(restrictedUsersList);\r\n doNotShowRequestRedoWarning = finalUsersList.includes(profile.id);\r\n }\r\n\r\n if (doNotShowRequestRedoWarning) {\r\n saveReview();\r\n } else {\r\n setRequestRedoReminderOpened(true);\r\n }\r\n }, [localStorage, saveReview, profile]);\r\n\r\n const requestRedoSubmitted = useCallback(\r\n (data: any) => {\r\n if (!submission || !data) return;\r\n setRequestRedoOpened(false);\r\n const redo: SubmissionRedoParams = {\r\n senderName: data.name,\r\n text: data.text\r\n };\r\n requestSubmissionRedo(submission.id, redo).then(\r\n (response: string) => {\r\n if (response === 'success') {\r\n history.push(ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL);\r\n }\r\n }\r\n );\r\n },\r\n [submission, requestSubmissionRedo, history]\r\n );\r\n\r\n const handleViewTraineeDetails = (traineeId?: number) => {\r\n if (!traineeId) return;\r\n history.push(\r\n ROUTES.USER_PERFORMANCE.replace(':userId', traineeId.toString()),\r\n { useGoBack: true }\r\n );\r\n };\r\n\r\n const handleViewChallenge = (challengeId?: number | string) => {\r\n if (!challengeId) return;\r\n pushModal(\r\n history,\r\n ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE.replace(\r\n ':challengeId',\r\n challengeId.toString()\r\n )\r\n );\r\n };\r\n\r\n const [videoLoading, setVideoLoading] = useState(false);\r\n\r\n const handleDownloadVideo = () => {\r\n if (!submission) return;\r\n setVideoLoading(true);\r\n const url = submission?.mediaUrl;\r\n const fileName = submission.practisSet?.name;\r\n \r\n if (url && fileName) {\r\n handleDownloadVideoFile(url, fileName).then(() =>\r\n setVideoLoading(false)\r\n );\r\n }\r\n };\r\n\r\n if (!submission || loading) {\r\n return (\r\n <MainWrapper hideHeader={true}>\r\n <ScreenLoading />\r\n </MainWrapper>\r\n );\r\n }\r\n\r\n const mode = !submission.reviewedAt ? 'edit' : 'view';\r\n\r\n return (\r\n <MainWrapper\r\n title=\"Submission Details\"\r\n subTitle={submission.practisSet ? submission.practisSet.name : ''}\r\n goBackUrl={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL}\r\n useGoBack={!!history.location.state?.useGoBack}\r\n htmlPageTitle={`Challenge - ${\r\n submission.practisSet ? submission.practisSet.name : ''\r\n } - ${\r\n submission.user &&\r\n `${submission.user.firstName} ${submission.user.lastName}`\r\n } - Practis`}\r\n >\r\n <StyledDetailsContainer>\r\n <StyledDetailsContainerInner>\r\n <DetailsSubmissionInfo\r\n url={submission.mediaUrl}\r\n challenge={\r\n challenge &&\r\n submission.challenge?.id === challenge.id\r\n ? (challenge as any)\r\n : submission.challenge!\r\n }\r\n redirectToChallenge={handleViewChallenge}\r\n user={submission.user}\r\n action={handleViewTraineeDetails}\r\n handleDownloadVideo={handleDownloadVideo}\r\n videoLoading={videoLoading}\r\n handleCopyLink={handleCopyChallengeLink}\r\n />\r\n <DetailsSubmissionReview\r\n review={review}\r\n mode={mode}\r\n submitted={submission.createdAt}\r\n canRedo={mode === 'edit'}\r\n modifyScore={modifyScore}\r\n onCompleteReviewClicked={onCompleteReviewClicked}\r\n changeSubmission={changeSubmission}\r\n itemsTotalCount={itemsTotalCount}\r\n currentItemPosition={currentItemPosition}\r\n requestRedoClicked={() => setRequestRedoOpened(true)}\r\n reviewPermissionDenied={reviewPermissionDenied}\r\n />\r\n {requestRedoOpened && (\r\n <DialogWrapper\r\n customization={{\r\n width: 480,\r\n padding: '31px 32px 27px 40px',\r\n }}\r\n >\r\n <RequestRedo\r\n fromUser={\r\n !!profile\r\n ? `${profile.firstName} ${profile.lastName}`\r\n : ''\r\n }\r\n onSend={requestRedoSubmitted}\r\n onClose={() => setRequestRedoOpened(false)}\r\n />\r\n </DialogWrapper>\r\n )}\r\n {requestRedoReminderOpened && !reviewPermissionDenied && (\r\n <DialogWrapper\r\n customization={{\r\n width: 400,\r\n padding: '30px 32px 43px 40px',\r\n }}\r\n >\r\n <RequestReminder\r\n onProceed={saveReview}\r\n doNotShowWarning={doNotShowWarning}\r\n onShowWarningClicked={(e: any) =>\r\n setDoNotShowWarning(e.target.checked)\r\n }\r\n onClose={() =>\r\n setRequestRedoReminderOpened(false)\r\n }\r\n />\r\n </DialogWrapper>\r\n )}\r\n </StyledDetailsContainerInner>\r\n </StyledDetailsContainer>\r\n {showCopyLinkNotification && (\r\n <CopyLinkNotification\r\n onClose={handleHideCopyLinkNotification}\r\n />\r\n )}\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nconst SubmissionDetailsContainer = () => {\r\n const submission = useSubmissionDetailsState();\r\n const [localOffset, setLocalOffset] = useState(0);\r\n\r\n const history = useHistory();\r\n const submissionPagination = useSubmissionPaginationState().submissionIds;\r\n const submissionPaginationLoading = useSubmissionPaginationState().loading;\r\n const submissionTotalCount = useSubmissionPaginationState().totalCount;\r\n const loading = useSubmissionDetailsState().loading;\r\n const params = useParams<{ submissionId?: string }>();\r\n const modifyScore = useModifyScoreService();\r\n const saveSubmissionReview = usePerformSubmissionReviewService();\r\n const requestSubmissionRedo = useRequestSubmissionRedoService();\r\n const company = useSelector(getCompanyState);\r\n const profile = useSelector(getProfileState);\r\n const localStorage = useLocalStorage();\r\n const markSubmissionAsViewedService = useMarkSubmissionAsViewedService();\r\n const getSubmissionDetails = useGetSubmissionDetailsService();\r\n const getSubmissionFromFeed = useGetSubmissionFromFeedService();\r\n const getChallenge = useGetChallengeService();\r\n const { data: challenge, loading: challengeLoading } = useChallengeState();\r\n const [showCopyLinkNotification, setShowCopyLinkNotification] = useState(false);\r\n const copyChallengeLink = useCopyChallengeLink();\r\n const getSubmissionReview = useGetSubmissionReviewService();\r\n const searchChallengeSubmissionPaginationService =\r\n useSearchChallengeSubmissionPaginationService();\r\n\r\n /**\r\n * @function successGetSubmissionDetailCallback\r\n * @returns { void }\r\n */\r\n const successGetSubmissionDetailCallback = useCallback(\r\n (submission: SubmissionV2) => {\r\n if (submission) {\r\n const challengeId = submission.challenge?.id;\r\n if (challengeId) {\r\n getChallenge(String(challengeId));\r\n }\r\n }\r\n },\r\n [getChallenge]\r\n );\r\n\r\n const state: any = history.location.state;\r\n const isDirectLink = !state?.useGoBack;\r\n const locationSearchParams = state?.searchParams as SearchParams | undefined;\r\n const locationFilters = state?.filters as ChallengeSubmissionFilters | undefined;\r\n\r\n useEffect(() => {\r\n if (params.submissionId) {\r\n const isOwnRoute = history.location.pathname.indexOf(\r\n ROUTES.SUBMISSION_SETTINGS.CHALLENGES.SINGLE\r\n .replace(':submissionId', params.submissionId)\r\n ) > -1;\r\n if (!isOwnRoute) return;\r\n if (isDirectLink) {\r\n getSubmissionFromFeed(params.submissionId, successGetSubmissionDetailCallback);\r\n } else {\r\n getSubmissionDetails(params.submissionId, successGetSubmissionDetailCallback);\r\n }\r\n }\r\n }, [\r\n history.location.pathname,\r\n params.submissionId,\r\n isDirectLink,\r\n getSubmissionDetails,\r\n getSubmissionFromFeed,\r\n successGetSubmissionDetailCallback\r\n ]);\r\n\r\n const currentItemPosition = useMemo(() => {\r\n if (\r\n submissionPagination &&\r\n submission?.details &&\r\n locationSearchParams\r\n ) {\r\n const submissionIndex = submissionPagination.findIndex(\r\n submissionId => submissionId === submission.details!.id\r\n );\r\n return locationSearchParams.offset + localOffset + submissionIndex;\r\n }\r\n return 0;\r\n }, [submissionPagination, submission?.details, locationSearchParams, localOffset]);\r\n\r\n /**\r\n * @function changeSubmissionHandler\r\n * @description loads neighbor challenge submission by next/prev id from the submission list\r\n * if required submission is outside of the loaded list, it increases/decreases offset\r\n * and loads the next/prev list of submissions and then loads submission details by proper\r\n * submission id from the new list\r\n * @param { boolean } next\r\n * @returns { void }\r\n */\r\n const changeSubmissionHandler = useCallback((next: boolean) => {\r\n if (submissionPagination && !loading && !challengeLoading && locationSearchParams) {\r\n const submissionIndex = currentItemPosition - locationSearchParams.offset - localOffset;\r\n if (next) {\r\n if (currentItemPosition === submissionTotalCount! - 1)\r\n return;\r\n if (submissionIndex === ITEMS_PER_PAGE - 1) {\r\n searchChallengeSubmissionPaginationService(\r\n {\r\n ...locationSearchParams,\r\n offset: locationSearchParams.offset + localOffset + ITEMS_PER_PAGE\r\n },\r\n locationFilters!,\r\n (data) => {\r\n setLocalOffset(localOffset + ITEMS_PER_PAGE);\r\n const nextSubmissionId = data[0];\r\n getSubmissionDetails(nextSubmissionId, successGetSubmissionDetailCallback);\r\n });\r\n } else {\r\n const nextSubmissionId = submissionPagination[submissionIndex + 1];\r\n getSubmissionDetails(nextSubmissionId, successGetSubmissionDetailCallback);\r\n }\r\n } else {\r\n if (currentItemPosition === 0)\r\n return;\r\n if (submissionIndex === 0) {\r\n searchChallengeSubmissionPaginationService(\r\n {\r\n ...locationSearchParams,\r\n offset: locationSearchParams.offset + localOffset - ITEMS_PER_PAGE\r\n },\r\n locationFilters!,\r\n (data) => {\r\n setLocalOffset(localOffset - ITEMS_PER_PAGE);\r\n const nextSubmissionId = data[data.length - 1];\r\n getSubmissionDetails(nextSubmissionId, successGetSubmissionDetailCallback);\r\n });\r\n } else {\r\n const nextSubmissionId = submissionPagination[submissionIndex - 1];\r\n getSubmissionDetails(nextSubmissionId, successGetSubmissionDetailCallback);\r\n }\r\n }\r\n }\r\n }, [\r\n currentItemPosition,\r\n localOffset,\r\n locationSearchParams,\r\n locationFilters,\r\n loading,\r\n challengeLoading,\r\n submissionPagination,\r\n submissionTotalCount,\r\n searchChallengeSubmissionPaginationService,\r\n getSubmissionDetails,\r\n successGetSubmissionDetailCallback\r\n ]);\r\n\r\n /**\r\n * @function handleCopyChallengeLink\r\n * @description shows a notification modal for the first time or copies link to a clipboard\r\n * @returns { void }\r\n */\r\n const handleCopyChallengeLink = useCallback(() => {\r\n if (localStorage.get(ChallengeCopiedKeyName)) {\r\n copyChallengeLink(submission.details!);\r\n } else {\r\n setShowCopyLinkNotification(true);\r\n }\r\n }, [submission?.details, localStorage, copyChallengeLink]);\r\n\r\n /**\r\n * @function handleHideCopyLinkNotification\r\n * @description hides a notification modal and copies link to a clipboard\r\n * @returns { void }\r\n */\r\n const handleHideCopyLinkNotification = useCallback(() => {\r\n setShowCopyLinkNotification(false);\r\n copyChallengeLink(submission.details!);\r\n localStorage.set(ChallengeCopiedKeyName, true);\r\n }, [submission?.details, copyChallengeLink, localStorage]);\r\n\r\n return (\r\n submission?.error\r\n ? <UnavailableChallenge />\r\n : <SubmissionDetails\r\n submission={submission.details}\r\n review={submission.review}\r\n challenge={challenge}\r\n loading={loading || submissionPaginationLoading}\r\n history={history}\r\n company={company}\r\n modifyScore={modifyScore}\r\n handleSaveSubmissionReview={saveSubmissionReview}\r\n changeSubmission={changeSubmissionHandler}\r\n itemsTotalCount={submissionTotalCount}\r\n currentItemPosition={currentItemPosition}\r\n profile={profile}\r\n localStorage={localStorage}\r\n requestSubmissionRedo={requestSubmissionRedo}\r\n markSubmissionAsViewedService={markSubmissionAsViewedService}\r\n handleCopyChallengeLink={handleCopyChallengeLink}\r\n showCopyLinkNotification={showCopyLinkNotification}\r\n handleHideCopyLinkNotification={handleHideCopyLinkNotification}\r\n getSubmissionReview={getSubmissionReview}\r\n />\r\n );\r\n};\r\n\r\nexport default SubmissionDetailsContainer;\r\n","import styled from 'styled-components';\n\nexport const StyledResetContent = styled.div`\n width: 100%;\n height: 140px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--ps-grey-10);\n font-weight: bold;\n font-size: 14px;\n padding: 0 5px;\n line-height: 1.14;\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 50px;\n flex-wrap: wrap;\n margin-bottom: 5px;\n font-size: 20px;\n font-weight: bold;\n color: var(--ps-white-1);\n`;","import LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport {\n StyledResetContent,\n Header\n} from './styles';\n\nconst TraineeLogin = () => {\n return (\n <LoginAuthWrapper contentWidth={510} hideLogo={true}>\n <Header>Reset Password</Header>\n <StyledResetContent>\n Password has been reset, Open mobile app to log in\n </StyledResetContent>\n </LoginAuthWrapper>\n );\n};\n\nexport default TraineeLogin;\n","import React, { FC, useCallback, useEffect, useState, ChangeEvent } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Fieldset } from '../../../../../ui/components/Fieldset';\r\nimport Checkbox from '../../../../../ui/components/Checkbox';\r\nimport { Variables } from '../../../../../theme/variables';\r\nimport { toggleItemInArray } from '../../../../../helpers/functions/array-helpers';\r\nimport { Button } from '../../../../../ui/components/Button';\r\nimport { PRACTIS_SET_STATUS_ITEMS } from '../../../../../constants/enums';\r\nimport { DueDateFilters } from '../../../../../constants/interfaces/DueDates';\r\nimport OverdueFlag from '../../../../../ui/icons/OverdueFlag';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: inherit;\r\n margin-left: 8px;\r\n margin-right: 8px;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n gap: 16px;\r\n max-height: 416px;\r\n flex-grow: 1;\r\n background-color: inherit;\r\n`;\r\n\r\nconst Actions = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n flex-shrink: 0;\r\n margin-top: 16px;\r\n`;\r\n\r\nconst StatusContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n width: 158px;\r\n background-color: inherit;\r\n height: 114px;\r\n`;\r\n\r\nconst StatusItem = styled.div`\r\n margin-bottom: 8px;\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst CheckBoxWrapper = styled.div`\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst ButtonWrapper = styled.div`\r\n margin-right: 10px;\r\n`;\r\n\r\nconst OverdueFlagWrapped = styled(OverdueFlag)`\r\n margin-left: 4px;\r\n`;\r\n\r\nconst SelectedSubtitle = styled.div`\r\n font-size: 11px;\r\n margin-right: 12px;\r\n color: ${props => props.theme?.Colors?.steelGrey};\r\n min-width: 55px;\r\n`;\r\n\r\n// TODO-REFACTOR: filter contants in one place\r\nconst overduesMap: Record<DueDateFilters, { title: string }> = {\r\n [DueDateFilters.ASSIGNED]: { title: 'Assigned' },\r\n [DueDateFilters.NO_DUEDATE]: { title: 'No Due Date' },\r\n [DueDateFilters.OVERDUE]: { title: 'Overdue' },\r\n};\r\n\r\nexport const UserProfileFilters: FC<{\r\n selectedStatuses: string[];\r\n savedStatuses: string[];\r\n handleSelectStatus: (ids: string[]) => void;\r\n handleSaveStatus: (ids: string[]) => void;\r\n onSuccessApply: () => void;\r\n onOverdueChange: (dueDate: DueDateFilters[]) => void;\r\n dueDate: DueDateFilters[];\r\n isInvitation?: boolean;\r\n}> = ({\r\n selectedStatuses,\r\n savedStatuses,\r\n handleSelectStatus,\r\n handleSaveStatus,\r\n onSuccessApply,\r\n onOverdueChange,\r\n dueDate,\r\n isInvitation\r\n}) => {\r\n useEffect(() => {\r\n handleSelectStatus(savedStatuses);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const [overdues, setOverdues] = useState(dueDate);\r\n\r\n const handleStatusSelection = useCallback(\r\n (status: string) => {\r\n handleSelectStatus(toggleItemInArray(selectedStatuses, status));\r\n },\r\n [handleSelectStatus, selectedStatuses]\r\n );\r\n\r\n const onApplyHandler = useCallback(() => {\r\n handleSaveStatus(selectedStatuses);\r\n onOverdueChange(overdues);\r\n onSuccessApply();\r\n }, [handleSaveStatus, selectedStatuses, onSuccessApply, overdues, onOverdueChange]);\r\n\r\n // TODO refactor filter state management from one parent component\r\n const onClearHandler = useCallback(() => {\r\n handleSelectStatus([]);\r\n setOverdues([]);\r\n }, [handleSelectStatus]);\r\n\r\n const onOverdueChangeHandler = useCallback(\r\n (dueDateIn: DueDateFilters, e: ChangeEvent<HTMLInputElement>) => {\r\n if (e.target.checked) {\r\n setOverdues([...overdues, dueDateIn]);\r\n } else {\r\n setOverdues(overdues.filter(item => item !== dueDateIn));\r\n }\r\n },\r\n [overdues, setOverdues]\r\n );\r\n\r\n const totalFiltersSelectedCount = selectedStatuses.length + overdues.length;\r\n\r\n return (\r\n <Container>\r\n <Wrapper>\r\n {!isInvitation && (<Fieldset title={'Progress Status'}>\r\n <StatusContainer>\r\n {PRACTIS_SET_STATUS_ITEMS.map(item => {\r\n return (\r\n <CheckBoxWrapper key={item.value}>\r\n <Checkbox\r\n key={item.value}\r\n handleChange={() => {\r\n handleStatusSelection(item.value);\r\n }}\r\n checked={selectedStatuses.includes(\r\n item.value\r\n )}\r\n size={12}\r\n label={item.name}\r\n fontSize={13}\r\n fontColor={Variables.Colors.black}\r\n fontWeight={'500'}\r\n />\r\n </CheckBoxWrapper>\r\n );\r\n })}\r\n </StatusContainer>\r\n </Fieldset>)}\r\n <Fieldset title={'Due Date'}>\r\n <StatusContainer>\r\n {(Object.keys(\r\n overduesMap\r\n ) as DueDateFilters[]).map(item => (\r\n <StatusItem>\r\n <Checkbox\r\n key={item}\r\n checked={overdues.includes(item)}\r\n handleChange={e =>\r\n onOverdueChangeHandler(item, e)\r\n }\r\n label={overduesMap[item].title}\r\n border={Variables.Colors.steelGrey}\r\n size={12}\r\n fontColor={Variables.Colors.black}\r\n />\r\n {item === DueDateFilters.OVERDUE && <OverdueFlagWrapped />}\r\n </StatusItem>\r\n ))}\r\n </StatusContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <SelectedSubtitle>\r\n {totalFiltersSelectedCount} selected\r\n </SelectedSubtitle>\r\n <ButtonWrapper>\r\n <Button\r\n width={'104px'}\r\n variant={'inverse'}\r\n action={() => onClearHandler()}\r\n disabled={totalFiltersSelectedCount < 1}\r\n >\r\n Clear\r\n </Button>\r\n </ButtonWrapper>\r\n <Button width={'104px'} action={() => onApplyHandler()}>\r\n Apply Filter\r\n </Button>\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: 0,\n },\n}));\n\n","import {\r\n FC,\r\n forwardRef,\r\n MutableRefObject,\r\n useCallback,\r\n useEffect,\r\n useImperativeHandle,\r\n useRef,\r\n useState,\r\n ReactNode,\r\n} from 'react';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { isEmpty as isLodashEmpty } from 'lodash';\r\n\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../constants/interfaces/filters';\r\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\r\nimport { EnrollmentInterface } from '../../../constants/interfaces/Enrollments';\r\nimport { History } from 'history';\r\nimport { ActionButton, ActionItem } from '../../../ui/components/ActionButton';\r\nimport ROUTES from '../../../routes/routes';\r\nimport { pushModal } from '../../../tools/router';\r\nimport {\r\n formatDate,\r\n formatDateWithTimeZone,\r\n} from '../../../helpers/functions/date-convert';\r\nimport {\r\n UpdatedLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../../labels/store/states';\r\nimport styled from 'styled-components';\r\nimport { clearSelectedItemIfNotLoaded } from '../../labels/tools';\r\nimport { LoadingComponent } from '../../../ui/components/LoadingCopmonent';\r\nimport { CheckPermission } from '../../permissions';\r\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\r\nimport { useHandleAccessPage } from '../../../helpers/hooks/usePagePermissions';\r\nimport { useUpdateAssignedLibraryPractisSetService } from '../../library/store/services';\r\nimport {\r\n usePractisSetsEnrollmentsService,\r\n useRemindUsersService,\r\n useResetUserPerformanceService,\r\n useSearchUserPractisSetsService,\r\n useUnEnrollPractisSetService,\r\n useUpdateAllPractisSetsCheckedStateService,\r\n useUpdateTraineeProfilePractisSetsCheckedStateService,\r\n useUserPerformanceService,\r\n} from '../store/services';\r\nimport {\r\n useUpdatedUserPractisSetsState,\r\n useUserPerformanceState,\r\n} from '../store/states';\r\nimport { PerformanceTrainee } from '../../../constants/interfaces/PerformanceTrainee';\r\nimport { EnrollmentStatusEnum } from '../../../constants/interfaces/Enrollments';\r\nimport Box from '../../../ui/icons/Box';\r\nimport { useSearchDebounced } from '../../../helpers/hooks/useSearch';\r\nimport FilterByHandler from '../../../ui/components/Filters/FilterByHandler';\r\nimport { Popup } from '../../../ui/components/Popup';\r\nimport { UserProfileFilters } from './Filters/UserProfileFilters/UserProfileFilters';\r\nimport { isTeamLeader } from '../../../constants/enums';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { UserInterface } from '../../../constants/interfaces/User';\r\nimport { useSessionEffect } from '../../common';\r\nimport GeneralProgressCol from '../../../features/teams/pages/Training/components/ProgressDetails/GeneralProgressCol';\r\nimport { secondsToMinSimple } from '../../../helpers/functions/convert-time';\r\nimport OverdueFlag from '../../../ui/icons/OverdueFlag';\r\nimport { DueDateFilters } from '../../../constants/interfaces/DueDates';\r\nimport { isEmpty } from 'lodash';\r\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\r\nimport { useStyles } from '../pages/Performance/styles';\r\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\r\nimport { useDeleteEnrollmentBulkActionService } from '../../teams/pages/Training/services/EnrollmentBulkActionsService';\r\nimport { useShowConfirmModalDialog } from '../../../ui/components/ModalDialogs/store/actions';\r\n\r\nconst qs = require('query-string');\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst StyledFirstTableContent = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 0;\r\n height: 100%;\r\n`;\r\n\r\nconst ProgressBarContainer = styled.div`\r\n width: 128px;\r\n`;\r\n\r\nconst DueDateWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst StyledOverdueFlag = styled(OverdueFlag)`\r\n margin-left: 8px;\r\n`;\r\n\r\nconst PerformanceSectionRef = forwardRef((props: any, ref) => {\r\n return <PerformanceSection reff={ref} {...props} />;\r\n});\r\n\r\nconst PerformanceSection: FC<{\r\n trainee?: PerformanceTrainee;\r\n practisSets?: PaginationResult<EnrollmentInterface>;\r\n onPractisSetsUpdate(practisSetsCount: number): void;\r\n updatedPractisSets?: EnrollmentInterface;\r\n searchUserPractisSets(searchParams: SearchParams): void;\r\n fetchPortablePractisSets(): void;\r\n params: { userId: string };\r\n history: History<any>;\r\n profile?: UserInterface;\r\n selectedPractisSets?: number[];\r\n loading?: boolean;\r\n updateAllPractisSetsCheckedState(\r\n practisSetIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n updateSelectedPractisSetCheckedState(practisSetId: number): void;\r\n updatedLabels?: UpdatedLabelsState;\r\n unEnrollPractisSetService(\r\n unEnrolledPractisSets: number[],\r\n search?: SearchParams,\r\n selectAll?: boolean\r\n ): any;\r\n isInvitation: boolean;\r\n onGetTrainee: (userId: number, isInvitation: boolean) => void;\r\n remindUsers: (enrollmentIds: number[]) => any;\r\n setAssignPractisSetsAction?(practisSetIds: number[]): void;\r\n reff?: MutableRefObject<any>;\r\n}> = ({\r\n trainee,\r\n practisSets,\r\n params,\r\n onPractisSetsUpdate,\r\n searchUserPractisSets,\r\n history,\r\n profile,\r\n updatedPractisSets,\r\n selectedPractisSets,\r\n updateAllPractisSetsCheckedState,\r\n updateSelectedPractisSetCheckedState,\r\n updatedLabels,\r\n loading,\r\n unEnrollPractisSetService,\r\n isInvitation,\r\n onGetTrainee,\r\n remindUsers,\r\n setAssignPractisSetsAction,\r\n reff,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\r\n const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);\r\n const [savedStatuses, setSavedStatuses] = useState<string[]>([]);\r\n\r\n const canAccessPage = useHandleAccessPage();\r\n const showConfirmationModalDialog = useShowConfirmModalDialog();\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n filters: [],\r\n labelIDs: [],\r\n orderBy: {},\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n filterByStatus: null,\r\n };\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setOffset,\r\n refreshSearchParams,\r\n setCustom,\r\n } = useSearchParamsState(initialSearchParams);\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const handleItemEdit = (enrollment: EnrollmentInterface) => {\r\n pushModal(\r\n history,\r\n ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE.replace(\r\n ':practisSetId',\r\n enrollment.practisSet.id!.toString()\r\n )\r\n );\r\n };\r\n\r\n const isCheckboxPartiallySelected =\r\n practisSets &&\r\n practisSets.items &&\r\n selectedPractisSets &&\r\n selectedPractisSets.length < practisSets.items.length;\r\n\r\n const updateAllPractisSetCheck = useCallback(\r\n (checked: boolean) => {\r\n const setIds =\r\n (practisSets &&\r\n practisSets.items.map((set: EnrollmentInterface) =>\r\n Number(set.id)\r\n )) ||\r\n [];\r\n updateAllPractisSetsCheckedState(\r\n setIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [\r\n practisSets,\r\n isCheckboxPartiallySelected,\r\n updateAllPractisSetsCheckedState,\r\n ]\r\n );\r\n\r\n const handlePractisSetCheck = (e: any, enrollment: EnrollmentInterface) => {\r\n e.stopPropagation();\r\n if (!!enrollment.id) {\r\n updateSelectedPractisSetCheckedState(enrollment.id);\r\n }\r\n };\r\n\r\n const handleDeleteEnrollmentsSuccess = useCallback(() => {\r\n if (!!trainee && !!trainee.id) {\r\n setAssignPractisSetsAction?.([]);\r\n onGetTrainee(trainee.id, isInvitation);\r\n }\r\n }, [trainee, setAssignPractisSetsAction, onGetTrainee, isInvitation]);\r\n\r\n const handleDeleteEnrollmentsBulkActionService =\r\n useDeleteEnrollmentBulkActionService(\r\n {\r\n userId: (trainee?.id || 0).toString(),\r\n searchParams,\r\n },\r\n 'practisSet',\r\n practisSets?.count,\r\n handleDeleteEnrollmentsSuccess\r\n );\r\n\r\n const handleUnEnrollPractisSet = useCallback(\r\n (enrollmentIds: number[]) => {\r\n if (isSelectAll) {\r\n handleDeleteEnrollmentsBulkActionService();\r\n } else {\r\n unEnrollPractisSetService(enrollmentIds).then(() =>\r\n handleDeleteEnrollmentsSuccess()\r\n );\r\n }\r\n },\r\n [\r\n handleDeleteEnrollmentsBulkActionService,\r\n handleDeleteEnrollmentsSuccess,\r\n unEnrollPractisSetService,\r\n isSelectAll,\r\n ]\r\n );\r\n\r\n /**\r\n * Set filter list with filterByDueDate\r\n * @param dueDates - DueDateFilters[], due date types array\r\n * Returns void\r\n */\r\n const filterOverdueHandler = (dueDates: DueDateFilters[]) => {\r\n setCustom('filterByDueDate', dueDates);\r\n };\r\n\r\n const handleViewPractisSetReport = (userId: number, enrollmentId: number) => {\r\n updateAllPractisSetsCheckedState([], false, false);\r\n history.push(\r\n ROUTES.TRAINEE_DETAILS\r\n .replace(\r\n ':userId',\r\n userId.toString()\r\n )\r\n .replace(\r\n ':enrollmentId',\r\n enrollmentId.toString()\r\n ),\r\n { useGoBack: true }\r\n );\r\n };\r\n\r\n const isOptionsDisabled =\r\n !selectedPractisSets ||\r\n (selectedPractisSets && !selectedPractisSets.length);\r\n\r\n const orderBy = searchParams.orderBy;\r\n const hcName = useOrderBy('pset_name', orderBy, setOrderBy);\r\n\r\n const hcLastTrainingAt = useOrderBy('last_training', orderBy, setOrderBy);\r\n const hcAssigned = useOrderBy('assigned', orderBy, setOrderBy);\r\n const hcStarted = useOrderBy('started', orderBy, setOrderBy);\r\n const hcAccuracyAvg = useOrderBy('accuracy', orderBy, setOrderBy);\r\n const hcTrainingTime = useOrderBy('training_time', orderBy, setOrderBy);\r\n const hcProgressValue = useOrderBy('progress', orderBy, setOrderBy);\r\n const hcOverdue = useOrderBy('due_date', orderBy, setOrderBy);\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters:\r\n (searchParams.labelIDs?.length || 0) +\r\n (searchParams.filterByStatus?.length || 0) +\r\n (searchParams.filterByDueDate?.length || 0),\r\n itemsCount: practisSets?.items.length || 0,\r\n });\r\n\r\n const onSelectStatus = (status: string[]) => {\r\n setSelectedStatuses(status);\r\n };\r\n const onSaveStatus = (status: string[]) => {\r\n setSavedStatuses(status);\r\n };\r\n\r\n const isTeamLead = isTeamLeader(profile?.role?.name);\r\n\r\n useImperativeHandle(reff, () => {\r\n return {\r\n refreshSearchParams,\r\n };\r\n });\r\n\r\n /**\r\n * Returns due date column data.\r\n * @param { Boolean } hasOverdue - Boolean, describes practis set is overdue or not\r\n * @param { Date } dueDate - Date, due date of practis set\r\n * @param { string } completedAt - String, date of completion\r\n * @returns { ReactNode | String }\r\n */\r\n const showDueDateData = (\r\n hasOverdue?: boolean,\r\n dueDate?: string | null,\r\n completedAt?: string\r\n ): ReactNode | string => {\r\n const Flag = hasOverdue && !completedAt ? <StyledOverdueFlag /> : null;\r\n const dueDateData = dueDate ? (\r\n <DueDateWrapper>\r\n {formatDateWithTimeZone(dueDate)}\r\n {Flag}\r\n </DueDateWrapper>\r\n ) : null;\r\n\r\n return dueDateData;\r\n };\r\n\r\n const filterIconCount =\r\n savedStatuses.length +\r\n (searchParams.labelIDs?.length || 0) +\r\n (searchParams?.filterByDueDate?.length || 0);\r\n\r\n /**\r\n * @function onConfirmDeletePractisSet\r\n * @param { number[] } practisSetIds\r\n * @returns { void }\r\n */\r\n const onConfirmDeletePractisSet = (practisSetIds: number[]): void => {\r\n !isEmpty(practisSetIds) && handleUnEnrollPractisSet(practisSetIds);\r\n };\r\n\r\n /**\r\n * @function handleDeletePractisSet\r\n * @param { number[] } ids\r\n * @returns { void }\r\n */\r\n const handleDeletePractisSets = (ids: number[]) => {\r\n showConfirmationModalDialog({\r\n modalTitle: 'Are you sure?',\r\n description: 'User will get notified about this change.',\r\n cancelButtonText: 'Go Back',\r\n confirmButtonText: 'Proceed',\r\n onConfirm: () => onConfirmDeletePractisSet(ids),\r\n customization: {\r\n padding: '32px 32px 32px 40px',\r\n titleMarginBottom: 14,\r\n descriptionMarginBottom: 37,\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * @function handleDeleteMultiplePractisSets\r\n * @returns { void }\r\n */\r\n const handleDeleteMultiplePractisSets = (): void => {\r\n if (\r\n !isLodashEmpty(practisSets?.items) &&\r\n !isLodashEmpty(selectedPractisSets)\r\n ) {\r\n const enrollmentIds = practisSets?.items\r\n .filter(set => selectedPractisSets?.includes(set.id!))\r\n .map(item => item.id!);\r\n\r\n enrollmentIds && handleDeletePractisSets(enrollmentIds);\r\n }\r\n };\r\n\r\n useSessionEffect(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchUserPractisSets(searchParams);\r\n }, [searchUserPractisSets, searchParams]);\r\n\r\n useEffect(() => {\r\n if (practisSets && practisSets.items) {\r\n onPractisSetsUpdate(practisSets.items.length);\r\n }\r\n }, [onPractisSetsUpdate, practisSets, practisSets?.items]);\r\n\r\n useEffect(() => {\r\n if (updatedPractisSets || updatedLabels?.data) {\r\n refreshSearchParams();\r\n }\r\n }, [updatedPractisSets, updatedLabels?.data, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n const filteredUsers = practisSets\r\n ? practisSets.items.map(practisSet => Number(practisSet.id))\r\n : [];\r\n const usersToClear = clearSelectedItemIfNotLoaded(\r\n selectedPractisSets,\r\n filteredUsers\r\n );\r\n if (usersToClear && usersToClear.length > 0) {\r\n updateAllPractisSetsCheckedState(usersToClear, false);\r\n }\r\n }, [selectedPractisSets, practisSets, updateAllPractisSetsCheckedState]);\r\n\r\n useEffect(() => {\r\n return () => updateAllPractisSetsCheckedState([], false, false);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n updateAllPractisSetsCheckedState([], false, false);\r\n }, [\r\n practisSets,\r\n history.location.pathname,\r\n updateAllPractisSetsCheckedState,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedPractisSets?.length &&\r\n selectedPractisSets.length === practisSets?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [practisSets?.count, selectedPractisSets]);\r\n\r\n useEffect(() => {\r\n if (pageIndex >= 1) {\r\n setTimeout(() => {\r\n setOffset(initialOffset);\r\n }, 100);\r\n }\r\n }, [initialOffset, pageIndex, setOffset]);\r\n\r\n useEffect(() => {\r\n setCustom(\r\n 'filterByStatus',\r\n savedStatuses.length > 0 ? savedStatuses : null\r\n );\r\n }, [savedStatuses, setCustom]);\r\n\r\n useEffect(() => {\r\n canAccessPage([NEW_PERMISSIONS.LIST_PRACTIS_SET]);\r\n }, [canAccessPage]);\r\n\r\n /**\r\n * @function handlePageChange\r\n * @param { number } limit\r\n * @param { number } offset\r\n * @returns { void }\r\n */\r\n const handlePageChange = (limit: number, offset: number): void => {\r\n setOffset(offset);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n updateAllPractisSetCheck(event.target.checked);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onRowClick\r\n * @param { EnrollmentInterface } enrollment\r\n * @returns { void }\r\n */\r\n const onRowClick = (enrollment: EnrollmentInterface) => {\r\n handleViewPractisSetReport(enrollment.user.id, enrollment.id);\r\n };\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { EnrollmentInterface } enrollment\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (enrollment: EnrollmentInterface): boolean =>\r\n !!selectedPractisSets &&\r\n !!enrollment.practisSet.id &&\r\n selectedPractisSets.includes(enrollment.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { EnrollmentInterface } enrollment\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, enrollment: EnrollmentInterface) => {\r\n handlePractisSetCheck(event, enrollment);\r\n setIsSelectAll(false);\r\n };\r\n\r\n return (\r\n <>\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={practisSets?.items}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: practisSets?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: handlePageChange,\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n searchParams.labelIDs?.length,\r\n dataTest: 'user-profile-paging',\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled: tableStates.disableSearch,\r\n dataTest: 'user-profile-search-input',\r\n },\r\n isSelectedItemOptionsVisible:\r\n !isLodashEmpty(selectedPractisSets) &&\r\n !isLodashEmpty(practisSets),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedPractisSets?.length,\r\n totalCount: practisSets?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: () => {\r\n updateAllPractisSetsCheckedState([], false, false);\r\n setIsSelectAll(false);\r\n },\r\n onSelectAll: () => {\r\n const ids =\r\n (practisSets &&\r\n practisSets.items.map(\r\n (item: EnrollmentInterface) =>\r\n item.id as number\r\n )) ||\r\n ([] as number[]);\r\n updateAllPractisSetsCheckedState(\r\n ids,\r\n true,\r\n isCheckboxPartiallySelected\r\n );\r\n setIsSelectAll(true);\r\n },\r\n bulkActionsConfig: {\r\n disabled: isOptionsDisabled,\r\n removePractisSetPermission: [\r\n NEW_PERMISSIONS.UNASSIGN_ENROLLMENT,\r\n ],\r\n onRemovePractisSetSubmit:\r\n handleDeleteMultiplePractisSets,\r\n isSelectAll: isSelectAll,\r\n totalCount: practisSets?.count,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <UserProfileFilters\r\n selectedStatuses={selectedStatuses}\r\n savedStatuses={savedStatuses}\r\n handleSelectStatus={onSelectStatus}\r\n handleSaveStatus={onSaveStatus}\r\n onSuccessApply={() => hide()}\r\n onOverdueChange={filterOverdueHandler}\r\n dueDate={\r\n (searchParams.filterByDueDate as DueDateFilters[]) ||\r\n []\r\n }\r\n isInvitation={isInvitation}\r\n />\r\n )}\r\n horizontalOffset={216}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={filterIconCount}\r\n disabled={tableStates.disableFilters}\r\n dataTest=\"user-profile-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && practisSets?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: Box,\r\n text: 'No Practis Sets Assigned Yet',\r\n dataTest: 'no-user-practis-sets',\r\n width: '140px'\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Practis Sets',\r\n dataTest: 'no-found-user-practis-sets',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked:\r\n !!selectedPractisSets &&\r\n !!selectedPractisSets.length,\r\n disabled:\r\n !practisSets || practisSets?.items?.length < 1,\r\n partial:\r\n (practisSets?.count &&\r\n practisSets.count > ITEMS_PER_PAGE &&\r\n !isSelectAll) ||\r\n isCheckboxPartiallySelected ||\r\n false,\r\n handleCheck: onCheckMasterCheckbox,\r\n dataTest: 'user-profile-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Practis Sets',\r\n width: 19,\r\n ...hcName,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'practis-sets-column',\r\n },\r\n {\r\n title: 'Due Date',\r\n width: 8,\r\n ...hcOverdue,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'due-date-column',\r\n },\r\n {\r\n title: 'Progress',\r\n width: 12,\r\n ...(isInvitation ? null : hcProgressValue),\r\n disabled: tableStates.disableSorting,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The percentage completion of all the items in a Practis Set.',\r\n dataTest: 'progress-column',\r\n },\r\n {\r\n title: 'Accuracy',\r\n width: 12,\r\n ...(isInvitation ? null : hcAccuracyAvg),\r\n disabled: tableStates.disableSorting,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The average of the accuracy scores for all submitted scenario accuracy tests.',\r\n dataTest: 'accuracy-column',\r\n },\r\n {\r\n title: 'Training Time',\r\n width: 15,\r\n ...(isInvitation ? null : hcTrainingTime),\r\n disabled: tableStates.disableSorting,\r\n withTooltip: true,\r\n tooltipText:\r\n 'The total time spent by a user learning material.',\r\n dataTest: 'training-time-column',\r\n },\r\n {\r\n title: 'Assigned',\r\n width: 15,\r\n ...hcAssigned,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'assigned-column',\r\n },\r\n {\r\n title: 'Started',\r\n width: 15,\r\n ...(isInvitation ? null : hcStarted),\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'started-column',\r\n },\r\n {\r\n title: 'Last Training',\r\n width: 8,\r\n ...(isInvitation ? null : hcLastTrainingAt),\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'last-training-column',\r\n },\r\n {\r\n width: 2,\r\n },\r\n ],\r\n rowConfig: {\r\n onRowClick: onRowClick,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n dataTest: 'user-practis-set-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.practisSet.name,\r\n fieldProps: {\r\n isOverFlowText: true,\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) => enrollment?.practisSet.name,\r\n dataTest: 'user-practis-set-name',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.dueDate,\r\n fieldProps: {\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) =>\r\n showDueDateData(\r\n enrollment.hasOverdue,\r\n enrollment.dueDate,\r\n enrollment.completedAt\r\n ) ?? '',\r\n dataTest: 'user-practis-set-due-date',\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n getCustomFieldComponent: (\r\n enrollment: EnrollmentInterface\r\n ) => (\r\n <StyledFirstTableContent data-test=\"user-practis-set-progress\">\r\n {!isInvitation ? (\r\n <ProgressBarContainer>\r\n <GeneralProgressCol\r\n count={Math.round(\r\n enrollment.progress *\r\n 100\r\n )}\r\n max={100}\r\n completedAt={\r\n enrollment.completedAt\r\n }\r\n status={enrollment.status}\r\n />\r\n </ProgressBarContainer>\r\n ) : (\r\n 'Not Started'\r\n )}\r\n </StyledFirstTableContent>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.averageAccuracy,\r\n fieldProps: {\r\n isOverFlowText: true,\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) =>\r\n enrollment?.averageAccuracy &&\r\n `${Math.floor(\r\n enrollment.averageAccuracy * 100\r\n )}%`,\r\n dataTest: 'user-practis-set-accuracy',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.trainingTime,\r\n fieldProps: {\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) =>\r\n enrollment.trainingTime &&\r\n `${secondsToMinSimple(\r\n enrollment.trainingTime\r\n )}`,\r\n dataTest: 'user-practis-set-training-time',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.createdAt,\r\n fieldProps: {\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) => formatDate(enrollment?.createdAt),\r\n dataTest: 'user-practis-set-creation-date',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.startedAt,\r\n fieldProps: {\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) =>\r\n enrollment.status ===\r\n EnrollmentStatusEnum.PENDING ||\r\n isInvitation\r\n ? ''\r\n : enrollment.startedAt\r\n ? formatDate(enrollment.startedAt)\r\n : '',\r\n dataTest: 'user-practis-set-enroll-date',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customTableCellStyle,\r\n shouldShowEmptyCell: (\r\n enrollment: EnrollmentInterface\r\n ) => !enrollment?.lastTrainingAt,\r\n fieldProps: {\r\n renderTitle: (\r\n enrollment: EnrollmentInterface\r\n ) => formatDate(enrollment?.lastTrainingAt),\r\n dataTest: 'user-practis-set-last-training',\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n cellClassName: classes.customTableCellStyle,\r\n fieldProps: {\r\n getListActionsComponent: (\r\n enrollment: EnrollmentInterface\r\n ) => (\r\n <ActionButton\r\n customWidth={227}\r\n isHidden={\r\n !!selectedPractisSets?.length\r\n }\r\n dataTest=\"user-practis-set-menu\"\r\n >\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleViewPractisSetReport(\r\n enrollment.user.id,\r\n enrollment.id\r\n );\r\n }}\r\n dataTest=\"view-practis-set-report\"\r\n >\r\n View Practis Set Report\r\n </ActionItem>\r\n </CheckPermission>\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.VIEW_USER_PRACTIS_SET_REPORT,\r\n ]}\r\n >\r\n <ActionItem\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleItemEdit(\r\n enrollment\r\n );\r\n }}\r\n dataTest={`${\r\n isTeamLead\r\n ? 'view'\r\n : 'edit'\r\n }-practis-set`}\r\n >\r\n {isTeamLead\r\n ? 'View'\r\n : 'Edit'}{' '}\r\n Practis Set\r\n </ActionItem>\r\n </CheckPermission>\r\n\r\n {!(enrollment.progress !== null) &&\r\n !enrollment.startedAt &&\r\n !isInvitation && (\r\n <ActionItem\r\n onClick={e => {\r\n remindUsers([\r\n enrollment.id ??\r\n 0,\r\n ]);\r\n }}\r\n dataTest=\"remind-practis-set\"\r\n >\r\n Remind\r\n </ActionItem>\r\n )}\r\n <CheckPermission\r\n permissions={[\r\n NEW_PERMISSIONS.UNASSIGN_ENROLLMENT,\r\n ]}\r\n >\r\n <ActionItem\r\n destructive={true}\r\n onClick={e => {\r\n e.stopPropagation();\r\n handleDeletePractisSets(\r\n [enrollment.id!]\r\n );\r\n }}\r\n dataTest=\"unassign-practis-set\"\r\n >\r\n Unassign Practis Set\r\n </ActionItem>\r\n </CheckPermission>\r\n </ActionButton>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport const PerformanceSectionContainerRef = forwardRef((props: any, ref) => {\r\n return <PerformanceSectionContainer reff={ref} {...props} />;\r\n});\r\n\r\nexport const PerformanceSectionContainer: FC<{\r\n isInvitation: boolean;\r\n onPractisSetsUpdate(practisSetsCount: number): void;\r\n reff?: MutableRefObject<any>;\r\n}> = ({ isInvitation, onPractisSetsUpdate, reff }) => {\r\n const trainee = useUserPerformanceState();\r\n const params: { userId: string } = useParams();\r\n\r\n const history = useHistory();\r\n const profile = useSelector(getProfileState);\r\n const getUserPerformance = useUserPerformanceService();\r\n const remindUsers = useRemindUsersService();\r\n const userId = trainee?.data?.id?.toString() || '';\r\n const getUserPractisSets = useSearchUserPractisSetsService(userId);\r\n const fetchPortablePractis = usePractisSetsEnrollmentsService(userId);\r\n\r\n const searchUserPractisSets = getUserPractisSets;\r\n const updatedUserPractisSetsState = useUpdatedUserPractisSetsState();\r\n const searchUserPractisSetsDebounced = useSearchDebounced(\r\n searchUserPractisSets\r\n );\r\n\r\n const updateAllPractisSetsCheckedState =\r\n useUpdateAllPractisSetsCheckedStateService();\r\n const updateSelectedPractisSetCheckedState =\r\n useUpdateTraineeProfilePractisSetsCheckedStateService();\r\n const unEnrollPractisSetService = useUnEnrollPractisSetService();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const setAssignPractisSetsAction =\r\n useUpdateAssignedLibraryPractisSetService();\r\n const resetUserPerformance = useResetUserPerformanceService();\r\n\r\n const perfSecConRef = useRef<any>(null);\r\n\r\n useImperativeHandle(reff, () => {\r\n return {\r\n refreshPractisSetsSearch: () =>\r\n perfSecConRef.current?.refreshSearchParams(),\r\n };\r\n });\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetUserPerformance();\r\n };\r\n }, [resetUserPerformance]);\r\n\r\n return (\r\n <PerformanceSectionRef\r\n trainee={trainee.data}\r\n params={params}\r\n history={history}\r\n profile={profile}\r\n searchUserPractisSets={searchUserPractisSetsDebounced}\r\n fetchPortablePractisSets={fetchPortablePractis}\r\n practisSets={trainee.practisSets}\r\n loading={trainee.loading || trainee.practisSetsLoading}\r\n selectedPractisSets={trainee.selectedPractisSets}\r\n updatedPractisSets={updatedUserPractisSetsState.data}\r\n updateAllPractisSetsCheckedState={updateAllPractisSetsCheckedState}\r\n updateSelectedPractisSetCheckedState={\r\n updateSelectedPractisSetCheckedState\r\n }\r\n setAssignPractisSetsAction={setAssignPractisSetsAction}\r\n updatedLabels={updatedLabels}\r\n unEnrollPractisSetService={unEnrollPractisSetService}\r\n isInvitation={isInvitation}\r\n onGetTrainee={getUserPerformance}\r\n remindUsers={remindUsers}\r\n ref={perfSecConRef}\r\n onPractisSetsUpdate={onPractisSetsUpdate}\r\n />\r\n );\r\n};\r\n\r\nexport default PerformanceSectionContainer;","import React, { FC, useCallback, useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { PortableLabelsWithStore } from '../../../../../../portableLabels';\r\nimport { useCalculatePreSelectedLabels } from '../../../../../../labels/tools';\r\nimport { useIfChanged } from '../../../../../../../helpers/hooks/usePreviousData';\r\nimport {\r\n useResetSelectedLabels,\r\n useSelectLabels,\r\n} from '../../../../../../portableLabels/store/hors/withLabels/services';\r\nimport { useLabelsState } from '../../../../../../portableLabels/store/hors/withLabels/states';\r\nimport { getCompanyState } from '../../../../../../../pages/CompanySettings/store/reducers';\r\nimport { PerformanceTrainee } from '../../../../../../../constants/interfaces/PerformanceTrainee';\r\n\r\nexport const FilterLabels: FC<{\r\n user?: PerformanceTrainee;\r\n}> = ({ user }) => {\r\n const labelsState = useLabelsState();\r\n const calculatePreSelectedLabels = useCalculatePreSelectedLabels();\r\n const company = useSelector(getCompanyState);\r\n const select = useSelectLabels();\r\n const resetSelected = useResetSelectedLabels();\r\n const ifCompanyChanged = useIfChanged(company);\r\n\r\n const getPreselectedLabels = useCallback((): number[] | null => {\r\n if (user) {\r\n const processedUser = {\r\n ...user,\r\n labels:\r\n user?.labels?.map((labelId: number) => ({ id: labelId })) ??\r\n [],\r\n };\r\n\r\n const { preAssignedLabels } = calculatePreSelectedLabels(\r\n [user.id!],\r\n {\r\n items: [processedUser],\r\n }\r\n );\r\n return preAssignedLabels;\r\n }\r\n\r\n return null;\r\n }, [user, calculatePreSelectedLabels]);\r\n\r\n const setDefaultState = useCallback(() => {\r\n const preselectedLabels = getPreselectedLabels();\r\n\r\n if (preselectedLabels !== null) {\r\n select(preselectedLabels);\r\n }\r\n }, [select, getPreselectedLabels]);\r\n\r\n useEffect(() => {\r\n setDefaultState();\r\n }, [setDefaultState, user]);\r\n\r\n useEffect(() => {\r\n setDefaultState();\r\n }, [setDefaultState]);\r\n\r\n useEffect(() => {\r\n if (ifCompanyChanged) {\r\n resetSelected();\r\n setDefaultState();\r\n\r\n const preselectedLabels = getPreselectedLabels();\r\n\r\n if (preselectedLabels !== null) {\r\n select(preselectedLabels);\r\n }\r\n }\r\n }, [\r\n getPreselectedLabels,\r\n ifCompanyChanged,\r\n labelsState.selected,\r\n select,\r\n resetSelected,\r\n setDefaultState,\r\n ]);\r\n\r\n return (\r\n <PortableLabelsWithStore\r\n showSelectActions\r\n showSave={false}\r\n showSearch\r\n />\r\n );\r\n};\r\n","import React, { FC, useEffect } from 'react';\r\nimport { useCalculatePreSelectedPractisSets } from '../../../../../../portablePractisSets/tools';\r\nimport { PortablePractisSetsWithStore } from '../../../../../../portablePractisSets';\r\nimport { useSelectMultiplePractisSets } from '../../../../../../portablePractisSets/store/hors/withPractisSets/services';\r\nimport { PractisSetWithDueDate } from '../../../../../../../constants/interfaces/Draft';\r\n\r\nconst FilterPractisSets: FC<{\r\n practisSetDueDates: PractisSetWithDueDate[] | undefined;\r\n setInitialPractisSets?(practisSetId: PractisSetWithDueDate[]): void;\r\n}> = ({ practisSetDueDates, setInitialPractisSets }) => {\r\n const setPractisSets = useSelectMultiplePractisSets();\r\n const calculatePreSelectedPractisSets = useCalculatePreSelectedPractisSets();\r\n\r\n useEffect(() => {\r\n if (setInitialPractisSets) {\r\n let practisSetsToSet = practisSetDueDates ?? []\r\n setInitialPractisSets(practisSetsToSet);\r\n setPractisSets(practisSetsToSet);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [calculatePreSelectedPractisSets]);\r\n\r\n return (\r\n <PortablePractisSetsWithStore\r\n showSave={false}\r\n showSelectActions={true}\r\n showSearch={true}\r\n resetSelectedOnUnmount={true}\r\n />\r\n );\r\n};\r\n\r\nexport default FilterPractisSets;\r\n","import React, { FC, useEffect } from 'react';\r\nimport { PortableTeamsWithStore } from '../../../../../../portableTeams';\r\nimport { PerformanceTrainee } from '../../../../../../../constants/interfaces/PerformanceTrainee';\r\nimport { useSelectMultipleTeams } from '../../../../../../portableTeams/store/hors/withTeams/services';\r\n\r\nconst FilterTeams: FC<{\r\n user?: PerformanceTrainee;\r\n setInitialTeams?: boolean;\r\n showDefaultMembers?: boolean;\r\n}> = ({ user, showDefaultMembers, setInitialTeams }) => {\r\n const setTeams = useSelectMultipleTeams();\r\n\r\n useEffect(() => {\r\n if (setInitialTeams) {\r\n const preSelectedTeams = user?.teams ?? [];\r\n \r\n setTeams(preSelectedTeams);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <PortableTeamsWithStore\r\n showDefaultMembers={showDefaultMembers}\r\n showSave={false}\r\n showSelectActions={true}\r\n fetchOnMount={false}\r\n showSearch={true}\r\n resetSelectedOnUnmount={true}\r\n />\r\n );\r\n};\r\n\r\nexport default FilterTeams;\r\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n z-index: 2;\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nexport const Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nexport const LabelsContainer = styled.div`\n width: 208px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const PractisSetsContainer = styled.div`\n width: 312px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nexport const ButtonContainer = styled.div`\n margin-right: 16px;\n`;\n\n","import { FC, useState } from 'react';\r\nimport { useCalculateDeletedLabels } from '../../../../labels/tools';\r\nimport { Button } from '../../../../../ui/components/Button';\r\nimport { Fieldset } from '../../../../../ui/components/Fieldset';\r\nimport { FilterLabels } from './components/FilterLabels/FilterLabels';\r\nimport FilterPractisSets from './components/FilterPractisSets/FilterPractisSets';\r\nimport {\r\n useCalculateDeletedEnrollments,\r\n calculateCreatedUpdatedEnrollmentIds,\r\n} from '../../../../portablePractisSets/tools';\r\nimport { usePractisSetsState } from '../../../../portablePractisSets/store/hors/withPractisSets/states';\r\nimport { useLabelsState } from '../../../../portableLabels/store/hors/withLabels/states';\r\nimport FilterTeams from './components/FilterTeams/FilterTeams';\r\nimport { useTeamsState } from '../../../../portableTeams/store/hors/withTeams/states';\r\nimport { useCalculateDeletedTeams } from '../../../../portableTeams/tools';\r\nimport { PerformanceTrainee } from '../../../../../constants/interfaces/PerformanceTrainee';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../../../pages/UserProfile/store/reducers';\r\nimport {\r\n isCompanyAdminRole,\r\n isPractisAdminRole,\r\n isTeamLeader,\r\n} from '../../../../../constants/enums';\r\nimport { useUserPerformanceState } from '../../../store/states';\r\nimport { PractisSetWithDueDate } from '../../../../../constants/interfaces/Draft';\r\nimport dayjs from 'dayjs';\r\nimport { DATE_FORMAT } from '../../../../../constants/interfaces/DueDates';\r\nimport {\r\n Actions,\r\n ButtonContainer,\r\n Container,\r\n LabelsContainer,\r\n PractisSetsContainer,\r\n TeamsContainer,\r\n Wrapper,\r\n} from './styles';\r\nimport { EnrollmentsDueDateType } from '../../../../../api/enrollments/types';\r\n\r\nexport const AssignFilters: FC<{\r\n user?: PerformanceTrainee;\r\n assignFilters(\r\n assignedLabels: number[],\r\n deletedLabels: number[],\r\n assignedPractisSets: PractisSetWithDueDate[],\r\n deletedEnrollmentIds: number[],\r\n assignedTeams: number[],\r\n deletedTeams: number[],\r\n updatedEnrollments: EnrollmentsDueDateType[]\r\n ): Promise<boolean>;\r\n onSuccessApply: (isCancel?: boolean) => void;\r\n}> = ({ user, assignFilters, onSuccessApply }) => {\r\n const [saving, setSaving] = useState(false);\r\n\r\n const { selected: selectedLabels } = useLabelsState();\r\n const trainee = useUserPerformanceState();\r\n\r\n const selectedPractisSets: PractisSetWithDueDate[] =\r\n trainee?._practisSets?.assignFilters?.data?.items?.map(practisSet => ({\r\n practisSetId: practisSet.id ?? 0,\r\n dueDate: practisSet?.dueDate\r\n ? dayjs(practisSet.dueDate).format(DATE_FORMAT)\r\n : null,\r\n })) ?? [];\r\n\r\n const { selected: selectedPractisSetsState } = usePractisSetsState();\r\n const { selected: selectedTeams } = useTeamsState();\r\n const getDeletedLabels = useCalculateDeletedLabels();\r\n const getDeletedEnrollmentIds = useCalculateDeletedEnrollments();\r\n\r\n const getDeletedTeams = useCalculateDeletedTeams();\r\n const [initialPractisSets, setInitialPractisSets] =\r\n useState<PractisSetWithDueDate[]>(selectedPractisSets);\r\n const profile = useSelector(getProfileState);\r\n\r\n const handleApplyFilters = () => {\r\n const assignedLabels = selectedLabels.filter(x => x > 0);\r\n const deletedLabels = getDeletedLabels(selectedLabels);\r\n\r\n const deletedEnrollmentIds = getDeletedEnrollmentIds(\r\n trainee?._practisSets?.assignFilters?.data?.items, \r\n selectedPractisSetsState.map(\r\n practisSetWithDueDate => practisSetWithDueDate.practisSetId\r\n ),\r\n initialPractisSets.map(\r\n practisSetWithDueDate => practisSetWithDueDate.practisSetId\r\n ));\r\n\r\n const { addedPractisSets, updatedEnrollments } = calculateCreatedUpdatedEnrollmentIds(\r\n trainee?._practisSets?.assignFilters?.data?.items,\r\n selectedPractisSetsState,\r\n initialPractisSets);\r\n \r\n const assignedTeams = selectedTeams.filter(x => x > 0);\r\n const initialTeamIds = user?.teams.map((teamId: number) => teamId) || [];\r\n const deletedTeams = getDeletedTeams(selectedTeams, initialTeamIds);\r\n setSaving(true);\r\n\r\n assignFilters(\r\n assignedLabels,\r\n deletedLabels,\r\n addedPractisSets,\r\n deletedEnrollmentIds,\r\n assignedTeams,\r\n deletedTeams,\r\n updatedEnrollments\r\n ).then(() => {\r\n onSuccessApply();\r\n setSaving(false);\r\n });\r\n };\r\n\r\n return (\r\n <Container>\r\n <Wrapper>\r\n {(!isTeamLeader(profile?.role?.name) ||\r\n isCompanyAdminRole(profile?.role?.name)) &&\r\n !isPractisAdminRole(user?.role?.name) && (\r\n <Fieldset\r\n title={'Teams'}\r\n dataTest=\"user-profile-assign-teams\"\r\n >\r\n <TeamsContainer>\r\n <FilterTeams\r\n user={user}\r\n setInitialTeams={true}\r\n showDefaultMembers={true}\r\n />\r\n </TeamsContainer>\r\n </Fieldset>\r\n )}\r\n <Fieldset\r\n title={'Practis Sets'}\r\n dataTest=\"user-profile-assign-practis-sets\"\r\n >\r\n <PractisSetsContainer>\r\n <FilterPractisSets\r\n practisSetDueDates={selectedPractisSets}\r\n setInitialPractisSets={setInitialPractisSets}\r\n />\r\n </PractisSetsContainer>\r\n </Fieldset>\r\n <Fieldset\r\n title={'Labels'}\r\n dataTest=\"labels-section-title\"\r\n >\r\n <LabelsContainer>\r\n <FilterLabels user={user} />\r\n </LabelsContainer>\r\n </Fieldset>\r\n </Wrapper>\r\n <Actions>\r\n <ButtonContainer>\r\n <Button\r\n label={'Cancel'}\r\n variant={'inverse'}\r\n action={() => onSuccessApply(true)}\r\n width={'112px'}\r\n disabled={saving}\r\n />\r\n </ButtonContainer>\r\n <Button\r\n label={'Apply'}\r\n action={handleApplyFilters}\r\n width={'112px'}\r\n loading={saving}\r\n />\r\n </Actions>\r\n </Container>\r\n );\r\n};\r\n","import { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport styled from 'styled-components';\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport {\n isCompanyAdminRole,\n isPractisAdminRole,\n pendingUserRoleTitle,\n userRoleTitle,\n isTeamLeader,\n} from '../../../../constants/enums';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport ROUTES from '../../../../routes/routes';\nimport { useHistory, useParams } from 'react-router';\nimport {\n UserProfile,\n UserInterface,\n} from '../../../../constants/interfaces/User';\nimport { PerformanceTrainee } from '../../../../constants/interfaces/PerformanceTrainee';\nimport { useUserPerformanceState } from '../../store/states';\nimport {\n useNudgeTraineesService,\n useAssignFiltersToUserService,\n useFetchUserAllPractisSets,\n useUserPerformanceService,\n} from '../../store/services';\nimport { useLabelsState } from '../../../labels/store/states';\nimport { useLibraryPractisSetState } from '../../../library/store/states';\nimport { useUpdateAssignedLibraryPractisSetService } from '../../../library/store/services';\nimport {\n useSetAssignLabelsActionService,\n useSetPreviouslyAssignedLabelsAction,\n} from '../../../labels/store/services';\nimport { treeToList } from '../../../../helpers/functions/tree-to-list';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\nimport { History } from 'history';\nimport { CheckPermission } from '../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { Button } from '../../../../ui/components/Button';\nimport { PerformanceSectionContainerRef } from '../../components/PerformanceSection';\nimport { usePermissionsState } from '../../../permissions/store/state';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport { Variables } from '../../../../theme/variables';\nimport { WithPractisSetsContext } from '../../../portablePractisSets';\nimport { Popup } from '../../../../ui/components/Popup';\nimport UpArrow from '../../../../ui/icons/UpArrow';\nimport DownArrow from '../../../../ui/icons/DownArrow';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { AssignFilters } from '../../components/Filters/UserProfileFilters/AssignFilters';\nimport { WithTeamsContext } from '../../../portableTeams';\nimport { PractisSetWithDueDate } from '../../../../constants/interfaces/Draft';\nimport { TableRefresh } from '../../../../ui/components/table-wrapper/table-refresh';\nimport { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\nimport { EnrollmentsDueDateType } from '../../../../api/enrollments/types';\nimport { NudgeData } from '../../../../api/alert/types';\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\n\nconst StyledContainer = styled.div``;\n\nconst StyledUserDetailsInfo = styled.div`\n display: flex;\n width: 100%;\n justify-content: space-between;\n`;\n\nconst ReportGeneralInfoWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n padding: 17px 0 17px 0;\n flex-wrap: wrap;\n`;\n\nconst StyledDetailsAvatar = styled.div`\n height: 48px;\n width: 48px;\n border-radius: 4px;\n margin-right: 22px;\n overflow: hidden;\n`;\n\nconst StyledUserInfoWrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst StyledUserInfoContainer = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst StyledUserInfo = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n`;\n\nconst UserRole = styled.p`\n font-size: 11px;\n font-weight: 600;\n color: ${props => props.theme.Colors.steelGrey};\n margin: 0;\n line-height: 1.2;\n text-transform: capitalize;\n`;\n\nconst StyledName = styled.div<{ isFlex?: boolean }>`\n ${props => !!props.isFlex && `display: flex; align-items: center;`}\n font-size: 15px;\n font-weight: bold;\n color: ${props => props.theme.Colors.black};\n`;\n\nconst StyledEmail = styled.div`\n font-size: 11px;\n font-weight: bold;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst Content = styled.div``;\n\nconst StyledUserOptions = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n align-content: center;\n\n > * {\n &:not(:last-child) {\n margin-right: 16px;\n }\n }\n`;\n\nconst StyledPendingTitle = styled.span`\n font-size: 13px;\n font-weight: 500;\n color: ${props => props.theme.Colors.brown};\n`;\n\nconst StyledPendingInvitationLabel = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 24px;\n border-radius: 20px;\n background-color: ${props => props.theme.Colors.macaroniAndCheeseOpaque};\n padding: 4px 12px;\n margin-left: 10px;\n`;\n\nconst StyledAdditionalInfo = styled.span`\n font-size: 15px;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n color: ${props => props.theme.Colors.steelGrey};\n margin-left: 3px;\n`;\n\nconst StyledLabelActionPanel = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 16px 0;\n`;\n\nconst ActionDropdownsWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nconst StyledAssignAction = styled.div<{ open?: boolean; disabled?: boolean }>`\n display: flex;\n height: 40px;\n width: 152px;\n border-radius: 4px;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n background: ${props => props.theme.Colors.whiteFive};\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.steelGrey};\n border: ${props =>\n props.open\n ? `1px solid ${props.theme.Colors.cloudyBlue}`\n : `1px solid ${props.theme.Colors.whiteFive}`};\n position: relative;\n`;\n\nconst IconHolder = styled.div`\n width: 8px;\n height: 100%;\n display: flex;\n position: absolute;\n right: 15px;\n top: 0;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst StyledLabel = styled.div`\n position: absolute;\n top: 0;\n left: 16px;\n pointer-events: none;\n font-size: 13px;\n font-weight: normal;\n display: flex;\n align-items: center;\n height: 100%;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst Performance: FC<{\n history: History<any>;\n trainee?: PerformanceTrainee;\n profile?: UserProfile;\n onGetTrainee: (userId: number, isInvitation: boolean) => any;\n params: { userId?: number };\n loading?: boolean;\n assignedLabels?: number[];\n setAssignPractisSetsAction?(practisSetIds: number[]): void;\n setAssignLabelsAction?(labelIds: number[]): void;\n setPreviouslyAssignedLabelsAction?(labels: number[]): void;\n assignedPractisSets?: number[];\n showMessage: any;\n company?: CompanyInterface;\n previouslyAssignedLabels?: number[];\n isInvitation: boolean;\n nudgeFromUser?: string;\n onNudgeTrainees(\n nudgeUserDate: NudgeData[],\n successCallback?: () => void\n ): void;\n}> = ({\n history,\n trainee,\n profile,\n onGetTrainee,\n loading,\n params,\n setAssignPractisSetsAction,\n setAssignLabelsAction,\n showMessage,\n company,\n setPreviouslyAssignedLabelsAction,\n previouslyAssignedLabels,\n isInvitation,\n nudgeFromUser,\n onNudgeTrainees,\n}) => {\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [showNudgeDialog, setShowNudgeDialog] = useState(false);\n const [, setPractisSetsCount] = useState(\n trainee && trainee.practisSets && trainee.practisSets.length\n ? trainee.practisSets.length\n : 0\n );\n const [useGoBack, setUseGoBack] = useState(false);\n\n const fetchUserAllPractisSets = useFetchUserAllPractisSets();\n\n const permissions = usePermissionsState();\n\n const handleSettingsClick = useCallback(() => {\n if (trainee && permissions.includes(NEW_PERMISSIONS.VIEW_PROFILE)) {\n history.push(\n ROUTES.PROFILE.replace(':userId', trainee.id!.toString())\n );\n }\n }, [history, trainee, permissions]);\n\n const onNudgeUserSuccessCallback = () => {\n setShowNudgeDialog(false);\n };\n\n const onNudgeSendButtonClicked = useCallback(\n (data: any) => {\n const { text, name: senderName } = data;\n if (trainee && trainee.id) {\n const nudgeUserData: NudgeData = {\n type: 'common',\n enrollmentId: null,\n receiverId: trainee.id,\n text,\n senderName,\n };\n onNudgeTrainees([nudgeUserData], onNudgeUserSuccessCallback);\n }\n },\n [onNudgeTrainees, trainee]\n );\n const shouldAssignTeams =\n (!isTeamLeader(profile?.role?.name) ||\n isCompanyAdminRole(profile?.role?.name)) &&\n !isPractisAdminRole(trainee?.role?.name);\n\n const handleAssignFiltersToCheckedUsers = async (\n assignedLabels: number[],\n deletedLabels: number[],\n assignedPractisSets: PractisSetWithDueDate[],\n deletedEnrollmentIds: number[],\n assignedTeams: number[],\n deletedTeams: number[],\n updatedEnrollments: EnrollmentsDueDateType[]\n ) => {\n if (!params.userId) return false;\n\n return assignFiltersToUserService(params.userId, shouldAssignTeams, {\n assignedLabelsIDs: assignedLabels,\n deletedLabelIDs: deletedLabels,\n assignedPractisSetIDs: assignedPractisSets,\n deletedEnrollmentIds: deletedEnrollmentIds,\n assignedTeamIDs: assignedTeams,\n deletedTeamIDs: deletedTeams,\n practisSetsWithEnrollmentIds: assignedPractisSets?.map(\n assignedPractisSet => ({\n enrollmentId: assignedPractisSet.practisSetId,\n dueDate: assignedPractisSet.dueDate,\n })\n ),\n updatedEnrollments\n })\n .then(() => {\n showMessage(`Changes have been saved`, 'success');\n return true;\n })\n .catch(() => {\n return false;\n });\n };\n\n /**\n * @function handleOpenAssignFilter\n * @param { Function } toggleShown\n * @returns { Promise<void> }\n */\n const handleOpenAssignFilter = async (toggleShown: Function) =>\n await fetchUserAllPractisSets(trainee!.id!.toString()).then(() => {\n toggleShown();\n });\n\n const perfRef = useRef<any>(null);\n\n const refreshPractisSets = useCallback(() => {\n perfRef.current?.refreshPractisSetsSearch();\n\n onGetTrainee(params.userId!, isInvitation);\n }, [onGetTrainee, params.userId, isInvitation]);\n\n useEffect(() => {\n if (params.userId) {\n onGetTrainee(params.userId, isInvitation);\n }\n }, [onGetTrainee, params.userId, isInvitation]);\n\n const assignFiltersToUserService = useAssignFiltersToUserService();\n\n const isPending = trainee?.status === 'PENDING';\n\n const refreshData = useCallback(() => {\n if (params.userId) {\n onGetTrainee(params.userId, isInvitation);\n setLastRefreshed(new Date());\n }\n }, [onGetTrainee, params.userId, isInvitation]);\n\n const prevCompanyRef = useRef(company);\n useEffect(() => {\n prevCompanyRef.current = company;\n });\n const prevCompany = prevCompanyRef.current;\n\n useEffect(() => {\n if (!company!.id || !prevCompany!.id) return;\n if (company!.id !== prevCompany!.id) {\n history.push(ROUTES.USERS);\n }\n }, [company, prevCompany, history]);\n\n useEffect(() => {\n if (\n trainee &&\n trainee.labels &&\n trainee.labels.length &&\n setPreviouslyAssignedLabelsAction &&\n params.userId &&\n trainee.id === parseInt(params.userId.toString())\n ) {\n const flatList = treeToList((trainee && trainee.labels) || []);\n const flatListIds = flatList.map((item: any) => item.id);\n const labelIds = trainee.labels.map(label => label.id);\n const updatedFlatListIds = flatListIds.map((id: any) =>\n labelIds.includes(id) ? id : -id\n );\n setPreviouslyAssignedLabelsAction(updatedFlatListIds);\n }\n }, [trainee, setPreviouslyAssignedLabelsAction, params.userId]);\n\n useEffect(() => {\n if (\n previouslyAssignedLabels &&\n previouslyAssignedLabels.length &&\n setAssignLabelsAction\n ) {\n setAssignLabelsAction(previouslyAssignedLabels);\n }\n }, [setAssignLabelsAction, previouslyAssignedLabels]);\n\n useEffect(() => {\n if (isInvitation && trainee && trainee.practisSets) {\n const assignedPractisSets = trainee.practisSets.map(\n (set: any) => set.id\n );\n\n setAssignPractisSetsAction?.(assignedPractisSets);\n }\n }, [trainee, setAssignPractisSetsAction, isInvitation]);\n\n useEffect(() => {\n return () => {\n setAssignPractisSetsAction && setAssignPractisSetsAction([]);\n setAssignLabelsAction && setAssignLabelsAction([]);\n setPreviouslyAssignedLabelsAction &&\n setPreviouslyAssignedLabelsAction([]);\n };\n }, [\n setAssignPractisSetsAction,\n setAssignLabelsAction,\n setPreviouslyAssignedLabelsAction,\n ]);\n\n useEffect(() => {\n // save useGoBack in local state on mount to keep back button working correctly after list paging\n setUseGoBack(!!history.location.state?.useGoBack);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <MainWrapper\n subTitle=\"User Profile\"\n goBackUrl={ROUTES.USERS}\n useGoBack={useGoBack}\n height=\"100%\"\n htmlPageTitle={`User Profile ${\n trainee ? `- ${trainee?.firstName} ${trainee?.lastName}` : ''\n } - Practis`}\n dataTest=\"user-profile\"\n >\n <TableRefresh\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n dataTest=\"user-profile-timestamp\"\n />\n {loading && <LoadingComponent />}\n <StyledContainer>\n <ReportGeneralInfoWrapper>\n <StyledUserDetailsInfo>\n <StyledUserInfoWrapper>\n <StyledDetailsAvatar>\n <AvatarPlaceholder\n profile={\n trainee as unknown as UserInterface\n }\n imgBorderRadius=\"4px\"\n iconWidth={17}\n iconHeight={20}\n bottomPosition={-6}\n noHint={true}\n dataTest=\"user-profile-avatar\"\n />\n </StyledDetailsAvatar>\n <StyledUserInfo>\n {trainee ? (\n <UserRole data-test=\"user-profile-role\">\n {isInvitation\n ? pendingUserRoleTitle(trainee)\n : userRoleTitle(trainee)}\n </UserRole>\n ) : (\n <Skeleton\n variant=\"text\"\n width={20}\n height={10}\n style={{\n background: 'var(--ps-grey-4',\n }}\n />\n )}\n\n {trainee ? (\n <StyledName\n isFlex={isInvitation || isPending}\n data-test=\"user-profile-full-name\"\n >\n {`${trainee?.firstName ?? ''} ${\n trainee?.lastName ?? ''\n }`}\n\n {profile?.id === trainee?.id && (\n <StyledAdditionalInfo>\n (You)\n </StyledAdditionalInfo>\n )}\n\n {(isPending || isInvitation) && (\n <StyledPendingInvitationLabel>\n <StyledPendingTitle data-test=\"pending-registration-label\">\n Pending Registration\n </StyledPendingTitle>\n </StyledPendingInvitationLabel>\n )}\n </StyledName>\n ) : (\n <Skeleton\n variant=\"text\"\n width={100}\n height={10}\n style={{\n background: 'var(--ps-grey-4',\n }}\n />\n )}\n <StyledEmail data-test=\"user-profile-email\">\n {trainee?.email ?? (\n <Skeleton\n variant=\"text\"\n width={150}\n height={10}\n style={{\n background: 'var(--ps-grey-4',\n }}\n />\n )}\n </StyledEmail>\n </StyledUserInfo>\n </StyledUserInfoWrapper>\n <StyledUserInfoContainer>\n <StyledUserOptions>\n <StyledLabelActionPanel>\n <ActionDropdownsWrapper>\n <WithLabelsContext.Provider\n value={{\n reducerName: 'draftEdit',\n scope: 'assignFilters',\n }}\n >\n <WithPractisSetsContext.Provider\n value={{\n reducerName: 'draftEdit',\n scope: 'assignFilters',\n }}\n >\n <Popup<HTMLDivElement>\n content={({ hide }) => (\n <AssignFilters\n onSuccessApply={(\n isCancel?: boolean\n ) => {\n if (!isCancel) {\n refreshPractisSets();\n }\n hide();\n }}\n user={trainee}\n assignFilters={\n handleAssignFiltersToCheckedUsers\n }\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n {(\n ref,\n { toggleShown, shown }\n ) => (\n <StyledAssignAction\n ref={ref}\n onClick={() =>\n handleOpenAssignFilter(\n toggleShown\n )\n }\n open={shown}\n data-test=\"user-profile-assign\"\n >\n <StyledLabel>\n Assign...\n </StyledLabel>\n <IconHolder>\n {shown ? (\n <UpArrow />\n ) : (\n <DownArrow />\n )}\n </IconHolder>\n </StyledAssignAction>\n )}\n </Popup>\n </WithPractisSetsContext.Provider>\n </WithLabelsContext.Provider>\n </ActionDropdownsWrapper>\n </StyledLabelActionPanel>\n\n <Button\n width=\"136px\"\n height=\"40px\"\n action={handleSettingsClick}\n variant=\"inverse\"\n disabled={isInvitation || isPending}\n customDisabledColor={\n Variables.Colors.cloudyBlue\n }\n dataTest=\"user-settings\"\n >\n User Settings\n </Button>\n <Button\n width=\"152px\"\n height=\"40px\"\n action={() => setShowNudgeDialog(true)}\n customDisabledColor={\n Variables.Colors.cloudyBlue\n }\n disabled={isInvitation || isPending}\n dataTest=\"nudge-user\"\n >\n Nudge User\n </Button>\n </StyledUserOptions>\n </StyledUserInfoContainer>\n </StyledUserDetailsInfo>\n </ReportGeneralInfoWrapper>\n <TableDivider />\n <CheckPermission\n permissions={[NEW_PERMISSIONS.VIEW_PRACTIS_SET_PROGRESS]}\n >\n <Content>\n {trainee && !loading && (\n <PerformanceSectionContainerRef\n ref={perfRef}\n onPractisSetsUpdate={setPractisSetsCount}\n isInvitation={isInvitation}\n />\n )}\n </Content>\n </CheckPermission>\n </StyledContainer>\n {showNudgeDialog && (\n <DialogWrapper\n customization={{\n width: 480,\n padding: '49px 32px 32px 32px',\n }}\n >\n <NudgeUser\n title={`Send a direct message to ${\n trainee ? trainee.firstName : ''\n } ${trainee ? trainee.lastName : ''}`}\n fromUser={nudgeFromUser}\n onSend={onNudgeSendButtonClicked}\n onClose={() => setShowNudgeDialog(false)}\n placeholder=\"Write your message here…\"\n />\n </DialogWrapper>\n )}\n </MainWrapper>\n );\n};\n\nexport const PerformanceContainer: FC<{ type?: string }> = ({ type }) => {\n const isInvitation = type === 'invitation';\n\n const trainee = useUserPerformanceState();\n const getUserPerformance = useUserPerformanceService();\n const params = useParams();\n const history = useHistory();\n\n const state = useLabelsState();\n const company = useSelector(getCompanyState);\n const libraryState = useLibraryPractisSetState();\n const setAssignPractisSetsAction =\n useUpdateAssignedLibraryPractisSetService();\n const setAssignLabelsAction = useSetAssignLabelsActionService();\n const showMessage = useShowMessage();\n\n const setPreviouslyAssignedLabelsAction =\n useSetPreviouslyAssignedLabelsAction();\n const profile = useSelector(getProfileState);\n const nudgeTrainees = useNudgeTraineesService();\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'draftEdit' }}>\n <WithTeamsContext.Provider value={{ reducerName: 'draftEdit' }}>\n <WithPractisSetsContext.Provider\n value={{ reducerName: 'draftEdit' }}\n >\n <Performance\n history={history}\n trainee={trainee.data}\n profile={profile}\n onGetTrainee={getUserPerformance}\n params={params}\n loading={trainee.loading}\n company={company}\n assignedLabels={state.assignedLabels}\n assignedPractisSets={libraryState.assignedPractisSets}\n setAssignPractisSetsAction={setAssignPractisSetsAction}\n setAssignLabelsAction={setAssignLabelsAction}\n showMessage={showMessage}\n setPreviouslyAssignedLabelsAction={\n setPreviouslyAssignedLabelsAction\n }\n previouslyAssignedLabels={\n state.previouslyAssignedLabels\n }\n isInvitation={isInvitation}\n nudgeFromUser={\n !!profile\n ? `${profile.firstName} ${profile.lastName}`\n : ''\n }\n onNudgeTrainees={nudgeTrainees}\n />\n </WithPractisSetsContext.Provider>\n </WithTeamsContext.Provider>\n </WithLabelsContext.Provider>\n );\n};\n\nexport default PerformanceContainer;","import React, { FC } from 'react';\nimport { Redirect, Route, RouteProps } from 'react-router-dom';\nimport { CompanyInterface } from '../constants/interfaces/Company';\nimport { UserInterface } from '../constants/interfaces/User';\nimport Storage from '../services/Storage';\nimport ROUTES from './routes';\n\nconst isAuthorized = () => {\n return !!Storage.get('token');\n};\n\nexport interface PublicRouterProps extends RouteProps {\n component?: any;\n customPath?: string;\n path?: string;\n profile?: UserInterface;\n company?: CompanyInterface;\n editable?: boolean;\n url?: string;\n}\n\nconst PublicRoute: FC<PublicRouterProps> = ({\n component: Component,\n customPath,\n url,\n children,\n ...rest\n}) => {\n return (\n <Route\n {...rest}\n render={props =>\n isAuthorized() ? (\n <Redirect\n to={{\n pathname: customPath ? customPath : ROUTES.SUBMISSIONS,\n state: { from: props.location },\n }}\n />\n ) : (\n <Component {...props} {...rest} />\n )\n }\n />\n );\n};\n\nexport default PublicRoute;\n","import { CompanyInterface } from '../../constants/interfaces/Company';\nimport { UserInterface } from '../../constants/interfaces/User';\nimport { formatDate, formatTime } from '../../helpers/functions/date-convert';\nimport { LogEvent } from './models/LogEvent';\n\nexport {\n userRoleTitle,\n} from '../../constants/enums';\n\ninterface LogEventInfo {\n event: LogEvent;\n name: string;\n isAdminOnly?: true;\n}\n\nfunction eventInfo(event: LogEvent, name: string, isAdminOnly?: true): LogEventInfo {\n return {\n event,\n name,\n isAdminOnly,\n };\n}\n\nconst eventInfos = [\n eventInfo(LogEvent.CREATE_COMPANY, 'Create Company', true),\n eventInfo(LogEvent.UPDATE_COMPANY, 'Update Company', true),\n eventInfo(LogEvent.DELETE_COMPANY, 'Delete Company', true),\n eventInfo(LogEvent.CREATE_PRACTIS_ADMIN, 'Create Practis Admin', true),\n eventInfo(LogEvent.UPDATE_PRACTIS_ADMIN, 'Update Practis Admin', true),\n eventInfo(LogEvent.DELETE_PRACTIS_ADMIN, 'Delete Practis Admin', true),\n eventInfo(LogEvent.CREATE_SCENARIO, 'Create Scenario'),\n eventInfo(LogEvent.UPDATE_SCENARIO, 'Update Scenario'),\n eventInfo(LogEvent.DELETE_SCENARIO, 'Delete Scenario'),\n eventInfo(LogEvent.CREATE_PRACTIS_SET, 'Create Practis Set'),\n eventInfo(LogEvent.UPDATE_PRACTIS_SET, 'Update Practis Set'),\n eventInfo(LogEvent.DELETE_PRACTIS_SET, 'Delete Practis Set'),\n eventInfo(LogEvent.CREATE_CHALLENGE, 'Create Challenge'),\n eventInfo(LogEvent.UPDATE_CHALLENGE, 'Update Challenge'),\n eventInfo(LogEvent.DELETE_CHALLENGE, 'Delete Challenge'),\n eventInfo(LogEvent.GENERATE_CHALLENGE_FROM_SCENARIO, 'Generate Challenge From Scenario'),\n eventInfo(LogEvent.INVITE_USER, 'Invite User'),\n eventInfo(LogEvent.RESEND_INVITATION, 'Resend Invitation'),\n eventInfo(LogEvent.REVOKE_INVITATION, 'Revoke Invitation'),\n eventInfo(LogEvent.DELETE_USER, 'Delete User'),\n eventInfo(LogEvent.CREATE_STAGING, 'Create Staging'),\n eventInfo(LogEvent.UPDATE_STAGING, 'Update Staging'),\n eventInfo(LogEvent.DELETE_STAGING, 'Delete Staging'),\n eventInfo(LogEvent.CREATE_SUBMISSION, 'Create Submission'),\n eventInfo(LogEvent.UPDATE_SUBMISSION, 'Update Submission'),\n eventInfo(LogEvent.DELETE_SUBMISSION, 'Delete Submission'),\n eventInfo(LogEvent.REVIEW_SUBMISSION, 'Review Submission'),\n eventInfo(LogEvent.CREATE_SCORE, 'Create Score'),\n eventInfo(LogEvent.UPDATE_SCORE, 'Update Score'),\n eventInfo(LogEvent.DELETE_SCORE, 'Delete Score'),\n eventInfo(LogEvent.UPDATE_SETTING, 'Update Setting'),\n eventInfo(LogEvent.CREATE_TEAM, 'Create Team'),\n eventInfo(LogEvent.UPDATE_TEAM, 'Update Team'),\n eventInfo(LogEvent.DELETE_TEAM, 'Delete Team'),\n eventInfo(LogEvent.DUPLICATE_TEAM, 'Duplicate Team'),\n eventInfo(LogEvent.USER_ADDED_INTO_TEAM, 'User Added Into Team'),\n eventInfo(LogEvent.USER_TEAM_LEAD_PROMOTION, 'User Team Lead Promotion'),\n eventInfo(LogEvent.USER_TEAM_LEAD_REVOKE, 'User Team Lead Revoke'),\n eventInfo(LogEvent.CREATE_THEME, 'Create Theme'),\n eventInfo(LogEvent.UPDATE_THEME, 'Update Theme'),\n eventInfo(LogEvent.DELETE_THEME, 'Delete Theme'),\n eventInfo(LogEvent.ASSIGN_THEME_TO_PRACTISE_SET, 'Assign Theme To Practis Set'),\n eventInfo(LogEvent.ADD_COVER_INTO_THEME, 'Add Cover Into Theme'),\n eventInfo(LogEvent.REMOVE_COVER, 'Remove Cover'),\n eventInfo(LogEvent.ASSIGN_COVER_TO_PRACTISE_SET, 'Assign Cover To Practis Set'),\n eventInfo(LogEvent.ASSIGN_COVER_TO_SCENARIO, 'Assign Cover To Scenario'),\n];\n\nconst eventInfosMap = eventInfos.reduce((result, info) => {\n result[info.event] = info;\n return result;\n}, {} as Record<LogEvent, LogEventInfo>);\n\nexport function events(includeAdminOnly?: true): LogEvent[] {\n return eventInfos.filter(i => !!includeAdminOnly || !i.isAdminOnly).map(i => i.event);\n}\n\nexport function eventName(event: LogEvent): string {\n return eventInfosMap[event]?.name || event;\n}\n\nexport function userName(\n user: UserInterface | undefined,\n withEmail: boolean = true\n): string {\n const result = user ? `${user.firstName} ${user.lastName}` : '';\n return withEmail ? `${result} ${userEmail(user)}` : result;\n}\n\nexport function userEmail(user: UserInterface | undefined): string {\n return user ? `(${user.email})` : '';\n}\n\nexport function companyName(company: CompanyInterface | undefined): string {\n return company?.name || '';\n}\n\nexport function companyAndUserNames(company: CompanyInterface | undefined, user: UserInterface | undefined, withEmail: boolean = true): string {\n return `${companyName(company)} ${userName(user, withEmail)}`;\n}\n\nexport function atTime(date: any): string {\n return `at ${formatTime(date, true)} ${formatDate(date)}`;\n}\n\nexport enum PlatformVersions {\n IOS_VERSION = 'IOS_VERSION',\n ANDROID_VERSION = 'ANDROID_VERSION',\n}\n\nconst platformVersionNames = {\n [PlatformVersions.IOS_VERSION]: 'IOS version',\n [PlatformVersions.ANDROID_VERSION]: 'Android version',\n};\n\nexport function platformVersionName(action: PlatformVersions): string {\n return platformVersionNames[action] || '';\n}","import React, { FC } from 'react';\nimport { LogEvent } from '../models/LogEvent';\nimport { LogItem } from '../models/LogItem';\nimport {\n atTime,\n companyName,\n userName,\n userRoleTitle,\n companyAndUserNames,\n platformVersionName,\n} from '../tools';\nimport { Team } from '../../../constants/interfaces/Team';\nimport { TeamMembership } from '../../../constants/interfaces/TeamMembership';\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\nimport { UserInterface } from '../../../constants/interfaces/User';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\nimport { Submission } from '../../../constants/interfaces/Reviews';\nimport { Theme } from '../../../constants/interfaces/Theme';\n\nexport const Details: FC<{\n event: LogItem;\n}> = ({ event: e }) => {\n switch (e.event) {\n case LogEvent.CREATE_COMPANY:\n {\n const c: CompanyInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) created a Company - TulaCo at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n created a Company -{' '}\n {companyName(c)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_COMPANY:\n {\n const c: CompanyInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) deleted a Company - TulaCo at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n deleted a Company -{' '}\n {companyName(c)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_COMPANY:\n {\n const c: CompanyInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) updated a Company - TulaCo at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n updated a Company -{' '}\n {companyName(c)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_PRACTIS_ADMIN:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) created a Practis Admin - Vano Khuroshvili (VKhuroshvili@tula.co) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n created a {userRoleTitle(user)} -{' '}\n {userName(user)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_PRACTIS_ADMIN:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) deleted a Practis Admin - Vano Khuroshvili (VKhuroshvili@tula.co) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n deleted a {userRoleTitle(user)} -{' '}\n {userName(user)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_PRACTIS_ADMIN:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Practis Admin Max Rogozhin (maxim@tula.co) updated a Practis Admin - Vano Khuroshvili (VKhuroshvili@tula.co) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} {userName(e.creator)}{' '}\n updated a {userRoleTitle(user)} -{' '}\n {userName(user)} {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_SCENARIO:\n {\n const scenario: Scenario | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) created a Scenario - <Scenario name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Scenario - {scenario?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_SCENARIO:\n {\n const scenario: Scenario | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) deleted a Scenario - <Scenario name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Scenario - {scenario?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_SCENARIO:\n {\n const scenario: Scenario | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) updated a Scenario - <Scenario name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Scenario - {scenario?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_PRACTIS_SET:\n {\n const practisSet: PractisSets | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) created a Practis Set - <Practis Set name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Practis Set - {practisSet?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_PRACTIS_SET:\n {\n const practisSet: PractisSets | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) deleted a Practis Set - <Practis Set name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Practis Set - {practisSet?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_PRACTIS_SET:\n {\n const practisSet: PractisSets | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) updated a Practis Set - <Practis Set name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Practis Set - {practisSet?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_CHALLENGE:\n {\n const challenge: Challenge | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) created a Challenge - <Challenge name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Challenge - {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_CHALLENGE:\n {\n const challenge: Challenge | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) updated a Challenge - <Challenge name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Challenge - {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_CHALLENGE:\n {\n const challenge: Challenge | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) deleted a Challenge - <Challenge name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Challenge - {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.GENERATE_CHALLENGE_FROM_SCENARIO:\n {\n const challenge: Challenge | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) generated a Challenge - <Challenge name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n generated a Challenge - {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.INVITE_USER:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) invited Vasya Pupkin (vpupkin@gmail.com) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n invited {userName(user)}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.RESEND_INVITATION:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) resent invitation to a Trainer - Vasya Pupkin (vpupkin@gmail.com) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n resent invitation to a {userRoleTitle(user)} - {userName(user)}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.REVOKE_INVITATION:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) revoked invitation of a Trainer - Vasya Pupkin (vpupkin@gmail.com) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n revoked invitation of a {userRoleTitle(user)} - {userName(user)}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_USER:\n {\n const user: UserInterface | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) deleted a Trainer - Vasya Pupkin (vpupkin@gmail.com) at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a {userRoleTitle(user)} - {userName(user)}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_STAGING:\n {\n const staging: { name: string } | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) created a Staging - <Staging name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Staging - {staging?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_STAGING:\n {\n const staging: { name: string } | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) updated a Staging - <Staging name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Staging - {staging?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_STAGING:\n {\n const staging: { name: string } | undefined = e.data.payload;\n //ex: Company Admin from <Company Name> Alen Korbut (akorbut@tula.co) deleted a Staging - <Staging name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Staging - {staging?.name || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_SUBMISSION:\n {\n const practisSet: PractisSets | undefined = e.data.payload.practisSet;\n const challenge: Challenge | undefined = e.data.payload.challenge;\n //ex: Company Admin from Poetry Edgar Allan Poe (edgarallanpoe@mailinator.com) created a Submission for Practis Set: Poems by Edgar Allan Poe and Challenge: Eldorado at 7:20:18 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Submission for Practis Set: {practisSet?.name || ''} and\n Challenge: {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_SUBMISSION:\n {\n const practisSet: PractisSets | undefined = e.data.payload.practisSet;\n const challenge: Challenge | undefined = e.data.payload.challenge;\n //ex: Company Admin from Poetry Edgar Allan Poe (edgarallanpoe@mailinator.com) updated a Submission for Practis Set: Poems by Edgar Allan Poe and Challenge: Eldorado at 7:20:18 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Submission for Practis Set: {practisSet?.name || ''} and\n Challenge: {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_SUBMISSION:\n {\n const practisSet: PractisSets | undefined = e.data.payload.practisSet;\n const challenge: Challenge | undefined = e.data.payload.challenge;\n //ex: Company Admin from Poetry Edgar Allan Poe (edgarallanpoe@mailinator.com) deleted a Submission for Practis Set: Poems by Edgar Allan Poe and Challenge: Eldorado at 7:20:18 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Submission for Practis Set: {practisSet?.name || ''} and\n Challenge: {challenge?.title || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n // case LogEvent.REVIEW_SUBMISSION:\n // {\n // //Not tracked yet on BE side \n // }\n case LogEvent.CREATE_SCORE:\n {\n const submission: Submission | undefined = e.data.payload;\n //ex: Practis Admin from TestCo Anna Toloraia (atoloraia5@tula.co) created a review for a Submission with id: 21: at 5:22:46 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a review for a Submission with id: {submission?.id || ''}:{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_SCORE:\n {\n const submission: Submission | undefined = e.data.payload;\n //ex: Practis Admin from TestCo Anna Toloraia (atoloraia5@tula.co) updated a review for a Submission with id: 21: at 5:22:46 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a review for a Submission with id: {submission?.id || ''}:{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_SCORE:\n {\n const submission: Submission | undefined = e.data.payload;\n //ex: Practis Admin from TestCo Anna Toloraia (atoloraia5@tula.co) deleted a review for a Submission with id: 21: at 5:22:46 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a review for a Submission with id: {submission?.id || ''}:{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_SETTING:\n {\n const settings: any | undefined = e.data.payload;\n //ex: Practis Admin from TestCo Anna Toloraia (atoloraia5@tula.co) updated IOS version at 5:22:46 pm Apr 1st, 2020\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated {platformVersionName(settings.key) || settings.key || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.CREATE_TEAM:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) created a Team - <Team name> at 15:00 12.09.2019\n const t: Team | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Team - {t?.name}{' '}\n {atTime(t?.createdAt || e.createdAt)}\n </>\n ); \n }\n case LogEvent.UPDATE_TEAM:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) updated a Team - <Team name> at 15:00 12.09.2019\n const t: Team | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Team - {t?.name}{' '}\n {atTime(t?.createdAt || e.createdAt)}\n </>\n ); \n }\n case LogEvent.DELETE_TEAM:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) deleted a Team - <Team name> at 15:00 12.09.2019\n const t: Team | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Team - {t?.name}{' '}\n {atTime(t?.createdAt || e.createdAt)}\n </>\n ); \n }\n case LogEvent.DUPLICATE_TEAM:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) duplicated a Team - <Team name> at 15:00 12.09.2019\n const t: Team | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n duplicated a Team - {t?.name}{' '}\n {atTime(t?.createdAt || e.createdAt)}\n </>\n ); \n }\n case LogEvent.USER_ADDED_INTO_TEAM:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) added a User with id: <User Id> into a Team with id: <Team Id> at 15:00 12.09.2019\n const tm: TeamMembership | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n added a User with id: {tm?.userId} into a Team with id: {tm?.teamId}{' '}\n {atTime(tm?.createdAt || e.createdAt)}\n </>\n ); \n }\n case LogEvent.USER_TEAM_LEAD_PROMOTION:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) promoted a User to Team Lead at 15:00 12.09.2019\n //const tmIds: number[] | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n promoted a User to Team Lead{' '}\n {atTime(e.createdAt)}\n </>\n ); \n }\n case LogEvent.USER_TEAM_LEAD_REVOKE:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) revoked Team Lead of a User at 15:00 12.09.2019\n //const tmIds: number[] | undefined = e.data.payload;\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n revoked Team Lead of a User{' '}\n {atTime(e.createdAt)}\n </>\n ); \n }\n case LogEvent.CREATE_THEME:\n {\n const theme: Theme | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) created a Theme - <Theme name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n created a Theme - {theme?.title || ''}{' '}\n {atTime(theme?.createdAt || e.createdAt)}\n </>\n );\n }\n case LogEvent.UPDATE_THEME:\n {\n //const theme: Theme | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) updated a Theme - <Theme name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n updated a Theme{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.DELETE_THEME:\n {\n const theme: Theme | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) deleted a Theme - <Theme name> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n deleted a Theme - {theme?.title || ''}{' '}\n {atTime(theme?.createdAt || e.createdAt)}\n </>\n );\n }\n case LogEvent.ASSIGN_THEME_TO_PRACTISE_SET:\n {\n const assignment: { practisSetId: number; } | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) assigned a Theme to a Practis Set with id: <Practis Set Id> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n assigned a Theme to a Practis Set with id: {assignment?.practisSetId || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.ADD_COVER_INTO_THEME:\n {\n const assignment: { coverId: number; themeId: number } | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) added a Cover into a Theme with id: <Theme Id> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n added a Cover into a Theme with id: {assignment?.themeId || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.REMOVE_COVER:\n {\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) removed a Cover at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n removed a Cover{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.ASSIGN_COVER_TO_PRACTISE_SET:\n {\n const assignment: { coverId: number; practisSetId: number } | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) assigned a Cover to a Practis Set with id: <Practis Set Id> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n assigned a Cover to a Practis Set with id: {assignment?.practisSetId || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n case LogEvent.ASSIGN_COVER_TO_SCENARIO:\n {\n const assignment: { coverId: number; scenarioId: number; } | undefined = e.data.payload;\n //ex: Trainer from <Company Name> Daniil Kurchanov (dkurchanov@tula.co) assigned a Cover to a Scenario with id: <Scenario Id> at 15:00 12.09.2019\n return (\n <>\n {userRoleTitle(e.creator)} from {companyAndUserNames(e.company, e.creator)}{' '}\n assigned a Cover to a Scenario with id: {assignment?.scenarioId || ''}{' '}\n {atTime(e.createdAt)}\n </>\n );\n }\n }\n return <>{JSON.stringify(e.data.payload)}</>;\n};","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { LogItem } from '../models/LogItem';\n\nexport enum ACTIONS {\n SEARCH_LOGS_START = 'ADMIN_SEARCH_LOGS_START',\n SEARCH_LOGS_SUCCESS = 'ADMIN_SEARCH_LOGS_SUCCESS',\n SEARCH_LOGS_FAILURE = 'ADMIN_SEARCH_LOGS_FAILURE',\n SEARCH_LOGS_DISPOSE = 'ADMIN_SEARCH_LOGS_DISPOSE',\n}\n\nexport function searchLogsStart() {\n return {\n type: ACTIONS.SEARCH_LOGS_START as ACTIONS.SEARCH_LOGS_START,\n };\n}\n\nexport function searchLogsSuccess(logs: PaginationResult<LogItem>) {\n return {\n type: ACTIONS.SEARCH_LOGS_SUCCESS as ACTIONS.SEARCH_LOGS_SUCCESS,\n logs,\n };\n}\n\nexport function searchLogsFailure(error: string) {\n return {\n type: ACTIONS.SEARCH_LOGS_FAILURE as ACTIONS.SEARCH_LOGS_FAILURE,\n error,\n };\n}\n\nexport function searchLogsDispose() {\n return {\n type: ACTIONS.SEARCH_LOGS_DISPOSE as ACTIONS.SEARCH_LOGS_DISPOSE,\n };\n}\n","import { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { SearchParams } from '../../../constants/interfaces/filters';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useSearchLogsApi } from '../../../api';\nimport {\n searchLogsFailure,\n searchLogsStart,\n searchLogsSuccess,\n} from './actions';\n\nexport const useSearchLogsService = () => {\n const dispatch = useDispatch();\n const searchLogsApi = useSearchLogsApi();\n const showMessage = useShowMessage();\n return useCallback(\n (p: SearchParams) => {\n dispatch(searchLogsStart());\n searchLogsApi(p)\n .then(data => {\n dispatch(searchLogsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchLogsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, searchLogsApi, showMessage]\n );\n};\n","import { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { createSelectorContext } from '../../../tools/redux';\nimport { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { LogItem } from '../models/LogItem';\n\nexport interface LogsState {\n data?: PaginationResult<LogItem>;\n loading?: boolean;\n error?: string;\n}\n\nexport const LogsStateSelectorContext = createSelectorContext<LogsState>();\n\nexport function useLogsState() {\n return useSelector(useContext(LogsStateSelectorContext));\n}\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../Button';\n\ninterface Props {\n className?: string;\n onClick?(): void;\n}\n\nexport const FiltersApplyButton: FC<Props> = props => {\n const { className, onClick } = props;\n return (\n <Root className={className}>\n <Button width=\"122px\" action={onClick} dataTest=\"apply-button\">\n Apply Filter\n </Button>\n </Root>\n );\n};\n\nconst Root = styled.div`\n margin-left: 12px;\n`;\n","import { forwardRef, useCallback } from 'react';\n\nimport FiltersIcon from '../../icons/FiltersIcon';\nimport { Tooltip } from '../Tooltip';\nimport {\n FiltersDot,\n FiltersDotContainer,\n IconContainer,\n IconHolder,\n Root,\n} from './styles';\n\ninterface Props {\n open: boolean;\n disabled?: boolean;\n filtersCount?: number;\n toggleOpen(): void;\n dataTest?: string;\n}\n\nexport const FiltersButton = forwardRef<HTMLButtonElement, Props>(\n (props, ref) => {\n const {\n toggleOpen,\n open,\n disabled = false,\n filtersCount = 0,\n dataTest,\n } = props;\n\n const handleClick = useCallback(\n () => !disabled && toggleOpen(),\n [disabled, toggleOpen]\n );\n\n return (\n <Root\n ref={ref}\n open={open}\n disabled={disabled}\n onClick={handleClick}\n data-test={dataTest}\n >\n <Tooltip label=\"Filters\" preset=\"button-icon\" dataTest=\"filters-tooltip\">\n <IconContainer>\n <IconHolder disabled={disabled}>\n <FiltersIcon />\n </IconHolder>\n {filtersCount > 0 && (\n <FiltersDotContainer>\n <FiltersDot\n data-test={\n dataTest && `${dataTest}-counter`\n }\n />\n </FiltersDotContainer>\n )}\n </IconContainer>\n </Tooltip>\n </Root>\n );\n }\n);\n","import React, { useCallback } from 'react';\nimport styled from 'styled-components';\nimport Checkbox from '../Checkbox';\n\ninterface Props<TValue = any> {\n checked: boolean;\n label: string;\n value?: TValue;\n partial?: boolean;\n disabled?: boolean;\n size?: number;\n onChange?(value?: TValue): void;\n}\n\nexport const FiltersCheckbox = function <TValue = any>(props: Props<TValue>) {\n const { checked, label, value, partial, disabled, size, onChange } = props;\n\n const handleChange = useCallback(() => {\n if (onChange) {\n onChange(value);\n }\n }, [value, onChange]);\n\n return (\n <Root data-test=\"filters-items-checkbox-container\">\n <Checkbox\n checked={checked}\n partial={partial}\n disabled={disabled}\n size={size}\n handleChange={handleChange}\n dataTest=\"filter-item-checkbox\"\n />\n <Label\n disabled={disabled}\n onClick={handleChange}\n data-test={`filter-item-title`}\n >\n {label}\n </Label>\n </Root>\n );\n};\n\nconst Root = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n`;\n\ninterface LabelProps {\n disabled?: boolean;\n}\n\nconst Label = styled.div<LabelProps>`\n color: ${props => props.theme.Colors.black};\n cursor: ${props => (props.disabled ? `default` : `pointer`)};\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 0 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;","import { FC } from 'react';\n\nimport { TableDivider } from '../table-wrapper/table-divider';\n\nexport const FiltersDivider: FC = TableDivider;\n","import React, { useMemo } from 'react';\nimport styled from 'styled-components';\nimport { FiltersCheckbox } from './FiltersCheckbox';\nimport { FiltersDivider } from './FiltersDivider';\n\ninterface Props<TValue = any> {\n items: FiltersCheckboxListItem<TValue>[];\n size?: number;\n divisible?: boolean;\n onChange?(value?: TValue): void;\n}\n\nexport const FiltersCheckboxList = function <TValue = any>(props: Props<TValue>) {\n const {\n items,\n size = 12,\n divisible,\n onChange,\n } = props;\n\n const topItems = useMemo(() => divisible ? items.filter(i => i.checked) : [], [divisible, items]);\n const bottomItems = useMemo(() => divisible ? items.filter(i => !i.checked) : [], [divisible, items]);\n const renderCheckbox = (item: FiltersCheckboxListItem<TValue>) => (\n <FiltersCheckbox\n key={String(item.value)}\n checked={item.checked}\n label={item.label}\n value={item.value}\n partial={item.partial}\n disabled={item.disabled}\n size={size}\n onChange={onChange}\n />\n );\n\n if (divisible) {\n return (\n <Root data-test=\"filter-items-container\">\n <List data-test=\"filters-items-list-container\">\n {topItems.map(renderCheckbox)}\n {!!topItems.length && topItems.length < items.length && <FiltersDivider />}\n {bottomItems.map(renderCheckbox)}\n </List>\n </Root>\n );\n }\n\n return (\n <Root data-test=\"filter-items-container\">\n <List data-test=\"filters-items-list-container\">\n {items.map(renderCheckbox)}\n </List>\n </Root>\n );\n};\n\nexport interface FiltersCheckboxListItem<TValue = any> {\n checked: boolean;\n partial?: boolean;\n disabled?: boolean;\n label: string;\n value?: TValue;\n}\n\nconst Root = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst List = styled.span``; ","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../Button';\n\ninterface Props {\n disabled?: boolean;\n className?: string;\n onClick?(): void;\n}\n\nexport const FiltersClearButton: FC<Props> = props => {\n const { disabled, className, onClick } = props;\n return (\n <Root className={className}>\n <Button\n disabled={disabled}\n width=\"122px\"\n variant=\"inverse\"\n action={onClick}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </Root>\n );\n};\n\nconst Root = styled.div`\n margin-left: 12px;\n`;\n","import { FC } from 'react';\nimport styled, { css } from 'styled-components';\nimport { Fieldset } from '../Fieldset';\n\ninterface Props {\n title?: string;\n width?: number;\n minHeight?: number;\n dataTest?: string;\n}\n\nexport const FiltersFieldSet: FC<Props> = props => {\n const { title, width, minHeight, dataTest, children } = props;\n return (\n <Fieldset title={title} dataTest={dataTest}>\n <Body\n width={width}\n minHeight={minHeight}\n data-test={dataTest && `${dataTest}-body`}\n >\n <Content data-test={dataTest && `${dataTest}-content`}>\n {children}\n </Content>\n </Body>\n </Fieldset>\n );\n};\n\ninterface BodyProps {\n width?: number;\n minHeight?: number;\n}\n\nconst Body = styled.div<BodyProps>`\n flex: 1;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n ${props =>\n !!props.width &&\n css`\n width: ${props.width}px;\n `}\n\n ${props =>\n !!props.minHeight &&\n css`\n min-height: ${props.minHeight}px;\n `}\n`;\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nimport EmptyBox from '../../icons/EmptyBox';\nimport { Loading } from '../LoadingCopmonent';\nimport NoSearchResult from '../../icons/NoSearchResult';\n\ninterface Props {\n itemsName: string;\n loading?: boolean;\n empty?: boolean;\n}\n\nexport const FiltersNoItems: FC<Props> = props => {\n const { itemsName, loading, empty } = props;\n\n if (loading) {\n return (\n <Root>\n <Loading />\n </Root>\n );\n }\n\n return (\n <Root data-test=\"filters-no-item-container\">\n <Column>\n <IconWrapper data-test=\"no-search-result\">\n {empty ? <EmptyBox /> : <NoSearchResult />}\n </IconWrapper>\n <NoItemsTitle data-test='no-items-found'>\n {empty ? `No ${itemsName} yet` : `No ${itemsName} found`}\n </NoItemsTitle>\n </Column>\n </Root>\n );\n};\n\nconst Root = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst Column = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst IconWrapper = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoItemsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nexport const FiltersPopupActions: FC = props => {\n const { children } = props;\n return (\n <Root>\n {children}\n </Root>\n );\n};\n\nconst Root = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-shrink: 0;\n margin-top: 16px;\n`;","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nexport const FiltersPopupBody: FC = props => {\n const { children } = props;\n return (\n <Root>\n {children}\n </Root>\n );\n};\n\nconst Root = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n","import React, { ReactNode } from 'react';\nimport { Popup, PopupProps, DismissProps } from '../Popup';\nimport { FiltersButton } from './FiltersButton';\n\ninterface Props {\n disabled?: boolean;\n filtersCount?: number;\n children(props: PopupProps, dismissProps: DismissProps): ReactNode;\n dataTest?: string;\n}\n\nexport const FiltersPopupButton = (props: Props) => {\n const { disabled = false, filtersCount = 0, children, dataTest = 'filters-selector' } = props;\n\n return (\n <Popup<HTMLButtonElement>\n content={children}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={322}\n >\n {(ref, { toggleShown, shown }) => (\n <FiltersButton\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={filtersCount}\n disabled={disabled}\n dataTest={dataTest}\n />\n )}\n </Popup>\n );\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nexport const FiltersPopupFieldSets: FC = props => {\n const { children } = props;\n return (\n <Root>\n {children}\n </Root>\n );\n};\n\nconst Root = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n","import { FC } from 'react';\n\nimport styled from 'styled-components';\nimport { TableSearchInput } from '../table-wrapper/table-tools/table-search-input';\n\ninterface Props {\n disabled?: boolean;\n onChange?(value: string): void;\n}\n\nexport const FiltersSearchInput: FC<Props> = props => {\n const { disabled, onChange } = props;\n return (\n <Root data-test=\"filters-search-input-container\">\n <TableSearchInput\n disabled={disabled}\n onChange={onChange}\n dataTest=\"filters-search-input\"\n />\n </Root>\n );\n};\n\nconst Root = styled.div`\n margin-bottom: 16px;\n`;","import { FC } from 'react';\nimport styled from 'styled-components';\n\nexport const FiltersSelectedItems: FC = props => {\n const { children } = props;\n return <Root>{children}</Root>;\n};\n\nconst Root = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n`;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { pluralize } from '../../../helpers/functions/pluralize';\n\ninterface Props {\n selectedItemsCount: number;\n itemName: string;\n}\n\nexport const FiltersSelectedItemsText: FC<Props> = props => {\n const { selectedItemsCount, itemName } = props;\n return (\n <Root data-test=\"filters-selected-items-container\">\n {selectedItemsCount > 0\n ? `${pluralize(selectedItemsCount, itemName)} selected`\n : `No ${itemName}s selected`}\n </Root>\n );\n};\n\nconst Root = styled.span`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n`;","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\ninterface Props {\n selectedItemsCount: number;\n}\n\nexport const FiltersSelectedText: FC<Props> = props => {\n const { selectedItemsCount } = props;\n return (\n <Root data-test=\"selected-items-container\">\n {selectedItemsCount} Selected\n </Root>\n );\n};\n\nconst Root = styled.span`\n font-size: 11px;\n font-weight: 500;\n margin-right: 12px;\n color: ${props => props.theme.Colors.steelGrey};\n`;","import React, { FC, useCallback } from 'react';\nimport styled, { css } from 'styled-components';\nimport { Variables } from '../../../theme/variables';\n\ninterface Props {\n allItemsSelected?: boolean;\n disabled?: boolean;\n onToggleAllItems?(allItemsSelected?: boolean): void;\n}\n\nexport const FiltersToggleAllButton: FC<Props> = props => {\n const {\n allItemsSelected,\n disabled,\n onToggleAllItems,\n } = props;\n\n const clickHandler = useCallback(\n () => {\n if (!disabled && onToggleAllItems) {\n onToggleAllItems(!!allItemsSelected);\n }\n },\n [disabled, allItemsSelected, onToggleAllItems]\n ); \n\n return (\n <Root\n disabled={disabled}\n colorsId={allItemsSelected ? 'unselect' : 'select'}\n onClick={clickHandler}\n data-test=\"filters-toggle-select-button\"\n >\n {allItemsSelected ? 'Unselect All' : 'Select All'}\n </Root>\n );\n};\n\ntype ColorsId = 'select' | 'unselect';\n\ntype ColorsInfo = {\n color: string;\n colorHover: string;\n colorActive: string;\n};\n\nconst colorsInfos: Record<ColorsId, ColorsInfo> = {\n select: {\n color: Variables.Colors.darkSkyBlue,\n colorHover: Variables.Colors.lightBlue,\n colorActive: Variables.Colors.windowsBlue,\n },\n unselect: {\n color: Variables.Colors.darkSkyBlue,\n colorHover: Variables.Colors.lightBlue,\n colorActive: Variables.Colors.windowsBlue,\n },\n};\n\nconst Root = styled.span<{\n colorsId: ColorsId;\n disabled?: boolean;\n}>`\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n user-select: none;\n\n ${props =>\n props.disabled\n ? css`\n color: ${props.theme.Colors.cloudyBlue};\n pointer-events: none;\n `\n : css`\n color: ${colorsInfos[props.colorsId].color};\n `}\n\n &:hover {\n color: ${props => colorsInfos[props.colorsId].colorHover};\n }\n &:active {\n color: ${props => colorsInfos[props.colorsId].colorActive};\n }\n &:not(:last-of-type) {\n margin-right: 8px;\n }\n`;","import React, { FC, useCallback, useMemo, useState } from 'react';\nimport { eventName, events } from '../tools';\nimport { LogEvent } from '../models/LogEvent';\nimport {\n FiltersCheckboxList,\n FiltersCheckboxListItem,\n FiltersNoItems,\n FiltersSearchInput,\n FiltersSelectedItems,\n FiltersSelectedItemsText,\n FiltersToggleAllButton,\n} from '../../../ui/components/Filters';\n\ninterface Props {\n selectedEvents: LogEvent[];\n onChangeSelectedEvents(selectedEvents: LogEvent[]): void;\n}\n\nexport const LogFiltersEvents: FC<Props> = props => {\n const { selectedEvents, onChangeSelectedEvents } = props;\n const [eventSearchPattern, setEventSearchPattern] = useState<string>('');\n\n const checkboxListItems: FiltersCheckboxListItem<string>[] = useMemo(() => {\n const pattern = eventSearchPattern.trim().toLowerCase();\n const resultEvents = !!pattern\n ? allEvents.filter(i => i.name.toLowerCase().indexOf(pattern) >= 0)\n : allEvents;\n return resultEvents.map(item => ({\n checked: selectedEvents.includes(item.value),\n label: item.name,\n value: item.value,\n }));\n }, [selectedEvents, eventSearchPattern]);\n\n const filteredEvents: LogEvent[] = useMemo(\n () =>\n allEvents\n .filter(e => !!checkboxListItems.find(c => c.value === e.value))\n .map(e => e.value),\n [checkboxListItems]\n );\n\n const setSelectedEvents = useCallback(\n (events: LogEvent[]) => onChangeSelectedEvents(events),\n [onChangeSelectedEvents]\n );\n\n const handleChangeSearchEventsPattern = useCallback(\n (searchPattern: string) => setEventSearchPattern(searchPattern),\n [setEventSearchPattern]\n );\n\n const handleChangeSelectedEvent = useCallback(\n (event: LogEvent) => {\n setSelectedEvents(\n selectedEvents.includes(event)\n ? selectedEvents.filter(r => r !== event)\n : [...selectedEvents, event]\n );\n },\n [selectedEvents, setSelectedEvents]\n );\n\n const handleClickToggleAllEvents = useCallback(\n allItemsSelected =>\n setSelectedEvents(allItemsSelected ? [] : filteredEvents),\n [filteredEvents, setSelectedEvents]\n );\n\n return (\n <>\n <FiltersSearchInput\n onChange={handleChangeSearchEventsPattern}\n />\n <FiltersSelectedItems>\n <FiltersSelectedItemsText\n itemName=\"Event\"\n selectedItemsCount={selectedEvents.length}\n />\n <FiltersToggleAllButton\n allItemsSelected={\n selectedEvents.length === filteredEvents.length\n }\n onToggleAllItems={handleClickToggleAllEvents}\n />\n </FiltersSelectedItems>\n <FiltersCheckboxList<string>\n items={checkboxListItems}\n divisible={true}\n onChange={handleChangeSelectedEvent}\n />\n {!checkboxListItems.length && <FiltersNoItems itemsName=\"Events\" />}\n </>\n );\n};\n\nconst allEvents = events().map(e => ({ name: eventName(e), value: e }));\n","import React, {\n FC,\n useCallback,\n useMemo,\n} from 'react';\nimport {\n ROLE_NAMES as Roles,\n} from '../../../../constants/enums';\nimport {\n FiltersCheckboxList,\n FiltersCheckboxListItem,\n FiltersNoItems,\n} from '../../../../ui/components/Filters';\nimport { useLoggedInUserRolesHelper } from '../../tools';\nimport { useUserRolesService } from '../../../roles/store/services';\n\ninterface Props {\n selectedRoles: number[];\n onChangeSelectedRoles(selectedRoles: number[]): void;\n}\n\nexport const UserRoleFilters: FC<Props> = props => {\n const { selectedRoles, onChangeSelectedRoles } = props;\n const rolesHelper = useLoggedInUserRolesHelper();\n const { loading, getRoleByName } = useUserRolesService();\n \n const allRoles = useMemo(\n () => loading\n ? [] \n : [Roles.PRACTIS_ADMIN, Roles.COMPANY_ADMIN, Roles.USER].map(\n roleName => {\n const role = getRoleByName(roleName);\n return {\n // temporary solution, possibly needs to be changed from backend\n name: role?.id === 4 ? \"Company Admin\" : role?.title,\n value: role?.id,\n };\n }\n ),\n [loading, getRoleByName]\n );\n\n const roleCheckboxItems: FiltersCheckboxListItem<number>[] = useMemo(\n () => allRoles\n .filter(r => rolesHelper.canViewRole(r.name))\n .map(item => ({\n checked: selectedRoles.includes(item.value),\n label: item.name,\n value: item.value,\n })),\n [allRoles, selectedRoles, rolesHelper]\n );\n\n const setSelectedRoles = useCallback(\n (roleIds: number[]) => onChangeSelectedRoles(roleIds),\n [onChangeSelectedRoles]\n );\n\n const handleSelectedRoleChange = useCallback(\n (roleId: number) => {\n setSelectedRoles(\n selectedRoles.includes(roleId)\n ? selectedRoles.filter(r => r !== roleId)\n : [...selectedRoles, roleId]\n );\n },\n [selectedRoles, setSelectedRoles]\n );\n\n return (\n <>\n {(loading || allRoles.length === 0) && (\n <FiltersNoItems\n itemsName=\"Roles\"\n loading={loading}\n empty={allRoles.length === 0}\n />\n )}\n <FiltersCheckboxList<number>\n items={roleCheckboxItems}\n onChange={handleSelectedRoleChange}\n />\n </>\n );\n};\n","import React, {\n FC,\n useCallback,\n useState,\n} from 'react';\nimport { LogEvent } from '../models/LogEvent';\nimport {\n FiltersApplyButton,\n FiltersClearButton,\n FiltersFieldSet,\n FiltersPopupActions,\n FiltersPopupBody,\n FiltersPopupFieldSets,\n FiltersSelectedText,\n} from '../../../ui/components/Filters';\nimport { LogFiltersEvents } from './LogFiltersEvents';\nimport { UserRoleFilters } from '../../users/components/Filters/UserRoleFilters';\n\ninterface Props {\n roleIds: number[];\n events: LogEvent[];\n onApplyFilter(selectedRoles: number[], selectedEvents: LogEvent[]): void;\n}\n\nexport const LogFilters: FC<Props> = props => {\n const { roleIds, events, onApplyFilter } = props;\n const [selectedRoles, setSelectedRoles] = useState<number[]>(roleIds || []);\n const [selectedEvents, setSelectedEvents] = useState<LogEvent[]>(events || []);\n const totalFiltersSelected = selectedRoles.length + selectedEvents.length;\n\n const handleClickClear = useCallback(\n () => {\n setSelectedRoles([]);\n setSelectedEvents([]);\n },\n [setSelectedRoles, setSelectedEvents]\n );\n\n const handleClickApplyFilter = useCallback(\n () => onApplyFilter(selectedRoles, selectedEvents),\n [selectedRoles, selectedEvents, onApplyFilter]\n );\n\n return (\n <FiltersPopupBody>\n <FiltersPopupFieldSets>\n <FiltersFieldSet title=\"Roles\" width={130}>\n <UserRoleFilters\n selectedRoles={selectedRoles}\n onChangeSelectedRoles={setSelectedRoles}\n />\n </FiltersFieldSet>\n <FiltersFieldSet title=\"Events\" width={208} minHeight={244}>\n <LogFiltersEvents\n selectedEvents={selectedEvents}\n onChangeSelectedEvents={setSelectedEvents}\n />\n </FiltersFieldSet>\n </FiltersPopupFieldSets>\n <FiltersPopupActions>\n <FiltersSelectedText selectedItemsCount={totalFiltersSelected} />\n <FiltersClearButton disabled={!totalFiltersSelected} onClick={handleClickClear} />\n <FiltersApplyButton onClick={handleClickApplyFilter} />\n </FiltersPopupActions>\n </FiltersPopupBody>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoLogs = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n className={className}\n height=\"100%\"\n fill=\"currentColor\"\n viewBox=\"0 0 48 48\"\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M3 48h24.75v-3H4.5c-.828 0-1.5-.67-1.5-1.502V31.5c0-.828.671-1.5 1.5-1.5h9v6h14.25v-3H16.5v-6H3L9 3h30l6 24H31.5v3H48v-3L42 0H6L0 27v18c0 1.657 1.343 3 3 3zm10.5-27h21c.829 0 1.5-.672 1.5-1.5 0-.829-.671-1.5-1.5-1.5h-21c-.829 0-1.5.671-1.5 1.5 0 .828.671 1.5 1.5 1.5zm18-9h-15c-.829 0-1.5-.671-1.5-1.502C15 9.671 15.672 9 16.5 9h15c.829 0 1.5.672 1.5 1.498 0 .83-.671 1.502-1.5 1.502z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n d=\"M35.5 48L33 45.749l5.147-5.249L33 35.25 35.5 33l5 5.1 5-5.1 2.5 2.25-5.148 5.25L48 45.749 45.5 48l-5-5.1-5 5.1z\"\n />\n </svg>\n );\n }\n);\n\nexport default NoLogs;\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nexport const Payload = styled.div`\n overflow: auto;\n height: 400px;\n color: ${props => props.theme.Colors.dark};\n text-align: left;\n`;\n\nexport const StyledDetailsWrapper = styled.div`\n position: relative;\n`;\n\nexport const StyledDetails = styled.div`\n position: absolute;\n top: 10px;\n left: -146px;\n z-index: 1000;\n width: 312px;\n background: ${props => props.theme.Colors.white};\n border-radius: 8px;\n padding: 16px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n paddingLeft: '18px !important',\n },\n\n tableToolsRootStyle: {\n marginLeft: 16,\n },\n}));\n","import { FC, useCallback, useEffect, useState } from 'react';\n\nimport { ActionButton, ActionItem } from '../../../ui/components/ActionButton';\nimport StackIcon from '../../../ui/icons/Stack';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../constants/interfaces/filters';\nimport { PaginationResult } from '../../../constants/interfaces/PaginationResult';\nimport { formatDate } from '../../../helpers/functions/date-convert';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { LogItem } from '../models/LogItem';\nimport { Details } from '../components/Details';\nimport { searchLogsDispose } from '../store/actions';\nimport { useSearchLogsService } from '../store/services';\nimport { useLogsState } from '../store/states';\nimport { eventName, userName, userRoleTitle } from '../tools';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\nimport OutsideActionBox from '../../../ui/components/OutsideActionBox/OutsideActionBox';\nimport { CheckPermission } from '../../permissions';\nimport { NEW_PERMISSIONS } from '../../../constants/enums/permissions';\nimport { LoadingComponent } from '../../../ui/components/LoadingCopmonent';\nimport { CalendarValue } from '../../../ui/components/Calendar';\nimport { useSearchDebounced } from '../../../helpers/hooks/useSearch';\nimport { LogFilters } from '../components/LogFilters';\nimport { FiltersPopupButton } from '../../../ui/components/Filters';\nimport { LogEvent } from '../models/LogEvent';\nimport NoLogs from '../../../ui/icons/NoLogs';\nimport { useSession } from '../../common';\nimport { useHistory } from 'react-router-dom';\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\nimport {\n Payload,\n StyledDetails,\n StyledDetailsWrapper,\n useStyles,\n} from './styles';\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useFilter } from '../../../ui/components/table-wrapper/table/TableDropdown';\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\nimport TableTitleOverflowText from '../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\nimport DialogWrapper from '../../../ui/components/DialogWrapper/DialogWrapper';\nimport { CompanyInterface } from '../../../constants/interfaces/Company';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nexport const CompanyLogs: FC<{\n logs?: PaginationResult<LogItem>;\n company: CompanyInterface;\n searchLogs(searchParams: SearchParams): void;\n onUnmount(): void;\n loading?: boolean;\n session?: string;\n}> = ({ logs, company, searchLogs, onUnmount, loading, session }) => {\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n orderBy: { field: 'createdAt', asc: false },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const classes = useStyles();\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setOffset,\n setFilter,\n getFilterByValue,\n setCustom,\n } = useSearchParamsState(initialSearchParams);\n\n const history = useHistory();\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const [showPreview, setShowPreview] = useState<any>(null);\n\n useEffect(() => {\n if (session) {\n searchLogs(searchParams);\n }\n }, [session, searchLogs, searchParams]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n useEffect(() => () => onUnmount(), [onUnmount]);\n\n const orderBy = searchParams.orderBy;\n const hcEvent = useOrderBy('event', orderBy, setOrderBy);\n const hcCreatedAt = useOrderBy('createdAt', orderBy, setOrderBy);\n const hcRole = useOrderBy('creator.role.title', orderBy, setOrderBy);\n const hcCreator = useOrderBy('creator.firstName', orderBy, setOrderBy);\n\n const events = (getFilterByValue('event') as LogEvent[]) || [];\n const roleIds = (getFilterByValue('creator.roleId') as number[]) || [];\n\n const handleChangeEvent = useFilter('event', setFilter);\n const handleChangeRole = useFilter('creator.roleId', setFilter);\n\n const handleChangeStartDate = useCallback(\n (d?: Date | null) => {\n setCustom('startDate', d);\n },\n [setCustom]\n );\n\n const handleChangeEndDate = useCallback(\n (d?: Date | null) => setCustom('endDate', d),\n [setCustom]\n );\n\n const handleChangeDate = useCallback(\n (date: CalendarValue<true>) => {\n handleChangeStartDate(date.start);\n handleChangeEndDate(date.end);\n },\n [handleChangeStartDate, handleChangeEndDate]\n );\n\n const [payload, setPayload] = useState<any>();\n const handleShowDetails = useCallback(\n (event: LogItem) => setPayload(() => event.data && event.data.payload),\n []\n );\n const handleCloseDetails = useCallback(\n () => setPayload(() => undefined),\n []\n );\n const { startDate, endDate } = searchParams;\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n (!!startDate && !!endDate ? 1 : 0) + roleIds.length + events.length,\n itemsCount: logs?.items.length || 0,\n });\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n\n const refreshData = useCallback(() => {\n searchLogs(searchParams);\n setLastRefreshed(new Date());\n }, [searchLogs, searchParams]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n return (\n <MainWrapper\n subTitle=\"Events Log\"\n htmlPageTitle={`Events Log ${\n company.name ? `- ${company.name}` : ''\n } - Practis`}\n dataTest=\"logs\"\n >\n {loading && <LoadingComponent />}\n {!!payload && (\n <DialogWrapper\n modalTitle=\"Event Details\"\n onCancel={handleCloseDetails}\n cancelButtonText=\"Close\"\n customization={{ width: 600, shouldCenterButton: true }}\n >\n <Payload>{JSON.stringify(payload)}</Payload>\n </DialogWrapper>\n )}\n\n <TableWrapper\n tableStates={tableStates}\n data={logs?.items}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'logs-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: logs?.totalCount ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n searchParams.filters?.length ||\n !!searchParams.startDate ||\n !!searchParams.endDate,\n dataTest: 'logs-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'logs-search',\n },\n filterOptions: {\n filterComponent: (\n <FiltersPopupButton\n disabled={tableStates.disableFilters}\n filtersCount={roleIds.length + events.length}\n dataTest=\"logs-filters\"\n >\n {({ hide }) => (\n <LogFilters\n roleIds={roleIds}\n events={events}\n onApplyFilter={(\n selectedRoles,\n selectedEvents\n ) => {\n handleChangeRole(selectedRoles);\n handleChangeEvent(selectedEvents);\n hide();\n }}\n />\n )}\n </FiltersPopupButton>\n ),\n },\n calendarFilterOptions: {\n calendarPopUpProps: {\n value: {\n start: startDate ? new Date(startDate) : null,\n end: endDate ? new Date(endDate) : null,\n },\n selectRange: true,\n onChange: handleChangeDate,\n restrictFuture: true,\n disabled:\n tableStates.showEmptyState &&\n !searchParams.startDate &&\n !searchParams.endDate,\n dataTest: 'logs-calendar',\n },\n },\n customization: {\n rootClassName: classes.tableToolsRootStyle,\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState: true,\n noEntriesOptions: {\n icon: StackIcon,\n text: 'No Logs Yet',\n dataTest: 'no-logs',\n },\n noSearchResultsOptions: {\n entityName: 'Events Log',\n dataTest: 'no-found-logs',\n },\n noFilterResultsOptions: {\n icon: NoLogs,\n noFilterText: 'No Events Log Found',\n dataTest: 'no-filtered-logs',\n },\n }}\n configurations={{\n columns: [\n {\n title: 'Events',\n width: 24,\n ...hcEvent,\n disabled: tableStates.disableSorting,\n className: classes.customTableCellStyle,\n dataTest: 'name-column',\n },\n {\n title: 'Creator',\n width: 17,\n ...hcCreator,\n disabled: tableStates.disableSorting,\n dataTest: 'creator-column',\n },\n {\n title: 'Role',\n width: 17,\n ...hcRole,\n disabled: tableStates.disableSorting,\n dataTest: 'role-column',\n },\n {\n title: 'Date Created',\n width: 17,\n ...hcCreatedAt,\n disabled: tableStates.disableSorting,\n dataTest: 'date-column',\n },\n {\n title: 'Details',\n width: 25,\n disabled: tableStates.disableSorting,\n dataTest: 'details-column',\n },\n ],\n\n rowConfig: {\n dataTest: 'log-item',\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (log: LogItem) =>\n !log?.event,\n fieldProps: {\n renderTitle: (log: LogItem) =>\n eventName(log?.event),\n dataTest: 'log-item-name',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (log: LogItem) =>\n !log?.creator,\n fieldProps: {\n renderTitle: (log: LogItem) =>\n userName(log?.creator),\n dataTest: 'log-item-creator',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (log: LogItem) =>\n !log?.creator,\n fieldProps: {\n renderTitle: (log: LogItem) =>\n userRoleTitle(log?.creator),\n dataTest: 'log-item-role',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (log: LogItem) =>\n !log?.createdAt,\n fieldProps: {\n renderTitle: (log: LogItem) =>\n formatDate(log?.createdAt),\n dataTest: 'log-item-date',\n },\n },\n {\n fieldType: 'CUSTOM_FIELD',\n shouldShowEmptyCell: (log: LogItem) => !log?.id,\n getCustomFieldComponent: (log: LogItem) => (\n <StyledDetailsWrapper\n onMouseEnter={() => {\n setShowPreview(log.id);\n }}\n onMouseLeave={() => {\n setShowPreview(null);\n }}\n onMouseDown={() => {\n setShowPreview(null);\n }}\n >\n <TableTitleOverflowText dataTest=\"log-item-details-truncated\">\n <Details event={log} />\n </TableTitleOverflowText>\n <OutsideActionBox\n open={showPreview === log.id}\n toggleOpen={setShowPreview}\n >\n <StyledDetails data-test=\"log-item-details\">\n <Details event={log} />\n </StyledDetails>\n </OutsideActionBox>\n </StyledDetailsWrapper>\n ),\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (log: LogItem) => (\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.VIEW_LOG_DETAILS,\n ]}\n >\n <LogActionButton\n event={log}\n onShowDetails={\n handleShowDetails\n }\n />\n </CheckPermission>\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const CompanyLogsContainer: FC = () => {\n const dispatch = useDispatch();\n const logsState = useLogsState();\n const company = useSelector(getCompanyState);\n const session = useSession();\n const searchLogs = useSearchLogsService();\n const searchCompanyLogs = useCallback(\n (searchParams: SearchParams) => {\n if (company?.id) {\n searchLogs(addCompanyFilter(searchParams, company.id));\n }\n },\n [searchLogs, company?.id]\n );\n const searchCompanyLogsDebounced = useSearchDebounced(searchCompanyLogs);\n const handleUnmount = useCallback(() => dispatch(searchLogsDispose()), [\n dispatch,\n ]);\n return (\n <CompanyLogs\n logs={logsState.data}\n company={company}\n searchLogs={searchCompanyLogsDebounced}\n onUnmount={handleUnmount}\n loading={logsState.loading}\n session={session}\n />\n );\n};\n\nexport default CompanyLogsContainer;\n\nfunction addCompanyFilter(\n searchParams: SearchParams,\n companyId: number\n): SearchParams {\n return {\n ...searchParams,\n filters: [\n { field: 'companyId', value: companyId },\n ...(searchParams.filters || []),\n ],\n };\n}\n\nconst LogActionButton: FC<{\n event: LogItem;\n onShowDetails(event: LogItem): void;\n}> = ({ event, onShowDetails }) => {\n const handleClick = useCallback(() => onShowDetails(event), [\n event,\n onShowDetails,\n ]);\n return (\n <ActionButton dataTest=\"log-item-menu\">\n <ActionItem onClick={handleClick} dataTest=\"log-details-action\">Details</ActionItem>\n </ActionButton>\n );\n};\n","import styled from 'styled-components';\n\nexport const Title = styled.div`\n position: relative;\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n width: 100%;\n text-align: center;\n`;\n\nexport const BackArrow = styled.img`\n position: absolute;\n top: 7px;\n left: 0;\n cursor: pointer;\n width: 16px;\n height: 14px;\n`;\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n text-align: center;\n padding-top: 4px;\n`;\n\nexport const MobileNumberContainer = styled.div`\n padding-top: 12px;\n width: 100%;\n`;\n\nexport const SecondaryText = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-grey-4);\n padding-top: 4px;\n padding-bottom: 4px;\n width: 100%;\n`;\n\nexport const ErrorText = styled.div`\n color: var(--ps-red-main);\n`;\n\nexport const ButtonContainer = styled.div`\n padding-top: 20px;\n width: 100%;\n`","import { useCallback, useState } from 'react';\nimport ROUTES from '../../../routes/routes';\nimport { useHistory } from 'react-router';\nimport { Button } from '../../../ui/components/Button';\nimport InputPhone from '../../../ui/components/input/PhoneInput/PhoneInput';\nimport BackArrowImage from '../../../assets/images/icons/back-arrow.svg';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { useGetPhoneCodeApi } from '../../../api';\nimport {\n NOT_FOUND_ERROR_MESSAGE,\n TOO_MANY_REQUESTS_MESSAGE,\n} from './constants';\nimport {\n Title,\n BackArrow,\n Description,\n MobileNumberContainer,\n SecondaryText,\n ErrorText,\n ButtonContainer,\n} from './styles';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nconst MobileNumberLogin = () => {\n const history = useHistory();\n const getPhoneCode = useGetPhoneCodeApi();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [showLoginWithEmail, setShowLoginWithEmail] = useState(false);\n const [mobileNumber, setMobileNumber] = useState<string>('');\n const [isSending, setIsSending] = useState<boolean>(false);\n\n useHtmlPageTitle('Log In With Mobile Number');\n\n /**\n * @description saves changed mobile number and clears error message\n * @function handleMobileNumberChange\n * @param { string } value\n * @returns { void }\n */\n const handleMobileNumberChange = (value: string) => {\n setMobileNumber(value);\n setErrorMessage(null);\n };\n\n /**\n * @description returns error message based on error code\n * @function getErrorMessage\n * @returns { string }\n */\n const getErrorMessage = useCallback((error: ErrorResult) => {\n switch (error.code) {\n case 404:\n return NOT_FOUND_ERROR_MESSAGE;\n case 429:\n return TOO_MANY_REQUESTS_MESSAGE;\n default:\n return error.message;\n }\n }, []);\n\n /**\n * @description sends API request to ask for a verification code\n * @function handleSendCode\n * @returns { void }\n */\n const handleSendCode = useCallback(() => {\n setIsSending(true);\n getPhoneCode(mobileNumber)\n .then((response: any) => {\n setIsSending(false);\n history.push(\n ROUTES.AUTH_PAGES.MOBILE_NUMBER_VERIFY.replace(\n ':phoneNumber',\n mobileNumber.toString()\n )\n );\n })\n .catch((error: ErrorResult) => {\n setShowLoginWithEmail(true);\n setIsSending(false);\n setErrorMessage(getErrorMessage(error));\n });\n }, [mobileNumber, history, getPhoneCode, getErrorMessage]);\n\n /**\n * @description redirects to login page\n * @function redirectToLogin\n * @returns { void }\n */\n const redirectToLogin = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }, [history]);\n\n return (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={500}>\n <Title>\n <BackArrow src={BackArrowImage} onClick={redirectToLogin} />\n Log In With Mobile Number\n </Title>\n <Description>\n Enter the mobile number associated with your account. We will\n send you a text message with a verification code. Carrier fees\n may apply.\n </Description>\n <MobileNumberContainer>\n <InputPhone\n value={mobileNumber}\n onChange={handleMobileNumberChange}\n height=\"56px\"\n fontSize=\"15px\"\n autoFocus={true}\n className=\"grey-border-on-focus\"\n label=\"\"\n hasManualError={!!errorMessage}\n />\n </MobileNumberContainer>\n <SecondaryText>\n {!!errorMessage ? (\n <ErrorText>{errorMessage}</ErrorText>\n ) : (\n 'If you have not added your mobile number to your account yet, please log in with email first.'\n )}\n </SecondaryText>\n <ButtonContainer>\n <Button\n height=\"56px\"\n width=\"100%\"\n buttonWidth=\"100%\"\n fontSize={15}\n disabled={!mobileNumber || mobileNumber.length < 3}\n loading={isSending}\n type=\"button\"\n action={handleSendCode}\n >\n Send Code\n </Button>\n </ButtonContainer>\n {showLoginWithEmail && (\n <ButtonContainer>\n <Button\n height=\"56px\"\n width=\"100%\"\n buttonWidth=\"100%\"\n fontSize={15}\n type=\"button\"\n action={redirectToLogin}\n variant=\"inverse\"\n >\n Log In With Email\n </Button>\n </ButtonContainer>\n )}\n </LoginAuthWrapper>\n );\n};\n\nexport default MobileNumberLogin;\n","export const NOT_FOUND_ERROR_MESSAGE = 'We couldn\\'t find that number. If you haven\\'t verified this number with Practis yet, try logging in with your email address.';\nexport const TOO_MANY_REQUESTS_MESSAGE = 'You just did that. Try in a few?';","import { createRef, useCallback, useEffect, useMemo, useState } from 'react';\nimport styled, { keyframes } from 'styled-components';\n\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { Variables } from '../../../theme/variables';\nimport OutsideActionBox from '../OutsideActionBox/OutsideActionBox';\n\nexport const Container = styled.div<{ itemsCount: number }>`\n display: flex;\n position: relative;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const Input = styled.input<{ isMobile: boolean; activeIndex: number }>`\n position: absolute;\n top: 0;\n left: ${props =>\n `calc(${props.activeIndex} * 2.5rem + 1rem * ${props.activeIndex})`};\n opacity: 0;\n width: ${props => (props.isMobile ? '48px' : '64px')};\n height: ${props => (props.isMobile ? '48px' : '64px')};\n`;\n\nexport const Item = styled.div<{\n isMobile: boolean;\n hasBorder: boolean;\n backgroundColor?: string;\n fontColor?: string;\n}>`\n width: ${props => (props.isMobile ? '48px' : '64px')};\n height: ${props => (props.isMobile ? '48px' : '64px')};\n padding: 0;\n border-radius: 4px;\n font-size: ${props => (props.isMobile ? '15px' : '17px')};\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: normal;\n text-align: center;\n border: 0;\n margin: ${props => (props.isMobile ? '0 6px' : '0 8px')};\n color: ${props =>\n props.fontColor ? props.fontColor : props.theme.Colors.white};\n background-color: ${props =>\n props.backgroundColor\n ? props.backgroundColor\n : props.theme.Colors.darkTwo};\n ${props =>\n !!props.hasBorder &&\n `box-shadow: inset 0 0 0 1px ${props.theme.Colors.cloudyBlue};`};\n cursor: text;\n`;\n\nfunction blinkingEffect() {\n return keyframes`\n 50% {\n opacity: 0;\n }\n `;\n}\n\nexport const StyledCursorText = styled.span`\n animation: ${blinkingEffect} 1s linear infinite;\n`;\n\nconst KEY_CODE = {\n BACKSPACE: 8,\n ARROW_LEFT: 37,\n ARROW_RIGHT: 39,\n DELETE: 46,\n};\n\ntype Props = {\n length?: number;\n onChange: (data: string) => any;\n placeholder?: string;\n value?: string;\n backgroundColor?: string;\n fontColor?: string;\n};\n\nconst VerificationCodeInput = ({\n length = 5,\n onChange,\n placeholder = '',\n value: pValue,\n backgroundColor,\n fontColor,\n}: Props) => {\n const emptyValue = new Array(length).fill(placeholder);\n\n const [activeIndex, setActiveIndex] = useState<number>(0);\n const [value, setValue] = useState<string[]>(\n pValue ? pValue.split('') : emptyValue\n );\n\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.smaller;\n\n const codeInputRef = createRef<HTMLInputElement>();\n const itemsRef = useMemo(\n () =>\n new Array(length)\n .fill(null)\n .map(() => createRef<HTMLDivElement>()),\n [length]\n );\n\n const isCodeRegex = new RegExp(`^[0-9]{${length}}$`);\n\n\n \n\n const focusOrBlurItem = useCallback(\n (index: number, action: any = null) => {\n const currentItem: any = itemsRef ? itemsRef[index].current : null;\n action && currentItem && currentItem[action]();\n return currentItem;\n },\n [itemsRef]\n );\n\n const focusItem = (index: number): void => {\n focusOrBlurItem(index, 'focus');\n };\n const blurItem = (index: number): void => {\n focusOrBlurItem(index, 'blur');\n };\n\n const onItemFocus = (index: number) => () => {\n setActiveIndex(index);\n if (codeInputRef.current) codeInputRef.current.focus();\n };\n\n const onInputKeyUp = ({ key, keyCode }: React.KeyboardEvent) => {\n const newValue = [...value];\n const nextIndex = activeIndex + 1;\n const prevIndex = activeIndex - 1;\n\n const codeInput = codeInputRef.current;\n\n const isLast = nextIndex === length;\n const isDeleting =\n keyCode === KEY_CODE.DELETE || keyCode === KEY_CODE.BACKSPACE;\n\n // keep items focus in sync\n onItemFocus(activeIndex);\n\n // on delete, replace the current value\n // and focus on the previous item\n if (isDeleting) {\n if (\n (activeIndex > 0 &&\n activeIndex !== length - 1 &&\n newValue[activeIndex] === placeholder) ||\n (activeIndex === length - 1 &&\n newValue[activeIndex] === placeholder)\n ) {\n setActiveIndex(prevIndex);\n newValue[prevIndex] = placeholder;\n focusItem(prevIndex);\n }\n newValue[activeIndex] = placeholder;\n setValue(newValue);\n\n return;\n }\n\n // if the key pressed is not a number\n // don't do anything\n if (Number.isNaN(+key)) return;\n\n // reset the current value\n // and set the new one\n if (codeInput) codeInput.value = '';\n newValue[activeIndex] = key;\n setValue(newValue);\n\n if (!isLast) {\n setActiveIndex(nextIndex);\n focusItem(nextIndex);\n return;\n }\n };\n\n // handle mobile autocompletion\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { value: changeValue } = e.target;\n const isCode = isCodeRegex.test(changeValue);\n\n if (!isCode) return;\n\n setValue(changeValue.split(''));\n blurItem(activeIndex);\n };\n\n const onInputBlur = () => {\n if (activeIndex === -1) return;\n\n blurItem(activeIndex);\n // setActiveIndex(-1);\n };\n\n useEffect(() => {\n if (activeIndex === 0) {\n focusOrBlurItem(0, 'focus');\n }\n }, [activeIndex, focusOrBlurItem]);\n\n // handle pasting\n useEffect(() => {\n const codeInput = codeInputRef.current;\n if (!codeInput) return;\n\n const onPaste = (e: ClipboardEvent) => {\n e.preventDefault();\n\n const pastedString = e.clipboardData\n ? e.clipboardData.getData('text')\n : '';\n if (!pastedString) return;\n\n const isNumber = !Number.isNaN(+pastedString);\n if (isNumber) setValue(pastedString.split(''));\n };\n\n codeInput.addEventListener('paste', onPaste);\n return () => codeInput.removeEventListener('paste', onPaste);\n }, [codeInputRef]);\n\n useEffect(() => {\n onChange(value.join(''));\n }, [value, onChange]);\n\n useEffect(() => {\n if (typeof pValue !== 'string') return;\n\n // avoid infinite loop\n if (pValue === '' && value.join('') === emptyValue.join('')) return;\n\n // keep internal and external states in sync\n if (pValue !== value.join('')) setValue(pValue.split(''));\n }, [pValue, emptyValue, value]);\n\n return (\n <>\n <OutsideActionBox open={true} toggleOpen={() => setActiveIndex(-1)}>\n <Container\n className=\"ReactInputVerificationCode__container\"\n // needed for styling\n itemsCount={length}\n >\n <Input\n ref={codeInputRef}\n autoComplete={isMobile ? 'one-time-code' : 'off'}\n type=\"text\"\n inputMode=\"decimal\"\n id=\"one-time-code\"\n // use onKeyUp rather than onChange for a better control\n // onChange is still needed to handle the autocompletion\n // when receiving a code by SMS\n onChange={onInputChange}\n onKeyUp={onInputKeyUp}\n onBlur={onInputBlur}\n isMobile={isMobile}\n activeIndex={activeIndex}\n data-test=\"verification-code-input\"\n />\n\n {itemsRef.map((ref, i) => (\n <Item\n key={i}\n ref={ref}\n role=\"button\"\n tabIndex={0}\n isMobile={isMobile}\n hasBorder={!!value[i]}\n onFocus={onItemFocus(i)}\n backgroundColor={backgroundColor}\n fontColor={fontColor}\n className={'ReactInputVerificationCode__item' + (activeIndex === i ? ' focused' : '')}\n >\n <span data-test={`verification-code-digit-${i}`}>{value[i]}</span>\n {activeIndex === i && (\n <StyledCursorText>|</StyledCursorText>\n )}\n </Item>\n ))}\n </Container>\n </OutsideActionBox>\n </>\n );\n};\n\nexport default VerificationCodeInput;\n","import styled from 'styled-components';\n\nexport const Title = styled.div`\n position: relative;\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n width: 100%;\n text-align: center;\n`;\n\nexport const BackArrow = styled.img`\n position: absolute;\n top: 7px;\n left: 0;\n cursor: pointer;\n width: 16px;\n height: 14px;\n`;\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n text-align: center;\n padding-top: 4px;\n`;\n\nexport const MobileNumber = styled.div`\n font-size: 20px;\n font-weight: 600;\n line-height: 28px;\n color: var(--ps-blue-main);\n padding-top: 8px;\n`;\n\nexport const VerificationCodeContainer = styled.div`\n padding-top: 20px;\n min-height: 116px;\n box-sizing: border-box;\n\n .ReactInputVerificationCode__item {\n width: 62px;\n height: 62px;\n margin: 0 4px;\n border: 1px solid var(--ps-graphite-2);\n box-sizing: border-box;\n box-shadow: none!important;\n\n &.focused {\n border-color: var(--ps-grey-1);\n }\n\n span {\n font-size: 20px;\n }\n }\n\n &.has-error {\n .ReactInputVerificationCode__item {\n border-color: var(--ps-red-main);\n }\n }\n\n\n`;\n\nexport const VerificationError = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-red-main);\n padding-top: 4px;\n padding-left: 4px;\n padding-bottom: 4px;\n`\n\nexport const ButtonContainer = styled.div`\n width: 100%;\n`\n\nexport const FooterText = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-grey-2);\n padding-top: 12px;\n`\n\nexport const SentLabel = styled.span`\n color: var(--ps-green-main);\n`\n\nexport const CountdownTimer = styled.span`\n color: #535f6a;\n`","import VerificationCodeInput from '../../../../../ui/components/VerificationCodeInput/VerificationCodeInput';\nimport { Button } from '../../../../../ui/components/Button';\nimport { LinkText } from '../../../../../ui/components/LinkText/link-text';\nimport BackArrowImage from '../../../../../assets/images/icons/back-arrow.svg';\nimport { CheckVerificationCodeViewProps } from './types';\nimport {\n Title,\n Description,\n MobileNumber,\n BackArrow,\n VerificationCodeContainer,\n ButtonContainer,\n FooterText,\n SentLabel,\n CountdownTimer,\n VerificationError\n} from './styles';\n\nfunction CheckVerificationCodeView({\n mobileNumber,\n isVerifying,\n verificationError,\n resendStatus,\n remainingTime,\n isCodeValid,\n showSent,\n showCountDown,\n onCodeChange,\n onBack,\n onVerify,\n onResend\n}: CheckVerificationCodeViewProps) {\n return <>\n <Title>\n <BackArrow src={BackArrowImage} onClick={onBack} />\n <span data-test=\"verify-mobile-number\">Verify Mobile Number</span>\n </Title>\n <Description data-test=\"instructions-text\">Enter the 5-digit code we sent to:</Description>\n <MobileNumber data-test=\"mobile-number\">{mobileNumber}</MobileNumber>\n <VerificationCodeContainer className={!!verificationError ? 'has-error' : undefined}>\n <VerificationCodeInput\n onChange={onCodeChange}\n />\n {!!verificationError && (<VerificationError data-test=\"verification-error\">{verificationError}</VerificationError>)}\n </VerificationCodeContainer>\n <ButtonContainer>\n <Button\n height='56px'\n width='100%'\n buttonWidth='100%'\n fontSize={15}\n loading={isVerifying}\n disabled={!isCodeValid}\n action={onVerify}\n dataTest=\"verify-button\"\n >\n Verify\n </Button>\n </ButtonContainer>\n <FooterText>\n <span data-test=\"didnt-receive-code-text\">Didn't receive the code?</span> {showSent ? (\n <SentLabel data-test=\"sent-text\">Sent!</SentLabel>\n ) : showCountDown ? (\n <CountdownTimer data-test=\"time-to-resend\">\n Resend in{' '}\n {`0:${\n remainingTime < 10 ? '0' : ''\n }${remainingTime}`}\n </CountdownTimer>\n ) : (\n <LinkText\n onClick={onResend}\n disabled={resendStatus === 'inProgress'}\n dataTest=\"resend-button\"\n >\n Resend\n </LinkText>\n )\n }\n </FooterText>\n </>\n}\n\nexport default CheckVerificationCodeView;","import { useState, useCallback, useRef, useMemo, useEffect } from 'react';\n\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { CheckVerificationCodeProps, MobileNumberResendCodeStatus } from './types';\nimport {\n INVALID_SECURITY_CODE,\n EXPIRED_SECURITY_CODE,\n CODE_TIMEOUT,\n} from './constants';\nimport VerifyMobileNumberView from './view';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\n\nfunction CheckVerificationCodeController({\n mobileNumber,\n onBack,\n onVerify,\n onVerifySuccess,\n onResend,\n}: CheckVerificationCodeProps) {\n const [code, setCode] = useState<string>('');\n const [remainingTime, setRemainingTime] = useState<number>(CODE_TIMEOUT);\n const remainingTimeInterval: any = useRef();\n const [isVerifying, setIsVerifying] = useState<boolean>(false);\n const [verificationError, setVerificationError] = useState<\n string | undefined\n >();\n const [resendStatus, setResendStatus] =\n useState<MobileNumberResendCodeStatus>('none');\n const showMessage = useShowMessage();\n\n /**\n * @function setRemainingTimeInterval\n * @description sets remaining time interval\n * @returns { void }\n */\n const setRemainingTimeInterval = () => {\n setRemainingTime(CODE_TIMEOUT);\n remainingTimeInterval.current = setInterval(\n () => setRemainingTime(prevState => prevState - 1),\n 1000\n );\n };\n\n /**\n * @function handleCodeChange \n * @description sets code to the state and clears error message\n * @param { string } newCode\n * @returns { void }\n */\n const handleCodeChange = (newCode: string) => {\n if (newCode !== code) {\n setCode(newCode);\n setVerificationError(undefined);\n }\n };\n\n /**\n * @function handleVerify\n * @description calls API to verify entered code,\n * runs success callback or shows a proper message in case of error\n * @returns { void }\n */\n const handleVerify = useCallback(() => {\n setIsVerifying(true);\n setVerificationError(undefined);\n onVerify(code)\n .then((response?: unknown) => {\n setIsVerifying(false);\n setVerificationError(undefined);\n onVerifySuccess(response);\n })\n .catch((error: ErrorResult) => {\n switch(error.errorCode) {\n case 404:\n case 472:\n case 500:\n setVerificationError(INVALID_SECURITY_CODE);\n break;\n case 432:\n setVerificationError(EXPIRED_SECURITY_CODE);\n break;\n default:\n error?.message && setVerificationError(error.message);\n break;\n }\n setIsVerifying(false);\n });\n }, [code, onVerify, onVerifySuccess]);\n\n /**\n * @function handleResend\n * @description calls API to resend a verification code\n * and shows a proper message in case of error\n * @returns { void }\n */\n const handleResend = useCallback(() => {\n setResendStatus('inProgress');\n onResend()\n .then(() => {\n setResendStatus('success');\n })\n .catch((error: any) => {\n setResendStatus('none');\n showMessage(error.message, 'error');\n });\n }, [onResend, showMessage]);\n\n const isCodeValid = useMemo(() => code.length === 5, [code]);\n const showSent = useMemo(\n () =>\n remainingTime <= CODE_TIMEOUT &&\n remainingTime >= CODE_TIMEOUT - 2 &&\n resendStatus === 'success',\n [remainingTime, resendStatus]\n );\n const showCountDown = useMemo(\n () =>\n remainingTime > 0 &&\n remainingTime <=\n CODE_TIMEOUT - (resendStatus === 'success' ? 3 : 0),\n [remainingTime, resendStatus]\n );\n\n useEffect(() => {\n if (resendStatus === 'inProgress') {\n clearInterval(remainingTimeInterval.current);\n } else {\n setRemainingTimeInterval();\n return () => clearInterval(remainingTimeInterval.current);\n }\n }, [resendStatus]);\n\n useEffect(() => {\n if (remainingTime < 0) {\n clearInterval(remainingTimeInterval.current);\n }\n }, [remainingTime]);\n\n return (\n <VerifyMobileNumberView\n mobileNumber={mobileNumber}\n isVerifying={isVerifying}\n verificationError={verificationError}\n resendStatus={resendStatus}\n remainingTime={remainingTime}\n isCodeValid={isCodeValid}\n showSent={showSent}\n showCountDown={showCountDown}\n onCodeChange={handleCodeChange}\n onBack={onBack}\n onVerify={handleVerify}\n onResend={handleResend}\n />\n );\n}\n\n\nexport default CheckVerificationCodeController;","import CheckVerificationCode from './controller';\n\nexport default CheckVerificationCode;","export const CODE_TIMEOUT: number = 60;\nexport const INVALID_SECURITY_CODE: string = 'Invalid security code.';\nexport const EXPIRED_SECURITY_CODE: string = 'Security code expired.';\n","import { useCallback } from 'react';\n\nimport { useHistory } from '../../../tools/router';\nimport { useParams } from 'react-router';\nimport ROUTES from '../../../routes/routes';\nimport { useLoginByPhoneCode } from '../store/services';\nimport { UrlBuilder, UrlBuilderContext } from '../../../tools/url/UrlBuilder';\nimport {\n redirectAfterLogin,\n setAuthToken,\n} from '../../../helpers/functions/auth-helpers';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { useGetPhoneCodeApi } from '../../../api';\nimport CheckVerificationCode from '../AddMobileNumber/components/CheckVerificationCode';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nfunction VerifyMobileNumberController() {\n const params: { phoneNumber?: any } = useParams();\n const phoneNumber = params.phoneNumber ?? '';\n const history = useHistory();\n const loginByPhoneCode = useLoginByPhoneCode();\n const getPhoneCode = useGetPhoneCodeApi();\n\n useHtmlPageTitle('Verify Mobile Number');\n\n /**\n * @function handleVerify\n * @description calls API to verify entered code\n * @param { string } code\n * @returns { Promise }\n */\n const handleVerify = useCallback(\n (code: string) => {\n return loginByPhoneCode({ phone: phoneNumber, code });\n },\n [phoneNumber, loginByPhoneCode]\n );\n\n /**\n * @function handleVerifySuccess\n * @description calls API to verify entered code\n * @param { UrlBuilder } urlBuilder\n * @param { { user: UserV2, token: string } } response\n * @returns { void }\n */\n const handleVerifySuccess = useCallback(\n (urlBuilder: UrlBuilder, response: { user: UserV2; token: string }) => {\n setAuthToken(response.user, response.token);\n redirectAfterLogin(\n history,\n urlBuilder,\n response.user,\n response.token\n );\n },\n [history]\n );\n\n /**\n * @function handleResend\n * @description calls API to resend a verification code\n * @returns { Promise }\n */\n const handleResend = useCallback(() => {\n return getPhoneCode(phoneNumber);\n }, [getPhoneCode, phoneNumber]);\n\n /**\n * @function redirectToMobileNumberLogin\n * @description redirects to mobile number login\n * @returns { void }\n */\n const redirectToMobileNumberLogin = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.MOBILE_NUMBER_LOGIN);\n }, [history]);\n\n return (\n <UrlBuilderContext.Consumer>\n {urlBuilder => (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={500}>\n <CheckVerificationCode\n mobileNumber={phoneNumber}\n onBack={redirectToMobileNumberLogin}\n onVerify={handleVerify}\n onVerifySuccess={response =>\n handleVerifySuccess(\n urlBuilder,\n response as { user: UserV2; token: string }\n )\n }\n onResend={handleResend}\n />\n </LoginAuthWrapper>\n )}\n </UrlBuilderContext.Consumer>\n );\n}\n\nexport default VerifyMobileNumberController;\n","import VerifyMobileNumber from './controller';\n\nexport default VerifyMobileNumber;","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { ScriptLine } from '../../../constants/interfaces/ScriptLine';\n\nexport interface TelepromterState {\n scenario: Scenario;\n generatedLines: Partial<ScriptLine>[];\n videoBlob?: string;\n loading?: boolean;\n error?: string;\n}\n\nexport type TelepromterStateSelector = (state: any) => TelepromterState;\n\nexport const TelepromterStateSelectorContext = React.createContext<\n TelepromterStateSelector\n>(() => {\n throw new Error('Not implemented');\n});\n\nexport function useTelepromterState(): TelepromterState {\n return useSelector(useContext(TelepromterStateSelectorContext));\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CompletedIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 72 72\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g>\n <clipPath id=\"cp0\">\n <path\n transform=\"matrix(1,0,0,-1,0,72)\"\n d=\"M 71.34928 54.7223 L 39.92813 23.47684 C 39.88086 23.41609 39.90112 23.33396 39.84709 23.27883 C 39.39687 22.83105 38.80595 22.63529 38.21728 22.64992 C 37.61736 22.62854 37.01856 22.81643 36.56046 23.2732 C 36.49405 23.33733 36.51881 23.43746 36.46141 23.50722 L 23.17079 36.72455 C 22.30073 37.5886 22.30073 38.99269 23.17079 39.86124 C 24.04085 40.72755 25.45343 40.72755 26.32461 39.86124 L 38.2004 28.04913 L 68.18758 57.86687 C 69.06102 58.73542 70.47697 58.73542 71.35041 57.86687 C 72.22272 56.99944 72.22272 55.58972 71.34928 54.7223 Z M 35.99318 67.50197 C 18.59539 67.50197 4.490987 53.39809 4.490987 36 C 4.490987 18.60079 18.59539 4.500281 35.99318 4.500281 C 53.39096 4.500281 67.49536 18.60079 67.49536 36 C 67.49536 36.68067 67.33666 37.31633 67.29501 37.98462 L 71.44383 42.01688 C 71.77362 40.05475 71.98522 38.0555 71.98522 36 C 71.98522 16.11551 55.8717 0 35.99205 0 C 16.11465 0 0 16.11551 0 36 C 0 55.88449 16.11352 72 35.99205 72 C 45.11472 72 53.41798 68.57979 59.76276 62.98369 L 56.45587 59.76936 C 50.93949 64.52391 43.84621 67.50197 35.99318 67.50197 Z \"\n />\n </clipPath>\n <g clipPath=\"url(#cp0)\">\n <clipPath id=\"cp1\">\n <path\n transform=\"matrix(1,0,0,-1,0,72)\"\n d=\"M -152 -636 L 223 -636 L 223 176 L -152 176 Z \"\n />\n </clipPath>\n <g clipPath=\"url(#cp1)\">\n <path\n transform=\"matrix(1,0,0,-1,0,72)\"\n d=\"M -5 77 L 77.0045 77 L 77.0045 -5 L -5 -5 Z \"\n fill=\"currentColor\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default CompletedIcon;\n","import { ScriptLine } from '../../../constants/interfaces/ScriptLine';\n\nexport enum ACTIONS {\n FETCH_TELEPROMTER_SCENARIO_START = 'FETCH_TELEPROMTER_SCENARIO_START',\n FETCH_TELEPROMTER_SCENARIO_SUCCESS = 'FETCH_TELEPROMTER_SCENARIO_SUCCESS',\n FETCH_TELEPROMTER_SCENARIO_FAILURE = 'FETCH_TELEPROMTER_SCENARIO_FAILURE',\n\n ADD_GENERATED_SCRIPT_LINE = 'ADD_GENERATED_SCRIPT_LINE',\n SET_RECORDED_VIDEO = 'SET_RECORDED_VIDEO',\n RESET_TELEPROMTER = 'RESET_TELEPROMTER',\n}\n\nexport function fetchTelepromterScenarioStart() {\n return {\n type: ACTIONS.FETCH_TELEPROMTER_SCENARIO_START as ACTIONS.FETCH_TELEPROMTER_SCENARIO_START,\n };\n}\n\nexport function fetchTelepromterScenarioSuccess(data: any) {\n return {\n type: ACTIONS.FETCH_TELEPROMTER_SCENARIO_SUCCESS as ACTIONS.FETCH_TELEPROMTER_SCENARIO_SUCCESS,\n data,\n };\n}\n\nexport function fetchTelepromterScenarioFailure(error: any) {\n return {\n type: ACTIONS.FETCH_TELEPROMTER_SCENARIO_FAILURE as ACTIONS.FETCH_TELEPROMTER_SCENARIO_FAILURE,\n error,\n };\n}\n\nexport function addGeneratedScriptLineAction(scriptLine: Partial<ScriptLine>) {\n return {\n type: ACTIONS.ADD_GENERATED_SCRIPT_LINE as ACTIONS.ADD_GENERATED_SCRIPT_LINE,\n scriptLine,\n };\n}\n\nexport function setRecordedVideoAction(videoBlob: string) {\n return {\n type: ACTIONS.SET_RECORDED_VIDEO as ACTIONS.SET_RECORDED_VIDEO,\n videoBlob,\n };\n}\n\nexport function resetTelepromterAction() {\n return {\n type: ACTIONS.RESET_TELEPROMTER as ACTIONS.RESET_TELEPROMTER,\n };\n}\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../../ui/components/Button';\nimport ROUTES from '../../../../routes/routes';\nimport { useTelepromterState } from '../../store/state';\nimport { useHistory } from '../../../../tools/router';\nimport CompletedIcon from '../../../../ui/icons/Completed';\nimport Close from '../../../../ui/icons/Close';\n\nconst Container = styled.div`\n background: ${props => props.theme.Colors.darkThree};\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n padding: 72px 32px 0 32px;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst ExitIcon = styled.div`\n height: 14px;\n width: 14px;\n color: ${props => props.theme.Colors.white};\n position: absolute;\n top: 40px;\n right: 24px;\n cursor: pointer;\n z-index: 1;\n user-select: none;\n &:hover {\n opacity: 0.7;\n }\n &:active {\n opacity: 0.6;\n }\n`;\n\nconst IconContainer = styled.div`\n height: 72px;\n width: 72px;\n color: ${props => props.theme.Colors.lightMint};\n margin-bottom: 32px;\n align-self: center;\n`;\n\nconst Title = styled.div`\n font-size: 13px;\n color: ${props => props.theme.Colors.lightMint};\n margin-bottom: 4px;\n`;\n\nconst Text = styled.div`\n font-size: 17px;\n color: ${props => props.theme.Colors.white};\n margin-bottom: 32px;\n`;\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding-top: 32px;\n`;\n\nconst Actions = styled.div`\n height: 180px;\n margin-bottom: 32px;\n display: flex;\n align-items: center;\n flex-direction: column;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-bottom: 8px;\n`;\n\nconst Completed: FC = () => {\n const scenario = useTelepromterState().scenario;\n const history = useHistory();\n\n const redirectToScenario = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n const redirectToPlayback = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.PLAYBACK.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n const redirectToTraining = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.TRAINING.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n return (\n <Container>\n <ExitIcon onClick={redirectToScenario}>\n <Close />\n </ExitIcon>\n <Content>\n <IconContainer>\n <CompletedIcon />\n </IconContainer>\n <Title>Success!</Title>\n <Text>Scenario Complete</Text>\n </Content>\n <Actions>\n <ButtonWrapper>\n <Button\n label=\"Playback\"\n width=\"152px\"\n height=\"48px\"\n color={'green'}\n action={redirectToPlayback}\n variant={'inverse'}\n />\n </ButtonWrapper>\n <ButtonWrapper>\n <Button\n label=\"Practis Again\"\n width=\"152px\"\n height=\"48px\"\n color={'green'}\n action={redirectToTraining}\n />\n </ButtonWrapper>\n </Actions>\n </Container>\n );\n};\n\nconst PreviewContainer = () => {\n return <Completed />;\n};\n\nexport default PreviewContainer;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div<{ disabled: boolean }>`\n background: ${props =>\n props.disabled\n ? props.theme.Colors.whiteThree\n : props.theme.Colors.white};\n width: 100%;\n padding: 32px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.skyBlue};\n font-size: 17px;\n font-weight: bold;\n margin-bottom: 8px;\n padding-left: 8px;\n`;\n\nconst Text = styled.div<{ disabled: boolean }>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.black};\n font-size: 17px;\n padding-left: 8px;\n`;\n\nconst RepLine: FC<{ text: string; disabled: boolean }> = ({\n text,\n disabled,\n}) => {\n return (\n <Container disabled={disabled}>\n <Title>You</Title>\n <Text disabled={disabled}>{text}</Text>\n </Container>\n );\n};\n\nexport default RepLine;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div<{ disabled: boolean }>`\n background: ${props =>\n props.disabled\n ? props.theme.Colors.whiteThree\n : props.theme.Colors.white};\n width: 100%;\n padding: 32px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 17px;\n font-weight: bold;\n margin-bottom: 8px;\n padding-left: 8px;\n`;\n\nconst Text = styled.div<{ disabled: boolean }>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.black};\n font-size: 17px;\n padding-left: 8px;\n`;\n\nconst CustomerLine: FC<{\n text: string;\n disabled: boolean;\n}> = ({ text, disabled }) => {\n return (\n <Container disabled={disabled}>\n <Title>Customer</Title>\n <Text disabled={disabled}>{text}</Text>\n </Container>\n );\n};\n\nexport default CustomerLine;\n","import React, { FC, useCallback, useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { VideoPlayer } from '../../../../ui/components/VideoPlayer';\nimport RepLine from './RepLine';\nimport CustomerLine from './CustomerLine';\nimport { useTelepromterState } from '../../store/state';\nimport { Button } from '../../../../ui/components/Button';\nimport { useHistory } from '../../../../tools/router';\nimport ROUTES from '../../../../routes/routes';\nimport {\n ScriptLine,\n ScriptLineSpeaker,\n} from '../../../../constants/interfaces/ScriptLine';\nimport { Loading } from '../../../../ui/components/LoadingCopmonent';\nimport Close from '../../../../ui/icons/Close';\n\nconst Container = styled.div`\n background: ${props => props.theme.Colors.darkThree};\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n position: relative;\n`;\n\nconst ExitIcon = styled.div`\n height: 14px;\n width: 14px;\n color: ${props => props.theme.Colors.white};\n position: absolute;\n top: 40px;\n right: 24px;\n cursor: pointer;\n z-index: 1;\n user-select: none;\n &:hover {\n opacity: 0.7;\n }\n &:active {\n opacity: 0.6;\n }\n`;\n\nconst LoadingContainer = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst VideoContainer = styled.div`\n height: 376px;\n width: 100%;\n flex-shrink: 0;\n`;\n\nconst StyledVideoPlayer = styled(VideoPlayer)`\n height: 100%;\n`;\n\nconst LineContainer = styled.div`\n flex: 1;\n width: 100%;\n background: ${props => props.theme.Colors.whiteThree};\n`;\n\nconst ButtonContainer = styled.div`\n position: absolute;\n bottom: 68px;\n width: 100%;\n display: flex;\n justify-content: center;\n`;\n\nconst ErrorContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n`;\n\nconst ErrorText = styled.div`\n color: ${props => props.theme.Colors.paleRed};\n font-size: 14px;\n align-items: center;\n margin-bottom: 16px;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-bottom: 8px;\n`;\n\nconst Playback: FC = () => {\n const telepromterState = useTelepromterState();\n const scenarios = telepromterState.scenario;\n const generatedLines = telepromterState.generatedLines;\n const playbackVideo = telepromterState.videoBlob;\n const history = useHistory();\n const [duration, setDuration] = useState(0);\n const [playing, setPlaying] = useState(false);\n\n const getVideoDuration = (value: number) => {\n setDuration(value);\n };\n\n const getVideoPlaying = (value: boolean) => {\n setPlaying(value);\n };\n\n const redirectToScenario = useCallback(() => {\n if (scenarios.id) {\n history.push(\n ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n scenarios.id.toString()\n )\n );\n }\n }, [history, scenarios.id]);\n\n const redirectToTraining = useCallback(() => {\n if (scenarios.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.TRAINING.replace(\n ':scenarioId',\n scenarios.id.toString()\n )\n );\n }\n }, [history, scenarios.id]);\n\n const redirectToCompleted = useCallback(() => {\n if (scenarios.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.COMPLETED.replace(\n ':scenarioId',\n scenarios.id.toString()\n )\n );\n }\n }, [history, scenarios.id]);\n\n const mapScriptLines = useCallback((scriptLines: Partial<ScriptLine>[]) => {\n let prevLineDuration = 0;\n return scriptLines.map(line => {\n const minDurationValue = prevLineDuration;\n const maxDurationValue = prevLineDuration + line.duration!;\n prevLineDuration = maxDurationValue;\n\n return {\n id: line.id,\n text: line.text,\n speaker: line.speaker,\n audioUrl: line.audioUrl,\n min: minDurationValue,\n max: maxDurationValue,\n };\n });\n }, []);\n\n const [localScriptLines, setLocalScriptLines] = useState(\n mapScriptLines(generatedLines)\n );\n\n useEffect(() => {\n setLocalScriptLines(mapScriptLines(generatedLines));\n }, [generatedLines, mapScriptLines]);\n\n const currentScriptLine = localScriptLines[0];\n\n useEffect(() => {\n setLocalScriptLines(\n mapScriptLines(generatedLines).filter(\n (line: any) => line && line.max >= duration\n )\n );\n }, [setLocalScriptLines, duration, mapScriptLines, generatedLines]);\n\n if (!playbackVideo) {\n return (\n <Container>\n <ExitIcon onClick={redirectToScenario}>\n <Close />\n </ExitIcon>\n <ErrorContainer>\n <ErrorText>No playback video found.</ErrorText>\n <ButtonWrapper>\n <Button\n label=\"Go Practis\"\n width=\"152px\"\n height=\"48px\"\n action={redirectToTraining}\n />\n </ButtonWrapper>\n </ErrorContainer>\n </Container>\n );\n }\n\n if (telepromterState.loading) {\n return (\n <Container>\n <ExitIcon onClick={redirectToCompleted}>\n <Close />\n </ExitIcon>\n <LoadingContainer>\n <Loading />\n </LoadingContainer>\n </Container>\n );\n }\n\n return (\n <Container>\n <ExitIcon onClick={redirectToCompleted}>\n <Close />\n </ExitIcon>\n <VideoContainer>\n <StyledVideoPlayer\n url={playbackVideo}\n getDuration={getVideoDuration}\n getPlaying={getVideoPlaying}\n autoPlay={true}\n muteVideo={\n !currentScriptLine ||\n currentScriptLine.speaker === ScriptLineSpeaker.CUSTOMER\n }\n />\n </VideoContainer>\n {currentScriptLine && playing && (\n <audio\n src={currentScriptLine.audioUrl}\n muted={currentScriptLine.speaker === ScriptLineSpeaker.REP}\n autoPlay={true}\n />\n )}\n <LineContainer>\n {currentScriptLine &&\n localScriptLines.map(scriptLine => {\n if (scriptLine.speaker === ScriptLineSpeaker.REP) {\n return (\n <RepLine\n key={scriptLine.id}\n text={scriptLine.text!}\n disabled={\n scriptLine.id !== currentScriptLine.id\n }\n />\n );\n } else {\n return (\n <CustomerLine\n key={scriptLine.id}\n text={scriptLine.text!}\n disabled={\n scriptLine.id !== currentScriptLine.id\n }\n />\n );\n }\n })}\n </LineContainer>\n <ButtonContainer>\n <Button\n label={'Close Playback'}\n width={'168px'}\n height={'48px'}\n action={redirectToCompleted}\n />\n </ButtonContainer>\n </Container>\n );\n};\n\nexport default Playback;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div<{ disabled: boolean }>`\n background: ${props =>\n props.disabled\n ? props.theme.Colors.whiteThree\n : props.theme.Colors.white};\n width: 100%;\n padding: 32px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.paleRed};\n font-size: 17px;\n font-weight: bold;\n margin-bottom: 8px;\n padding-left: 8px;\n`;\n\nconst Text = styled.div<{ disabled: boolean }>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.black};\n font-size: 17px;\n padding-left: 8px;\n`;\n\nconst RepLine: FC<{ text: string; disabled: boolean }> = ({\n text,\n disabled,\n}) => {\n return (\n <Container disabled={disabled}>\n <Title>You</Title>\n <Text disabled={disabled}>{text}</Text>\n </Container>\n );\n};\n\nexport default RepLine;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div<{ disabled: boolean }>`\n background: ${props =>\n props.disabled\n ? props.theme.Colors.whiteThree\n : props.theme.Colors.white};\n width: 100%;\n padding: 32px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n`;\n\nconst Title = styled.div`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 17px;\n font-weight: bold;\n margin-bottom: 8px;\n padding-left: 8px;\n`;\n\nconst Text = styled.div<{ disabled: boolean }>`\n color: ${props =>\n props.disabled\n ? props.theme.Colors.steelGrey\n : props.theme.Colors.black};\n font-size: 17px;\n padding-left: 8px;\n`;\n\nconst CustomerLine: FC<{\n text: string;\n disabled: boolean;\n}> = ({ text, disabled }) => {\n return (\n <Container disabled={disabled}>\n <Title>Customer</Title>\n <Text disabled={disabled}>{text}</Text>\n </Container>\n );\n};\n\nexport default CustomerLine;\n","import React, { FC } from 'react';\nimport styled, { keyframes } from 'styled-components';\n\nconst fill = keyframes`\n from {\n width: 0;\n }\n\n to {\n width: 375px;\n }\n`;\n\nconst Container = styled.div<{ duration: number; color: string }>`\n height: 48px;\n width: 375px;\n background: ${props => props.theme.Colors.whiteTwo};\n position: relative;\n &::before {\n content: '';\n height: 100%;\n background: ${props => props.color};\n animation: ${fill} ${props => props.duration}s linear;\n animation-fill-mode: forwards;\n position: absolute;\n left: 0;\n top: 0;\n }\n`;\n\nconst EmptyContainer = styled.div<{ color: string }>`\n height: 48px;\n width: 375px;\n background: ${props => props.theme.Colors.whiteTwo};\n position: relative;\n &::before {\n content: '';\n height: 100%;\n background: ${props => props.color};\n position: absolute;\n left: 0;\n top: 0;\n }\n`;\n\nconst ScriptLineDuration: FC<{\n duration: number;\n color: string;\n started: boolean;\n}> = ({ duration, color, started }) => {\n if (!started) {\n return <EmptyContainer color={color} />;\n }\n return <Container duration={duration} color={color} />;\n};\n\nexport default ScriptLineDuration;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Next = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 14 12\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g enableBackground=\"new\">\n <clipPath id=\"cp0\">\n <path\n transform=\"matrix(1,0,0,-1,0,12)\"\n d=\"M 13.68551 5.622092 L 8.396375 1.150653 C 8.181871 .9487689 7.834833 .9487689 7.62033 1.150653 C 7.405826 1.352288 7.405826 1.678351 7.62033 1.879736 L 12.48445 5.99213 L 7.603031 10.11976 C 7.388528 10.3209 7.388528 10.64746 7.603031 10.8486 C 7.817535 11.05048 8.164572 11.05048 8.379076 10.8486 L 13.66821 6.377159 C 13.67486 6.370663 13.67194 6.360668 13.67806 6.354172 C 13.68019 6.352423 13.68338 6.353173 13.68524 6.351674 C 13.89975 6.150289 13.89975 5.823476 13.68551 5.622092 Z M 7.306026 5.622092 L .953955 .1512259 C .7394516 -.05040862 .3921475 -.05040862 .177644 .1512259 C -.03659334 .3523606 -.03659334 .6791734 .177644 .880558 L 6.112684 5.992379 L .1608776 11.11894 C -.05362587 11.32058 -.05362587 11.64714 .1608776 11.84877 C .375115 12.05041 .722419 12.05041 .9369225 11.84877 L 7.288994 6.377659 C 7.295647 6.371162 7.292986 6.361168 7.299107 6.354672 C 7.30097 6.352923 7.304429 6.353672 7.306026 6.352173 C 7.520264 6.150289 7.520264 5.823476 7.306026 5.622092 Z \"\n />\n </clipPath>\n <g clipPath=\"url(#cp0)\">\n <clipPath id=\"cp1\">\n <path\n transform=\"matrix(1,0,0,-1,0,12)\"\n d=\"M -233 -86 L 142 -86 L 142 726 L -233 726 Z \"\n />\n </clipPath>\n <g clipPath=\"url(#cp1)\">\n <path\n transform=\"matrix(1,0,0,-1,0,12)\"\n d=\"M -5 17 L 18.84615 17 L 18.84615 -5 L -5 -5 Z \"\n fill=\"currentColor\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Next;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport Next from '../../../ui/icons/Next';\n\nconst Label = styled.div`\n width: 104px;\n height: 48px;\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${props => props.theme.Colors.white};\n user-select: none;\n`;\n\nconst IconSection = styled.div`\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${props => props.theme.Colors.fadedRedTwoMobile};\n`;\n\nconst StyledButton = styled.div`\n height: 48px;\n display: inline-flex;\n align-items: center;\n background: ${props => props.theme.Colors.fadedRedMobile};\n border-radius: 4px;\n overflow: hidden;\n cursor: pointer;\n &:hover ${IconSection} {\n background: ${props => props.theme.Colors.fadedRedMobile};\n }\n &:active ${Label} {\n background: ${props => props.theme.Colors.fadedRed};\n }\n`;\n\nconst IconWrapper = styled.div`\n width: 14px;\n height: 12px;\n display: flex;\n color: ${props => props.theme.Colors.white};\n`;\n\nconst Button: FC<{ onClick(): void }> = ({ onClick }) => {\n return (\n <StyledButton onClick={onClick}>\n <Label>Next</Label>\n <IconSection>\n <IconWrapper>\n <Next />\n </IconWrapper>\n </IconSection>\n </StyledButton>\n );\n};\n\nexport default Button;\n","import React, { FC, useEffect } from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { rgba } from 'polished';\n\nconst left = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(180deg);\n }\n`;\n\nconst right = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(180deg);\n }\n`;\n\nconst Container = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n background: ${props => rgba(props.theme.Colors.black, 0.5)};\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n`;\n\nconst Circle = styled.div`\n height: 160px;\n width: 160px;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Hold = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n clip: rect(0px, 160px, 160px, 80px);\n border-radius: 100%;\n background-color: ${props => props.theme.Colors.whiteTwo};\n`;\n\nconst Fill = styled.div`\n background-color: ${props => props.theme.Colors.fadedRedTwoMobile};\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 100%;\n clip: rect(0px, 80px, 160px, 0px);\n`;\n\nconst Left = styled(Hold)`\n && ${Fill} {\n z-index: 1;\n animation: ${left} 0.5s linear both;\n }\n`;\n\nconst Right = styled(Hold)`\n z-index: 3;\n transform: rotate(180deg);\n && ${Fill} {\n z-index: 3;\n animation: ${right} 0.5s linear both;\n animation-delay: 0.5s;\n }\n`;\n\nconst InnerCircle = styled.div`\n height: 128px;\n width: 128px;\n border-radius: 100%;\n background: ${props => props.theme.Colors.white};\n font-size: 56px;\n font-weight: bold;\n color: ${props => props.theme.Colors.fadedRedTwoMobile};\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n`;\n\nconst Countdown: FC<{\n countdown: number;\n setCountdown(countdown: (prevCountdown: number) => number): any;\n}> = ({ countdown, setCountdown }) => {\n useEffect(() => {\n const timer = setInterval(() => {\n setCountdown((prevCountdown: number) => {\n return prevCountdown - 1;\n });\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, [setCountdown]);\n\n return (\n <Container>\n <Circle key={countdown}>\n <Left>\n <Fill />\n </Left>\n <Right>\n <Fill />\n </Right>\n <InnerCircle>{countdown}</InnerCircle>\n </Circle>\n </Container>\n );\n};\n\nexport default Countdown;\n","import { useDispatch } from 'react-redux';\nimport { useGetScenarioApi } from '../../../api';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useCallback } from 'react';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n addGeneratedScriptLineAction,\n fetchTelepromterScenarioFailure,\n fetchTelepromterScenarioStart,\n fetchTelepromterScenarioSuccess,\n resetTelepromterAction,\n setRecordedVideoAction,\n} from './actions';\nimport { ScriptLine } from '../../../constants/interfaces/ScriptLine';\n\nexport const useGetTelepromterScenarioService = () => {\n const dispatch = useDispatch();\n const getScenarioApi = useGetScenarioApi();\n const showMessage = useShowMessage();\n return useCallback(\n (scenarioId: number | string) => {\n dispatch(fetchTelepromterScenarioStart());\n getScenarioApi(scenarioId)\n .then(data => {\n dispatch(fetchTelepromterScenarioSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(fetchTelepromterScenarioFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, getScenarioApi, showMessage]\n );\n};\n\nexport const useAddGeneratedScriptLineService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (scriptLine: Partial<ScriptLine>) => {\n dispatch(addGeneratedScriptLineAction(scriptLine));\n },\n [dispatch]\n );\n};\n\nexport const useSetRecordedVideoService = () => {\n const dispatch = useDispatch();\n return useCallback(\n (videoBlob: string) => {\n dispatch(setRecordedVideoAction(videoBlob));\n },\n [dispatch]\n );\n};\n\nexport const useResetTelepromterService = () => {\n const dispatch = useDispatch();\n return useCallback(() => {\n dispatch(resetTelepromterAction());\n }, [dispatch]);\n};\n","import { Action } from 'redux';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { AiLogItemInterface } from '../../../constants/interfaces/AiItem';\n\nexport enum ACTIONS {\n SEARCH_AI_LOGS_START = 'ADMIN_SEARCH_AI_START',\n SEARCH_AI_LOGS_SUCCESS = 'ADMIN_SEARCH_AI_SUCCESS',\n SEARCH_AI_LOGS_FAILURE = 'ADMIN_SEARCH_AI_FAILURE',\n SEARCH_AI_LOGS_DISPOSE = 'ADMIN_SEARCH_AI_DISPOSE',\n UPDATE_AI_LOGS_FLAG_START = 'UPDATE_AI_LOGS_FLAG_START',\n UPDATE_AI_LOGS_FLAG_FAILURE = 'UPDATE_FLAG_AI_LOGS_FAILURE',\n ADD_AI_LOGS_FLAG_SUCCESS = 'ADD_AI_LOGS_FLAG_SUCCESS',\n DELETE_AI_LOGS_FLAG_SUCCESS = 'DELETE_AI_LOGS_FLAG_SUCCESS',\n}\n\nexport type SearchAiLogsStartAction = Action<ACTIONS.SEARCH_AI_LOGS_START>;\nexport const searchAiLogsStart = (): SearchAiLogsStartAction => ({\n type: ACTIONS.SEARCH_AI_LOGS_START,\n});\n\nexport type SearchAiLogsSuccessAction = Action<\n ACTIONS.SEARCH_AI_LOGS_SUCCESS\n> & {\n aiLogs: ListResult<AiLogItemInterface>;\n};\nexport const searchAiLogsSuccess = (\n aiLogs: ListResult<AiLogItemInterface>\n): SearchAiLogsSuccessAction => ({\n type: ACTIONS.SEARCH_AI_LOGS_SUCCESS,\n aiLogs,\n});\n\nexport type SearchAiLogsFailureAction = Action<\n ACTIONS.SEARCH_AI_LOGS_FAILURE\n> & { error: string };\nexport const searchAiLogsFailure = (\n error: string\n): SearchAiLogsFailureAction => ({\n type: ACTIONS.SEARCH_AI_LOGS_FAILURE,\n error,\n});\n\nexport type UpdateAiLogsFlagFailureAction = Action<\n ACTIONS.UPDATE_AI_LOGS_FLAG_FAILURE\n> & { error: string };\n\nexport const updateAiLogsFlagFailure = (\n error: string\n): UpdateAiLogsFlagFailureAction => ({\n type: ACTIONS.UPDATE_AI_LOGS_FLAG_FAILURE,\n error,\n});\n\nexport type SearchAiLogsDisposeAction = Action<ACTIONS.SEARCH_AI_LOGS_DISPOSE>;\nexport const searchAiLogsDispose = (): SearchAiLogsDisposeAction => ({\n type: ACTIONS.SEARCH_AI_LOGS_DISPOSE,\n});\n\nexport type UpdateAiLogsFlagStartAction = Action<\n ACTIONS.UPDATE_AI_LOGS_FLAG_START\n> & {\n submissionId: number;\n};\nexport const updateAiLogsFlagStart = (\n submissionId: number,\n): UpdateAiLogsFlagStartAction => ({\n type: ACTIONS.UPDATE_AI_LOGS_FLAG_START,\n submissionId,\n});\n\nexport type AddAiLogsFlagSuccessAction = Action<\n ACTIONS.ADD_AI_LOGS_FLAG_SUCCESS\n> & {\n submissionId: number;\n flagId: number;\n};\nexport const addAiLogsFlagSuccess = (\n submissionId: number,\n flagId: number\n): AddAiLogsFlagSuccessAction => ({\n type: ACTIONS.ADD_AI_LOGS_FLAG_SUCCESS,\n submissionId,\n flagId,\n});\n\nexport type DeleteAiLogsFlagSuccessAction = Action<\n ACTIONS.DELETE_AI_LOGS_FLAG_SUCCESS\n> & {\n submissionId: number\n};\nexport const deleteAiLogsFlagSuccess = (\n submissionId: number\n): DeleteAiLogsFlagSuccessAction => ({\n type: ACTIONS.DELETE_AI_LOGS_FLAG_SUCCESS,\n submissionId,\n});\n\nexport type AiLogsActions =\n | SearchAiLogsStartAction\n | SearchAiLogsSuccessAction\n | SearchAiLogsFailureAction\n | SearchAiLogsDisposeAction\n | UpdateAiLogsFlagStartAction\n | AddAiLogsFlagSuccessAction\n | DeleteAiLogsFlagSuccessAction\n | UpdateAiLogsFlagFailureAction;\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled from 'styled-components';\nimport { useTelepromterState } from '../../store/state';\nimport RepLine from './RepLine';\nimport CustomerLine from './CustomerLine';\nimport RecordRTC from 'recordrtc';\nimport { ScriptLineSpeaker } from '../../../../constants/interfaces/ScriptLine';\nimport ScriptLineDuration from './ScriptLineDuration';\nimport { Variables } from '../../../../theme/variables';\nimport { Loading } from '../../../../ui/components/LoadingCopmonent';\nimport Button from '../../Components/Button';\nimport Countdown from '../../Components/Countdown';\nimport {\n useAddGeneratedScriptLineService,\n useResetTelepromterService,\n useSetRecordedVideoService,\n} from '../../store/services';\nimport { useHistory } from '../../../../tools/router';\nimport ROUTES from '../../../../routes/routes';\nimport Close from '../../../../ui/icons/Close';\n\nconst Container = styled.div`\n position: relative;\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n background: ${props => props.theme.Colors.darkThree};\n`;\n\nconst ExitIcon = styled.div`\n height: 14px;\n width: 14px;\n color: ${props => props.theme.Colors.black};\n position: absolute;\n top: 74px;\n right: 24px;\n cursor: pointer;\n z-index: 1;\n user-select: none;\n &:hover {\n opacity: 0.7;\n }\n &:active {\n opacity: 0.6;\n }\n`;\n\nconst Hidden = styled.div`\n visibility: hidden;\n`;\n\nconst ScriptLineContainer = styled.div`\n flex: 1;\n width: 100%;\n background: ${props => props.theme.Colors.white};\n overflow: auto;\n`;\n\nconst VideoContainer = styled.div`\n height: 376px;\n width: 100%;\n position: relative;\n`;\n\nconst GoNextButton = styled.div`\n position: absolute;\n height: 184px;\n width: 100%;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst StyledVideo = styled.video`\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst Training = () => {\n const video = useRef<any>(null);\n let recorder: any = useRef<any>(null);\n const history = useHistory();\n const resetTelepromter = useResetTelepromterService();\n\n const useCaptureCamera = () =>\n useCallback((callback: any) => {\n return navigator.mediaDevices\n .getUserMedia({\n audio: true,\n video: {\n height: 375,\n\n width: 380,\n },\n })\n .then(function(camera) {\n return callback(camera);\n })\n .catch(err => console.log(err));\n }, []);\n\n const captureCamera = useCaptureCamera();\n const addGeneratedScriptLine = useAddGeneratedScriptLineService();\n const setRecordedVideo = useSetRecordedVideoService();\n\n const useInitializeCamera = () =>\n useCallback(() => {\n return captureCamera(function(camera: any) {\n if (!video.current || recorder.current) return;\n video.current.muted = true;\n video.current.volume = 0;\n video.current.srcObject = camera;\n recorder.current = new RecordRTC(camera, {\n type: 'video',\n });\n });\n }, []);\n\n const initializeCamera = useInitializeCamera();\n\n useEffect(() => {\n if (video.current) {\n initializeCamera().then();\n }\n }, [initializeCamera]);\n\n const startRecord = useCallback(() => {\n return captureCamera(function(camera: any) {\n recorder.current.startRecording();\n recorder.current.camera = camera;\n });\n }, [captureCamera]);\n\n const stopRecordingCallback = useCallback(() => {\n setRecordedVideo(URL.createObjectURL(recorder.current.getBlob()));\n recorder.current.camera.getTracks().forEach(function (track: any) {\n track.stop();\n });\n recorder.current.destroy();\n recorder.current = null;\n }, [setRecordedVideo]);\n\n const useStopRecordService = () =>\n useCallback(() => {\n if (recorder && recorder.current) {\n recorder.current.stopRecording(stopRecordingCallback);\n }\n if (video.current) {\n video.current.srcObject\n .getTracks()\n .forEach(function(track: any) {\n track.stop();\n });\n }\n }, []);\n\n useEffect(() => {\n return () => {\n if (recorder.current) {\n recorder.current.stopRecording();\n recorder.current.camera\n .getTracks()\n .forEach(function(track: any) {\n track.stop();\n });\n\n recorder.current.destroy();\n recorder.current = null;\n }\n\n if (video.current) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n video.current.srcObject\n .getTracks()\n .forEach(function(track: any) {\n track.stop();\n });\n }\n };\n }, []);\n\n const stopRecord = useStopRecordService();\n const renderVideo = useMemo(() => {\n return <StyledVideo ref={video} autoPlay={true} playsInline={true} />;\n }, [video]);\n\n const [countdown, setCountdown] = useState(3);\n const [startTraining, setStartTraining] = useState(false);\n\n const telepromterState = useTelepromterState();\n const scenario = telepromterState.scenario;\n\n const [tempScriptLines, setTempScriptLines] = useState(\n scenario.script.lines\n );\n\n useEffect(() => {\n setTempScriptLines(scenario.script.lines);\n }, [scenario.script.lines]);\n\n const currentScriptLine = tempScriptLines[0];\n\n // Start training / recording\n useEffect(() => {\n if (countdown === 0) {\n resetTelepromter();\n setStartTraining(true);\n startRecord().then();\n }\n }, [countdown, setStartTraining, startRecord, resetTelepromter]);\n\n const [repLineDuration, setRepLineDuration] = useState(0);\n\n useEffect(() => {\n if (\n !currentScriptLine ||\n (currentScriptLine &&\n currentScriptLine.speaker !== ScriptLineSpeaker.REP)\n ) {\n return;\n }\n const timer = setInterval(() => {\n setRepLineDuration(prevState => prevState + 0.1);\n }, 100);\n return () => {\n clearInterval(timer);\n };\n }, [setRepLineDuration, currentScriptLine]);\n\n const redirectToExit = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.EXIT.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n const redirectToCompleted = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.COMPLETED.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n const handleGoNext = useCallback(() => {\n if (currentScriptLine.speaker === ScriptLineSpeaker.CUSTOMER) {\n addGeneratedScriptLine({\n id: currentScriptLine.id,\n text: currentScriptLine.text,\n duration: currentScriptLine.duration,\n audioUrl: currentScriptLine.audioUrl,\n position: currentScriptLine.position,\n speaker: currentScriptLine.speaker,\n });\n setRepLineDuration(0);\n } else {\n addGeneratedScriptLine({\n id: currentScriptLine.id,\n text: currentScriptLine.text,\n duration: parseFloat(repLineDuration.toFixed(2)),\n audioUrl: currentScriptLine.audioUrl,\n position: currentScriptLine.position,\n speaker: currentScriptLine.speaker,\n });\n setRepLineDuration(0);\n }\n if (\n currentScriptLine.id ===\n tempScriptLines[tempScriptLines.length - 1].id\n ) {\n stopRecord();\n const timeout = setTimeout(() => {\n redirectToCompleted();\n }, 300);\n\n return () => {\n clearInterval(timeout);\n };\n }\n setTempScriptLines(prevLines => {\n const prevScriptLines = [...prevLines];\n prevScriptLines.shift();\n return prevScriptLines;\n });\n }, [\n addGeneratedScriptLine,\n currentScriptLine,\n stopRecord,\n tempScriptLines,\n setRepLineDuration,\n repLineDuration,\n redirectToCompleted,\n ]);\n\n useEffect(() => {\n if (!currentScriptLine || !startTraining) return;\n let lineTimer = 0;\n\n const lineDurationTimer = setInterval(() => {\n lineTimer += 0.3;\n if (\n lineTimer >= currentScriptLine.duration &&\n currentScriptLine.speaker === ScriptLineSpeaker.CUSTOMER\n ) {\n handleGoNext();\n lineTimer = 0;\n }\n }, 300);\n\n return () => {\n clearInterval(lineDurationTimer);\n };\n }, [currentScriptLine, tempScriptLines, startTraining, handleGoNext]);\n\n if (telepromterState.loading || !currentScriptLine) {\n return (\n <Container>\n <Loading />\n <Hidden>{renderVideo}</Hidden>\n </Container>\n );\n }\n\n return (\n <Container>\n <ExitIcon onClick={redirectToExit}>\n <Close />\n </ExitIcon>\n {countdown > 0 && (\n <Countdown countdown={countdown} setCountdown={setCountdown} />\n )}\n <ScriptLineDuration\n key={currentScriptLine.id}\n duration={currentScriptLine.duration}\n color={\n currentScriptLine.speaker === ScriptLineSpeaker.CUSTOMER\n ? Variables.Colors.cloudyBlue\n : Variables.Colors.paleRed\n }\n started={startTraining}\n />\n {startTraining && (\n <audio\n src={currentScriptLine.audioUrl}\n muted={currentScriptLine.speaker === ScriptLineSpeaker.REP}\n autoPlay={true}\n />\n )}\n <ScriptLineContainer>\n {tempScriptLines.map(line => {\n if (line.speaker === ScriptLineSpeaker.CUSTOMER) {\n return (\n <CustomerLine\n key={line.id}\n text={line.text}\n disabled={\n line.id !== currentScriptLine.id ||\n !startTraining\n }\n />\n );\n } else {\n return (\n <RepLine\n key={line.id}\n text={line.text}\n disabled={\n line.id !== currentScriptLine.id ||\n !startTraining\n }\n />\n );\n }\n })}\n </ScriptLineContainer>\n <VideoContainer>\n {renderVideo}\n {currentScriptLine.speaker === ScriptLineSpeaker.REP && (\n <GoNextButton>\n <Button onClick={handleGoNext} />\n </GoNextButton>\n )}\n </VideoContainer>\n </Container>\n );\n};\n\nexport default Training;\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../../ui/components/Button';\nimport ROUTES from '../../../../routes/routes';\nimport { useTelepromterState } from '../../store/state';\nimport { useHistory } from '../../../../tools/router';\n\nconst Container = styled.div`\n background: ${props => props.theme.Colors.darkThree};\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n padding: 72px 32px 0 32px;\n box-sizing: border-box;\n`;\n\nconst Text = styled.div`\n font-size: 17px;\n color: ${props => props.theme.Colors.white};\n margin-bottom: 32px;\n`;\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n`;\n\nconst Actions = styled.div`\n height: 180px;\n margin-bottom: 32px;\n display: flex;\n align-items: center;\n flex-direction: column;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-bottom: 8px;\n`;\n\nconst Exit: FC = () => {\n const scenario = useTelepromterState().scenario;\n const history = useHistory();\n\n const redirectToScenario = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n const redirectToTraining = useCallback(() => {\n if (scenario.id) {\n history.push(\n ROUTES.TELEPROMTER_PAGES.TRAINING.replace(\n ':scenarioId',\n scenario.id.toString()\n )\n );\n }\n }, [history, scenario.id]);\n\n return (\n <Container>\n <Content>\n <Text>Are you sure you want to exit?</Text>\n <Actions>\n <ButtonWrapper>\n <Button\n label=\"Go Back to Scenario\"\n width=\"152px\"\n height=\"48px\"\n action={redirectToTraining}\n />\n </ButtonWrapper>\n <ButtonWrapper>\n <Button\n label=\"Yes Exit\"\n width=\"152px\"\n height=\"48px\"\n action={redirectToScenario}\n variant={'inverse'}\n />\n </ButtonWrapper>\n </Actions>\n </Content>\n </Container>\n );\n};\n\nexport default Exit;\n","import React, { FC, useEffect } from 'react';\nimport { Redirect, Switch } from 'react-router-dom';\nimport ROUTES from '../../../routes/routes';\nimport PrivateRoute from '../../../routes/PrivateRouter';\nimport Completed from './Completed/Completed';\nimport Playback from './Playback/Playback';\nimport Training from './Training/Training';\nimport styled from 'styled-components';\nimport { useGetTelepromterScenarioService } from '../store/services';\nimport { useParams } from 'react-router-dom';\nimport Exit from './Exit/Exit';\n\nconst Container = styled.div`\n height: 100vh;\n width: 100%;\n display: flex;\n background: ${props => props.theme.Colors.darkTwo};\n justify-content: center;\n overflow: auto;\n`;\n\nconst PhoneEmulator = styled.div`\n height: 810px;\n width: 375px;\n border-radius: 8px;\n margin: 48px 0;\n overflow: hidden;\n`;\n\nconst Telepromter: FC = () => {\n const getScenario = useGetTelepromterScenarioService();\n const params = useParams<{ scenarioId?: string }>();\n useEffect(() => {\n if (params.scenarioId) {\n getScenario(params.scenarioId);\n }\n }, [getScenario, params.scenarioId]);\n\n return (\n <Container>\n <PhoneEmulator>\n <Switch>\n <Redirect\n from={ROUTES.TELEPROMTER}\n exact\n to={ROUTES.TELEPROMTER_PAGES.TRAINING}\n />\n <PrivateRoute\n path={ROUTES.TELEPROMTER_PAGES.COMPLETED}\n component={Completed}\n />\n <PrivateRoute\n path={ROUTES.TELEPROMTER_PAGES.PLAYBACK}\n component={Playback}\n />\n <PrivateRoute\n path={ROUTES.TELEPROMTER_PAGES.TRAINING}\n component={Training}\n />\n <PrivateRoute\n path={ROUTES.TELEPROMTER_PAGES.EXIT}\n component={Exit}\n />\n </Switch>\n </PhoneEmulator>\n </Container>\n );\n};\n\nexport default Telepromter;\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport { handleToggleSelectedItems } from '../../../../../../pages/ActionPages/NewUser/tools';\n\nimport { DraftUser } from '../../../../../../constants/interfaces/Draft';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../pages/UserProfile/store/reducers';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { TableDivider } from '../../../../../../ui/components/table-wrapper/table-divider';\n\nconst StyledCreatedByList = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst TopSideList = styled.span``;\n\nconst GeneralList = styled.span``;\n\nconst CreatedByItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n`;\n\nconst CreatedByItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;\nconst YouWrapper = styled.span`\n font-size: 13px;\n color: ${({ theme }) => theme.Colors.steelGrey};\n`;\nexport const CreatedByFiltersList: FC<{\n users?: Partial<DraftUser>[];\n selectedUsers: number[];\n disabled?: boolean;\n setUserFilters?: (userId: number[]) => void;\n}> = ({ users, selectedUsers, setUserFilters }) => {\n const isChecked = useCallback(\n (setId?: number) => {\n return !!selectedUsers && !!setId && selectedUsers.includes(setId);\n },\n [selectedUsers]\n );\n\n const profile = useSelector(getProfileState);\n\n const isPartiallyChecked = useCallback(\n (userId?: number) => {\n return (\n !!selectedUsers &&\n !!userId &&\n selectedUsers.includes(-Number(userId))\n );\n },\n [selectedUsers]\n );\n\n const changeHandler = (userId?: number) => {\n if (userId && setUserFilters) {\n setUserFilters(handleToggleSelectedItems(selectedUsers, userId));\n }\n };\n\n if (!users || (users && users.length === 0)) return null;\n\n const topListCreatedBy = users.filter(\n user => user.id && selectedUsers.includes(user.id)\n );\n\n const bottomListCreatedBy = users.filter(\n user => user.id && !selectedUsers.includes(user.id)\n );\n\n return (\n <StyledCreatedByList>\n {topListCreatedBy.length > 0 && (\n <TopSideList>\n {topListCreatedBy.map(user => {\n return (\n <CreatedByItemWrapper key={user.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(user.id) ||\n isPartiallyChecked(user.id)\n }\n partial={isPartiallyChecked(user.id)}\n handleChange={() => changeHandler(user.id)}\n dataTest=\"selected-creators-item-checkbox\"\n />\n <CreatedByItem\n onClick={() => changeHandler(user.id)}\n data-test=\"selected-creators-item-text\"\n >\n {user.firstName} {user.lastName}{' '}\n {user.id === profile?.id && (\n <YouWrapper>(you)</YouWrapper>\n )}\n </CreatedByItem>\n </CreatedByItemWrapper>\n );\n })}\n {topListCreatedBy.length < users.length && <TableDivider width=\"98%\" />}\n </TopSideList>\n )}\n <GeneralList>\n {bottomListCreatedBy.map(user => {\n return (\n <CreatedByItemWrapper key={user.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(user.id) ||\n isPartiallyChecked(user.id)\n }\n partial={isPartiallyChecked(user.id)}\n handleChange={() => changeHandler(user.id)}\n dataTest=\"creators-item-checkbox\"\n />\n <CreatedByItem\n onClick={() => changeHandler(user.id)}\n data-test=\"creators-item-text\"\n >\n {user.firstName} {user.lastName}{' '}\n {user.id === profile?.id && (\n <YouWrapper>(you)</YouWrapper>\n )}\n </CreatedByItem>\n </CreatedByItemWrapper>\n );\n })}\n </GeneralList>\n </StyledCreatedByList>\n );\n};\n","import { DraftUser } from '../../../../../constants/interfaces/Draft';\n\nexport const filterUsers = (term: string) => (\n users: Partial<DraftUser>[]\n): Partial<DraftUser>[] => {\n if (!term) {\n return users;\n }\n\n return users.filter(\n item =>\n (item &&\n item.firstName &&\n item.firstName.toLowerCase().indexOf(term.toLowerCase()) !==\n -1) ||\n (item &&\n item.lastName &&\n item.lastName.toLowerCase().indexOf(term.toLowerCase()) !==\n -1) ||\n (item?.firstName && item.lastName &&\n `${item.firstName} ${item.lastName}`.trim().toLowerCase().indexOf(term.toLowerCase().trim()) !== -1)\n );\n};\n","import { FC, useCallback, useEffect, useMemo } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { Variables } from '../../../../../../theme/variables';\r\nimport { useSearchCreatedByUsersService } from '../../../../store/services';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../../../constants/interfaces/filters';\r\nimport { useDraftsState } from '../../../../store/states';\r\nimport { CreatedByFiltersList } from './CreatedByFiltersList';\r\nimport { compose } from 'redux';\r\nimport { sortLabels } from '../../../../../labels/tools';\r\nimport { DraftUser } from '../../../../../../constants/interfaces/Draft';\r\nimport { filterUsers } from '../tools';\r\nimport { EmptyState } from '../../../../../../ui/components/EmptyStates';\r\nimport NoSearchResult from '../../../../../../ui/icons/NoSearchResult';\r\nimport {Loading} from \"../../../../../../ui/components/LoadingCopmonent/Loading\";\r\nimport { TableSearchInput } from '../../../../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\nconst Container = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst ContainerBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst EmptyTextWrapper = styled.span`\r\n font-size: 13px;\r\n`;\r\n\r\nconst EmptyStateWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n height: 100%;\r\n`;\r\n\r\ntype Action = 'clear' | 'select';\r\n\r\nconst actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n> = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n};\r\n\r\nconst initialSearchParams: Partial<SearchParams> = {\r\n searchTerm: '',\r\n};\r\n\r\nconst CreatedByFilters: FC<{\r\n selectedUsers: number[];\r\n selectCreatedByUsers: (userIds: number[]) => void;\r\n}> = ({ selectedUsers, selectCreatedByUsers }) => {\r\n const fetchUsers = useSearchCreatedByUsersService();\r\n const draftsState = useDraftsState();\r\n const createdByUsers = useMemo(() => draftsState.createdByUsers || [], [\r\n draftsState,\r\n ]);\r\n\r\n const { searchParams, setSearchTerm } = useSearchParamsState(\r\n initialSearchParams as SearchParams\r\n );\r\n\r\n useEffect(() => {\r\n fetchUsers({\r\n searchTerm: '',\r\n } as SearchParams);\r\n }, [fetchUsers]);\r\n\r\n const getProcessedUsers = useCallback(() => {\r\n if (createdByUsers) {\r\n return compose<Partial<DraftUser>[]>(\r\n filterUsers(searchParams.searchTerm),\r\n sortLabels\r\n )(createdByUsers);\r\n } else {\r\n return [];\r\n }\r\n }, [searchParams.searchTerm, createdByUsers]);\r\n\r\n const selectAllHandler = () => {\r\n selectCreatedByUsers(getProcessedUsers().map(user => user.id));\r\n };\r\n\r\n const clearHandler = () => {\r\n selectCreatedByUsers([]);\r\n };\r\n\r\n const showEmptyState = !getProcessedUsers().length;\r\n const selectedUsersCount = selectedUsers.length;\r\n\r\n const isAllSelected = useMemo(\r\n () => createdByUsers.length === selectedUsersCount,\r\n [createdByUsers.length, selectedUsersCount]\r\n ); \r\n\r\n return (\r\n <Container>\r\n <ContainerBody>\r\n <SearchWrapper>\r\n <TableSearchInput\r\n onChange={setSearchTerm}\r\n disabled={createdByUsers.length < 1}\r\n dataTest=\"creators-search\"\r\n />\r\n </SearchWrapper>\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"creators-selected-text\">\r\n {selectedUsersCount > 0\r\n ? `${selectedUsersCount} ${\r\n selectedUsersCount > 1\r\n ? ' Users selected'\r\n : ' User selected'\r\n }`\r\n : 'No Users selected'}\r\n </SelectedCaption>\r\n </div>\r\n <div>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n selectedUsers.length === 0 || showEmptyState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"creators-unselect-all\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showEmptyState}\r\n color={actionConfig.select.color}\r\n colorActive={actionConfig.select.colorActive}\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={selectAllHandler}\r\n data-test=\"creators-select-all\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </div>\r\n </SelectActions>\r\n {showEmptyState ? (\r\n draftsState.loadingCreatedBy ? (\r\n <Loading />\r\n ) : (\r\n <EmptyStateWrapper>\r\n <EmptyState icon={NoSearchResult} dataTest=\"no-creators\">\r\n <EmptyTextWrapper>\r\n No Users Found\r\n </EmptyTextWrapper>\r\n </EmptyState>\r\n </EmptyStateWrapper>\r\n )\r\n ) : (\r\n <CreatedByFiltersList\r\n users={getProcessedUsers()}\r\n selectedUsers={selectedUsers}\r\n disabled={false}\r\n setUserFilters={selectCreatedByUsers}\r\n />\r\n )}\r\n </ContainerBody>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default CreatedByFilters;\r\n","import React, { FC, useCallback } from 'react';\nimport styled from 'styled-components';\nimport { handleToggleSelectedItems } from '../../../../../../pages/ActionPages/NewUser/tools';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { DraftUser } from '../../../../../../constants/interfaces/Draft';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../pages/UserProfile/store/reducers';\nimport { TableDivider } from '../../../../../../ui/components/table-wrapper/table-divider';\n\nconst StyledCreatedByList = styled.div`\n overflow: auto;\n height: 100%;\n`;\n\nconst TopSideList = styled.span``;\n\nconst GeneralList = styled.span``;\n\nconst CreatedByItemWrapper = styled.div`\n display: flex;\n align-items: center;\n margin: 10px 0;\n`;\n\nconst CreatedByItem = styled.div<{ disabled?: boolean }>`\n color: ${props => props.theme.Colors.black};\n cursor: pointer;\n border-radius: 8px;\n font-weight: 500;\n font-size: 13px;\n padding: 0 12px;\n align-items: center;\n background: ${props => props.theme.Colors.white};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n ${props => props.disabled && 'pointer-events: none'}\n &:active {\n opacity: 0.7;\n }\n`;\nconst YouWrapper = styled.span`\n font-size: 13px;\n color: ${props => props.theme.Colors.steelGrey};\n`;\nexport const EditedByFiltersList: FC<{\n users?: Partial<DraftUser>[];\n selectedUsers: number[];\n disabled?: boolean;\n setUserFilters?: (userId: number[]) => void;\n}> = ({ users, selectedUsers, setUserFilters }) => {\n const isChecked = useCallback(\n (setId?: number) => {\n return !!selectedUsers && !!setId && selectedUsers.includes(setId);\n },\n [selectedUsers]\n );\n\n const profile = useSelector(getProfileState);\n \n const isPartiallyChecked = useCallback(\n (userId?: number) => {\n return (\n !!selectedUsers &&\n !!userId &&\n selectedUsers.includes(-Number(userId))\n );\n },\n [selectedUsers]\n );\n\n const changeHandler = (userId?: number) => {\n if (userId && setUserFilters) {\n setUserFilters(handleToggleSelectedItems(selectedUsers, userId));\n }\n };\n\n if (!users || (users && users.length === 0)) return null;\n\n const topListCreatedBy = users.filter(\n user => user.id && selectedUsers.includes(user.id)\n );\n\n const bottomListCreatedBy = users.filter(\n user => user.id && !selectedUsers.includes(user.id)\n );\n\n return (\n <StyledCreatedByList>\n {topListCreatedBy.length > 0 && (\n <TopSideList>\n {topListCreatedBy.map(user => {\n return (\n <CreatedByItemWrapper key={user.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(user.id) ||\n isPartiallyChecked(user.id)\n }\n partial={isPartiallyChecked(user.id)}\n handleChange={() => changeHandler(user.id)}\n dataTest=\"selected-editors-item-checkbox\"\n />\n <CreatedByItem\n onClick={() => changeHandler(user.id)}\n data-test=\"selected-editors-item-text\"\n >\n {user.firstName} {user.lastName} {user.id === profile?.id && <YouWrapper>(you)</YouWrapper>}\n </CreatedByItem>\n </CreatedByItemWrapper>\n );\n })}\n {topListCreatedBy.length < users.length && <TableDivider width=\"98%\" />}\n </TopSideList>\n )}\n <GeneralList>\n {bottomListCreatedBy.map(user => {\n return (\n <CreatedByItemWrapper key={user.id}>\n <Checkbox\n size={12}\n checked={\n isChecked(user.id) ||\n isPartiallyChecked(user.id)\n }\n partial={isPartiallyChecked(user.id)}\n handleChange={() => changeHandler(user.id)}\n dataTest=\"editors-item-checkbox\"\n />\n <CreatedByItem\n onClick={() => changeHandler(user.id)}\n data-test=\"editors-item-text\"\n >\n {user.firstName} {user.lastName} {user.id === profile?.id && <YouWrapper>(you)</YouWrapper>}\n </CreatedByItem>\n </CreatedByItemWrapper>\n );\n })}\n </GeneralList>\n </StyledCreatedByList>\n );\n};\n","import { FC, useCallback, useEffect, useMemo } from 'react';\r\nimport styled, { css } from 'styled-components';\r\n\r\nimport { Variables } from '../../../../../../theme/variables';\r\nimport { useSearchEditedByUsersService } from '../../../../store/services';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../../../constants/interfaces/filters';\r\nimport { useDraftsState } from '../../../../store/states';\r\nimport { EditedByFiltersList } from './EditedByFiltersList';\r\nimport { compose } from 'redux';\r\nimport { sortLabels } from '../../../../../labels/tools';\r\nimport { DraftUser } from '../../../../../../constants/interfaces/Draft';\r\nimport { filterUsers } from '../tools';\r\nimport { EmptyState } from '../../../../../../ui/components/EmptyStates';\r\nimport NoSearchResult from '../../../../../../ui/icons/NoSearchResult';\r\nimport { Loading } from '../../../../../../ui/components/LoadingCopmonent/Loading';\r\nimport User from '../../../../../../ui/icons/User';\r\nimport { TableSearchInput } from '../../../../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\nconst Container = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst ContainerBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst EmptyTextWrapper = styled.span`\r\n font-size: 13px;\r\n`;\r\n\r\nconst EmptyStateWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n height: 100%;\r\n`;\r\n\r\ntype Action = 'clear' | 'select';\r\n\r\nconst actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n> = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n};\r\n\r\nconst initialSearchParams: Partial<SearchParams> = {\r\n searchTerm: '',\r\n};\r\n\r\nconst EditedByFilters: FC<{\r\n selectedUsers: number[];\r\n selectEditedByUsers: (userIds: number[]) => void;\r\n}> = ({ selectedUsers, selectEditedByUsers }) => {\r\n const fetchUsers = useSearchEditedByUsersService();\r\n const draftsState = useDraftsState();\r\n const editedByUsers = useMemo(() => draftsState.editedByUsers || [], [\r\n draftsState,\r\n ]);\r\n\r\n const { searchParams, setSearchTerm } = useSearchParamsState(\r\n initialSearchParams as SearchParams\r\n );\r\n\r\n useEffect(() => {\r\n fetchUsers({\r\n searchTerm: '',\r\n } as SearchParams);\r\n }, [fetchUsers]);\r\n\r\n const getProcessedUsers = useCallback(() => {\r\n if (editedByUsers) {\r\n return compose<Partial<DraftUser>[]>(\r\n filterUsers(searchParams.searchTerm),\r\n sortLabels\r\n )(editedByUsers);\r\n } else {\r\n return [];\r\n }\r\n }, [searchParams.searchTerm, editedByUsers]);\r\n\r\n const selectAllHandler = () => {\r\n selectEditedByUsers(getProcessedUsers().map(user => user.id));\r\n };\r\n\r\n const clearHandler = () => {\r\n selectEditedByUsers([]);\r\n };\r\n\r\n const showEmptyState = !getProcessedUsers().length;\r\n const selectedUsersCount = selectedUsers.length;\r\n\r\n const isAllSelected = useMemo(\r\n () => editedByUsers.length === selectedUsersCount,\r\n [editedByUsers, selectedUsersCount]\r\n );\r\n\r\n return (\r\n <Container>\r\n <ContainerBody>\r\n <SearchWrapper>\r\n <TableSearchInput\r\n onChange={setSearchTerm}\r\n disabled={editedByUsers.length < 1}\r\n dataTest=\"editors-search\"\r\n />\r\n </SearchWrapper>\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption data-test=\"editors-selected-text\">\r\n {selectedUsersCount > 0\r\n ? `${selectedUsersCount} ${\r\n selectedUsersCount > 1\r\n ? ' Users selected'\r\n : ' User selected'\r\n }`\r\n : 'No Users selected'}\r\n </SelectedCaption>\r\n </div>\r\n <div>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n selectedUsers.length === 0 || showEmptyState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n data-test=\"editors-unselect-all\"\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showEmptyState}\r\n color={actionConfig.select.color}\r\n colorActive={actionConfig.select.colorActive}\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={selectAllHandler}\r\n data-test=\"editors-select-all\"\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </div>\r\n </SelectActions>\r\n {showEmptyState ? (\r\n draftsState.loadingEditedBy ? (\r\n <Loading />\r\n ) : searchParams.searchTerm ? (\r\n <EmptyStateWrapper>\r\n <EmptyState icon={NoSearchResult} dataTest=\"no-editors-found\">\r\n <EmptyTextWrapper>\r\n No Users Found\r\n </EmptyTextWrapper>\r\n </EmptyState>\r\n </EmptyStateWrapper>\r\n ) : (\r\n <EmptyStateWrapper>\r\n <EmptyState icon={User} dataTest=\"no-editors\">\r\n <EmptyTextWrapper>\r\n No Users Yet\r\n </EmptyTextWrapper>\r\n </EmptyState>\r\n </EmptyStateWrapper>\r\n )\r\n ) : (\r\n <EditedByFiltersList\r\n users={getProcessedUsers()}\r\n selectedUsers={selectedUsers}\r\n disabled={false}\r\n setUserFilters={selectEditedByUsers}\r\n />\r\n )}\r\n </ContainerBody>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default EditedByFilters;\r\n","import React, { FC, useCallback, useEffect } from 'react';\nimport { Variables } from '../../../../../theme/variables';\nimport styled from 'styled-components';\nimport { Button } from '../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../ui/components/Fieldset';\nimport CreatedByFilters from './CreatedByFilters/CreatedByFilters';\nimport EditedByFilters from './EditedByFilters/EditedByFilters';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nconst SectionContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const DraftsFilter: FC<{\n createdBySelectedUsers: number[];\n createdBySavedUsers: number[];\n selectCreatedByUsers: (userIds: number[]) => void;\n saveCreatedByUsers: (userIds: number[]) => void;\n editedBySelectedUsers: number[];\n editedBySavedUsers: number[];\n selectEditedByUsers: (userIds: number[]) => void;\n saveEditedByUsers: (userIds: number[]) => void;\n onSuccessApply: () => void;\n}> = ({\n createdBySelectedUsers,\n createdBySavedUsers,\n selectCreatedByUsers,\n saveCreatedByUsers,\n editedBySavedUsers,\n editedBySelectedUsers,\n selectEditedByUsers,\n saveEditedByUsers,\n onSuccessApply,\n}) => {\n useEffect(() => {\n selectCreatedByUsers(createdBySavedUsers);\n selectEditedByUsers(editedBySavedUsers);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onApplyHandler = useCallback(() => {\n saveCreatedByUsers(createdBySelectedUsers);\n saveEditedByUsers(editedBySelectedUsers);\n onSuccessApply();\n }, [\n createdBySelectedUsers,\n editedBySelectedUsers,\n onSuccessApply,\n saveCreatedByUsers,\n saveEditedByUsers,\n ]);\n\n const onClearHandler = useCallback(() => {\n selectCreatedByUsers([]);\n selectEditedByUsers([]);\n }, [selectCreatedByUsers, selectEditedByUsers]);\n\n const selectedFiltersCount =\n createdBySelectedUsers.length + editedBySelectedUsers.length;\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Created by'} dataTest=\"creators-section-title\">\n <SectionContainer>\n <CreatedByFilters\n selectedUsers={createdBySelectedUsers}\n selectCreatedByUsers={selectCreatedByUsers}\n />\n </SectionContainer>\n </Fieldset>\n <Fieldset title={'Edited by'} dataTest=\"editors-section-title\">\n <SectionContainer>\n <EditedByFilters\n selectedUsers={editedBySelectedUsers}\n selectEditedByUsers={selectEditedByUsers}\n />\n </SectionContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {selectedFiltersCount} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n width={'122px'}\n variant={'inverse'}\n action={() => onClearHandler()}\n disabled={selectedFiltersCount < 1}\n customDisabledColor={Variables.Colors.cloudyBlue}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={() => onApplyHandler()}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoDrafts = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"100%\" \n height=\"100%\" \n fill=\"none\" \n viewBox=\"0 0 48 48\"\n className={className}\n ref={ref}\n >\n <rect width=\"34\" height=\"3\" x=\"7\" y=\"7\" fill=\"currentColor\" rx=\"1.5\"/>\n <rect width=\"25\" height=\"3\" x=\"11\" y=\"1\" fill=\"currentColor\" rx=\"1.5\"/>\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M43 13c1.105 0 2 .895 2 2v30c0 1.105-.895 2-2 2H5c-1.105 0-2-.895-2-2V15c0-1.105.895-2 2-2h38zm-1 3H6v3.565L23.032 30.35 42 19.491V16zm0 6.948L22.954 33.85 6 23.116V44h36V22.948z\" clipRule=\"evenodd\"/>\n </svg> \n );\n }\n);\n\nexport default NoDrafts;\n","import { Reducer } from 'redux';\nimport { SocketProgressStateInterface } from './states';\nimport { ACTIONS, SocketProgressShow, SocketProgressHide } from './actions';\nimport { AppState } from '../../../store/reducers';\n\nconst initialState: SocketProgressStateInterface = {\n show: false,\n};\n\nexport const getSocketState = (state: AppState) => state.socketProgress.show;\n\nexport type Action =\n | ReturnType<typeof SocketProgressShow>\n | ReturnType<typeof SocketProgressHide>;\n\nexport const SocketProgressReducer: Reducer<\n SocketProgressStateInterface,\n Action\n> = (state = initialState, action: Action): SocketProgressStateInterface => {\n switch (action.type) {\n case ACTIONS.SOCKET_PROGRESS_SHOW:\n return {\n show: true,\n };\n case ACTIONS.SOCKET_PROGRESS_HIDE: {\n return {\n show: false,\n };\n }\n default:\n return state;\n }\n};","import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => ({\n customTableColumnStyle: {\n minWidth: 120,\n },\n\n avatarTableCellCustomStyle: {\n padding: 0,\n },\n}));\n\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { History } from 'history';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router';\n\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../ui/components/ActionButton';\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../constants/interfaces/filters';\nimport { PaginationResult } from '../../../../constants/interfaces/PaginationResult';\nimport { UserProfile } from '../../../../constants/interfaces/User';\nimport {\n useDeleteStagingService,\n useSearchDraftsService,\n useUpdateAllSelectedDraftStateService,\n useUpdateSelectedDraftStateService,\n} from '../../store/services';\nimport { useDraftsState, useUpdatedDraftsState } from '../../store/states';\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\nimport UsersPageNavigationContainer from '../../components/UsersPageNavigation';\nimport { clearSelectedItemIfNotLoaded } from '../../../labels/tools';\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\nimport { Draft, DraftUser } from '../../../../constants/interfaces/Draft';\nimport { formatDate } from '../../../../helpers/functions/date-convert';\nimport { CheckPermission } from '../../../permissions';\nimport ROUTES from '../../../../routes/routes';\nimport { usePermissionsState } from '../../../permissions/store/state';\nimport { useDraftEditState } from '../../../../pages/ActionPages/NewUser/store/states';\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\nimport { Popup } from '../../../../ui/components/Popup';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport { DraftsFilter } from '../../components/Filters/DraftsFilter/DraftsFilter';\n\nimport NoDrafts from '../../../../ui/icons/NoDrafts';\nimport { isAdminRole, isTeamLeader } from '../../../../constants/enums';\nimport { useSessionEffect } from '../../../common';\nimport { normalizeSP } from '../../../../helpers/functions/searchparams-normalize';\nimport { getSocketState } from '../../../socketProgress(api1)/store/reducer';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport { isEmpty } from 'lodash';\nimport { useStyles } from './styles';\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useFilter } from '../../../../ui/components/table-wrapper/table/TableDropdown';\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\nimport { CompanyUserStatsText } from '../../../../ui/components/CompanyUserStatsText';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nconst CREATOR_FIELD = 'creatorId';\nconst EDITOR_FIELD = 'lastEditedById';\n\nconst Drafts: FC<{\n history: History<any>;\n draftEditUpdated?: Partial<DraftUser>;\n searchDrafts: (sp: SearchParams) => void;\n onDeleteDraft: (\n draftIds: number[],\n search?: SearchParams,\n selectAll?: boolean,\n successCallback?: () => void\n ) => void;\n profile?: UserProfile;\n drafts?: PaginationResult<Draft>;\n selectedDrafts?: number[];\n updatedDrafts?: Draft;\n updateAllSelectedDrafts(\n userIds: number[],\n checked: boolean,\n partial?: boolean\n ): void;\n updateSelectedDraft(draftId: number): void;\n loading?: boolean;\n}> = ({\n drafts,\n draftEditUpdated,\n searchDrafts,\n onDeleteDraft,\n profile,\n updatedDrafts,\n selectedDrafts,\n updateAllSelectedDrafts,\n updateSelectedDraft,\n loading,\n history,\n}) => {\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n\n const [createdBySelectedUsers, setCreatedBySelectedUsers] = useState<\n number[]\n >([]);\n const [createdBySavedUsers, setCreatedBySavedUsers] = useState<number[]>(\n []\n );\n const [editedBySelectedUsers, setEditedBySelectedUsers] = useState<\n number[]\n >([]);\n const [editedBySavedUsers, setEditedBySavedUsers] = useState<number[]>([]);\n\n const canAccessPage = useHandleAccessPage();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n orderBy: { field: 'lastEditedBy.firstName', asc: false },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setOffset,\n setFilter,\n refreshSearchParams,\n } = useSearchParamsState(initialSearchParams);\n\n const classes = useStyles();\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const isCheckboxPartiallySelected =\n drafts &&\n drafts.items &&\n selectedDrafts &&\n selectedDrafts.length < drafts.items.length;\n\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchDrafts(searchParams);\n setLastRefreshed(new Date());\n setIsSelectAll(false);\n\n updateAllSelectedDrafts([], true, isCheckboxPartiallySelected);\n }, [\n initialOffset,\n isCheckboxPartiallySelected,\n searchDrafts,\n searchParams,\n updateAllSelectedDrafts,\n ]);\n\n const socketLoaderState = useSelector(getSocketState);\n\n const handleItemEdit = useCallback(\n (draftId: any) => {\n history.push(\n ROUTES.ACTION_ITEMS.NEW_USER.replace(\n ':draftId',\n draftId.toString()\n )\n );\n },\n [history]\n );\n\n const updateAllUsersCheck = useCallback(\n (checked: boolean) => {\n const draftIds =\n (drafts &&\n drafts.items.map((draft: Draft) => Number(draft.id))) ||\n [];\n updateAllSelectedDrafts(\n draftIds,\n checked,\n isCheckboxPartiallySelected\n );\n },\n [drafts, isCheckboxPartiallySelected, updateAllSelectedDrafts]\n );\n\n const handleDraftCheck = (e: any, draft: Draft) => {\n e.stopPropagation();\n if (!!draft.id) {\n updateSelectedDraft(draft.id);\n }\n };\n\n const isOptionsDisabled =\n !selectedDrafts || (selectedDrafts && !selectedDrafts.length);\n\n const orderBy = searchParams.orderBy;\n const srtName = useOrderBy('name', orderBy, setOrderBy);\n const srtUsersCount = useOrderBy('usersCount', orderBy, setOrderBy);\n const srtCreatedBy = useOrderBy('creator.firstName', orderBy, setOrderBy);\n const srtCreatedAt = useOrderBy('createdAt', orderBy, setOrderBy);\n const srtLastEditedBy = useOrderBy(\n 'lastEditedBy.firstName',\n orderBy,\n setOrderBy\n );\n const srtUpdatedAt = useOrderBy('updatedAt', orderBy, setOrderBy);\n\n const handleCreatorIdChangeEvent = useFilter(CREATOR_FIELD, setFilter);\n const handleEditorIdChangeEvent = useFilter(EDITOR_FIELD, setFilter);\n\n const selectCreatedByUsers = (userIds: number[]) => {\n setCreatedBySelectedUsers(userIds);\n };\n const saveCreatedByUsers = (userIds: number[]) => {\n setCreatedBySavedUsers(userIds);\n };\n\n const selectEditedByUsers = (userIds: number[]) => {\n setEditedBySelectedUsers(userIds);\n };\n const saveEditedByUsers = (userIds: number[]) => {\n setEditedBySavedUsers(userIds);\n };\n\n const permissions = usePermissionsState();\n const handleViewStaging = (draftId: any) => {\n if (!draftId || !permissions.includes(NEW_PERMISSIONS.UPDATE_STAGING))\n return;\n\n handleItemEdit && handleItemEdit(draftId);\n };\n\n const isListEmpty = !drafts || (drafts && !drafts.items.length);\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: searchParams.filters?.length,\n itemsCount: drafts?.items.length || 0,\n });\n\n /**\n * @function onConfirmDeleteDrafts\n * @param { number[] } draftIds\n * @returns { void }\n */\n const onConfirmDeleteDrafts = (draftIds: number[]): void => {\n const selectAllState = draftIds.length === 1 ? false : isSelectAll;\n\n onDeleteDraft(\n draftIds,\n isSelectAll\n ? normalizeSP(searchParams, drafts?.totalCount)\n : searchParams,\n selectAllState\n );\n };\n\n /**\n * @function handleDeleteDrafts\n * @returns { void }\n */\n const handleDeleteDrafts = (draftIds: number[]): void => {\n showConfirmationModalDialog({\n modalTitle: 'Warning',\n description:\n 'This action cannot be undone. You will erase this draft and all the saved information.',\n cancelButtonText: 'Go Back',\n confirmButtonText: 'Proceed',\n dialogType: 'DANGER',\n onConfirm: () => onConfirmDeleteDrafts(draftIds),\n });\n };\n\n useSessionEffect(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchDrafts(searchParams);\n }, [searchDrafts, searchParams]);\n\n useEffect(() => {\n if (updatedDrafts || draftEditUpdated?.id) {\n refreshSearchParams();\n }\n }, [updatedDrafts, draftEditUpdated?.id, refreshSearchParams]);\n\n useEffect(() => {\n const filteredUsers = drafts\n ? drafts.items.map(draft => Number(draft.id))\n : [];\n const usersToClear = clearSelectedItemIfNotLoaded(\n selectedDrafts,\n filteredUsers\n );\n if (usersToClear && usersToClear.length > 0) {\n updateAllSelectedDrafts(usersToClear, false);\n }\n }, [selectedDrafts, drafts, updateAllSelectedDrafts]);\n\n useEffect(() => {\n handleCreatorIdChangeEvent(createdBySavedUsers);\n handleEditorIdChangeEvent(editedBySavedUsers);\n }, [\n createdBySavedUsers,\n editedBySavedUsers,\n handleCreatorIdChangeEvent,\n handleEditorIdChangeEvent,\n ]);\n\n useEffect(() => {\n return () => {\n selectCreatedByUsers([]);\n selectEditedByUsers([]);\n updateAllSelectedDrafts([], true, isCheckboxPartiallySelected);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n updateAllSelectedDrafts([], true, isCheckboxPartiallySelected);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateAllSelectedDrafts]);\n\n useEffect(() => {\n if (\n selectedDrafts?.length &&\n selectedDrafts.length === drafts?.totalCount\n ) {\n setIsSelectAll(true);\n }\n }, [drafts?.totalCount, selectedDrafts]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n }, [initialOffset, pageIndex, setOffset]);\n\n useEffect(() => {\n canAccessPage([NEW_PERMISSIONS.LIST_USER]);\n }, [canAccessPage]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n /**\n * @function onCheckMasterCheckbox\n * @param { any } event\n * @returns { void }\n */\n const onCheckMasterCheckbox = (event: any) => {\n setIsSelectAll(false);\n updateAllUsersCheck(event.target.checked);\n };\n\n /**\n * @function checkIsRowChecked\n * @param { Draft } draft\n * @returns { boolean }\n */\n const checkIsRowChecked = (draft: Draft): boolean =>\n !!selectedDrafts && !!draft.id && selectedDrafts.includes(draft.id);\n\n /**\n * @function onRowCheckHandler\n * @param event\n * @param { Draft } row\n * @returns { void }\n */\n const onRowCheckHandler = (event: any, draft: Draft) => {\n setIsSelectAll(false);\n handleDraftCheck(event, draft);\n };\n\n return (\n <MainWrapper\n subTitle=\"Users\"\n subHeader={profile?.companyId &&\n <CompanyUserStatsText\n companyId={profile.companyId}\n showSettingsButton={isAdminRole(profile?.role?.name)}\n />\n }\n tabs={<UsersPageNavigationContainer />}\n htmlPageTitle=\"Users - Practis\"\n dataTest=\"users\"\n >\n {loading && !isSelectAll && !socketLoaderState && (\n <LoadingComponent />\n )}\n <TableWrapper\n tableStates={tableStates}\n data={drafts?.items}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'users-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: drafts?.totalCount ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n searchParams.filters?.length,\n dataTest: 'users-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n },\n isSelectedItemOptionsVisible:\n !isEmpty(selectedDrafts) && !isEmpty(drafts),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedDrafts?.length,\n totalCount: drafts?.totalCount,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: () => {\n updateAllSelectedDrafts(\n [],\n true,\n isCheckboxPartiallySelected\n );\n setIsSelectAll(false);\n },\n onSelectAll: () => {\n const draftIds =\n (drafts &&\n drafts.items.map((draft: Draft) =>\n Number(draft.id)\n )) ||\n [];\n updateAllSelectedDrafts(\n draftIds,\n true,\n isCheckboxPartiallySelected\n );\n setIsSelectAll(true);\n },\n bulkActionsConfig: {\n disabled: isOptionsDisabled,\n removeItemTitle: 'Delete Drafts',\n removeItemPermissions: [\n NEW_PERMISSIONS.DELETE_STAGING,\n ],\n onRemoveItemsSubmit: () => {\n selectedDrafts &&\n handleDeleteDrafts(selectedDrafts);\n },\n isSelectAll: isSelectAll,\n totalCount: drafts?.totalCount,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <DraftsFilter\n createdBySelectedUsers={\n createdBySelectedUsers\n }\n createdBySavedUsers={\n createdBySavedUsers\n }\n selectCreatedByUsers={\n selectCreatedByUsers\n }\n saveCreatedByUsers={saveCreatedByUsers}\n editedBySelectedUsers={\n editedBySelectedUsers\n }\n editedBySavedUsers={editedBySavedUsers}\n selectEditedByUsers={\n selectEditedByUsers\n }\n saveEditedByUsers={saveEditedByUsers}\n onSuccessApply={() => {\n hide();\n }}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={256}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={\n createdBySavedUsers.length +\n editedBySavedUsers.length\n }\n disabled={\n tableStates.disableFilters ||\n isTeamLeader(profile?.role?.name)\n }\n dataTest=\"users-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && drafts?.items?.length === 0,\n noEntriesOptions: {\n icon: NoDrafts,\n text: 'No Drafts Yet',\n dataTest: 'no-results',\n },\n noSearchResultsOptions: {\n entityName: 'Drafts',\n dataTest: 'no-found-results',\n },\n noFilterResultsOptions: {\n dataTest: 'no-filtered-results',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: !!selectedDrafts && !!selectedDrafts.length,\n disabled:\n !drafts || (drafts && drafts.items.length < 1),\n partial: isCheckboxPartiallySelected || !isSelectAll,\n handleCheck: onCheckMasterCheckbox,\n dataTest: 'master-checkbox',\n },\n columns: [\n {\n title: 'Drafts',\n width: 20,\n ...(isListEmpty ? null : srtName),\n disabled: isListEmpty,\n className: classes.customTableColumnStyle,\n dataTest: 'name-column',\n },\n {\n title: 'Users',\n width: 16,\n ...(isListEmpty ? null : srtUsersCount),\n disabled: isListEmpty,\n dataTest: 'users-count-column',\n },\n {\n title: 'Created by',\n width: 16,\n ...(isListEmpty ? null : srtCreatedBy),\n disabled: isListEmpty,\n dataTest: 'creator-column',\n },\n {\n title: 'Created on',\n width: 16,\n ...(isListEmpty ? null : srtCreatedAt),\n disabled: isListEmpty,\n dataTest: 'creation-date-column',\n },\n {\n title: 'Edited by',\n width: 15,\n ...(isListEmpty ? null : srtLastEditedBy),\n disabled: isListEmpty,\n dataTest: 'editor-column',\n },\n {\n title: 'Edited on',\n width: 15,\n ...(isListEmpty ? null : srtUpdatedAt),\n disabled: isListEmpty,\n dataTest: 'edit-date-column',\n },\n {\n width: 2,\n },\n ],\n rowConfig: {\n onRowClick: (draft: Draft) =>\n handleViewStaging(draft.id),\n onRowCheckHandler: onRowCheckHandler,\n isRowChecked: checkIsRowChecked,\n dataTest: 'draft-item',\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (draft: Draft) =>\n `${draft.name}`,\n isOverFlowText: true,\n getTextFieldProps: (draft: Draft) => ({\n isCurrent:\n profile?.id === draft?.id ?? false,\n }),\n dataTest: 'draft-name',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (draft: Draft) =>\n draft?.usersCount?.toString(),\n dataTest: 'users-count',\n },\n },\n {\n fieldType: 'AVATAR_FIELD',\n shouldShowEmptyCell: (draft: Draft) =>\n !draft?.creator,\n fieldProps: {\n hasMargin: (draft: Draft) =>\n !!draft.creator,\n isMinimized: true,\n renderTitle: (draft: Draft) =>\n `${draft?.creator?.firstName} ${draft?.creator?.lastName}`,\n getAvatarProps: (draft: Draft) => ({\n profile: draft?.creator,\n }),\n dataTest: 'creator',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (draft: Draft) =>\n formatDate(draft?.createdAt),\n dataTest: 'creation-date',\n },\n },\n {\n fieldType: 'AVATAR_FIELD',\n shouldShowEmptyCell: (draft: Draft) =>\n !draft?.lastEditedBy,\n fieldProps: {\n hasMargin: (draft: Draft) =>\n !!draft.lastEditedBy,\n isMinimized: true,\n renderTitle: (draft: Draft) =>\n `${draft?.lastEditedBy?.firstName} ${draft?.lastEditedBy?.lastName}`,\n getAvatarProps: (draft: Draft) => ({\n profile: draft?.lastEditedBy,\n }),\n dataTest: 'editor',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n fieldProps: {\n renderTitle: (draft: Draft) =>\n formatDate(draft?.updatedAt),\n dataTest: 'update-date',\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (draft: Draft) => (\n <ActionButton\n customWidth={168}\n isHidden={!!selectedDrafts?.length}\n dataTest=\"list-item-menu\"\n >\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.UPDATE_STAGING,\n ]}\n >\n <ActionItem\n onClick={() =>\n handleItemEdit(draft.id)\n }\n dataTest=\"edit-action\"\n >\n Edit\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.DELETE_STAGING,\n ]}\n >\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n handleDeleteDrafts([\n draft.id!,\n ]);\n }}\n dataTest=\"delete-draft-action\"\n >\n Delete Draft\n </ActionItem>\n </CheckPermission>\n </ActionButton>\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nexport const DraftsContainer: FC = () => {\n const state = useDraftsState();\n const updatedDraftsState = useUpdatedDraftsState();\n const history = useHistory();\n const searchDrafts = useSearchDraftsService();\n const profile = useSelector(getProfileState);\n const searchDraftsDebounced = useSearchDebounced(searchDrafts);\n const updateAllSelectedDrafts = useUpdateAllSelectedDraftStateService();\n const updateSelectedDraft = useUpdateSelectedDraftStateService();\n const deleteDraft = useDeleteStagingService();\n const draftEditUpdated = useDraftEditState().updateData;\n\n return (\n <Drafts\n history={history}\n draftEditUpdated={draftEditUpdated}\n searchDrafts={searchDraftsDebounced}\n onDeleteDraft={deleteDraft}\n profile={profile}\n drafts={state.data}\n selectedDrafts={state.selectedDrafts}\n loading={state.loading}\n updatedDrafts={updatedDraftsState.data}\n updateAllSelectedDrafts={updateAllSelectedDrafts}\n updateSelectedDraft={updateSelectedDraft}\n />\n );\n};\n\n\nexport default DraftsContainer;","import { useContext } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { AiLogItemInterface } from '../../../constants/interfaces/AiItem';\nimport { createSelectorContext } from '../../../tools/redux';\n\nexport type AiLogsState = {\n data?: ListResult<AiLogItemInterface>;\n loading: boolean;\n loadingFlag: boolean;\n error: string | null;\n};\n\nexport const AiLogsStateSelectorContext = createSelectorContext<AiLogsState>();\n\nexport function useAiLogsState() {\n return useSelector(useContext(AiLogsStateSelectorContext));\n}\n","import { UserInfo } from './UserInfo';\n\nexport interface AiLogItemInterface {\n id: number;\n dateCreated: string;\n user: UserInfo;\n accuracy: number;\n scenarioName: string;\n scenarioStatus: string;\n mediaUrl: string;\n submissionAccuracyMode: string;\n flagCompanyId?: number;\n flagAdminId?: number;\n company: {\n id: number;\n name: string;\n imageUrl: string;\n };\n difference: RecognizedRep[];\n repNumber: number;\n minRepsCount: number;\n}\n\nexport interface RecognizedRep {\n lineId: number;\n original: string;\n recognized: string;\n}\n\nexport enum AiLogItemStatus {\n ACTIVE = 'ACTIVE',\n DELETED = 'DELETED',\n ARCHIVED = 'ARCHIVED',\n}\n","import { useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { SearchParams } from '../../../constants/interfaces/filters';\nimport {\n searchAiLogsFailure,\n searchAiLogsStart,\n searchAiLogsSuccess,\n updateAiLogsFlagStart,\n updateAiLogsFlagFailure,\n addAiLogsFlagSuccess,\n deleteAiLogsFlagSuccess,\n} from './actions';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport {\n useSearchAiLogsApi,\n useAddSubmissionFlag,\n useDeleteSubmissionFlag\n} from '../../../api';\nimport { SubmissionFlag, SUBMISSION_FLAG_TYPE } from '../../../constants/interfaces/Reviews';\nimport { searchLogsDispose } from '../../logs/store/actions';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { AiLogsParams } from '../../../api/assessment-logs/types';\nimport { getSearchSortingValue } from '../../../helpers/functions/search-params-helpers';\nimport { AiLogItemInterface } from '../../../constants/interfaces/AiItem';\nimport { isTeamLeader } from '../../../constants/enums';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\n\nexport const useSearchAiLogsService = () => {\n const dispatch = useDispatch();\n const searchAiLogsApi = useSearchAiLogsApi();\n const showMessage = useShowMessage();\n const profile = useSelector(getProfileState);\n\n return useCallback(\n (searchParams: SearchParams, userTeamIds: number[], companyId?: number) => {\n if (!profile?.companyId)\n return;\n dispatch(searchAiLogsStart());\n const teamIds = (searchParams.teamIds ?? []).length > 0\n ? searchParams.teamIds\n : (isTeamLeader(profile.role?.name)\n ? userTeamIds\n : undefined);\n const requestParams: AiLogsParams = {\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset ?? 0,\n order: getSearchSortingValue(searchParams.orderBy, ''),\n queryUser: searchParams.searchTerm,\n companies: (companyId ?? profile.companyId).toString(),\n teams: teamIds?.join(','),\n dateStart: searchParams.startDate\n ? new Date(searchParams.startDate).toISOString()\n : undefined,\n dateEnd: searchParams.endDate\n ? new Date(searchParams.endDate).toISOString()\n : undefined\n };\n searchAiLogsApi(requestParams)\n .then(data => {\n dispatch(searchAiLogsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(searchAiLogsFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, showMessage, searchAiLogsApi, profile]\n );\n};\n\nexport const useAiLogsUnmountService = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(searchLogsDispose());\n }, [dispatch]);\n};\n\n/**\n * @function useToggleAiLogsFlagService\n * @returns { CallableFunction }\n */\nexport const useToggleAiLogsFlagService = () => {\n const dispatch = useDispatch();\n const addSubmissionFlag = useAddSubmissionFlag();\n const deleteSubmissionFlag = useDeleteSubmissionFlag();\n const showMessage = useShowMessage();\n\n /**\n * @function callback\n * @param { AiLogItemInterface } record\n * @param { Promise }\n */\n return useCallback((record: AiLogItemInterface) => {\n dispatch(updateAiLogsFlagStart(record.id));\n if (record.flagCompanyId) {\n deleteSubmissionFlag(record.id, record.flagCompanyId)\n .then(() => {\n dispatch(deleteAiLogsFlagSuccess(record.id));\n })\n .catch((error: ErrorResult) => {\n dispatch(updateAiLogsFlagFailure(error.message));\n showMessage(error.message, 'success');\n });\n } else {\n addSubmissionFlag(record.id, SUBMISSION_FLAG_TYPE.COMPANY)\n .then((data: SubmissionFlag) => {\n dispatch(addAiLogsFlagSuccess(record.id, data.id));\n })\n .catch((error: ErrorResult) => {\n dispatch(updateAiLogsFlagFailure(error.message));\n showMessage(error.message, 'success');\n });\n }\n },\n [dispatch, addSubmissionFlag, deleteSubmissionFlag, showMessage]\n );\n};","import React, {\n FC,\n useCallback,\n useState,\n} from 'react';\nimport {\n FiltersApplyButton,\n FiltersClearButton,\n FiltersFieldSet,\n FiltersPopupActions,\n FiltersPopupBody,\n FiltersPopupFieldSets,\n} from '../../../ui/components/Filters';\nimport { PortableTeamsWithStore2 } from '../../portableTeams';\n\ninterface Props {\n teamIds: number[];\n onApplyFilter(selectedTeams: number[]): void;\n}\n\nexport const AiAssessmentFilters: FC<Props> = props => {\n const { teamIds, onApplyFilter } = props;\n const [selectedTeams, setSelectedTeams] = useState<number[]>(teamIds || []);\n const totalFiltersSelected = selectedTeams.length;\n\n const handleClickClear = useCallback(\n () => setSelectedTeams([]),\n [setSelectedTeams]\n );\n\n const handleClickApplyFilter = useCallback(\n () => onApplyFilter(selectedTeams),\n [selectedTeams, onApplyFilter]\n );\n\n return (\n <FiltersPopupBody>\n <FiltersPopupFieldSets>\n <FiltersFieldSet title=\"Teams\" width={264} minHeight={244} dataTest=\"teams-section\">\n <PortableTeamsWithStore2\n selectedTeams={selectedTeams}\n onChangeSelectedTeams={setSelectedTeams}\n />\n </FiltersFieldSet>\n </FiltersPopupFieldSets>\n <FiltersPopupActions>\n <FiltersClearButton disabled={!totalFiltersSelected} onClick={handleClickClear} />\n <FiltersApplyButton onClick={handleClickApplyFilter} />\n </FiltersPopupActions>\n </FiltersPopupBody>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ExclamationCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g\n transform=\"translate(-686.000000, -405.000000)\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n >\n <g transform=\"translate(686.000000, 405.000000)\">\n <path\n d=\"M8,0 C12.418278,0 16,3.581722 16,8 C16,12.418278 12.418278,16 8,16 C3.581722,16 0,12.418278 0,8 C0,3.581722 3.581722,0 8,0 Z M8,1 C4.13400675,1 1,4.13400675 1,8 C1,11.8659932 4.13400675,15 8,15 C11.8659932,15 15,11.8659932 15,8 C15,4.13400675 11.8659932,1 8,1 Z\"\n id=\"Oval\"\n />\n <polygon\n id=\"Rectangle\"\n transform=\"translate(8.000000, 6.410256) rotate(-270.000000) translate(-8.000000, -6.410256) \"\n points=\"10.6666667 5.74358974 10.6666667 7.07692308 5.33333333 7.07692308 5.33333333 5.74358974\"\n />\n <polygon\n id=\"Rectangle\"\n transform=\"translate(8.000000, 11.076923) scale(-1, 1) rotate(270.000000) translate(-8.000000, -11.076923) \"\n points=\"8.66666667 10.4102564 8.66666667 11.7435897 7.33333333 11.7435897 7.33333333 10.4102564\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default ExclamationCircle;\n","import { makeStyles } from '@material-ui/core';\nimport styled, { css } from 'styled-components';\n\nimport { AiLogItemStatus } from '../../../constants/interfaces/AiItem';\nimport ExclamationCircleIcon from '../../../ui/icons/ExclamationCircle';\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const ScenarioWrapper = styled.div<{ status: AiLogItemStatus }>`\n display: flex;\n align-items: center;\n ${({ status, theme }) =>\n status === AiLogItemStatus.DELETED &&\n css`\n color: ${theme.Colors.cloudyBlue};\n `}\n padding-right: 8px;\n`;\n\nexport const StyledExclamationCircleIcon = styled(ExclamationCircleIcon)`\n margin-left: 4px;\n width: 16px;\n flex-shrink: 0;\n\n color: ${({ theme }) => theme.Colors.cloudyBlue};\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n paddingLeft: '18px !important',\n },\n}));\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const AssessmentLogsBig = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"49\"\n height=\"48\"\n viewBox=\"0 0 49 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#zftislkp8a)\">\n <path d=\"M45.9 19.12c.39 1.66.6 3.38.6 5.15 0 12.43-10.07 22.5-22.5 22.5S1.5 36.7 1.5 24.28c0-12.42 10.07-22.5 22.5-22.5 1.38 0 2.72.13 4.03.37l-2.7 2.7c-.44-.03-.88-.07-1.33-.07-10.75 0-19.5 8.74-19.5 19.5s8.75 19.5 19.5 19.5 19.5-8.75 19.5-19.5c0-.87-.08-1.72-.19-2.56l2.59-2.59v-.01zm-10.7 4.94-3.15-1.58c.13.58.2 1.17.2 1.79 0 4.55-3.7 8.25-8.25 8.25s-8.25-3.7-8.25-8.25 3.7-8.25 8.25-8.25c.39 0 .76.04 1.13.09l.17-.17-1.45-2.91c-6.14.08-11.1 5.08-11.1 11.24S17.79 35.52 24 35.52s11.25-5.04 11.25-11.25v-.19c-.01 0-.03-.01-.04-.02h-.01zm11.42-9.9-6.66 6.66a2.945 2.945 0 0 1-3.41.56l-5.42-2.71-7 6.94c-.29.29-.68.44-1.06.44s-.77-.15-1.06-.44a1.49 1.49 0 0 1 0-2.12l2.11-2.11 4.17-4.13h-.03l.71-.72-2.73-5.47c-.57-1.14-.35-2.51.55-3.42L33.44.98c.76-.76 1.84-1.11 2.9-.94 1.06.17 1.98.85 2.46 1.81l1.67 3.33.98-.97a1.5 1.5 0 0 1 2.11 2.13l-.92.91 3.11 1.55c.96.48 1.63 1.4 1.81 2.46.17 1.06-.18 2.14-.94 2.9zm-15.44.13 6.99-6.99-2.06-4.12a.362.362 0 0 0-.25-.19h-.06c-.07 0-.16.02-.24.1L28.9 9.75l2.29 4.53-.01.01zm13.41-2.55a.32.32 0 0 0-.19-.25l-4.02-2.01-7.02 6.96 4.49 2.24 6.64-6.64c.1-.1.11-.22.1-.3z\" fill=\"#B1C0CB\"/>\n </g>\n <defs>\n <clipPath id=\"zftislkp8a\">\n <path fill=\"#fff\" transform=\"translate(1.5)\" d=\"M0 0h46.1v46.78H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default AssessmentLogsBig;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Flag = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#w14giu5aca)\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5.814 0a3.31 3.31 0 0 0-1.172.25L1.607 1.375 1.52 1.13A.785.785 0 0 0 1.221.75.753.753 0 0 0 .76.623a.807.807 0 0 0-.263 0 .776.776 0 0 0-.432.423.817.817 0 0 0-.012.614l5.012 13.831c.054.149.15.277.276.368.127.091.277.14.431.14a.792.792 0 0 0 .263-.051.745.745 0 0 0 .445-.418.785.785 0 0 0 0-.62L4.538 9.516l1.276-.478a3.533 3.533 0 0 1 1.172-.208c.667.01 1.315.228 1.86.623.57.403 1.247.62 1.94.622.4 0 .797-.074 1.172-.218L16 8.332 13.17.477l-2.02.768a3.307 3.307 0 0 1-1.173.218 3.32 3.32 0 0 1-2.02-.716A3.368 3.368 0 0 0 5.813 0z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"w14giu5aca\">\n <path\n fill=\"#fff\"\n d=\"M0 0h16v16H0z\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Flag;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const FlagActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#vumtoqjqra)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5.814 0a3.31 3.31 0 0 0-1.172.25L1.607 1.375 1.52 1.13A.785.785 0 0 0 1.221.75.753.753 0 0 0 .76.623a.807.807 0 0 0-.263 0 .776.776 0 0 0-.432.423.817.817 0 0 0-.012.614l5.012 13.831c.054.149.15.277.276.368.127.091.277.14.431.14a.792.792 0 0 0 .263-.051.745.745 0 0 0 .445-.418.785.785 0 0 0 0-.62L4.538 9.516l1.276-.478a3.533 3.533 0 0 1 1.172-.208c.667.01 1.315.228 1.86.623.57.403 1.247.62 1.94.622.4 0 .797-.074 1.172-.218L16 8.332 13.17.477l-2.02.768a3.307 3.307 0 0 1-1.173.218 3.32 3.32 0 0 1-2.02-.716A3.368 3.368 0 0 0 5.813 0z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"vumtoqjqra\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n \nexport default FlagActive;\n ","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const FlagInactive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M6.996 1.982a1.928 1.928 0 0 0-1.182-.425c-.21.014-.415.067-.607.155L2.176 2.843l1.88 5.188 1.182-.446a4.782 4.782 0 0 1 2.319-.27c.783.103 1.53.398 2.178.861.316.222.689.34 1.07.343.222 0 .441-.042.648-.125l2.607-.985-1.779-4.94-.616.24a4.777 4.777 0 0 1-4.669-.727zM4.642.249A3.31 3.31 0 0 1 5.814 0a3.368 3.368 0 0 1 2.142.747 3.32 3.32 0 0 0 2.021.716c.4 0 .797-.075 1.172-.218l2.022-.768L16 8.332l-4.042 1.525a3.306 3.306 0 0 1-1.172.218 3.384 3.384 0 0 1-1.94-.622 3.257 3.257 0 0 0-1.86-.623c-.4.002-.795.073-1.172.208l-1.276.478 1.943 5.394a.785.785 0 0 1-.18.877.745.745 0 0 1-.265.161.792.792 0 0 1-.263.052.745.745 0 0 1-.43-.14.776.776 0 0 1-.277-.369L.054 1.661A.818.818 0 0 1 .24.79.776.776 0 0 1 .498.622a.807.807 0 0 1 .263 0 .753.753 0 0 1 .46.127c.136.091.24.225.298.381l.088.245L4.642.249z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n \nexport default FlagInactive;\n","import styled from 'styled-components';\nimport FlagActive from '../../../../ui/icons/FlagActive';\nimport FlagInactive from '../../../../ui/icons/FlagInactive';\n\nexport const FlagHandle = styled.a`\n cursor: pointer;\n display: flex;\n`;\n\nexport const FlagActiveIcon = styled(FlagActive)`\n color: var(--ps-red-main);\n\n &:hover {\n color: #DF1F1F;\n }\n`;\n\nexport const FlagInactiveIcon = styled(FlagInactive)`\n color: var(--ps-grey-2);\n\n &:hover {\n color: #DF1F1F;\n }\n`;","import { FlagToggleViewProps } from './types';\nimport { FlagHandle, FlagActiveIcon, FlagInactiveIcon } from './styles';\n\nfunction FlagToggleView ({\n checked,\n onChange,\n dataTest\n}: FlagToggleViewProps) {\n return <FlagHandle\n onClick={onChange}\n data-test={dataTest}\n >\n {\n checked\n ? <FlagActiveIcon />\n : <FlagInactiveIcon />\n }\n </FlagHandle>\n}\n\nexport default FlagToggleView;","import FlagToggleView from './view';\n\nexport default FlagToggleView;","import { useState, FC, useEffect, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { getCompanyState } from '../../../pages/CompanySettings/store/reducers';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../constants/interfaces/filters';\nimport { useAiLogsState } from '../store/states';\nimport {\n useAiLogsUnmountService,\n useSearchAiLogsService,\n useToggleAiLogsFlagService,\n} from '../store/services';\n\nimport { countAppliedFiltersCount } from '../../teams/pages/ListOfTeams/tools';\nimport { AiAssessmentFilters } from '../components/AiAssessmentFilters';\nimport { usePreviousData } from '../../../helpers/hooks/usePreviousData';\nimport { useHistory } from 'react-router-dom';\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\nimport {\n Actions,\n ScenarioWrapper,\n StyledExclamationCircleIcon,\n useStyles,\n} from './styles';\nimport {\n AiLogItemInterface,\n AiLogItemStatus,\n} from '../../../constants/interfaces/AiItem';\n\nimport { TrainingMode, trainingModeName } from '../../../constants/enums';\nimport dayjs from 'dayjs';\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { LoadingComponent } from '../../../ui/components/LoadingCopmonent';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\nimport { FiltersPopupButton } from '../../../ui/components/Filters';\nimport { Tooltip } from '../../../ui/components/Tooltip';\nimport {\n useCalendarFilterOptions,\n useHeaderOptions,\n useEmptyStateOptions\n} from './hooks';\nimport FlagIcon from '../../../ui/icons/Flag';\nimport FlagToggle from '../components/FlagToggle';\nimport { isEqual } from 'lodash';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { usePortableTeamsState } from '../../portableTeams/store/states';\nimport { TeamBasic } from '../../../constants/interfaces/TeamBasic';\n\nconst qs = require('query-string');\n\nconst ITEMS_PER_PAGE = 20;\n\nconst CompanyAiAssessment: FC<{\n companyId?: number;\n companyName?: string;\n aiLogs?: ListResult<AiLogItemInterface>;\n loading?: boolean;\n portableTeams?: TeamBasic[];\n searchHandler: (\n p: SearchParams,\n userTeamIds: number[],\n companyId?: number\n ) => void;\n unMount: () => void;\n toggleFlag: (record: AiLogItemInterface) => void;\n}> = ({\n companyId,\n companyName,\n loading,\n aiLogs,\n portableTeams,\n searchHandler,\n unMount,\n toggleFlag,\n}) => {\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [isFirstLoad, setIsFirstLoad] = useState(true);\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setOffset,\n setCustom,\n setTeamIDs,\n } = useSearchParamsState({\n searchTerm: '',\n filters: [],\n orderBy: { field: 'date', asc: false },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n });\n\n const history = useHistory();\n const classes = useStyles();\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page);\n const initialOffset = pageIndex\n ? pageIndex === 1\n ? 0\n : (pageIndex - 1) * ITEMS_PER_PAGE\n : 0;\n\n const prevSearchParams = usePreviousData(searchParams);\n const prevCompanyId = usePreviousData(companyId);\n\n /**\n * @function doSearch\n * @returns { void }\n */\n const doSearch = useCallback(() => {\n const userTeamIds = portableTeams!.map(team => team.id!);\n searchParams.offset = initialOffset;\n searchHandler(searchParams, userTeamIds, companyId);\n }, [searchHandler, searchParams, portableTeams, companyId, initialOffset]);\n\n useEffect(() => {\n if (\n !isFirstLoad &&\n (!isEqual(prevSearchParams, searchParams) ||\n companyId !== prevCompanyId)\n ) {\n doSearch();\n }\n }, [\n doSearch,\n searchParams,\n prevSearchParams,\n companyId,\n prevCompanyId,\n isFirstLoad,\n ]);\n\n // make a first data load once user teams are ready\n useEffect(() => {\n if (isFirstLoad && portableTeams?.length) {\n setIsFirstLoad(false);\n doSearch();\n }\n }, [isFirstLoad, portableTeams, doSearch]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => () => unMount(), []);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex]);\n\n const { startDate, endDate, orderBy, teamIds = [] } = searchParams;\n const handleRefresh = useCallback(() => {\n doSearch();\n setLastRefreshed(new Date());\n }, [doSearch]);\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: teamIds.length,\n itemsCount: aiLogs?.items.length || 0,\n startDate,\n endDate,\n });\n\n const headerOptions = {\n ...useHeaderOptions(searchParams, setOrderBy),\n flag: useOrderBy('flag_company', orderBy, setOrderBy),\n };\n const calendarFilterOptions = useCalendarFilterOptions(\n searchParams,\n tableStates.showEmptyState,\n setCustom,\n 'assessment-calendar'\n );\n const emptyStateOptions = useEmptyStateOptions(\n !loading && aiLogs?.items?.length === 0\n );\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = (limit: number, offset: number): void => {\n setOffset(offset);\n };\n\n return (\n <MainWrapper\n subTitle=\"Training Log\"\n htmlPageTitle={`Training Log ${\n companyName ? `- ${companyName}` : ''\n } - Practis`}\n dataTest=\"assessment\"\n >\n {loading && <LoadingComponent />}\n <TableWrapper\n tableStates={tableStates}\n data={aiLogs?.items}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: handleRefresh,\n dataTest: 'assessment-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: aiLogs?.count ?? 0,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied:\n searchParams.searchTerm.length ||\n countAppliedFiltersCount(searchParams),\n dataTest: 'assessment-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n dataTest: 'assessment-search',\n },\n filterOptions: {\n filterComponent: (\n <FiltersPopupButton\n disabled={tableStates.disableFilters}\n filtersCount={teamIds.length}\n dataTest=\"assessment-filters\"\n >\n {({ hide }) => (\n <AiAssessmentFilters\n teamIds={teamIds}\n onApplyFilter={selectedTeams => {\n setTeamIDs(selectedTeams);\n hide();\n }}\n />\n )}\n </FiltersPopupButton>\n ),\n },\n calendarFilterOptions,\n }}\n tableEmptyStateConfigurations={emptyStateOptions}\n configurations={{\n columns: [\n {\n title: '#',\n width: 10,\n ...headerOptions.id,\n disabled: tableStates.disableSorting,\n className: classes.customTableCellStyle,\n dataTest: 'id-column',\n },\n {\n title: 'Users',\n width: 15,\n ...headerOptions.user,\n disabled: tableStates.disableSorting,\n dataTest: 'users-column',\n },\n {\n title: 'Scenario',\n width: 20,\n ...headerOptions.scenario,\n disabled: tableStates.disableSorting,\n dataTest: 'scenario-column',\n },\n {\n title: 'Rep',\n width: 10,\n disabled: tableStates.disableSorting,\n dataTest: 'rep-column',\n },\n {\n title: 'Date',\n width: 13.8,\n ...headerOptions.date,\n disabled: tableStates.disableSorting,\n dataTest: 'date-column',\n },\n {\n title: 'Mode',\n width: 10,\n ...headerOptions.mode,\n disabled: tableStates.disableSorting,\n dataTest: 'mode-column',\n },\n {\n title: 'Accuracy',\n width: 10,\n ...headerOptions.accuracy,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-column',\n },\n {\n children: <FlagIcon />,\n width: 5,\n ...headerOptions.flag,\n disabled: tableStates.disableSorting,\n dataTest: 'flag-column',\n },\n ],\n rowConfig: {\n dataTest: 'assessment-item',\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record?.id,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n record?.id?.toString(),\n dataTest: 'assessment-item-id',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.user,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n `${record.user.firstName} ${record.user.lastName}`,\n dataTest: 'assessment-item-user',\n },\n },\n {\n fieldType: 'CUSTOM_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.scenarioName,\n getCustomFieldComponent: (\n record: AiLogItemInterface\n ) => (\n <ScenarioWrapper\n status={\n record.scenarioStatus as AiLogItemStatus\n }\n >\n <div data-test=\"assessment-item-scenario\">\n {record.scenarioName}\n </div>\n {record.scenarioStatus ===\n AiLogItemStatus.DELETED && (\n <Tooltip\n label=\"Scenario has been deleted\"\n position=\"center-right--bottom\"\n >\n <span data-test=\"assessment-item-scenario-icon\">\n <StyledExclamationCircleIcon />\n </span>\n </Tooltip>\n )}\n </ScenarioWrapper>\n ),\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.repNumber\n && (record.submissionAccuracyMode as TrainingMode) !== TrainingMode.TEST_YOURSELF,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n record.repNumber\n ? `${record.repNumber} of ${record.minRepsCount}`\n : 'N/A',\n dataTest: 'assessment-item-rep',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.dateCreated,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n dayjs(record.dateCreated).format(\n 'MM/DD/YY h:mm A'\n ),\n dataTest: 'assessment-item-date',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.submissionAccuracyMode,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n trainingModeName(\n record.submissionAccuracyMode as TrainingMode\n ),\n dataTest: 'assessment-item-mode',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (\n record: AiLogItemInterface\n ) => !record.accuracy,\n fieldProps: {\n renderTitle: (record: AiLogItemInterface) =>\n `${Math.floor(record.accuracy * 100)}%`,\n dataTest: 'assessment-item-accuracy',\n },\n },\n {\n fieldType: 'CUSTOM_FIELD',\n getCustomFieldComponent: (\n record: AiLogItemInterface\n ) => (\n <Actions>\n <FlagToggle\n checked={!!record.flagCompanyId}\n onChange={() => toggleFlag(record)}\n dataTest=\"assessment-item-flag\"\n />\n </Actions>\n ),\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n};\n\nconst CompanyAiAssessmentContainer: FC = () => {\n const searchAiLogs = useSearchAiLogsService();\n const unMount = useAiLogsUnmountService();\n const toggleAiLogsFlag = useToggleAiLogsFlagService();\n\n const company = useSelector(getCompanyState);\n const aiLogsState = useAiLogsState();\n const portableTeams = usePortableTeamsState();\n\n return (\n <CompanyAiAssessment\n aiLogs={aiLogsState.data}\n companyId={company?.id}\n companyName={company.name}\n loading={aiLogsState.loading || aiLogsState.loadingFlag}\n portableTeams={portableTeams.data?.items}\n searchHandler={searchAiLogs}\n unMount={unMount}\n toggleFlag={toggleAiLogsFlag}\n />\n );\n};\n\nexport default CompanyAiAssessmentContainer;\n","import { useCallback, useMemo } from 'react';\nimport { SearchParams } from '../../../constants/interfaces/filters';\nimport { CalendarValue } from '../../../ui/components/Calendar';\nimport { CalendarFilterOptions } from '../../../ui/components/table-wrapper/table-tools/types';\nimport { useOrderBy } from '../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport AssessmentLogsBig from '../../../ui/icons/AssessmentLogsBig';\n\n/**\n * @function useCalendarFilterOptions\n * @param { SearchParams } searchParams\n * @param { boolean } isEmptyState\n * @param { (name: keyof SearchParams, value: any) => void } setCustom\n * @returns { CalendarFilterOptions }\n */\nexport const useCalendarFilterOptions = (\n searchParams: SearchParams,\n isEmptyState: boolean,\n setCustom: (name: keyof SearchParams, value: any) => void,\n dataTest?: string,\n): CalendarFilterOptions => {\n const { startDate, endDate } = searchParams;\n const handleChangeStartDate = useCallback(\n (d?: Date | null) => setCustom('startDate', d),\n [setCustom]\n );\n const handleChangeEndDate = useCallback(\n (d?: Date | null) => setCustom('endDate', d),\n [setCustom]\n );\n const handleChangeDate = useCallback(\n (date: CalendarValue<true>) => {\n handleChangeStartDate(date.start);\n handleChangeEndDate(date.end);\n },\n [handleChangeStartDate, handleChangeEndDate]\n );\n\n return {\n calendarPopUpProps: {\n value: {\n start: startDate ? new Date(startDate) : null,\n end: endDate ? new Date(endDate) : null,\n },\n selectRange: true,\n onChange: handleChangeDate,\n restrictFuture: true,\n disabled:\n isEmptyState &&\n !startDate &&\n !endDate,\n dataTest,\n }\n };\n};\n\n/**\n * @function useHeaderOptions\n * @param { SearchParams } searchParams\n * @param { (field: string) => void } setOrderBy\n * @returns { object }\n */\nexport const useHeaderOptions = (\n searchParams: SearchParams,\n setOrderBy: (field: string) => void\n) => {\n const { orderBy } = searchParams;\n return {\n id: useOrderBy('id', orderBy, setOrderBy),\n user: useOrderBy('user', orderBy, setOrderBy),\n scenario: useOrderBy('scenario', orderBy, setOrderBy),\n date: useOrderBy('date', orderBy, setOrderBy),\n mode: useOrderBy('mode', orderBy, setOrderBy),\n accuracy: useOrderBy('accuracy', orderBy, setOrderBy)\n };\n}\n\n/**\n * @function useEmptyStateOptions\n * @param { boolean } isEmptyState\n * @returns { object }\n */\nexport const useEmptyStateOptions = (isEmptyState: boolean) => {\n return useMemo(() => {\n return {\n shouldShowEmptyState: isEmptyState,\n noEntriesOptions: {\n icon: AssessmentLogsBig,\n text: 'No Training Log Yet',\n dataTest: 'no-ai-assessment'\n },\n noSearchResultsOptions: {\n entityName: 'Training Log',\n dataTest: 'no-found-ai-assessment'\n }\n }\n }, [isEmptyState]);\n};\n","import React, { FC, useCallback } from 'react';\r\nimport styled from 'styled-components';\r\nimport Checkbox from '../../../ui/components/Checkbox';\r\nimport { TeamLeader } from '../../../constants/interfaces/TeamLeader';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\r\nimport { TableDivider } from '../../../ui/components/table-wrapper/table-divider';\r\n\r\nconst StyledTeamsList = styled.div`\r\n overflow: auto;\r\n height: 100%;\r\n`;\r\n\r\nconst TopSideList = styled.span``;\r\n\r\nconst GeneralList = styled.span``;\r\n\r\nconst TeamsItemWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin: 10px 0;\r\n`;\r\n\r\nconst TeamsItem = styled.div<{ disabled?: boolean }>`\r\n color: ${props => props.theme.Colors.black};\r\n cursor: pointer;\r\n border-radius: 8px;\r\n font-weight: 500;\r\n font-size: 13px;\r\n padding: 0 12px;\r\n align-items: center;\r\n background: ${props => props.theme.Colors.white};\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n display: inline-block;\r\n ${props => props.disabled && 'pointer-events: none'}\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n`;\r\n\r\nconst StyledAdditionalInfo = styled.span`\r\n font-size: 13px;\r\n font-weight: 600;\r\n font-stretch: normal;\r\n font-style: normal;\r\n line-height: normal;\r\n letter-spacing: normal;\r\n color: ${props => props.theme.Colors.steelGrey};\r\n margin-left: 3px;\r\n`;\r\n\r\nexport const PortableTeamLeadersList: FC<{\r\n teamLeaders?: TeamLeader[];\r\n selectedTeams: number[];\r\n setTeamFilters?: (leaderId: number) => void;\r\n}> = ({ teamLeaders, selectedTeams, setTeamFilters }) => {\r\n const profile = useSelector(getProfileState);\r\n const isChecked = useCallback(\r\n (setId?: number) => {\r\n return !!selectedTeams && !!setId && selectedTeams.includes(setId);\r\n },\r\n [selectedTeams]\r\n );\r\n\r\n const isPartiallyChecked = useCallback(\r\n (teamId?: number) => {\r\n return (\r\n !!selectedTeams &&\r\n !!teamId &&\r\n selectedTeams.includes(-Number(teamId))\r\n );\r\n },\r\n [selectedTeams]\r\n );\r\n\r\n const changeHandler = (teamId?: number) => {\r\n if (teamId && setTeamFilters) {\r\n setTeamFilters(teamId);\r\n }\r\n };\r\n\r\n const topListTeamLeaders = teamLeaders\r\n ? teamLeaders.filter(\r\n team =>\r\n team.isDefault || (team.id && selectedTeams.includes(team.id))\r\n )\r\n : [];\r\n\r\n const bottomListTeamLeaders = teamLeaders\r\n ? teamLeaders.filter(\r\n team =>\r\n !team.isDefault && team.id && !selectedTeams.includes(team.id)\r\n )\r\n : [];\r\n\r\n return (\r\n <StyledTeamsList>\r\n {topListTeamLeaders.length > 0 && (\r\n <TopSideList>\r\n {topListTeamLeaders.map(leader => {\r\n return (\r\n <TeamsItemWrapper key={leader.id}>\r\n <Checkbox\r\n size={12}\r\n checked={\r\n isChecked(leader.id) ||\r\n isPartiallyChecked(leader.id)\r\n }\r\n partial={isPartiallyChecked(leader.id)}\r\n handleChange={() =>\r\n changeHandler(leader.id)\r\n }\r\n />\r\n <TeamsItem\r\n onClick={() => changeHandler(leader.id)}\r\n >\r\n {`${leader.firstName} ${leader.lastName}`}\r\n </TeamsItem>\r\n </TeamsItemWrapper>\r\n );\r\n })}\r\n {topListTeamLeaders.length <\r\n (teamLeaders ? teamLeaders.length : 0) && (\r\n <TableDivider width=\"98%\" />\r\n )}\r\n </TopSideList>\r\n )}\r\n <GeneralList>\r\n {bottomListTeamLeaders.map(leader => {\r\n return (\r\n <TeamsItemWrapper key={leader.id}>\r\n <Checkbox\r\n size={12}\r\n checked={\r\n isChecked(leader.id) ||\r\n isPartiallyChecked(leader.id)\r\n }\r\n partial={isPartiallyChecked(leader.id)}\r\n handleChange={() => changeHandler(leader.id)}\r\n />\r\n <TeamsItem onClick={() => changeHandler(leader.id)}>\r\n {`${leader.firstName} ${leader.lastName}`}\r\n {profile && profile.id === leader.id && (\r\n <StyledAdditionalInfo>\r\n (You)\r\n </StyledAdditionalInfo>\r\n )}\r\n </TeamsItem>\r\n </TeamsItemWrapper>\r\n );\r\n })}\r\n </GeneralList>\r\n </StyledTeamsList>\r\n );\r\n};\r\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const LeaderCrown = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n height=\"100%\"\n viewBox=\"0 0 38 32\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <g>\n <g>\n <path\n d=\"M33.085 25.415V32h-28.2v-6.585h28.2zm-2.431 2.372H7.315v1.84h23.339v-1.84zM19 0c2.194 0 3.973 1.735 3.973 3.876 0 .966-.363 1.85-.962 2.529l3.988 6.02 4.057-1.989c.053-2.096 1.81-3.779 3.971-3.779 2.194 0 3.973 1.736 3.973 3.876 0 1.975-1.514 3.606-3.472 3.846l-1.59 9.153H5.062l-1.591-9.153C1.514 14.139 0 12.509 0 10.533c0-2.14 1.779-3.876 3.973-3.876s3.972 1.736 3.972 3.876l-.006-.098 3.97 1.945 3.974-6.101c-.536-.66-.856-1.495-.856-2.403C15.027 1.736 16.806 0 19 0zm-1.1 7.602l-5.118 7.861-5.546-2.718c-.353.494-.82.904-1.365 1.194l1.281 7.22h23.696l1.287-7.217c-.547-.29-1.017-.701-1.37-1.197L25.14 15.5l-5.207-7.857c-.3.07-.612.108-.934.108-.381 0-.75-.052-1.1-.15zm16.127 1.427c-.85 0-1.541.674-1.541 1.504s.69 1.504 1.541 1.504c.852 0 1.542-.673 1.542-1.504 0-.83-.69-1.504-1.542-1.504zm-30.054 0c-.852 0-1.542.674-1.542 1.504s.69 1.504 1.542 1.504c.85 0 1.541-.673 1.541-1.504 0-.83-.69-1.504-1.541-1.504zM19 2.372c-.851 0-1.541.673-1.541 1.504 0 .83.69 1.504 1.541 1.504s1.541-.673 1.541-1.504c0-.83-.69-1.504-1.541-1.504z\"\n transform=\"translate(-816 -380) translate(0 184) translate(700 32) translate(49 164) translate(67)\"\n />\n </g>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default LeaderCrown;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport NoSearchResult from '../../../ui/icons/NoSearchResult';\nimport LeaderCrown from '../../../ui/icons/LeaderCrown';\nimport { Loading } from '../../../ui/components/LoadingCopmonent';\n\nconst StyledEmptyLabels = styled.div`\n flex-direction: column;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n`;\n\nconst StyledEmptyLabelsContent = styled.div`\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst IconWrapper = styled.div`\n width: 32px;\n height: 32px;\n color: ${props => props.theme.Colors.cloudyBlue};\n margin-bottom: 8px;\n`;\n\nconst NoTeamsTitle = styled.div`\n font-family: ${props => props.theme.Fonts.manrope};\n font-size: 11px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: ${props => props.theme.Colors.cloudyBlue};\n`;\n\nconst EmptyTeamLeaders: FC<{ loading?: boolean; isEmpty?: boolean }> = ({\n loading,\n isEmpty,\n}) => {\n if (loading) {\n return (\n <StyledEmptyLabels>\n <Loading />\n </StyledEmptyLabels>\n );\n }\n\n return (\n <StyledEmptyLabels>\n <StyledEmptyLabelsContent>\n <IconWrapper>\n {isEmpty ? <LeaderCrown /> : <NoSearchResult />}\n </IconWrapper>\n <NoTeamsTitle>\n {isEmpty ? 'No Team Leaders yet' : 'No Team Leaders found'}\n </NoTeamsTitle>\n </StyledEmptyLabelsContent>\n </StyledEmptyLabels>\n );\n};\n\nexport default EmptyTeamLeaders;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { PortableTeamLeadersList } from './PortableTeamLeadersList';\r\nimport { Button } from '../../../ui/components/Button';\r\nimport { Variables } from '../../../theme/variables';\r\nimport { filterTeamLeaders } from '../tools';\r\nimport EmptyTeamLeaders from './EmptyTeamLeaders';\r\nimport { TeamLeader } from '../../../constants/interfaces/TeamLeader';\r\nimport { TableSearchInput } from '../../../ui/components/table-wrapper/table-tools/table-search-input';\r\n\r\n//region Types\r\ntype Action = 'clear' | 'select';\r\n\r\nexport type PortableTeamsProps = {\r\n teamLeaders?: TeamLeader[];\r\n selectedList: number[];\r\n onSave?: () => void;\r\n onSelectAll: (labelIds: number[]) => void;\r\n onSetSelected?: (leaderId: number) => void;\r\n resetSelected: () => void;\r\n filtersTitle?: string;\r\n loading?: boolean;\r\n showSelectActions?: boolean;\r\n showSearch?: boolean;\r\n showSave?: boolean;\r\n fetchOnMount?: boolean;\r\n};\r\n//endregion\r\n\r\n//region Styles\r\nconst StyledCreateTeams = styled.div`\r\n flex: 1;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst CreateTeamsBody = styled.div`\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n`;\r\n\r\nconst FiltersHeader = styled.div`\r\n padding: 0 16px;\r\n display: flex;\r\n justify-content: space-between;\r\n height: 24px;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst FiltersSavePanel = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst SelectActions = styled.div`\r\n font-size: 11px;\r\n font-weight: 500;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n margin-bottom: 8px;\r\n`;\r\n\r\nconst PlainAction = styled.span<{\r\n disabled?: boolean;\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n}>`\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n ${props =>\r\n props.disabled\r\n ? css`\r\n color: ${props.theme.Colors.cloudyBlue};\r\n pointer-events: none;\r\n `\r\n : css`\r\n color: ${props.color};\r\n `}\r\n\r\n &:hover {\r\n color: ${({ colorHover }) => colorHover};\r\n }\r\n &:active {\r\n color: ${({ colorActive }) => colorActive};\r\n }\r\n &:not(:last-of-type) {\r\n margin-right: 8px;\r\n }\r\n`;\r\n\r\nconst SelectedCaption = styled.span`\r\n color: ${props => props.theme.Colors.steelGrey};\r\n`;\r\n\r\nconst FilterTitle = styled.p`\r\n margin: 0;\r\n font-size: 13px;\r\n color: ${props => props.theme.Colors.black};\r\n font-weight: 600;\r\n`;\r\n\r\nconst SearchWrapper = styled.div`\r\n margin-bottom: 16px;\r\n`;\r\n//endregion\r\n\r\nconst PortableTeamLeaders: FC<PortableTeamsProps> = ({\r\n teamLeaders,\r\n selectedList,\r\n loading,\r\n onSave,\r\n onSelectAll,\r\n onSetSelected,\r\n resetSelected,\r\n filtersTitle,\r\n showSelectActions,\r\n showSearch,\r\n showSave = true,\r\n}) => {\r\n const actionConfig: Record<\r\n Action,\r\n {\r\n color: string;\r\n colorHover: string;\r\n colorActive: string;\r\n }\r\n > = {\r\n clear: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n select: {\r\n color: Variables.Colors.darkSkyBlue,\r\n colorHover: Variables.Colors.lightBlue,\r\n colorActive: Variables.Colors.windowsBlue,\r\n },\r\n };\r\n\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const searchHandler = (value: string) => setSearchTerm(value);\r\n const [processedSelectedList, setProcessedSelectedList] = useState<\r\n number[]\r\n >([]);\r\n\r\n const clearHandler = useCallback(() => {\r\n onSelectAll([]);\r\n }, [onSelectAll]);\r\n\r\n const processedTeamLeaders = useMemo((): TeamLeader[] => {\r\n if (teamLeaders) {\r\n const result = filterTeamLeaders(searchTerm, teamLeaders);\r\n if (result.length > 0) {\r\n const processedDataIds = result.map(item => item.id!);\r\n setProcessedSelectedList(\r\n selectedList.filter(item => processedDataIds.includes(item))\r\n );\r\n }\r\n\r\n return result;\r\n } else {\r\n return [];\r\n }\r\n }, [searchTerm, teamLeaders, selectedList]);\r\n\r\n const isAllSelected = useMemo(\r\n () => selectedList.length === teamLeaders?.length,\r\n [selectedList.length, teamLeaders]\r\n );\r\n\r\n const toggleAllHandler = useCallback(() => {\r\n if (isAllSelected) {\r\n onSelectAll([]);\r\n } else if (onSelectAll) {\r\n onSelectAll(\r\n processedTeamLeaders\r\n ? processedTeamLeaders.map(leader => leader.id)\r\n : []\r\n );\r\n }\r\n }, [isAllSelected, onSelectAll, processedTeamLeaders]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n resetSelected();\r\n };\r\n }, [resetSelected]);\r\n\r\n useEffect(() => {\r\n if (\r\n !!searchTerm &&\r\n processedSelectedList.length !== selectedList.length\r\n ) {\r\n toggleAllHandler();\r\n }\r\n }, [searchTerm, toggleAllHandler, processedSelectedList, selectedList, processedTeamLeaders]);\r\n\r\n const showNoItems = !teamLeaders?.length;\r\n const showEmptyState = !processedTeamLeaders.length || loading;\r\n const selectedTeamLeadersLength = processedSelectedList.filter(id => id > 0)\r\n .length;\r\n\r\n return (\r\n <StyledCreateTeams>\r\n <CreateTeamsBody>\r\n {filtersTitle && (\r\n <FiltersHeader>\r\n <FilterTitle>{filtersTitle}</FilterTitle>\r\n </FiltersHeader>\r\n )}\r\n {showSearch && (\r\n <SearchWrapper>\r\n <TableSearchInput\r\n onChange={searchHandler}\r\n disabled={showNoItems}\r\n />\r\n </SearchWrapper>\r\n )}\r\n {showSelectActions && !showNoItems && (\r\n <SelectActions>\r\n <div>\r\n <SelectedCaption>\r\n {selectedTeamLeadersLength > 0\r\n ? `${selectedTeamLeadersLength} ${\r\n selectedTeamLeadersLength > 1\r\n ? ' Team Leaders selected'\r\n : ' Team Leader selected'\r\n }`\r\n : 'No Team Leaders selected'}\r\n </SelectedCaption>\r\n </div>\r\n <div>\r\n {isAllSelected ? (\r\n <PlainAction\r\n disabled={\r\n processedSelectedList.length === 0 ||\r\n showEmptyState\r\n }\r\n color={actionConfig.clear.color}\r\n colorActive={actionConfig.clear.colorActive}\r\n colorHover={actionConfig.clear.colorHover}\r\n onClick={clearHandler}\r\n >\r\n Unselect All\r\n </PlainAction>\r\n ) : (\r\n <PlainAction\r\n disabled={showEmptyState}\r\n color={actionConfig.select.color}\r\n colorActive={\r\n actionConfig.select.colorActive\r\n }\r\n colorHover={actionConfig.select.colorHover}\r\n onClick={toggleAllHandler}\r\n >\r\n Select All\r\n </PlainAction>\r\n )}\r\n </div>\r\n </SelectActions>\r\n )}\r\n {showEmptyState ? (\r\n <EmptyTeamLeaders\r\n loading={loading}\r\n isEmpty={!teamLeaders?.length}\r\n />\r\n ) : (\r\n <>\r\n <PortableTeamLeadersList\r\n teamLeaders={processedTeamLeaders}\r\n selectedTeams={processedSelectedList}\r\n setTeamFilters={onSetSelected}\r\n />\r\n {onSave && showSave && (\r\n <FiltersSavePanel>\r\n <Button\r\n type={'button'}\r\n label={'Save'}\r\n action={() => onSave()}\r\n height={'48px'}\r\n width={'160px'}\r\n />\r\n </FiltersSavePanel>\r\n )}\r\n </>\r\n )}\r\n </CreateTeamsBody>\r\n </StyledCreateTeams>\r\n );\r\n};\r\n\r\nexport { PortableTeamLeaders };\r\n","import { TeamLeader } from '../../constants/interfaces/TeamLeader';\n\nexport const filterTeamLeaders = (\n term: string,\n teamLeaders: TeamLeader[]\n): TeamLeader[] => {\n if (!term) {\n return teamLeaders;\n }\n\n return teamLeaders.filter(\n leader =>\n leader.firstName.toLowerCase().includes(term.toLowerCase()) ||\n leader.lastName.toLowerCase().includes(term.toLowerCase()) ||\n `${leader.firstName} ${leader.lastName}`.trim().toLowerCase().includes(term.toLowerCase().trim())\n );\n};\n","import React, { FC, useCallback, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport { PortableLabelsWithStore } from '../../../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { PortableTeamsWithStore } from '../../../../../portableTeams';\nimport { useDeselectAllTeams, useSaveTeams } from '../../../../../portableTeams/store/hors/withTeams/services';\nimport { useTeamsState } from '../../../../../portableTeams/store/hors/withTeams/states';\nimport { useTeamsState as useMyTeamsState } from '../../../../store/states';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { PortableTeamLeaders } from '../../../../../portableTeamLeaders';\nimport {\n useResetTeamLeadersSelection,\n useSaveTeamLeaderSelection,\n useSelectMultipleTeamLeadersService,\n useSelectTeamLeaderService,\n useDeselectAllTeamLeadersSelection\n} from '../../../../store/services';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 464px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n min-height: 254px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamsContainer = styled.div`\n width: 264px;\n min-height: 254px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst TeamLeadersContainer = styled.div`\n width: 224px;\n min-height: 254px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nexport const MyTeamsFilters: FC<{\n preSelectedLabels: number[];\n onLabelsChange: (ids: number[]) => void;\n onTeamsChange: (ids: number[]) => void;\n onTeamLeadersChange: (ids: number[]) => void;\n onSuccessApply: () => void;\n}> = ({\n preSelectedLabels,\n onLabelsChange,\n onTeamsChange,\n onTeamLeadersChange,\n onSuccessApply,\n}) => {\n const teams = useTeamsState();\n const labels = useLabelsState();\n const selectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const saveTeams = useSaveTeams();\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(preSelectedLabels);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n preSelectedLabels,\n saveLabels,\n selectLabels,\n ]);\n\n //Team Leaders state logic\n const teamLeaders = useMyTeamsState().teamLeaders;\n\n const onSelectTeamLeader = useSelectTeamLeaderService();\n const onSelectAllTeamLeaders = useSelectMultipleTeamLeadersService();\n const saveTeamLeaders = useSaveTeamLeaderSelection();\n const resetTeamLeaders = useResetTeamLeadersSelection();\n\n const deselectTeams = useDeselectAllTeams();\n const deselectLabels = useDeselectAllLabels();\n const deselectTeamLeaders = useDeselectAllTeamLeadersSelection();\n\n const onApplyHandler = useCallback(() => {\n onLabelsChange(labels.selected);\n onTeamsChange(teams.selected);\n onTeamLeadersChange(teamLeaders.selected);\n saveLabels();\n saveTeams();\n saveTeamLeaders();\n onSuccessApply();\n }, [\n onLabelsChange,\n labels.selected,\n onTeamsChange,\n teams.selected,\n onTeamLeadersChange,\n teamLeaders.selected,\n saveLabels,\n saveTeams,\n saveTeamLeaders,\n onSuccessApply,\n ]);\n\n const onClearHandler = useCallback(() => {\n deselectLabels();\n deselectTeamLeaders();\n deselectTeams();\n }, [deselectLabels, deselectTeams, deselectTeamLeaders])\n\n const totalFiltersSelected =\n teams.selected.length +\n labels.selected.filter(id => id > 0).length +\n teamLeaders.selected.length;\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Teams'}>\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Team Leaders'}>\n <TeamLeadersContainer>\n <PortableTeamLeaders\n teamLeaders={teamLeaders.data?.items}\n selectedList={teamLeaders.selected}\n onSetSelected={onSelectTeamLeader}\n onSelectAll={onSelectAllTeamLeaders}\n resetSelected={resetTeamLeaders}\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamLeadersContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption>\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button disabled={!totalFiltersSelected} variant='inverse' width={'122px'} action={() => onClearHandler()}>\n Clear\n </Button>\n </ButtonWrapper>\n <Button width={'122px'} action={() => onApplyHandler()}>\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoTeams = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 48 48\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n fill=\"#212121\"\n d=\"M45.602 35.997H45.6h.002zm-.002 3.001h.002-.002z\"\n transform=\"translate(-821 -541) translate(821 541)\"\n />\n <path\n fill=\"#B1C0CB\"\n d=\"M17.648 0C26.936 0 29 5.828 29 13.016c0 5.537-2.695 11.415-7.05 13.841.767.193 2.979.755 5.264 1.408l.686.198c2.515.734 4.953 1.543 5.49 2.055 1.955 1.867 2.734 14.677.778 17.482l-16.44-.004L1.139 48c-1.971-2.805-1.172-15.615.8-17.482 1.095-1.04 9.508-3.155 11.463-3.636-4.386-2.409-7.105-8.306-7.105-13.866C6.296 5.828 8.361 0 17.648 0zm0 2.4C10.22 2.4 8.95 7.15 8.95 13.007c0 4.877 2.412 10.266 6.369 11.952v4.447h-1.274C9.18 30.46 5.08 31.928 3.774 32.59c-.832.97-1.365 10.463-.848 12.407l14.803-.004 14.659.004c.514-1.944-.003-11.429-.822-12.405-1.312-.651-5.35-2.122-10.156-3.186h-1.555v-4.45c.927-.397 1.77-.996 2.516-1.745.78-.782 1.455-1.728 2.012-2.774 1.182-2.22 1.834-4.894 1.834-7.43 0-5.858-1.141-10.607-8.569-10.607zM46.021 37.717c1.956 1.868 2.735 7.475.78 10.279l-10.045-.001c.288-.836.503-1.86.65-3l7.452.002c.513-1.944-.003-4.23-.823-5.206-.905-.45-3.445-1.29-6.512-2.117-.074-.95-.182-1.885-.32-2.775 3.415.86 8.085 2.118 8.818 2.818zm-7.136-27.402c2.12 2.388 1.882 5.937 1.882 9.9 0 4.245-1.545 8.689-4.228 11.626-.306-1.046-.674-1.922-1.098-2.543 1.843-2.45 2.888-5.882 2.888-9.091 0-5.713-.255-10.371-7.155-10.6-.096-.841-.23-1.643-.405-2.403 3.892.09 6.46 1.246 8.116 3.111z\"\n transform=\"translate(-821 -541) translate(821 541)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoTeams;\n","import React, { FC, useRef, useState } from 'react';\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../../../ui/components/ActionButton';\nimport { CheckPermission } from '../../../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { PopupComponent } from '../../../../../../ui/components/Popup';\nimport { Team } from '../../../../../../constants/interfaces/Team';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport {\n calculateAssignedLabels,\n calculateRemovedLabels,\n useCalculatePreSelectedLabelsForSingleItem,\n} from '../../../../../labels/tools';\nimport { AssignLabels } from '../../../../../portableLabels/templates/AssignLabels';\nimport { usePortableLabelsState } from '../../../../../portableLabels/store/states';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\n\nconst ListActions: FC<{\n team: Team;\n handleViewTeam: (id?: number) => void;\n handleManageTeam: (id?: number, isDefault?: boolean) => void;\n onDuplicateTeam: (team: Team) => void;\n handleDeleteTeam: (teamIds: number) => void;\n assignLabelsToTeams: (\n addedLabelIds: number[],\n deletedLabelIds: number[],\n ) => void;\n isHidden?: boolean;\n}> = ({\n team,\n handleViewTeam,\n handleManageTeam,\n handleDeleteTeam,\n onDuplicateTeam,\n assignLabelsToTeams,\n isHidden,\n}) => {\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const calculatePreSelectedLabels = useCalculatePreSelectedLabelsForSingleItem();\n \n const handleSetPreselectedLabels = () => {\n const selectedLabelIds = team.labels || [];\n const preAssignedLabels = calculatePreSelectedLabels(\n selectedLabelIds,\n labelsList.data\n );\n setSelectLabels(preAssignedLabels);\n saveLabels();\n };\n\n const handleSaveSelectedLabels = (labelIDs: number[]) => {\n const addedLabelIds = calculateAssignedLabels(labelIDs, labels.saved);\n const deletedLabelIds = calculateRemovedLabels(labelIDs, labels.saved);\n\n assignLabelsToTeams(addedLabelIds, deletedLabelIds);\n };\n\n const [assignSingleLabelOpen, setAssignSingleLabelOpen] = useState<\n null | number | undefined\n >(null);\n\n const triggerRef = useRef(null);\n\n return (\n <span>\n <div ref={triggerRef}>\n <ActionButton customWidth={224} isHidden={isHidden} dataTest=\"teams-item-menu\">\n <CheckPermission permissions={[NEW_PERMISSIONS.VIEW_TEAM]}>\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleViewTeam(team.id);\n }}\n dataTest=\"view-team-action\"\n >\n View Team\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.UPDATE_TEAM]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleManageTeam(team.id, team.isDefault);\n }}\n dataTest=\"manage-team-action\"\n >\n Manage Team\n </ActionItem>\n </CheckPermission>\n {!team.isDefault && (\n <>\n <CheckPermission\n permissions={[\n NEW_PERMISSIONS.ASSIGN_TEAM_LABEL,\n ]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setAssignSingleLabelOpen(team.id);\n handleSetPreselectedLabels();\n }}\n dataTest=\"assign-labels-team-action\"\n >\n Assign Labels\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.DUPLICATE_TEAM]}\n >\n <ActionItem\n onClick={e => {\n onDuplicateTeam(team);\n }}\n dataTest=\"duplicate-team-action\"\n >\n Duplicate\n </ActionItem>\n </CheckPermission>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.DELETE_TEAM]}\n >\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n handleDeleteTeam(team.id!);\n }}\n dataTest=\"delete-team-action\"\n >\n Delete\n </ActionItem>\n </CheckPermission>\n </>\n )}\n </ActionButton>\n </div>\n <PopupComponent\n triggerRef={triggerRef}\n open={assignSingleLabelOpen === team.id}\n onDismiss={() => {\n setAssignSingleLabelOpen(null);\n }}\n >\n <AssignLabels\n onLabelsChange={handleSaveSelectedLabels}\n onSuccessApply={() => {\n setAssignSingleLabelOpen(null);\n }}\n withBorder={true}\n />\n </PopupComponent>\n </span>\n );\n};\n\nexport default ListActions;\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\n\nexport const Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 4px;\n display: inline-flex;\n`;\n\nexport const FlexWrapper = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const WrapperTableCell = styled.div`\n width: 70%;\n margin: 0 auto;\n\n td {\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n span {\n width: 71px !important;\n }\n }\n\n td:first-child {\n span {\n width: 66px !important;\n }\n }\n\n @media (max-width: 1441px) {\n td:first-child {\n padding-left: 8px !important;\n }\n }\n`;\n\nexport const useStyles = makeStyles(theme => ({\n customTableCellStyle: {\n padding: '0px !important',\n },\n multiTableCellStyle: {\n padding: '10px 0 0 22px !important',\n },\n labelsCellStyle: {\n justifyContent: 'flex-end !important'\n }\n}));\n","import { History } from 'history';\r\nimport React, { FC, useCallback, useEffect, useState } from 'react';\r\nimport { isEmpty as lodashIsEmpty } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { isTeamLeader } from '../../../../constants/enums';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport {\r\n PaginationResult,\r\n ListResult\r\n} from '../../../../constants/interfaces/PaginationResult';\r\nimport { Team, TeamV2 } from '../../../../constants/interfaces/Team';\r\nimport {\r\n useDeleteLabelFromTeamService,\r\n useDeselectAllTeamLeadersSelection,\r\n useSaveTeamLeaderSelection,\r\n useSearchTeamsLeadersService,\r\n useSearchTeamsService,\r\n useUpdateAllSelectedTeamsStateService,\r\n useUpdateSelectedTeamStateService,\r\n} from '../../store/services';\r\nimport {\r\n TeamLeadersState,\r\n useTeamEditState,\r\n useTeamsState,\r\n useUpdateTeamsState,\r\n} from '../../store/states';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport {\r\n UpdatedLabelsState,\r\n useLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../../../labels/store/states';\r\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\r\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\r\nimport {\r\n useAssignLabelsToTeamsApi,\r\n useDeleteLabelsFromTeamsApi,\r\n} from '../../../../api';\r\nimport { clearSelectedItemIfNotLoaded } from '../../../labels/tools';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport {\r\n useSaveUserFiltersService,\r\n useSetAssignLabelsActionService,\r\n} from '../../../labels/store/services';\r\nimport { findAllChildIds } from '../../../../helpers/functions/tree-helpers';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport { usePermissionsState } from '../../../permissions/store/state';\r\nimport { useHandleAccessPage } from '../../../../helpers/hooks/usePagePermissions';\r\nimport {\r\n UserProfile,\r\n LeaderDataType,\r\n} from '../../../../constants/interfaces/User';\r\nimport { pushModal } from '../../../../tools/router';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { MyTeamsFilters } from './components/Filters/MyTeamsFilters';\r\nimport { WithLabelsContext } from '../../../portableLabels';\r\nimport { WithTeamsContext } from '../../../portableTeams';\r\nimport { countAppliedFiltersCount } from './tools';\r\nimport NoTrainingsFiltering from '../../../../ui/icons/NoTrainingsFiltering';\r\nimport NoTeams from '../../../../ui/icons/NoTeams';\r\nimport { useTeamsState as usePortableTeamsState } from '../../../portableTeams/store/hors/withTeams/states';\r\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\r\nimport ListActions from './components/ListActions/ListActions';\r\nimport { useSessionEffect } from '../../../common';\r\nimport {\r\n useDeselectAllTeams,\r\n useSaveTeams,\r\n} from '../../../portableTeams/store/hors/withTeams/services';\r\nimport { useSearchTeamsService as useSearchTeamsPortableService } from '../../../portableTeams/store/hors/withTeams/services';\r\nimport { getSecondarySearchState } from '../../../searchState/store/reducer';\r\nimport { SEARCH_STATE } from '../../../searchState/constants';\r\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\r\nimport { SecondarySearchStateInterface } from '../../../searchState/store/states';\r\nimport { Avatar, FlexWrapper, useStyles } from './styles';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport TableTitleOverflowText from '../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\r\nimport { Label } from '../../../../constants/interfaces/Label';\r\nimport {\r\n useDuplicateTeamBulActionService,\r\n useUpdateTeamsBulkActionService,\r\n useDeleteTeamsService,\r\n} from '../../services/TeamBulkActionsService';\r\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\r\nimport { useDeleteTeamsService as useSingleDeleteTeamService } from '../../../../features/teams/store/services';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\r\nimport {\r\n onListenEvent,\r\n onRemoveEvent,\r\n} from '../../../../helpers/functions/Events';\r\nimport {\r\n EventNameList,\r\n REFRESH_TEAMS_LIST,\r\n} from '../../../../helpers/functions/Events/types';\r\nimport { useUpdateLabelsBulkActionService } from '../../../../services/GeneralBulkActionServices';\r\nimport { UPDATE_TEAM_ACTION } from '../../services/TeamBulkActionsService/constants';\r\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\r\nimport { TeamsLearnersNavigation } from '../../components/TeamsPageNavigation';\r\n\r\nconst qs = require('query-string');\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst ListOfTeams: FC<{\r\n history: History<any>;\r\n searchTeams: (sp: SearchParams) => void;\r\n saveGlobalLabelFilters: (labels: number[] | null) => void;\r\n deleteLabelFromTeam: (\r\n data: { teamId: number; labelId: number }[],\r\n teamId: number\r\n ) => void;\r\n setAssignLabelsAction(labels: number[]): void;\r\n profile?: UserProfile;\r\n company?: CompanyInterface;\r\n teams?: ListResult<Team>;\r\n teamLeaders?: TeamLeadersState;\r\n updatedState?: Partial<TeamV2>;\r\n selectedTeams?: number[];\r\n updatedTeam?: Team;\r\n loading?: boolean;\r\n selectedLabels?: number[];\r\n updateAllSelectedTeams(\r\n teamIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n updateSelectedTeam(teamId: number): void;\r\n updatedLabels?: UpdatedLabelsState;\r\n clearAllSelected?: () => void;\r\n searchState: SecondarySearchStateInterface;\r\n allLabels?: PaginationResult<Label>;\r\n}> = ({\r\n teams,\r\n teamLeaders,\r\n updatedState,\r\n history,\r\n searchTeams,\r\n saveGlobalLabelFilters,\r\n profile,\r\n company,\r\n updatedTeam,\r\n selectedLabels,\r\n selectedTeams,\r\n deleteLabelFromTeam,\r\n updateAllSelectedTeams,\r\n updateSelectedTeam,\r\n updatedLabels,\r\n loading,\r\n searchState,\r\n allLabels,\r\n}) => {\r\n const classes = useStyles();\r\n const showMessage = useShowMessage();\r\n const teamMembers = usePortableTeamsState();\r\n const fetchTeamLeaders = useSearchTeamsLeadersService();\r\n const searchTeamsForFilters = useSearchTeamsPortableService();\r\n const deselectTeamLeaders = useDeselectAllTeamLeadersSelection();\r\n const saveTeamLeaders = useSaveTeamLeaderSelection();\r\n const deselectTeams = useDeselectAllTeams();\r\n const saveTeams = useSaveTeams();\r\n const canAccessPage = useHandleAccessPage();\r\n const singleTeamDelete = useSingleDeleteTeamService();\r\n const showConfirmationModalDialog = useShowConfirmModalDialog();\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const permissions = usePermissionsState();\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n filters: [],\r\n teamIds: teamMembers.saved,\r\n teamLeadIds: teamLeaders ? teamLeaders.saved : [],\r\n labelIDs: selectedLabels,\r\n orderBy: null,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n };\r\n\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n const [isSelectAll, setIsSelectAll] = useState<any>(false);\r\n\r\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\r\n null\r\n );\r\n\r\n const usableParams: SearchParams =\r\n !isEmpty(searchState) &&\r\n !!searchState?.params &&\r\n searchState.key === SEARCH_STATE.TEAMS.name\r\n ? searchState.params\r\n : initialSearchParams;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLabelIDs,\r\n setOffset,\r\n setCustom,\r\n refreshSearchParams,\r\n } = useSearchParamsState(usableParams);\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countAppliedFiltersCount(searchParams),\r\n itemsCount: teams?.items.length || 0,\r\n });\r\n\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n const ifCompanyChanged = useIfChanged(company);\r\n const ifTeamsUpdateChanged = useIfChanged(updatedState);\r\n\r\n const teamsWithoutDefault = teams\r\n ? teams.items.filter((item: Team) => !item.isDefault)\r\n : [];\r\n\r\n const isCheckboxPartiallySelected =\r\n selectedTeams && selectedTeams.length < teamsWithoutDefault.length;\r\n\r\n const orderBy = searchParams.orderBy;\r\n const hcTeams = useOrderBy('name', orderBy, setOrderBy);\r\n const hcMembers = useOrderBy('members', orderBy, setOrderBy);\r\n const hcPractisSets = useOrderBy('pset', orderBy, setOrderBy);\r\n\r\n const clearAllTeamsCheck = useCallback(() => {\r\n updateAllSelectedTeams([], false, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n }, [isCheckboxPartiallySelected, updateAllSelectedTeams]);\r\n\r\n const refreshData = useCallback(() => {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchTeams(searchParams);\r\n setLastRefreshed(new Date());\r\n clearAllTeamsCheck();\r\n setIsSelectAll(false);\r\n }, [searchParams, initialOffset, searchTeams, clearAllTeamsCheck]);\r\n\r\n const updateAllTeamsCheck = useCallback(\r\n (checked: boolean) => {\r\n const teamIds =\r\n (teams &&\r\n teams.items\r\n .filter((item: Team) => !item.isDefault)\r\n .map((team: Team) => Number(team.id))) ||\r\n [];\r\n updateAllSelectedTeams(\r\n teamIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [teams, isCheckboxPartiallySelected, updateAllSelectedTeams]\r\n );\r\n\r\n /**\r\n * @function handleTeamCheck\r\n * @param { React.ChangeEvent } event\r\n * @param { Team } team\r\n */\r\n const handleTeamCheck = (event: React.ChangeEvent, team: Team) => {\r\n event.stopPropagation();\r\n if (!!team.id) {\r\n updateSelectedTeam(team.id);\r\n }\r\n };\r\n\r\n /**\r\n * @function handleAssignedLabelDelete\r\n * @param { number } labelId\r\n * @param { number } teamId\r\n * @returns { void }\r\n */\r\n const handleAssignedLabelDelete = (labelId: number, teamId?: number) => {\r\n if (!!labelId && !!teamId) {\r\n const team = teams && teams.items.find(item => item.id === teamId);\r\n const labels = getTeamLabels(team?.labels || []);\r\n const teamRemovedLabels = [];\r\n\r\n if (!!team && labels) {\r\n const label = labels.find(label => label.id === labelId);\r\n if (!!label) {\r\n const children: any[] = [];\r\n findAllChildIds(labels, label.id, children);\r\n\r\n if (!!children && !!children.length) {\r\n children.forEach(item => {\r\n teamRemovedLabels.push({\r\n teamId: teamId,\r\n labelId: item.id,\r\n });\r\n });\r\n }\r\n\r\n teamRemovedLabels.push({ teamId: teamId, labelId });\r\n }\r\n }\r\n deleteLabelFromTeam(teamRemovedLabels, teamId);\r\n }\r\n };\r\n\r\n /**\r\n * @function isOptionsDisabled\r\n * @returns { boolean }\r\n */\r\n const isOptionsDisabled =\r\n !selectedTeams || (selectedTeams && !selectedTeams.length);\r\n\r\n /**\r\n * @function handleToggleLabels\r\n * @param { number } itemId\r\n * @returns { void }\r\n */\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(null);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n\r\n /**\r\n * @function handleManageTeam\r\n * @param { number } teamId\r\n * @param { boolean } isDefault\r\n * @returns { void }\r\n */\r\n const handleManageTeam = (teamId?: number, isDefaultTeam?: boolean) => {\r\n if (!teamId) return;\r\n pushModal(\r\n history,\r\n ROUTES.TEAMS_PAGES.MANAGE_TEAM.replace(\r\n ':teamId',\r\n teamId.toString()\r\n ),\r\n { isDefaultTeam }\r\n );\r\n };\r\n\r\n /**\r\n * @function getTeamLeaderPicture\r\n * @param { LeaderDataType[] } leaders\r\n * @returns { string | JSX.Element[] }\r\n */\r\n const getTeamLeaderPicture = useCallback(\r\n (leaders: LeaderDataType[], pictureCount: number) => {\r\n let result = leaders.slice(0, pictureCount).map(leader => {\r\n const profile = {\r\n ...leader,\r\n ...leader.user,\r\n picture: leader.user.imageUrl,\r\n };\r\n\r\n return <Avatar profile={profile} size=\"sm\" />;\r\n });\r\n\r\n return result;\r\n },\r\n []\r\n );\r\n\r\n /**\r\n * @function isNewlyAssigned\r\n * @param { LeaderDataType[] } leaders\r\n * @returns { boolean }\r\n */\r\n const isNewlyAssigned = useCallback(\r\n (leaders?: LeaderDataType[]) => {\r\n if (!leaders || (leaders && !leaders.length)) return false;\r\n\r\n const leader = leaders.find(\r\n item => Number(item.id) === Number(profile?.id)\r\n );\r\n\r\n return (\r\n leader && isTeamLeader(profile?.role?.name) && !leader.isViewed\r\n );\r\n },\r\n [profile]\r\n );\r\n\r\n /**\r\n * @function handleViewTeam\r\n * @param {number} id\r\n * @returns {void}\r\n */\r\n const handleViewTeam = (id?: number) => {\r\n if (!id) return;\r\n\r\n if (permissions.includes(NEW_PERMISSIONS.VIEW_TEAM)) {\r\n history.push(\r\n ROUTES.TEAMS_PAGES.TRAINING.replace(':teamId', id.toString()),\r\n {\r\n useGoBack: true,\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * @function isListEmpty\r\n * @returns { boolean }\r\n */\r\n const isListEmpty = !teams || (teams && !teams.items.length);\r\n\r\n /**\r\n * @function labelChangeHandler\r\n * @param { number[]} ids\r\n * @returns { void }\r\n */\r\n const labelChangeHandler = (ids: number[]) => {\r\n saveGlobalLabelFilters(ids);\r\n };\r\n\r\n /**\r\n * @function teamsChangeHandler\r\n * @param { number[] } ids\r\n * @returns { void }\r\n */\r\n const teamsChangeHandler = (ids: number[]) => {\r\n setCustom('teamIds', ids);\r\n };\r\n\r\n /**\r\n * @function teamsLeadersChangeHandler\r\n * @param { number[] } ids\r\n * @returns { void }\r\n */\r\n const teamsLeadersChangeHandler = (ids: number[]) => {\r\n setCustom('teamLeadIds', ids);\r\n };\r\n\r\n /**\r\n * @function hasAllMembers\r\n * @return { boolean }\r\n */\r\n const hasAllMembers = teams && teams?.items?.some(item => item.isDefault);\r\n\r\n useSessionEffect(() => {\r\n fetchTeamLeaders();\r\n }, [fetchTeamLeaders, updatedTeam, ifTeamsUpdateChanged]);\r\n\r\n useEffect(() => {\r\n if (ifSearchParamsChanged || ifCompanyChanged || ifTeamsUpdateChanged) {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchTeams(searchParams);\r\n }\r\n }, [\r\n searchTeams,\r\n searchParams,\r\n ifCompanyChanged,\r\n ifSearchParamsChanged,\r\n ifTeamsUpdateChanged,\r\n initialOffset,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (updatedTeam) refreshSearchParams();\r\n }, [updatedTeam, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n if (pageIndex > 1) {\r\n setTimeout(() => {\r\n setOffset(initialOffset);\r\n }, 200);\r\n } else if (pageIndex === 1) {\r\n setTimeout(() => {\r\n setOffset(0);\r\n }, 100);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageIndex]);\r\n\r\n useEffect(() => {\r\n selectedLabels && setLabelIDs(selectedLabels);\r\n }, [selectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (updatedLabels && updatedLabels.updateType === 'delete')\r\n refreshSearchParams();\r\n }, [updatedLabels, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n const filteredTeams = teams\r\n ? teams.items.map(team => Number(team.id))\r\n : [];\r\n const teamsToClear = clearSelectedItemIfNotLoaded(\r\n selectedTeams,\r\n filteredTeams\r\n );\r\n if (teamsToClear && teamsToClear.length > 0) {\r\n updateAllSelectedTeams(teamsToClear, false);\r\n }\r\n }, [selectedTeams, teams, updateAllSelectedTeams]);\r\n\r\n const deleteTeamsServiceOptions = {\r\n parameters: {\r\n searchParams: {\r\n ...searchParams,\r\n limit: ITEMS_PER_PAGE,\r\n offset:\r\n (isSelectAll ? teams?.count : selectedTeams?.length) ?? 0,\r\n },\r\n selectedItemIds: !isSelectAll ? selectedTeams : undefined,\r\n itemsCount:\r\n (!isSelectAll ? selectedTeams?.length : teams?.count) ?? 0,\r\n },\r\n fieldName: !isSelectAll ? 'selectedItemIds' : 'searchParams.offset',\r\n };\r\n\r\n const deleteTeams = useDeleteTeamsService();\r\n\r\n /**\r\n * @function onDeleteTeamsSuccessCallback\r\n * @returns { void }\r\n */\r\n const onDeleteTeamsSuccessCallback = useCallback(() => {\r\n Promise.resolve().then(() => {\r\n setIsSelectAll(false);\r\n refreshData();\r\n setTimeout(searchTeamsForFilters, 500);\r\n showMessage('Teams have been deleted.', 'success');\r\n });\r\n }, [refreshData, searchTeamsForFilters, showMessage]);\r\n\r\n const {\r\n handleStartBulkActionService:\r\n handleStartDeleteMembersFromTeamBulkAction,\r\n } = useUpdateTeamsBulkActionService(\r\n {\r\n actionName: UPDATE_TEAM_ACTION,\r\n actionFunction: deleteTeams,\r\n actionFunctionOptions: deleteTeamsServiceOptions,\r\n },\r\n 'Removing Teams',\r\n onDeleteTeamsSuccessCallback\r\n );\r\n\r\n /**\r\n * @function handleRemoveSingleTeam\r\n * @param { number | undefined } singleTeamId\r\n * @returns { void }\r\n */\r\n const handleRemoveSingleTeam = useCallback(\r\n (singleTeamId?: number) => {\r\n const deletedTeamId =\r\n singleTeamId ||\r\n (selectedTeams?.length === 1 && selectedTeams[0]);\r\n\r\n deletedTeamId && singleTeamDelete(deletedTeamId);\r\n },\r\n [selectedTeams, singleTeamDelete]\r\n );\r\n\r\n /**\r\n * @function handleConfirmDeleteDialog\r\n * @param { number | undefined } singleTeamId\r\n * @returns { void }\r\n */\r\n const handleConfirmDeleteDialog = useCallback(\r\n (singleTeamId?: number) => {\r\n if (isSelectAll || (selectedTeams && selectedTeams.length > 1)) {\r\n handleStartDeleteMembersFromTeamBulkAction();\r\n } else {\r\n handleRemoveSingleTeam(singleTeamId);\r\n }\r\n },\r\n [\r\n handleRemoveSingleTeam,\r\n handleStartDeleteMembersFromTeamBulkAction,\r\n isSelectAll,\r\n selectedTeams,\r\n ]\r\n );\r\n\r\n /**\r\n * @function handleOpenDeleteTeamConfirmDialog\r\n * @param { number | undefined } teamId\r\n * @returns { void }\r\n */\r\n const handleOpenDeleteTeamConfirmDialog = useCallback(\r\n (teamId?: number): void => {\r\n showConfirmationModalDialog({\r\n modalTitle: 'Warning',\r\n description:\r\n 'You will delete the selected team(s) from the system. This action cannot be undone. Are you sure?',\r\n cancelButtonText: 'Go Back',\r\n confirmButtonText: 'Proceed',\r\n dialogType: 'DANGER',\r\n onConfirm: () => handleConfirmDeleteDialog(teamId),\r\n });\r\n },\r\n [handleConfirmDeleteDialog, showConfirmationModalDialog]\r\n );\r\n\r\n /**\r\n * @function handleRemoveSelectedTeams\r\n * @returns { void }\r\n */\r\n const handleRemoveSelectedTeams = useCallback(() => {\r\n // all the teams are selected\r\n // and bulk action has it's own confirmation.\r\n if (isSelectAll) {\r\n handleStartDeleteMembersFromTeamBulkAction();\r\n } else {\r\n handleOpenDeleteTeamConfirmDialog();\r\n }\r\n }, [\r\n handleOpenDeleteTeamConfirmDialog,\r\n handleStartDeleteMembersFromTeamBulkAction,\r\n isSelectAll,\r\n ]);\r\n\r\n useEffect(() => {\r\n return () =>\r\n updateAllSelectedTeams([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n updateAllSelectedTeams([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [teams]);\r\n\r\n useEffect(() => {\r\n if (!searchState.key) {\r\n setCustom('teamIds', teamMembers.saved);\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [teamMembers.saved, setCustom]);\r\n\r\n useEffect(() => {\r\n if (teamLeaders?.saved && !searchState.key) {\r\n setCustom('teamLeadIds', teamLeaders.saved);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [teamLeaders, setCustom]);\r\n\r\n useEffect(() => {\r\n canAccessPage([NEW_PERMISSIONS.LIST_TEAM]);\r\n }, [canAccessPage]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n deselectTeamLeaders();\r\n saveTeamLeaders();\r\n deselectTeams();\r\n saveTeams();\r\n };\r\n }, [deselectTeamLeaders, saveTeamLeaders, deselectTeams, saveTeams]);\r\n\r\n /**\r\n * @function handlePageChange\r\n * @param { number } limit\r\n * @param { number } offset\r\n * @returns { void }\r\n */\r\n const handlePageChange = (offset: number) => {\r\n setOffset(offset);\r\n };\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n clearAllTeamsCheck();\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n updateAllTeamsCheck(true);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n const TotalCountForChecking = hasAllMembers\r\n ? ITEMS_PER_PAGE\r\n : ITEMS_PER_PAGE - 1;\r\n const count = teams?.count || 0;\r\n if (count < TotalCountForChecking) {\r\n setIsSelectAll(true);\r\n } else {\r\n setIsSelectAll(false);\r\n }\r\n\r\n updateAllTeamsCheck(event.target.checked);\r\n };\r\n\r\n const isMasterCheckBoxChecked = !!selectedTeams && !!selectedTeams.length;\r\n\r\n const isMasterCheckBoxDisabled =\r\n !teams ||\r\n (teams && teams.items.length < 1) ||\r\n (teams && teams.count === (hasAllMembers ? 1 : 0));\r\n\r\n /**\r\n * @function onRowClick\r\n * @param { Team } team\r\n * @returns { void }\r\n */\r\n const onRowClick = (team: Team) => {\r\n handleViewTeam(team.id);\r\n };\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { Team } team\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (team: Team): boolean =>\r\n !!selectedTeams && !!team.id && selectedTeams.includes(team.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { Team } team\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, team: Team) => {\r\n handleTeamCheck(event, team);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { Team } team\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (team: Team): boolean => {\r\n return labelsOpen === team?.['id'];\r\n };\r\n\r\n /**\r\n * @function onDeleteLabelHandler\r\n * @param { number } labelId\r\n * @param { Team } team\r\n * @returns { void }\r\n */\r\n const onDeleteLabelHandler = (labelId: number, team: Team): void => {\r\n handleAssignedLabelDelete(labelId, team.id);\r\n };\r\n\r\n const getTeamLabels = (labelIds: number[]) => {\r\n return (\r\n allLabels?.items?.filter(label => labelIds.includes(label.id)) || []\r\n );\r\n };\r\n\r\n const assignLabelsToTeam = useAssignLabelsToTeamsApi();\r\n const deleteLabelsFromTeam = useDeleteLabelsFromTeamsApi();\r\n\r\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\r\n assignLabelsToTeam,\r\n deleteLabelsFromTeam,\r\n refreshData\r\n );\r\n\r\n /**\r\n * @function handleUpdateTeamLabels\r\n * @param { number[] } addedLabelIds\r\n * @param { number[] } deletedLabelIds\r\n * @param { number } teamId\r\n * @returns { void }\r\n */\r\n const handleUpdateTeamLabels = (\r\n addedLabelIds: number[],\r\n deletedLabelIds: number[],\r\n teamId: number\r\n ): void => {\r\n updateLabelsBulkActionService(\r\n {\r\n entityName: 'team',\r\n entityId: teamId,\r\n },\r\n addedLabelIds,\r\n deletedLabelIds\r\n );\r\n };\r\n\r\n const duplicateTeamBulkActionService = useDuplicateTeamBulActionService(\r\n refreshData,\r\n refreshData\r\n );\r\n\r\n /**\r\n * @function handleDuplicateTeam\r\n * @param { Team } team\r\n * @returns { void }\r\n */\r\n const handleDuplicateTeam = (team: Team) => {\r\n if (team) {\r\n duplicateTeamBulkActionService(team);\r\n }\r\n };\r\n\r\n // Listen to ManageTeam Screen Refresh dispatch\r\n useEffect(() => {\r\n onListenEvent(EventNameList[REFRESH_TEAMS_LIST], () => {\r\n refreshData();\r\n fetchTeamLeaders();\r\n });\r\n\r\n return () => {\r\n onRemoveEvent(EventNameList[REFRESH_TEAMS_LIST], () => {\r\n refreshData();\r\n fetchTeamLeaders();\r\n });\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <MainWrapper\r\n subTitle=\"Teams\"\r\n hideDivider={!!selectedTeams?.length}\r\n tabs={<TeamsLearnersNavigation />}\r\n htmlPageTitle='Teams - Practis'\r\n dataTest=\"teams\"\r\n >\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={teams?.items}\r\n selectedLabels={selectedLabels}\r\n cornered={selectedLabels && !!selectedLabels.length}\r\n shouldHideTableDivider={!!selectedTeams?.length}\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: 'teams-timestamp',\r\n }}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: teams?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: handlePageChange,\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n countAppliedFiltersCount(searchParams),\r\n dataTest: 'teams-paging',\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled:\r\n countAppliedFiltersCount(searchParams) > 0 &&\r\n isListEmpty &&\r\n searchParams.searchTerm.length === 0,\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedTeams) && !lodashIsEmpty(teams),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedTeams?.length,\r\n totalCount: teams?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled:\r\n isOptionsDisabled ||\r\n !permissions.includes(\r\n NEW_PERMISSIONS.DELETE_TEAM\r\n ),\r\n disabledLabel: \"Bulk actions can't be applied\",\r\n removeItemPermissions: [\r\n NEW_PERMISSIONS.DELETE_TEAM,\r\n ],\r\n removeItemTitle: 'Delete Teams',\r\n onRemoveItemsSubmit: () =>\r\n selectedTeams && handleRemoveSelectedTeams(),\r\n isSelectAll: isSelectAll,\r\n totalCount: teams?.count,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <MyTeamsFilters\r\n preSelectedLabels={selectedLabels || []}\r\n onLabelsChange={labelChangeHandler}\r\n onTeamsChange={teamsChangeHandler}\r\n onTeamLeadersChange={\r\n teamsLeadersChangeHandler\r\n }\r\n onSuccessApply={() => hide()}\r\n />\r\n )}\r\n horizontalOffset={256}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={countAppliedFiltersCount(\r\n searchParams\r\n )}\r\n disabled={\r\n (searchParams.searchTerm.length >\r\n 0 ||\r\n countAppliedFiltersCount(\r\n searchParams\r\n ) === 0) &&\r\n isListEmpty\r\n }\r\n dataTest=\"teams-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && teams?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: NoTeams,\r\n text: 'No Trainings Yet',\r\n dataTest: 'no-teams',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Teams',\r\n dataTest: 'no-found-teams',\r\n },\r\n noFilterResultsOptions: {\r\n icon: NoTrainingsFiltering,\r\n width: '160px',\r\n dataTest: 'no-filtered-teams',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial:\r\n isCheckboxPartiallySelected ||\r\n ((teams?.count ?? 0) > ITEMS_PER_PAGE &&\r\n !isSelectAll),\r\n handleCheck: onCheckMasterCheckbox,\r\n dataTest: 'teams-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Teams',\r\n width: 23,\r\n ...(isListEmpty ? null : hcTeams),\r\n disabled: isListEmpty,\r\n className: classes.customTableCellStyle,\r\n dataTest: 'teams-name-column',\r\n },\r\n {\r\n title: 'Members',\r\n width: 12,\r\n ...(isListEmpty ? null : hcMembers),\r\n disabled: isListEmpty,\r\n dataTest: 'teams-members-column',\r\n },\r\n {\r\n title: 'Practis Sets',\r\n width: 12,\r\n ...(isListEmpty ? null : hcPractisSets),\r\n disabled: isListEmpty,\r\n dataTest: 'teams-practis-sets-column',\r\n },\r\n {\r\n title: 'Team Leaders',\r\n width: 22,\r\n disabled: isListEmpty,\r\n dataTest: 'teams-team-leaders-column',\r\n },\r\n {\r\n width: 9,\r\n },\r\n {\r\n width: 3,\r\n },\r\n ],\r\n\r\n rowConfig: {\r\n onRowClick: onRowClick,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n getLabelTagsProps: (team: Team) => ({\r\n selectedLabels: team?.labels,\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\r\n ],\r\n onDeleteLabel: (labelId: number) =>\r\n onDeleteLabelHandler(labelId, team),\r\n }),\r\n getClassName: (team: Team) =>\r\n team.isDefault ? 'is-default' : '',\r\n shouldShowAllMembers: (team: Team) =>\r\n team?.isDefault ?? false,\r\n getDataTest: (team: Team) =>\r\n team.isDefault ? 'all-members-item' : 'teams-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (team: Team) => (\r\n <TableTitleOverflowText\r\n isNew={isNewlyAssigned(team.leaders)}\r\n dataTest=\"teams-item-name\"\r\n >\r\n {team.name !== null ? team.name : ''}\r\n </TableTitleOverflowText>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (team: Team) =>\r\n !team?.countMembers ||\r\n team?.countMembers === 0,\r\n fieldProps: {\r\n renderTitle: (team: Team) =>\r\n team.countMembers !== null &&\r\n team.countMembers !== 0 &&\r\n team.countMembers,\r\n dataTest: 'teams-item-members',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (team: Team) =>\r\n !team?.countPractisSets ||\r\n team?.countPractisSets === 0,\r\n fieldProps: {\r\n renderTitle: (team: Team) =>\r\n team.countPractisSets !== null &&\r\n team.countPractisSets !== 0 &&\r\n team.countPractisSets,\r\n dataTest: 'teams-item-practis-sets',\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n shouldShowEmptyCell: (team: Team) =>\r\n !team?.leaders || team.leaders.length === 0,\r\n getCustomFieldComponent: (team: Team) => {\r\n const leaders: LeaderDataType[] =\r\n team.leaders!;\r\n const pictureCount: number = 3;\r\n return (\r\n <FlexWrapper data-test=\"teams-item-team-leaders\">\r\n {getTeamLeaderPicture(\r\n leaders,\r\n pictureCount\r\n )}{' '}\r\n {leaders.length > pictureCount\r\n ? ` +${\r\n leaders.length -\r\n pictureCount\r\n }`\r\n : ''}\r\n </FlexWrapper>\r\n );\r\n },\r\n },\r\n {\r\n fieldType: 'LABEL_TAGS',\r\n fieldProps: {\r\n getLabelTagsProps: (team: Team) => ({\r\n open: labelsOpen === team.id,\r\n toggleOpen: () =>\r\n handleToggleLabels(team.id),\r\n selectedLabels: team.labels,\r\n isLabelLess: team.isDefault,\r\n dataTest: 'teams-item-labels',\r\n }),\r\n className: classes.labelsCellStyle,\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (team: Team) => (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'teams',\r\n scope: 'assignLabels',\r\n }}\r\n >\r\n <ListActions\r\n team={team}\r\n handleViewTeam={handleViewTeam}\r\n handleManageTeam={\r\n handleManageTeam\r\n }\r\n handleDeleteTeam={\r\n handleOpenDeleteTeamConfirmDialog\r\n }\r\n onDuplicateTeam={\r\n handleDuplicateTeam\r\n }\r\n assignLabelsToTeams={(\r\n addedLabelIds,\r\n deletedlabelIds\r\n ) =>\r\n handleUpdateTeamLabels(\r\n addedLabelIds,\r\n deletedlabelIds,\r\n team?.id ?? 0\r\n )\r\n }\r\n isHidden={\r\n !!selectedTeams?.length\r\n }\r\n />\r\n </WithLabelsContext.Provider>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nexport const ListOfTeamsContainer: FC = () => {\r\n const state = useTeamsState();\r\n const updatedState = useTeamEditState().updatedTeam;\r\n const updatedTeamsState = useUpdateTeamsState();\r\n const history = useHistory();\r\n const searchTeams = useSearchTeamsService(true);\r\n const profile = useSelector(getProfileState);\r\n const company = useSelector(getCompanyState);\r\n const searchTeamsDebounced = useSearchDebounced(searchTeams);\r\n const portableLabels = usePortableLabelsState();\r\n const labels = useLabelsState();\r\n const deleteLabelFromTeam = useDeleteLabelFromTeamService();\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const saveGlobalLabelFilters = useSaveUserFiltersService();\r\n const updateAllSelectedTeams = useUpdateAllSelectedTeamsStateService();\r\n const updateSelectedTeam = useUpdateSelectedTeamStateService();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const teamSearchState = useSelector(getSecondarySearchState);\r\n\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'teams',\r\n }}\r\n >\r\n <WithTeamsContext.Provider\r\n value={{\r\n reducerName: 'teams',\r\n }}\r\n >\r\n <ListOfTeams\r\n history={history}\r\n searchTeams={searchTeamsDebounced}\r\n profile={profile}\r\n teams={state.myTeams}\r\n teamLeaders={state.teamLeaders}\r\n updatedState={updatedState}\r\n company={company}\r\n selectedTeams={state.selectedMyTeamsItems}\r\n loading={state.loading}\r\n updatedTeam={updatedTeamsState.data}\r\n selectedLabels={labels.selected}\r\n setAssignLabelsAction={setAssignLabelsAction}\r\n updatedLabels={updatedLabels}\r\n saveGlobalLabelFilters={saveGlobalLabelFilters}\r\n deleteLabelFromTeam={deleteLabelFromTeam}\r\n updateAllSelectedTeams={updateAllSelectedTeams}\r\n updateSelectedTeam={updateSelectedTeam}\r\n searchState={teamSearchState}\r\n allLabels={portableLabels.data}\r\n />\r\n </WithTeamsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport default ListOfTeamsContainer;","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const OverdueLearnersNoResult = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n <g clip-path=\"url(#nwn28ygtwa)\">\n <g clip-path=\"url(#2v0qqq962b)\" fill=\"#B1C0CB\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6 20v25h9.042v3H7.5c-1.193 0-2.656-.156-3.5-1-.844-.844-1-2.306-1-3.5v-33c0-1.193.156-2.656 1-3.5.844-.844 2.307-1 3.5-1h4.418L12 2c.008-.594.08-1.08.5-1.5l.14-.143c.286-.294.34-.35.86-.357.53.006.87.363.978.477L14.5.5c.444.444.464.83.49 1.311.002.062.006.124.01.189l.042 4H33.02l.481-4a2.192 2.192 0 0 0-.1-.6c-.09-.334-.17-.63.1-.9l.14-.143c.286-.294.34-.35.86-.357.494.005.57.08.846.351L35.5.5c.26.246.181.546.094.876-.053.199-.108.409-.094.624l.225 4H40.5c1.173 0 2.66.182 3.5 1 .84.818.969 2.207 1 3.38V15h-3V9H6v8h18v3H6z\"/>\n <path d=\"M32.342 31.647c-1.394-2.842-1.245-5.775-.39-8.11.429-1.169 1.024-2.155 1.654-2.876.047-.053.093-.105.14-.155 1.023 3.935 3.783 6.726 5.647 8.612l.271.274c2.19 2.225 3.836 3.947 3.836 7.307 0 5.638-4.735 9.801-10.501 9.801-5.768 0-10.5-4.142-10.499-9.801 0-1.608.502-3.094 1.285-4.166.923 1.573 2.151 2.691 3.355 3.396.827.485 1.68.796 2.457.906.387.054.8.065 1.2-.008.39-.07.88-.242 1.274-.645 1.17-1.193 1.03-2.985.27-4.535z\" stroke=\"#B1C0CB\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M12 0h3v6h-3z\"/>\n <path d=\"M12 1.5a1.5 1.5 0 0 1 3 0V6h-3V1.5zM33 0h3v6h-3z\"/>\n </g>\n </g>\n <defs>\n <clipPath id=\"nwn28ygtwa\">\n <path fill=\"#fff\" d=\"M0 0h48v48H0z\"/>\n </clipPath>\n <clipPath id=\"2v0qqq962b\">\n <path fill=\"#fff\" d=\"M0 0h48v48H0z\"/>\n </clipPath>\n </defs>\n </svg>);\n }\n);\n\nexport default OverdueLearnersNoResult;","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n background-color: inherit;\n`;\n\nexport const Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n background-color: inherit;\n`;\n\nexport const LabelsContainer = styled.div`\n width: 208px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const TeamsContainer = styled.div`\n width: 264px;\n min-height: 244px;\n height: 100%;\n overflow: auto;\n background-color: inherit;\n`;\n\nexport const Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nexport const SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: var(--ps-grey-1);\n`;\n\nexport const ButtonWrapper = styled.div`\n margin-right: 12px;\n`;","import { FC, useCallback, useEffect } from 'react';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport { PortableLabelsWithStore } from '../../../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { PortableTeamsWithStore } from '../../../../../portableTeams';\nimport { useDeselectAllTeams, useSaveTeams } from '../../../../../portableTeams/store/hors/withTeams/services';\nimport { useTeamsState } from '../../../../../portableTeams/store/hors/withTeams/states';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { Container, TeamsContainer, Wrapper, LabelsContainer, Actions, SummaryCaption, ButtonWrapper } from './styles';\n\nexport const OverdueLearnersFilter: FC<{\n preSelectedLabels: number[];\n onLabelsChange: (ids: number[]) => void;\n onTeamsChange: (ids: number[]) => void;\n onSuccessApply: () => void;\n}> = ({\n preSelectedLabels,\n onLabelsChange,\n onTeamsChange,\n onSuccessApply\n}) => {\n const teams = useTeamsState();\n const labels = useLabelsState();\n const selectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const saveTeams = useSaveTeams();\n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(preSelectedLabels);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n preSelectedLabels,\n saveLabels,\n selectLabels,\n ]);\n\n const onApplyHandler = useCallback(() => {\n onLabelsChange(labels.selected);\n onTeamsChange(teams.selected);\n saveLabels();\n saveTeams();\n onSuccessApply();\n }, [\n onLabelsChange,\n labels.selected,\n onTeamsChange,\n teams.selected,\n saveLabels,\n saveTeams,\n onSuccessApply,\n ]);\n\n const totalFiltersSelected =\n teams.selected.length +\n labels.selected.filter((id: any) => id > 0).length;\n\n const deselectLabels = useDeselectAllLabels();\n const deselectTeams = useDeselectAllTeams();\n\n const onClearHandler = () => {\n deselectLabels();\n deselectTeams();\n }\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Teams'} dataTest=\"teams-section-title\">\n <TeamsContainer>\n <PortableTeamsWithStore\n showSave={false}\n fetchOnMount={false}\n showSelectActions\n showSearch\n />\n </TeamsContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant='inverse'\n width={'122px'}\n action={onClearHandler}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={onApplyHandler}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const ITEMS_PER_PAGE = 20;\n\nexport const initialSearchParams: SearchParams = {\n searchTerm: '',\n orderBy: null,\n limit: ITEMS_PER_PAGE,\n offset: 0,\n numberOfPages: 0,\n labelIDs: []\n};\n\nexport const OverdueNudgeMessagePrefix = 'You have overdue Practis sets.\\n\\n';","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const countAppliedFiltersCount = (searchParams: SearchParams) => {\n let total = 0;\n\n if (searchParams && searchParams.teamIds && searchParams.teamIds.length) {\n total = total + searchParams.teamIds.length;\n }\n\n if (searchParams && searchParams.labelIDs && searchParams.labelIDs.length) {\n total = total + searchParams.labelIDs.filter(id => id > 0).length;\n }\n\n return total;\n};\n","import React, { FC } from 'react';\n\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../../../ui/components/ActionButton';\nimport { CheckPermission } from '../../../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { UserV2 } from '../../../../../../constants/interfaces/User';\n\nexport const OverdueLearnersListActions: FC<{\n user: UserV2;\n handleViewProfile: (user: UserV2) => void;\n setShowNudgeDialogMemberId: (userId: number) => void;\n isHidden?: boolean;\n}> = ({\n user,\n handleViewProfile,\n setShowNudgeDialogMemberId,\n isHidden,\n}) => {\n return (\n <span>\n <div>\n <ActionButton customWidth={200} isHidden={isHidden} dataTest=\"list-item-menu\">\n <CheckPermission\n permissions={[NEW_PERMISSIONS.VIEW_USER_PERFORMANCE]}\n >\n <ActionItem onClick={() => handleViewProfile(user)} dataTest=\"view-profile-action\">\n View Profile\n </ActionItem>\n </CheckPermission>\n <CheckPermission permissions={[NEW_PERMISSIONS.SEND_NUDGE]}>\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n setShowNudgeDialogMemberId(user.id);\n }}\n dataTest=\"nudge-user-action\"\n >\n Nudge User\n </ActionItem>\n </CheckPermission>\n </ActionButton>\n </div>\n </span>\n );\n};\n\n\n\n","import { Popup } from '../../../../ui/components/Popup';\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\nimport OverdueLearnersNoResult from '../../../../ui/icons/OverdueLearnersNoResult';\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { useBuildUserName } from '../../../users/tools/hooks';\nimport { TeamsLearnersNavigation } from '../../components/TeamsPageNavigation';\nimport { useStyles } from '../Training/styles';\nimport { OverdueLearnersFilter } from './components/filters/OverdueLearnersFilter';\nimport { ITEMS_PER_PAGE } from './constants';\nimport { OverdueLearnersViewProps } from './types';\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\nimport { countAppliedFiltersCount } from './tools';\nimport { NEW_PERMISSIONS } from '../../../users/tools';\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\nimport { OverdueLearnersListActions } from './components/listActions/OverdueListActions';\nimport { isEmpty as lodashIsEmpty } from 'lodash';\nimport { TeamBasic } from '../../../../constants/interfaces/TeamBasic';\nimport { UserV2 } from '../../../../constants/interfaces/User';\nimport { EmptyCellDash } from '../../../../ui/components/table-wrapper/table/EmptyCellDash';\n\nfunction OverdueLearnersView({\n profile,\n users,\n searchParams,\n loading,\n tableStates,\n lastRefreshed,\n selectedLabels,\n showNudgeDialogMemberId,\n selectedUsers,\n sorting,\n isSelectAll,\n teamsData,\n labelsOpen,\n handleToggleLabels,\n checkIsLabelTagsOpen,\n refreshData,\n handlePageChange,\n handleSearchChange,\n handleViewProfile,\n onLabelsFilterChange,\n onTeamsFilterChange,\n onDeleteLabelHandler,\n onNudgeSingleUser,\n setShowNudgeDialogMemberId,\n updateIsSelectAll,\n updateSelectedUsers,\n selectAllHandler,\n onSelectUser,\n handleNudgeMultipleUsers,\n}: OverdueLearnersViewProps) {\n\n const classes = useStyles();\n const buildUserName = useBuildUserName();\n\n const isTableHeadersDisabled =\n !users || (users && !users.items.length);\n\n return (\n <MainWrapper\n tabs={<TeamsLearnersNavigation />}\n htmlPageTitle={`Overdue Learners`}\n dataTest=\"overdue-learners\"\n subTitle={'Teams'}\n >\n {!!showNudgeDialogMemberId && (\n <DialogWrapper\n customization={{\n width: 480,\n padding: '49px 32px 32px 32px',\n }}\n >\n <NudgeUser\n fromUser={\n !!profile\n ? `${profile.firstName} ${profile.lastName}`\n : ''\n }\n onSend={onNudgeSingleUser}\n onClose={() => setShowNudgeDialogMemberId(null)}\n />\n </DialogWrapper>\n )}\n <TableWrapper\n tableStates={{...tableStates}}\n data={users?.items || []}\n selectedLabels={selectedLabels}\n cornered={selectedLabels && !!selectedLabels.length}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'overdue-learners-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: users?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied: false,\n dataTest: 'overdue-learners-paging',\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n onSearchChange: handleSearchChange,\n placeholder: \"\",\n dataTest: 'overdue-learners-search',\n },\n isSelectedItemOptionsVisible:\n !lodashIsEmpty(selectedUsers) &&\n !lodashIsEmpty(users),\n selectedItemOptions: {\n isSelectAll: isSelectAll,\n selectedLength: selectedUsers?.length,\n totalCount: users?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onClearSelection: () => {\n updateIsSelectAll(false);\n updateSelectedUsers([]);\n },\n onSelectAll: () => {\n updateSelectedUsers(users ? users.items.map(item => item.id) : []);\n updateIsSelectAll(true);\n },\n bulkActionsConfig: {\n disabled: selectedUsers.length === 0,\n showNudgeWarning: false,\n onNudgeSendButtonClicked:\n handleNudgeMultipleUsers, \n sendNudgePermissions: [\n NEW_PERMISSIONS.SEND_NUDGE,\n ],\n isSelectAll: isSelectAll,\n totalCount: users?.count,\n selectedItems: selectedUsers,\n },\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <OverdueLearnersFilter\n preSelectedLabels={selectedLabels || []}\n onTeamsChange={onTeamsFilterChange}\n onLabelsChange={onLabelsFilterChange}\n onSuccessApply={() => hide()}\n />\n )}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n horizontalOffset={256}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n toggleOpen={toggleShown}\n filtersCount={countAppliedFiltersCount(\n searchParams\n )}\n disabled={\n countAppliedFiltersCount(\n searchParams\n ) === 0 &&\n tableStates.disableFilters\n }\n dataTest=\"overdue-learners-filters\"\n />\n )}\n </Popup>\n ),\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !loading && users?.items?.length === 0,\n noEntriesOptions: {\n icon: OverdueLearnersNoResult,\n text: 'No one is behind',\n dataTest: 'no-results',\n },\n noSearchResultsOptions: {\n entityName: 'Learners',\n dataTest: 'no-found-users',\n },\n noFilterResultsOptions: {\n dataTest: 'no-filtered-users',\n },\n }}\n configurations={{\n masterCheckBoxConfig: {\n checked: !!selectedUsers.length,\n disabled: !users?.items.length,\n partial:\n (selectedUsers && users && selectedUsers.length < users.items.length) || !isSelectAll,\n handleCheck: selectAllHandler,\n dataTest: \"members-master-checkbox\"\n },\n columns: [\n {\n title: 'Name',\n width: 35,\n disabled: tableStates.disableSorting,\n ...(isTableHeadersDisabled\n ? null\n : sorting.hcUserName),\n dataTest: 'name-column',\n },\n {\n title: 'Teams',\n width: 35,\n ...(isTableHeadersDisabled\n ? null\n : sorting.hcTeamName),\n disabled: tableStates.disableSorting,\n dataTest: 'teams-column',\n },\n {\n width: 1,\n },\n {\n width: 1,\n },\n ],\n rowConfig: {\n onRowClick: handleViewProfile,\n isLabelTagsOpen: checkIsLabelTagsOpen,\n onRowCheckHandler: (event: any, user: UserV2) => onSelectUser(user.id, event?.target?.checked),\n isRowChecked: (user) => (selectedUsers.includes(user.id) || isSelectAll),\n getLabelTagsProps: (user: UserV2) => ({\n selectedLabels: user.labels,\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\n ],\n \n onDeleteLabel: (labelId: number) =>\n onDeleteLabelHandler(labelId, user),\n }),\n cells: [\n {\n fieldType: 'AVATAR_FIELD',\n cellClassName: classes.customTableCellStyle,\n fieldProps: {\n renderTitle: (user: UserV2) =>\n buildUserName(user),\n getAvatarProps: (user: UserV2) => ({\n customProfile: {\n firstName: user.firstName,\n lastName: user.lastName,\n picture: user.imageUrl,\n status: user.status,\n },\n size: 'sm',\n }),\n dataTest: 'overdue-users-user-item',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (user: UserV2) =>\n !user.teams,\n fieldProps: {\n renderTitle: (user: UserV2) => {\n const existingTeams = user.teams?.reduce((teams: string[], teamId: number) => {\n const team = teamsData.items.find((team: TeamBasic) => team.id === teamId)\n return team ? [...teams, team.name] : teams\n }, []);\n\n return existingTeams?.length ? existingTeams.join(', ') : <EmptyCellDash />;\n },\n dataTest: 'overdue-users-teams-item',\n },\n },\n {\n fieldType: 'LABEL_TAGS',\n fieldProps: {\n getLabelTagsProps: (user: UserV2) => {\n return {\n open: labelsOpen === user?.id,\n toggleOpen: () =>\n handleToggleLabels(user?.id),\n selectedLabels: user.labels,\n dataTest: 'overdue-learners-labels',\n };\n },\n },\n },\n {\n fieldType: 'LIST_ACTIONS',\n fieldProps: {\n getListActionsComponent: (user: UserV2) => (\n <OverdueLearnersListActions\n user={user}\n handleViewProfile={\n handleViewProfile\n }\n setShowNudgeDialogMemberId={\n setShowNudgeDialogMemberId\n }\n isHidden={!!selectedUsers?.length}\n />\n ),\n },\n },\n ],\n },\n }}\n />\n </MainWrapper>\n );\n}\n\nexport default OverdueLearnersView;","import { ListResult } from \"../../../../../constants/interfaces/PaginationResult\";\nimport { UserV2 } from \"../../../../../constants/interfaces/User\";\n\nexport enum ACTIONS {\n GET_OVERDUE_LEARNERS_START = 'GET_OVERDUE_LEARNERS_START',\n GET_OVERDUE_LEARNERS_SUCCESS = 'GET_OVERDUE_LEARNERS_SUCCESS',\n GET_OVERDUE_LEARNERS_FAILURE = 'GET_OVERDUE_LEARNERS_FAILURE',\n}\n\nexport function getOverdueLearnersStart() {\n return {\n type: ACTIONS.GET_OVERDUE_LEARNERS_START as ACTIONS.GET_OVERDUE_LEARNERS_START,\n };\n}\n\nexport function getOverdueLearnersSuccess(data: ListResult<UserV2>) {\n return {\n type: ACTIONS.GET_OVERDUE_LEARNERS_SUCCESS as ACTIONS.GET_OVERDUE_LEARNERS_SUCCESS,\n data\n };\n}\n\nexport function getOverdueLearnersFailure(error: string) {\n return {\n type: ACTIONS.GET_OVERDUE_LEARNERS_FAILURE as ACTIONS.GET_OVERDUE_LEARNERS_FAILURE,\n error\n };\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { UserV2 } from '../../../../../constants/interfaces/User';\n\nexport interface OverdueLearnersState {\n data?: ListResult<UserV2>;\n isLoading: boolean;\n error?: string;\n}\n\nexport type OverdueLearnersStateSelector = (state: any) => OverdueLearnersState;\n\nexport const OverdueLearnersStateSelectorContext = React.createContext<OverdueLearnersStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useOverdueLearnersState(): OverdueLearnersState {\n return useSelector(useContext(OverdueLearnersStateSelectorContext));\n}\n","import { useDispatch } from 'react-redux'\nimport { useCallback } from 'react';\nimport { useGetOverdueLearners } from '../../../../../api';\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ListResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { getOverdueLearnersStart, getOverdueLearnersFailure, getOverdueLearnersSuccess } from './actions';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\nimport { SearchParams } from '../../../../../constants/interfaces/filters';\nimport { getSearchSortingValue } from '../../../../../helpers/functions/search-params-helpers';\nimport { UserV2 } from '../../../../../constants/interfaces/User';\n\n/**\n * @function useGetOverdueLearnersService\n * @returns { CallableFunction }\n */\nexport const useGetOverdueLearnersService = () => {\n const dispatch = useDispatch();\n const getOverdueLearnersApi = useGetOverdueLearners();\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback((searchParams: SearchParams) => {\n const sp = {\n teams: searchParams.teamIds?.join(','),\n labels: searchParams.labelIDs?.join(','),\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset,\n query: searchParams.searchTerm,\n sort: getSearchSortingValue(searchParams.orderBy, 'user_name', true),\n companies: searchParams.companyId\n }\n dispatch(getOverdueLearnersStart());\n return getOverdueLearnersApi(sp)\n .then((data: ListResult<UserV2>) => {\n dispatch(getOverdueLearnersSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(getOverdueLearnersFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getOverdueLearnersApi, showMessage]);\n}\n","import { ChangeEventHandler, useCallback, useEffect, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useHistory } from \"../../../../tools/router\";\nimport OverdueLearnersView from \"./view\";\nimport { useOverdueLearnersState } from './store/states';\nimport { useGetOverdueLearnersService } from \"./store/services\";\nimport { ITEMS_PER_PAGE } from \"../../../submissions/pages/ChallengeSubmissions\";\nimport { SearchParams, useSearchParamsState } from \"../../../../constants/interfaces/filters\";\nimport { initialSearchParams, OverdueNudgeMessagePrefix } from \"./constants\";\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\nimport { UserV2 } from \"../../../../constants/interfaces/User\";\nimport ROUTES from '../../../../routes/routes';\nimport { WithLabelsContext } from \"../../../portableLabels\";\nimport { WithTeamsContext } from \"../../../portableTeams\";\nimport { useLabelsState } from \"../../../labels/store/states\";\nimport { useSaveUserFiltersService } from \"../../../labels/store/services\";\nimport { countAppliedFiltersCount } from \"./tools\";\nimport { useDeleteUserLabelService, useNudgeTraineesService } from \"../../../users/store/services\";\nimport { getProfileState } from \"../../../../pages/UserProfile/store/reducers\";\nimport { NudgeData } from \"../../../../api/alert/types\";\nimport { useSessionEffect } from \"../../../common\";\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { usePortableTeamsState } from \"../../../portableTeams/store/states\";\nimport { useNudgeUsersBulkActionService } from '../../../../services/GeneralBulkActionServices';\n\nconst qs = require('query-string');\n\nfunction OverdueLearnersController () {\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n const [showNudgeDialogMemberId, setShowNudgeDialogMemberId] =\n useState<number | null>(null);\n const [selectedUsers, setSelectedUsers] = useState<number[]>([]);\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\n\n const history = useHistory();\n const { data: users, isLoading: loading } = useOverdueLearnersState();\n const profile = useSelector(getProfileState);\n\n const searchOverdueLearners = useGetOverdueLearnersService();\n const saveGlobalLabelFilters = useSaveUserFiltersService();\n const deleteUserLabel = useDeleteUserLabelService();\n const nudgeTrainees = useNudgeTraineesService();\n const portableTeams = usePortableTeamsState();\n\n const onNudgeSingleUserSuccessCallback = () => {\n setShowNudgeDialogMemberId(null);\n };\n\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page) || 1;\n\n const initialOffset = (pageIndex - 1) * ITEMS_PER_PAGE;\n const usableParams: SearchParams = initialSearchParams;\n\n const { searchParams, setSearchTerm, setOffset, setLabelIDs, setOrderBy, setCustom} =\n useSearchParamsState(usableParams);\n\n const orderBy = searchParams.orderBy;\n const hcUserName = useOrderBy<UserV2>(\n 'user_name',\n orderBy,\n setOrderBy\n );\n const hcTeamName = useOrderBy<UserV2>(\n 'team_name',\n orderBy,\n setOrderBy\n );\n\n const handleTableStates = useTableStateHelper();\n const { selected: selectedLabels } = useLabelsState();\n\n useEffect(() => {\n selectedLabels && setLabelIDs(selectedLabels);\n }, [selectedLabels, setLabelIDs]);\n\n useEffect(() => {\n if (pageIndex > 1) {\n setTimeout(() => {\n setOffset(initialOffset);\n }, 200);\n } else if (pageIndex === 1) {\n setTimeout(() => {\n setOffset(0);\n }, 100);\n }\n }, [initialOffset, pageIndex, setOffset]);\n\n useEffect(() => {\n if (selectedUsers?.length === users?.count) {\n setIsSelectAll(true);\n }\n }, [users?.count, selectedUsers]);\n\n useEffect(() => {\n Promise.resolve().then(() => {\n setSelectedUsers([]);\n setIsSelectAll(false);\n });\n }, [users]);\n\n useEffect(() => {\n return () => setSelectedUsers([]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * @function handleToggleLabels\n * @param { itemId } number\n * @returns { void }\n */\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { UserV2 } row\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (row: UserV2): boolean => {\n return labelsOpen === row?.id;\n };\n \n useSessionEffect(() => {\n if (!profile?.companyId) return;\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchOverdueLearners({\n ...searchParams,\n companyId: profile?.companyId,\n labelIDs: selectedLabels,\n });\n }, [searchOverdueLearners, searchParams, profile?.companyId]);\n\n /**\n * @function teamsChangeHandler\n * @param { number[] } ids\n * @returns { void }\n */\n const teamsChangeHandler = (ids: number[]) => {\n setCustom('teamIds', ids);\n };\n\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: countAppliedFiltersCount(searchParams),\n itemsCount: users?.items?.length || 0,\n });\n\n /**\n * @function refreshData\n * @returns { void }\n */\n const refreshData = useCallback(() => {\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n searchOverdueLearners({...searchParams, companyId: profile?.companyId});\n setLastRefreshed(new Date());\n setSelectedUsers([]);\n setIsSelectAll(false);\n }, [initialOffset, searchParams, searchOverdueLearners, profile?.companyId]);\n\n const nudgeUsersBulkActionService = useNudgeUsersBulkActionService(\n 'overdue',\n {\n companyId: profile?.companyId ?? 0,\n },\n searchParams,\n users?.count ?? 0,\n refreshData\n );\n\n const onNudgeMultipleUsersSuccessCallback = useCallback(() => {\n setIsSelectAll(false);\n setSelectedUsers([]);\n }, [])\n\n /**\n * @function handleNudgeMultipleUsers\n * @returns { void }\n */\n const handleNudgeMultipleUsers = useCallback(\n (data: any) => {\n const { text, name: senderName } = data;\n \n if (isSelectAll) {\n nudgeUsersBulkActionService({ text: OverdueNudgeMessagePrefix + text, senderName });\n } else {\n if (selectedUsers) {\n const nudgeUsersDate = selectedUsers.map(\n user =>\n ({\n type: 'overdue',\n receiverId: user,\n enrollmentId: null,\n senderName,\n text: OverdueNudgeMessagePrefix + text,\n } as NudgeData)\n );\n\n nudgeTrainees(\n nudgeUsersDate,\n onNudgeMultipleUsersSuccessCallback\n );\n }\n }\n },\n [\n isSelectAll,\n nudgeUsersBulkActionService,\n selectedUsers,\n nudgeTrainees,\n onNudgeMultipleUsersSuccessCallback,\n ]\n );\n\n\n /**\n * @function handleViewProfile\n * @param { user } UserV2\n * @returns { void }\n */\n const handleViewProfile = (user: UserV2) => {\n history.push(\n ROUTES.USER_PERFORMANCE.replace(\n ':userId',\n user.id.toString()\n ),\n { useGoBack: true }\n );\n };\n\n /**\n * @function deleteLabelHandler\n * @param { number } labelId\n * @param { UserV2 } user\n * @returns { void }\n */\n const deleteLabelHandler = (labelId: number, user: UserV2): void => {\n deleteUserLabel(user.id, labelId, refreshData);\n };\n\n /**\n * @function selectAllHandler\n * @param { e } ChangeEvent<HTMLInputElement>\n * @returns { void }\n */\n const selectAllHandler: ChangeEventHandler<HTMLInputElement> = e => {\n if (\n users && users.count < ITEMS_PER_PAGE &&\n e.target.checked === true\n ) {\n setIsSelectAll(true);\n } else {\n setIsSelectAll(false);\n }\n\n const isCheckboxPartiallySelected =\n selectedUsers && users && selectedUsers.length < users.items.length;\n\n if (e.target.checked || isCheckboxPartiallySelected) {\n setSelectedUsers((users && users.items.map(item => item.id)) || []);\n } else {\n setSelectedUsers([]);\n }\n };\n\n /**\n * @function selectUserHandler\n * @returns { void }\n */\n const selectUserHandler = useCallback(\n (id: number, state: boolean) => {\n if (state) {\n setSelectedUsers(prevState => [...prevState, id]);\n } else {\n setSelectedUsers(prevState =>\n prevState.filter(item => item !== id)\n );\n }\n setIsSelectAll(false);\n },\n [setSelectedUsers]\n );\n\n /**\n * @function handleNudgeSingleUser\n * @returns { void }\n */\n const handleNudgeSingleUser = useCallback(\n (data: any) => {\n const { text, name: senderName } = data;\n if (showNudgeDialogMemberId) {\n const nudgeUserDate: NudgeData = {\n type: 'overdue',\n enrollmentId: null,\n receiverId: showNudgeDialogMemberId,\n senderName,\n text: OverdueNudgeMessagePrefix + text,\n };\n\n nudgeTrainees(\n [nudgeUserDate],\n onNudgeSingleUserSuccessCallback\n );\n }\n },\n [showNudgeDialogMemberId, nudgeTrainees]\n );\n\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'teams',\n }}\n >\n <WithTeamsContext.Provider\n value={{\n reducerName: 'teams',\n }}\n >\n <OverdueLearnersView\n profile={profile}\n users={users}\n tableStates={tableStates}\n searchParams={searchParams}\n loading={loading}\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n handlePageChange={setOffset}\n handleSearchChange={setSearchTerm}\n handleViewProfile={handleViewProfile}\n selectedLabels={selectedLabels}\n onLabelsFilterChange={saveGlobalLabelFilters}\n onTeamsFilterChange={teamsChangeHandler}\n onDeleteLabelHandler={deleteLabelHandler}\n onNudgeSingleUser={handleNudgeSingleUser}\n showNudgeDialogMemberId={showNudgeDialogMemberId}\n setShowNudgeDialogMemberId={(id: number | null) => setShowNudgeDialogMemberId(id)}\n selectedUsers={selectedUsers}\n sorting={{hcTeamName, hcUserName}}\n isSelectAll={isSelectAll}\n updateIsSelectAll={setIsSelectAll}\n updateSelectedUsers={setSelectedUsers}\n selectAllHandler={selectAllHandler}\n onSelectUser={selectUserHandler}\n teamsData={portableTeams.data}\n handleNudgeMultipleUsers={handleNudgeMultipleUsers}\n handleToggleLabels={handleToggleLabels}\n checkIsLabelTagsOpen={checkIsLabelTagsOpen}\n labelsOpen={labelsOpen}\n />\n </WithTeamsContext.Provider>\n </WithLabelsContext.Provider>\n );\n}\n\nexport default OverdueLearnersController;","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CheckCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.78 6.28a.75.75 0 0 0-1.06-1.06L6.75 9.19 5.28 7.72a.75.75 0 0 0-1.06 1.06l2 2a.75.75 0 0 0 1.06 0l4.5-4.5z\"\n fill=\"#15CBA9\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm1.5 0a6.5 6.5 0 1 1 13 0 6.5 6.5 0 0 1-13 0z\"\n fill=\"#15CBA9\"\n />\n </svg>\n );\n }\n);\n\nexport default CheckCircle;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Warning = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.47.22A.75.75 0 0 1 5 0h6a.75.75 0 0 1 .53.22l4.25 4.25c.141.14.22.331.22.53v6a.75.75 0 0 1-.22.53l-4.25 4.25A.75.75 0 0 1 11 16H5a.75.75 0 0 1-.53-.22L.22 11.53A.75.75 0 0 1 0 11V5a.75.75 0 0 1 .22-.53L4.47.22zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5H5.31zM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\"\n fill=\"#EC513D\"\n />\n </svg>\n );\n }\n);\n\nexport default Warning;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Saving = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#xvo0q78pwa)\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"m14.357 3.143 1.216-1.216a.25.25 0 0 1 .427.177V5.75a.25.25 0 0 1-.25.25h-3.646a.25.25 0 0 1-.177-.427l1.358-1.358a6.5 6.5 0 1 0 1.18 4.458.75.75 0 0 1 1.493.154 8.001 8.001 0 1 1-1.6-5.684z\"\n fill=\"#6D7F8C\"\n />\n </g>\n <defs>\n <clipPath id=\"xvo0q78pwa\">\n <path\n fill=\"#fff\"\n transform=\"matrix(-1 0 0 1 16 0)\"\n d=\"M0 0h16v16H0z\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Saving;\n","import styled from 'styled-components';\n\nexport const StatusText = styled.div`\n font-size: 13px;\n font-weight: 500;\n color: var(--ps-grey-1);\n margin-right: 16px;\n`;\n\nexport const LastUpdatedText = styled(StatusText)`\n color: var(--ps-grey-2);\n font-weight: 400;\n`\n\nexport const StatusIcon = styled.div`\n margin-right: 4px;\n`","import CheckCircle from '../../../../../../ui/icons/CheckCircle';\nimport Warning from '../../../../../../ui/icons/Warning';\nimport Saving from '../../../../../../ui/icons/Saving';\nimport { formatDate } from '../../../../../../helpers/functions/date-convert';\nimport { TeamUpdateStatus } from '../../../../store/states';\nimport { UpdateStatusViewProps } from './types';\nimport {\n StatusText,\n LastUpdatedText,\n StatusIcon\n} from './styles';\n\nfunction UpdateStatusView({\n updateStatus,\n lastUpdated\n}: UpdateStatusViewProps) {\n switch(updateStatus) {\n case TeamUpdateStatus.IN_PROGRESS:\n return <>\n <StatusIcon data-test=\"team-saving-changes-icon\"><Saving /></StatusIcon>\n <StatusText data-test=\"team-saving-changes-text\">Saving Changes...</StatusText>\n </>;\n case TeamUpdateStatus.COMPLETED:\n return <>\n <StatusIcon data-test=\"team-changes-saved-icon\"><CheckCircle /></StatusIcon>\n <StatusText data-test=\"team-changes-saved-text\">Changes Saved</StatusText>\n </>;\n case TeamUpdateStatus.ERROR:\n return <>\n <StatusIcon data-test=\"team-changes-not-saved-icon\"><Warning /></StatusIcon>\n <StatusText data-test=\"team-changes-not-saved-text\">Changes weren't saved. Try it again.</StatusText>\n </>;\n default:\n if (!lastUpdated)\n return <></>;\n return <LastUpdatedText data-test='team-timestamp'>\n Last Updated {formatDate(lastUpdated)}\n </LastUpdatedText>\n }\n}\n\nexport default UpdateStatusView;","import UpdateStatusView from './view';\n\nexport default UpdateStatusView;","import { FC } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { TeamUpdateStatus } from '../../../../store/states';\nimport UpdateStatus from '../UpdateStatus';\n\nconst StyledHeader = styled.div`\n display: flex;\n align-items: center;\n font-size: 24px;\n font-weight: bold;\n letter-spacing: 0.5px;\n height: 95px;\n color: ${props => props.theme.Colors.dark};\n flex-shrink: 0;\n`;\n\nconst StyledHeaderTitle = styled.div`\n flex: 1;\n min-width: 150px;\n font-size: 20px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n margin-left: 8px;\n`;\n\nconst HeaderActions = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Header: FC<{\n handleCancel: () => void;\n lastUpdated?: string;\n updateStatus?: TeamUpdateStatus\n}> = ({\n handleCancel,\n lastUpdated,\n updateStatus\n}) => {\n return (\n <StyledHeader>\n <StyledHeaderTitle data-test='team-page-title'>\n Manage Team\n </StyledHeaderTitle>\n <HeaderActions>\n <UpdateStatus\n updateStatus={updateStatus}\n lastUpdated={lastUpdated}\n ></UpdateStatus>\n <Button\n label={'Close'}\n variant={'inverse'}\n width={'128px'}\n action={handleCancel}\n dataTest='team-cancel'\n />\n </HeaderActions>\n </StyledHeader>\n );\n};\n\nexport default Header;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ConfirmCheckMark = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n d=\"m.98 9.024 4.044 4.04L15.099 2.996\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n );\n }\n);\n\nexport default ConfirmCheckMark;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CancelCross = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path\n d=\"m1.953 2.02 12 11.988M13.953 2.02l-12 11.988\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n );\n }\n);\n\nexport default CancelCross;\n","import styled from 'styled-components';\nimport { makeStyles } from '@material-ui/styles';\nimport { Input } from '../../../../../../ui/components/input';\n\nexport const useStyles = makeStyles(theme => ({\n disabledButton: {\n cursor: 'default!important',\n color: 'var(--ps-grey-2)!important'\n }\n}));\n\nexport const StyledInput = styled(Input)`\n padding: 12px 16px;\n font-size: 13px;\n font-weight: normal;\n border: ${props => props.error ? 'none' : '1px solid var(--ps-grey-3)'};\n border-radius: 4px;\n &:focus {\n border: ${props => props.error ? 'none' : '1px solid var(--ps-grey-2)'};\n }\n`;\n\nexport const InputWrapper = styled.div`\n flex: 1;\n height: 100%;\n border-radius: 4px;\n margin-right: 8px;\n`;\n\nconst ActionButton = styled.div`\n width: 40px;\n height: 40px;\n background: var(--ps-grey-3);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CancelButton = styled(ActionButton)`\n margin-right: 8px;\n color: var(--ps-red-main);\n`;\n\nexport const SaveButton = styled(ActionButton)`\n margin-right: 32px;\n color: var(--ps-green-main);\n`;\n","import ConfirmCheckMark from '../../../../../../ui/icons/ConfirmCheckMark';\nimport CancelCross from '../../../../../../ui/icons/CancelCross';\nimport { InputWithButtonsViewProps } from './types';\nimport {\n useStyles,\n StyledInput,\n InputWrapper,\n CancelButton,\n SaveButton\n} from './styles';\n\nfunction InputWithButtonsView(props: InputWithButtonsViewProps) {\n const {\n height,\n maxLength,\n placeholder,\n value,\n hasError,\n showButtons,\n isDisabled,\n isSaveDisabled,\n dataTest,\n onChange,\n onKeyDown,\n onFocus,\n onCancel,\n onSave\n } = props;\n const classes = useStyles();\n\n return <>\n <InputWrapper>\n <StyledInput\n height={height}\n maxLength={maxLength}\n placeholder={placeholder}\n value={value}\n error={hasError}\n disabled={isDisabled}\n dataTest={`${dataTest}-input`}\n handleChange={onChange}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n />\n </InputWrapper>\n {\n showButtons && (\n <>\n <CancelButton\n onClick={isDisabled ? undefined : onCancel}\n className={isDisabled ? classes.disabledButton : undefined}\n data-test={dataTest && `${dataTest}-cancel`}\n >\n <CancelCross />\n </CancelButton>\n <SaveButton\n onClick={isSaveDisabled ? undefined : onSave}\n className={isSaveDisabled ? classes.disabledButton : undefined}\n data-test={dataTest && `${dataTest}-save`}\n >\n <ConfirmCheckMark />\n </SaveButton>\n </>\n )\n }\n </>;\n}\n\nexport default InputWithButtonsView;","import { ChangeEvent, useEffect, useState } from 'react';\nimport {\n enterPressed,\n escPressed\n} from '../../../../../../helpers/functions/key-down-helpers';\nimport { InputWithButtonsProps } from './types';\nimport InputWithButtonsView from './view';\n\nfunction InputWithButtonsController({\n height,\n maxLength,\n placeholder,\n value,\n dataTest,\n onSave\n}: InputWithButtonsProps) {\n const [tempValue, setTempValue] = useState(value);\n const [showButtons, setShowButtons] = useState(false);\n const [isDisabled, setIsDisabled] = useState(false);\n const [hasError, setHasError] = useState(false);\n\n /**\n * @description handles input focus event\n * @function handleFocus\n * @returns { void }\n */\n const handleFocus = () => setShowButtons(true);\n\n /**\n * @description handles input value change\n * @function handleValueChange\n * @param { ChangeEvent<HTMLInputElement> } event\n * @returns { void }\n */\n const handleValueChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value;\n setTempValue(newValue);\n setHasError(false);\n }\n\n /**\n * @description checks if save action is disabled\n * @function isSaveDisabled\n * @returns { boolean }\n */\n const isSaveDisabled = () => !tempValue || isDisabled;\n\n /**\n * @description handles ENTER and ESC events on input key down\n * @function handleKeyDown\n * @param { KeyboardEvent } event\n * @returns { void }\n */\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.currentTarget as HTMLInputElement;\n if (enterPressed(event) && !isSaveDisabled()) {\n handleSave();\n target.blur();\n } else if (escPressed(event) && !isDisabled) {\n handleCancel();\n target.blur();\n }\n };\n\n /**\n * @description handles cancel action\n * @function handleCancel\n * @returns { void }\n */\n const handleCancel = () => {\n Promise.resolve().then(() => {\n setShowButtons(false);\n setTempValue(value);\n setHasError(false);\n });\n }\n\n /**\n * @description handles save action\n * @function handleSave\n * @returns { void }\n */\n const handleSave = () => {\n if (tempValue !== value) {\n Promise.resolve().then(() => {\n setIsDisabled(true);\n setHasError(false);\n });\n onSave(tempValue!)\n .then(() => {\n Promise.resolve().then(() => {\n setIsDisabled(false);\n setShowButtons(false);\n });\n })\n .catch(() => {\n Promise.resolve().then(() => {\n setIsDisabled(false);\n setHasError(true);\n });\n });\n } else {\n setShowButtons(false);\n }\n }\n\n useEffect(() => {\n setTempValue(value);\n }, [value]);\n \n return <InputWithButtonsView\n height={height}\n maxLength={maxLength}\n placeholder={placeholder}\n value={tempValue}\n hasError={hasError}\n dataTest={dataTest}\n showButtons={showButtons}\n isDisabled={isDisabled}\n isSaveDisabled={isSaveDisabled()}\n onChange={handleValueChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onCancel={handleCancel}\n onSave={handleSave}\n />\n}\n\nexport default InputWithButtonsController;","import InputWithButtonsController from './controller';\n\nexport default InputWithButtonsController;","import { FC, useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { TeamV2 } from '../../../../../../constants/interfaces/Team';\nimport { WithLabelsContext } from '../../../../../portableLabels';\nimport { Popup } from '../../../../../../ui/components/Popup';\nimport {\n useResetLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport {\n useCalculatePreSelectedLabelsForSingleItem,\n calculateAssignedLabels,\n calculateRemovedLabels,\n} from '../../../../../labels/tools';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport UpArrow from '../../../../../../ui/icons/UpArrow';\nimport DownArrow from '../../../../../../ui/icons/DownArrow';\nimport { AssignLabels } from '../../../../../portableLabels/templates/AssignLabels';\nimport { usePortableLabelsState } from '../../../../../portableLabels/store/states';\nimport InputWithButtons from '../InputWithButtons';\nimport { useGetSingleTeamService } from '../../../../store/services';\nimport { useAssignLabelsToTeamsApi, useDeleteLabelsFromTeamsApi } from '../../../../../../api';\nimport { useUpdateLabelsBulkActionService } from '../../../../../../services/GeneralBulkActionServices';\nimport { updateSingleTeamFailure, updateSingleTeamStart, updateSingleTeamSuccess } from '../../../../store/actions';\n\nconst StyledActions = styled.div`\n display: flex;\n align-items: center;\n height: 40px;\n box-sizing: content-box;\n margin: 16px 0;\n`;\n\nconst Tools = styled.div`\n height: 100%;\n width: 149px;\n`;\n\nconst AssignLabelsButton = styled.button<{\n open: boolean;\n selected: boolean;\n disabled: boolean;\n}>`\n position: relative;\n height: 100%;\n width: 100%;\n color: ${({ theme, disabled }) =>\n disabled ? theme.Colors.cloudyBlue : theme.Colors.steelGrey};\n background: ${props => props.theme.Colors.whiteFive};\n display: flex;\n align-items: center;\n padding-left: 16px;\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n border-radius: 4px;\n box-sizing: border-box;\n box-shadow: inset 0 0 0\n ${({ open, selected }) => (open || selected ? 1 : 0)}px\n ${({ theme }) => theme.Colors.cloudyBlue};\n border: none;\n`;\n\nconst IconHolder = styled.div`\n width: 8px;\n height: 100%;\n display: flex;\n position: absolute;\n right: 15px;\n top: 0;\n pointer-events: none;\n align-items: center;\n justify-content: center;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst StyledActionsTitle = styled.div`\n font-size: 13px;\n`;\n\nconst Actions: FC<{\n team?: TeamV2;\n handleUpdateTeamName: (value: string) => Promise<void>;\n}> = ({ team, handleUpdateTeamName }) => {\n const dispatch = useDispatch();\n\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const clearLabels = useResetLabels();\n const getPreSelectedLabels = useCalculatePreSelectedLabelsForSingleItem();\n const assignLabelsLocal = useSelectLabels();\n const saveLabels = useSaveLabels();\n const getSingleTeam = useGetSingleTeamService();\n const assignLabelsToTeam = useAssignLabelsToTeamsApi();\n const deleteLabelsFromTeam = useDeleteLabelsFromTeamsApi();\n\n /**\n * @function onSuccessUpdateLabelsCallback\n * @returns { void }\n */\n const onSuccessUpdateLabelsCallback = useCallback(() => {\n dispatch(updateSingleTeamSuccess());\n\n if (team?.id) {\n getSingleTeam(team.id);\n }\n }, [dispatch, getSingleTeam, team]);\n \n\n /**\n * @function onFailedUpdateLabelsCallback\n * @returns { void }\n */\n const onFailedUpdateLabelsCallback = useCallback(() => {\n dispatch(updateSingleTeamFailure());\n }, [dispatch]);\n \n\n /**\n * @function onStartUpdateLabelsCallback\n * @returns { void }\n */\n const onStartUpdateLabelsCallback = useCallback(() => {\n dispatch(updateSingleTeamStart());\n }, [dispatch]);\n\n const updateLabelsBulkActionService = useUpdateLabelsBulkActionService(\n assignLabelsToTeam,\n deleteLabelsFromTeam,\n onSuccessUpdateLabelsCallback,\n onFailedUpdateLabelsCallback,\n onStartUpdateLabelsCallback\n );\n\n /**\n * @function handleApplyLabels\n * @param { number[]} labelIds\n * @returns { void }\n */\n const handleApplyLabels = (labelIds: number[]) => {\n const deletedLabelIds = calculateRemovedLabels(labelIds, labels.saved);\n const assignedLabelIds = calculateAssignedLabels(\n labelIds,\n labels.saved\n );\n\n updateLabelsBulkActionService(\n {\n entityName: 'team',\n entityId: team?.id ?? 0,\n },\n assignedLabelIds,\n deletedLabelIds\n );\n };\n\n useEffect(() => {\n return () => {\n clearLabels();\n };\n }, [clearLabels]);\n\n useEffect(() => {\n if (team?.labels) {\n const preSelectedLabels = getPreSelectedLabels(\n team.labels,\n labelsList.data\n );\n\n assignLabelsLocal(preSelectedLabels);\n saveLabels();\n } else {\n assignLabelsLocal([]);\n }\n }, [\n assignLabelsLocal,\n getPreSelectedLabels,\n labelsList.data,\n saveLabels,\n team,\n ]);\n\n return (\n <StyledActions>\n <InputWithButtons\n height=\"40px\"\n maxLength={50}\n placeholder=\"Team Name\"\n value={team ? team.name : ''}\n dataTest=\"team-name\"\n onSave={handleUpdateTeamName}\n />\n <Tools>\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <AssignLabels\n onLabelsChange={handleApplyLabels}\n onSuccessApply={() => hide()}\n withBorder={true}\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <AssignLabelsButton\n ref={ref}\n onClick={toggleShown}\n open={shown}\n selected={labels.saved.length > 0}\n disabled={labelsList.data?.totalCount < 1}\n data-test=\"team-assign-labels\"\n >\n <StyledActionsTitle>\n <IconHolder>\n {shown ? <UpArrow /> : <DownArrow />}\n </IconHolder>\n Assign Labels\n </StyledActionsTitle>\n </AssignLabelsButton>\n )}\n </Popup>\n </Tools>\n </StyledActions>\n );\n};\n\nconst ActionsContainer: FC<{\n team?: TeamV2;\n handleUpdateTeamName: (value: string) => Promise<void>;\n}> = ({ team, handleUpdateTeamName }) => {\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'teamEdit',\n scope: 'assignTeamMembers',\n }}\n >\n <Actions team={team} handleUpdateTeamName={handleUpdateTeamName} />\n </WithLabelsContext.Provider>\n );\n};\n\nexport default ActionsContainer;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const AddArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 9 10\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g stroke=\"currentColor\">\n <g>\n <path\n d=\"M0 4L8 4\"\n transform=\"translate(-904 -835) translate(904 836)\"\n />\n <path\n d=\"M2 6L6 2 10 6\"\n transform=\"translate(-904 -835) translate(904 836) rotate(90 6 4)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default AddArrow;\n","import React, { FC, useCallback, useState, ChangeEvent, } from 'react';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport styled from 'styled-components';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport { PortableLabelsWithStore } from '../../../../../portableLabels';\nimport { useSaveLabels, useSelectLabels } from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { TeamMemberStatusEnum } from '../../../../../../constants/interfaces/TeamMember';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { Variables } from '../../../../../../theme/variables';\nimport { kebabCase } from 'lodash';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nconst StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n background-color: inherit;\n`;\n\nconst StatusItem = styled.div`\n margin-bottom: 8px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nexport const AllUsersFilter: FC<{\n onLabelsChange: (ids: number[]) => void;\n onSuccessApply: () => void;\n registrationStatus?: any;\n currentLabelIds?: number[];\n onRegistrationStatusChange?: (status: any) => void;\n}> = ({\n onLabelsChange,\n onSuccessApply,\n onRegistrationStatusChange,\n currentLabelIds,\n registrationStatus,\n}) => {\n const [labelIds, setLabelIds] = useState<number[]>(currentLabelIds ?? []);\n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n const labels = useLabelsState();\n\n const [registrationStatuses, setRegistrationStatuses] = useState<any>(\n registrationStatus || []\n );\n\n const onLabelChangeHandler = useCallback(\n (ids: number[]) => setLabelIds(ids),\n [setLabelIds]\n );\n\n const onApplyHandler = useCallback(() => {\n onLabelsChange(labelIds);\n onRegistrationStatusChange?.(registrationStatuses);\n saveLabels();\n onSuccessApply();\n }, [\n onLabelsChange,\n labelIds,\n onRegistrationStatusChange,\n registrationStatuses,\n saveLabels,\n onSuccessApply,\n ]);\n\n const onClearHandler = useCallback(() => {\n selectLabels([]);\n setLabelIds([]);\n setRegistrationStatuses([]);\n }, [selectLabels, setRegistrationStatuses]);\n\n const regStatusesMap: Record<any, { title: string }> = {\n [TeamMemberStatusEnum.PENDING]: { title: 'Pending' },\n [TeamMemberStatusEnum.ACTIVE]: { title: 'Active' },\n };\n\n const onRegistrationStatusChangeHandler = useCallback(\n (statusIn: TeamMemberStatusEnum, e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setRegistrationStatuses([...registrationStatuses, statusIn]);\n } else {\n setRegistrationStatuses(\n registrationStatuses.filter(\n (item: any) => item !== statusIn\n )\n );\n }\n },\n [setRegistrationStatuses, registrationStatuses]\n );\n\n const totalFiltersSelected =\n labels.selected.filter(id => id > 0).length +\n registrationStatuses?.length;\n\n const clearDisabled =\n !labels.selected.length && !registrationStatuses.length;\n\n return (\n <Container>\n <Wrapper>\n <Fieldset title={'Registration Status'} dataTest=\"registration-status-section\">\n <StatusContainer>\n {(\n Object.keys(\n regStatusesMap\n ) as TeamMemberStatusEnum[]\n ).map(item => (\n <StatusItem data-test=\"registration-status-item-container\">\n <Checkbox\n key={item}\n checked={\n registrationStatuses &&\n registrationStatuses.includes(item)\n }\n handleChange={e =>\n onRegistrationStatusChangeHandler(\n item,\n e\n )\n }\n label={regStatusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={`${kebabCase(regStatusesMap[item].title)}-checkbox`}\n />\n </StatusItem>\n ))}\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section\">\n <LabelsContainer>\n <PortableLabelsWithStore\n onSetSelected={onLabelChangeHandler}\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-selected-filters-text\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={clearDisabled}\n variant=\"inverse\"\n width={'122px'}\n action={onClearHandler}\n dataTest=\"clear-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={onApplyHandler}\n dataTest=\"apply-filter-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n useMemo,\n} from 'react';\nimport styled from 'styled-components';\nimport { isEmpty } from 'lodash';\n\nimport { useTeamEditState } from '../../../../store/states';\nimport {\n useSearchTeamsAllUsersService,\n useDeleteSingleTeamAllUsersLabelService,\n} from '../../../../store/services';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../../../constants/interfaces/filters';\nimport { useParams } from 'react-router';\nimport {\n UserProfile,\n UserV2,\n} from '../../../../../../constants/interfaces/User';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport { formatDate } from '../../../../../../helpers/functions/date-convert';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport AddArrow from '../../../../../../ui/icons/AddArrow';\nimport { ScrollPagination } from '../../../../../../ui/components/ScrollPagination';\nimport AvatarPlaceholder from '../../../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../pages/UserProfile/store/reducers';\nimport { pluralize } from '../../../../../../helpers/functions/pluralize';\nimport { WithLabelsContext } from '../../../../../portableLabels';\nimport FilterByHandler from '../../../../../../ui/components/Filters/FilterByHandler';\nimport { Popup } from '../../../../../../ui/components/Popup';\nimport { AllUsersFilter } from '../../components/Filters/AllUsersFilters';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport { useHandleSelectLabels } from '../../../../../labels/tools';\nimport { Label } from '../../../../../../constants/interfaces/Label';\nimport { listToTree } from '../../../../../../helpers/functions/list-to-tree';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport User from '../../../../../../ui/icons/User';\nimport {\n EmptyState,\n NoFilterResults,\n NoSearchResults,\n} from '../../../../../../ui/components/EmptyStates';\nimport { EmptyStateContainer } from '../../../../../../ui/components/EmptyStates/components/EmptyStateContainer';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { useUpdateUsersState } from '../../../../../users/store/states';\nimport { useSearchDebounced } from '../../../../../../helpers/hooks/useSearch';\nimport { usePortableLabelsState } from '../../../../../portableLabels/store/states';\nimport AssignedLabelList from '../../../../../../ui/components/table-wrapper/table/TableLabelTags/AssignedLabelList';\nimport { TableHeaderCell } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell';\nimport { TableDivider } from '../../../../../../ui/components/table-wrapper/table-divider';\nimport { TableRefresh } from '../../../../../../ui/components/table-wrapper/table-refresh';\nimport { TableHeaderCellProps } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/type';\nimport { TableStateValues } from '../../../../../../ui/components/table-wrapper';\nimport { SelectAll } from '../../../../../../ui/components/table-wrapper/SelectAll';\nimport { TableSearchInput } from '../../../../../../ui/components/table-wrapper/table-tools/table-search-input';\nimport {\n TableHead,\n TableToolsRight,\n} from '../../../../../../ui/components/Table';\nimport { TableToolItem } from '../../../../../../ui/components/table-wrapper/table-tools/table-tool-item';\nimport { TableHeaderFilter } from '../../../../../../ui/components/table-wrapper/table-header-filter';\nimport { TableRow } from '../../../../../../ui/components/table-wrapper/table/table-row';\nimport { TableLabelTags } from '../../../../../../ui/components/table-wrapper/table/TableLabelTags';\nimport TableTitleOverflowText from '../../../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\nimport { EmptyCellDash } from '../../../../../../ui/components/table-wrapper/table/EmptyCellDash';\nimport { useOrderBy } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { useTableStateHelper } from '../../../../../../ui/components/table-wrapper/helper';\nimport {\n useAssignMembersToTeamService,\n useUpdateTeamMembersBulkActionService,\n} from '../../../../services/TeamBulkActionsService';\nimport { AllUsersContainerProps, AllUsersExternalInterface } from './types';\nimport { UPDATE_TEAM_ACTION } from '../../../../services/TeamBulkActionsService/constants';\nimport { useUserRolesState } from '../../../../../roles/store/states';\nimport { ROLE_NAMES } from '../../../../../../constants/enums';\n\nconst Container = styled.div`\n padding: 15px 24px;\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 ${props => props.theme.Colors.blackTwo5};\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n flex-direction: column;\n overflow: auto;\n`;\n\nconst Header = styled.div`\n margin-bottom: 2px;\n`;\n\nconst Title = styled.div`\n font-size: 15px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n height: 24px;\n margin-bottom: 6px;\n`;\n\nconst Counter = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n height: 16px;\n text-align: right;\n`;\n\nconst TableTools = styled.div`\n display: flex;\n justify-content: stretch;\n align-items: stretch;\n padding: 8px 0;\n padding-right: 16px;\n position: relative;\n`;\n\nconst TableContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n`;\n\nconst Table = styled.table`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n padding-right: 16px;\n`;\n\nconst TableBody = styled.div<{ showHeight?: boolean }>`\n display: flex;\n flex-direction: column;\n flex: ${props => (props.showHeight ? '1' : '0')};\n min-height: ${props => (props.showHeight ? '100px' : '0')};\n overflow: auto;\n`;\n\nconst StyledTablePagination = styled(ScrollPagination)`\n width: 100%;\n`;\n\nconst ListCell = styled.div<{ flex?: number }>`\n ${props => props.flex && `flex: ${props.flex};`}\n display: flex;\n align-items: center;\n height: 48px;\n font-size: 13px;\n`;\n\nconst ListRow = styled.div<{\n selected?: boolean;\n disabled?: boolean;\n}>`\n display: flex;\n border-radius: 4px;\n background: ${props =>\n props.selected ? props.theme.Colors.whiteFive : 'unset'};\n ${ListCell} {\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n }\n margin-right: 12px;\n &:hover {\n background: var(--ps-grey-3);\n }\n`;\n\nconst TableCheckboxCell = styled(TableHeaderCell)`\n padding: 4px 12px 4px 4px;\n`;\n\nconst ListCheckboxCell = styled.div`\n height: 48px;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 8px;\n`;\n\nconst ManageUsersSection = styled.div`\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst ManageUsersButton = styled.div<{ disabled?: boolean }>`\n font-size: 13px;\n font-weight: 600;\n color: ${props =>\n props.disabled\n ? props => props.theme.Colors.cloudyBlue\n : props => props.theme.Colors.skyBlueTwo};\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n display: flex;\n user-select: none;\n &:active {\n opacity: ${props => (props.disabled ? '1' : '0.7')};\n }\n`;\n\nconst AddArrowIcon = styled.div`\n color: inherit;\n height: 9px;\n width: 9px;\n margin-left: 8px;\n`;\n\nconst StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n width: 100%;\n`;\n\nconst AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nconst Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n`;\n\nconst StyledAssignedLabelList = styled(AssignedLabelList)`\n padding-left: 28px;\n`;\n\nconst SearchContainer = styled.div`\n flex: 1;\n`;\n\nconst LabelsContainer = styled.div`\n height: 40px;\n width: 40px;\n margin-left: 8px;\n`;\n\nconst LastTrainingAtCell = styled(ListCell)`\n text-align: left;\n width: 111px;\n`;\n\nconst FilteredByLabelsContainer = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst ItemCount = styled.p`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 13px;\n padding: 0;\n margin: 0;\n`;\n\nconst AllUsers: FC<{\n users?: ListResult<UserV2>;\n profile?: UserProfile;\n searchTerm?: string;\n searchParams: SearchParams;\n setSearchTerm: (searchTerm: string) => void;\n orderByUserName: Partial<TableHeaderCellProps>;\n orderByLastTrainingAt: Partial<TableHeaderCellProps>;\n selectedUsers: number[];\n isSelectAll: boolean;\n onSelectUser: (id: number) => void;\n onSelectAllLoadedUsers: (selected: boolean) => void;\n onSelectAll: (selected: boolean) => void;\n setOffset: (offset: number) => void;\n labelIDs: number[];\n setLabelIDs: (labelIds: number[]) => void;\n totalCount: number;\n labelsOpen?: number | null;\n checkboxDisabled: boolean;\n handleToggleLabels: (open: number) => void;\n tableStates: TableStateValues;\n registrationStatusHandler?: (status: string[]) => void;\n deleteUserLabel: (userId: number, labelId: number) => void;\n clearAllUsers: () => void;\n onSuccessAddUsersBulkActionCallback: () => void;\n lastRefreshed: Date;\n refreshData: () => void;\n roleIDs?: number[];\n dataTest: string;\n}> = ({\n users,\n profile,\n setSearchTerm,\n searchParams,\n orderByUserName,\n orderByLastTrainingAt,\n selectedUsers,\n isSelectAll,\n onSelectUser,\n onSelectAllLoadedUsers,\n onSelectAll,\n setOffset,\n labelIDs,\n setLabelIDs,\n totalCount,\n labelsOpen,\n checkboxDisabled,\n handleToggleLabels,\n tableStates,\n deleteUserLabel,\n registrationStatusHandler,\n clearAllUsers,\n onSuccessAddUsersBulkActionCallback,\n lastRefreshed,\n refreshData,\n roleIDs,\n dataTest,\n}) => {\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const labelsTree = listToTree(labelsList.data.items);\n const handleSelectLabels = useHandleSelectLabels();\n const ifLabelsChanged = useIfChanged(labelIDs);\n\n const onRemoveLabel = (label: Label) => {\n setLabelIDs(handleSelectLabels(label, labelIDs, labelsTree));\n };\n const [registrationFilters, setRegistrationFilters] = useState<string[]>(\n []\n );\n\n const assignMembersToTeamService = useAssignMembersToTeamService();\n\n const assignMembersToTeamServiceOptions = {\n parameters: {\n teamId: +(searchParams?.teamId ?? 0),\n searchParams: {\n ...searchParams,\n roleIDs,\n limit: ITEMS_PER_PAGE,\n offset: (isSelectAll ? totalCount : selectedUsers?.length) ?? 0,\n },\n selectedItemIds: !isSelectAll ? selectedUsers : undefined,\n itemsCount: selectedUsers?.length ?? 0,\n },\n fieldName: !isSelectAll ? 'selectedItemIds' : 'searchParams.offset',\n };\n\n /**\n * @function addMembersToTeamSuccessCallback\n * @returns { void }\n */\n const addMembersToTeamSuccessCallback = useCallback(() => {\n Promise.resolve().then(() => {\n clearAllUsers();\n refreshData();\n onSuccessAddUsersBulkActionCallback();\n });\n }, [clearAllUsers, onSuccessAddUsersBulkActionCallback, refreshData]);\n\n const {\n handleStartBulkActionService: handleStartAddMembersToTeamBulkAction,\n } = useUpdateTeamMembersBulkActionService(\n {\n actionName: UPDATE_TEAM_ACTION,\n actionFunction: assignMembersToTeamService,\n actionFunctionOptions: assignMembersToTeamServiceOptions,\n },\n 'Adding Users',\n addMembersToTeamSuccessCallback\n );\n\n /**\n * @function handleAddMembersToTeam\n * @returns { void }\n */\n const handleAddMembersToTeam = useCallback(() => {\n handleStartAddMembersToTeamBulkAction();\n }, [handleStartAddMembersToTeamBulkAction]);\n\n useEffect(() => {\n return () => clearAllUsers();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (ifLabelsChanged) {\n setSelectLabels(labelIDs);\n saveLabels();\n }\n }, [labelIDs, ifLabelsChanged, setSelectLabels, saveLabels]);\n\n //TODO: Refactor/remove from every page\n const handleAssignedLabelDelete = (labelId: number, userId: number) => {\n deleteUserLabel(userId, labelId);\n };\n\n const scrollableRef = useRef<HTMLDivElement>(null);\n\n /**\n * @function isUserSelected\n * @param { UserV2 } user\n * @returns { boolean }\n */\n const isUserSelected = (user: UserV2): boolean =>\n selectedUsers.includes(user.id);\n\n return (\n <Container>\n <Header>\n <Title data-test={`${dataTest}-title`}>All Users</Title>\n <Counter />\n </Header>\n <Header>\n <TableRefresh\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n dataTest={`${dataTest}-timestamp`}\n top={-20}\n fontSize={11}\n />\n </Header>\n <TableDivider />\n <TableTools>\n {users && (\n <SelectAll\n style={{\n width: '100%',\n height: 60,\n marginTop: -10,\n }}\n isSelectAll={isSelectAll}\n selectedLength={selectedUsers.length}\n totalCount={totalCount}\n itemsPerPage={ITEMS_PER_PAGE}\n onClearSelecion={() => {\n clearAllUsers();\n }}\n onSelectAll={() => {\n onSelectAllLoadedUsers(true);\n onSelectAll(true);\n }}\n dataTest={dataTest}\n >\n <span></span>\n </SelectAll>\n )}\n <SearchContainer>\n <TableSearchInput\n onChange={setSearchTerm}\n disabled={tableStates.disableSearch}\n />\n </SearchContainer>\n <LabelsContainer>\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <AllUsersFilter\n onLabelsChange={setLabelIDs}\n onSuccessApply={() => hide()}\n currentLabelIds={labelIDs}\n registrationStatus={registrationFilters}\n onRegistrationStatusChange={(\n values: string[]\n ) => {\n setRegistrationFilters(values);\n registrationStatusHandler?.(values);\n }}\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n disabled={\n tableStates.disableFilters ||\n !labelsList.data.items.length\n }\n toggleOpen={toggleShown}\n filtersCount={\n labelIDs.length + registrationFilters.length\n }\n dataTest={`${dataTest}-filters`}\n />\n )}\n </Popup>\n </LabelsContainer>\n <TableToolsRight>\n <TableToolItem>\n <ItemCount\n data-test={`${dataTest}-counter`}\n >{`${totalCount} ${\n totalCount === 1 ? 'Item' : 'Items'\n }`}</ItemCount>\n </TableToolItem>\n </TableToolsRight>\n </TableTools>\n <TableDivider />\n <TableContainer>\n {labelIDs && (\n <FilteredByLabelsContainer>\n <TableHeaderFilter\n selectedLabels={labelIDs}\n onRemoveLabel={\n labels.saved.length > 0\n ? onRemoveLabel\n : undefined\n }\n />\n </FilteredByLabelsContainer>\n )}\n <Table>\n <TableHead>\n <TableRow>\n <TableCheckboxCell\n dataTest={`${dataTest}-column-checkbox`}\n >\n <Checkbox\n checked={!!selectedUsers.length}\n size={12}\n partial={!isSelectAll}\n handleChange={e => {\n onSelectAllLoadedUsers(\n e.target.checked\n );\n onSelectAll(false);\n }}\n disabled={checkboxDisabled}\n />\n </TableCheckboxCell>\n <TableHeaderCell\n {...orderByUserName}\n width={88}\n disabled={tableStates.disableSorting}\n dataTest={`${dataTest}-column-users`}\n >\n Users\n </TableHeaderCell>\n <TableHeaderCell\n {...orderByLastTrainingAt}\n disabled={tableStates.disableSorting}\n dataTest={`${dataTest}-column-last-training`}\n >\n Last Training\n </TableHeaderCell>\n </TableRow>\n </TableHead>\n </Table>\n\n <TableBody\n ref={scrollableRef}\n showHeight={!tableStates.showEmptyState}\n >\n {!tableStates.showEmptyState && (\n <StyledTablePagination\n itemsPerPage={ITEMS_PER_PAGE}\n itemCount={users ? users.items.length : 0}\n totalCount={totalCount}\n onOffsetChange={setOffset}\n scrollableRef={scrollableRef}\n >\n {users?.items.map(user => {\n return (\n <React.Fragment key={user.id}>\n <ListRow\n selected={isUserSelected(user)}\n data-test={`${dataTest}-item`}\n >\n <ListCheckboxCell>\n <Checkbox\n checked={isUserSelected(\n user\n )}\n size={12}\n handleChange={() => {\n onSelectUser(user.id);\n }}\n dataTest={`${dataTest}-item-checkbox`}\n />\n </ListCheckboxCell>\n <ListCell flex={38}>\n <StyledFirstTableContent>\n <TableLabelTags\n open={\n labelsOpen ===\n user.id\n }\n toggleOpen={() =>\n handleToggleLabels(\n user.id\n )\n }\n selectedLabels={\n user.labels\n }\n dataTest={`${dataTest}-item-labels`}\n />\n <AvatarTile>\n <Avatar\n profile={user}\n size=\"sm\"\n dataTest={`${dataTest}-item-avatar`}\n />\n <TableTitleOverflowText\n isCurrent={\n profile &&\n profile.id ===\n user.id\n }\n dataTest={`${dataTest}-item-name`}\n minWidth=\"auto\"\n >\n {`${user.firstName} ${user.lastName}`}\n </TableTitleOverflowText>\n </AvatarTile>\n </StyledFirstTableContent>\n </ListCell>\n <LastTrainingAtCell\n data-test={`${dataTest}-item-last-training`}\n >\n {user.lastActivity ? (\n formatDate(\n user.lastActivity\n )\n ) : (\n <EmptyCellDash />\n )}\n </LastTrainingAtCell>\n </ListRow>\n {labelsOpen === user.id && (\n <StyledAssignedLabelList\n selectedLabels={user.labels}\n deletePermissions={[\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\n ]}\n onDeleteLabel={(labelId: any) =>\n handleAssignedLabelDelete(\n labelId,\n user.id\n )\n }\n />\n )}\n </React.Fragment>\n );\n })}\n </StyledTablePagination>\n )}\n </TableBody>\n {tableStates.showEmptyState && (\n <EmptyStateContainer>\n {tableStates.showNoEntriesState && (\n <EmptyState\n icon={User}\n dataTest={`${dataTest}-no-entries`}\n >\n No Users Yet\n </EmptyState>\n )}\n {tableStates.showNoSearchResultsState && (\n <NoSearchResults\n entityName={'Users'}\n dataTest={`${dataTest}-no-search-results`}\n />\n )}\n {tableStates.showNoFilterResultsState && (\n <NoFilterResults\n dataTest={`${dataTest}-no-filter-results`}\n />\n )}\n </EmptyStateContainer>\n )}\n </TableContainer>\n <TableDivider />\n <ManageUsersSection>\n <ManageUsersButton\n disabled={selectedUsers.length < 1}\n onClick={handleAddMembersToTeam}\n data-test=\"all-users-add-selected\"\n >\n {selectedUsers.length > 0\n ? `Add ${pluralize(\n isSelectAll ? totalCount : selectedUsers.length,\n 'Selected User'\n )}`\n : 'Add Selected Users'}\n <AddArrowIcon>\n <AddArrow />\n </AddArrowIcon>\n </ManageUsersButton>\n </ManageUsersSection>\n </Container>\n );\n};\n\nconst ITEMS_PER_PAGE = 20;\nconst NEW_TEAM_ID = 'new';\n\nconst AllUsersContainer = forwardRef(\n ({ onSuccessAddUsersBulkActionCallback }: AllUsersContainerProps, ref) => {\n const params: { teamId: string } = useParams();\n const teamEditState = useTeamEditState();\n const profile = useSelector(getProfileState);\n const searchTeamAllUsers = useSearchTeamsAllUsersService();\n const searchTeamAllUsersDebounced =\n useSearchDebounced(searchTeamAllUsers);\n const teamId = params.teamId;\n const handleTableStates = useTableStateHelper();\n const deleteUserLabel = useDeleteSingleTeamAllUsersLabelService(teamId);\n const updatedUsersState = useUpdateUsersState();\n const roles = useUserRolesState();\n\n const roleIDs = useMemo(() => {\n if (!roles.list?.length) return undefined;\n return [\n ROLE_NAMES.USER,\n ROLE_NAMES.TEAM_LEADER,\n ROLE_NAMES.COMPANY_ADMIN\n ].map(roleName => roles.list.find(role => role.name === roleName)!.id);\n }, [roles.list]);\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n teamId: teamId !== NEW_TEAM_ID ? teamId : undefined,\n filters: [],\n orderBy: { field: 'name', asc: true },\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n setCustom,\n } = useSearchParamsState(initialSearchParams);\n\n useEffect(() => {\n if (!roleIDs) return;\n searchTeamAllUsersDebounced({\n ...searchParams,\n roleIDs\n });\n }, [\n searchParams,\n searchTeamAllUsersDebounced,\n teamId,\n updatedUsersState.data,\n roleIDs\n ]);\n\n const orderBy = searchParams.orderBy;\n const orderByUserName = useOrderBy('name', orderBy, setOrderBy);\n const orderByLastTrainingAt = useOrderBy(\n 'date_login',\n orderBy,\n setOrderBy\n );\n\n const [selectedUsers, setSelectedUsers] = useState<number[]>([]);\n const [isSelectAll, setIsSelectAll] = useState(false);\n const userItems = useMemo(\n () => (teamEditState.allUsers ? teamEditState.allUsers.items : []),\n [teamEditState.allUsers]\n );\n const totalCount = teamEditState.allUsers?.count ?? 0;\n const checkboxDisabled = userItems.length < 1;\n const isPartiallySelected = selectedUsers.length < userItems.length;\n\n /**\n * @function handleSelectUser\n * @param { number } id\n * @returns { void }\n */\n const handleSelectUser = (id: number) => {\n const newSelectedUsers = selectedUsers.includes(id)\n ? selectedUsers.filter(userId => userId !== id)\n : selectedUsers.concat(id);\n setSelectedUsers(newSelectedUsers);\n setIsSelectAll(false);\n };\n /**\n * @function handleSelectAllLoadedUsers\n * @param { boolean } selected\n * @returns { void }\n */\n const handleSelectAllLoadedUsers = (selected: boolean) => {\n setSelectedUsers(\n selected || isPartiallySelected\n ? userItems.map(item => item.id)\n : []\n );\n };\n /**\n * @function clearAllUsers\n * @returns { void }\n */\n const clearAllUsers = () => {\n setSelectedUsers([]);\n setIsSelectAll(false);\n };\n\n useEffect(() => {\n if (\n !isSelectAll &&\n selectedUsers.length === totalCount &&\n totalCount > 0\n ) {\n setIsSelectAll(true);\n }\n }, [isSelectAll, totalCount, selectedUsers]);\n\n useEffect(() => {\n if (\n isSelectAll &&\n !isEmpty(selectedUsers) &&\n selectedUsers.length < userItems.length\n ) {\n setSelectedUsers(userItems.map(item => item.id));\n }\n }, [isSelectAll, selectedUsers, userItems]);\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const registrationStatusHandler = (values: string[]) => {\n setCustom('filters', [\n {\n field: 'status',\n value: values,\n },\n ]);\n };\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n /**\n * @description reloads data with the same search params and updates last refreshed date to the current date/time\n * @function refreshData\n * @returns { void }\n */\n const refreshData = useCallback(() => {\n searchTeamAllUsersDebounced(\n {\n ...searchParams,\n limit: ITEMS_PER_PAGE + searchParams.offset,\n offset: 0,\n roleIDs\n },\n true\n );\n setLastRefreshed(new Date());\n }, [searchTeamAllUsersDebounced, searchParams, roleIDs]);\n useImperativeHandle<any, AllUsersExternalInterface>(ref, () => ({\n refreshData,\n }));\n\n const registrationsStatusLength: any = searchParams.filters?.length;\n\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n searchParams.labelIDs?.length + registrationsStatusLength,\n itemsCount: totalCount,\n });\n\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'teamEdit',\n scope: 'allUsers',\n }}\n >\n <AllUsers\n users={teamEditState.allUsers}\n profile={profile}\n searchTerm={searchParams.searchTerm}\n setSearchTerm={setSearchTerm}\n orderByUserName={orderByUserName}\n orderByLastTrainingAt={orderByLastTrainingAt}\n selectedUsers={selectedUsers}\n isSelectAll={isSelectAll}\n onSelectUser={handleSelectUser}\n onSelectAllLoadedUsers={handleSelectAllLoadedUsers}\n onSelectAll={setIsSelectAll}\n setOffset={setOffset}\n labelIDs={searchParams.labelIDs || []}\n setLabelIDs={setLabelIDs}\n totalCount={totalCount}\n labelsOpen={labelsOpen}\n checkboxDisabled={checkboxDisabled}\n handleToggleLabels={handleToggleLabels}\n tableStates={tableStates}\n deleteUserLabel={deleteUserLabel}\n searchParams={searchParams}\n registrationStatusHandler={registrationStatusHandler}\n clearAllUsers={clearAllUsers}\n onSuccessAddUsersBulkActionCallback={\n onSuccessAddUsersBulkActionCallback\n }\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n roleIDs={roleIDs}\n dataTest=\"team-all-users\"\n />\n </WithLabelsContext.Provider>\n );\n }\n);\n\n\nexport default AllUsersContainer;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Crown = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 14 12\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <path\n d=\"M12.19 9.53V12H1.8V9.53h10.39zm-.897.89H2.695v.69h8.598v-.69zM7 0c.808 0 1.464.65 1.464 1.453 0 .363-.134.694-.355.949L9.58 4.66l1.494-.746c.02-.786.667-1.418 1.463-1.418.809 0 1.464.651 1.464 1.454 0 .74-.558 1.352-1.28 1.442l-.585 3.432H1.865L1.28 5.392C.558 5.302 0 4.691 0 3.95c0-.803.655-1.454 1.464-1.454.808 0 1.463.651 1.463 1.454l-.002-.037 1.463.73 1.464-2.288c-.198-.248-.316-.561-.316-.902C5.536.651 6.192 0 7 0zm-.405 2.85L4.71 5.8l-2.043-1.02c-.13.186-.302.34-.503.448l.472 2.708h8.73l.474-2.707c-.201-.109-.374-.263-.505-.449L9.263 5.813 7.344 2.867c-.11.026-.225.04-.344.04-.14 0-.276-.02-.405-.056zm5.941.536c-.313 0-.567.252-.567.564 0 .311.254.564.567.564.314 0 .568-.253.568-.564 0-.312-.254-.564-.568-.564zm-11.072 0c-.314 0-.568.252-.568.564 0 .311.254.564.568.564.313 0 .567-.253.567-.564 0-.312-.254-.564-.567-.564zM7 .89c-.314 0-.568.252-.568.563 0 .312.254.564.568.564.314 0 .568-.252.568-.564 0-.311-.254-.563-.568-.563z\"\n transform=\"translate(-1214 -532) translate(985.875 526) translate(228.125 6)\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Crown;\n","export const totalTeamMembersCountText = (\n listCount: number,\n unsavedListCount: number\n) => {\n const totalCount = listCount + unsavedListCount;\n\n if (totalCount < 1) {\n return 'No Members';\n } else if (totalCount === 1) {\n return '1 Member';\n } else {\n return `${totalCount} Members`;\n }\n};\n\n/**\n * @function handleGenerateTeamLeadersCountText\n * @param { number } leadersCount\n * @returns { string }\n */\nexport const handleGenerateTeamLeadersCountText = (\n leadersCount: number\n): string => {\n if (!leadersCount || leadersCount < 1) {\n return 'No Team Leaders';\n } else if (leadersCount === 1) {\n return '1 Team Leader';\n } else {\n return `${leadersCount} Team Leaders`;\n }\n};","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n useMemo\n} from 'react';\nimport styled from 'styled-components';\nimport { isEmpty } from 'lodash';\nimport { useParams } from 'react-router';\nimport { useTeamEditState } from '../../../../store/states';\nimport {\n useSearchSingleTeamMembersService,\n useTogglePromoteTeamLeader,\n useDeleteSingleTeamMemberLabelService,\n} from '../../../../store/services';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport { UserProfile } from '../../../../../../constants/interfaces/User';\nimport { TeamMember } from '../../../../../../constants/interfaces/TeamMember';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { ScrollPagination } from '../../../../../../ui/components/ScrollPagination';\nimport SwitchToggle from '../../../../../../ui/components/SwitchToggle/SwitchToggle';\nimport Crown from '../../../../../../ui/icons/Crown';\nimport AvatarPlaceholder from '../../../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../pages/UserProfile/store/reducers';\nimport { handleGenerateTeamLeadersCountText } from '../../tools';\nimport { pluralize } from '../../../../../../helpers/functions/pluralize';\nimport { WithLabelsContext } from '../../../../../portableLabels';\nimport FilterByHandler from '../../../../../../ui/components/Filters/FilterByHandler';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { Popup } from '../../../../../../ui/components/Popup';\nimport { AllUsersFilter } from '../../components/Filters/AllUsersFilters';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\n\nimport { listToTree } from '../../../../../../helpers/functions/list-to-tree';\nimport { useHandleSelectLabels } from '../../../../../labels/tools';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { Label } from '../../../../../../constants/interfaces/Label';\nimport { EmptyStateContainer } from '../../../../../../ui/components/EmptyStates/components/EmptyStateContainer';\nimport {\n EmptyState,\n NoFilterResults,\n NoSearchResults,\n} from '../../../../../../ui/components/EmptyStates';\nimport User from '../../../../../../ui/icons/User';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { useUpdateUsersState } from '../../../../../users/store/states';\nimport { useSearchDebounced } from '../../../../../../helpers/hooks/useSearch';\nimport { usePortableLabelsState } from '../../../../../portableLabels/store/states';\nimport { TableHeaderCell } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell';\nimport AssignedLabelList from '../../../../../../ui/components/table-wrapper/table/TableLabelTags/AssignedLabelList';\nimport { TableHeaderCellProps } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/type';\nimport { TableStateValues } from '../../../../../../ui/components/table-wrapper';\nimport { TableDivider } from '../../../../../../ui/components/table-wrapper/table-divider';\nimport { TableLabelTags } from '../../../../../../ui/components/table-wrapper/table/TableLabelTags';\nimport TableTitleOverflowText from '../../../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\nimport {\n TableHead,\n TableToolsRight,\n} from '../../../../../../ui/components/Table';\nimport { TableToolItem } from '../../../../../../ui/components/table-wrapper/table-tools/table-tool-item';\nimport { TableHeaderFilter } from '../../../../../../ui/components/table-wrapper/table-header-filter';\nimport { TableRow } from '../../../../../../ui/components/table-wrapper/table/table-row';\nimport { TableSearchInput } from '../../../../../../ui/components/table-wrapper/table-tools/table-search-input';\nimport { SelectAll } from '../../../../../../ui/components/table-wrapper/SelectAll';\nimport { useTableStateHelper } from '../../../../../../ui/components/table-wrapper/helper';\nimport { useOrderBy } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { TableRefresh } from '../../../../../../ui/components/table-wrapper/table-refresh';\nimport {\n useDeleteMembersFromTeamService,\n useUpdateTeamMembersBulkActionService,\n} from '../../../../services/TeamBulkActionsService';\nimport {\n TeamMembersContainerProps,\n TeamMembersExternalInterface,\n} from './types';\nimport { UPDATE_TEAM_ACTION } from '../../../../services/TeamBulkActionsService/constants';\n\nconst Container = styled.div`\n padding: 14px 23px;\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 ${props => props.theme.Colors.blackTwo5};\n border: solid 2px ${props => props.theme.Colors.darkSkyBlue};\n display: flex;\n flex-direction: column;\n overflow: auto;\n`;\n\nconst Header = styled.div`\n margin-bottom: 2px;\n`;\n\nconst Title = styled.div`\n font-size: 15px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n height: 24px;\n margin-bottom: 6px;\n`;\n\nconst Counter = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n height: 16px;\n text-align: left;\n`;\n\nconst TableTools = styled.div`\n display: flex;\n justify-content: stretch;\n align-items: stretch;\n padding: 8px 0;\n padding-right: 16px;\n position: relative;\n`;\n\nconst TableContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n`;\n\nconst Table = styled.table`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n padding-right: 16px;\n`;\n\nconst TableBody = styled.div<{ showHeight?: boolean }>`\n display: flex;\n flex-direction: column;\n flex: ${props => (props.showHeight ? '1' : '0')};\n min-height: ${props => (props.showHeight ? '100px' : '0')};\n overflow: auto;\n`;\n\nconst StyledTablePagination = styled(ScrollPagination)`\n width: 100%;\n`;\n\nconst ListCell = styled.div<{ flex?: number }>`\n ${props => props.flex && `flex: ${props.flex};`}\n display: flex;\n align-items: center;\n height: 48px;\n font-size: 13px;\n`;\n\nconst TeamLeaderCell = styled(ListCell)`\n text-align: left;\n width: 110px;\n`;\n\nconst ListRow = styled.div<{\n selected?: boolean;\n disabled?: boolean;\n}>`\n display: flex;\n border-radius: 4px;\n background: ${props =>\n props.selected ? props.theme.Colors.whiteFive : 'unset'};\n ${ListCell} {\n color: ${props =>\n props.disabled\n ? props.theme.Colors.cloudyBlue\n : props.theme.Colors.black};\n }\n margin-right: 12px;\n &:hover {\n background: var(--ps-grey-3);\n }\n`;\n\nconst TableCheckboxCell = styled(TableHeaderCell)`\n padding: 4px 12px 4px 4px;\n`;\n\nconst ListCheckboxCell = styled.div`\n height: 48px;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 8px;\n`;\n\nconst ManageUsersSection = styled.div`\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst ManageUsersButton = styled.div<{ disabled?: boolean }>`\n font-size: 13px;\n font-weight: 600;\n color: ${props =>\n props.disabled\n ? props => props.theme.Colors.cloudyBlue\n : props => props.theme.Colors.tomato};\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n user-select: none;\n &:active {\n opacity: ${props => (props.disabled ? '1' : '0.7')};\n }\n`;\n\nconst TeamLeaderIcon = styled.div`\n width: 14px;\n height: 12px;\n display: flex;\n margin-left: 4px;\n margin-right: 8px;\n margin-top: -3px;\n flex-shrink: 0;\n color: ${props => props.theme.Colors.macaroniAndCheese};\n`;\n\nconst StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n width: 100%;\n`;\n\nconst AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n max-width: 90%;\n`;\n\nconst Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n`;\n\nconst StyledAssignedLabelList = styled(AssignedLabelList)`\n padding-left: 28px;\n`;\n\nconst SearchContainer = styled.div`\n flex: 1;\n`;\n\nconst LabelsContainer = styled.div`\n height: 40px;\n width: 40px;\n margin-left: 8px;\n`;\n\nconst ToggleWrapper = styled.span``;\n\nconst FilteredByLabelsContainer = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst ItemCount = styled.p`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 13px;\n padding: 0;\n margin: 0;\n`;\n\nconst TeamMembers: FC<{\n users?: ListResult<TeamMember>;\n teamId: string;\n profile?: UserProfile;\n searchTerm?: string;\n setSearchTerm: (searchTerm: string) => void;\n orderByUserName: Partial<TableHeaderCellProps>;\n orderByTeamLeader: Partial<TableHeaderCellProps>;\n selectedUsers: number[];\n isSelectAll: boolean;\n onSelectUser: (id: number) => void;\n onSelectAllLoadedUsers: (selected: boolean) => void;\n onSelectAll: (selected: boolean) => void;\n handleTeamLeaderChange: (teamUserId: number, isTeamLead: boolean) => void;\n setOffset: (offset: number) => void;\n labelIDs: number[];\n setLabelIDs: (labelIds: number[]) => void;\n totalCount: number;\n labelsOpen?: number | null;\n checkboxDisabled: boolean;\n handleToggleLabels: (open: number) => void;\n tableStates: TableStateValues;\n deleteMemberLabel: (userId: number, labelId: number) => void;\n registrationStatusHandler: (status: string[]) => void;\n searchParams: SearchParams;\n clearAllUsers: () => void;\n onSuccessRemoveUsersBulkActionCallback: () => void;\n lastRefreshed: Date;\n refreshData: () => void;\n leadersCount?: number;\n dataTest: string;\n}> = ({\n users,\n teamId,\n profile,\n setSearchTerm,\n orderByUserName,\n orderByTeamLeader,\n selectedUsers,\n isSelectAll,\n onSelectUser,\n onSelectAllLoadedUsers,\n onSelectAll,\n handleTeamLeaderChange,\n setOffset,\n labelIDs,\n setLabelIDs,\n totalCount,\n labelsOpen,\n checkboxDisabled,\n handleToggleLabels,\n tableStates,\n deleteMemberLabel,\n registrationStatusHandler,\n searchParams,\n clearAllUsers,\n onSuccessRemoveUsersBulkActionCallback,\n lastRefreshed,\n refreshData,\n leadersCount,\n dataTest,\n}) => {\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const labelsTree = listToTree(labelsList.data.items);\n const handleSelectLabels = useHandleSelectLabels();\n const ifLabelsChanged = useIfChanged(labelIDs);\n\n const onRemoveLabel = (label: Label) => {\n setLabelIDs(handleSelectLabels(label, labelIDs, labelsTree));\n };\n\n useEffect(() => {\n if (ifLabelsChanged) {\n setSelectLabels(labelIDs);\n saveLabels();\n }\n }, [labelIDs, ifLabelsChanged, setSelectLabels, saveLabels]);\n\n useEffect(() => {\n return () => clearAllUsers();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //TODO: Refactor/remove from every page\n const handleAssignedLabelDelete = (labelId: number, userId: number) => {\n deleteMemberLabel(userId, labelId);\n };\n\n const scrollableRef = useRef<HTMLDivElement>(null);\n const filterByRegistrationLength: any =\n searchParams?.filterByRegistrationStatus?.length;\n\n const deleteMembersFromTeamServiceOptions = {\n parameters: {\n teamId: +teamId,\n searchParams: {\n ...searchParams,\n limit: ITEMS_PER_PAGE,\n offset: isSelectAll ? totalCount : selectedUsers.length,\n },\n selectedItemIds: !isSelectAll ? selectedUsers : undefined,\n itemsCount: selectedUsers?.length ?? 0,\n },\n fieldName: !isSelectAll ? 'selectedItemIds' : 'searchParams.offset',\n };\n\n const deleteMembersFromTeam = useDeleteMembersFromTeamService();\n\n /**\n * @function deleteMembersFromTeamSuccessCallback\n * @returns { void }\n */\n const deleteMembersFromTeamSuccessCallback = useCallback(() => {\n Promise.resolve().then(() => {\n clearAllUsers();\n refreshData();\n onSuccessRemoveUsersBulkActionCallback();\n });\n }, [clearAllUsers, refreshData, onSuccessRemoveUsersBulkActionCallback]);\n\n const {\n handleStartBulkActionService:\n handleStartDeleteMembersFromTeamBulkAction,\n } = useUpdateTeamMembersBulkActionService(\n {\n actionName: UPDATE_TEAM_ACTION,\n actionFunction: deleteMembersFromTeam,\n actionFunctionOptions: deleteMembersFromTeamServiceOptions,\n },\n 'Removing Users',\n deleteMembersFromTeamSuccessCallback\n );\n\n /**\n * @function handleRemoveSelectedUsers\n * @returns { void }\n */\n const handleRemoveSelectedUsers = useCallback(() => {\n handleStartDeleteMembersFromTeamBulkAction();\n }, [handleStartDeleteMembersFromTeamBulkAction]);\n\n return (\n <Container>\n <Header>\n <Title data-test={`${dataTest}-title`}>Team Members</Title>\n <Counter data-test={`${dataTest}-leaders-counter`}>\n {handleGenerateTeamLeadersCountText(leadersCount ?? 0)}\n </Counter>\n </Header>\n <Header>\n <TableRefresh\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n dataTest={`${dataTest}-timestamp`}\n top={-20}\n fontSize={11}\n />\n </Header>\n\n <TableDivider />\n\n <TableTools>\n <SelectAll\n style={{\n width: '100%',\n height: 60,\n marginTop: -10,\n }}\n isSelectAll={isSelectAll}\n selectedLength={selectedUsers.length}\n totalCount={totalCount}\n itemsPerPage={ITEMS_PER_PAGE}\n onClearSelecion={() => {\n clearAllUsers();\n }}\n onSelectAll={() => {\n onSelectAllLoadedUsers(true);\n onSelectAll(true);\n }}\n dataTest={dataTest}\n >\n <span></span>\n </SelectAll>\n <SearchContainer>\n <TableSearchInput\n onChange={setSearchTerm}\n disabled={tableStates.disableSearch}\n />\n </SearchContainer>\n <LabelsContainer>\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <AllUsersFilter\n onLabelsChange={setLabelIDs}\n onSuccessApply={() => hide()}\n currentLabelIds={labelIDs}\n registrationStatus={\n searchParams.filterByRegistrationStatus ||\n []\n }\n onRegistrationStatusChange={\n registrationStatusHandler\n }\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n disabled={\n tableStates.disableFilters ||\n !labelsList.data.items.length\n }\n toggleOpen={toggleShown}\n filtersCount={\n labelIDs.length + filterByRegistrationLength\n }\n dataTest={`${dataTest}-filters`}\n />\n )}\n </Popup>\n </LabelsContainer>\n <TableToolsRight>\n <TableToolItem>\n <ItemCount data-test={`${dataTest}-counter`}>\n {' '}\n {totalCount}{' '}\n {totalCount === 1 ? 'Item' : 'Items'}{' '}\n </ItemCount>\n </TableToolItem>\n </TableToolsRight>\n </TableTools>\n <TableDivider />\n <TableContainer>\n {labelIDs && (\n <FilteredByLabelsContainer>\n <TableHeaderFilter\n selectedLabels={labelIDs}\n onRemoveLabel={\n labels.saved.length > 0\n ? onRemoveLabel\n : undefined\n }\n />\n </FilteredByLabelsContainer>\n )}\n <Table>\n <TableHead>\n <TableRow>\n <TableCheckboxCell\n dataTest={`${dataTest}-column-checkbox`}\n >\n <Checkbox\n checked={!!selectedUsers.length}\n size={12}\n partial={!isSelectAll}\n handleChange={e => {\n onSelectAllLoadedUsers(e.target.checked);\n onSelectAll(false);\n }}\n disabled={checkboxDisabled}\n />\n </TableCheckboxCell>\n <TableHeaderCell\n {...orderByUserName}\n width={97}\n disabled={tableStates.disableSorting}\n dataTest={`${dataTest}-column-users`}\n >\n Users\n </TableHeaderCell>\n <TableHeaderCell\n {...orderByTeamLeader}\n disabled={tableStates.disableSorting}\n dataTest={`${dataTest}-column-team-leader`}\n >\n Team Leader\n </TableHeaderCell>\n </TableRow>\n </TableHead>\n </Table>\n\n <TableBody\n ref={scrollableRef}\n showHeight={!tableStates.showEmptyState}\n >\n {!tableStates.showEmptyState && (\n <StyledTablePagination\n itemsPerPage={ITEMS_PER_PAGE}\n itemCount={users ? users.items.length : 0}\n totalCount={totalCount}\n onOffsetChange={setOffset}\n scrollableRef={scrollableRef}\n >\n {users &&\n users.items.map(member => {\n return (\n <React.Fragment key={member.user.id}>\n <ListRow\n data-test={`${dataTest}-item`}\n >\n <ListCheckboxCell>\n <Checkbox\n checked={selectedUsers.includes(member.user.id)}\n size={12}\n handleChange={() => {\n onSelectUser(member.user.id);\n }}\n dataTest={`${dataTest}-item-checkbox`}\n />\n </ListCheckboxCell>\n <ListCell flex={50}>\n <StyledFirstTableContent>\n <TableLabelTags\n open={\n labelsOpen ===\n member.user.id\n }\n toggleOpen={() =>\n handleToggleLabels(\n member.user\n .id\n )\n }\n selectedLabels={\n member.labels\n }\n dataTest={`${dataTest}-item-labels`}\n />\n <AvatarTile>\n <Avatar\n customProfile={{\n firstName:\n member\n .user\n .firstName,\n lastName:\n member\n .user\n .lastName,\n picture:\n member\n .user\n .imageUrl,\n status: member.userStatus,\n }}\n size=\"sm\"\n dataTest={`${dataTest}-item-avatar`}\n />\n <TableTitleOverflowText\n isCurrent={\n profile &&\n profile.id ===\n member\n .user\n .id\n }\n renderIcon={\n member.isTeamLead && (\n <TeamLeaderIcon data-test={`${dataTest}-item-crown`}>\n <Crown />\n </TeamLeaderIcon>\n )\n }\n dataTest={`${dataTest}-item-name`}\n minWidth=\"auto\"\n >\n {`${member.user.firstName} ${member.user.lastName}`}\n </TableTitleOverflowText>\n </AvatarTile>\n </StyledFirstTableContent>\n </ListCell>\n <TeamLeaderCell>\n <ToggleWrapper>\n <SwitchToggle\n index={\n member.user.id\n }\n checked={\n member.isTeamLead\n }\n onChange={e => {\n handleTeamLeaderChange(\n member.id,\n e.target\n .checked\n );\n }}\n height={24}\n width={42}\n bulletRadius={16}\n dataTest={`${dataTest}-item-team-lead-toggle`}\n />\n </ToggleWrapper>\n </TeamLeaderCell>\n </ListRow>\n {labelsOpen === member.user.id && (\n <StyledAssignedLabelList\n selectedLabels={\n member.labels || []\n }\n deletePermissions={[\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\n ]}\n onDeleteLabel={(\n labelId: any\n ) =>\n handleAssignedLabelDelete(\n labelId,\n member.user.id\n )\n }\n />\n )}{' '}\n </React.Fragment>\n );\n })}\n </StyledTablePagination>\n )}\n </TableBody>\n\n {tableStates.showEmptyState && (\n <EmptyStateContainer>\n {tableStates.showNoEntriesState && (\n <EmptyState\n icon={User}\n width={'224px'}\n dataTest={`${dataTest}-no-entries`}\n >\n Add Members\n </EmptyState>\n )}\n {tableStates.showNoSearchResultsState && (\n <NoSearchResults\n entityName={'Members'}\n dataTest={`${dataTest}-no-search-results`}\n />\n )}\n {tableStates.showNoFilterResultsState && (\n <NoFilterResults\n dataTest={`${dataTest}-no-filter-results`}\n />\n )}\n </EmptyStateContainer>\n )}\n </TableContainer>\n <TableDivider />\n <ManageUsersSection>\n <ManageUsersButton\n disabled={selectedUsers.length < 1}\n onClick={() => {\n if (selectedUsers.length > 0) {\n handleRemoveSelectedUsers();\n }\n }}\n data-test={`${dataTest}-remove-selected`}\n >\n {selectedUsers.length > 0\n ? `Remove ${pluralize(\n isSelectAll\n ? totalCount\n : selectedUsers.length,\n 'Selected User'\n )}`\n : 'Remove Selected Users'}\n </ManageUsersButton>\n </ManageUsersSection>\n </Container>\n );\n};\n\nconst ITEMS_PER_PAGE = 20;\n\nconst TeamMembersContainer = forwardRef(\n (\n { onSuccessRemoveUsersBulkActionCallback }: TeamMembersContainerProps,\n ref\n ) => {\n const params: { teamId: string } = useParams();\n const teamEditState = useTeamEditState();\n const profile = useSelector(getProfileState);\n const teamId = params.teamId;\n const searchTeamMembers = useSearchSingleTeamMembersService(teamId);\n const searchTeamMembersDebounced =\n useSearchDebounced(searchTeamMembers);\n const handleTableStates = useTableStateHelper();\n const updatedUsersState = useUpdateUsersState();\n const deleteMemberLabel = useDeleteSingleTeamMemberLabelService(teamId);\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n labelIDs: [],\n orderBy: null,\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n setCustom,\n } = useSearchParamsState(initialSearchParams);\n\n useEffect(() => {\n searchTeamMembersDebounced(searchParams);\n }, [\n searchParams,\n searchTeamMembersDebounced,\n teamId,\n updatedUsersState.data,\n ]);\n\n const orderBy = searchParams.orderBy;\n const orderByUserName = useOrderBy('name', orderBy, setOrderBy);\n const orderByTeamLeader = useOrderBy(\n 'is_team_lead',\n orderBy,\n setOrderBy\n );\n\n const [selectedUsers, setSelectedUsers] = useState<number[]>([]);\n const [isSelectAll, setIsSelectAll] = useState(false);\n const userItems = useMemo(\n () => teamEditState.teamMembers ? teamEditState.teamMembers.items : [],\n [teamEditState.teamMembers]\n );\n const totalCount = teamEditState.teamMembers?.count ?? 0;\n const checkboxDisabled = userItems.length < 1;\n const isPartiallySelected = selectedUsers.length < userItems.length;\n\n /**\n * @function handleSelectUser\n * @param { number } id\n * @returns { void }\n */\n const handleSelectUser = (id: number) => {\n const newSelectedUsers = selectedUsers.includes(id)\n ? selectedUsers.filter(userId => userId !== id)\n : selectedUsers.concat(id);\n setSelectedUsers(newSelectedUsers);\n setIsSelectAll(false);\n };\n /**\n * @function handleSelectAllLoadedUsers\n * @param { boolean } selected\n * @returns { void }\n */\n const handleSelectAllLoadedUsers = (selected: boolean) => {\n setSelectedUsers(\n selected || isPartiallySelected ? userItems.map(item => item.user.id) : []\n );\n };\n /**\n * @function clearAllUsers\n * @returns { void }\n */\n const clearAllUsers = () => {\n setSelectedUsers([]);\n setIsSelectAll(false);\n };\n\n useEffect(() => {\n if (!isSelectAll && selectedUsers.length === totalCount && totalCount > 0) {\n setIsSelectAll(true);\n }\n }, [isSelectAll, totalCount, selectedUsers]);\n \n useEffect(() => {\n if (\n isSelectAll &&\n !isEmpty(selectedUsers) &&\n selectedUsers.length < userItems.length\n ) {\n setSelectedUsers(userItems.map(item => item.user.id));\n }\n }, [isSelectAll, selectedUsers, userItems]);\n\n const handleTeamLeaderChange = useTogglePromoteTeamLeader();\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const registrationStatusHandler = (values: string[]) => {\n setCustom('filterByRegistrationStatus', values);\n };\n\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n /**\n * @description reloads data with the same search params and updates last refreshed date to the current date/time\n * @function refreshData\n * @returns { void }\n */\n const refreshData = useCallback(() => {\n searchTeamMembers(\n {\n ...searchParams,\n limit: ITEMS_PER_PAGE + searchParams.offset, // we should increase the limit to fetch all loaded data again\n offset: 0,\n },\n true\n );\n setLastRefreshed(new Date());\n }, [searchParams, searchTeamMembers]);\n useImperativeHandle<any, TeamMembersExternalInterface>(ref, () => ({\n refreshData,\n }));\n\n const registrationsStatusLength: any =\n searchParams.filterByRegistrationStatus?.length;\n\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters:\n searchParams.labelIDs?.length + registrationsStatusLength,\n itemsCount: totalCount,\n });\n\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'teamEdit',\n scope: 'teamMembers',\n }}\n >\n <TeamMembers\n users={teamEditState.teamMembers}\n profile={profile}\n teamId={teamId}\n searchTerm={searchParams.searchTerm}\n setSearchTerm={setSearchTerm}\n orderByUserName={orderByUserName}\n orderByTeamLeader={orderByTeamLeader}\n selectedUsers={selectedUsers}\n isSelectAll={isSelectAll}\n onSelectUser={handleSelectUser}\n onSelectAllLoadedUsers={handleSelectAllLoadedUsers}\n onSelectAll={setIsSelectAll}\n handleTeamLeaderChange={handleTeamLeaderChange}\n setOffset={setOffset}\n labelIDs={searchParams.labelIDs || []}\n setLabelIDs={setLabelIDs}\n totalCount={totalCount}\n labelsOpen={labelsOpen}\n checkboxDisabled={checkboxDisabled}\n handleToggleLabels={handleToggleLabels}\n tableStates={tableStates}\n deleteMemberLabel={deleteMemberLabel}\n registrationStatusHandler={registrationStatusHandler}\n searchParams={searchParams}\n clearAllUsers={clearAllUsers}\n onSuccessRemoveUsersBulkActionCallback={\n onSuccessRemoveUsersBulkActionCallback\n }\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n leadersCount={teamEditState.data?.leaders?.length}\n dataTest=\"team-members\"\n />\n </WithLabelsContext.Provider>\n );\n }\n);\n\nexport default TeamMembersContainer;\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\nimport AvatarPlaceholder from '../../../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\n\nexport const Container = styled.div`\n padding: 24px;\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 ${props => props.theme.Colors.blackTwo5};\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n flex-direction: column;\n overflow: auto;\n`;\n\nexport const Header = styled.div`\n margin-bottom: 6px;\n`;\n\nexport const Title = styled.div`\n font-size: 15px;\n font-weight: 600;\n color: ${props => props.theme.Colors.black};\n height: 24px;\n`;\n\nexport const TeamLeaderIcon = styled.div`\n width: 14px;\n height: 12px;\n display: flex;\n margin-left: 4px;\n margin-right: 8px;\n margin-top: -3px;\n flex-shrink: 0;\n color: ${props => props.theme.Colors.macaroniAndCheese};\n`;\n\nexport const StyledFirstTableContent = styled.div`\n display: flex;\n align-items: center;\n padding: 0;\n height: 100%;\n width: 100%;\n`;\n\nexport const AvatarTile = styled.div`\n display: flex;\n align-items: center;\n flex: 1;\n`;\n\nexport const Avatar = styled(AvatarPlaceholder)`\n width: 24px;\n height: 24px;\n margin-right: 8px;\n`;\n\nexport const ToggleWrapper = styled.span``;\n\nexport const TeamLeaders = styled.p`\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 11px;\n padding: 0;\n margin: 0;\n`;\n\nexport const useStyles = makeStyles(theme => ({\n scrollWrapperStyle: {\n height: '100% !important',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n\n tableWrapperStyle: {\n height: '70vh',\n },\n\n tableBodyContainerStyle: {\n maxHeight: 'calc(100vh - 358px)',\n },\n\n customCellStyle: {\n padding: '0px !important',\n width: '97%',\n },\n\n tableToolsWrapperStyle: {\n display: 'flex',\n flex: 1,\n justifyContent: 'space-between',\n flexDirection: 'row',\n },\n\n tableToolsRootStyle: {\n padding: '8px 0px !important',\n },\n\n tableToolsLeftClassName: {\n flex: '1 1 0%',\n },\n\n searchInputStyle: {\n flex: '1 1 0%',\n },\n}));\n","import { FC, useEffect, useRef, useState } from 'react';\n\nimport { useParams } from 'react-router';\nimport { useTeamEditState } from '../../../../store/states';\nimport {\n useSearchSingleTeamMembersService,\n useTogglePromoteTeamLeader,\n useDeleteSingleTeamMemberLabelService\n} from '../../../../store/services';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../../../../constants/interfaces/filters';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport { UserProfile } from '../../../../../../constants/interfaces/User';\nimport { TeamMember } from '../../../../../../constants/interfaces/TeamMember';\nimport SwitchToggle from '../../../../../../ui/components/SwitchToggle/SwitchToggle';\nimport Crown from '../../../../../../ui/icons/Crown';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../../../../pages/UserProfile/store/reducers';\nimport { handleGenerateTeamLeadersCountText } from '../../tools';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport {\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { WithLabelsContext } from '../../../../../portableLabels';\nimport { Popup } from '../../../../../../ui/components/Popup';\nimport { AllUsersFilter } from '../../components/Filters/AllUsersFilters';\nimport FilterByHandler from '../../../../../../ui/components/Filters/FilterByHandler';\nimport {\n isCompanyAdminRole,\n isPractisAdminRole,\n} from '../../../../../../constants/enums';\nimport { listToTree } from '../../../../../../helpers/functions/list-to-tree';\nimport { useHandleSelectLabels } from '../../../../../labels/tools';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { Label } from '../../../../../../constants/interfaces/Label';\nimport { Tooltip } from '../../../../../../ui/components/Tooltip';\nimport User from '../../../../../../ui/icons/User';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { useUpdateUsersState } from '../../../../../users/store/states';\nimport { useSearchDebounced } from '../../../../../../helpers/hooks/useSearch';\nimport { usePortableLabelsState } from '../../../../../portableLabels/store/states';\nimport {\n TableStateValues,\n TableWrapper,\n} from '../../../../../../ui/components/table-wrapper';\nimport {\n Avatar,\n AvatarTile,\n Container,\n Header,\n StyledFirstTableContent,\n TeamLeaderIcon,\n TeamLeaders,\n Title,\n ToggleWrapper,\n useStyles,\n} from './styles';\nimport { TableHeaderCellProps } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/type';\nimport { TableDivider } from '../../../../../../ui/components/table-wrapper/table-divider';\nimport { TableLabelTags } from '../../../../../../ui/components/table-wrapper/table/TableLabelTags';\nimport TableTitleOverflowText from '../../../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\nimport { useTableStateHelper } from '../../../../../../ui/components/table-wrapper/helper';\nimport { useOrderBy } from '../../../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\nimport { TableViewMode } from '../../../../../../ui/components/table-wrapper/table/type';\n\nconst DefaultTeamMembers: FC<{\n users?: ListResult<TeamMember>;\n profile?: UserProfile;\n searchTerm?: string;\n searchParams: SearchParams;\n setSearchTerm: (searchTerm: string) => void;\n orderByUserName: Partial<TableHeaderCellProps>;\n orderByTeamLeader: Partial<TableHeaderCellProps>;\n handleTeamLeaderChange: (\n teamUserId: number,\n isTeamLead: boolean,\n ) => void;\n setOffset: (offset: number) => void;\n labelIDs: number[];\n setLabelIDs: (labelIds: number[]) => void;\n totalCount?: number;\n leadersCount?: number;\n labelsOpen?: number | null;\n handleToggleLabels: (open: number) => void;\n tableStates: TableStateValues;\n registrationStatusHandler?: (status: string[]) => void;\n deleteMemberLabel: (userId: number, labelId: number) => void;\n}> = ({\n users,\n profile,\n searchParams,\n setSearchTerm,\n orderByUserName,\n orderByTeamLeader,\n handleTeamLeaderChange,\n setOffset,\n labelIDs,\n setLabelIDs,\n totalCount,\n leadersCount,\n labelsOpen,\n handleToggleLabels,\n tableStates,\n deleteMemberLabel,\n registrationStatusHandler,\n}) => {\n const classes = useStyles();\n const labels = useLabelsState();\n const labelsList = usePortableLabelsState();\n const setSelectLabels = useSelectLabels();\n const saveLabels = useSaveLabels();\n const labelsTree = listToTree(labelsList.data.items);\n const handleSelectLabels = useHandleSelectLabels();\n const ifLabelsChanged = useIfChanged(labelIDs);\n\n const onRemoveLabel = (label: Label) => {\n setLabelIDs(handleSelectLabels(label, labelIDs, labelsTree));\n };\n\n useEffect(() => {\n if (ifLabelsChanged) {\n setSelectLabels(labelIDs);\n saveLabels();\n }\n }, [labelIDs, ifLabelsChanged, setSelectLabels, saveLabels]);\n\n //TODO: Refactor/remove from every page\n const handleAssignedLabelDelete = (labelId: number, userId: number) => {\n deleteMemberLabel(userId, labelId);\n };\n\n const revokeLeaderDisabled = !(\n isPractisAdminRole(profile?.role?.name) ||\n isCompanyAdminRole(profile?.role?.name)\n );\n\n const scrollableRef = useRef<HTMLDivElement>(null);\n const filterByRegistrationLength: any =\n searchParams?.filterByRegistrationStatus?.length;\n\n /**\n * @function checkIsLabelTagsOpen\n * @param { TeamMember } member\n * @returns { boolean }\n */\n const checkIsLabelTagsOpen = (member: TeamMember): boolean => {\n return labelsOpen === member.user.id;\n };\n\n return (\n <Container>\n <Header>\n <Title data-test=\"all-members-title\">All Members</Title>\n <TeamLeaders data-test=\"team-leaders-count\">\n {handleGenerateTeamLeadersCountText(leadersCount ?? 0)}\n </TeamLeaders>\n </Header>\n <TableDivider />\n <TableWrapper\n tableStates={tableStates}\n data={users?.items}\n viewMode={TableViewMode.INFINITE_SCROLL}\n headerFilterPosition=\"BOTTOM\"\n tableWrapperClassName={classes.tableWrapperStyle}\n tableContainerClassName={classes.tableBodyContainerStyle}\n scrollRef={scrollableRef}\n scrollPaginationProps={{\n itemsPerPage: ITEMS_PER_PAGE,\n itemCount: users ? users.items.length : 0,\n totalCount: totalCount,\n onOffsetChange: setOffset,\n scrollableRef: scrollableRef,\n hideLoading: false,\n height: 300,\n className: classes.scrollWrapperStyle,\n }}\n selectedLabels={labelIDs}\n onRemoveLabel={\n labels.saved.length > 0 ? onRemoveLabel : undefined\n }\n tableToolsOptions={{\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: setSearchTerm,\n isSearchInputDisabled: tableStates.disableSearch,\n className: classes.searchInputStyle,\n dataTest: 'all-members-search',\n },\n filterOptions: {\n filterComponent: (\n <Popup<HTMLButtonElement>\n content={({ hide }) => (\n <AllUsersFilter\n onLabelsChange={setLabelIDs}\n onSuccessApply={() => hide()}\n currentLabelIds={labelIDs}\n registrationStatus={\n searchParams.filterByRegistrationStatus ||\n []\n }\n onRegistrationStatusChange={\n registrationStatusHandler\n }\n />\n )}\n >\n {(ref, { toggleShown, shown }) => (\n <FilterByHandler\n ref={ref}\n open={shown}\n disabled={tableStates.disableFilters}\n toggleOpen={toggleShown}\n filtersCount={\n labelIDs.length +\n filterByRegistrationLength\n }\n dataTest=\"all-members-filters\"\n />\n )}\n </Popup>\n ),\n },\n itemCount: users?.count\n ? `${users?.count} ${\n users?.count === 1 ? 'item' : 'items'\n }`\n : '',\n itemCountDataTest: 'all-members-count',\n customization: {\n wrapperClassName: classes.tableToolsWrapperStyle,\n tableToolsLeftClassName:\n classes.tableToolsLeftClassName,\n rootClassName: classes.tableToolsRootStyle,\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState: true,\n noEntriesOptions: {\n icon: User,\n text: 'Add Members',\n dataTest: 'no-all-members',\n },\n noSearchResultsOptions: {\n entityName: 'Members',\n dataTest: 'no-found-all-members',\n },\n }}\n configurations={{\n columns: [\n {\n title: 'Users',\n width: 97,\n ...orderByUserName,\n disabled: tableStates.disableSorting,\n dataTest: 'users-column'\n },\n {\n title: 'Team Leader',\n width: 2,\n ...orderByTeamLeader,\n disabled: tableStates.disableSorting,\n dataTest: 'team-leader-column'\n },\n ],\n\n rowConfig: {\n isLabelTagsOpen: checkIsLabelTagsOpen,\n getLabelTagsProps: (member: TeamMember) => ({\n selectedLabels: member.labels,\n deletePermissions: [\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\n ],\n onDeleteLabel: (labelId: number) =>\n handleAssignedLabelDelete(\n labelId,\n member.user.id\n ),\n }),\n dataTest: 'all-members-item',\n\n cells: [\n {\n fieldType: 'CUSTOM_FIELD',\n cellClassName: classes.customCellStyle,\n getCustomFieldComponent: (\n member: TeamMember\n ) => (\n <StyledFirstTableContent>\n <TableLabelTags\n open={labelsOpen === member.user.id}\n toggleOpen={() =>\n handleToggleLabels(\n member.user.id\n )\n }\n selectedLabels={member.labels}\n dataTest=\"member-labels\"\n />\n <AvatarTile>\n <Avatar\n customProfile={{\n firstName:\n member.user.firstName,\n lastName:\n member.user.lastName,\n picture:\n member.user.imageUrl,\n status: member.userStatus,\n }}\n size=\"sm\"\n dataTest=\"member-avatar\"\n />\n <TableTitleOverflowText\n isCurrent={\n profile &&\n profile.id ===\n member.user.id\n }\n renderIcon={\n member.isTeamLead && (\n <TeamLeaderIcon data-test=\"team-leader-icon\">\n <Crown />\n </TeamLeaderIcon>\n )\n }\n dataTest=\"member-name\"\n >\n {`${member.user.firstName} ${member.user.lastName}`}\n </TableTitleOverflowText>\n </AvatarTile>\n </StyledFirstTableContent>\n ),\n },\n\n {\n fieldType: 'CUSTOM_FIELD',\n getCustomFieldComponent: (\n member: TeamMember\n ) => (\n <Tooltip\n label=\"Only admin can unassign team leader\"\n position=\"center-right--bottom\"\n disabled={\n !(\n revokeLeaderDisabled &&\n !!member.isTeamLead\n )\n }\n >\n <ToggleWrapper>\n <SwitchToggle\n index={member.user.id}\n checked={member.isTeamLead}\n onChange={e => {\n handleTeamLeaderChange(\n member.id,\n e.target.checked\n );\n }}\n height={24}\n width={42}\n bulletRadius={16}\n disabled={\n revokeLeaderDisabled &&\n member.isTeamLead\n }\n dataTest=\"team-leader-toggle\"\n />\n </ToggleWrapper>\n </Tooltip>\n ),\n },\n ],\n },\n }}\n />\n </Container>\n );\n};\n\nconst ITEMS_PER_PAGE = 20;\n\nconst DefaultTeamMembersContainer = () => {\n const params: { teamId: string } = useParams();\n const teamEditState = useTeamEditState();\n const profile = useSelector(getProfileState);\n const teamId = params.teamId;\n const searchTeamMembers = useSearchSingleTeamMembersService(teamId);\n const searchTeamMembersDebounced = useSearchDebounced(searchTeamMembers);\n const handleTableStates = useTableStateHelper();\n const deleteLabelFromUser = useDeleteSingleTeamMemberLabelService(teamId);\n const updatedUsersState = useUpdateUsersState();\n\n const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n labelIDs: [],\n orderBy: null,\n limit: ITEMS_PER_PAGE,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n };\n\n const {\n searchParams,\n setSearchTerm,\n setOrderBy,\n setLabelIDs,\n setOffset,\n setCustom,\n } = useSearchParamsState(initialSearchParams);\n\n useEffect(() => {\n searchTeamMembersDebounced(searchParams);\n }, [searchParams, searchTeamMembersDebounced, updatedUsersState.data]);\n\n const orderBy = searchParams.orderBy;\n const orderByUserName = useOrderBy('name', orderBy, setOrderBy);\n const orderByTeamLeader = useOrderBy(\n 'is_team_lead',\n orderBy,\n setOrderBy\n );\n\n const handleTeamLeaderChange = useTogglePromoteTeamLeader();\n\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\n null\n );\n\n const registrationStatusHandler = (values: string[]) => {\n setCustom('filterByRegistrationStatus', values);\n };\n\n const handleToggleLabels = (itemId?: number) => {\n if (!itemId) return;\n if (labelsOpen === itemId) {\n setLabelsOpen(null);\n } else {\n setLabelsOpen(itemId);\n }\n };\n\n const tableStates = handleTableStates({\n searchTerm: searchParams.searchTerm,\n appliedFilters: searchParams.labelIDs?.length,\n itemsCount: teamEditState?.teamMembers?.count || 0,\n });\n\n return (\n <WithLabelsContext.Provider\n value={{\n reducerName: 'teamEdit',\n scope: 'defaultTeamMembers',\n }}\n >\n <DefaultTeamMembers\n users={teamEditState.teamMembers}\n profile={profile}\n searchTerm={searchParams.searchTerm}\n setSearchTerm={setSearchTerm}\n orderByUserName={orderByUserName}\n orderByTeamLeader={orderByTeamLeader}\n handleTeamLeaderChange={handleTeamLeaderChange}\n setOffset={setOffset}\n labelIDs={searchParams.labelIDs || []}\n setLabelIDs={setLabelIDs}\n totalCount={teamEditState.teamMembers?.count}\n leadersCount={teamEditState?.data?.leaders?.length}\n labelsOpen={labelsOpen}\n handleToggleLabels={handleToggleLabels}\n tableStates={tableStates}\n deleteMemberLabel={deleteLabelFromUser}\n searchParams={searchParams}\n registrationStatusHandler={registrationStatusHandler}\n />\n </WithLabelsContext.Provider>\n );\n};\n\nexport default DefaultTeamMembersContainer;\n","import { FC, useEffect, useRef } from 'react';\nimport ModalPage, {\n ModalPageContainerProps,\n} from '../../../../ui/components/ModalPage/ModalPage';\nimport styled from 'styled-components';\nimport Header from './components/Header/Header';\nimport Actions from './components/Actions/Actions';\nimport AllUsers from './tabs/AllUsers/AllUsers';\nimport TeamMembers from './tabs/TeamMembers/TeamMembers';\nimport DefaultTeamMembers from './tabs/DefaultTeamMembers/DefaultTeamMembers';\nimport {\n useGetSingleTeamService,\n useResetSingleTeamPageService,\n useUpdateTeamNameService,\n} from '../../store/services';\nimport { useTeamEditState } from '../../store/states';\nimport { TeamV2 } from '../../../../constants/interfaces/Team';\nimport { useParams } from 'react-router';\nimport { useHistory } from '../../../../tools/router';\nimport { WithLabelsContext } from '../../../portableLabels';\nimport { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\nimport { TeamUpdateStatus } from '../../store/states';\nimport { TeamMembersExternalInterface } from './tabs/TeamMembers/types';\nimport { AllUsersExternalInterface } from './tabs/AllUsers/types';\nimport { onTriggerEvent } from '../../../../helpers/functions/Events';\nimport {\n EventNameList,\n REFRESH_TEAMS_LIST,\n REFRESH_TEAM_CONTROLLER,\n REFRESH_TEAM_MEMBERS,\n} from '../../../../helpers/functions/Events/types';\n\nconst StyledModalPage = styled(ModalPage)<{ isDefaultTeam: boolean }>`\n width: ${props => (props.isDefaultTeam ? '50%' : '65%')};\n min-width: 780px;\n ${props =>\n props.isDefaultTeam &&\n `\n @media (max-width: ${props.theme.BreakPoints.responsiveSm}px) {\n left: 47px;\n width: unset;\n right: 0\n }\n\n `}\n`;\n\nconst Container = styled.div`\n width: 100%;\n height: 100%;\n background: ${props => props.theme.Colors.white};\n padding: 0 32px;\n display: flex;\n flex-direction: column;\n overflow: auto;\n border-top-left-radius: 8px;\n border-bottom-left-radius: 8px;\n`;\n\nconst Body = styled.div`\n margin: 15px 0 24px 0;\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: 1fr;\n grid-column-gap: 16px;\n overflow: auto;\n min-height: 350px;\n`;\n\nconst DefaultBody = styled.div`\n margin: 0 0 24px 0;\n flex: 1;\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr;\n grid-column-gap: 16px;\n overflow: auto;\n min-height: 350px;\n`;\n\nconst ManageTeam: FC<{\n team?: TeamV2;\n handleUpdateTeamName: (value: string) => Promise<void>;\n handleCancel: () => void;\n isDefaultTeam: boolean;\n updateStatus?: TeamUpdateStatus;\n getSingleTeam: (teamId: number) => void;\n}> = ({\n team,\n handleUpdateTeamName,\n handleCancel,\n isDefaultTeam,\n updateStatus,\n getSingleTeam,\n}) => {\n const teamMembersRef = useRef<TeamMembersExternalInterface>();\n const handleAddTeamMembersSuccess = () => {\n teamMembersRef.current?.refreshData();\n };\n\n const allUsersRef = useRef<AllUsersExternalInterface>();\n const handleRemoveTeamMembersSuccess = () => {\n allUsersRef.current?.refreshData();\n getSingleTeam(team!.id);\n };\n\n return (\n <Container>\n <Header\n handleCancel={handleCancel}\n lastUpdated={team?.updatedAt}\n updateStatus={updateStatus}\n />\n {!isDefaultTeam && (\n <>\n <TableDivider />\n <Actions\n team={team}\n handleUpdateTeamName={handleUpdateTeamName}\n />\n <TableDivider />\n </>\n )}\n {isDefaultTeam ? (\n <DefaultBody>\n <DefaultTeamMembers />\n </DefaultBody>\n ) : (\n <Body>\n <AllUsers\n ref={allUsersRef}\n onSuccessAddUsersBulkActionCallback={\n handleAddTeamMembersSuccess\n }\n />\n <TeamMembers\n ref={teamMembersRef}\n onSuccessRemoveUsersBulkActionCallback={\n handleRemoveTeamMembersSuccess\n }\n />\n </Body>\n )}\n </Container>\n );\n};\n\nconst ManageTeamContainer: FC<ModalPageContainerProps> = ({\n closePath,\n closeGoingBack,\n}) => {\n const history = useHistory();\n const teamState = useTeamEditState();\n\n const teamStateData = teamState && teamState.data;\n const resetPage = useResetSingleTeamPageService();\n const getSingleTeam = useGetSingleTeamService();\n const params: {\n teamId?: string | number;\n isDefault?: string;\n } = useParams();\n const teamId = params.teamId!;\n const isDefaultParam = history?.location?.state?.data?.isDefaultTeam;\n\n const isDefaultTeam =\n isDefaultParam || (teamStateData && teamStateData.isDefault) || false;\n const updateTeamName = useUpdateTeamNameService(teamId);\n\n const handleGoBack = () => {\n history.goBack();\n };\n\n useEffect(() => {\n if (params.teamId) {\n getSingleTeam(Number(params.teamId));\n }\n }, [getSingleTeam, params.teamId]);\n\n useEffect(() => {\n return () => {\n resetPage();\n\n // refresh TeamController && TeamMembers Page\n onTriggerEvent(EventNameList[REFRESH_TEAM_MEMBERS]);\n onTriggerEvent(EventNameList[REFRESH_TEAM_CONTROLLER]);\n onTriggerEvent(EventNameList[REFRESH_TEAMS_LIST]);\n };\n }, [resetPage]);\n\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'teamEdit' }}>\n <StyledModalPage\n isDefaultTeam={isDefaultTeam}\n closePath={closePath}\n closeGoingBack={closeGoingBack}\n handleManualClose={handleGoBack}\n >\n <ManageTeam\n team={teamStateData}\n handleUpdateTeamName={updateTeamName}\n handleCancel={handleGoBack}\n isDefaultTeam={isDefaultTeam}\n updateStatus={teamState.updateStatus}\n getSingleTeam={getSingleTeam}\n />\n </StyledModalPage>\n </WithLabelsContext.Provider>\n );\n};\n\nexport default ManageTeamContainer;\n","import styled from 'styled-components';\nimport ModalPage from '../../../../ui/components/ModalPage/ModalPage';\nimport { Input } from '../../../../ui/components/input';\n\nexport const StyledModalPage = styled(ModalPage)`\n width: 627px;\n min-width: 550px;\n\n @media (max-width: 1024px) {\n left: unset;\n }\n @media (max-width: 576px) {\n width: 45%;\n left: 47px;\n min-width: calc(100% - 47px);\n }\n`;\n\nexport const Container = styled.div`\n width: 100%;\n height: 100%;\n background: var(--ps-white-1);\n padding: 0 32px;\n display: flex;\n flex-direction: column;\n overflow: auto;\n border-top-left-radius: 8px;\n border-bottom-left-radius: 8px;\n`;\n\nexport const Title = styled.div`\n display: flex;\n align-items: center;\n font-size: 20px;\n font-weight: bold;\n line-height: 28px;\n height: 96px;\n color: var(--ps-black-main);\n`;\n\nexport const NameContainer = styled.div`\n margin: 16px 0;\n border-radius: 4px;\n`;\n\nexport const NameInput = styled(Input)`\n padding: 12px 16px;\n font-size: 13px;\n font-weight: normal;\n border: ${props => props.error ? 'none' : '1px solid var(--ps-grey-3)'};\n border-radius: 4px;\n &:focus {\n border: ${props => props.error ? 'none' : '1px solid var(--ps-grey-2)'};\n }\n`;\n\nexport const ActionContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n padding-top: 24px;\n`;\n\nexport const ButtonDelimiter = styled.div`\n width: 16px;\n`;\n\n","import { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\nimport { Button } from '../../../../ui/components/Button';\nimport { CreateTeamViewProps } from './types';\nimport {\n StyledModalPage,\n Container,\n Title,\n NameContainer,\n NameInput,\n ActionContainer,\n ButtonDelimiter\n} from './styles';\n\nfunction CreateTeamView({\n closePath,\n closeGoingBack,\n name,\n isSubmitting,\n hasError,\n onChangeName,\n onCancel,\n onSave\n}: CreateTeamViewProps) {\n return (\n <StyledModalPage\n closePath={closePath}\n closeGoingBack={closeGoingBack}\n >\n <Container>\n <Title data-test=\"create-team-page-title\">Create New Team</Title>\n <TableDivider />\n <NameContainer>\n <NameInput\n height=\"40px\"\n maxLength={50}\n placeholder=\"Team Name\"\n handleChange={(event: { target: HTMLInputElement }) =>\n onChangeName(event.target.value)\n }\n value={name}\n dataTest=\"create-team-name\"\n error={hasError}\n />\n </NameContainer>\n <TableDivider />\n <ActionContainer>\n <Button\n label=\"Cancel\"\n variant=\"inverse\"\n width=\"126px\"\n action={onCancel}\n dataTest=\"create-team-cancel\"\n />\n <ButtonDelimiter />\n <Button\n label={'Create'}\n width=\"126px\"\n loading={isSubmitting}\n disabled={name.trim().length === 0}\n action={onSave}\n dataTest=\"create-team-save\"\n />\n\n </ActionContainer>\n </Container>\n </StyledModalPage>\n );\n}\n\nexport default CreateTeamView;","import { useState, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { History } from 'history';\nimport { useCreateNewTeamService } from '../../store/services';\nimport { useSearchTeamsService } from '../../../portableTeams/store/hors/withTeams/services';\nimport { TeamV2 } from '../../../../constants/interfaces/Team';\nimport { replaceModal } from '../../../../tools/router';\nimport ROUTES from '../../../../routes/routes';\nimport { ModalPageContainerProps } from '../../../../ui/components/ModalPage';\nimport CreateTeamView from './view';\nimport useHtmlPageTitle from '../../../../helpers/hooks/useHtmlPageTitle';\n\nfunction CreateTeamController({\n closePath,\n closeGoingBack,\n}: ModalPageContainerProps) {\n const [name, setName] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [hasError, setHasError] = useState(false);\n const history = useHistory() as History<any>;\n const createNewTeam = useCreateNewTeamService();\n const searchTeamsForFilters = useSearchTeamsService();\n useHtmlPageTitle('Create New Team');\n\n /**\n * @description saves changed name to state and resets error\n * @function handleChangeName\n * @param { string } value\n * @returns { void }\n */ \n const handleChangeName = (value: string) => {\n setName(value);\n setHasError(false);\n }\n\n /**\n * @description redirects to previous page\n * @function handleCancel\n * @returns { void }\n */ \n const handleCancel = useCallback(\n () => history.goBack(),\n [history]\n )\n\n /**\n * @description sends API request to create a new team.\n * If a request is succeeded, then it redicts to manage team modal. Otherwise - shows error.\n * @function handleSave\n * @returns { void }\n */ \n const handleSave = () => {\n setIsSubmitting(true);\n createNewTeam(name)\n .then((team: TeamV2) => {\n setTimeout(searchTeamsForFilters, 500);\n replaceModal(\n history,\n ROUTES.TEAMS_PAGES.MANAGE_TEAM.replace(':teamId', team.id.toString()),\n { isDefaultTeam: false }\n )\n })\n .catch(() => {\n Promise.resolve().then(() => {\n setIsSubmitting(false);\n setHasError(true);\n });\n });\n };\n\n return <CreateTeamView\n closePath={closePath}\n closeGoingBack={closeGoingBack}\n name={name}\n isSubmitting={isSubmitting}\n hasError={hasError}\n onChangeName={handleChangeName}\n onCancel={handleCancel}\n onSave={handleSave}\n />\n}\n\nexport default CreateTeamController;","import { FC, useEffect, ReactNode, useState, useCallback } from 'react';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\r\nimport { usePractisSetReportState } from '../../store/states';\r\nimport {\r\n usePractisSetReportService,\r\n useResetPractisSetReportService,\r\n} from '../../store/services';\r\nimport {\r\n formatDateWithTimeZone,\r\n formatMMDDYY,\r\n} from '../../../../helpers/functions/date-convert';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport {\r\n EnrollmentProgress,\r\n EnrollmentStatus,\r\n EnrollmentDailyTraining,\r\n EnrollmentInterface,\r\n} from '../../../../constants/interfaces/Enrollments';\r\nimport Completion from './components/Sections/Completion';\r\nimport DailyTimeSpent from './components/Sections/DailyTimeSpent';\r\nimport { useSelector } from 'react-redux';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { UserProfile } from '../../../../constants/interfaces/User';\r\nimport ReportsItems from './components/Sections/ReportItems/ReportsItems';\r\nimport { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\r\nimport {\r\n StyledTraineeDetailsContainer,\r\n GraphSection,\r\n GraphRow,\r\n StyledDetailsHeader,\r\n ProfileSection,\r\n StyledDetailsAvatar,\r\n StyledUserInfo,\r\n StyledEmail,\r\n StyledName,\r\n StyledAdditionalInfo,\r\n StyledPendingInvitationLabel,\r\n StyledPendingTitle,\r\n DueDateSubTitle,\r\n SubHeaderContainer,\r\n StatusContainer,\r\n DetailsStatusCompleted,\r\n DetailsStatusInProgress,\r\n DetailsStatusPending,\r\n WarningTitle,\r\n StyledOverdueFlag,\r\n StyledLoading,\r\n DueDateSkeletonContainer,\r\n} from './styles';\r\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport { toFixedNumber } from '../../../../helpers/functions/math';\r\nimport { UserStatus } from '../../../users/store/costants';\r\nimport useHtmlPageTitle from '../../../../helpers/hooks/useHtmlPageTitle';\r\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\r\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\r\nimport { useNudgeTraineesService } from '../../../users/store/services';\r\nimport { NudgeData } from '../../../../api/alert/types';\r\nimport { pushModal } from '../../../../tools/router';\r\nimport { History } from 'history';\r\nimport { Skeleton } from '@material-ui/lab';\r\n\r\nexport enum SubmissionsStatus {\r\n PENDING = 'PENDING',\r\n REVIEWED = 'REVIEWED',\r\n UPLOADING = 'UPLOADING',\r\n DELETED = 'DELETED',\r\n}\r\n\r\nconst submissionsStatusNames = {\r\n [SubmissionsStatus.PENDING as string]: 'Submitted',\r\n [SubmissionsStatus.REVIEWED as string]: 'Reviewed',\r\n [SubmissionsStatus.UPLOADING as string]: 'Uploading',\r\n [SubmissionsStatus.DELETED as string]: 'Deleted',\r\n};\r\n\r\nexport function submissionsStatusName(status?: string): string {\r\n return (status && submissionsStatusNames[status]) || status || '';\r\n}\r\n\r\nconst PractisSetReport: FC<{\r\n profile?: UserProfile;\r\n enrollment?: EnrollmentInterface;\r\n progress?: ListResult<EnrollmentProgress>;\r\n dailyTraining?: EnrollmentDailyTraining[];\r\n params: { userId: string, enrollmentId: string };\r\n loading?: boolean;\r\n useGoBack: boolean;\r\n goBackUrl: string;\r\n onGetPractisSetReport: (enrollmentId: number) => void;\r\n onResetPractisSetReport: () => void;\r\n onNudgeTrainees(nudgeUserDate: NudgeData[], successCallback?: () => void): void;\r\n}> = ({\r\n profile,\r\n enrollment,\r\n progress,\r\n dailyTraining,\r\n params,\r\n loading,\r\n useGoBack,\r\n goBackUrl,\r\n onGetPractisSetReport,\r\n onResetPractisSetReport,\r\n onNudgeTrainees,\r\n}) => {\r\n const history = useHistory() as History<any>;\r\n const [showNudgeDialog, setShowNudgeDialog] = useState(false);\r\n const isPending = enrollment?.user.status === UserStatus.PENDING;\r\n\r\n useEffect(() => {\r\n if (params.enrollmentId) {\r\n onGetPractisSetReport!(+params.enrollmentId!);\r\n }\r\n\r\n return () => {\r\n onResetPractisSetReport();\r\n };\r\n }, [onGetPractisSetReport, onResetPractisSetReport, params.enrollmentId]);\r\n\r\n const redirectToViewSubmission = (submissionId?: string) => {\r\n if (!submissionId) return;\r\n\r\n history.push(\r\n ROUTES.SUBMISSION_SETTINGS.CHALLENGES.SINGLE.replace(\r\n ':submissionId',\r\n submissionId\r\n ),\r\n {\r\n useGoBack: true,\r\n }\r\n );\r\n };\r\n\r\n const redirectToViewScenario = (submissionId?: string) => {\r\n if (!submissionId) return;\r\n\r\n history.push(\r\n ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.SINGLE.replace(\r\n ':submissionId',\r\n submissionId\r\n ),\r\n {\r\n useGoBack: true,\r\n }\r\n );\r\n };\r\n\r\n const handleReviewReps = (submissionId?: string) => {\r\n if (!submissionId || !enrollment) return;\r\n \r\n pushModal(\r\n history,\r\n ROUTES.TRAINEE_DETAILS_REPS\r\n .replace(\r\n ':userId',\r\n enrollment.user.id.toString()\r\n )\r\n .replace(\r\n ':enrollmentId',\r\n enrollment.id.toString()\r\n ).replace(\r\n ':scenarioId',\r\n submissionId.toString()\r\n )\r\n );\r\n };\r\n\r\n /**\r\n * Returns Due Date status title\r\n * @returns ReactNode | string\r\n */\r\n const getDueDateTitle = (): ReactNode | string => {\r\n const { hasOverdue, dueDate, user } = enrollment ?? {};\r\n\r\n if (!dueDate) {\r\n return 'No Due Date';\r\n } else if (hasOverdue) {\r\n return (\r\n <WarningTitle>\r\n {`${user!.firstName} ${user!.lastName}\r\n missed the due date of ${formatDateWithTimeZone(\r\n dueDate\r\n )}`}\r\n <StyledOverdueFlag />\r\n </WarningTitle>\r\n );\r\n } else {\r\n return `Due Date: ${formatDateWithTimeZone(dueDate)}`;\r\n }\r\n };\r\n\r\n const closeNudgeDialog = useCallback(() => {\r\n setShowNudgeDialog(false);\r\n }, []);\r\n\r\n const handleNudge = useCallback(\r\n (data: any) => {\r\n const { text, name: senderName } = data;\r\n if (enrollment?.user.id) {\r\n const nudgeUserData: NudgeData = {\r\n type: 'enrollment',\r\n enrollmentId: enrollment.id,\r\n receiverId: enrollment.user.id,\r\n text,\r\n senderName,\r\n };\r\n onNudgeTrainees([nudgeUserData], closeNudgeDialog);\r\n }\r\n },\r\n [enrollment?.user.id, enrollment?.id, onNudgeTrainees, closeNudgeDialog]\r\n );\r\n\r\n return (\r\n <MainWrapper\r\n title=\"Practis Set Report\"\r\n subTitle={enrollment?.practisSet?.name}\r\n subHeader={\r\n <SubHeaderContainer>\r\n {enrollment ? (\r\n <>\r\n <StatusContainer>\r\n {enrollment?.status ===\r\n EnrollmentStatus.PENDING && (\r\n <DetailsStatusPending data-test=\"practis-set-status\">\r\n Not Started\r\n </DetailsStatusPending>\r\n )}\r\n {enrollment?.status ===\r\n EnrollmentStatus.ENROLLED && (\r\n <DetailsStatusInProgress data-test=\"practis-set-status\">\r\n In Progress\r\n </DetailsStatusInProgress>\r\n )}\r\n {enrollment?.status ===\r\n EnrollmentStatus.COMPLETED && (\r\n <DetailsStatusCompleted data-test=\"practis-set-status\">\r\n Completed on{' '}\r\n {formatMMDDYY(\r\n new Date(enrollment.completedAt)\r\n )}\r\n </DetailsStatusCompleted>\r\n )}\r\n </StatusContainer>\r\n <DueDateSubTitle data-test=\"practis-set-due-date\">\r\n {getDueDateTitle()}\r\n </DueDateSubTitle>\r\n </>\r\n ) : (\r\n <DueDateSkeletonContainer>\r\n <Skeleton\r\n variant=\"text\"\r\n width={100}\r\n height={24}\r\n style={{\r\n background: 'var(--ps-grey-3)',\r\n }}\r\n />\r\n <Skeleton\r\n variant=\"text\"\r\n width={80}\r\n height={24}\r\n style={{\r\n background: 'var(--ps-grey-3)',\r\n }}\r\n />\r\n </DueDateSkeletonContainer>\r\n )}\r\n </SubHeaderContainer>\r\n }\r\n useGoBack={useGoBack}\r\n goBackUrl={goBackUrl}\r\n dataTest=\"practis-set-report\"\r\n headerMinHeight=\"114px\"\r\n >\r\n {loading || !enrollment\r\n ? <StyledLoading />\r\n : (\r\n <StyledTraineeDetailsContainer>\r\n <StyledDetailsHeader>\r\n <ProfileSection>\r\n <StyledDetailsAvatar>\r\n <AvatarPlaceholder\r\n profile={enrollment.user}\r\n iconWidth={17}\r\n iconHeight={20}\r\n bottomPosition={-6}\r\n noHint={true}\r\n dataTest=\"practis-set-user-avatar\"\r\n />\r\n </StyledDetailsAvatar>\r\n <StyledUserInfo>\r\n <StyledName isFlex={isPending}>\r\n <span data-test=\"practis-set-user-name\">\r\n {`${enrollment.user.firstName || ''} ${\r\n enrollment.user.lastName || ''\r\n }`}\r\n {profile && enrollment.user.id === profile.id && (\r\n <StyledAdditionalInfo>\r\n {' '}(You)\r\n </StyledAdditionalInfo>\r\n )}\r\n </span>\r\n {isPending && (\r\n <StyledPendingInvitationLabel>\r\n <StyledPendingTitle data-test=\"practis-set-pending-user-label\">\r\n Pending Registration\r\n </StyledPendingTitle>\r\n </StyledPendingInvitationLabel>\r\n )}\r\n </StyledName>\r\n <StyledEmail data-test=\"practis-set-user-email\">\r\n {enrollment.user.email}\r\n </StyledEmail>\r\n </StyledUserInfo>\r\n </ProfileSection>\r\n {!isPending && (\r\n <Button\r\n width=\"152px\"\r\n height=\"40px\"\r\n action={() => setShowNudgeDialog(true)}\r\n dataTest=\"nudge-button\"\r\n >\r\n Nudge\r\n </Button>\r\n )}\r\n </StyledDetailsHeader>\r\n <TableDivider />\r\n <GraphSection>\r\n <GraphRow>\r\n <Completion\r\n enrollment={enrollment}\r\n createdAt={enrollment?.startedAt}\r\n completedAt={enrollment.completedAt}\r\n />\r\n <DailyTimeSpent\r\n data={dailyTraining!.map(rep => {\r\n return {\r\n date: rep.date,\r\n value: toFixedNumber(rep.timeSpent / 60),\r\n };\r\n })}\r\n totalTime={enrollment.trainingTime}\r\n />\r\n </GraphRow>\r\n </GraphSection>\r\n <ReportsItems\r\n content={progress?.items}\r\n redirectChallenge={redirectToViewSubmission}\r\n redirectScenario={redirectToViewScenario}\r\n handleReviewReps={handleReviewReps}\r\n />\r\n </StyledTraineeDetailsContainer>\r\n )\r\n }\r\n {showNudgeDialog && (\r\n <DialogWrapper\r\n customization={{\r\n width: 480,\r\n padding: '49px 32px 32px 32px',\r\n }}\r\n >\r\n <NudgeUser\r\n title={`Send a direct message to ${enrollment!.user.firstName} ${enrollment!.user.lastName}`}\r\n fromUser={`${profile?.firstName} ${profile?.lastName}`}\r\n onSend={handleNudge}\r\n onClose={closeNudgeDialog}\r\n practisSetName={enrollment!.practisSet?.name ?? ''}\r\n />\r\n </DialogWrapper>\r\n )}\r\n </MainWrapper>\r\n );\r\n};\r\n\r\nexport const PractisSetReportContainer = () => {\r\n const data = usePractisSetReportState();\r\n const params = useParams<{ userId: string; enrollmentId: string }>();\r\n const profile = useSelector(getProfileState);\r\n const onGetPractisSetReport = usePractisSetReportService();\r\n const resetPractisSetReport = useResetPractisSetReportService();\r\n const nudgeTrainees = useNudgeTraineesService();\r\n const history = useHistory();\r\n\r\n const locationState: any = history.location.state;\r\n\r\n useHtmlPageTitle('Practis Set Report', [\r\n `${data.enrollment?.user.firstName} ${data.enrollment?.user.lastName}`,\r\n data.enrollment?.practisSet?.name,\r\n ]);\r\n\r\n return (\r\n <PractisSetReport\r\n profile={profile}\r\n enrollment={data.enrollment}\r\n progress={data.progress}\r\n dailyTraining={data.dailyTraining}\r\n loading={data.loading}\r\n params={params}\r\n useGoBack={!!locationState?.useGoBack}\r\n goBackUrl={ROUTES.USER_PERFORMANCE.replace(':userId', params.userId)}\r\n onGetPractisSetReport={onGetPractisSetReport}\r\n onResetPractisSetReport={resetPractisSetReport}\r\n onNudgeTrainees={nudgeTrainees}\r\n />\r\n );\r\n};\r\n\r\nexport default PractisSetReportContainer;","import CreateTeamController from './controller';\n\nexport default CreateTeamController;","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n height: 230px;\n box-sizing: border-box;\n flex: 1;\n padding: 24px 32px;\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px ${props => props.theme.Colors.paleGrey};\n display: flex;\n flex-direction: column;\n`;\n\nconst ChartBox: FC<{ className?: string }> = ({ children, className }) => {\n return <Container className={className}>{children}</Container>;\n};\n\nexport default ChartBox;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n font-size: 15px;\n font-weight: 800;\n color: ${props => props.theme.Colors.dark};\n margin-bottom: 20px;\n`;\n\nconst ChartBoxTitle: FC<{ className?: string, dataTest?: string }> = ({ children, className, dataTest }) => {\n return <Container className={className} data-test={dataTest}>{children}</Container>;\n};\n\nexport default ChartBoxTitle;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-items: flex-end;\n flex: 1;\n position: relative;\n`;\n\nconst ChartBoxBody: FC<{ className?: string }> = ({ children, className }) => {\n return <Container className={className}>{children}</Container>;\n};\n\nexport default ChartBoxBody;\n","import React, { FC } from 'react';\nimport ChartBox from '../ChartBox/ChartBox';\nimport ChartBoxTitle from '../ChartBox/ChartBoxTitle';\nimport ChartBoxBody from '../ChartBox/ChartBoxBody';\nimport styled from 'styled-components';\nimport { EnrollmentInterface } from '../../../../../../constants/interfaces/Enrollments';\n\nconst StyledChartBox = styled(ChartBox)`\n flex-direction: row;\n max-width: 480px;\n`;\n\nconst Statistics = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n height: 100%;\n`;\n\nconst BigText = styled.span<{ isEmpty?: boolean }>`\n font-size: 36px;\n line-height: 0.89;\n font-weight: 600;\n ${({isEmpty, theme}) => isEmpty && `color: ${theme.Colors.cloudyBlue}`}\n`;\n\nconst SmallText = styled.span`\n font-size: 20px;\n line-height: 2;\n font-weight: bold;\n`;\n\nconst Description = styled.span`\n margin: 0;\n color: ${({ theme }) => theme.Colors.steelGrey};\n font-size: 13px;\n`;\n\nconst AccuracyTestsContainer = styled(StyledChartBox)`\n border: 0;\n padding: 0;\n flex-direction: column;\n box-shadow: none;\n height: 100%;\n padding-right: 34px;\n max-width: 150px;\n`;\n\nconst ProgressContainer = styled(StyledChartBox)`\n border: 0;\n padding: 0;\n flex-direction: column;\n box-shadow: none;\n height: 100%;\n flex: 1;\n`;\n\nconst NumbersChartsBodies = styled(ChartBoxBody)`\n flex-direction: row;\n justify-content: space-between;\n min-width: 170px;\n`;\n\nconst VerticalBorder = styled.div`\n background: #e0e8ee;\n width: 1px;\n margin-right: 34px;\n`;\n\nconst Completion: FC<{\n enrollment: EnrollmentInterface;\n createdAt?: string;\n completedAt?: string;\n}> = ({ enrollment, createdAt, completedAt }) => {\n\n return (\n <StyledChartBox>\n {!!enrollment.practisSet.scenarioCount && (\n <>\n <AccuracyTestsContainer>\n <ChartBoxTitle dataTest=\"accuracy-tests-title\">Accuracy Tests</ChartBoxTitle>\n <ChartBoxBody>\n <Statistics>\n {!!enrollment.averageAccuracy ? (\n <BigText data-test=\"average-accuracy-percentage\">\n {Math.floor(\n enrollment.averageAccuracy * 100\n )}\n <SmallText>%</SmallText>\n </BigText>\n ) : (\n <BigText isEmpty={true} data-test=\"empty-average-accuracy\">—</BigText>\n )}\n <Description data-test=\"average-accuracy-text\">Average</Description>\n </Statistics>\n </ChartBoxBody>\n </AccuracyTestsContainer>\n <VerticalBorder />\n </>\n )}\n <ProgressContainer>\n <ChartBoxTitle dataTest=\"progress-title\">Progress</ChartBoxTitle>\n <NumbersChartsBodies>\n {!!enrollment.practisSet.scenarioCount && (\n <Statistics>\n <BigText data-test=\"scenario-progress\">\n <span data-test=\"passed-scenario-count\">{enrollment.passedScenarioCount}</span>\n <SmallText>\n {' '}of <span data-test=\"total-scenario-count\">{enrollment.practisSet.scenarioCount}</span>\n </SmallText>\n </BigText>\n <Description data-test=\"progress-scenarios-text\">Scenarios</Description>\n </Statistics>\n )}\n {!!enrollment.practisSet.challengeCount && (\n <Statistics>\n <BigText data-test=\"challenge-progress\">\n <span data-test=\"passed-challenge-count\">{enrollment.passedChallengeCount}</span>\n <SmallText>\n {' '}of <span data-test=\"total-challenge-count\">{enrollment.practisSet.challengeCount}</span>\n </SmallText>\n </BigText>\n <Description data-test=\"progress-challenges-text\">Challenges</Description>\n </Statistics>\n )}\n </NumbersChartsBodies>\n </ProgressContainer>\n </StyledChartBox>\n );\n};\n\nexport default Completion;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoChartData = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 21 20\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <g>\n <path\n d=\"M79.32 11.055V0h4v11.055h-4zm5.515 1.921l1.179 1.179-5.834 5.833-1.178-1.179 5.833-5.833zm-4.655 0l5.834 5.833-1.179 1.179-5.833-5.833 1.178-1.179zm1.807-11.643h-1.334v8.34h1.334v-8.34zm-9.334 1.334h4V20h-4V2.667zm1.333 16h1.334V4h-1.334v14.667zm-8-9.334h4V20h-4V9.333zm1.334 9.334h1.333v-8H67.32v8z\"\n transform=\"translate(-713 -224) translate(472) translate(176 224)\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoChartData;\n","import React, { FC, ReactElement } from 'react';\nimport styled from 'styled-components';\nimport NoChartData from '../../../../../../ui/icons/NoChartData';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n`;\n\nconst Text = styled.div`\n color: ${props => props.theme.Colors.cloudyBlue};\n font-size: 11px;\n font-weight: bold;\n text-align: center;\n max-width: 244px;\n height: 20px;\n margin-bottom: 8px;\n min-width: 155px;\n`;\n\nconst IconContainer = styled.div<{ customIcon: boolean }>`\n color: ${props => props.theme.Colors.cloudyBlue};\n ${({ customIcon }) =>\n !customIcon &&\n `\n width: 20px;\n height: 20px;\n `}\n margin-bottom: 8px;\n`;\n\nconst EmptySection: FC<{\n className?: string;\n emptyText?: string;\n icon?: ReactElement;\n dataTest?: string;\n}> = ({ children, className, emptyText, icon, dataTest }) => {\n return (\n <Container className={className}>\n <IconContainer customIcon={!!icon} data-test={dataTest && `${dataTest}-icon`}>\n {icon ?? <NoChartData />}\n </IconContainer>\n {emptyText ? (\n <Text data-test={dataTest && `${dataTest}-text`}>{emptyText}</Text>\n ) : (\n <Text data-test={dataTest && `${dataTest}-text`}>Nothing to show here</Text>\n )}\n </Container>\n );\n};\n\nexport default EmptySection;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div<{ top: number; left: number }>`\n padding: 8px 16px;\n box-sizing: border-box;\n min-width: 72px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n position: fixed;\n top: ${props => props.top}px;\n left: ${props => props.left}px;\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n background-color: white;\n`;\n\nconst Text = styled.div`\n font-family: Manrope;\n font-size: 11px;\n font-weight: 600;\n color: #212121;\n margin-bottom: 3px;\n`;\n\nconst Date = styled.div`\n font-family: Manrope;\n font-size: 11px;\n color: #6d7f8c;\n`;\n\nconst ToolTip: FC<{\n text: string;\n date: string;\n positions: { x: number | null; y: number | null };\n title: string;\n singleTitle?: string;\n}> = ({ text, date, positions, title, singleTitle }) => {\n if (!positions.x || !positions.y) {\n return <div />;\n }\n return (\n <Container top={positions.y} left={positions.x}>\n <Text>\n {Math.round(Number(text))} {Number(text) === 1 ? singleTitle || title : title}\n </Text>\n <Date>{date}</Date>\n </Container>\n );\n};\n\nexport default ToolTip;\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { select, Selection } from 'd3-selection';\nimport { scaleBand, scaleLinear } from 'd3-scale';\nimport { max } from 'd3-array';\nimport { axisBottom, axisLeft } from 'd3-axis';\nimport styled from 'styled-components';\nimport ToolTip from './ToolTip';\nimport {\n formatDateChart,\n isToday,\n} from '../../../helpers/functions/date-convert';\nimport { Variables } from '../../../theme/variables';\n\n//region Styles\nconst Container = styled.div`\n position: absolute;\n height: 100%;\n width: 100%;\n .tick line {\n visibility: hidden;\n }\n .tick text {\n color: #6d7f8c;\n font-size: 11px;\n font-weight: 500;\n }\n .domain {\n color: ${props => props.theme.Colors.paleGrey};\n }\n .x-axis-filler {\n fill: ${props => props.theme.Colors.paleGrey};\n }\n .x-axis-label {\n pointer-events: none;\n font-size: 11px;\n font-weight: 500;\n }\n .bar-container:hover {\n rect {\n opacity: 0.5;\n }\n rect:hover {\n opacity: 1;\n }\n }\n`;\n//endregion\n\nexport interface LineChartData {\n date: string;\n value: number | null;\n}\n\nconst BAR_WIDTH = 2;\n\nconst LineChart: FC<{\n data: LineChartData[];\n color: string;\n label?: string;\n singleLabel?: string;\n dataTest?: string;\n}> = ({ data, color, label, singleLabel, dataTest }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [dimensions, setDimensions] = useState({\n width: 620,\n height: 130,\n margin: 50,\n });\n\n const ref = useRef<SVGSVGElement>(null);\n const [selection, setSelection] = useState<Selection<\n SVGSVGElement,\n unknown,\n null,\n undefined\n > | null>(null);\n const [showToolTip, setShowToolTip] = useState(false);\n const [toolTipPositions, setToolTipPositions] = useState<{\n x: number | null;\n y: number | null;\n }>({\n x: null,\n y: null,\n });\n const [toolTipContent, setToolTipContent] = useState({\n header: '',\n text: '',\n });\n\n const handleResize = useCallback(() => {\n if (containerRef.current) {\n setDimensions({\n ...dimensions,\n width: containerRef.current.offsetWidth - 50,\n });\n }\n }, [setDimensions, dimensions]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [handleResize, dimensions]);\n\n useEffect(() => {\n if (containerRef.current) {\n setDimensions({\n height: 130,\n margin: 30,\n width: containerRef.current.offsetWidth - 50,\n });\n }\n }, [setDimensions]);\n\n useEffect(() => {\n if (!selection || !data || !data.length) {\n setSelection(ref.current && select(ref.current));\n } else {\n const x = scaleBand()\n .domain(data.map(d => d.date))\n .range([25, dimensions.width - 25]);\n\n const calculateMaxYValue = max(data, d => Number(d.value)!) || 5;\n const maxYValue = calculateMaxYValue < 5 ? 5 : calculateMaxYValue;\n\n const y = scaleLinear()\n .domain([0, maxYValue])\n .range([dimensions.height - dimensions.margin, 0]);\n\n const xAxis = axisBottom(x)\n .tickValues([])\n .tickFormat(d => d)\n .tickSizeOuter(0);\n\n const yAxis = axisLeft(y)\n .tickValues([0, maxYValue / 2, maxYValue])\n .tickSizeOuter(0);\n\n selection.selectAll('*').remove();\n\n const svg = selection\n .append('g')\n .attr(\n 'transform',\n `translate(${dimensions.margin}, ${dimensions.margin - 10})`\n );\n const rects = svg\n .append('g')\n .attr('class', 'bar-container')\n .selectAll('rect')\n .data(data);\n\n const rect = rects.enter().append('g');\n\n rect.append('rect')\n .attr('width', 2)\n .attr('height', 2)\n .attr('display', d => {\n if (isToday(d.date)) {\n return 'block';\n } else {\n return 'none';\n }\n })\n .attr('fill', color)\n .attr('x', (d, index) => {\n if (data.length > 5) {\n return x(d.date)! + x.bandwidth() / 2 - BAR_WIDTH / 2;\n } else {\n return index * 50 + 50;\n }\n })\n .attr('y', function (d) {\n return d.value ? y(d.value) : y(0) - 1;\n });\n\n rect.append('circle')\n .attr('fill', color)\n .attr('display', d => {\n if (isToday(d.date)) {\n return 'block';\n } else {\n return 'none';\n }\n })\n .attr('stroke', 'none')\n .attr('cursor', 'pointer')\n .attr('opacity', '0.2')\n .attr('cx', (d, index) => {\n if (data.length > 5) {\n return (\n x(d.date)! + x.bandwidth() / 2 - BAR_WIDTH / 2 + 1\n );\n } else {\n return index * 50 + 50 + 1;\n }\n })\n .attr('cy', d => {\n return d.value\n ? y(d.value)\n : dimensions.height - dimensions.margin;\n })\n .attr('r', 8);\n\n rect.append('rect')\n .attr('cursor', 'pointer')\n .attr('width', BAR_WIDTH)\n .attr('height', d =>\n typeof d.value === 'number' && d.value > 0\n ? dimensions.height - dimensions.margin - y(d.value)\n : 1\n )\n .attr('x', (d, index) => {\n if (data.length > 5) {\n return x(d.date)! + x.bandwidth() / 2 - BAR_WIDTH / 2;\n } else {\n return index * 50 + 50;\n }\n })\n .attr('y', d => {\n if (typeof d.value === 'number' && d.value > 0) {\n return y(d.value);\n } else {\n return dimensions.height - dimensions.margin - 1;\n }\n })\n .attr('fill', color)\n .attr('opacity', d => {\n if (isToday(d.date)) {\n return 0.5;\n } else {\n return 1;\n }\n })\n .on('mouseover', (e, data) => {\n setShowToolTip(true);\n setToolTipPositions({\n x: e.clientX - 35,\n y: e.clientY - 75,\n });\n setToolTipContent({\n header: `${data.value || 0}`,\n text: data.date,\n });\n })\n .on('mouseout', () => {\n setShowToolTip(false);\n setToolTipPositions({ x: null, y: null });\n });\n\n rect.append('text')\n .attr('class', 'x-axis-label')\n .attr('fill', Variables.Colors.steelGrey)\n .attr('text-anchor', 'middle')\n .attr('width', x.bandwidth())\n .attr('x', (d, index) => {\n if (data.length > 5) {\n return x(d.date)! + x.bandwidth() / 2 - BAR_WIDTH / 2;\n } else {\n return index * 50 + 50;\n }\n })\n .attr('y', () => {\n return dimensions.height - dimensions.margin + 20;\n })\n .text((d, index) => {\n if (index === 0 || index === data.length - 1) {\n return formatDateChart(d.date);\n } else {\n return '';\n }\n });\n\n svg.append('g')\n .attr(\n 'transform',\n `translate(0, ${dimensions.height - dimensions.margin})`\n )\n .call(xAxis);\n\n svg.append('rect')\n .attr('class', 'x-axis-filler')\n .attr('height', '1px')\n .attr('width', dimensions.width)\n .attr(\n 'transform',\n `translate(0, ${dimensions.height - dimensions.margin})`\n );\n\n svg.append('g').call(yAxis);\n }\n }, [selection, data, dimensions, color]);\n\n return (\n <Container ref={containerRef} data-test={dataTest}>\n <svg\n ref={ref}\n width={dimensions.width + dimensions.margin + 10}\n height={dimensions.height + dimensions.margin}\n />\n {showToolTip && (\n <ToolTip\n text={toolTipContent.header}\n date={formatDateChart(toolTipContent.text)}\n positions={toolTipPositions}\n title={label || ''}\n singleTitle={singleLabel}\n />\n )}\n </Container>\n );\n};\n\nexport default LineChart;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst ChartBoxHeader: FC<{ className?: string }> = ({\n children,\n className,\n}) => {\n return <Container className={className}>{children}</Container>;\n};\n\nexport default ChartBoxHeader;\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n margin-bottom: 20px;\n`;\n\nexport const ChartBoxDescriptionValue = styled.div`\n font-size: 11px;\n font-weight: 600;\n text-align: right;\n color: ${props => props.theme.Colors.black};\n`;\n\nexport const ChartBoxDescriptionTitle = styled.div`\n font-size: 11px;\n font-weight: 500;\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ChartBoxDescription: FC<{ className?: string }> = ({\n children,\n className,\n}) => {\n return <Container className={className}>{children}</Container>;\n};\n\nexport default ChartBoxDescription;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const DailyTimeSpentIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"33\"\n height=\"32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n className={className}\n >\n <g clip-path=\"url(#a)\" fill=\"#B1C0CB\">\n <rect x=\"2.5\" y=\"23.938\" width=\"2\" height=\"4.063\" rx=\"1\" />\n <rect x=\"8.5\" y=\"9\" width=\"2\" height=\"19\" rx=\"1\" />\n <rect x=\"14.5\" y=\"18\" width=\"2\" height=\"10\" rx=\"1\" />\n <rect x=\"20.5\" y=\"13\" width=\"2\" height=\"15\" rx=\"1\" />\n <rect x=\"26.5\" y=\"2\" width=\"2\" height=\"26\" rx=\"1\" />\n <path d=\"M.5 30h32v2H.5z\" />\n </g>\n <defs>\n <clipPath id=\"a\">\n <path\n fill=\"#fff\"\n transform=\"translate(.5)\"\n d=\"M0 0h32v32H0z\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default DailyTimeSpentIcon;\n","import React, { FC } from 'react';\nimport ChartBox from '../ChartBox/ChartBox';\nimport ChartBoxTitle from '../ChartBox/ChartBoxTitle';\nimport ChartBoxBody from '../ChartBox/ChartBoxBody';\nimport styled from 'styled-components';\nimport { Variables } from '../../../../../../theme/variables';\nimport EmptySection from './EmptySection';\nimport LineChart from '../../../../../../ui/components/Charts/LineChart';\nimport ChartBoxHeader from '../ChartBox/ChartBoxHeader';\nimport ChartBoxDescription, {\n ChartBoxDescriptionValue,\n} from '../ChartBox/ChartBoxDescription';\nimport DailyTimeSpentIcon from '../../../../../../ui/icons/DailyTimeSpentIcon';\nimport { secondsToMinSimple } from '../../../../../../helpers/functions/convert-time';\n\nconst StyledChartBox = styled(ChartBox)`\n padding-right: 40px;\n padding-left: 35px;\n margin-left: 20px;\n`;\n\ninterface DailyTimeSpentData {\n date: string;\n value: number;\n}\n\nconst ChartBoxDescriptionValueStyled = styled(ChartBoxDescriptionValue)`\n font-size: 13px;\n`;\n\nconst ChartBoxDescriptionValueNormal = styled.span`\n font-weight: normal;\n`;\n\nconst DailyTimeSpent: FC<{\n data?: DailyTimeSpentData[];\n totalTime?: number;\n}> = ({ data, totalTime }) => {\n return (\n <StyledChartBox>\n <ChartBoxHeader>\n <ChartBoxTitle dataTest=\"time-spent-title\">Time Spent</ChartBoxTitle>\n {Number(totalTime) > 0 &&\n <ChartBoxDescription>\n <ChartBoxDescriptionValueStyled data-test=\"total-time-value\">\n {secondsToMinSimple(totalTime)}{' '}\n <ChartBoxDescriptionValueNormal>\n in total\n </ChartBoxDescriptionValueNormal>\n </ChartBoxDescriptionValueStyled>\n </ChartBoxDescription>\n }\n </ChartBoxHeader>\n <ChartBoxBody>\n {data?.length ?\n <LineChart\n data={data}\n color={Variables.Colors.darkSkyBlue}\n label={'min'}\n dataTest=\"time-spent-chart\"\n /> :\n <EmptySection\n icon={<DailyTimeSpentIcon/>}\n emptyText=\"Shows the time spent by a learner on this Practis Set\"\n dataTest=\"empty-time-spent\"\n />\n }\n </ChartBoxBody>\n </StyledChartBox>\n );\n};\n\nexport default DailyTimeSpent;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ScenariosIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.286 19.333h14.286c.79 0 1.429-.595 1.429-1.333V3.333C22 2.597 21.36 2 20.572 2H6.286c-.789 0-1.428.597-1.428 1.333V18c0 .737.64 1.333 1.428 1.333zM19.858 3.334c.395 0 .714.298.714.667v13.333c0 .368-.32.667-.714.667H7c-.394 0-.714-.3-.714-.667V4.001c0-.369.32-.667.715-.667h12.857zm-1.43 12h-10c-.394 0-.714-.3-.714-.668 0-.368.32-.667.714-.667h10c.395 0 .715.299.715.667 0 .369-.32.667-.714.667zm-10-4h10c.395 0 .715-.3.715-.667 0-.368-.32-.667-.714-.667h-10c-.395 0-.715.299-.715.667 0 .368.32.667.714.667zm5.715-4H8.428c-.394 0-.714-.3-.714-.667 0-.369.32-.667.714-.667h5.715c.394 0 .714.298.714.667 0 .368-.32.666-.714.666zM3.429 22h15.714c.79 0 1.429-.597 1.429-1.334H3.429V4.668C2.639 4.668 2 5.264 2 6.001v14.666c0 .737.64 1.334 1.429 1.334z\"\n fill=\"#4AA9E2\"\n />\n </svg>\n );\n }\n);\n\nexport default ScenariosIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ChallengeIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.158 2.311v2.95h-1.062v-2.95h1.062zm2.279-.138V1H12.88V9.496l-2.183 3.57-.814-1.31a1 1 0 0 0-1.699 0l-6.033 9.716A1 1 0 0 0 3.002 23h17.776a1 1 0 0 0 .853-1.522L14.02 9.032V6.573h1.138v1.174h6.834V2.173h-4.555zM9.035 12.71l.947 1.525-4.56 7.456H3.459l5.576-8.981zm1.35 8.981v.086h9.804l-6.674-11-6.622 10.914h3.492zM20.803 3.485v2.95h-4.457v-2.95h4.457z\"\n fill=\"#EC513D\"\n />\n </svg>\n );\n }\n);\n\nexport default ChallengeIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TickIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 0 1 1.06-1.06L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0z\"\n fill=\"#0D8770\"\n />\n </svg>\n );\n }\n);\n\nexport default TickIcon;\n","import styled from 'styled-components';\nimport ArrowRight from '../../../../../../../ui/icons/ArrowRight';\nimport TickIcon from '../../../../../../../ui/icons/TickIcon';\n\nexport const StyledListBox = styled.div`\n border-radius: 4px;\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.05);\n border: solid 1px var(--ps-grey-4);\n display: flex;\n flex-direction: column;\n`;\n\nexport const StyledScenarioItem = styled.div<{ disabled?: boolean }>`\n padding: 24px 32px;\n display: flex;\n flex-direction: row;\n align-items: center;\n &:hover {\n background: var(--ps-grey-3);\n ${props => !props.disabled && `cursor: pointer`}\n }\n`;\n\nexport const ItemType = styled.span`\n font-size: 13px;\n color: var(--ps-grey-1);\n`;\n\nexport const ItemWithIconContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n width: 45%;\n`;\n\nexport const ItemContainer = styled.div`\n flex-direction: column;\n display: flex;\n padding-left: 8px;\n padding-right: 8px;\n`;\n\nexport const ItemTitle = styled.span`\n font-size: 15px;\n font-weight: bold;\n color: var(--ps-black-main);\n`;\n\nexport const ItemStatus = styled.span`\n font-size: 13px;\n line-height: 16px;\n margin-top: 8px;\n`;\n\nexport const ItemStatusGreen = styled(ItemStatus)`\n color: #0d8770;\n`;\n\nexport const ItemStatusBlue = styled(ItemStatus)`\n color: var(--ps-blue-main);\n`;\n\nexport const ItemStatusGrey = styled(ItemStatus)`\n color: var(--ps-grey-1);\n`;\n\nexport const RepsContainer = styled.div`\n display: flex;\n flex-direction: column;\n min-width: 70px;\n margin-left: 16px;\n align-items: flex-start;\n justify-content: center;\n width: 20%\n`;\n\nexport const StatisticsValue = styled.span<{ empty?: boolean }>`\n font-size: 20px;\n font-weight: 600;\n color: ${({ empty }) => (empty ? 'var(--ps-grey-2)' : 'var(--ps-black-main)')};\n line-height: ${({ empty }) => (empty ? '20px' : `unset`)};\n`;\n\nexport const StatisticsIndicator = styled.span`\n font-size: 16px;\n font-weight: 800;\n`;\n\nexport const RepsDescription = styled.span`\n font-size: 13px;\n color: var(--ps-grey-1);\n font-weight: 600;\n`;\n\nexport const AttemptText = styled.span`\n font-size: 15px;\n`;\n\nexport const ReviewButton = styled.span`\n font-size: 13px;\n color: var(--ps-blue-main);\n cursor: pointer;\n margin-top: 3px;\n`;\n\nexport const PlayScreenContainer = styled.div`\n width: 90px;\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nexport const PlayScreen = styled.div`\n width: 90px;\n height: 90px;\n border-radius: 8px;\n background-color: var(--ps-grey-21);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport const PlayButton = styled.div`\n color: var(--ps-blue-main);\n width: 24px;\n height: 24px;\n`\n\nexport const ArrowContainer = styled.div`\n color: var(--ps-blue-main);\n width: 24px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n margin-left: auto;\n`;\n\nexport const ArrowIcon = styled(ArrowRight)<{ disabled?: boolean }>`\n width: 10px;\n height: 16px;\n ${props => props.disabled && `color: #d2dfe6;`}\n`;\n\nexport const StyledTickIcon = styled(TickIcon)`\n height: 14px;\n`;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PlayTriangle = forwardRef<SVGSVGElement, IconProps>(\n ({ className, width = 24, height = 24 }, ref) => {\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path d=\"M4 5.765C4 3.682 5.734 2 7.865 2a3.92 3.92 0 0 1 2.198.67l9.271 6.236A3.74 3.74 0 0 1 21 12c0 1.235-.623 2.4-1.666 3.094l-9.27 6.235a3.975 3.975 0 0 1-2.2.671C5.735 22 4 20.306 4 18.235V5.765z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n\nexport default PlayTriangle;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoPlay = forwardRef<SVGSVGElement, IconProps>(\n ({ className, width = 32, height = 32 }, ref) => {\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox=\"0 0 32 32\"\n className={className}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path d=\"m26.892 11.846-2.34-1.47L8.055 26.504a5.265 5.265 0 0 0 3.756 1.543 5.462 5.462 0 0 0 2.89-.83l12.19-7.714c1.372-.86 2.191-2.3 2.191-3.829 0-1.528-.82-2.954-2.19-3.828zM19.455 7.13l-4.753-2.998a5.387 5.387 0 0 0-2.891-.83c-2.802 0-5.082 2.082-5.082 4.658v11.615L19.455 7.13z\" fill=\"currentColor\"/>\n <path d=\"m3.5 27 23-22.5\" stroke=\"#EC513D\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n );\n }\n);\n\nexport default NoPlay;\n","import React, { FC } from 'react';\n\nimport Scenarios from '../../../../../../../ui/icons/Scenarios';\nimport ChallengeIcon from '../../../../../../../ui/icons/ChallengeIcon';\nimport { formatMMDDYY } from '../../../../../../../helpers/functions/date-convert';\nimport { TableDivider } from '../../../../../../../ui/components/table-wrapper/table-divider';\nimport {\n EnrollmentProgress,\n TrainingContentType\n} from '../../../../../../../constants/interfaces/Enrollments';\nimport { TrainingMode } from '../../../../../../../constants/enums';\nimport {\n StyledListBox,\n StyledScenarioItem,\n ItemType,\n ItemContainer,\n ItemTitle,\n ItemStatusGreen,\n RepsContainer,\n StatisticsValue,\n StatisticsIndicator,\n RepsDescription,\n ArrowContainer,\n ArrowIcon,\n StyledTickIcon,\n ItemStatusBlue,\n ReviewButton,\n PlayScreenContainer,\n PlayScreen,\n AttemptText,\n PlayButton,\n ItemWithIconContainer,\n ItemStatusGrey,\n} from './styles';\nimport PlayTriangle from '../../../../../../../ui/icons/PlayTriangle';\nimport NoPlay from '../../../../../../../ui/icons/NoPlay';\n\nconst ScenarioListItem: FC<{\n enrollmentProgress: EnrollmentProgress;\n redirect: Function;\n handleReviewReps: Function\n}> = ({ enrollmentProgress, redirect, handleReviewReps }) => {\n const submission = enrollmentProgress.progress.submissions?.find(\n s => s.accuracy.modeScenario === TrainingMode.TEST_YOURSELF\n );\n const passed = !!enrollmentProgress.progress.completedAt;\n const inProgress = !passed && enrollmentProgress.progress.countReps > 0;\n const notStarted = !enrollmentProgress.progress.countReps;\n\n return (\n <StyledScenarioItem\n disabled={!submission}\n onClick={() => redirect(submission?.id)}\n data-test=\"scenario-item\"\n >\n <ItemWithIconContainer>\n <div data-test=\"scenario-item-icon\">\n <Scenarios />\n </div>\n <ItemContainer>\n <ItemType data-test=\"scenario-item-text\">Scenario</ItemType>\n <ItemTitle data-test=\"scenario-item-title\">{enrollmentProgress.content.title}</ItemTitle>\n {passed && (\n <ItemStatusGreen data-test=\"scenario-item-status\">\n <StyledTickIcon /> Completed{' '}\n {submission?.createdAt &&\n `on ${formatMMDDYY(\n new Date(submission?.createdAt ?? '')\n )}`}\n </ItemStatusGreen>\n )}\n {inProgress && <ItemStatusBlue data-test=\"scenario-item-status\">In Progress</ItemStatusBlue>}\n {notStarted && <ItemStatusGrey data-test=\"scenario-item-status\">Not Started</ItemStatusGrey>}\n </ItemContainer>\n </ItemWithIconContainer>\n <RepsContainer>\n <RepsDescription data-test=\"scenario-reps-text\">Reps</RepsDescription>\n <StatisticsValue data-test=\"scenario-reps-value\">\n <span data-test=\"scenario-reps-count\">{enrollmentProgress.progress.countReps}</span>\n <StatisticsIndicator>\n {' '}of <span data-test=\"scenario-reps-total-count\">{enrollmentProgress.content.minRepsCount}</span>\n </StatisticsIndicator>\n </StatisticsValue>\n {enrollmentProgress.progress.countReps > 0 && <ReviewButton data-test=\"scenario-review-button\" onClick={(e) => {\n e.stopPropagation();\n handleReviewReps(enrollmentProgress.content.scenarioId)\n }}>Review</ReviewButton>}\n </RepsContainer>\n <PlayScreenContainer>\n {!!submission?.accuracy && (\n <PlayScreen data-test=\"practis-set-item-play\">\n <PlayButton data-test=\"practis-set-item-play-icon\">\n {submission.mediaUrl ? <PlayTriangle /> : <NoPlay width={24} height={24} />}\n </PlayButton>\n </PlayScreen>\n )}\n </PlayScreenContainer>\n <RepsContainer>\n <RepsDescription data-test=\"scenario-accuracy-test-text\">Accuracy Test</RepsDescription>\n <StatisticsValue empty={!submission?.accuracy} data-test=\"scenario-accuracy-value\">\n {!!submission?.accuracy ? (\n <>\n {Math.floor(submission.accuracy.accuracy * 100)}\n % • {!!submission?.accuracy && (\n <>\n {enrollmentProgress.progress.countTries ?? 0}\n <AttemptText data-test=\"scenario-accuracy-attempts-text\">\n {' '}\n {enrollmentProgress.progress.countTries === 1\n ? 'Attempt'\n : 'Attempts'}\n </AttemptText>\n </>\n )}\n </>\n ) : (\n <>{'—'}</>\n )}\n </StatisticsValue>\n </RepsContainer>\n <ArrowContainer data-test=\"practis-set-item-arrow\">\n <ArrowIcon disabled={!submission} />\n </ArrowContainer>\n </StyledScenarioItem>\n );\n};\n\nconst ChallengeListItem: FC<{\n enrollmentProgress: EnrollmentProgress;\n redirect: Function;\n}> = ({ enrollmentProgress, redirect }) => {\n const submission = enrollmentProgress.progress.submission;\n const isSubmitted = submission?.status === 'active';\n\n return (\n <StyledScenarioItem\n disabled={!isSubmitted}\n onClick={() => isSubmitted && redirect(submission?.id)}\n data-test=\"challenge-item\"\n >\n <ItemWithIconContainer>\n <div data-test=\"challenge-item-icon\">\n <ChallengeIcon />\n </div>\n <ItemContainer>\n <ItemType data-test=\"challenge-item-text\">Challenge</ItemType>\n <ItemTitle data-test=\"challenge-item-title\">{enrollmentProgress.content.title}</ItemTitle>\n {submission?.reviewedAt && (\n <ItemStatusGreen data-test=\"challenge-item-status\">\n <StyledTickIcon /> Reviewed on{' '}\n {formatMMDDYY(new Date(submission?.reviewedAt))}\n </ItemStatusGreen>\n )}\n {isSubmitted && !submission!.reviewedAt && (\n <ItemStatusGrey data-test=\"challenge-item-status\">Needs Review</ItemStatusGrey>\n )}\n {!isSubmitted && (\n <ItemStatusGrey data-test=\"challenge-item-status\">Not Submitted</ItemStatusGrey>\n )}\n </ItemContainer>\n </ItemWithIconContainer>\n <RepsContainer />\n <PlayScreenContainer>\n {!!(submission && isSubmitted) && (\n <PlayScreen data-test=\"practis-set-item-play\">\n <PlayButton data-test=\"practis-set-item-play-icon\">\n {submission.mediaUrl ? <PlayTriangle /> : <NoPlay width={24} height={24} />}\n </PlayButton>\n </PlayScreen>\n )}\n </PlayScreenContainer>\n <RepsContainer>\n <RepsDescription data-test=\"challenge-score-text\">Score</RepsDescription>\n <StatisticsValue empty={!submission?.score} data-test=\"challenge-score-value\">\n {submission?.score ?? '—'}\n </StatisticsValue>\n </RepsContainer>\n <ArrowContainer data-test=\"practis-set-item-arrow\">\n <ArrowIcon disabled={!isSubmitted} />\n </ArrowContainer>\n </StyledScenarioItem>\n );\n};\n\nconst ReportsItems: FC<{\n content?: EnrollmentProgress[];\n redirectChallenge: Function;\n redirectScenario: Function;\n handleReviewReps: Function;\n}> = ({ content, redirectScenario, redirectChallenge, handleReviewReps }) => (\n <StyledListBox>\n {content?.map((item, index) => (\n <>\n {item.content.type === TrainingContentType.CHALLENGE ? (\n <ChallengeListItem\n enrollmentProgress={item}\n redirect={redirectChallenge}\n />\n ) : item.content.type === TrainingContentType.SCENARIO ? (\n <ScenarioListItem\n enrollmentProgress={item}\n redirect={redirectScenario}\n handleReviewReps={handleReviewReps}\n />\n ) : (\n <></>\n )}\n {index < content.length - 1 && <TableDivider />}\n </>\n ))}\n </StyledListBox>\n);\n\nexport default ReportsItems;\n","import { ListResult } from \"../../../../../../constants/interfaces/PaginationResult\";\nimport { RepLineType } from \"../types\";\n\nexport enum ACTIONS {\n GET_SCENARIO_REPS_START = 'GET_SCENARIO_REPS_START',\n GET_SCENARIO_REPS_SUCCESS = 'GET_SCENARIO_REPS_SUCCESS',\n GET_SCENARIO_REPS_FAILURE = 'GET_SCENARIO_REPS_FAILURE',\n CLEAR_SCENARIO_REPS = 'CLEAR_SCENARIO_REPS',\n}\nexport function getScenarioRepsStart() {\n return {\n type: ACTIONS.GET_SCENARIO_REPS_START as ACTIONS.GET_SCENARIO_REPS_START,\n };\n}\nexport function getScenarioRepsSuccess(data: ListResult<RepLineType>) {\n return {\n type: ACTIONS.GET_SCENARIO_REPS_SUCCESS as ACTIONS.GET_SCENARIO_REPS_SUCCESS,\n data\n };\n}\nexport function getScenarioRepsFailure(error: string) {\n return {\n type: ACTIONS.GET_SCENARIO_REPS_FAILURE as ACTIONS.GET_SCENARIO_REPS_FAILURE,\n error\n };\n}\nexport function clearScenarioReps() {\n return {\n type: ACTIONS.CLEAR_SCENARIO_REPS as ACTIONS.CLEAR_SCENARIO_REPS,\n };\n}","export function toFixedNumber(num: number) {\n return Math.round(num * 1e2) / 1e2;\n}\n","export const ITEMS_PER_PAGE = 20;\n\nexport const initialSearchParams = {\n limit: ITEMS_PER_PAGE,\n offset: 0,\n numberOfPages: 0,\n searchTerm: '',\n orderBy: null,\n}","import { useDispatch } from 'react-redux'\nimport { useCallback } from 'react';\nimport { useGetSubmissionRepLines } from '../../../../../../api';\nimport { useShowMessage } from '../../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport { getScenarioRepsStart, getScenarioRepsFailure, getScenarioRepsSuccess, clearScenarioReps } from './actions';\nimport { ErrorResult } from '../../../../../../constants/interfaces/ErrorResult';\nimport { SearchParams } from '../../../../../../constants/interfaces/filters';\nimport { RepLineType } from '../types';\n\n/**\n * @function useGetScenarioRepsService\n * @returns { CallableFunction }\n */\nexport const useGetScenarioRepsService = () => {\n const dispatch = useDispatch();\n const getScenarioRepsApi = useGetSubmissionRepLines();\n const showMessage = useShowMessage();\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback((searchParams: SearchParams, enrollmentId: string, scenarioId: string) => {\n const sp = {\n limit: searchParams.limit ?? 20,\n offset: searchParams.offset,\n enrollmentId: +enrollmentId,\n scenarioId: +scenarioId\n }\n dispatch(getScenarioRepsStart());\n return getScenarioRepsApi(sp)\n .then((data: ListResult<RepLineType>) => {\n dispatch(getScenarioRepsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(getScenarioRepsFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getScenarioRepsApi, showMessage]);\n}\n\n/**\n * @function useClearScenarionRepsService\n * @returns { CallableFunction }\n */\nexport const useClearScenarionRepsService = () => {\n const dispatch = useDispatch();\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback(() => {\n dispatch(clearScenarioReps());\n }, [dispatch]);\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { ListResult } from '../../../../../../constants/interfaces/PaginationResult';\nimport { RepLineType } from '../types';\n\nexport interface ScenarioRepsState {\n data?: ListResult<RepLineType>;\n isLoading: boolean;\n error?: string;\n}\nexport type ScenarioRepsStateSelector = (state: any) => ScenarioRepsState;\n\nexport const ScenarioRepsStateSelectorContext = React.createContext<ScenarioRepsStateSelector>(\n (e) => {\n throw new Error('Not implemented');\n }\n);\nexport function useScenarioRepsState(): ScenarioRepsState {\n return useSelector(useContext(ScenarioRepsStateSelectorContext));\n}\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nexport const Title = styled.div`\n display: flex;\n align-items: center;\n font-size: 13px;\n font-weight: bold;\n color: var(--ps-grey-1);\n`;\n\nexport const Subtitle = styled.div`\n font-size: 20px;\n display: flex;\n align-items: center;\n font-weight: bold;\n color: var(--ps-black-main);\n margin-bottom: 35px;\n`;\n\nexport const Container = styled.div`\n background: var(--ps-white-1);\n padding: 25px;\n height: 100vh;\n overflow-y: auto;\n border-top-left-radius: 12px;\n border-bottom-left-radius: 12px;\n position: relative;\n`;\n\nexport const StyledLoading = styled.div`\n position: absolute;\n top: calc(230px + (100vh - 230px) / 2);\n left: 0;\n width: 100%;\n`;\n\nexport const useStyles = makeStyles(theme => ({\n tableWrapperStyle: {\n borderTop: '1px solid var(--ps-grey-4)',\n },\n customTableColumnStyle: {\n paddingLeft: '15px'\n }\n}))","import { formatDate } from '../../../../../helpers/functions/date-convert';\nimport { ModalPageContainer } from '../../../../../ui/components/ModalPage';\nimport { TableWrapper } from '../../../../../ui/components/table-wrapper';\nimport { ITEMS_PER_PAGE } from './constants';\nimport { Title, Subtitle, Container, useStyles, StyledLoading } from './styles';\nimport { RepLineType, ScenarioRepViewPropsType } from './types';\nimport { trainingModeNames } from '../../../../../constants/enums';\nimport { Loading } from '../../../../../ui/components/LoadingCopmonent';\n\nexport const ScenarioRepsView = ({closePath,\n closeGoingBack, \n scenarioName, \n tableStates, \n reps,\n isLoading,\n lastRefreshed, \n refreshData,\n handlePageChange,\n repGeneralNumber\n}: ScenarioRepViewPropsType) => {\n const classes = useStyles();\n return <ModalPageContainer\n closePath={closePath}\n closeGoingBack={closeGoingBack}\n width={'544px'}>\n <Container>\n <Title>Scenario</Title>\n <Subtitle>{scenarioName}</Subtitle>\n {isLoading && !reps?.items.length && (\n <StyledLoading><Loading /></StyledLoading>\n )}\n <TableWrapper\n tableWrapperClassName={classes.tableWrapperStyle}\n tableStates={tableStates}\n data={reps?.items}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'scenario-rep-timestamp',\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: reps?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied: false,\n noUrlChange: true,\n dataTest: 'rep-line-paging',\n },\n isSelectedItemOptionsVisible: false,\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState: false\n }}\n configurations={{\n columns: [\n {\n title: 'Date',\n width: 20,\n className: classes.customTableColumnStyle,\n disabled: tableStates.disableSorting,\n dataTest: 'date-column',\n },\n {\n title: 'Mode',\n width: 20,\n disabled: tableStates.disableSorting,\n dataTest: 'mode-column',\n },\n {\n title: 'Rep',\n width: 20,\n disabled: tableStates.disableSorting,\n dataTest: 'rep-column',\n },\n {\n title: 'Accuracy',\n width: 20,\n disabled: tableStates.disableSorting,\n dataTest: 'accuracy-column',\n },\n ],\n\n rowConfig: {\n cells: [\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (rep: RepLineType) =>\n !rep.createdAt,\n fieldProps: {\n renderTitle: (rep: RepLineType) => formatDate(rep.createdAt),\n dataTest: 'rep-line-date-item',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (rep: RepLineType) =>\n !rep.accuracy.modeScenario,\n fieldProps: {\n renderTitle: (rep: RepLineType) => trainingModeNames[rep.accuracy.modeScenario],\n dataTest: 'rep-line-mode-item',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (rep: RepLineType) =>\n !rep.repNumber || !repGeneralNumber,\n fieldProps: {\n renderTitle: (rep: RepLineType) => `${rep.repNumber} of ${repGeneralNumber}`,\n dataTest: 'rep-line-rep-item',\n },\n },\n {\n fieldType: 'TEXT_FIELD',\n shouldShowEmptyCell: (rep: RepLineType) =>\n !rep.accuracy.accuracy,\n fieldProps: {\n renderTitle: (rep: RepLineType) => Math.floor(rep.accuracy.accuracy * 100) + '%',\n dataTest: 'rep-line-accuracy-item',\n },\n },\n ],\n },\n }}\n />\n </Container>\n </ModalPageContainer>\n ;\n}\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { useParams, withRouter } from 'react-router-dom';\nimport { useSearchParamsState } from '../../../../../constants/interfaces/filters';\nimport { useTableStateHelper } from '../../../../../ui/components/table-wrapper/helper';\nimport { initialSearchParams } from './constants';\nimport { useClearScenarionRepsService, useGetScenarioRepsService } from './store/services';\nimport { useScenarioRepsState } from './store/states';\nimport { usePractisSetReportState } from '../../../store/states';\nimport { ScenarioRepsView } from './view';\nimport { ScenarioRepPropsType } from './types';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nconst ScenarioRepsController: FC<ScenarioRepPropsType> = ({closePath, closeGoingBack}) => {\n const { data: reps, isLoading } = useScenarioRepsState();\n const handleTableStates = useTableStateHelper();\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n\n const params: {\n userId?: string;\n enrollmentId?: string;\n scenarioId?: string;\n } = useParams();\n\n const { userId, enrollmentId, scenarioId } = params;\n const { enrollment, progress: setProgress } = usePractisSetReportState();\n\n let repGeneralNumber: number = 0;\n let scenarioName = '';\n let creator = '';\n\n if (enrollment && enrollmentId && scenarioId && enrollment.id === +enrollmentId) {\n const submission = setProgress?.items.find(({ content }) => content.scenarioId === +scenarioId);\n\n if (submission) {\n const { content, progress } = submission;\n\n scenarioName = content.scenario?.title || '';\n repGeneralNumber = progress?.countReps || 0;\n creator = content.scenario?.creator?.firstName + ' ' + content.scenario?.creator?.lastName;\n }\n }\n\n const tableStates = handleTableStates({\n itemsCount: reps?.items?.length || 0,\n });\n\n const { searchParams, setOffset } =\n useSearchParamsState(initialSearchParams);\n\n const searchScenarioReps = useGetScenarioRepsService();\n const clearScenarioReps = useClearScenarionRepsService();\n\n useEffect(() => {\n if (enrollmentId && scenarioId) {\n searchScenarioReps(searchParams, enrollmentId, scenarioId);\n }\n return () => {\n clearScenarioReps();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = useCallback(\n (_, offset: number): void => {\n setOffset(offset);\n enrollmentId && scenarioId && searchScenarioReps({ ...searchParams, offset }, enrollmentId, scenarioId);\n },\n [searchParams, setOffset, searchScenarioReps, enrollmentId, scenarioId]\n );\n\n /**\n * @function refreshData\n * @returns { void }\n */\n const refreshData = useCallback(() => {\n enrollmentId && scenarioId && searchScenarioReps(searchParams, enrollmentId, scenarioId);\n setLastRefreshed(new Date());\n }, [searchScenarioReps, searchParams, enrollmentId, scenarioId]);\n\n useHtmlPageTitle('Rep log', [creator, scenarioName]);\n\n return <ScenarioRepsView\n closePath={closePath\n .replace(':userId', userId ?? '')\n .replace(':enrollmentId', enrollmentId ?? '')\n .replace(':scenarioId', scenarioId ?? '')\n }\n closeGoingBack={closeGoingBack}\n scenarioName={scenarioName}\n tableStates={tableStates}\n reps={reps}\n isLoading={isLoading}\n lastRefreshed={lastRefreshed}\n refreshData={refreshData}\n handlePageChange={handlePageChange}\n repGeneralNumber={repGeneralNumber}\n />;\n}\n\nexport default withRouter(ScenarioRepsController);","import { AppState } from './reducers';\r\n\r\nfunction selectAppState(state: AppState) {\r\n return state as AppState;\r\n}\r\n\r\nexport function selectTrainerState(state: AppState) {\r\n return selectAppState(state).progress;\r\n}\r\n\r\nexport function selectTainerPractisSetState(state: AppState) {\r\n return selectAppState(state).practisSetsTraining;\r\n}\r\n\r\nexport function selectUpdatedProgressState(state: AppState) {\r\n return selectTrainerState(state).updatedProgress;\r\n}\r\n\r\nexport function PractisSetsEnrollmentState(state: AppState) {\r\n return selectTrainerState(state).enrollments;\r\n}\r\n\r\nexport function TrainerInvitationState(state: AppState) {\r\n return selectAppState(state).assignUsers;\r\n}\r\n\r\nexport function PractisSetReportsState(state: AppState) {\r\n return selectTrainerState(state).report;\r\n}\r\n\r\nexport function UsersState(state: AppState) {\r\n return selectAppState(state).users;\r\n}\r\n\r\nexport function AuthState(state: AppState) {\r\n return selectAppState(state).auth;\r\n}\r\n\r\nexport function InvitationsState(state: AppState) {\r\n return selectAppState(state).invitations;\r\n}\r\n\r\nexport function UserPerformanceState(state: AppState) {\r\n return selectAppState(state).performance;\r\n}\r\n\r\nexport function UpdatedUsersState(state: AppState) {\r\n return selectAppState(state).updatedUsers;\r\n}\r\n\r\nexport function UpdatedInvitationsState(state: AppState) {\r\n return selectAppState(state).updatedInvitations;\r\n}\r\n\r\nexport function UpdatedUserPractisSetsState(state: AppState) {\r\n return selectAppState(state).updatedUserPractisSets;\r\n}\r\n\r\nexport function VoiceGenerationState(state: AppState) {\r\n return selectAppState(state).voiceGeneration;\r\n}\r\n\r\nexport function LibraryPractisSetsState(state: AppState) {\r\n return selectAppState(state).libraryPractisSets;\r\n}\r\n\r\nexport function UpdatedLibraryPractisSetsState(state: AppState) {\r\n return selectAppState(state).libraryUpdatedPractisSets;\r\n}\r\n\r\nexport function LibraryScenariosState(state: AppState) {\r\n return selectAppState(state).libraryScenarios;\r\n}\r\n\r\nexport function UpdatedLibraryScenariosState(state: AppState) {\r\n return selectAppState(state).libraryUpdatedScenarios;\r\n}\r\n\r\nexport function LibraryChallengesState(state: AppState) {\r\n return selectAppState(state).libraryChallenges;\r\n}\r\n\r\nexport function UpdatedLibraryChallengesState(state: AppState) {\r\n return selectAppState(state).libraryUpdatedChallenges;\r\n}\r\n\r\nexport function ChallengeState(state: AppState) {\r\n return selectAppState(state).challenge;\r\n}\r\n\r\nexport function SubmissionsState(state: AppState) {\r\n return selectAppState(state).submissions;\r\n}\r\n\r\nexport function SubmissionPaginationState(state: AppState) {\r\n return selectAppState(state).submissionPagination;\r\n}\r\n\r\nexport function SubmissionDetailsState(state: AppState) {\r\n return selectAppState(state).submissionDetails;\r\n}\r\n\r\nexport function AccuracyScoreState(state: AppState) {\r\n return selectAppState(state).accuracyscore;\r\n}\r\n\r\nexport function UpdatedSubmissionsState(state: AppState) {\r\n return selectAppState(state).updatedSubmissions;\r\n}\r\n\r\nexport function CompanyVoiceSettingsState(state: AppState) {\r\n return selectAppState(state).companyVoiceSettings;\r\n}\r\n\r\nexport function LabelsState(state: AppState) {\r\n return selectAppState(state).labels;\r\n}\r\n\r\nexport function LabelsConfigState(state: AppState) {\r\n return selectAppState(state).labelsConfig;\r\n}\r\n\r\nexport function UpdatedLabelsState(state: AppState) {\r\n return selectAppState(state).updatedLabels;\r\n}\r\n\r\nexport function SelectPermissionsState(state: AppState) {\r\n const profile = selectAppState(state).profile.info;\r\n return profile && profile.permissions ? profile.permissions : [];\r\n}\r\n\r\nexport function SelectLogsState(state: AppState) {\r\n return selectAppState(state).logs;\r\n}\r\nexport function SelectTelepromterState(state: AppState) {\r\n return selectAppState(state).telepromter;\r\n}\r\n\r\nexport function DraftsState(state: AppState) {\r\n return selectAppState(state).drafts;\r\n}\r\n\r\nexport function DraftEditState(state: AppState) {\r\n return selectAppState(state).draftEdit;\r\n}\r\n\r\nexport function UpdatedDraftsState(state: AppState) {\r\n return selectAppState(state).updatedDrafts;\r\n}\r\n\r\nexport function SelectAiLogsState(state: AppState) {\r\n return selectAppState(state).aiLogs;\r\n}\r\n\r\nexport function TeamsState(state: AppState) {\r\n return selectAppState(state).teams;\r\n}\r\n\r\nexport function UpdatedMembersState(state: AppState) {\r\n return selectAppState(state).updatedMembers;\r\n}\r\n\r\nexport function UpdatedTeamsState(state: AppState) {\r\n return selectAppState(state).updatedTeams;\r\n}\r\n\r\nexport function TeamMembersState(state: AppState) {\r\n return selectAppState(state).teamMembers;\r\n}\r\n\r\nexport function TeamsEditState(state: AppState) {\r\n return selectAppState(state).teamEdit;\r\n}\r\n\r\nexport function RolesState(state: AppState) {\r\n return selectAppState(state).roles;\r\n}\r\n\r\nexport function CompanyAdminsState(state: AppState) {\r\n return selectAppState(state).companyAdmins;\r\n}\r\n\r\nexport function CompanyUserStatsState(state: AppState) {\r\n return selectAppState(state).companyUserStats;\r\n}\r\n\r\nexport function ReportsState(state: AppState) {\r\n return selectAppState(state).reports;\r\n}\r\n\r\nexport function OverdueLearnersState(state: AppState) {\r\n return selectAppState(state).overdueLearners;\r\n}\r\n\r\nexport function ScenarioRepsState(state: AppState) {\r\n return selectAppState(state).scenarioReps;\r\n}\r\n\r\nexport function RoleplaysState(state: AppState) {\r\n return selectAppState(state).roleplays\r\n}\r\n\r\nexport function RoleplayState(state: AppState) {\r\n return selectAppState(state).roleplay\r\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Published = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 24 24\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M448.782 65.759l-10.473 10.414c-.016.02-.01.048-.027.066-.15.15-.347.215-.544.21-.2.007-.4-.055-.552-.208-.022-.021-.014-.055-.033-.078l-4.43-4.405c-.29-.288-.29-.756 0-1.046.29-.288.76-.288 1.051 0l3.959 3.937 9.995-9.938c.29-.29.763-.29 1.054 0 .29.289.29.759 0 1.048zm-11.785-4.26c-5.799 0-10.5 4.701-10.5 10.5 0 5.8 4.701 10.5 10.5 10.5s10.5-4.7 10.5-10.5c0-.227-.053-.438-.067-.661l1.383-1.344c.11.654.18 1.32.18 2.005 0 6.628-5.37 12-11.996 12S425 78.627 425 71.999C425 65.372 430.37 60 436.997 60c3.04 0 5.808 1.14 7.923 3.005l-1.103 1.072c-1.838-1.585-4.203-2.578-6.82-2.578z\"\n transform=\"translate(-1167 -60) translate(742)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default Published;\n","import { useMemo } from \"react\";\nimport { UserProfile, UserV2 } from \"../../../constants/interfaces/User\";\nimport { useLoggedInUserProfileState } from '../../users/store/states';\nimport { hasPermission, NEW_PERMISSIONS } from '../../users/tools';\nimport { getBulkActionAvailabilityItem, getBulkActionsAvailability } from \"../../../tools/bulkActions\";\n\nexport enum TraineeInvitationActions {\n SET_DUEDATE,\n}\n\n\nfunction createTraineeInvitationActionHelper(loggedInUser: UserProfile | undefined) { \n const canUpdateDueDate = () => hasPermission(loggedInUser, NEW_PERMISSIONS.SET_DUE_DATE);\n\n const getBulkActions = (trainees?: (UserV2 & {dueDate?: Date})[]) =>\n getBulkActionsAvailability(\n trainees,\n [\n getBulkActionAvailabilityItem(\n TraineeInvitationActions.SET_DUEDATE,\n trainees,\n canUpdateDueDate\n ),\n ]\n );\n\n return {\n canUpdateDueDate,\n getBulkActions,\n };\n}\n\nexport type TraineeInvitationActionHelper = ReturnType<typeof createTraineeInvitationActionHelper>;\n\nexport function useTraineeInvitationActionHelpers() {\n const loggedInUser = useLoggedInUserProfileState();\n return useMemo(\n () => createTraineeInvitationActionHelper(loggedInUser),\n [loggedInUser]\n );\n}\n ","import { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { UserV2 } from '../../../../constants/interfaces/User';\nimport dayjs from 'dayjs';\nimport { DATE_FORMAT } from '../../../../constants/interfaces/DueDates';\n/**\n * @description find selected trainee due date\n * @function findSelectedTraineeDueDate\n * @param { PaginationResult<UserInterface> | undefined } trainees\n * @param { number } selectedTraineeId\n * @returns { string | null }\n */\nexport const findSelectedTraineeDueDate = (\n trainees: ListResult<UserV2 & {dueDate?: Date}> | undefined,\n selectedTraineeId: number\n): string | null => {\n const date = trainees?.items?.find(trainee => trainee.id === selectedTraineeId)?.dueDate;\n\n return date ? dayjs(date as Date).format(DATE_FORMAT) : null;\n};\n","import styled from 'styled-components';\n\nexport const ActionMenuHandler = styled.div<{\n open: boolean;\n hasCustomComponent: boolean;\n}>`\n width: 10px;\n ${({ hasCustomComponent }) => !hasCustomComponent && `height: 24px;`}\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 8px;\n color: ${props => props.theme.Colors.steelGrey};\n box-shadow: ${props =>\n props.open && !props.hasCustomComponent\n ? `0 0 0 1px ${props.theme.Colors.cloudyBlue}`\n : 'none'};\n background-color: ${props =>\n props.open && !props.hasCustomComponent\n ? props.theme.Colors.whiteTwo\n : 'unset'};\n`;\n\nexport const IconContainer = styled.div`\n height: 100%;\n width: 12px;\n cursor: pointer;\n margin: 0 5px;\n display: flex;\n align-items: center;\n &:active {\n opacity: 0.7;\n }\n`;\n\nexport const menuPaperStyle = {\n width: 168,\n boxShadow: '0 5px 20px 0 rgba(0, 0, 0, 0.1)',\n padding: '8px',\n borderRadius: 8,\n background: '#fff',\n right: 20,\n marginTop: 40,\n};\n","import { FC, Fragment, useState } from 'react';\nimport { Menu } from '@material-ui/core';\n\nimport { ActionItem } from '../../../../../../../ui/components/ActionButton';\n\nimport Dots from '../../../../../../../ui/icons/Dots';\nimport { CheckPermission } from '../../../../../../permissions';\nimport { ActionMenuHandler, IconContainer, menuPaperStyle } from './styles';\nimport { DueDateListActionProps } from './contants';\n\nconst uuid = require('uuid/v1');\n\nconst DueDateListAction: FC<DueDateListActionProps> = props => {\n const { actions } = props;\n\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const isVisible = Boolean(anchorEl);\n\n /**\n * @function handleToggle\n * @param { React.MouseEvent<HTMLElement> } event\n * @returns { void }\n */\n const handleToggle = (event: React.MouseEvent<HTMLElement>): void => {\n setAnchorEl(event.currentTarget);\n };\n\n /**\n * @function handleClose\n * @returns { void }\n */\n const handleClose = (): void => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <IconContainer onClick={handleToggle} data-test=\"due-date-actions-button\">\n <ActionMenuHandler open={isVisible} hasCustomComponent={false}>\n <Dots />\n </ActionMenuHandler>\n </IconContainer>\n {isVisible && (\n <Menu\n id=\"Due-Date-Menu\"\n MenuListProps={{\n 'aria-labelledby': 'long-button',\n }}\n anchorEl={anchorEl}\n open={isVisible}\n onClose={handleClose}\n PaperProps={{\n style: menuPaperStyle,\n }}\n >\n {actions.map(action => {\n const { title, permissions, onClick, dataTest } = action;\n\n return (\n <Fragment key={uuid()}>\n {permissions ? (\n <CheckPermission permissions={permissions}>\n <ActionItem\n onClick={() => {\n onClick();\n handleClose();\n }}\n dataTest={dataTest}\n >\n {title}\n </ActionItem>\n </CheckPermission>\n ) : (\n <ActionItem\n onClick={() => {\n onClick();\n handleClose();\n }}\n >\n {title}\n </ActionItem>\n )}\n </Fragment>\n );\n })}\n </Menu>\n )}\n </>\n );\n};\n\nexport default DueDateListAction;\n","import { History } from 'history';\r\nimport { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useParams } from 'react-router';\r\n\r\nimport ModalPage, {\r\n ModalPageContainerProps,\r\n} from '../../../../ui/components/ModalPage/ModalPage';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport { PractisSets } from '../../../../constants/interfaces/PractisSets';\r\nimport { UserInterface, UserProfile, UserV2 } from '../../../../constants/interfaces/User';\r\nimport { PractisSetsEnrollmentState } from '../../../../store/selectors';\r\nimport {\r\n useClearLabelFilterActionService,\r\n useEnrollPractisSetsToUsersService,\r\n useGetPractisSetService,\r\n useSaveSelectedInvitationLabelsService,\r\n useSearchAssignUsersService,\r\n useUpdateAllSelectedInvitationTraineesStateService,\r\n useUpdateSelectedInvitationTraineesStateService,\r\n} from '../../store/services';\r\nimport { useTrainerInvitationState } from '../../store/states';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport {\r\n formatDate,\r\n formatDateWithTimeZone,\r\n} from '../../../../helpers/functions/date-convert';\r\nimport { useLabelsState } from '../../../labels/store/states';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport {\r\n clearSelectedItemIfNotLoaded,\r\n useHandleSelectLabels,\r\n} from '../../../labels/tools';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { Label } from '../../../../constants/interfaces/Label';\r\nimport { listToTree } from '../../../../helpers/functions/list-to-tree';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { WithLabelsContext } from '../../../portableLabels';\r\nimport Published from '../../../../ui/icons/Published';\r\nimport { useLabelsState as useLocalLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { AllUsersFilter } from '../ManageTeam/components/Filters/AllUsersFilters';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\r\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\r\nimport User from '../../../../ui/icons/User';\r\nimport {\r\n TraineeInvitationActionHelper,\r\n TraineeInvitationActions,\r\n useTraineeInvitationActionHelpers,\r\n} from '../../tools/TraineeInvitationActionHelpers';\r\nimport { findSelectedTraineeDueDate } from './helper';\r\nimport { DueDateCalendar } from '../../../../ui/components/DueDateCalendar';\r\nimport DueDateListAction from './components/ListActions/DueDateListAction';\r\nimport { isEmpty as lodashIsEmpty, uniqBy } from 'lodash';\r\nimport {\r\n DueDateType,\r\n} from '../../../../constants/interfaces/DueDates';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport {\r\n Avatar,\r\n AvatarTile,\r\n CancelWrapper,\r\n IconWrapper,\r\n InvitationHeader,\r\n InvitationHeaderSubText,\r\n InvitationHeaderWrapper,\r\n QuickAssignmentInvitationFooter,\r\n QuickAssignmentInvitationHeaderText,\r\n StyledFirstTableItemContent,\r\n StyledTableCell,\r\n StyledTraineeInvitationContainer,\r\n useStyles,\r\n} from './styles';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport { TableDivider } from '../../../../ui/components/table-wrapper/table-divider';\r\nimport { TableLabelTags } from '../../../../ui/components/table-wrapper/table/TableLabelTags';\r\nimport TableTitleOverflowText from '../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\r\nimport { TableViewMode } from '../../../../ui/components/table-wrapper/table/type';\r\nimport { countAppliedFiltersCount } from './tools';\r\nimport { useCreateEnrollmentBulkActionService } from './services/EnrollmentBulkActionsService';\r\nimport { EnrollmentType } from '../../../../api/enrollments/types';\r\nimport useHtmlPageTitle from '../../../../helpers/hooks/useHtmlPageTitle';\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst TraineeQuickAssignment: FC<{\r\n profile?: UserProfile;\r\n history: History<any>;\r\n searchTrainees(searchParams: SearchParams, isRefreshed?: boolean): void;\r\n params: { practisSetId?: number };\r\n trainees?: ListResult<UserV2 & {dueDate?: Date}>;\r\n selectedTrainees?: number[];\r\n updateSelectedTrainees(userId: number): void;\r\n updateAllSelectedTrainees(\r\n userIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n practisSet?: PractisSets;\r\n updateTrainees?: Array<any>;\r\n loading?: boolean;\r\n onEnrollPractisSetsToUsers: (params: EnrollmentType[]) => Promise<void>;\r\n onGetPractisSet: (practisSetId: number) => void;\r\n selectedLabels?: number[];\r\n actionsHelper: TraineeInvitationActionHelper;\r\n}> = ({\r\n profile,\r\n trainees,\r\n selectedTrainees,\r\n updateSelectedTrainees,\r\n updateAllSelectedTrainees,\r\n params,\r\n searchTrainees,\r\n loading,\r\n updateTrainees,\r\n onEnrollPractisSetsToUsers,\r\n history,\r\n onGetPractisSet,\r\n practisSet,\r\n selectedLabels,\r\n actionsHelper,\r\n}) => {\r\n const classes = useStyles();\r\n const localLabels = useLocalLabelsState();\r\n const labelsList = usePortableLabelsState();\r\n const saveLabels = useSaveLabels();\r\n const setLabelSelect = useSelectLabels();\r\n const handleSelectLabels = useHandleSelectLabels();\r\n const labelsTree = listToTree(labelsList.data.items);\r\n const [isDueDateCalendarVisible, setIsDueDateCalendarVisible] =\r\n useState<boolean>(false);\r\n\r\n const [dueDateData, setDueDateData] = useState<any>();\r\n const [dueDates, setDueDates] = useState<DueDateType>();\r\n\r\n useHtmlPageTitle('Assign Users and Due Dates', [practisSet?.name]);\r\n\r\n const localSelectedLabels = useMemo(\r\n () =>\r\n localLabels.saved.length > 0\r\n ? localLabels.saved\r\n : selectedLabels || [],\r\n [localLabels.saved, selectedLabels]\r\n );\r\n\r\n const isCheckboxPartiallySelected =\r\n trainees &&\r\n trainees.items &&\r\n selectedTrainees &&\r\n selectedTrainees.length < trainees.items.length;\r\n\r\n const isListEmpty = !trainees || !trainees?.items?.length;\r\n\r\n useEffect(() => {\r\n if (localLabels.saved.length < 1 && selectedLabels) {\r\n setLabelSelect(selectedLabels);\r\n }\r\n }, [selectedLabels, localLabels.saved, setLabelSelect]);\r\n\r\n const onLocalRemoveLabels = (label: Label) => {\r\n if (localSelectedLabels.length > 0) {\r\n setLabelSelect(\r\n handleSelectLabels(label, localSelectedLabels, labelsTree)\r\n );\r\n saveLabels();\r\n }\r\n };\r\n\r\n const scrollRef = useRef<any>(null);\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n orderBy: { field: 'name', asc: true },\r\n practisSetId: params.practisSetId,\r\n filters: [],\r\n labelIDs: localSelectedLabels,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n companyId: profile?.companyId\r\n };\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOffset,\r\n setLabelIDs,\r\n refreshSearchParams,\r\n setOrderBy,\r\n setCustom,\r\n } = useSearchParamsState(initialSearchParams);\r\n\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n\r\n const refreshData = useCallback(() => {\r\n searchTrainees(\r\n {\r\n ...searchParams,\r\n offset: 0,\r\n limit: ITEMS_PER_PAGE + searchParams.offset, // we should increase the limit to fetch all loaded data again\r\n },\r\n true\r\n );\r\n setLastRefreshed(new Date());\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n }, [\r\n searchParams,\r\n searchTrainees,\r\n updateAllSelectedTrainees,\r\n isCheckboxPartiallySelected,\r\n ]);\r\n\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n\r\n useEffect(() => {\r\n params.practisSetId && onGetPractisSet(params.practisSetId);\r\n }, [onGetPractisSet, params.practisSetId]);\r\n\r\n useEffect(() => {\r\n if (ifSearchParamsChanged) {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchTrainees(searchParams);\r\n }\r\n }, [searchTrainees, searchParams, ifSearchParamsChanged]);\r\n\r\n useEffect(() => {\r\n localSelectedLabels && setLabelIDs(localSelectedLabels);\r\n }, [localSelectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (updateTrainees && updateTrainees.length > 0) {\r\n refreshSearchParams();\r\n }\r\n }, [updateTrainees, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n return () =>\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [trainees?.count]);\r\n\r\n /**\r\n * @function onChangeOrderBy\r\n * @param { string } field\r\n */\r\n const onChangeOrderBy = (field: string): void => {\r\n setOrderBy(field);\r\n onClearSelection();\r\n };\r\n\r\n const orderBy = searchParams.orderBy;\r\n const atFirstName = useOrderBy('name', orderBy, onChangeOrderBy);\r\n const atRegisteredOn = useOrderBy('date_registered', orderBy, onChangeOrderBy);\r\n\r\n const [disabledAssign, setDisabledAssign] = useState(true);\r\n const [loadingAssign, setLoadingAssign] = useState(false);\r\n const [isSelectAll, setIsSelectAll] = useState(false);\r\n\r\n useEffect(() => {\r\n if (selectedTrainees && selectedTrainees.length > 0) {\r\n setDisabledAssign(false);\r\n } else {\r\n setDisabledAssign(true);\r\n }\r\n }, [selectedTrainees]);\r\n\r\n const updateAllTraineesCheck = useCallback(\r\n (checked: boolean) => {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n updateAllSelectedTrainees(\r\n userIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [trainees, isCheckboxPartiallySelected, updateAllSelectedTrainees]\r\n );\r\n\r\n const handleTraineeCheck = (e: any, user: UserInterface) => {\r\n e.stopPropagation();\r\n if (!!user.id) {\r\n updateSelectedTrainees(user.id);\r\n }\r\n };\r\n\r\n const enrollmentParams = {\r\n practisSetId: params.practisSetId as number,\r\n enrollments:\r\n selectedTrainees?.map(selectedTrainee => ({\r\n userId: selectedTrainee,\r\n practisSetId: params.practisSetId as number,\r\n dueDate: findSelectedTraineeDueDate(trainees, selectedTrainee) ??\r\n dueDates?.[selectedTrainee]\r\n ? dueDates?.[selectedTrainee] as string\r\n : null,\r\n })) ?? [],\r\n search: searchParams,\r\n dueDate: isSelectAll ? dueDateData?.selectAllDueDate : null\r\n }\r\n\r\n const handleCreateEnrollmentsBulkActionSuccess = () => {\r\n refreshData()\r\n updateAllSelectedTrainees([], true, false);\r\n history.goBack();\r\n }\r\n\r\n const handleCreateEnrollmentsBulkActionService =\r\n useCreateEnrollmentBulkActionService(\r\n enrollmentParams,\r\n trainees?.count,\r\n handleCreateEnrollmentsBulkActionSuccess\r\n );\r\n\r\n const handleTraineeInvitation = () => {\r\n setLoadingAssign(true);\r\n if (isSelectAll) {\r\n handleCreateEnrollmentsBulkActionService();\r\n } else {\r\n onEnrollPractisSetsToUsers(enrollmentParams.enrollments)\r\n .then(() => handleCreateEnrollmentsBulkActionSuccess())\r\n }\r\n setLoadingAssign(false);\r\n };\r\n\r\n useEffect(() => {\r\n const filteredPractisSetsEnrollments = trainees\r\n ? trainees.items.map(trainee => trainee.id)\r\n : [];\r\n const traineesToClear = clearSelectedItemIfNotLoaded(\r\n selectedTrainees,\r\n filteredPractisSetsEnrollments\r\n );\r\n if (traineesToClear && traineesToClear.length > 0) {\r\n updateAllSelectedTrainees(traineesToClear, false);\r\n }\r\n }, [selectedTrainees, trainees, updateAllSelectedTrainees]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedTrainees?.length &&\r\n selectedTrainees.length === trainees?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [trainees?.count, selectedTrainees]);\r\n\r\n useEffect(() => {\r\n if (isSelectAll) {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n updateAllSelectedTrainees(\r\n userIds,\r\n true,\r\n isCheckboxPartiallySelected\r\n );\r\n }\r\n\r\n if (dueDateData?.selectAllDueDate) {\r\n const changedDueDates: DueDateType = {};\r\n (trainees?.items || []).forEach(({ id }) => {\r\n changedDueDates[id] = dueDateData?.selectAllDueDate;\r\n });\r\n setDueDates({ ...dueDates, ...changedDueDates });\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [trainees]);\r\n\r\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\r\n null\r\n );\r\n const filterByRegistrationLength: any =\r\n searchParams?.filterByRegistrationStatus?.length;\r\n\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(null);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n\r\n const clearLabelFilters = useClearLabelFilterActionService();\r\n const saveLabelFilters = useSaveSelectedInvitationLabelsService();\r\n useEffect(() => {\r\n return () => {\r\n clearLabelFilters();\r\n saveLabelFilters();\r\n };\r\n }, [clearLabelFilters, saveLabelFilters]);\r\n\r\n const labelChangeHandler = (ids: number[]) => {\r\n setLabelIDs(ids);\r\n };\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countAppliedFiltersCount(searchParams),\r\n itemsCount: trainees?.items.length || 0,\r\n });\r\n\r\n const registrationStatusHandler = (values: string[]) => {\r\n setCustom('filterByRegistrationStatus', values);\r\n };\r\n\r\n const bulkActions = useMemo(\r\n () =>\r\n actionsHelper.getBulkActions(\r\n trainees?.items.filter(x => selectedTrainees?.includes(x.id))\r\n ),\r\n [selectedTrainees, actionsHelper, trainees?.items]\r\n );\r\n\r\n const handleCancel = () => {\r\n history.goBack();\r\n };\r\n\r\n const getUserDueDate = (userId: number) => {\r\n const user = trainees?.items.find(item => item.id === userId);\r\n return user && (dueDates?.[user.id] || user?.dueDate)\r\n ? formatDateWithTimeZone(\r\n dueDates?.[user?.id] || (user?.dueDate as Date)\r\n )\r\n : null;\r\n };\r\n\r\n const openDueDatePopup = async (userId?: number) => {\r\n let dueDate = null;\r\n let type = '';\r\n\r\n const dueDates = userId\r\n ? [getUserDueDate(userId)]\r\n : selectedTrainees?.map(id => {\r\n return getUserDueDate(id);\r\n });\r\n\r\n const dueDateSet = uniqBy(dueDates, item => item);\r\n\r\n if (dueDateSet.length > 1) {\r\n type = 'MULTIPLE';\r\n } else {\r\n type = dueDateSet[0]\r\n ? 'SINGLE'\r\n : isSelectAll && dueDateData?.selectAllDueDate\r\n ? 'MULTIPLE'\r\n : 'NO_DUEDATE';\r\n [dueDate] = dueDateSet;\r\n }\r\n\r\n const data = {\r\n count: selectedTrainees?.length,\r\n type,\r\n dueDate,\r\n };\r\n\r\n setDueDateData({\r\n ...data,\r\n enrollmentIds: userId ? [userId] : selectedTrainees,\r\n });\r\n setIsDueDateCalendarVisible(true);\r\n };\r\n\r\n const updateDueDate = async (date: string | null) => {\r\n if (isSelectAll) {\r\n setDueDateData({ ...dueDateData, selectAllDueDate: date });\r\n }\r\n\r\n const { enrollmentIds } = dueDateData;\r\n\r\n const changedDueDates: DueDateType = {};\r\n enrollmentIds.forEach((id: number) => {\r\n changedDueDates[id] = date;\r\n });\r\n\r\n setDueDates({ ...dueDates, ...changedDueDates });\r\n setIsDueDateCalendarVisible(false);\r\n refreshData();\r\n };\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n updateAllSelectedTrainees(userIds, false, true);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n updateAllTraineesCheck(event.target.checked);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const isMasterCheckBoxChecked =\r\n !!selectedTrainees && !!selectedTrainees.length;\r\n\r\n const isMasterCheckBoxDisabled = tableStates.disableSorting;\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { UserInterface } user\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (user: UserInterface): boolean =>\r\n !!selectedTrainees && !!user.id && selectedTrainees.includes(user.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { UserInterface } user\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, user: UserInterface) => {\r\n handleTraineeCheck(event, user);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { UserInterface } user\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (user: UserInterface): boolean => {\r\n return labelsOpen === user?.['id'];\r\n };\r\n\r\n return (\r\n <>\r\n <StyledTraineeInvitationContainer>\r\n <InvitationHeader>\r\n <div>\r\n <InvitationHeaderWrapper>\r\n <QuickAssignmentInvitationHeaderText data-test=\"practis-set-published-title\">\r\n Practis Set has been published\r\n </QuickAssignmentInvitationHeaderText>\r\n <IconWrapper>\r\n <Published />\r\n </IconWrapper>\r\n </InvitationHeaderWrapper>\r\n <InvitationHeaderSubText data-test=\"assign-users-title\">\r\n Assign Users and Due Dates to {practisSet?.name}\r\n </InvitationHeaderSubText>\r\n </div>\r\n </InvitationHeader>\r\n <TableDivider />\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={trainees?.items}\r\n viewMode={TableViewMode.INFINITE_SCROLL}\r\n headerFilterPosition=\"BOTTOM\"\r\n scrollRef={scrollRef}\r\n scrollPaginationProps={{\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n itemCount: trainees?.items?.length,\r\n totalCount: trainees?.count,\r\n onOffsetChange: setOffset,\r\n scrollableRef: scrollRef,\r\n hideLoading: false,\r\n height: 300,\r\n className: classes.scrollWrapperStyle,\r\n }}\r\n tableWrapperClassName={classes.tableWrapperStyle}\r\n tableContainerClassName={\r\n classes.tableBodyContainerStyleForAssignment\r\n }\r\n selectedLabels={localSelectedLabels}\r\n onRemoveLabel={\r\n localLabels.saved.length > 0\r\n ? label => {\r\n onLocalRemoveLabels(label);\r\n }\r\n : undefined\r\n }\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: 'assign-users-timestamp',\r\n }}\r\n tableToolsOptions={{\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled: tableStates.disableSearch,\r\n dataTest: 'assign-users-search',\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedTrainees) &&\r\n !lodashIsEmpty(trainees),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedTrainees?.length,\r\n totalCount: trainees?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled: bulkActions.areBulkActionsDisabled(),\r\n disabledLabel: bulkActions.areItemsEmpty()\r\n ? undefined\r\n : \"Bulk actions can't be applied\",\r\n dueDatesPermissions:\r\n bulkActions.isBulkActionVisible(\r\n TraineeInvitationActions.SET_DUEDATE\r\n )\r\n ? [NEW_PERMISSIONS.SET_DUE_DATE]\r\n : [],\r\n isDueDatesDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n TraineeInvitationActions.SET_DUEDATE\r\n ),\r\n isSelectAll: isSelectAll,\r\n totalCount: trainees?.count,\r\n onUpdateDueDatesSubmit: openDueDatePopup,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <AllUsersFilter\r\n onLabelsChange={labelChangeHandler}\r\n onSuccessApply={() => hide()}\r\n registrationStatus={\r\n searchParams.filterByRegistrationStatus ||\r\n []\r\n }\r\n onRegistrationStatusChange={\r\n registrationStatusHandler\r\n }\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n disabled={\r\n (searchParams.searchTerm\r\n .length > 0 ||\r\n countAppliedFiltersCount(\r\n searchParams\r\n ) === 0) &&\r\n isListEmpty\r\n }\r\n toggleOpen={toggleShown}\r\n filtersCount={\r\n localSelectedLabels &&\r\n localSelectedLabels.length +\r\n filterByRegistrationLength\r\n }\r\n dataTest=\"assign-users-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n itemCount: trainees?.count\r\n ? `${trainees?.count} ${\r\n trainees?.count === 1 ? 'item' : 'items'\r\n }`\r\n : '',\r\n itemCountDataTest: 'assign-users-total-count',\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && trainees?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: User,\r\n text: 'No Users Yet',\r\n dataTest: 'no-users-yet',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Users',\r\n dataTest: 'no-users-found'\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial:\r\n isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: onCheckMasterCheckbox,\r\n size: 12,\r\n dataTest: 'assign-users-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Users',\r\n width: 47,\r\n ...atFirstName,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'users-column',\r\n },\r\n {\r\n title: 'Due Date',\r\n width: 18,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'due-date-column',\r\n },\r\n {\r\n title: 'Registered on',\r\n width: 21,\r\n ...atRegisteredOn,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'registration-date-column',\r\n },\r\n ],\r\n\r\n rowConfig: {\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n size: 12,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n\r\n getLabelTagsProps: (user: UserV2) => ({\r\n selectedLabels: user?.labels || [],\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_INVITATION_LABEL,\r\n ],\r\n }),\r\n dataTest: 'user-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n width: 58,\r\n cellClassName: classes.customCellStyle,\r\n getCustomFieldComponent: (user: UserV2) => (\r\n <StyledFirstTableItemContent>\r\n <TableLabelTags\r\n open={labelsOpen === user.id}\r\n toggleOpen={() =>\r\n handleToggleLabels(user.id)\r\n }\r\n selectedLabels={\r\n user?.labels || []\r\n }\r\n dataTest=\"user-item-labels\"\r\n />\r\n <AvatarTile>\r\n <Avatar\r\n profile={user}\r\n size=\"sm\"\r\n marginRight={8}\r\n dataTest=\"user-item-avatar\"\r\n />\r\n <TableTitleOverflowText\r\n isCurrent={\r\n profile &&\r\n profile.id === user.id\r\n }\r\n dataTest=\"user-item-name\"\r\n >{`${user.firstName} ${user.lastName}`}</TableTitleOverflowText>\r\n </AvatarTile>\r\n </StyledFirstTableItemContent>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customCellStyle,\r\n width: 24,\r\n shouldShowEmptyCell: (\r\n user: UserInterface\r\n ) => !dueDates?.[user.id] && !user.dueDate,\r\n fieldProps: {\r\n renderTitle: (user: UserInterface) =>\r\n (dueDates?.[user.id] ||\r\n user.dueDate) &&\r\n formatDateWithTimeZone(\r\n dueDates?.[user.id] ||\r\n (user.dueDate as Date)\r\n ),\r\n dataTest: 'user-item-due-date',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customCellStyle,\r\n width: 30,\r\n shouldShowEmptyCell: (\r\n user: UserInterface\r\n ) => !user.registeredAt,\r\n fieldProps: {\r\n renderTitle: (user: UserInterface) =>\r\n formatDate(user?.registeredAt),\r\n dataTest: 'user-item-registration-date',\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n user: UserInterface\r\n ) => (\r\n <StyledTableCell>\r\n {!selectedTrainees?.length &&\r\n <DueDateListAction\r\n actions={[\r\n {\r\n title: 'Due Date',\r\n onClick: () =>\r\n openDueDatePopup(\r\n user.id\r\n ),\r\n permissions: [\r\n NEW_PERMISSIONS.SET_DUE_DATE,\r\n ],\r\n dataTest: 'due-date-action'\r\n },\r\n ]}\r\n />\r\n }\r\n </StyledTableCell>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n <QuickAssignmentInvitationFooter>\r\n <CancelWrapper>\r\n <Button\r\n label={'Cancel'}\r\n variant={'inverse'}\r\n width={'122px'}\r\n action={handleCancel}\r\n dataTest='cancel-button'\r\n />\r\n </CancelWrapper>\r\n <Button\r\n label={'Assign Selected Users'}\r\n height={'40px'}\r\n width={'169px'}\r\n disabled={disabledAssign}\r\n loading={loadingAssign}\r\n action={handleTraineeInvitation}\r\n dataTest=\"assign-users-button\"\r\n />\r\n </QuickAssignmentInvitationFooter>\r\n </StyledTraineeInvitationContainer>\r\n {isDueDateCalendarVisible && (\r\n <DueDateCalendar\r\n data={{ ...dueDateData, isSubTitleVisible: false }}\r\n onCancel={() => setIsDueDateCalendarVisible(false)}\r\n onApply={updateDueDate}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport const TraineeQuickAssignmentContainer: FC<ModalPageContainerProps> = ({\r\n closePath,\r\n closeGoingBack,\r\n}) => {\r\n const [state] = useTrainerInvitationState();\r\n const profile = useSelector(getProfileState);\r\n const params = useParams();\r\n const history = useHistory();\r\n const enrollment = useSelector(PractisSetsEnrollmentState);\r\n const searchAssignUsers = useSearchAssignUsersService();\r\n const searchAssignUsersDebounced = useSearchDebounced(searchAssignUsers);\r\n const enrollPractisSetsToUsers = useEnrollPractisSetsToUsersService();\r\n const getPractisSet = useGetPractisSetService();\r\n const labels = useLabelsState();\r\n const updateSelectedTrainees = useUpdateSelectedInvitationTraineesStateService();\r\n const updateAllSelectedInvitationTrainees = useUpdateAllSelectedInvitationTraineesStateService();\r\n const actionsHelper = useTraineeInvitationActionHelpers();\r\n\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'assignUsers',\r\n }}\r\n >\r\n <ModalPage\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n width=\"50%\"\r\n >\r\n <TraineeQuickAssignment\r\n profile={profile}\r\n history={history}\r\n params={params}\r\n searchTrainees={searchAssignUsersDebounced}\r\n trainees={state.data}\r\n selectedTrainees={state.selectedUsers}\r\n updateSelectedTrainees={updateSelectedTrainees}\r\n updateAllSelectedTrainees={\r\n updateAllSelectedInvitationTrainees\r\n }\r\n practisSet={enrollment.practisSet}\r\n updateTrainees={state.update}\r\n loading={state.loading}\r\n onGetPractisSet={getPractisSet}\r\n onEnrollPractisSetsToUsers={enrollPractisSetsToUsers}\r\n selectedLabels={labels.selected}\r\n actionsHelper={actionsHelper}\r\n />\r\n </ModalPage>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport default TraineeQuickAssignmentContainer;\r\n","import { History } from 'history';\r\nimport { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useParams } from 'react-router';\r\nimport { isEmpty as lodashIsEmpty, uniqBy } from 'lodash';\r\n\r\nimport ModalPage, {\r\n ModalPageContainerProps,\r\n} from '../../../../ui/components/ModalPage/ModalPage';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport { PractisSets } from '../../../../constants/interfaces/PractisSets';\r\nimport { UserInterface, UserProfile, UserV2 } from '../../../../constants/interfaces/User';\r\nimport { PractisSetsEnrollmentState } from '../../../../store/selectors';\r\nimport { EnrollmentType } from '../../../../api/enrollments/types';\r\nimport {\r\n useGetPractisSetService,\r\n useSearchAssignUsersService,\r\n useSearchTeamMembersService,\r\n useEnrollPractisSetsToUsersService,\r\n useUpdateAllSelectedInvitationTraineesStateService,\r\n useUpdateSelectedInvitationTraineesStateService,\r\n} from '../../store/services';\r\nimport {\r\n useTrainerInvitationState,\r\n} from '../../store/states';\r\nimport { Button } from '../../../../ui/components/Button';\r\nimport {\r\n formatDateWithTimeZone,\r\n formatDate,\r\n} from '../../../../helpers/functions/date-convert';\r\nimport { useLabelsState } from '../../../labels/store/states';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport {\r\n clearSelectedItemIfNotLoaded,\r\n useHandleSelectLabels,\r\n} from '../../../labels/tools';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { Label } from '../../../../constants/interfaces/Label';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { WithLabelsContext } from '../../../portableLabels';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport { AllUsersFilter } from '../ManageTeam/components/Filters/AllUsersFilters';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport {\r\n useSaveLabels,\r\n useSelectLabels,\r\n} from '../../../portableLabels/store/hors/withLabels/services';\r\nimport { useLabelsState as useLocalLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\r\nimport { listToTree } from '../../../../helpers/functions/list-to-tree';\r\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\r\nimport { usePortableLabelsState } from '../../../portableLabels/store/states';\r\nimport User from '../../../../ui/icons/User';\r\nimport {\r\n TraineeInvitationActionHelper,\r\n TraineeInvitationActions,\r\n useTraineeInvitationActionHelpers,\r\n} from '../../tools/TraineeInvitationActionHelpers';\r\nimport { findSelectedTraineeDueDate } from './helper';\r\nimport { DueDateCalendar } from '../../../../ui/components/DueDateCalendar';\r\nimport DueDateListAction from './components/ListActions/DueDateListAction';\r\nimport {\r\n DueDateType,\r\n} from '../../../../constants/interfaces/DueDates';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport {\r\n Avatar,\r\n AvatarTile,\r\n InvitationFooter,\r\n InvitationHeader,\r\n InvitationHeaderText,\r\n StyledFirstTableItemContent,\r\n StyledInvitationTitle,\r\n StyledTableCell,\r\n StyledTraineeInvitationContainer,\r\n useStyles,\r\n} from './styles';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport TableTitleOverflowText from '../../../../ui/components/table-wrapper/table/TableTitleOverflowText/TableTitleOverflowText';\r\nimport { TableLabelTags } from '../../../../ui/components/table-wrapper/table/TableLabelTags';\r\nimport { TableViewMode } from '../../../../ui/components/table-wrapper/table/type';\r\nimport { countAppliedFiltersCount } from './tools';\r\nimport { onTriggerEvent } from '../../../../helpers/functions/Events';\r\nimport { EventNameList, REFRESH_TRAINING_PAGE } from '../../../../helpers/functions/Events/types';\r\nimport { useCreateEnrollmentBulkActionService } from './services/EnrollmentBulkActionsService';\r\nimport useHtmlPageTitle from '../../../../helpers/hooks/useHtmlPageTitle';\r\nimport { TitleIcon } from '../../../../ui/layout/Header/styles';\r\nimport BackArrow from '../../../../ui/icons/BackArrow';\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst TraineeInvitation: FC<{\r\n profile?: UserProfile;\r\n history: History<any>;\r\n searchTeamMembers: (sp: SearchParams) => void;\r\n searchTrainees(searchParams: SearchParams, isRefreshed?: boolean): void;\r\n params: { teamId?: string; practisSetId?: string };\r\n trainees?: ListResult<UserV2 & {dueDate?: Date}>;\r\n selectedTrainees?: number[];\r\n updateSelectedTrainees(userId: number): void;\r\n updateAllSelectedTrainees(\r\n userIds: number[],\r\n checked: boolean,\r\n partial?: boolean\r\n ): void;\r\n practisSet?: PractisSets;\r\n updateTrainees?: Array<any>;\r\n loading?: boolean;\r\n onEnrollPractisSetsToUsers: (params: EnrollmentType[]) => Promise<void>;\r\n onGetPractisSet: (practisSetId: number) => void;\r\n selectedLabels?: number[];\r\n actionsHelper: TraineeInvitationActionHelper;\r\n}> = ({\r\n profile,\r\n trainees,\r\n searchTeamMembers,\r\n selectedTrainees,\r\n updateSelectedTrainees,\r\n updateAllSelectedTrainees,\r\n params,\r\n searchTrainees,\r\n loading,\r\n updateTrainees,\r\n onEnrollPractisSetsToUsers,\r\n history,\r\n onGetPractisSet,\r\n practisSet,\r\n selectedLabels,\r\n actionsHelper,\r\n}) => {\r\n const localLabels = useLocalLabelsState();\r\n const labelsList = usePortableLabelsState();\r\n const saveLabels = useSaveLabels();\r\n const setLabelSelect = useSelectLabels();\r\n const handleSelectLabels = useHandleSelectLabels();\r\n const labelsTree = listToTree(labelsList.data.items);\r\n const classes = useStyles();\r\n\r\n const [isDueDateCalendarVisible, setIsDueDateCalendarVisible] =\r\n useState<boolean>(false);\r\n\r\n const localSelectedLabels = useMemo(\r\n () =>\r\n localLabels.saved.length > 0\r\n ? localLabels.saved\r\n : selectedLabels || [],\r\n [localLabels.saved, selectedLabels]\r\n );\r\n\r\n useEffect(() => {\r\n if (localLabels.saved.length < 1 && selectedLabels) {\r\n setLabelSelect(selectedLabels);\r\n }\r\n }, [selectedLabels, localLabels.saved, setLabelSelect]);\r\n\r\n useEffect(() => {\r\n if (\r\n selectedTrainees?.length &&\r\n selectedTrainees.length === trainees?.count\r\n ) {\r\n setIsSelectAll(true);\r\n }\r\n }, [trainees?.count, selectedTrainees]);\r\n\r\n const onLocalRemoveLabels = (label: Label) => {\r\n if (localSelectedLabels.length > 0) {\r\n setLabelSelect(\r\n handleSelectLabels(label, localSelectedLabels, labelsTree)\r\n );\r\n saveLabels();\r\n }\r\n };\r\n\r\n const scrollRef = useRef<any>(null);\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n orderBy: { field: 'name', asc: true },\r\n practisSetId: Number(params.practisSetId),\r\n teamId: params?.teamId ? Number(params.teamId) : undefined,\r\n filters: [],\r\n labelIDs: localSelectedLabels,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n companyId: profile?.companyId\r\n };\r\n\r\n const initialTeamMembersSearchParams: SearchParams = {\r\n searchTerm: '',\r\n filters: [],\r\n labelIDs: selectedLabels,\r\n orderBy: null,\r\n limit: ITEMS_PER_PAGE,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n filterByStatus: [],\r\n filterByRegistrationStatus: [],\r\n companyId: profile?.companyId\r\n };\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOffset,\r\n setLabelIDs,\r\n refreshSearchParams,\r\n setOrderBy,\r\n setCustom,\r\n } = useSearchParamsState(initialSearchParams);\r\n\r\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\r\n\r\n const isCheckboxPartiallySelected =\r\n trainees &&\r\n trainees.items &&\r\n selectedTrainees &&\r\n selectedTrainees.length < trainees.items.length;\r\n\r\n const refreshData = useCallback(() => {\r\n if (params?.practisSetId) {\r\n searchTrainees(\r\n {\r\n ...searchParams,\r\n offset: 0,\r\n limit: ITEMS_PER_PAGE + searchParams.offset, // we should increase the limit to fetch all loaded data again\r\n },\r\n true\r\n );\r\n }\r\n setLastRefreshed(new Date());\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n }, [\r\n params.practisSetId,\r\n updateAllSelectedTrainees,\r\n isCheckboxPartiallySelected,\r\n searchParams,\r\n searchTrainees\r\n ]);\r\n\r\n useEffect(() => {\r\n params.practisSetId && onGetPractisSet(+params.practisSetId);\r\n }, [onGetPractisSet, params.practisSetId]);\r\n\r\n useEffect(() => {\r\n if (params?.practisSetId) {\r\n searchTrainees(searchParams);\r\n params?.teamId && searchTeamMembers(initialTeamMembersSearchParams);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [params?.teamId, params?.practisSetId, searchTrainees, searchParams]);\r\n\r\n useEffect(() => {\r\n localSelectedLabels && setLabelIDs(localSelectedLabels);\r\n }, [localSelectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (updateTrainees && updateTrainees.length > 0) {\r\n refreshSearchParams();\r\n }\r\n }, [updateTrainees, refreshSearchParams]);\r\n\r\n /**\r\n * @function onChangeOrderBy\r\n * @param { string } field\r\n */\r\n const onChangeOrderBy = (field: string): void => {\r\n setOrderBy(field);\r\n onClearSelection();\r\n };\r\n\r\n const orderBy = searchParams.orderBy;\r\n const atFirstName = useOrderBy('name', orderBy, onChangeOrderBy);\r\n const atRegisteredOn = useOrderBy('date_registered', orderBy, onChangeOrderBy);\r\n\r\n const [disabledAssign, setDisabledAssign] = useState(true);\r\n const [loadingAssign, setLoadingAssign] = useState(false);\r\n const [isSelectAll, setIsSelectAll] = useState(false);\r\n\r\n const [dueDateData, setDueDateData] = useState<any>();\r\n const [dueDates, setDueDates] = useState<DueDateType>();\r\n\r\n const isListEmpty = !trainees || !trainees?.items?.length;\r\n\r\n useHtmlPageTitle('Assign Users and Due Dates', [practisSet?.name]);\r\n\r\n /**\r\n * @description redirects to previous page\r\n * @function handleCancel\r\n * @returns { void }\r\n */ \r\n const handleCancel = useCallback(\r\n () => history.goBack(),\r\n [history]\r\n )\r\n\r\n useEffect(() => {\r\n if (selectedTrainees && selectedTrainees.length > 0) {\r\n setDisabledAssign(false);\r\n } else {\r\n setDisabledAssign(true);\r\n }\r\n }, [selectedTrainees]);\r\n\r\n useEffect(() => {\r\n return () =>\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isSelectAll) {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n\r\n updateAllSelectedTrainees(\r\n userIds,\r\n true,\r\n isCheckboxPartiallySelected\r\n );\r\n }\r\n if (dueDateData?.selectAllDueDate) {\r\n const changedDueDates: DueDateType = {};\r\n (trainees?.items || []).forEach(({ id }) => {\r\n changedDueDates[id] = dueDateData?.selectAllDueDate;\r\n });\r\n setDueDates({ ...dueDates, ...changedDueDates });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [trainees]);\r\n\r\n const updateAllTraineesCheck = useCallback(\r\n (checked: boolean) => {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n updateAllSelectedTrainees(\r\n userIds,\r\n checked,\r\n isCheckboxPartiallySelected\r\n );\r\n },\r\n [trainees, isCheckboxPartiallySelected, updateAllSelectedTrainees]\r\n );\r\n\r\n const handleTraineeCheck = (e: any, user: UserInterface) => {\r\n e.stopPropagation();\r\n if (!!user.id) {\r\n updateSelectedTrainees(user.id);\r\n }\r\n };\r\n\r\n const getUserDueDate = (userId: number) => {\r\n const user = trainees?.items.find(item => item.id === userId);\r\n return user && (dueDates?.[user.id] || user?.dueDate)\r\n ? formatDateWithTimeZone(\r\n dueDates?.[user?.id] || (user?.dueDate as Date)\r\n )\r\n : null;\r\n };\r\n\r\n const openDueDatePopup = async (userId?: number) => {\r\n let dueDate = null;\r\n let type = '';\r\n\r\n const dueDates = userId\r\n ? [getUserDueDate(userId)]\r\n : selectedTrainees?.map(id => {\r\n return getUserDueDate(id);\r\n });\r\n\r\n const dueDateSet = uniqBy(dueDates, item => item);\r\n\r\n if (dueDateSet.length > 1) {\r\n type = 'MULTIPLE';\r\n } else {\r\n type = dueDateSet[0]\r\n ? 'SINGLE'\r\n : isSelectAll && dueDateData?.selectAllDueDate\r\n ? 'MULTIPLE'\r\n : 'NO_DUEDATE';\r\n [dueDate] = dueDateSet;\r\n }\r\n\r\n const data = {\r\n count: selectedTrainees?.length,\r\n type,\r\n dueDate,\r\n };\r\n\r\n setDueDateData({\r\n ...data,\r\n enrollmentIds: userId ? [userId] : selectedTrainees,\r\n });\r\n setIsDueDateCalendarVisible(true);\r\n };\r\n\r\n const updateDueDate = async (date: string | null) => {\r\n if (isSelectAll) {\r\n setDueDateData({ ...dueDateData, selectAllDueDate: date });\r\n }\r\n\r\n const { enrollmentIds } = dueDateData;\r\n\r\n const changedDueDates: DueDateType = {};\r\n enrollmentIds.forEach((id: number) => {\r\n changedDueDates[id] = date;\r\n });\r\n setDueDates({ ...dueDates, ...changedDueDates });\r\n\r\n setIsDueDateCalendarVisible(false);\r\n refreshData();\r\n };\r\n\r\n const enrollmentParams = {\r\n practisSetId: +(params.practisSetId as string),\r\n enrollments:\r\n selectedTrainees?.map(selectedTrainee => ({\r\n userId: selectedTrainee,\r\n practisSetId: +(params.practisSetId as string),\r\n dueDate: findSelectedTraineeDueDate(trainees, selectedTrainee) ??\r\n dueDates?.[selectedTrainee]\r\n ? dueDates?.[selectedTrainee] as string\r\n : null,\r\n })) ?? [],\r\n search: searchParams,\r\n dueDate: isSelectAll ? dueDateData?.selectAllDueDate : null\r\n }\r\n \r\n const handleCreateEnrollmentsBulkActionSuccess = () => {\r\n refreshData();\r\n updateAllSelectedTrainees([], true, false);\r\n onTriggerEvent(EventNameList[REFRESH_TRAINING_PAGE]);\r\n history.goBack();\r\n }\r\n\r\n const handleCreateEnrollmentsBulkActionService =\r\n useCreateEnrollmentBulkActionService(\r\n enrollmentParams,\r\n trainees?.count,\r\n handleCreateEnrollmentsBulkActionSuccess\r\n );\r\n\r\n const handleTraineeInvitation = () => {\r\n setLoadingAssign(true);\r\n if (isSelectAll) {\r\n handleCreateEnrollmentsBulkActionService();\r\n } else {\r\n onEnrollPractisSetsToUsers(enrollmentParams.enrollments)\r\n .then(() => handleCreateEnrollmentsBulkActionSuccess())\r\n }\r\n \r\n setLoadingAssign(false);\r\n };\r\n\r\n const registrationStatusHandler = (values: string[]) => {\r\n setCustom('filterByRegistrationStatus', values);\r\n };\r\n\r\n useEffect(() => {\r\n const filteredPractisSetsEnrollments = trainees\r\n ? trainees.items.map(trainee => trainee.id)\r\n : [];\r\n const traineesToClear = clearSelectedItemIfNotLoaded(\r\n selectedTrainees,\r\n filteredPractisSetsEnrollments\r\n );\r\n if (traineesToClear && traineesToClear.length > 0) {\r\n updateAllSelectedTrainees(traineesToClear, false);\r\n }\r\n }, [selectedTrainees, trainees, updateAllSelectedTrainees]);\r\n\r\n const [labelsOpen, setLabelsOpen] =\r\n useState<null | undefined | number>(null);\r\n\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(null);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n\r\n const labelChangeHandler = (ids: number[]) => {\r\n setLabelIDs(ids);\r\n };\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countAppliedFiltersCount(searchParams),\r\n itemsCount: trainees?.items.length || 0,\r\n });\r\n const filterByRegistrationLength: any =\r\n searchParams?.filterByRegistrationStatus?.length;\r\n\r\n const bulkActions = useMemo(\r\n () =>\r\n actionsHelper.getBulkActions(\r\n trainees?.items.filter(x => selectedTrainees?.includes(x.id))\r\n ),\r\n [selectedTrainees, actionsHelper, trainees?.items]\r\n );\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n updateAllSelectedTrainees([], true, isCheckboxPartiallySelected);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n const userIds =\r\n (trainees &&\r\n trainees.items.map(({id}: UserV2) => id)) ||\r\n [];\r\n updateAllSelectedTrainees(userIds, false, true);\r\n setIsSelectAll(true);\r\n };\r\n\r\n /**\r\n * @function onCheckMasterCheckbox\r\n * @param { any } event\r\n * @returns { void }\r\n */\r\n const onCheckMasterCheckbox = (event: any) => {\r\n updateAllTraineesCheck(event.target.checked);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const isMasterCheckBoxChecked =\r\n !!selectedTrainees && !!selectedTrainees.length;\r\n\r\n const isMasterCheckBoxDisabled = tableStates.disableSorting;\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { UserInterface } user\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (user: UserInterface): boolean =>\r\n !!selectedTrainees && !!user.id && selectedTrainees.includes(user.id);\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { UserInterface } user\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, user: UserInterface) => {\r\n handleTraineeCheck(event, user);\r\n setIsSelectAll(false);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { UserInterface } user\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (user: UserInterface): boolean => {\r\n return labelsOpen === user?.['id'];\r\n };\r\n\r\n return (\r\n <>\r\n <StyledTraineeInvitationContainer>\r\n <InvitationHeader>\r\n <TitleIcon\r\n onClick={handleCancel}\r\n data-test=\"back-arrow-button\"\r\n >\r\n <BackArrow />\r\n </TitleIcon>\r\n <div> \r\n <InvitationHeaderText data-test=\"assign-users-title\">\r\n Assign Users and Due Dates\r\n </InvitationHeaderText>\r\n <StyledInvitationTitle data-test=\"practis-set-name\">\r\n {practisSet?.name ?? ''}\r\n </StyledInvitationTitle>\r\n </div>\r\n </InvitationHeader>\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={trainees?.items}\r\n viewMode={TableViewMode.INFINITE_SCROLL}\r\n headerFilterPosition=\"BOTTOM\"\r\n scrollRef={scrollRef}\r\n scrollPaginationProps={{\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n itemCount: trainees?.items?.length,\r\n totalCount: trainees?.count,\r\n onOffsetChange: setOffset,\r\n scrollableRef: scrollRef,\r\n hideLoading: false,\r\n height: 300,\r\n className: classes.scrollWrapperStyle,\r\n }}\r\n tableWrapperClassName={classes.tableWrapperStyle}\r\n tableContainerClassName={\r\n classes.tableBodyContainerStyleForInvitation\r\n }\r\n selectedLabels={localSelectedLabels}\r\n onRemoveLabel={\r\n localLabels.saved.length > 0\r\n ? label => {\r\n onLocalRemoveLabels(label);\r\n }\r\n : undefined\r\n }\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshed,\r\n refreshData: refreshData,\r\n dataTest: 'assign-users-timestamp',\r\n }}\r\n tableToolsOptions={{\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled: tableStates.disableSearch,\r\n dataTest: 'assign-users-search',\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedTrainees) &&\r\n !lodashIsEmpty(trainees),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedTrainees?.length,\r\n totalCount: trainees?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled: bulkActions.areBulkActionsDisabled(),\r\n disabledLabel: bulkActions.areItemsEmpty()\r\n ? undefined\r\n : \"Bulk actions can't be applied\",\r\n dueDatesPermissions:\r\n bulkActions.isBulkActionVisible(\r\n TraineeInvitationActions.SET_DUEDATE\r\n )\r\n ? [NEW_PERMISSIONS.SET_DUE_DATE]\r\n : [],\r\n isDueDatesDisabled:\r\n bulkActions.isBulkActionDisabled(\r\n TraineeInvitationActions.SET_DUEDATE\r\n ),\r\n isSelectAll: isSelectAll,\r\n totalCount: trainees?.count,\r\n onUpdateDueDatesSubmit: openDueDatePopup,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <AllUsersFilter\r\n onLabelsChange={labelChangeHandler}\r\n onSuccessApply={() => hide()}\r\n registrationStatus={\r\n searchParams.filterByRegistrationStatus ||\r\n []\r\n }\r\n onRegistrationStatusChange={\r\n registrationStatusHandler\r\n }\r\n />\r\n )}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n disabled={\r\n (searchParams.searchTerm\r\n .length > 0 ||\r\n countAppliedFiltersCount(\r\n searchParams\r\n ) === 0) &&\r\n isListEmpty\r\n }\r\n toggleOpen={toggleShown}\r\n filtersCount={\r\n localSelectedLabels &&\r\n localSelectedLabels.length +\r\n filterByRegistrationLength\r\n }\r\n dataTest='assign-users-filters'\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n itemCount: trainees?.count\r\n ? `${trainees?.count} ${\r\n trainees?.count === 1 ? 'item' : 'items'\r\n }`\r\n : '',\r\n itemCountDataTest: 'assign-users-total-count',\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && trainees?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: User,\r\n text: 'No Users Yet',\r\n dataTest: 'no-users-yet',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Users',\r\n dataTest: 'no-users-found'\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial:\r\n isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: onCheckMasterCheckbox,\r\n size: 12,\r\n dataTest: 'assign-users-master-checkbox',\r\n },\r\n columns: [\r\n {\r\n title: 'Users',\r\n width: 60,\r\n ...atFirstName,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'users-column',\r\n },\r\n {\r\n title: 'Due Date',\r\n width: 19,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'due-date-column',\r\n },\r\n {\r\n title: 'Registered on',\r\n width: 20,\r\n ...atRegisteredOn,\r\n disabled: tableStates.disableSorting,\r\n dataTest: 'registration-date-column',\r\n },\r\n ],\r\n\r\n rowConfig: {\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n size: 12,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n\r\n getLabelTagsProps: (user: UserV2) => ({\r\n selectedLabels: user?.labels || [],\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_INVITATION_LABEL,\r\n ],\r\n }),\r\n dataTest: 'user-item',\r\n\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n width: 63,\r\n cellClassName: classes.customCellStyle,\r\n getCustomFieldComponent: (user: UserV2) => (\r\n <StyledFirstTableItemContent>\r\n <TableLabelTags\r\n open={labelsOpen === user.id}\r\n toggleOpen={() =>\r\n handleToggleLabels(user.id)\r\n }\r\n selectedLabels={\r\n user?.labels || []\r\n }\r\n dataTest=\"user-item-labels\"\r\n />\r\n <AvatarTile>\r\n <Avatar\r\n profile={user}\r\n size=\"sm\"\r\n marginRight={8}\r\n dataTest=\"user-item-avatar\"\r\n />\r\n <TableTitleOverflowText\r\n isCurrent={\r\n profile &&\r\n profile.id === user.id\r\n }\r\n dataTest=\"user-item-name\"\r\n >{`${user.firstName} ${user.lastName}`}</TableTitleOverflowText>\r\n </AvatarTile>\r\n </StyledFirstTableItemContent>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customCellStyle,\r\n width: 23,\r\n shouldShowEmptyCell: (\r\n user: UserInterface\r\n ) => !dueDates?.[user.id] && !user.dueDate,\r\n fieldProps: {\r\n renderTitle: (user: UserInterface) =>\r\n (dueDates?.[user.id] ||\r\n user.dueDate) &&\r\n formatDateWithTimeZone(\r\n dueDates?.[user.id] ||\r\n (user.dueDate as Date)\r\n ),\r\n dataTest: 'user-item-due-date',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n cellClassName: classes.customCellStyle,\r\n width: 30,\r\n shouldShowEmptyCell: (\r\n user: UserInterface\r\n ) => !user.registeredAt,\r\n fieldProps: {\r\n renderTitle: (user: UserInterface) =>\r\n formatDate(user?.registeredAt),\r\n dataTest: 'user-item-registration-date',\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n user: UserInterface\r\n ) => (\r\n <StyledTableCell>\r\n {!selectedTrainees?.length &&\r\n <DueDateListAction\r\n actions={[\r\n {\r\n title: 'Due Date',\r\n onClick: () =>\r\n openDueDatePopup(\r\n user.id\r\n ),\r\n permissions: [\r\n NEW_PERMISSIONS.SET_DUE_DATE,\r\n ],\r\n dataTest: 'due-date-action'\r\n },\r\n ]}\r\n />\r\n }\r\n </StyledTableCell>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n\r\n <InvitationFooter>\r\n <Button\r\n label={'Cancel'}\r\n height={'40px'}\r\n width={'80px'}\r\n variant=\"transparent\"\r\n action={handleCancel}\r\n dataTest='cancel-button'\r\n />\r\n <Button\r\n label={'Assign Selected Users'}\r\n height={'40px'}\r\n width={'169px'}\r\n disabled={disabledAssign}\r\n loading={loadingAssign}\r\n action={handleTraineeInvitation}\r\n dataTest=\"assign-users-button\"\r\n />\r\n </InvitationFooter>\r\n </StyledTraineeInvitationContainer>\r\n {isDueDateCalendarVisible && (\r\n <DueDateCalendar\r\n data={{ ...dueDateData, isSubTitleVisible: false }}\r\n onCancel={() => setIsDueDateCalendarVisible(false)}\r\n onApply={updateDueDate}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport const TraineeInvitationContainer: FC<ModalPageContainerProps> = ({\r\n closePath,\r\n closeGoingBack,\r\n}) => {\r\n const [state] = useTrainerInvitationState();\r\n const profile = useSelector(getProfileState);\r\n const params: { practisSetId: string; teamId: string } = useParams();\r\n const history = useHistory();\r\n const searchTeamMembers = useSearchTeamMembersService(params.teamId);\r\n const searchTeamMembersDebounced = useSearchDebounced(searchTeamMembers);\r\n const enrollment = useSelector(PractisSetsEnrollmentState);\r\n const searchAssignUsers = useSearchAssignUsersService();\r\n const searchAssignUsersDebounced = useSearchDebounced(searchAssignUsers);\r\n const enrollPractisSetsToUsers = useEnrollPractisSetsToUsersService();\r\n const getPractisSet = useGetPractisSetService();\r\n const labels = useLabelsState();\r\n const updateSelectedTrainees =\r\n useUpdateSelectedInvitationTraineesStateService();\r\n const updateAllSelectedInvitationTrainees =\r\n useUpdateAllSelectedInvitationTraineesStateService();\r\n const actionsHelper = useTraineeInvitationActionHelpers();\r\n\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'assignUsers',\r\n }}\r\n >\r\n <ModalPage\r\n closePath={closePath}\r\n closeGoingBack={closeGoingBack}\r\n width=\"50%\"\r\n >\r\n <TraineeInvitation\r\n profile={profile}\r\n history={history}\r\n searchTeamMembers={searchTeamMembersDebounced}\r\n params={params}\r\n searchTrainees={searchAssignUsersDebounced}\r\n trainees={state.data}\r\n selectedTrainees={state.selectedUsers}\r\n updateSelectedTrainees={updateSelectedTrainees}\r\n updateAllSelectedTrainees={\r\n updateAllSelectedInvitationTrainees\r\n }\r\n practisSet={enrollment.practisSet}\r\n updateTrainees={state.update}\r\n loading={state.loading}\r\n onGetPractisSet={getPractisSet}\r\n onEnrollPractisSetsToUsers={enrollPractisSetsToUsers}\r\n selectedLabels={labels.selected}\r\n actionsHelper={actionsHelper}\r\n />\r\n </ModalPage>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport default TraineeInvitationContainer;\r\n","import styled from 'styled-components';\n\nexport const MainImage = styled.div`\n width: 416px;\n height: 416px;\n border-radius: 8px;\n margin-top: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n background: var(--ps-graphite-3);\n`;\n\nexport const ErrorMessage = styled.div`\n font-size: 13px;\n color: #b0bdc6;\n padding-top: 8px;\n`;\n\nexport const NoPlayIcon = styled.div`\n color: var(--ps-grey-1);\n`;","import NoPlay from '../../../../icons/NoPlay';\nimport { Loading } from '../../../LoadingCopmonent';\nimport { BlankVideoProps } from './types';\nimport {\n MainImage,\n ErrorMessage,\n NoPlayIcon,\n} from './styles';\n\nfunction BlankVideoView({\n errorMessage,\n isLoading\n}: BlankVideoProps) {\n return <MainImage>\n {\n isLoading\n ? <Loading size={40} />\n : <>\n <NoPlayIcon><NoPlay /></NoPlayIcon>\n <ErrorMessage>{errorMessage}</ErrorMessage>\n </> \n }\n </MainImage>;\n}\n\nexport default BlankVideoView;","import BlankVideo from './view';\n\nexport default BlankVideo;","import styled from 'styled-components';\n\nexport const BlockSection = styled.div`\n background: var(--ps-graphite-3);\n`;\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n`;\n\nexport const TopContainer = styled.div`\n display: flex;\n flex-direction: row;\n`;\n\nexport const Avatar = styled(BlockSection)`\n width: 40px;\n height: 40px;\n border-radius: 4px;\n`;\n\nexport const TopInfo = styled.div`\n padding-left: 11px;\n padding-top: 7px;\n`;\n\nexport const TopTitle = styled(BlockSection)`\n width: 157px;\n height: 8px;\n`;\n\nexport const TopDescription = styled(BlockSection)`\n width: 72px;\n height: 8px;\n margin-top: 8px;\n`;\n\nexport const BottomTitle = styled(BlockSection)`\n width: 276px;\n height: 13px;\n margin-top: 21px;\n`;\n\nexport const BottomDescription = styled(BlockSection)`\n width: 147px;\n height: 13px;\n margin-top: 16px;\n margin-bottom: 5px;\n`;","import BlankVideo from '../BlankVideo';\nimport { ScreenLoadingProps } from './types';\nimport {\n Container,\n TopContainer,\n Avatar,\n TopInfo,\n TopTitle,\n TopDescription,\n BottomTitle,\n BottomDescription\n} from './styles';\n\nfunction ScreenLoadingView({ isError }: ScreenLoadingProps) {\n return <Container>\n <TopContainer>\n <Avatar />\n <TopInfo>\n <TopTitle />\n <TopDescription />\n </TopInfo>\n </TopContainer>\n <BlankVideo\n isLoading={!isError}\n errorMessage=\"Something went wrong. Please try again.\"\n />\n <BottomTitle />\n <BottomDescription />\n </Container>;\n}\n\nexport default ScreenLoadingView;","import ScreenLoading from './view';\n\nexport default ScreenLoading;","import UnavailableContent from '../UnavailableContent';\n\nfunction BrokenSharedLinkView() {\n return <UnavailableContent\n title=\"Oops. Looks like you're not meant to access this.\"\n description=\"For whatever reason (your permissions, content that was deleted, a broken link, cosmic intervention) we can't show you this material. If you feel like the universe is conspiring against you, please let your manager know.\"\n />;\n}\n\nexport default BrokenSharedLinkView;","import React, { useCallback, useEffect, useState } from 'react';\n\nimport Storage from '../../services/Storage';\nimport { ProgressModal } from '../../ui/components/ProgressModal';\n\nimport { w3cwebsocket as WebSocket } from 'websocket';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getSocketState } from './store/reducer';\nimport { SocketProgressHide } from './store/actions';\nimport { useShowMessage } from '../../ui/components/ErrorMessages/ErrorMessages';\n\nlet wssurl: any;\n\nif (window.location.href.includes('portal-dev.gopractis')) {\n wssurl = 'wss://api-dev.gopractis.com/';\n} else if (window.location.href.includes('portal-beta.gopractis')) {\n wssurl = 'wss://api-beta.gopractis.com/'\n} else if (window.location.href.includes('gopractis.com')) {\n wssurl = 'wss://api.gopractis.com/';\n} else {\n wssurl = 'wss://api-dev.gopractis.com/';\n}\n\nconst socket = Storage.get('token') ? new WebSocket(\n `${wssurl}socket?token=${Storage.get('token')}`\n) : null;\n\nconst PAGE_KEYS = [\n {\n key: 'REMOVE_STAGING',\n route: '/drafts'\n },\n {\n key: 'CREATE_STAGING_INVITATION',\n route: '/drafts'\n },\n {\n key: 'CREATE_INVITATION',\n route: '/drafts'\n },\n {\n key: 'STAGING_ASSIGN_DATA',\n route: '/drafts'\n }\n]\n\nconst ProgressPage = () => {\n const [percentage, setPercentage] = useState(0);\n const [isOpen, setIsOpen] = useState(false);\n const socketLoaderState = useSelector(getSocketState);\n const dispatch = useDispatch();\n const showMessage = useShowMessage();\n const token = Storage.get('token');\n const [socketConnetion, setSocketConnection] = useState<any>();\n\n const onUnload = useCallback(\n (e: any) => {\n if (\n percentage > 0 && percentage < 100\n ) {\n e.preventDefault();\n e.returnValue = true;\n }\n },\n [percentage]\n );\n\n\n useEffect(() => {\n if (!token && socket) {\n socket.close();\n } else if (token && !socket) {\n let keyArray = PAGE_KEYS.map(item => item?.key);\n\n const socket = new WebSocket(\n `${wssurl}socket?token=${Storage.get('token')}`\n );\n\n setSocketConnection(socket);\n socket.onmessage = (eventName: any) => {\n const data = JSON.parse(eventName.data);\n let perc = data.payload.percentage;\n let key = data.event;\n\n if (keyArray.includes(key)) {\n setPercentage(perc)\n }\n }\n\n socket.onerror = function (event) {\n showMessage(`Something went wrong. Try again`, 'error');\n };\n } else if(!token){\n socket && socket.close();\n socketConnetion && socketConnetion.close();\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [token])\n\n useEffect(() => {\n let keyArray = PAGE_KEYS.map(item => item?.key);\n\n if (socket?.readyState === 1) {\n\n socket.onmessage = (eventName: any) => {\n const data = JSON.parse(eventName.data);\n let perc = data.payload.percentage;\n let key = data.event;\n\n if (keyArray.includes(key)) {\n setPercentage(perc)\n }\n }\n\n socket.onerror = function (event) {\n showMessage(`Something went wrong. Try again`, 'error');\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [socket, socket?.readyState])\n \n \n useEffect(() => {\n window.addEventListener('beforeunload', onUnload);\n return () => {\n window.removeEventListener('beforeunload', onUnload);\n };\n }, [onUnload]);\n\n\n\n useEffect(() => {\n if (percentage > 0 && percentage < 100) {\n setIsOpen(true);\n } else if (percentage === 100) {\n setTimeout(() => {\n dispatch(SocketProgressHide())\n setTimeout(() => {\n setPercentage(0);\n }, 2100)\n \n }, 2000)\n }\n }, [dispatch, percentage])\n\n\n if(!isOpen && !socketLoaderState){\n return null;\n }\n\n return (\n <div>\n {socketLoaderState && isOpen && <ProgressModal\n progressValue={percentage}\n open={true}\n />}\n </div>\n\n );\n};\n\nexport default ProgressPage;","import BrokenSharedLink from './view';\n\nexport default BrokenSharedLink;","import styled from \"styled-components\";\n\nexport const TextEllipsis = styled.span<{ width?: number }>`\n max-width: ${props => props?.width || 150}px;\n overflow-x: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: block;\n`;","import { FC, useEffect, useState, useCallback } from 'react';\nimport { History } from 'history';\nimport { useHistory, useParams } from 'react-router';\nimport styled from 'styled-components';\nimport AvatarPlaceholder from '../AvatarPlaceholder/AvatarPlaceholder';\nimport ROUTES from '../../../routes/routes';\n\nimport ModalPage from '../ModalPage/ModalPage';\nimport { VideoPlayer } from '../VideoPlayer';\nimport {\n useGetSubmissionFromFeedService,\n useGetSubmissionDetailsService,\n useCopyAccuracyLink,\n} from '../../../features/submissions/store/services';\nimport { useSubmissionDetailsState } from '../../../features/submissions/store/states';\nimport Close from '../../icons/Close';\nimport {\n formatHour,\n formatMMDDYY,\n} from '../../../helpers/functions/date-convert';\nimport useKeypress from '../../../helpers/hooks/useKeyPress';\nimport { SubmissionV2 } from '../../../constants/interfaces/Reviews';\nimport ScreenLoading from './components/ScreenLoading';\nimport { useLocalStorage } from '../../../tools/localStorage/LocalStorage';\nimport BrokenSharedLink from '../BrokenSharedLink';\nimport CopyLinkNotification from '../CopyLinkNotification';\nimport BlankVideo from './components/BlankVideo';\nimport { handleDownloadVideoFile } from '../../../helpers/functions/file-download';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\nimport { TextEllipsis } from '../../generalStyles/TextStyles';\n\nconst MainWrapper = styled.div`\n background: ${props => props.theme.Colors.backgroundDark};\n height: 100%;\n display: flex;\n align-items: center;\n flex-direction: column;\n justify-content: center;\n position: relative;\n\n p {\n color: white;\n }\n\n .video {\n min-width: 416px;\n max-height: 416px;\n min-height: 416px;\n background: #292b39;\n border-radius: 8px;\n\n .player-background {\n background: #292b39 !important;\n }\n\n .MuiSlider-rail {\n box-shadow: 1px 1px 1px;\n }\n }\n\n video {\n margin-top: 5px;\n border-radius: 8px;\n }\n`;\n\nconst CloseWrapper = styled.div`\n position: absolute;\n right: -72px;\n top: 54px;\n width: 40px;\n height: 40px;\n padding: 11px 12px 12px;\n box-sizing: border-box;\n border-radius: 75px;\n cursor: pointer;\n background-color: var(--ps-graphite-1);\n\n g {\n fill: #fff;\n }\n`;\n\nconst TopWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst ScoreWrapper = styled.div`\n color: white;\n display: flex;\n align-items: center;\n max-height: 40px;\n\n span {\n color: white;\n font-size: 32px;\n margin-right: 4px;\n }\n\n div {\n line-height: 16px;\n font-size: 12px;\n }\n`;\n\nconst UserWrapper = styled.div`\n display: flex;\n max-height: 40px;\n margin-bottom: 16px;\n flex: 1;\n\n .avatar {\n max-width: 40px;\n margin-right: 12px;\n overflow: hidden;\n\n & > div {\n font-size: 20px;\n }\n }\n`;\n\nconst Title = styled.div`\n color: #fff;\n font-size: 18px;\n margin-top: 10px;\n margin-bottom: 6px;\n line-height: 27px;\n`;\n\nconst PractisSetTitle = styled.div`\n color: #8ea6b7;\n font-size: 15px;\n\n span {\n color: ${props => props.theme.Colors.mainBlue};\n text-decoration: none;\n cursor: pointer;\n word-break: break-all;\n }\n`;\n\nconst UserTextWrapper = styled.div`\n color: white;\n font-size: 15px;\n`;\n\nconst DateWrapper = styled.div`\n color: #8ea6b7;\n font-size: 15px;\n line-height: 20px;\n`;\n\nexport const PlaybackVideo: FC<{\n handleDownloadVideo?: any;\n handleCopyLink?(): void;\n handleClose: () => void;\n submission?: SubmissionV2;\n videoDownloading: boolean;\n loading: boolean;\n isLoadingError: boolean;\n history: History<any>;\n showCopyLinkNotification: boolean;\n handleHideCopyLinkNotification: () => void;\n}> = ({\n handleDownloadVideo,\n handleCopyLink,\n handleClose,\n submission,\n videoDownloading,\n loading,\n isLoadingError,\n history,\n showCopyLinkNotification,\n handleHideCopyLinkNotification,\n}) => {\n const handleViewPractisSetReport = (\n userId: number,\n enrollmentId: number\n ) => {\n history.push(\n ROUTES.TRAINEE_DETAILS.replace(\n ':userId',\n userId.toString()\n ).replace(':enrollmentId', enrollmentId.toString()),\n { useGoBack: true }\n );\n };\n\n const formatDate = (submission: SubmissionV2) => {\n const date = new Date(submission.createdAt);\n return `${formatMMDDYY(date)} at ${formatHour(date)}`;\n };\n\n useHtmlPageTitle('Accuracy Test', [\n `${submission?.practisSet?.name}`,\n `${submission?.user.firstName} ${submission?.user.lastName}`,\n ]);\n\n const userFullName = `${submission?.user.firstName} ${submission?.user.lastName}`;\n\n return (\n <ModalPage\n closePath={'submissions/accuracy'}\n closeGoingBack={true}\n width=\"100%\"\n handleManualClose={handleClose}\n >\n <MainWrapper title=\"Accuracy Test Details\">\n {!submission || loading ? (\n <ScreenLoading isError={isLoadingError} />\n ) : (\n <div style={{ position: 'relative' }}>\n <TopWrapper>\n <UserWrapper>\n <AvatarPlaceholder\n profile={submission.user}\n size=\"sm\"\n className=\"avatar\"\n />\n <UserTextWrapper style={{ color: '#fff' }}>\n <TextEllipsis\n width={200}\n title={userFullName}\n >\n {userFullName}\n </TextEllipsis>\n <DateWrapper>\n Submitted {formatDate(submission)}\n </DateWrapper>\n </UserTextWrapper>\n </UserWrapper>\n <ScoreWrapper>\n <span>\n {submission.accuracy\n ? Math.floor(\n submission.accuracy.accuracy * 100\n )\n : 0}\n </span>\n <div>\n <div>%</div>\n <div>Accuracy</div>\n </div>\n </ScoreWrapper>\n </TopWrapper>\n {submission.mediaUrl && (\n <VideoPlayer\n className=\"video\"\n url={submission.mediaUrl}\n onDownloadVideo={() =>\n handleDownloadVideo(submission.id)\n }\n onCopyLink={handleCopyLink}\n videoLoading={videoDownloading}\n />\n )}\n {!submission.mediaUrl && (\n <BlankVideo\n isLoading={false}\n errorMessage=\"This video is not available for playback\"\n />\n )}\n <div style={{ maxWidth: 416 }}>\n <Title>{submission.scenario?.title}</Title>\n <PractisSetTitle>\n Practis Set Report:{' '}\n <span\n onClick={() =>\n handleViewPractisSetReport(\n submission.user.id,\n submission.enrollmentId\n )\n }\n >\n {submission.practisSet?.name}\n </span>\n </PractisSetTitle>\n </div>\n <CloseWrapper onClick={handleClose}>\n <Close />\n </CloseWrapper>\n {showCopyLinkNotification && (\n <CopyLinkNotification\n onClose={handleHideCopyLinkNotification}\n />\n )}\n </div>\n )}\n </MainWrapper>\n </ModalPage>\n );\n};\n\nexport const PlaybackScreen: FC = () => {\n const submissionDetails = useSubmissionDetailsState();\n const history = useHistory();\n const params: { submissionId: string } = useParams();\n const [videoDownloading, setVideoDownloading] = useState(false);\n const [showCopyLinkNotification, setShowCopyLinkNotification] =\n useState(false);\n const copyAccuracyLink = useCopyAccuracyLink();\n const localStorage = useLocalStorage();\n\n const getSubmissionFromFeed = useGetSubmissionFromFeedService();\n const getSubmissionDetails = useGetSubmissionDetailsService();\n\n const handleDownloadVideo = () => {\n setVideoDownloading(true);\n\n const url = submissionDetails.details?.mediaUrl;\n const fileName = submissionDetails.details?.scenario?.title;\n\n if (url && fileName) {\n handleDownloadVideoFile(url, fileName)\n .then(() => setVideoDownloading(false))\n .catch(() => setVideoDownloading(false));\n }\n };\n\n const state: any = history.location.state;\n const isDirectLink = !state?.useGoBack;\n\n useEffect(() => {\n if (isDirectLink) {\n getSubmissionFromFeed(params.submissionId);\n } else {\n getSubmissionDetails(params.submissionId);\n }\n }, [\n getSubmissionDetails,\n getSubmissionFromFeed,\n params.submissionId,\n isDirectLink,\n ]);\n\n const handleClose = (goBack: boolean) => {\n if (goBack) {\n history.goBack();\n } else {\n history.push('/feed/accuracy');\n }\n };\n\n useKeypress('Escape', () => handleClose(!isDirectLink));\n\n /**\n * @function handleCopyLink\n * @description shows a notification modal for the first time or copies link to a clipboard\n * @returns { void }\n */\n const handleCopyLink = useCallback(() => {\n if (submissionDetails.details) {\n if (localStorage.get('submissionLinkWasCopied')) {\n copyAccuracyLink(submissionDetails.details);\n } else {\n setShowCopyLinkNotification(true);\n }\n }\n }, [submissionDetails.details, copyAccuracyLink, localStorage]);\n\n /**\n * @function handleHideCopyLinkNotification\n * @description hides a notification modal and copies link to a clipboard\n * @returns { void }\n */\n const handleHideCopyLinkNotification = useCallback(() => {\n setShowCopyLinkNotification(false);\n copyAccuracyLink(submissionDetails.details!);\n localStorage.set('submissionLinkWasCopied', true);\n }, [submissionDetails.details, copyAccuracyLink, localStorage]);\n\n useKeypress('Escape', () => handleClose(!!state?.useGoBack));\n\n return submissionDetails.error && isDirectLink ? (\n <BrokenSharedLink />\n ) : (\n <PlaybackVideo\n submission={submissionDetails.details}\n handleDownloadVideo={handleDownloadVideo}\n handleCopyLink={handleCopyLink}\n handleClose={() => handleClose(!isDirectLink)}\n history={history}\n videoDownloading={videoDownloading}\n loading={!!submissionDetails.loading || !!submissionDetails.error}\n isLoadingError={!!submissionDetails.error}\n showCopyLinkNotification={showCopyLinkNotification}\n handleHideCopyLinkNotification={handleHideCopyLinkNotification}\n />\n );\n};\n\nexport default PlaybackScreen;","import React from 'react';\nimport styled from 'styled-components';\nimport { rgba } from 'polished';\nimport { CircularProgress } from '@material-ui/core';\nimport CheckMark from '../../icons/CheckMark';\n\nconst Blacker = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 1200;\n background: ${props => rgba(props.theme.Colors.blackTwo, 0.5)};\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst Wrapper = styled.div`\n\n.MuiCircularProgress-determinate{\n position: absolute;\n color: ${props => props.theme.Colors.mainBlue} !important;\n}\n\n.completed{\n color: ${props => props.theme.Colors.topaz} !important;\n\n .check{\n transform: scale(1.8);\n \n path{\n fill: ${props => props.theme.Colors.topaz};\n }\n }\n\n .MuiCircularProgress-determinate{\n color: ${props => props.theme.Colors.topaz} !important;\n }\n}\n\n`;\n\nconst FilledCircle = styled.div`\n width: 78px;\n height: 78px;\n border-radius: 50%;\n border: 2px solid #eef0f0;\n position: absolute;\n`\n\nconst Content = styled.div`\n background-color: #fff;\n width: 120px;\n height: 120px;\n margin: 20px;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 16px;\n border-radius: 8px;\n`;\n\nexport const ProgressModal = ({ open, progressValue, onClose }: any) => {\n // const [open, setOpen] = useState(false);\n\n return (\n <Wrapper>\n {open &&\n <Blacker>\n <Content className={progressValue < 100 ? '' : 'completed'}>\n <FilledCircle />\n <CircularProgress thickness={2} size={`80px`} variant={'determinate'} value={progressValue} />{progressValue < 100 ? `${progressValue}%` : <CheckMark className='check' /> }\n </Content>\n </Blacker>\n }\n </Wrapper>\n );\n};\n","export enum OnboardingRole {\n ADMIN = 'admin',\n TEAM_LEAD = 'team-lead',\n USER = 'user'\n}\n\nexport interface OnboardingViewProps {\n onRedirect: () => void;\n}"," export const COLORS: {[key: string]: string} = {\n 'white-1': '#ffffff',\n 'white-2': '#f4f4f4',\n 'white-3': '#e2e2e2',\n 'white-4': '#f7f8f9', // also paleGreyTwo\n 'white-5': '#0000000d', // rgb blackTwo5\n 'white-6': '#e4f2fb',\n 'blue-main': '#4aa9e2', // also primaryBlue,1eb0ff dodgerBlue,3fbcff\n 'blue-1': '#015895', //search by code\n 'blue-2': '#73bbe5', // '#4aa9e280' rgb darkSkyBlue50\n 'blue-3': '#31a4e9',\n 'blue-4': '#5faad6', \n 'blue-5': '#5cc7ff',\n 'blue-6': '#4893bf',\n 'blue-7': '#3d93c7',\n 'blue-8': '#5eb7ed',\n 'blue-10': '#4aa9e280', // rgb transparentSoftBlueTwo\n 'blue-11': '#409ed6',\n 'blue-12': '#4aa9e226', // also darkSkyBlue15\n 'grey-1': '#6d7f8c',\n 'grey-2': '#b1c0cb',\n 'grey-3': '#f8f8f8',\n 'grey-4': '#e1e8ee',\n 'grey-5': '#f4f6f7',\n 'grey-6': '#ebf1f3',\n 'grey-7': '#f6f6f6',\n 'grey-8': '#9aa6b6',\n 'grey-9': '#f2f2f2',\n 'grey-10': '#9da2a8',\n 'grey-11': '#0000008a',\n 'grey-12': '#77777740',\n 'grey-13': '#d2dfe6',\n 'grey-14': '#6d7f8c66', // steelGrey40 rgb \n 'grey-15': '#a5b5c0',\n 'grey-16': '#64717b',\n 'grey-17': '#626365',\n 'grey-18': '#b1c0cb26', //rgb cloudyBlue15\n 'grey-19': '#99a9b4',\n 'grey-20': '#0000001e',\n 'grey-21': '#EAEAEA',\n 'grey-22': '#93a6b4',\n 'red-main': '#ec513d', // '#e55340'\n 'red-1': '#fa6653', \n 'red-2': '#ff7a69',\n 'orange-main': '#f0a803', // not used yet\n 'orange-1': '#a47200', // '#f5ba33'\n 'orange-2': '#ffebc3', // not used yet '#f5ba333d', // rgb macaroniAndCheeseOpaque\n 'green-main': '#15cba9',\n 'green-1': '#066150',\n 'green-2': '#d6f7e8', // search by code\n 'green-3': '#51d76a',\n 'green-4': '#72dbc8', //also green, mint\n 'graphite-1': '#222431', // also darkThree, rgb \n 'graphite-2': '#171923',\n 'graphite-3': '#292b39', // search by code\n 'graphite-4': '#343850',\n 'black-main': '#212121',\n 'black-1': '#181923', \n 'black-2': '#323232',\n 'black': '#000000', \n 'pink-1': '#fe5c6c',\n 'pink-2': '#e14a59', // also fadedRedTwoMobile '#e14a59'\n 'pink-3': '#cb3a48',\n};\n\nexport const SCREEN_SIZES = {\n sm: '576px',\n md: '768px',\n ld: '992px',\n xl: '1200px',\n};\n\nexport const BREAK_POINTS = {\n mid: 1368,\n small: 768,\n smaller: 640,\n responsiveLg: 1920,\n responsiveMd: 1440,\n responsiveSm: 1024,\n responsiveSmPlus: 1245,\n}\n\nexport const SPACINGS = {\n md: 8\n}\n\nexport const FONTS = {\n manrope: 'Manrope'\n}","export default __webpack_public_path__ + \"static/media/Learner-Desktop_img.03c5b0ed.png\";","export default __webpack_public_path__ + \"static/media/Learner-Desktop_img@2x.bc320b39.png\";","export default __webpack_public_path__ + \"static/media/Learner-Desktop_img@3x.9448bb19.png\";","export default __webpack_public_path__ + \"static/media/Learner-Tablet_img.bdf57f22.png\";","export default __webpack_public_path__ + \"static/media/Learner-Tablet_img@2x.e9c87d47.png\";","export default __webpack_public_path__ + \"static/media/Learner-Tablet_img@3x.5d710f12.png\";","export default __webpack_public_path__ + \"static/media/Learner-Phone_img.95f8e42f.png\";","export default __webpack_public_path__ + \"static/media/Learner-Phone_img@2x.f513d4a4.png\";","export default __webpack_public_path__ + \"static/media/Learner-Phone_img@3x.feca0ce0.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/button-google-play.62d4415f.png\";","import styled from 'styled-components';\n\nexport const OnboardingContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n \n @media(max-width:767px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 768px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 1024px) {\n flex-direction: row;\n justify-content: space-between;\n }\n`;\n\nexport const OnboardingText = styled.div`\n display: flex;\n flex-direction: column;\n\n @media(max-width:767px) {\n width: 290px;\n padding-top: 24px;\n }\n @media(min-width:768px) {\n width: 432px;\n padding: 32px 33px 0 33px;\n }\n @media(min-width: 1024px) {\n align-items: flex-start;\n justify-content: center;\n width: 345px;\n padding-right: 56px;\n }\n`;\n\nexport const OnboardingGreeting = styled.div`\n color: var(--ps-blue-main);\n\n @media(max-width:767px) {\n font-size: 13px;\n line-height: 18px;\n font-weight: 600;\n }\n @media(min-width:768px) {\n font-size: 15px;\n font-weight: 400;\n line-height: 20px;\n }\n @media(min-width: 1024px) {\n font-size: 15px;\n font-weight: 600;\n line-height: 20px;\n }\n`;\n\nexport const OnboardingTitle = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 4px;\n font-weight: 600;\n\n @media(max-width:767px) {\n font-size: 20px;\n line-height: 25px;\n }\n @media(min-width:768px) {\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n }\n`\n\nexport const OnboardingDescription = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n`\n\nexport const DownloadButtons = styled.div`\n display: flex;\n flex-direction: row;\n padding-top: 24px;\n justify-content: space-between;\n width: 286px;\n`","import mainImageDesktop from '../../../../../assets/images/Learner-Desktop_img.png';\nimport mainImageDesktop2x from '../../../../../assets/images/Learner-Desktop_img@2x.png';\nimport mainImageDesktop3x from '../../../../../assets/images/Learner-Desktop_img@3x.png';\nimport mainImageTablet from '../../../../../assets/images/Learner-Tablet_img.png';\nimport mainImageTablet2x from '../../../../../assets/images/Learner-Tablet_img@2x.png';\nimport mainImageTablet3x from '../../../../../assets/images/Learner-Tablet_img@3x.png';\nimport mainImagePhone from '../../../../../assets/images/Learner-Phone_img.png';\nimport mainImagePhone2x from '../../../../../assets/images/Learner-Phone_img@2x.png';\nimport mainImagePhone3x from '../../../../../assets/images/Learner-Phone_img@3x.png';\nimport appStoreImage from '../../../../../assets/images/button-app-store.png'\nimport googlePlayImage from '../../../../../assets/images/button-google-play.png'\nimport useWindowDimensions from '../../../../../helpers/hooks/useWindowDimensions';\nimport LoginAuthWrapper from '../../../../../ui/wrapper/LoginAuthWrapper';\nimport { Variables } from '../../../../../theme/variables';\nimport {\n OnboardingContent,\n OnboardingText,\n OnboardingGreeting,\n OnboardingTitle,\n OnboardingDescription,\n DownloadButtons\n} from './styles';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nfunction UserOnboardingView() {\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n const isTablet = !isMobile && windowDimensions.width < Variables.BreakPoints.responsiveSm;\n const isDesktop= windowDimensions.width >= Variables.BreakPoints.responsiveSm;\n\n useHtmlPageTitle(\n \"You're now registered! Download the Practis mobile app to continue\"\n );\n\n return (\n <LoginAuthWrapper heightToShowScroll={700}>\n <OnboardingContent>\n <OnboardingText>\n <OnboardingGreeting>You're now registered!</OnboardingGreeting>\n <OnboardingTitle>Download the Practis mobile app to continue</OnboardingTitle>\n <OnboardingDescription>\n We are a mobile-native platform. All the learning happens on our mobile app. Once you download it, log in with the credentials you just created to start practicing.\n </OnboardingDescription>\n <DownloadButtons>\n <a href=\"https://apps.apple.com/us/app/practis/id1499329539\" target=\"_blank\" rel=\"noreferrer\">\n <img src={appStoreImage} width=\"139px\" height=\"40px\" alt=\"Download on the App Store\" />\n </a>\n <a href=\"https://play.google.com/store/apps/details?id=com.gopractis.android\" target=\"_blank\" rel=\"noreferrer\">\n <img src={googlePlayImage} width=\"139px\" height=\"40px\" alt=\"Get it on Google Play\" />\n </a>\n </DownloadButtons>\n </OnboardingText>\n {isMobile && (\n <img\n src={mainImagePhone}\n srcSet={`${mainImagePhone2x} 2x, ${mainImagePhone3x} 3x`}\n alt=\"\"\n />\n )}\n {isTablet && (\n <img\n src={mainImageTablet}\n srcSet={`${mainImageTablet2x} 2x, ${mainImageTablet3x} 3x`}\n alt=\"\"\n />\n )}\n {isDesktop && (\n <img\n src={mainImageDesktop}\n srcSet={`${mainImageDesktop2x} 2x, ${mainImageDesktop3x} 3x`}\n alt=\"\"\n />\n )}\n </OnboardingContent>\n </LoginAuthWrapper>\n )\n}\n\nexport default UserOnboardingView;","import UserOnboardingView from './view';\n\nexport default UserOnboardingView;","export default __webpack_public_path__ + \"static/media/Admin-Desktop_img.786b0286.png\";","export default __webpack_public_path__ + \"static/media/Admin-Desktop_img@2x.245bc797.png\";","export default __webpack_public_path__ + \"static/media/Admin-Desktop_img@3x.a6353970.png\";","export default __webpack_public_path__ + \"static/media/Admin-Tablet_img.77056251.png\";","export default __webpack_public_path__ + \"static/media/Admin-Tablet_img@2x.9ec3a410.png\";","export default __webpack_public_path__ + \"static/media/Admin-Tablet_img@3x.452c91cc.png\";","export default __webpack_public_path__ + \"static/media/Admin-Phone_img.441ddcaf.png\";","export default __webpack_public_path__ + \"static/media/Admin-Phone_img@2x.a19762e3.png\";","export default __webpack_public_path__ + \"static/media/Admin-Phone_img@3x.c352be9f.png\";","import styled from 'styled-components';\n\nexport const OnboardingContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n \n @media(max-width:767px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 768px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 1024px) {\n flex-direction: row;\n justify-content: space-between;\n }\n`;\n\nexport const OnboardingText = styled.div`\n display: flex;\n flex-direction: column;\n\n @media(max-width:767px) {\n width: 290px;\n padding-top: 24px;\n }\n @media(min-width:768px) {\n align-items: center;\n width: 432px;\n padding: 32px 33px 0 33px;\n }\n @media(min-width: 1024px) {\n align-items: flex-start;\n justify-content: center;\n width: 345px;\n padding-right: 56px;\n }\n`;\n\nexport const OnboardingTitle = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 4px;\n font-weight: 600;\n\n @media(max-width:767px) {\n font-size: 20px;\n line-height: 25px;\n }\n @media(min-width:768px) {\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n }\n`\n\nexport const OnboardingDescription = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n`\n\nexport const OnboardingButton = styled.div`\n margin-top: 24px;\n`","import mainImageDesktop from '../../../../../assets/images/Admin-Desktop_img.png';\nimport mainImageDesktop2x from '../../../../../assets/images/Admin-Desktop_img@2x.png';\nimport mainImageDesktop3x from '../../../../../assets/images/Admin-Desktop_img@3x.png';\nimport mainImageTablet from '../../../../../assets/images/Admin-Tablet_img.png';\nimport mainImageTablet2x from '../../../../../assets/images/Admin-Tablet_img@2x.png';\nimport mainImageTablet3x from '../../../../../assets/images/Admin-Tablet_img@3x.png';\nimport mainImagePhone from '../../../../../assets/images/Admin-Phone_img.png';\nimport mainImagePhone2x from '../../../../../assets/images/Admin-Phone_img@2x.png';\nimport mainImagePhone3x from '../../../../../assets/images/Admin-Phone_img@3x.png';\nimport useWindowDimensions from '../../../../../helpers/hooks/useWindowDimensions';\nimport LoginAuthWrapper from '../../../../../ui/wrapper/LoginAuthWrapper';\nimport { Variables } from '../../../../../theme/variables';\nimport { OnboardingViewProps } from '../../types';\nimport {\n OnboardingContent,\n OnboardingText,\n OnboardingTitle,\n OnboardingDescription,\n OnboardingButton\n} from './styles';\nimport { Button } from '../../../../../ui/components/Button';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nfunction AdminOnboardingView({ onRedirect }: OnboardingViewProps) {\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n const isTablet = !isMobile && windowDimensions.width < Variables.BreakPoints.responsiveSm;\n const isDesktop= windowDimensions.width >= Variables.BreakPoints.responsiveSm;\n\n useHtmlPageTitle(\"You're an Admin on Practis\");\n\n return (\n <LoginAuthWrapper heightToShowScroll={700}>\n <OnboardingContent>\n <OnboardingText>\n <OnboardingTitle>You're an Admin on Practis</OnboardingTitle>\n <OnboardingDescription>\n Make sure you bookmark the link to the Practis Admin Portal.\n </OnboardingDescription>\n <OnboardingButton>\n <Button\n height=\"40px\"\n width=\"220px\"\n buttonWidth=\"100%\"\n fontSize={13}\n action={onRedirect}\n >\n Open the Practis Admin Portal\n </Button>\n </OnboardingButton>\n </OnboardingText>\n {isMobile && (\n <img\n src={mainImagePhone}\n srcSet={`${mainImagePhone2x} 2x, ${mainImagePhone3x} 3x`}\n alt=\"\"\n />\n )}\n {isTablet && (\n <img\n src={mainImageTablet}\n srcSet={`${mainImageTablet2x} 2x, ${mainImageTablet3x} 3x`}\n alt=\"\"\n />\n )}\n {isDesktop && (\n <img\n src={mainImageDesktop}\n srcSet={`${mainImageDesktop2x} 2x, ${mainImageDesktop3x} 3x`}\n alt=\"\"\n width=\"424px\"\n height=\"470px\"\n />\n )}\n </OnboardingContent>\n </LoginAuthWrapper>\n );\n}\n\nexport default AdminOnboardingView;","import AdminOnboardingView from './view';\n\nexport default AdminOnboardingView;","export default __webpack_public_path__ + \"static/media/TeamLeader-Desktop_img.3b44a439.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Desktop_img@2x.5f0bea64.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Desktop_img@3x.afc16f9d.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Tablet_img.2f6c7af3.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Tablet_img@2x.40364660.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Tablet_img@3x.a0192e7c.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Phone_img.b2d44704.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Phone_img@2x.10d230a2.png\";","export default __webpack_public_path__ + \"static/media/TeamLeader-Phone_img@3x.09fc3497.png\";","import styled from 'styled-components';\n\nexport const OnboardingContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n \n @media(max-width:767px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 768px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 1024px) {\n flex-direction: row;\n justify-content: space-between;\n }\n`;\n\nexport const OnboardingText = styled.div`\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n\n @media(max-width:767px) {\n width: 290px;\n padding-top: 24px;\n }\n @media(min-width:768px) {\n width: 432px;\n padding: 32px 33px 0 33px;\n }\n @media(min-width: 1024px) {\n align-items: flex-start;\n justify-content: center;\n width: 345px;\n padding: 0;\n margin-right: 56px;\n }\n`;\n\nexport const OnboardingGreeting = styled.div`\n color: var(--ps-blue-main);\n\n @media(max-width:767px) {\n font-size: 13px;\n line-height: 18px;\n font-weight: 600;\n }\n @media(min-width:768px) {\n font-size: 15px;\n font-weight: 400;\n line-height: 20px;\n }\n @media(min-width: 1024px) {\n font-size: 15px;\n font-weight: 600;\n line-height: 20px;\n }\n`;\n\nexport const OnboardingTitle = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 4px;\n font-weight: 600;\n\n @media(max-width:767px) {\n font-size: 20px;\n line-height: 25px;\n }\n @media(min-width:768px) {\n font-size: 28px;\n font-weight: 600;\n line-height: 35px;\n }\n`\n\nexport const OnboardingDescription = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n\n b {\n color: var(--ps-white-1);\n font-weight: 600;\n }\n`\n\nexport const DownloadTitle = styled.div`\n width: 290px;\n padding-top: 16px;\n font-size: 15px;\n line-height: 20px;\n text-align: center;\n color: var(--ps-grey-2);\n\n @media(max-width:767px) {\n margin: 0 auto;\n }\n @media(min-width: 1024px) {\n margin: 0;\n }\n`\n\nexport const DownloadButtons = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n width: 290px;\n margin: 0 auto;\n\n @media(max-width:767px) {\n padding-top: 4px;\n margin: 0 auto;\n }\n @media(min-width:768px) {\n padding-top: 8px;\n }\n @media(min-width: 1024px) {\n margin: 0;\n }\n`\n\nexport const OnboardingButton = styled.div`\n margin-top: 24px;\n`","import mainImageDesktop from '../../../../../assets/images/TeamLeader-Desktop_img.png';\nimport mainImageDesktop2x from '../../../../../assets/images/TeamLeader-Desktop_img@2x.png';\nimport mainImageDesktop3x from '../../../../../assets/images/TeamLeader-Desktop_img@3x.png';\nimport mainImageTablet from '../../../../../assets/images/TeamLeader-Tablet_img.png';\nimport mainImageTablet2x from '../../../../../assets/images/TeamLeader-Tablet_img@2x.png';\nimport mainImageTablet3x from '../../../../../assets/images/TeamLeader-Tablet_img@3x.png';\nimport mainImagePhone from '../../../../../assets/images/TeamLeader-Phone_img.png';\nimport mainImagePhone2x from '../../../../../assets/images/TeamLeader-Phone_img@2x.png';\nimport mainImagePhone3x from '../../../../../assets/images/TeamLeader-Phone_img@3x.png';\nimport appStoreImage from '../../../../../assets/images/button-app-store.png'\nimport googlePlayImage from '../../../../../assets/images/button-google-play.png'\nimport useWindowDimensions from '../../../../../helpers/hooks/useWindowDimensions';\nimport LoginAuthWrapper from '../../../../../ui/wrapper/LoginAuthWrapper';\nimport { Variables } from '../../../../../theme/variables';\nimport {\n OnboardingContent,\n OnboardingText,\n OnboardingGreeting,\n OnboardingTitle,\n OnboardingDescription,\n DownloadTitle,\n DownloadButtons,\n OnboardingButton\n} from './styles';\nimport { Button } from '../../../../../ui/components/Button';\nimport { OnboardingViewProps } from '../../types';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nfunction TeamLeaderOnboardingView({ onRedirect }: OnboardingViewProps) {\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n const isTablet =\n !isMobile &&\n windowDimensions.width < Variables.BreakPoints.responsiveSm;\n const isDesktop =\n windowDimensions.width >= Variables.BreakPoints.responsiveSm;\n\n useHtmlPageTitle(\"Welcome to Practis! You're an Admin on Practis\");\n\n return (\n <LoginAuthWrapper heightToShowScroll={700}>\n <OnboardingContent>\n <OnboardingText>\n <OnboardingGreeting>Welcome to Practis!</OnboardingGreeting>\n <OnboardingTitle>You're a Team Leader</OnboardingTitle>\n <OnboardingDescription>\n When creating your Learner account on Practis, someone\n decided that you would also be a great Team Leader and\n assigned you this role.\n </OnboardingDescription>\n <OnboardingDescription>\n This means that you'll both be able to{' '}\n <b>train on the Practis Mobile App</b> and manage your\n team's training on our{' '}\n <b>web-based Practis Admin Portal</b>.\n </OnboardingDescription>\n <OnboardingButton>\n <Button\n height=\"40px\"\n width=\"290px\"\n buttonWidth=\"100%\"\n fontSize={13}\n action={onRedirect}\n >\n Open the Practis Admin Portal\n </Button>\n </OnboardingButton>\n <DownloadTitle>The Practis Mobile App</DownloadTitle>\n <DownloadButtons>\n <a\n href=\"https://apps.apple.com/us/app/practis/id1499329539\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <img\n src={appStoreImage}\n width=\"137px\"\n height=\"40px\"\n alt=\"Download on the App Store\"\n />\n </a>\n <a\n href=\"https://play.google.com/store/apps/details?id=com.gopractis.android\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <img\n src={googlePlayImage}\n width=\"137px\"\n height=\"40px\"\n alt=\"Get it on Google Play\"\n />\n </a>\n </DownloadButtons>\n </OnboardingText>\n {isMobile && (\n <img\n src={mainImagePhone}\n srcSet={`${mainImagePhone2x} 2x, ${mainImagePhone3x} 3x`}\n alt=\"\"\n />\n )}\n {isTablet && (\n <img\n src={mainImageTablet}\n srcSet={`${mainImageTablet2x} 2x, ${mainImageTablet3x} 3x`}\n alt=\"\"\n />\n )}\n {isDesktop && (\n <img\n src={mainImageDesktop}\n srcSet={`${mainImageDesktop2x} 2x, ${mainImageDesktop3x} 3x`}\n alt=\"\"\n />\n )}\n </OnboardingContent>\n </LoginAuthWrapper>\n );\n}\n\nexport default TeamLeaderOnboardingView;","import TeamLeaderOnboardingView from './view';\n\nexport default TeamLeaderOnboardingView;","import { useCallback } from 'react';\nimport { useParams } from 'react-router';\nimport { useHistory } from 'react-router';\nimport ROUTES from '../../../routes/routes';\nimport { OnboardingRole } from './types';\nimport UserOnboardingView from './components/UserOnboarding';\nimport AdminOnboardingView from './components/AdminOnboarding';\nimport TeamLeaderOnboardingView from './components/TeamLeaderOnboarding';\n\nfunction Onboarding () {\n const { role } = useParams<{ role: string }>();\n const history = useHistory();\n\n /**\n * @function handleRedirect - redirects to feeds route\n * @returns { void }\n */ \n const handleRedirect = useCallback(() => {\n history.push(ROUTES.SUBMISSIONS);\n }, [history]);\n\n if (role === OnboardingRole.ADMIN)\n return <AdminOnboardingView\n onRedirect={handleRedirect}\n />;\n if (role === OnboardingRole.TEAM_LEAD)\n return <TeamLeaderOnboardingView\n onRedirect={handleRedirect}\n />;\n\n return <UserOnboardingView />;\n}\n\nexport default Onboarding;","import Onboarding from './controller';\n\nexport default Onboarding;","export default __webpack_public_path__ + \"static/media/broken-link.9068ea2c.svg\";","import styled from 'styled-components';\n\nexport const ErrorTitle = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 24px;\n font-weight: 600;\n font-size: 20px;\n line-height: 25px;\n`;\n\nexport const ErrorDescription = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n padding-bottom: 4px;\n\n &:last-child {\n padding-bottom: 0;\n }\n\n a {\n color: var(--ps-blue-main);\n text-decoration: none;\n }\n`;","import brokenLink from '../../../assets/images/broken-link.svg';\nimport {\n ErrorTitle,\n ErrorDescription\n} from './styles';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nfunction InvalidInvite() {\n\n useHtmlPageTitle('Hmm. This didn’t work.');\n\n return (\n <LoginAuthWrapper contentWidth={324} heightToShowScroll={500}>\n <img src={brokenLink} width='72px' height='72px' alt='Invalid invite' data-test=\"error-image\" />\n <ErrorTitle data-test=\"error-title\">Hmm. This didn't work.</ErrorTitle>\n <ErrorDescription data-test=\"error-description\">\n Looks like this link has been revoked, is broken, or has already been used. Either way, life goes on. But ask your manager or trainer if they were somehow trying to invite you to training.\n </ErrorDescription>\n <ErrorDescription data-test=\"contact-us\">\n You can also <a href='mailto:support@gopractis.com'>contact us</a> at Practis and we may be able to help.\n </ErrorDescription>\n </LoginAuthWrapper>\n );\n}\n\nexport default InvalidInvite;","import InvalidInvite from \"./view\";\n\nexport default InvalidInvite;","import styled from 'styled-components';\n\nexport const Title = styled.div`\n font-size: 20px;\n font-weight: 700;\n line-height: 28px;\n color: var(--ps-white-1);\n`;\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n text-align: center;\n padding-top: 4px;\n`;\n\nexport const MobileNumberContainer = styled.div`\n padding-top: 12px;\n width: 100%;\n`;\n\nexport const SecondaryText = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-grey-4);\n padding-top: 4px;\n padding-bottom: 4px;\n`;\n\nexport const ButtonContainer = styled.div`\n padding-top: 20px;\n width: 100%;\n`","import InputPhone from '../../../../../ui/components/input/PhoneInput/PhoneInput';\nimport { Button } from '../../../../../ui/components/Button';\nimport { EnterMobileNumberViewProps } from './types';\nimport {\n Title,\n Description,\n MobileNumberContainer,\n SecondaryText,\n ButtonContainer\n} from './styles';\n\nfunction EnterMobileNumberView({ \n mobileNumber,\n isSending,\n canSkip,\n onSendCode,\n onSkip,\n onMobileNumberChange\n}: EnterMobileNumberViewProps) {\n return <>\n <Title data-test=\"add-mobile-number-title\">Add Mobile Number</Title>\n <Description data-test=\"add-mobile-number-description\">\n Adding a mobile number improves security and gives you more options to log in later.\n </Description>\n <MobileNumberContainer>\n <InputPhone\n value={mobileNumber}\n onChange={onMobileNumberChange}\n height='56px'\n fontSize='15px'\n autoFocus={true}\n className='grey-border-on-focus'\n label=''\n dataTest='mobile-number-input'\n />\n </MobileNumberContainer>\n <SecondaryText data-test=\"mobile-number-input-text\">\n We will send an SMS to verify your mobile number. Carrier fees may apply.\n </SecondaryText>\n <ButtonContainer>\n <Button\n height='56px'\n width='100%'\n buttonWidth='100%'\n fontSize={15}\n disabled={!mobileNumber || mobileNumber.length < 3}\n loading={isSending}\n type='button'\n action={onSendCode}\n dataTest='send-code-button'\n >\n Send Code\n </Button>\n </ButtonContainer>\n {canSkip && (\n <ButtonContainer>\n <Button\n height='56px'\n width='100%'\n buttonWidth='100%'\n fontSize={15}\n variant='inverse'\n type='button'\n action={onSkip}\n dataTest='add-later-button'\n >\n Add Later\n </Button>\n </ButtonContainer>\n )}\n </>\n}\n\nexport default EnterMobileNumberView;","import { useCallback, useState } from 'react';\n\nimport { useShowMessage } from '../../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { EnterMobileNumberProps } from './types';\nimport EnterMobileNumberView from './view';\nimport { useUpdateUserPhoneNumber } from '../../../../../api';\nimport { ErrorResult } from '../../../../../constants/interfaces/ErrorResult';\nimport {\n CLIENT_SIDE_ERROR_MESSAGE,\n PHONE_ALREADY_EXISTS\n} from '../../../../../ui/components/ErrorMessages/constants';\n\nfunction EnterMobileNumberController({\n userId,\n mobileNumber,\n canSkip,\n onMobileNumberChange,\n onSendCode,\n onSkip,\n}: EnterMobileNumberProps) {\n const showMessage = useShowMessage();\n const updateUserPhoneNumber = useUpdateUserPhoneNumber();\n\n const [isSending, setIsSending] = useState(false);\n\n /**\n * @function handleSendCode - calls API to save mobile number in user profile\n * and send verification code to a user cell phone\n * @returns { void }\n */\n const handleSendCode = useCallback(() => {\n if (userId) {\n setIsSending(true);\n\n updateUserPhoneNumber(userId, mobileNumber)\n .then((result: any) => {\n setIsSending(false);\n if (result.status === 'error') {\n showMessage(result.message ?? result.data, 'error');\n } else {\n onSendCode();\n }\n })\n .catch((error: ErrorResult) => {\n error.message && showMessage(\n error.errorCode === 409 ? CLIENT_SIDE_ERROR_MESSAGE[PHONE_ALREADY_EXISTS] : error.message,\n 'error'\n );\n setIsSending(false);\n });\n }\n }, [\n userId,\n updateUserPhoneNumber,\n mobileNumber,\n showMessage,\n onSendCode,\n ]);\n\n return (\n <EnterMobileNumberView\n mobileNumber={mobileNumber}\n isSending={isSending}\n canSkip={canSkip}\n onSendCode={handleSendCode}\n onSkip={onSkip}\n onMobileNumberChange={onMobileNumberChange}\n />\n );\n}\n\n\nexport default EnterMobileNumberController;","import EnterMobileNumberController from \"./controller\";\n\nexport default EnterMobileNumberController;","import { VerifyMobileNumberProps } from './types';\nimport { useConfirmUserPhoneNumber } from '../../../../../api';\nimport { useUpdateUserPhoneNumber } from '../../../../../api';\nimport CheckVerificationCode from '../CheckVerificationCode';\nimport { useCallback } from 'react';\nimport useHtmlPageTitle from '../../../../../helpers/hooks/useHtmlPageTitle';\n\nfunction VerifyMobileNumberController({\n userId,\n mobileNumber,\n onBack,\n onVerify,\n}: VerifyMobileNumberProps) {\n const confirmUserPhoneNumber = useConfirmUserPhoneNumber();\n const updateUserPhoneNumber = useUpdateUserPhoneNumber();\n\n useHtmlPageTitle('Verify Mobile Number');\n\n /**\n * @function handleVerify\n * @description calls API to verify entered code\n * @param { string } code\n * @returns { Promise }\n */\n const handleVerify = useCallback((code: string) => {\n if (!userId)\n return Promise.reject({ message: 'User is not defined' });\n return confirmUserPhoneNumber(userId, +code);\n }, [userId, confirmUserPhoneNumber]);\n\n /**\n * @function handleResend \n * @description calls API to resend a verification code\n * @returns { Promise }\n */ \n const handleResend = useCallback(() => {\n if (!userId)\n return Promise.reject({ message: 'User is not defined' });\n return updateUserPhoneNumber(userId, mobileNumber);\n }, [userId, mobileNumber, updateUserPhoneNumber]);\n\n return (\n <CheckVerificationCode\n mobileNumber={mobileNumber}\n onBack={onBack}\n onVerify={handleVerify}\n onVerifySuccess={onVerify}\n onResend={handleResend}\n />\n );\n}\n\n\nexport default VerifyMobileNumberController;","import VerifyMobileNumberController from \"./controller\";\n\nexport default VerifyMobileNumberController;","import LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport EnterMobileNumberController from './components/EnterMobileNumber';\nimport VerifyMobileNumberController from './components/VerifyMobileNumber';\nimport { AddMobileNumberViewProps, MobileNumberVerificationStep } from './types';\n\nfunction AddMobileNumberView({\n userId,\n mobileNumber,\n canSkip,\n currentStep,\n onMobileNumberChange,\n onSendCode,\n onSkip,\n onVerify,\n onBackFromVerify\n}: AddMobileNumberViewProps) {\n return (\n <LoginAuthWrapper contentWidth={343} heightToShowScroll={500}>\n {currentStep === MobileNumberVerificationStep.ENTER && (\n <EnterMobileNumberController\n userId={userId}\n mobileNumber={mobileNumber}\n canSkip={canSkip}\n onMobileNumberChange={onMobileNumberChange}\n onSendCode={onSendCode}\n onSkip={onSkip}\n />\n )}\n {currentStep === MobileNumberVerificationStep.VERIFY && !!mobileNumber && (\n <VerifyMobileNumberController\n userId={userId}\n mobileNumber={mobileNumber}\n onBack={onBackFromVerify}\n onVerify={onVerify}\n />\n )}\n </LoginAuthWrapper>\n );\n}\n\nexport default AddMobileNumberView;","import { useCallback, useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router';\nimport { History } from 'history';\nimport ROUTES from '../../../routes/routes';\nimport Storage from '../../../services/Storage';\nimport { UrlBuilder, UrlBuilderContext } from '../../../tools/url/UrlBuilder';\nimport { UserInterface, UserV2 } from '../../../constants/interfaces/User';\nimport {\n setAuthToken,\n redirectAfterLogin,\n isAuthorized,\n} from '../../../helpers/functions/auth-helpers';\nimport { getUserFeaturesState } from '../../../features/users/store/reducers';\nimport {\n isPractisAdminRole,\n isCompanyAdminRole,\n isTeamLeader,\n} from '../../../constants/enums';\nimport { useGetProfileService } from '../../UserProfile/store/services';\nimport { getProfileState } from '../../UserProfile/store/reducers';\nimport { OnboardingRole } from '../Onboarding/types';\nimport AddMobileNumberView from './view';\nimport { MobileNumberVerificationStep } from './types';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nfunction AddMobileNumberController() {\n const history: History<any> = useHistory();\n const userFeatures = useSelector(getUserFeaturesState);\n const profile = useSelector(getProfileState);\n const getProfile = useGetProfileService();\n const user =\n (history.location.state?.user as UserInterface | UserV2) ?? profile;\n const isNewUser = history.location.state?.isNewUser ?? false;\n const initialVerificationStep =\n history.location.state?.verificationStep ??\n MobileNumberVerificationStep.ENTER;\n const from = history.location.state?.from as Location;\n const [mobileNumber, setMobileNumber] = useState<string>(\n user?.phoneNumber ?? ''\n );\n const [currentStep, setCurrentStep] =\n useState<MobileNumberVerificationStep>(initialVerificationStep);\n const [canSkip, setCanSkip] = useState<boolean>(false);\n\n /**\n * @function finalizeVerification - redirects to a proper page after verification process is completed or skipped\n * @param { UrlBuilder } urlBuilder\n * @returns { void }\n */\n const finalizeVerification = useCallback(\n (urlBuilder: UrlBuilder) => {\n const tempToken = Storage.get('temp_token');\n if (tempToken) {\n Storage.remove('temp_token');\n setAuthToken(user, tempToken);\n if (isNewUser) {\n const role =\n isCompanyAdminRole(user.role?.name) ||\n isPractisAdminRole(user.role?.name)\n ? OnboardingRole.ADMIN\n : isTeamLeader(user.role?.name)\n ? OnboardingRole.TEAM_LEAD\n : OnboardingRole.USER;\n history.push(\n ROUTES.AUTH_PAGES.ONBOARDING.replace(':role', role)\n );\n } else {\n redirectAfterLogin(\n history,\n urlBuilder,\n user,\n tempToken,\n from\n );\n }\n } else {\n redirectAfterLogin(\n history,\n urlBuilder,\n user,\n Storage.get('token')!,\n from\n );\n }\n },\n [user, history, isNewUser, from]\n );\n\n /**\n * @function handleSendCode - switches to code verification view\n * @returns { void }\n */\n const handleSendCode = () =>\n setCurrentStep(MobileNumberVerificationStep.VERIFY);\n\n /**\n * @function handleBackFromVerify - switches to mobile number view\n * @returns { void }\n */\n const handleBackFromVerify = () => {\n setCurrentStep(MobileNumberVerificationStep.ENTER);\n };\n\n useEffect(() => {\n setCanSkip(userFeatures?.phoneSkip?.allow ?? false);\n }, [userFeatures]);\n\n // to prevent browser back button\n useEffect(() => {\n window.history.pushState(null, document.title, window.location.href);\n\n window.addEventListener('popstate', function (event) {\n window.history.pushState(\n null,\n document.title,\n window.location.href\n );\n });\n }, []);\n\n useEffect(() => {\n if (!user?.id && isAuthorized()) {\n getProfile();\n }\n }, [user?.id, getProfile]);\n\n useEffect(() => {\n if (user?.id) {\n setMobileNumber(user.phoneNumber ?? '');\n }\n }, [user?.id, user.phoneNumber]);\n\n useHtmlPageTitle('Add Mobile Number');\n\n return (\n <UrlBuilderContext.Consumer>\n {urlBuilder => (\n <AddMobileNumberView\n userId={user?.id}\n mobileNumber={mobileNumber}\n canSkip={canSkip}\n currentStep={currentStep}\n onMobileNumberChange={setMobileNumber}\n onSendCode={handleSendCode}\n onSkip={() => finalizeVerification(urlBuilder)}\n onVerify={() => finalizeVerification(urlBuilder)}\n onBackFromVerify={handleBackFromVerify}\n />\n )}\n </UrlBuilderContext.Consumer>\n );\n}\n\nexport default AddMobileNumberController;","import AddMobileNumber from \"./controller\";\n\nexport default AddMobileNumber;","import styled from 'styled-components';\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n \n @media(max-width:767px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 768px) {\n flex-direction: column-reverse;\n }\n @media(min-width: 1024px) {\n flex-direction: row;\n justify-content: space-between;\n }\n`;\n\nexport const TextSection = styled.div`\n display: flex;\n flex-direction: column;\n\n @media(max-width:767px) {\n width: 290px;\n padding-top: 24px;\n }\n @media(min-width:768px) {\n width: 432px;\n padding: 32px 33px 0 33px;\n }\n @media(min-width: 1024px) {\n align-items: flex-start;\n justify-content: center;\n width: 345px;\n padding-right: 56px;\n }\n`;\n\nexport const Title = styled.div`\n font-family: Merriweather;\n color: var(--ps-white-1);\n padding-top: 4px;\n font-weight: 600;\n\n @media(max-width:767px) {\n font-size: 20px;\n line-height: 25px;\n }\n @media(min-width:768px) {\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n }\n`\n\nexport const Description = styled.div`\n font-size: 15px;\n line-height: 20px;\n color: var(--ps-grey-2);\n padding-top: 8px;\n`\n\nexport const DownloadButtons = styled.div`\n display: flex;\n flex-direction: row;\n padding-top: 24px;\n justify-content: space-between;\n width: 286px;\n`","import mainImageDesktop from '../../../assets/images/Learner-Desktop_img.png';\nimport mainImageDesktop2x from '../../../assets/images/Learner-Desktop_img@2x.png';\nimport mainImageDesktop3x from '../../../assets/images/Learner-Desktop_img@3x.png';\nimport mainImageTablet from '../../../assets/images/Learner-Tablet_img.png';\nimport mainImageTablet2x from '../../../assets/images/Learner-Tablet_img@2x.png';\nimport mainImageTablet3x from '../../../assets/images/Learner-Tablet_img@3x.png';\nimport mainImagePhone from '../../../assets/images/Learner-Phone_img.png';\nimport mainImagePhone2x from '../../../assets/images/Learner-Phone_img@2x.png';\nimport mainImagePhone3x from '../../../assets/images/Learner-Phone_img@3x.png';\nimport appStoreImage from '../../../assets/images/button-app-store.png'\nimport googlePlayImage from '../../../assets/images/button-google-play.png'\nimport useWindowDimensions from '../../../helpers/hooks/useWindowDimensions';\nimport { useParams } from 'react-router';\nimport { Variables } from '../../../theme/variables';\nimport {\n Content,\n TextSection,\n Title,\n Description,\n DownloadButtons\n} from './styles';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\n\nfunction TraineeSplashView() {\n const windowDimensions = useWindowDimensions();\n const isMobile = windowDimensions.width < Variables.BreakPoints.small;\n const isTablet = !isMobile && windowDimensions.width < Variables.BreakPoints.responsiveSm;\n const isDesktop= windowDimensions.width >= Variables.BreakPoints.responsiveSm;\n const { userName } = useParams<{ userName: string }>();\n\n useHtmlPageTitle('You don’t have permission to access this page');\n\n return (\n <LoginAuthWrapper heightToShowScroll={700}>\n <Content>\n <TextSection>\n <Title>Hi {userName}</Title>\n <Description>\n Looks like you don’t have permission to log into the Practis Admin Portal. To access the\n Learning app, download the Practis Mobile App from the App Store and log in through there.\n </Description>\n <DownloadButtons>\n <a href=\"https://apps.apple.com/us/app/practis/id1499329539\" target=\"_blank\" rel=\"noreferrer\">\n <img src={appStoreImage} width=\"139px\" height=\"40px\" alt=\"Download on the App Store\" />\n </a>\n <a href=\"https://play.google.com/store/apps/details?id=com.gopractis.android\" target=\"_blank\" rel=\"noreferrer\">\n <img src={googlePlayImage} width=\"139px\" height=\"40px\" alt=\"Get it on Google Play\" />\n </a>\n </DownloadButtons>\n </TextSection>\n {isMobile && (\n <img\n src={mainImagePhone}\n srcSet={`${mainImagePhone2x} 2x, ${mainImagePhone3x} 3x`}\n alt=\"\"\n />\n )}\n {isTablet && (\n <img\n src={mainImageTablet}\n srcSet={`${mainImageTablet2x} 2x, ${mainImageTablet3x} 3x`}\n alt=\"\"\n />\n )}\n {isDesktop && (\n <img\n src={mainImageDesktop}\n srcSet={`${mainImageDesktop2x} 2x, ${mainImageDesktop3x} 3x`}\n alt=\"\"\n />\n )}\n </Content>\n </LoginAuthWrapper>\n );\n}\n\nexport default TraineeSplashView;","import TraineeSplashView from \"./view\";\n\nexport default TraineeSplashView;","import React, {\n ChangeEvent,\n FC,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport styled from 'styled-components';\nimport { EnrollmentStatus } from '../../../../../../constants/interfaces/Enrollments';\nimport { Variables } from '../../../../../../theme/variables';\nimport { Button } from '../../../../../../ui/components/Button';\nimport { Fieldset } from '../../../../../../ui/components/Fieldset';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\nimport { PortableLabelsWithStore } from '../../../../../portableLabels';\nimport {\n useDeselectAllLabels,\n useSaveLabels,\n useSelectLabels,\n} from '../../../../../portableLabels/store/hors/withLabels/services';\nimport { useIfChanged } from '../../../../../../helpers/hooks/usePreviousData';\nimport { useLabelsState } from '../../../../../portableLabels/store/hors/withLabels/states';\nimport { TeamMemberStatusEnum } from '../../../../../../constants/interfaces/TeamMember';\nimport OverdueFlag from '../../../../../../ui/icons/OverdueFlag';\n\n//region Styles\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n\n background-color: inherit;\n`;\nconst Wrapper = styled.div`\n display: flex;\n gap: 16px;\n max-height: 416px;\n flex-grow: 1;\n\n background-color: inherit;\n`;\n\nconst LabelsContainer = styled.div`\n width: 208px;\n height: 100%;\n\n overflow: auto;\n background-color: inherit;\n`;\n\nconst StatusContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 152px;\n background-color: inherit;\n`;\n\nconst StatusItem = styled.div`\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n flex-shrink: 0;\n margin-top: 16px;\n`;\n\nconst SummaryCaption = styled.span`\n font-size: 11px;\n font-weight: 500;\n\n margin-right: 24px;\n\n color: ${props => props.theme.Colors.steelGrey};\n`;\n\nconst ButtonWrapper = styled.div`\n margin-right: 12px;\n`;\n\nconst OverdueFlagWrapped = styled(OverdueFlag)`\n margin-left: 4px;\n`;\n//endregion\n\nexport const TeamMembersFilter: FC<{\n preSelectedLabels: number[];\n status: EnrollmentStatus[];\n registrationStatus: any;\n onLabelsChange: (ids: number[]) => void;\n onStatusChange: (status: EnrollmentStatus[]) => void;\n onSuccessApply: () => void;\n onRegistrationStatusChange: (status: any) => void;\n onOverdueChange: (hasOverdue: boolean) => void;\n overdue?: boolean;\n}> = ({\n preSelectedLabels,\n onLabelsChange,\n onStatusChange,\n status,\n registrationStatus,\n onSuccessApply,\n onRegistrationStatusChange,\n onOverdueChange,\n overdue,\n}) => {\n const [statuses, setStatuses] = useState(status);\n const [hasOverdue, setHasOverdue] = useState(!!overdue);\n const [registrationStatuses, setRegistrationStatuses] = useState<any>(registrationStatus)\n const labels = useLabelsState();\n const saveLabels = useSaveLabels();\n const selectLabels = useSelectLabels();\n \n const ifPreselectedLabelsChanged = useIfChanged(preSelectedLabels);\n\n useEffect(() => {\n if (ifPreselectedLabelsChanged) {\n selectLabels(preSelectedLabels);\n saveLabels();\n }\n }, [\n ifPreselectedLabelsChanged,\n preSelectedLabels,\n saveLabels,\n selectLabels,\n ]);\n\n const regStatusesMap: Record<any, { title: string, dataTest: string }> = {\n [TeamMemberStatusEnum.PENDING]: { title: 'Pending', dataTest: 'pending' },\n [TeamMemberStatusEnum.ACTIVE]: { title: 'Active', dataTest: 'active' }\n };\n\n const statusesMap: Record<\n EnrollmentStatus,\n { title: string; dataTest: string }\n > = {\n [EnrollmentStatus.PENDING]: {\n title: 'Not Started',\n dataTest: 'not-started',\n },\n [EnrollmentStatus.ENROLLED]: {\n title: 'In Progress',\n dataTest: 'in-progress',\n },\n [EnrollmentStatus.COMPLETED]: {\n title: 'Completed',\n dataTest: 'completed',\n },\n };\n\n const onStatusChangeHandler = useCallback(\n (statusIn: EnrollmentStatus, e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setStatuses([...statuses, statusIn]);\n } else {\n setStatuses(statuses.filter(item => item !== statusIn));\n }\n },\n [setStatuses, statuses]\n );\n\n const onRegistrationStatusChangeHandler = useCallback(\n (statusIn: TeamMemberStatusEnum, e: ChangeEvent<HTMLInputElement>) => {\n \n if (e.target.checked) {\n setRegistrationStatuses([...registrationStatuses, statusIn]);\n } else {\n setRegistrationStatuses(registrationStatuses.filter((item: any) => item !== statusIn));\n }\n },\n [setRegistrationStatuses, registrationStatuses]\n );\n\n const onApplyHandler = useCallback(() => {\n onStatusChange(statuses);\n onRegistrationStatusChange(registrationStatuses);\n onLabelsChange(labels.selected);\n saveLabels();\n onSuccessApply();\n onOverdueChange(hasOverdue);\n }, [\n onStatusChange,\n statuses,\n registrationStatuses,\n onLabelsChange,\n labels.selected,\n onSuccessApply,\n saveLabels,\n onRegistrationStatusChange,\n onOverdueChange,\n hasOverdue\n ]);\n\n const totalFiltersSelected =\n labels.selected.filter(id => id > 0).length +\n statuses.length +\n registrationStatuses?.length +\n (hasOverdue ? 1 : 0);\n\n const deselectLabels = useDeselectAllLabels();\n\n const onClearHandler = () => {\n deselectLabels();\n setStatuses([]);\n setRegistrationStatuses([]);\n setHasOverdue(false);\n }\n \n return (\n <Container>\n <Wrapper>\n <Fieldset\n title={'Registration Status'}\n dataTest=\"registration-status\"\n >\n <StatusContainer>\n {(\n Object.keys(\n regStatusesMap\n ) as TeamMemberStatusEnum[]\n ).map(item => (\n <StatusItem data-test=\"registration-status-item-container\">\n <Checkbox\n key={item}\n checked={\n registrationStatuses &&\n registrationStatuses.includes(item)\n }\n handleChange={e =>\n onRegistrationStatusChangeHandler(\n item,\n e\n )\n }\n label={regStatusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={regStatusesMap[item].dataTest}\n />\n </StatusItem>\n ))}\n </StatusContainer>\n </Fieldset>\n <Fieldset\n title={'Practis Set Status'}\n dataTest=\"practisset-status\"\n >\n <StatusContainer>\n {(Object.keys(statusesMap) as EnrollmentStatus[]).map(\n item => (\n <StatusItem data-test=\"practisset-status-item-container\">\n <Checkbox\n key={item}\n checked={statuses.includes(item)}\n handleChange={e =>\n onStatusChangeHandler(item, e)\n }\n label={statusesMap[item].title}\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest={statusesMap[item].dataTest}\n />\n </StatusItem>\n )\n )}\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Overdue'} dataTest=\"overdue\">\n <StatusContainer>\n <StatusItem>\n <Checkbox\n checked={hasOverdue}\n handleChange={e =>\n setHasOverdue(e.target.checked)\n }\n label=\"Overdue\"\n border={Variables.Colors.steelGrey}\n size={12}\n fontColor={Variables.Colors.black}\n dataTest=\"overdue\"\n />\n <OverdueFlagWrapped dataTest=\"overdue-flag-icon\" />\n </StatusItem>\n </StatusContainer>\n </Fieldset>\n <Fieldset title={'Labels'} dataTest=\"labels-section-title\">\n <LabelsContainer>\n <PortableLabelsWithStore\n showSave={false}\n showSelectActions\n showSearch\n />\n </LabelsContainer>\n </Fieldset>\n </Wrapper>\n <Actions>\n <SummaryCaption data-test=\"total-filters-counter\">\n {totalFiltersSelected} Selected\n </SummaryCaption>\n <ButtonWrapper>\n <Button\n disabled={!totalFiltersSelected}\n variant=\"inverse\"\n width={'122px'}\n action={() => onClearHandler()}\n dataTest=\"clear-filters-button\"\n >\n Clear\n </Button>\n </ButtonWrapper>\n <Button\n width={'122px'}\n action={() => onApplyHandler()}\n dataTest=\"apply-filters-button\"\n >\n Apply Filter\n </Button>\n </Actions>\n </Container>\n );\n};\n\nexport default TeamMembersFilter;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoMembers = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 48 48\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.2%\"\n x=\"-14.3%\"\n y=\"-1.2%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n fill=\"#212121\"\n d=\"M45.602 35.997H45.6h.002zm-.002 3.001h.002-.002z\"\n transform=\"translate(-821 -541) translate(821 541)\"\n />\n <path\n d=\"M846.637 554c11.386 0 13.917 6.857 13.917 15.314 0 6.516-3.304 13.43-8.643 16.286 2.07.498 12.71 3.103 14.024 4.306 2.398 2.198 3.353 8.795.955 12.094l-20.154-.005-20.34.005c-2.417-3.3-1.438-9.896.98-12.094 1.343-1.223 11.657-3.712 14.054-4.277-5.377-2.834-8.71-9.773-8.71-16.315 0-8.457 2.53-15.314 13.917-15.314zm0 2.99c-9.01 0-10.812 5.543-10.812 12.38 0 5.69 2.925 11.981 7.724 13.948v5.19h-1.284c-5.899 1.23-11.32 2.944-12.903 3.716-1.01 1.132-1.655 4.508-1.028 6.777l18.4-.005 18.21.005c.624-2.269-.002-5.635-.997-6.775-1.59-.76-6.919-2.476-12.748-3.718h-1.468v-5.194c4.795-1.971 7.716-8.256 7.716-13.944 0-6.837-1.802-12.38-10.81-12.38z\"\n transform=\"translate(-825 -554)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n\nexport default NoMembers;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TeamMembersIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.077 4.086A2.062 2.062 0 0 1 5.52 3.5c.54 0 1.06.21 1.443.586.382.375.597.883.597 1.414 0 .53-.215 1.04-.597 1.414A2.062 2.062 0 0 1 5.52 7.5c-.542 0-1.06-.21-1.443-.586A1.98 1.98 0 0 1 3.479 5.5c0-.53.215-1.04.598-1.414zm-1.7-.248a3.445 3.445 0 0 0 .696 4.212 5.596 5.596 0 0 0-2.058 1.67A5.453 5.453 0 0 0 0 12h1.568a3.991 3.991 0 0 1 1.304-2.041 4.133 4.133 0 0 1 2.648-.955c.97 0 1.908.338 2.647.955A3.991 3.991 0 0 1 9.47 12h1.568a5.45 5.45 0 0 0-1.014-2.28 5.595 5.595 0 0 0-2.058-1.671c.43-.398.754-.894.941-1.444.187-.55.232-1.138.13-1.71a3.467 3.467 0 0 0-.715-1.564 3.564 3.564 0 0 0-1.387-1.044 3.637 3.637 0 0 0-3.378.288c-.495.318-.9.753-1.182 1.263zM10.34 13h-.067a.75.75 0 0 0 .067 0zM.754 13H.712h.042zm14.594 0h-.139a.779.779 0 0 0 .14 0zM16 12h-1.64a3.566 3.566 0 0 0-2.387-1.902.767.767 0 0 1-.422-.266.74.74 0 0 1-.164-.464v-.352c0-.14.04-.277.115-.395a.76.76 0 0 1 .31-.277c.309-.15.557-.399.704-.705.148-.306.185-.652.106-.981a1.496 1.496 0 0 0-.54-.833 1.551 1.551 0 0 0-.95-.325.773.773 0 0 1-.541-.22.742.742 0 0 1 0-1.06.773.773 0 0 1 .54-.22c.594 0 1.174.169 1.671.486.497.317.89.769 1.13 1.3.24.532.317 1.12.222 1.694a2.976 2.976 0 0 1-.757 1.538 5.102 5.102 0 0 1 1.622 1.243c.442.51.776 1.101.981 1.739z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n);\n\nexport default TeamMembersIcon;\n","import { FC, useRef, useState } from 'react';\nimport {\n ActionButton,\n ActionItem,\n} from '../../../../../../ui/components/ActionButton';\nimport { Team } from '../../../../../../constants/interfaces/Team';\nimport { UserInterface } from '../../../../../../constants/interfaces/User';\nimport { TeamMember } from '../../../../../../constants/interfaces/TeamMember';\nimport { CheckPermission } from '../../../../../permissions';\nimport { NEW_PERMISSIONS } from '../../../../../../constants/enums/permissions';\nimport { usePractisSetsEnrollmentsService } from '../../../../../users/store/services';\nimport { AssignPractisSets } from '../../../../../../features/assign-practisSets';\n\nconst ListActions: FC<{\n member: TeamMember;\n profile?: UserInterface;\n team?: Team;\n viewProfileHandler: () => void;\n onSendNudge: () => void;\n getMembersReportService: (id?: number) => void;\n onDeleteMember: () => void;\n canRemoveTeamLeader: boolean;\n canNudgeUser: boolean;\n isDefaultTeam?: boolean;\n isHidden?: boolean;\n successApplyPractisSetsCallback: () => void;\n}> = ({\n member,\n viewProfileHandler,\n onSendNudge,\n getMembersReportService,\n onDeleteMember,\n canRemoveTeamLeader,\n canNudgeUser,\n isDefaultTeam,\n isHidden,\n successApplyPractisSetsCallback,\n}) => {\n const [\n isAssignPractisSetPopupOpen,\n setIsAssignPractisSetPopupOpen,\n ] = useState(false);\n \n\n const getUserPractisSets = usePractisSetsEnrollmentsService(\n member.user.id.toString()\n );\n\n const triggerRef = useRef(null);\n\n /**\n * @function handleOpenAssignPractisSetPopup\n * @returns { void }\n */\n const handleOpenAssignPractisSetPopup = (): void => {\n getUserPractisSets(() => setIsAssignPractisSetPopupOpen(true));\n };\n\n /**\n * @function handleCloseAssignPractisSetPopup\n * @returns { void }\n */\n const handleCloseAssignPractisSetPopup = (): void => {\n setIsAssignPractisSetPopupOpen(false);\n };\n\n return (\n <span>\n <div ref={triggerRef}>\n <ActionButton customWidth={200} isHidden={isHidden} dataTest=\"action-menu\">\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n viewProfileHandler();\n }}\n dataTest=\"view-profile-action-item\"\n >\n View Profile\n </ActionItem>\n <CheckPermission\n permissions={[NEW_PERMISSIONS.ASSIGN_ENROLLMENT]}\n >\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n handleOpenAssignPractisSetPopup();\n }}\n dataTest=\"assign-practisset-action-item\"\n >\n Assign Practis Sets\n </ActionItem>\n </CheckPermission>\n {canNudgeUser && (<ActionItem\n onClick={e => {\n e.stopPropagation();\n onSendNudge();\n }}\n dataTest=\"nudge-user-action-item\"\n >\n Nudge User\n </ActionItem>\n )}\n <ActionItem\n onClick={e => {\n e.stopPropagation();\n getMembersReportService(member.user.id);\n }}\n dataTest=\"export-report-action-item\"\n >\n Export Report\n </ActionItem>\n {canRemoveTeamLeader && !isDefaultTeam && (\n <ActionItem\n destructive={true}\n onClick={e => {\n e.stopPropagation();\n onDeleteMember();\n }}\n dataTest=\"remove-from-team-action-item\"\n >\n Remove From Team\n </ActionItem>\n )}\n </ActionButton>\n </div>\n {isAssignPractisSetPopupOpen && (\n <AssignPractisSets\n triggerRef={triggerRef}\n isOpen={isAssignPractisSetPopupOpen}\n onClose={handleCloseAssignPractisSetPopup}\n users={[member.user.id]}\n successApplyPractisSetsCallback={\n successApplyPractisSetsCallback\n }\n />\n )}\n </span>\n );\n};\n\nexport default ListActions;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Corona = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 14 12\"\n className={className}\n >\n {!!shadow && (\n <defs>\n <filter\n width=\"134.3%\"\n height=\"102.1%\"\n x=\"-14.3%\"\n y=\"-1.1%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feOffset\n dx=\"-2\"\n in=\"SourceAlpha\"\n result=\"shadowOffsetOuter1\"\n />\n <feGaussianBlur\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n stdDeviation=\"1\"\n />\n <feColorMatrix\n in=\"shadowBlurOuter1\"\n result=\"shadowMatrixOuter1\"\n values=\"0 0 0 0 0.161525996 0 0 0 0 0.18496362 0 0 0 0 0.213088768 0 0 0 0.3 0\"\n />\n <feMerge>\n <feMergeNode in=\"shadowMatrixOuter1\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n </defs>\n )}\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"currentColor\" fillRule=\"nonzero\">\n <g>\n <path\n d=\"M12.19 9.53V12H1.8V9.53h10.39zm-.897.89H2.695v.69h8.598v-.69zM7 0c.808 0 1.464.65 1.464 1.453 0 .363-.134.694-.355.949L9.58 4.66l1.494-.746c.02-.786.667-1.418 1.463-1.418.809 0 1.464.651 1.464 1.454 0 .74-.558 1.352-1.28 1.442l-.585 3.432H1.865L1.28 5.392C.558 5.302 0 4.691 0 3.95c0-.803.655-1.454 1.464-1.454.808 0 1.463.651 1.463 1.454l-.002-.037 1.463.73 1.464-2.288c-.198-.248-.316-.561-.316-.902C5.536.651 6.192 0 7 0zm-.405 2.85L4.71 5.8l-2.043-1.02c-.13.186-.302.34-.503.448l.472 2.708h8.73l.474-2.707c-.201-.109-.374-.263-.505-.449L9.263 5.813 7.344 2.867c-.11.026-.225.04-.344.04-.14 0-.276-.02-.405-.056zm5.941.536c-.313 0-.567.252-.567.564 0 .311.254.564.567.564.314 0 .568-.253.568-.564 0-.312-.254-.564-.568-.564zm-11.072 0c-.314 0-.568.252-.568.564 0 .311.254.564.568.564.313 0 .567-.253.567-.564 0-.312-.254-.564-.567-.564zM7 .89c-.314 0-.568.252-.568.563 0 .312.254.564.568.564.314 0 .568-.252.568-.564 0-.311-.254-.563-.568-.563z\"\n transform=\"translate(-508 -374) translate(508 374)\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n }\n);\n","import { makeStyles } from '@material-ui/core';\nimport styled from 'styled-components';\n\nimport AvatarPlaceholder from '../../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { Corona } from '../../../../ui/icons/Corona';\n\nexport const useStyles = makeStyles(theme => ({\n multiHeaderContainer: {\n width: '45% !important',\n \n '@media(max-width:1680px)': {\n width: '85% !important',\n },\n\n '@media(max-width: 1441px)': {\n width: '100% !important',\n },\n\n '@media(min-width:1681px)': {\n width: '70% !important',\n },\n\n '@media(min-width: 2041px)': {\n width: '57% !important',\n },\n },\n\n labelsCellStyle: {\n justifyContent: 'flex-end !important'\n }\n}));\n\nexport const Info = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const StyledAvatarPlaceholder = styled(AvatarPlaceholder)`\n height: 24px;\n width: 24px;\n margin-right: 8px;\n`;\n\nexport const StyledCoronaIcon = styled(Corona)`\n width: 14px;\n margin-left: 4px;\n margin-bottom: 2px;\n\n color: ${props => props.theme.Colors.macaroniAndCheese};\n`;\n\nexport const NameAdditionalInfo = styled.span`\n color: ${props => props.theme.Colors.black};\n margin-left: 3px;\n`;\n\nexport const WrapperTableCell = styled.div`\n width: 70%;\n margin: 0 auto;\n display: flex;\n flex-wrap: no-wrap;\n\n td {\n display: inline-flex;\n align-items: center;\n padding: 0 !important;\n justify-content: flex-end;\n\n span {\n width: 95px;\n }\n }\n\n td:nth-child(1) {\n span {\n padding-left: 7px !important;\n }\n }\n\n td:nth-child(2) {\n span {\n padding-left: 7px !important;\n width: 92px;\n }\n }\n\n td:nth-child(3) {\n justify-content: flex-start;\n\n span {\n padding-left: 7px !important;\n }\n }\n\n @media (max-width: 1680px) {\n width: 90%;\n }\n\n @media (max-width: 1441px) {\n width: 100%;\n }\n`;\n","import {\r\n ChangeEventHandler,\r\n FC,\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\nimport { isEmpty as lodashIsEmpty } from 'lodash';\r\n\r\nimport { useParams } from 'react-router';\r\nimport MainWrapper from '../../../../ui/wrapper/MainWrapper/MainWrapper';\r\nimport { TeamsPageNavigation } from '../../components/TeamsPageNavigation';\r\nimport ROUTES from '../../../../routes/routes';\r\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\r\nimport {\r\n useTeamEditState,\r\n useTeamMembersState,\r\n useUpdateMembersState,\r\n} from '../../store/states';\r\nimport {\r\n SearchParams,\r\n useSearchParamsState,\r\n} from '../../../../constants/interfaces/filters';\r\nimport { LoadingComponent } from '../../../../ui/components/LoadingCopmonent';\r\nimport {\r\n UpdatedLabelsState,\r\n useLabelsState,\r\n useUpdatedLabelsState,\r\n} from '../../../labels/store/states';\r\nimport { Popup } from '../../../../ui/components/Popup';\r\nimport TeamMembersFilter from './components/Filters/TeamMembersFilter';\r\nimport { EnrollmentStatus } from '../../../../constants/interfaces/Enrollments';\r\nimport { WithLabelsContext } from '../../../portableLabels';\r\nimport {\r\n useGetMembersReportService,\r\n useMarkTeamAsViewedService,\r\n useNudgeUsersService,\r\n useSearchTeamMembersService,\r\n useDeleteMemberLabelService,\r\n} from '../../store/services';\r\nimport { TeamMember } from '../../../../constants/interfaces/TeamMember';\r\nimport { useIfChanged } from '../../../../helpers/hooks/usePreviousData';\r\nimport { CompanyInterface } from '../../../../constants/interfaces/Company';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { getCompanyState } from '../../../../pages/CompanySettings/store/reducers';\r\nimport { pushModal, useHistory } from '../../../../tools/router';\r\nimport FilterByHandler from '../../../../ui/components/Filters/FilterByHandler';\r\nimport { TeamV2 } from '../../../../constants/interfaces/Team';\r\nimport { NEW_PERMISSIONS } from '../../../../constants/enums/permissions';\r\nimport { getProfileState } from '../../../../pages/UserProfile/store/reducers';\r\nimport { UserProfile } from '../../../../constants/interfaces/User';\r\nimport { getPageUrl } from '../../../../routes/helpers';\r\nimport {\r\n useSaveUserFiltersService,\r\n useSetAssignLabelsActionService,\r\n} from '../../../labels/store/services';\r\nimport { countAppliedFiltersCount } from './tools';\r\nimport {\r\n isCompanyAdminRole,\r\n isPractisAdminRole,\r\n} from '../../../../constants/enums';\r\nimport NoTrainingsFiltering from '../../../../ui/icons/NoTrainingsFiltering';\r\nimport NoMembers from '../../../../ui/icons/NoMembers';\r\nimport { useSearchDebounced } from '../../../../helpers/hooks/useSearch';\r\nimport TeamMembersIcon from '../../../../ui/icons/TeamMembersIcon';\r\nimport { normalizeSP } from '../../../../helpers/functions/searchparams-normalize';\r\nimport { getSearchState } from '../../../searchState/store/reducer';\r\nimport { SearchStateInterface } from '../../../searchState/store/states';\r\nimport { SEARCH_STATE } from '../../../searchState/constants';\r\nimport { isEmpty } from '../../../../helpers/functions/object-helpers';\r\nimport { WithPractisSetsContext } from '../../../portablePractisSets';\r\nimport { TableWrapper } from '../../../../ui/components/table-wrapper';\r\nimport { Tooltip } from '../../../../ui/components/Tooltip';\r\nimport OverdueFlag from '../../../../ui/icons/OverdueFlag';\r\nimport { TableCell } from '../../../../ui/components/table-wrapper/table/table-cell';\r\nimport dayjs from 'dayjs';\r\nimport ListActions from './components/ListActions/ListActions';\r\nimport { EmptyCellDash } from '../../../../ui/components/table-wrapper/table/EmptyCellDash';\r\nimport { useOrderBy } from '../../../../ui/components/table-wrapper/table/table-header/table-header-cell/hook';\r\nimport { useTableStateHelper } from '../../../../ui/components/table-wrapper/helper';\r\nimport { NudgeUser } from '../../../../ui/components/table-wrapper/table/TableAssignOptionsMenu/components/NudgeUser';\r\nimport {\r\n Info,\r\n NameAdditionalInfo,\r\n StyledAvatarPlaceholder,\r\n StyledCoronaIcon,\r\n useStyles,\r\n WrapperTableCell,\r\n} from './styles';\r\nimport { secondsToMinSimple } from '../../../../helpers/functions/convert-time';\r\nimport { Subheader } from '../../components/SubHeader';\r\nimport {\r\n onListenEvent,\r\n onRemoveEvent,\r\n onTriggerEvent,\r\n} from '../../../../helpers/functions/Events';\r\nimport {\r\n EventNameList,\r\n REFRESH_TEAM_CONTROLLER,\r\n REFRESH_TEAM_MEMBERS,\r\n} from '../../../../helpers/functions/Events/types';\r\nimport {\r\n useDeleteMembersFromTeamService,\r\n useUpdateTeamMembersBulkActionService,\r\n} from '../../services/TeamBulkActionsService';\r\nimport { clearTeamUpdateStatus } from '../../store/actions';\r\nimport { NudgeData } from '../../../../api/alert/types';\r\nimport { useNudgeUsersBulkActionService } from '../../../../services/GeneralBulkActionServices';\r\nimport { UPDATE_TEAM_ACTION } from '../../services/TeamBulkActionsService/constants';\r\nimport { UserStatus } from '../../../users/store/costants';\r\nimport { TextEllipsis } from '../../../../ui/generalStyles/TextStyles';\r\nimport { useShowConfirmModalDialog } from '../../../../ui/components/ModalDialogs/store/actions';\r\nimport DialogWrapper from '../../../../ui/components/DialogWrapper/DialogWrapper';\r\n\r\nconst qs = require('query-string');\r\n\r\nconst ITEMS_PER_PAGE = 20;\r\n\r\nconst TeamMembers: FC<{\r\n profile?: UserProfile;\r\n searchHandler: (sp: SearchParams) => void;\r\n team?: TeamV2;\r\n members: ListResult<TeamMember>;\r\n itemsOnPage: number;\r\n loading: boolean;\r\n company?: CompanyInterface;\r\n params: { teamId?: string };\r\n updatedMembers?: TeamMember;\r\n teamUpdateState?: Partial<TeamV2>;\r\n getMembersReportService?(\r\n userIds: number[] | null,\r\n teamId: string,\r\n searchParams: SearchParams\r\n ): void;\r\n onNudgeMembers(\r\n nudgeUsersData: NudgeData[],\r\n successCallback?: () => void\r\n ): void;\r\n saveGlobalLabelFilters: (labels: number[] | null) => void;\r\n updatedLabels?: UpdatedLabelsState;\r\n selectedLabels: number[];\r\n assignedLabels?: number[];\r\n setAssignLabelsAction(labels: number[]): void;\r\n markTeamAsViewed(teamId: any): void;\r\n deleteMemberLabel: (userId: number, labelId: number) => void;\r\n searchState: SearchStateInterface;\r\n locationState: any;\r\n}> = ({\r\n profile,\r\n members,\r\n team,\r\n itemsOnPage,\r\n loading,\r\n selectedLabels,\r\n searchHandler,\r\n company,\r\n params,\r\n updatedMembers,\r\n teamUpdateState,\r\n getMembersReportService,\r\n onNudgeMembers,\r\n saveGlobalLabelFilters,\r\n updatedLabels,\r\n markTeamAsViewed,\r\n deleteMemberLabel,\r\n searchState,\r\n locationState,\r\n}) => {\r\n const deleteMembersFromTeamService = useDeleteMembersFromTeamService();\r\n\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const [lastRefreshedDate, setLastRefreshedDate] = useState(new Date());\r\n const [selectedUsers, setSelectedUsers] = useState<number[]>([]);\r\n const [isSelectAll, setIsSelectAll] = useState<boolean>(false);\r\n const [showNudgeDialogMemberId, setShowNudgeDialogMemberId] = useState<\r\n number | null\r\n >(null);\r\n const [labelsOpen, setLabelsOpen] = useState<null | undefined | number>(\r\n null\r\n );\r\n\r\n const canRemoveTeamLeader =\r\n isPractisAdminRole(profile?.role?.name) ||\r\n isCompanyAdminRole(profile?.role?.name);\r\n\r\n const canNudgeUser = useCallback(\r\n (member: TeamMember) => member.userStatus === UserStatus.ACTIVE,\r\n []\r\n );\r\n\r\n const bulkRemoveDisabled =\r\n members &&\r\n members.items\r\n .filter(member => member.isTeamLead)\r\n .some(member => selectedUsers.includes(member.user.id)) &&\r\n !canRemoveTeamLeader;\r\n\r\n const initialSearchParams: SearchParams = {\r\n searchTerm: '',\r\n filters: [],\r\n labelIDs: selectedLabels,\r\n orderBy: null,\r\n limit: itemsOnPage,\r\n offset: 0,\r\n totalCount: 0,\r\n numberOfPages: 0,\r\n filterByStatus: [],\r\n };\r\n\r\n const usableParams: SearchParams =\r\n !isEmpty(searchState) &&\r\n !!searchState?.params &&\r\n searchState.key === SEARCH_STATE.MEMBERS.name\r\n ? searchState.params\r\n : initialSearchParams;\r\n\r\n const {\r\n searchParams,\r\n setSearchTerm,\r\n setOrderBy,\r\n setLabelIDs,\r\n setOffset,\r\n setCustom,\r\n refreshSearchParams,\r\n setFilter,\r\n } = useSearchParamsState(usableParams);\r\n const ifSearchParamsChanged = useIfChanged(searchParams);\r\n const ifCompanyChanged = useIfChanged(company && company.id, true);\r\n const showConfirmationModalDialog = useShowConfirmModalDialog();\r\n\r\n const location = history.location;\r\n const pageIndex = parseInt(qs.parse(location.search).page);\r\n const initialOffset = pageIndex\r\n ? pageIndex === 1\r\n ? 0\r\n : (pageIndex - 1) * ITEMS_PER_PAGE\r\n : 0;\r\n\r\n const orderBy = searchParams.orderBy;\r\n const hcTeamMembers = useOrderBy<TeamMember>('name', orderBy, setOrderBy);\r\n const hcTrainingTime = useOrderBy<TeamMember>(\r\n 'training_time',\r\n orderBy,\r\n setOrderBy\r\n );\r\n const hcTraining = useOrderBy<TeamMember>(\r\n 'last_training',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n const hcCompletedEnrollmentCount = useOrderBy<TeamMember>(\r\n 'enrollment_completed',\r\n orderBy,\r\n setOrderBy\r\n );\r\n const hcProgressEnrollmentCount = useOrderBy<TeamMember>(\r\n 'enrollment_in_progress',\r\n orderBy,\r\n setOrderBy\r\n );\r\n const hcPendingEnrollmentCount = useOrderBy<TeamMember>(\r\n 'enrollment_not_started',\r\n orderBy,\r\n setOrderBy\r\n );\r\n\r\n const hcAccuracyAvg = useOrderBy('accuracy', orderBy, setOrderBy);\r\n const hcOverdue = useOrderBy('overdue', orderBy, setOrderBy);\r\n\r\n const refreshHandler = () => {\r\n setLastRefreshedDate(new Date());\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchHandler(searchParams);\r\n setSelectedUsers([]);\r\n setIsSelectAll(false);\r\n };\r\n\r\n const selectAllHandler: ChangeEventHandler<HTMLInputElement> = e => {\r\n if (\r\n members.count < ITEMS_PER_PAGE &&\r\n e.target.checked === true\r\n ) {\r\n setIsSelectAll(true);\r\n } else {\r\n setIsSelectAll(false);\r\n }\r\n\r\n if (e.target.checked || isCheckboxPartiallySelected) {\r\n setSelectedUsers(members.items.map(item => item.user.id));\r\n } else {\r\n setSelectedUsers([]);\r\n }\r\n };\r\n\r\n const labelChangeHandler = (ids: number[]) => {\r\n saveGlobalLabelFilters(ids);\r\n };\r\n\r\n const filterStatusHandler = (status: EnrollmentStatus[]) => {\r\n setCustom('filterByStatus', status);\r\n };\r\n\r\n const filterOverdueHandler = (hasOverdue: boolean) => {\r\n setFilter({\r\n field: 'hasOverdue',\r\n value: hasOverdue,\r\n });\r\n };\r\n\r\n const registrationStatusHandler = (values: string[]) => {\r\n setCustom('filterByRegistrationStatus', values);\r\n };\r\n\r\n const isTableHeadersDisabled =\r\n !members || (members && !members.items.length);\r\n\r\n const selectUserHandler = useCallback(\r\n (id: number, state: boolean) => {\r\n if (state) {\r\n setSelectedUsers(prevState => [...prevState, id]);\r\n } else {\r\n setSelectedUsers(prevState =>\r\n prevState.filter(item => item !== id)\r\n );\r\n }\r\n setIsSelectAll(false);\r\n },\r\n [setSelectedUsers]\r\n );\r\n\r\n const handleManageTeam = useCallback(() => {\r\n if (!team?.id || team?.isDefault === undefined) {\r\n return;\r\n }\r\n if (params && params.teamId) {\r\n pushModal(\r\n history,\r\n ROUTES.TEAMS_PAGES.MANAGE_TEAM.replace(\r\n ':teamId',\r\n team.id.toString()\r\n ),\r\n { isDefaultTeam: team?.isDefault }\r\n );\r\n }\r\n }, [history, params, team]);\r\n\r\n const onNudgeMultipleUsersSuccessCallback = useCallback(() => {\r\n onClearSelection();\r\n }, []);\r\n\r\n const nudgeUsersBulkActionService = useNudgeUsersBulkActionService(\r\n 'common',\r\n {\r\n companyId: company?.id ?? 0,\r\n },\r\n searchParams,\r\n members?.count ?? 0,\r\n refreshHandler\r\n );\r\n\r\n const handleNudgeMultipleUsers = useCallback(\r\n (data: any) => {\r\n const { text, name: senderName } = data;\r\n\r\n if (isSelectAll) {\r\n nudgeUsersBulkActionService({ text, senderName });\r\n } else {\r\n if (selectedUsers) {\r\n const nudgeUsersDate = selectedUsers.map(\r\n user =>\r\n ({\r\n type: 'common',\r\n receiverId: user,\r\n enrollmentId: null,\r\n senderName,\r\n text,\r\n } as NudgeData)\r\n );\r\n\r\n onNudgeMembers(\r\n nudgeUsersDate,\r\n onNudgeMultipleUsersSuccessCallback\r\n );\r\n }\r\n }\r\n },\r\n [\r\n isSelectAll,\r\n nudgeUsersBulkActionService,\r\n selectedUsers,\r\n onNudgeMembers,\r\n onNudgeMultipleUsersSuccessCallback,\r\n ]\r\n );\r\n\r\n const onSinglePractisExportClicked = useCallback(\r\n (memberId: any) => {\r\n if (\r\n getMembersReportService &&\r\n params &&\r\n params.teamId &&\r\n memberId\r\n ) {\r\n getMembersReportService(\r\n [memberId],\r\n params.teamId,\r\n searchParams\r\n );\r\n }\r\n },\r\n [getMembersReportService, params, searchParams]\r\n );\r\n\r\n const onNudgeSingleUserSuccessCallback = () => {\r\n setShowNudgeDialogMemberId(null);\r\n };\r\n\r\n const handleNudgeSingleUser = useCallback(\r\n (data: any) => {\r\n const { text, name: senderName } = data;\r\n if (showNudgeDialogMemberId) {\r\n const nudgeUserDate: NudgeData = {\r\n type: 'common',\r\n enrollmentId: null,\r\n receiverId: showNudgeDialogMemberId,\r\n text,\r\n senderName,\r\n };\r\n\r\n onNudgeMembers(\r\n [nudgeUserDate],\r\n onNudgeSingleUserSuccessCallback\r\n );\r\n }\r\n },\r\n [onNudgeMembers, showNudgeDialogMemberId]\r\n );\r\n\r\n const onExportClicked = useCallback(() => {\r\n if (\r\n selectedUsers &&\r\n selectedUsers.length &&\r\n getMembersReportService &&\r\n params &&\r\n params.teamId\r\n ) {\r\n getMembersReportService(\r\n !isSelectAll ? selectedUsers : null,\r\n params.teamId,\r\n isSelectAll\r\n ? normalizeSP(searchParams, members.count)\r\n : searchParams\r\n );\r\n }\r\n }, [\r\n selectedUsers,\r\n getMembersReportService,\r\n params,\r\n isSelectAll,\r\n searchParams,\r\n members.count,\r\n ]);\r\n\r\n /**\r\n * @function onDeleteTeamMembersSuccessCallback\r\n * @returns { void }\r\n */\r\n const onDeleteTeamMembersSuccessCallback = (): void => {\r\n Promise.resolve().then(() => {\r\n setSelectedUsers([]);\r\n refreshHandler();\r\n dispatch(clearTeamUpdateStatus());\r\n onTriggerEvent(EventNameList[REFRESH_TEAM_CONTROLLER]);\r\n });\r\n };\r\n\r\n /**\r\n * @function handleDeleteTeamMembersSingleAction\r\n * @param { number[] | undefined } selectedUserIds\r\n * @returns { void }\r\n */\r\n const handleDeleteTeamMembersSingleAction = (\r\n selectedUserIds?: number[]\r\n ): void => {\r\n const { teamId = null } = params!;\r\n if (!isEmpty(selectedUserIds) && teamId) {\r\n deleteMembersFromTeamService(\r\n +teamId,\r\n undefined,\r\n selectedUserIds\r\n ).then(() => {\r\n onDeleteTeamMembersSuccessCallback();\r\n });\r\n }\r\n };\r\n\r\n const deleteMembersFromTeamServiceOptions = {\r\n parameters: {\r\n teamId: +(params.teamId ?? 0),\r\n searchParams: {\r\n ...searchParams,\r\n limit: ITEMS_PER_PAGE,\r\n offset: isSelectAll ? members?.count : selectedUsers.length,\r\n },\r\n selectedItemIds: !isSelectAll ? selectedUsers : undefined,\r\n itemsCount: selectedUsers?.length ?? 0,\r\n },\r\n fieldName: !isSelectAll ? 'selectedItemIds' : 'searchParams.offset',\r\n };\r\n\r\n const {\r\n handleStartBulkActionService:\r\n handleStartDeleteMembersFromTeamBulkAction,\r\n } = useUpdateTeamMembersBulkActionService(\r\n {\r\n actionName: UPDATE_TEAM_ACTION,\r\n actionFunction: deleteMembersFromTeamService,\r\n actionFunctionOptions: deleteMembersFromTeamServiceOptions,\r\n },\r\n 'Removing Users',\r\n onDeleteTeamMembersSuccessCallback\r\n );\r\n\r\n /**\r\n * @function handleDeleteTeamMembers\r\n * @param { number[] } ids\r\n * @returns { void }\r\n */\r\n const handleDeleteTeamMembers = (ids: number[]): void => {\r\n // we should start chunk service.\r\n if (isSelectAll) {\r\n handleStartDeleteMembersFromTeamBulkAction();\r\n } else {\r\n showConfirmationModalDialog({\r\n modalTitle: 'Warning',\r\n description:\r\n 'You will remove the selected member(s) from the team. This action cannot be undone. Are you sure?',\r\n cancelButtonText: 'Go Back',\r\n confirmButtonText: 'Proceed',\r\n dialogType: 'DANGER',\r\n onConfirm: () => handleDeleteTeamMembersSingleAction(ids),\r\n });\r\n }\r\n };\r\n\r\n const handleTableStates = useTableStateHelper();\r\n const tableStates = handleTableStates({\r\n searchTerm: searchParams.searchTerm,\r\n appliedFilters: countAppliedFiltersCount(searchParams),\r\n itemsCount: members?.items.length || 0,\r\n });\r\n\r\n useEffect(() => {\r\n if (ifSearchParamsChanged) {\r\n searchParams.limit = ITEMS_PER_PAGE;\r\n searchParams.offset = initialOffset;\r\n searchHandler(searchParams);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchHandler, searchParams, ifSearchParamsChanged]);\r\n\r\n useEffect(() => {\r\n if (ifCompanyChanged) {\r\n history.push(ROUTES.TEAMS);\r\n }\r\n }, [ifCompanyChanged, history]);\r\n\r\n useEffect(() => {\r\n if (updatedMembers || teamUpdateState) refreshSearchParams();\r\n }, [updatedMembers, teamUpdateState, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n if (selectedUsers.length) {\r\n setSelectedUsers([]);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchParams.orderBy]);\r\n\r\n useEffect(() => {\r\n if (team && params && params.teamId) {\r\n const leaders = team.leaders;\r\n\r\n if (!leaders || (leaders && !leaders.length)) {\r\n return;\r\n } else {\r\n const leader = leaders.find(\r\n item => item.user.id === profile?.id\r\n );\r\n if (!leader) return;\r\n\r\n if (!(leader && leader.isViewed)) {\r\n markTeamAsViewed(parseInt(params.teamId));\r\n }\r\n }\r\n }\r\n }, [team, params.teamId, profile, markTeamAsViewed, params]);\r\n\r\n useEffect(() => {\r\n selectedLabels && setLabelIDs(selectedLabels);\r\n }, [selectedLabels, setLabelIDs]);\r\n\r\n useEffect(() => {\r\n if (updatedLabels && updatedLabels.updateType === 'delete')\r\n refreshSearchParams();\r\n }, [updatedLabels, refreshSearchParams]);\r\n\r\n useEffect(() => {\r\n if (selectedUsers?.length === members?.count) {\r\n setIsSelectAll(true);\r\n }\r\n }, [members?.count, selectedUsers]);\r\n\r\n useEffect(() => {\r\n return () => setSelectedUsers([]);\r\n }, []);\r\n\r\n useEffect(() => {\r\n Promise.resolve().then(() => {\r\n setSelectedUsers([]);\r\n setIsSelectAll(false);\r\n });\r\n }, [members]);\r\n\r\n useEffect(() => {\r\n if (pageIndex > 1) {\r\n setTimeout(() => {\r\n setOffset(initialOffset);\r\n }, 300);\r\n } else if (pageIndex === 1) {\r\n setTimeout(() => {\r\n setOffset(0);\r\n }, 100);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageIndex]);\r\n\r\n useEffect(() => {\r\n onListenEvent(EventNameList[REFRESH_TEAM_MEMBERS], refreshHandler);\r\n\r\n return () => {\r\n onRemoveEvent(EventNameList[REFRESH_TEAM_MEMBERS], refreshHandler);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const isListEmpty = !members || (members && !members.items.length);\r\n\r\n const isFilteredByOverdue = searchParams.filters?.some(\r\n item => item.field === 'hasOverdue' && item.value === true\r\n );\r\n\r\n /**\r\n * @function handlePageChange\r\n * @param { number } limit\r\n * @param { number } offset\r\n * @returns { void }\r\n */\r\n const handlePageChange = (offset: number) => {\r\n setOffset(offset);\r\n };\r\n\r\n /**\r\n * @function onClearSelection\r\n * @returns { void }\r\n */\r\n const onClearSelection = () => {\r\n setIsSelectAll(false);\r\n setSelectedUsers([]);\r\n };\r\n\r\n /**\r\n * @function handleAssignedLabelDelete\r\n * @param { number } labelId\r\n * @param { TeamMember } member\r\n * @returns { void }\r\n */\r\n const handleAssignedLabelDelete = (\r\n labelId: number,\r\n member: TeamMember\r\n ): void => {\r\n deleteMemberLabel(member.user.id, labelId);\r\n };\r\n\r\n /**\r\n * @function onSelectAll\r\n * @returns { void }\r\n */\r\n const onSelectAll = () => {\r\n setSelectedUsers(members.items.map(item => item.user.id));\r\n setIsSelectAll(true);\r\n };\r\n\r\n const isMasterCheckBoxChecked = !!selectedUsers.length;\r\n\r\n const isMasterCheckBoxDisabled = !members.items.length;\r\n\r\n const isCheckboxPartiallySelected =\r\n selectedUsers && selectedUsers.length < members.items.length;\r\n\r\n /**\r\n * @function viewProfileHandler\r\n * @param { TeamMember } member\r\n * @returns { void }\r\n */\r\n const viewProfileHandler = useCallback(\r\n (member: TeamMember) => {\r\n history.push(\r\n getPageUrl(ROUTES.USER_PERFORMANCE, {\r\n userId: member.user.id.toString(),\r\n }),\r\n { useGoBack: true }\r\n );\r\n },\r\n [history]\r\n );\r\n\r\n /**\r\n * @function checkIsRowChecked\r\n * @param { TeamMember } member\r\n * @returns { boolean }\r\n */\r\n const checkIsRowChecked = (member: TeamMember): boolean =>\r\n selectedUsers.includes(member.user.id) || isSelectAll;\r\n\r\n /**\r\n * @function onRowCheckHandler\r\n * @param event\r\n * @param { TeamMember } member\r\n * @returns { void }\r\n */\r\n const onRowCheckHandler = (event: any, member: TeamMember) => {\r\n selectUserHandler(member.user.id, event?.target?.checked);\r\n };\r\n\r\n /**\r\n * @function checkIsLabelTagsOpen\r\n * @param { TeamMember } member\r\n * @returns { boolean }\r\n */\r\n const checkIsLabelTagsOpen = (member: TeamMember): boolean => {\r\n return labelsOpen === member.user.id;\r\n };\r\n\r\n /**\r\n * @function onDeleteLabelHandler\r\n * @param { number } labelId\r\n * @param { TeamMember } member\r\n * @returns { void }\r\n */\r\n const onDeleteLabelHandler = (\r\n labelId: number,\r\n member: TeamMember\r\n ): void => {\r\n handleAssignedLabelDelete(labelId, member);\r\n };\r\n\r\n /**\r\n * @function getAdditionalMemberInfo\r\n * @returns { ReactNode | null }\r\n */\r\n const getAdditionalMemberInfo = useCallback(\r\n (memberId: number) => {\r\n if (profile?.id === memberId) {\r\n return <NameAdditionalInfo>{` (You)`}</NameAdditionalInfo>;\r\n }\r\n\r\n return null;\r\n },\r\n [profile]\r\n );\r\n\r\n /**\r\n * @function getFormattedLastTrainingAt\r\n * @param { Date } lastTrainingAt\r\n * @returns { string }\r\n */\r\n const getFormattedLastTrainingAt = (lastTrainingAt: Date): string => {\r\n if (!lastTrainingAt) {\r\n return '';\r\n }\r\n\r\n const date = dayjs(lastTrainingAt);\r\n return date.isBefore(Date.now(), 'day')\r\n ? date.format('M/D/YY')\r\n : date.format('h:mm A');\r\n };\r\n\r\n /**\r\n * @function renderTeamLeadInfo\r\n * @returns { ReactNode }\r\n */\r\n const renderTeamLeadInfo = (): ReactNode => {\r\n return (\r\n <Tooltip\r\n label=\"User is a team leader\"\r\n position=\"bottom-start\"\r\n offset={{\r\n y: '-2px',\r\n x: '4px',\r\n }}\r\n >\r\n <StyledCoronaIcon />\r\n </Tooltip>\r\n );\r\n };\r\n\r\n /**\r\n * @function handleToggleLabels\r\n * @param { number } itemId\r\n * @returns { void }\r\n */\r\n const handleToggleLabels = (itemId?: number) => {\r\n if (!itemId) return;\r\n if (labelsOpen === itemId) {\r\n setLabelsOpen(null);\r\n } else {\r\n setLabelsOpen(itemId);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <MainWrapper\r\n subTitle={team && team.name ? team.name : ''}\r\n tabs={<TeamsPageNavigation teamName={team?.name} />}\r\n subHeader={\r\n <Subheader\r\n practisSetsCount={team?.countPractisSets}\r\n usersCount={team?.countMembers}\r\n teamLeadersCount={team?.leaders?.length}\r\n />\r\n }\r\n goBackUrl={ROUTES.TEAMS_PAGES.LIST_OF_TEAMS}\r\n title=\"Team\"\r\n useGoBack={locationState?.useGoBack}\r\n htmlPageTitle={`Teams ${\r\n team ? `- ${team.name}` : ''\r\n } - Practis`}\r\n dataTest=\"team\"\r\n >\r\n {!!showNudgeDialogMemberId && (\r\n <DialogWrapper\r\n customization={{\r\n width: 480,\r\n padding: '49px 32px 32px 32px',\r\n }}\r\n >\r\n <NudgeUser\r\n fromUser={\r\n !!profile\r\n ? `${profile.firstName} ${profile.lastName}`\r\n : ''\r\n }\r\n onSend={handleNudgeSingleUser}\r\n onClose={() => setShowNudgeDialogMemberId(null)}\r\n />\r\n </DialogWrapper>\r\n )}\r\n <TableWrapper\r\n tableStates={tableStates}\r\n data={members?.items}\r\n selectedLabels={selectedLabels}\r\n cornered={selectedLabels && !!selectedLabels.length}\r\n tableRefreshConfigurations={{\r\n lastRefreshed: lastRefreshedDate,\r\n refreshData: refreshHandler,\r\n dataTest: \"team-timestamp\",\r\n buttons: [\r\n {\r\n name: 'Manage Team',\r\n icon: <TeamMembersIcon />,\r\n onPress: handleManageTeam,\r\n disabled: !team?.id,\r\n dataTest: 'manage-team',\r\n },\r\n ],\r\n }}\r\n tableToolsOptions={{\r\n pagingOptions: {\r\n totalCount: members?.count ?? 0,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onPageChange: handlePageChange,\r\n searchOrFiltersApplied:\r\n searchParams.searchTerm.length ||\r\n countAppliedFiltersCount(searchParams),\r\n dataTest: \"team-paging\",\r\n },\r\n searchInputOptions: {\r\n initialValue: searchParams.searchTerm,\r\n onSearchChange: setSearchTerm,\r\n isSearchInputDisabled:\r\n isListEmpty && !searchParams.searchTerm.length,\r\n dataTest: \"team-search\",\r\n },\r\n isSelectedItemOptionsVisible:\r\n !lodashIsEmpty(selectedUsers) &&\r\n !lodashIsEmpty(members),\r\n selectedItemOptions: {\r\n isSelectAll: isSelectAll,\r\n selectedLength: selectedUsers?.length,\r\n totalCount: members?.count,\r\n itemsPerPage: ITEMS_PER_PAGE,\r\n onClearSelection: onClearSelection,\r\n onSelectAll: onSelectAll,\r\n bulkActionsConfig: {\r\n disabled: selectedUsers.length === 0,\r\n showNudgeWarning: false,\r\n assignPractisSetsAndDueDatePermissions: [\r\n NEW_PERMISSIONS.ASSIGN_ENROLLMENT,\r\n ],\r\n onNudgeSendButtonClicked:\r\n handleNudgeMultipleUsers,\r\n sendNudgePermissions: [\r\n NEW_PERMISSIONS.SEND_NUDGE,\r\n ],\r\n onExportClicked: onExportClicked,\r\n showExportPermissions: [\r\n NEW_PERMISSIONS.EXPORT_LIST_USER,\r\n ],\r\n removeItemPermissions: !team?.isDefault\r\n ? [NEW_PERMISSIONS.REMOVE_TEAM_MEMBER]\r\n : undefined,\r\n removeItemTitle: 'Remove From Team',\r\n onRemoveItemsSubmit: () =>\r\n handleDeleteTeamMembers(selectedUsers),\r\n removeItemsDisabled: bulkRemoveDisabled,\r\n removeItemTooltip:\r\n 'Team leaders can’t be removed from team',\r\n isSelectAll: isSelectAll,\r\n totalCount: members?.count,\r\n searchQuery: {\r\n query: !lodashIsEmpty(\r\n searchParams?.searchTerm\r\n )\r\n ? searchParams.searchTerm\r\n : null,\r\n teamId: team?.id,\r\n labelId: !lodashIsEmpty(\r\n searchParams?.labelIDs\r\n )\r\n ? searchParams.labelIDs\r\n : null,\r\n status: !lodashIsEmpty(\r\n searchParams?.filterByRegistrationStatus\r\n )\r\n ? searchParams.filterByRegistrationStatus\r\n : null,\r\n trainingStatus: !lodashIsEmpty(\r\n searchParams?.filterByStatus\r\n )\r\n ? searchParams.filterByStatus\r\n : null,\r\n hasOverdue: isFilteredByOverdue,\r\n },\r\n selectedItems: selectedUsers,\r\n successApplyPractisSetsCallback: refreshHandler,\r\n },\r\n },\r\n filterOptions: {\r\n filterComponent: (\r\n <Popup<HTMLButtonElement>\r\n content={({ hide }) => (\r\n <TeamMembersFilter\r\n preSelectedLabels={\r\n selectedLabels || []\r\n }\r\n onStatusChange={filterStatusHandler}\r\n onRegistrationStatusChange={\r\n registrationStatusHandler\r\n }\r\n status={\r\n searchParams.filterByStatus as EnrollmentStatus[]\r\n }\r\n registrationStatus={\r\n searchParams.filterByRegistrationStatus ||\r\n []\r\n }\r\n onOverdueChange={\r\n filterOverdueHandler\r\n }\r\n onLabelsChange={labelChangeHandler}\r\n onSuccessApply={() => hide()}\r\n overdue={isFilteredByOverdue}\r\n />\r\n )}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n horizontalOffset={256}\r\n >\r\n {(ref, { toggleShown, shown }) => (\r\n <FilterByHandler\r\n ref={ref}\r\n open={shown}\r\n toggleOpen={toggleShown}\r\n filtersCount={countAppliedFiltersCount(\r\n searchParams\r\n )}\r\n disabled={\r\n (searchParams.searchTerm\r\n .length > 0 ||\r\n countAppliedFiltersCount(\r\n searchParams\r\n ) === 0) &&\r\n isListEmpty\r\n }\r\n dataTest=\"team-filters\"\r\n />\r\n )}\r\n </Popup>\r\n ),\r\n },\r\n }}\r\n tableEmptyStateConfigurations={{\r\n shouldShowEmptyState:\r\n !loading && members?.items?.length === 0,\r\n noEntriesOptions: {\r\n icon: NoMembers,\r\n text: 'No Members Yet',\r\n dataTest: 'no-members-yet',\r\n },\r\n noSearchResultsOptions: {\r\n entityName: 'Members',\r\n dataTest: 'no-members-found',\r\n },\r\n noFilterResultsOptions: {\r\n icon: NoTrainingsFiltering,\r\n width: '160px',\r\n dataTest: 'no-filtering-criteria',\r\n },\r\n }}\r\n configurations={{\r\n masterCheckBoxConfig: {\r\n checked: isMasterCheckBoxChecked,\r\n disabled: isMasterCheckBoxDisabled,\r\n partial:\r\n isCheckboxPartiallySelected || !isSelectAll,\r\n handleCheck: selectAllHandler,\r\n dataTest: \"members-master-checkbox\"\r\n },\r\n columns: [\r\n {\r\n title: 'Team Members',\r\n width: 18,\r\n ...(isTableHeadersDisabled\r\n ? null\r\n : hcTeamMembers),\r\n disabled: isTableHeadersDisabled,\r\n dataTest: 'team-members-column',\r\n },\r\n {\r\n title: 'Overdue',\r\n width: 1,\r\n ...(isTableHeadersDisabled ? null : hcOverdue),\r\n disabled: isTableHeadersDisabled,\r\n withTooltip: true,\r\n dataTest: 'overdue-column',\r\n },\r\n {\r\n title: 'Practis Sets Status',\r\n width: 30,\r\n dataTest: 'practis-set-status-column',\r\n ...(isTableHeadersDisabled\r\n ? null\r\n : hcAccuracyAvg),\r\n disabled: isTableHeadersDisabled,\r\n titleWidth: 70,\r\n multiHeaderContainerClassName:\r\n classes.multiHeaderContainer,\r\n subColumns: [\r\n {\r\n title: 'Not Started',\r\n width: 33,\r\n ...(isListEmpty\r\n ? null\r\n : hcPendingEnrollmentCount),\r\n disabled: isListEmpty,\r\n dataTest: 'not-started-column',\r\n },\r\n {\r\n title: 'In Progress',\r\n width: 33,\r\n ...(isListEmpty\r\n ? null\r\n : hcProgressEnrollmentCount),\r\n disabled: isListEmpty,\r\n dataTest: 'in-progress-column',\r\n },\r\n {\r\n title: 'Completed',\r\n width: 33,\r\n ...(isListEmpty\r\n ? null\r\n : hcCompletedEnrollmentCount),\r\n disabled: isListEmpty,\r\n dataTest: 'completed-column',\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Accuracy',\r\n width: 10,\r\n ...(isTableHeadersDisabled\r\n ? null\r\n : hcAccuracyAvg),\r\n disabled: isTableHeadersDisabled,\r\n withTooltip: true,\r\n dataTest: 'accuracy-column',\r\n tooltipText:\r\n 'The average of the accuracy scores for all submitted scenario accuracy tests.',\r\n },\r\n {\r\n title: 'Training Time',\r\n width: 10,\r\n ...(isTableHeadersDisabled\r\n ? null\r\n : hcTrainingTime),\r\n disabled: isTableHeadersDisabled,\r\n withTooltip: true,\r\n dataTest: 'training-time-column',\r\n tooltipText:\r\n 'The total time spent by a user learning material.',\r\n },\r\n {\r\n title: 'Last Training',\r\n width: 10,\r\n ...(isTableHeadersDisabled ? null : hcTraining),\r\n disabled: isTableHeadersDisabled,\r\n dataTest: 'last-training-column',\r\n },\r\n {\r\n width: 9,\r\n },\r\n {\r\n width: 3,\r\n },\r\n ],\r\n rowConfig: {\r\n onRowClick: viewProfileHandler,\r\n onRowCheckHandler: onRowCheckHandler,\r\n isRowChecked: checkIsRowChecked,\r\n isLabelTagsOpen: checkIsLabelTagsOpen,\r\n getLabelTagsProps: (member: TeamMember) => ({\r\n selectedLabels: member.labels || [],\r\n deletePermissions: [\r\n NEW_PERMISSIONS.REMOVE_USER_LABEL,\r\n ],\r\n onDeleteLabel: (labelId: any) =>\r\n onDeleteLabelHandler(labelId, member),\r\n }),\r\n dataTest: 'member-item',\r\n cells: [\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (\r\n member: TeamMember\r\n ) => (\r\n <Info>\r\n <StyledAvatarPlaceholder\r\n customProfile={{\r\n firstName:\r\n member.user.firstName,\r\n lastName:\r\n member.user.lastName,\r\n picture:\r\n member.user.imageUrl,\r\n status: member.userStatus,\r\n }}\r\n size=\"sm\"\r\n dataTest=\"member-avatar\"\r\n />\r\n <TextEllipsis\r\n title={`${member.user.firstName} ${member.user.lastName}`}\r\n data-test=\"member-name\"\r\n >{`${member.user.firstName} ${member.user.lastName}`}</TextEllipsis>\r\n {getAdditionalMemberInfo(\r\n member.user.id\r\n )}\r\n {member?.isTeamLead &&\r\n renderTeamLeadInfo()}\r\n </Info>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (member: TeamMember) =>\r\n !member.isOverdue,\r\n fieldProps: {\r\n renderTitle: (member: TeamMember) =>\r\n member.isOverdue && <span data-test=\"overdue-icon\"><OverdueFlag /></span>,\r\n },\r\n },\r\n {\r\n fieldType: 'CUSTOM_FIELD',\r\n getCustomFieldComponent: (\r\n member: TeamMember\r\n ) => (\r\n <WrapperTableCell>\r\n <TableCell width={33}>\r\n {member.enrollmentNotStarted ? (\r\n <span data-test=\"not-started-count\">\r\n {\r\n member.enrollmentNotStarted\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TableCell>\r\n <TableCell width={33}>\r\n {member.enrollmentEnrolled ? (\r\n <span data-test=\"in-progress-count\">\r\n {\r\n member.enrollmentEnrolled\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TableCell>\r\n <TableCell width={33}>\r\n {member.enrollmentCompleted ? (\r\n <span data-test=\"completed-count\">\r\n {\r\n member.enrollmentCompleted\r\n }\r\n </span>\r\n ) : (\r\n <EmptyCellDash />\r\n )}\r\n </TableCell>\r\n </WrapperTableCell>\r\n ),\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (member: TeamMember) =>\r\n !member.accuracy,\r\n fieldProps: {\r\n renderTitle: (member: TeamMember) =>\r\n member.accuracy &&\r\n `${Math.floor(\r\n member.accuracy * 100\r\n )}%`,\r\n dataTest: 'accuracy-value',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (member: TeamMember) =>\r\n !member?.trainingTime,\r\n fieldProps: {\r\n renderTitle: (member: TeamMember) =>\r\n member?.trainingTime &&\r\n secondsToMinSimple(\r\n member.trainingTime\r\n ),\r\n dataTest: 'training-time',\r\n },\r\n },\r\n {\r\n fieldType: 'TEXT_FIELD',\r\n shouldShowEmptyCell: (member: TeamMember) =>\r\n !member?.lastTraining,\r\n fieldProps: {\r\n renderTitle: (member: TeamMember) =>\r\n member?.lastTraining &&\r\n getFormattedLastTrainingAt(\r\n member.lastTraining\r\n ),\r\n dataTest: 'last-training-date'\r\n },\r\n },\r\n {\r\n fieldType: 'LABEL_TAGS',\r\n fieldProps: {\r\n getLabelTagsProps: (\r\n member: TeamMember\r\n ) => ({\r\n selectedLabels: member.labels || [],\r\n open: labelsOpen === member.user.id,\r\n toggleOpen: () =>\r\n handleToggleLabels(\r\n member.user.id\r\n ),\r\n dataTest: \"member-tags\",\r\n }),\r\n className: classes.labelsCellStyle,\r\n },\r\n },\r\n {\r\n fieldType: 'LIST_ACTIONS',\r\n fieldProps: {\r\n getListActionsComponent: (\r\n member: TeamMember\r\n ) => (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'teamMembers',\r\n scope: 'assignLabels',\r\n }}\r\n >\r\n <ListActions\r\n member={member}\r\n viewProfileHandler={() =>\r\n viewProfileHandler(\r\n member\r\n )\r\n }\r\n onSendNudge={() => {\r\n setShowNudgeDialogMemberId(\r\n member.user.id\r\n );\r\n }}\r\n getMembersReportService={() =>\r\n onSinglePractisExportClicked(\r\n member.user.id\r\n )\r\n }\r\n onDeleteMember={() => {\r\n handleDeleteTeamMembers(\r\n [member.user.id]\r\n );\r\n }}\r\n canRemoveTeamLeader={\r\n canRemoveTeamLeader\r\n }\r\n canNudgeUser={canNudgeUser(\r\n member\r\n )}\r\n isDefaultTeam={\r\n team?.isDefault\r\n }\r\n isHidden={\r\n !!selectedUsers.length\r\n }\r\n successApplyPractisSetsCallback={\r\n refreshHandler\r\n }\r\n />\r\n </WithLabelsContext.Provider>\r\n ),\r\n },\r\n },\r\n ],\r\n },\r\n }}\r\n />\r\n </MainWrapper>\r\n {loading && !isSelectAll && <LoadingComponent />}\r\n </>\r\n );\r\n};\r\n\r\nconst TeamMembersContainer: FC = () => {\r\n const profile = useSelector(getProfileState);\r\n const params: { teamId: string } = useParams();\r\n const {\r\n itemsOnPage,\r\n list,\r\n data: teamData,\r\n loading,\r\n } = useTeamMembersState();\r\n const updatedMembersState = useUpdateMembersState();\r\n const teamUpdateState = useTeamEditState().updatedTeam;\r\n const labels = useLabelsState();\r\n const teamId = params.teamId;\r\n const searchTeamMembers = useSearchTeamMembersService(teamId);\r\n const searchTeamMembersDebounced = useSearchDebounced(searchTeamMembers);\r\n const company = useSelector(getCompanyState);\r\n const getMembersReportService = useGetMembersReportService();\r\n const nudgeUsers = useNudgeUsersService();\r\n const saveGlobalLabelFilters = useSaveUserFiltersService();\r\n const updatedLabels = useUpdatedLabelsState();\r\n const setAssignLabelsAction = useSetAssignLabelsActionService();\r\n const markTeamAsViewedService = useMarkTeamAsViewedService();\r\n const deleteMemberLabel = useDeleteMemberLabelService(teamId);\r\n const searchState = useSelector(getSearchState);\r\n const history = useHistory();\r\n const locationState: any = history.location.state;\r\n\r\n return (\r\n <WithLabelsContext.Provider\r\n value={{\r\n reducerName: 'teamMembers',\r\n }}\r\n >\r\n <WithPractisSetsContext.Provider\r\n value={{\r\n reducerName: 'performance',\r\n }}\r\n >\r\n <TeamMembers\r\n profile={profile}\r\n members={list}\r\n team={teamData}\r\n itemsOnPage={itemsOnPage}\r\n loading={loading}\r\n selectedLabels={labels.selected}\r\n searchHandler={searchTeamMembersDebounced}\r\n company={company}\r\n params={params}\r\n updatedMembers={updatedMembersState.data}\r\n teamUpdateState={teamUpdateState}\r\n getMembersReportService={getMembersReportService}\r\n onNudgeMembers={nudgeUsers}\r\n saveGlobalLabelFilters={saveGlobalLabelFilters}\r\n updatedLabels={updatedLabels}\r\n setAssignLabelsAction={setAssignLabelsAction}\r\n assignedLabels={labels.assignedLabels}\r\n markTeamAsViewed={markTeamAsViewedService}\r\n deleteMemberLabel={deleteMemberLabel}\r\n searchState={searchState}\r\n locationState={locationState}\r\n />\r\n </WithPractisSetsContext.Provider>\r\n </WithLabelsContext.Provider>\r\n );\r\n};\r\n\r\nexport { TeamMembersContainer };\r\n","import { TeamMembersContainer } from './TeamMembers';\n\nexport default TeamMembersContainer;\n","import { useCallback, useEffect } from 'react';\nimport { useLocation, useParams } from 'react-router-dom';\n\nimport {\n onListenEvent,\n onRemoveEvent,\n} from '../../../helpers/functions/Events';\nimport {\n EventNameList,\n REFRESH_TEAM_CONTROLLER,\n} from '../../../helpers/functions/Events/types';\n\nimport { usePreviousData } from '../../../helpers/hooks/usePreviousData';\nimport {\n useGetTeamInfoService,\n useResetTeamInfoService,\n} from '../store/services';\nimport TeamMembers from './TeamMembers';\nimport Progress from './Training/Progress';\n\nfunction TeamsPageController() {\n const location = useLocation();\n\n const { teamId = '' as string } = useParams() as Record<string, unknown>;\n const prevTeamId = usePreviousData(teamId);\n const searchTeam = useGetTeamInfoService();\n const resetTeamInfo = useResetTeamInfoService();\n\n /**\n * @dev -- it should be callback function while it's passed to event listener\n * @function fetchTeamData\n * @return { void }\n */\n const fetchTeamData = useCallback(() => {\n searchTeam(parseInt(teamId as string));\n }, [searchTeam, teamId]);\n\n useEffect(() => {\n if (teamId && prevTeamId !== teamId) {\n fetchTeamData();\n }\n }, [searchTeam, teamId, prevTeamId, fetchTeamData]);\n\n // Listen to ManageTeam Screen Refresh dispatch\n useEffect(() => {\n onListenEvent(EventNameList[REFRESH_TEAM_CONTROLLER], fetchTeamData);\n\n return () => {\n onRemoveEvent(\n EventNameList[REFRESH_TEAM_CONTROLLER],\n fetchTeamData\n );\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n return () => {\n resetTeamInfo();\n };\n }, [resetTeamInfo]);\n\n if (location?.pathname?.includes('members')) {\n return <TeamMembers />;\n }\n\n return <Progress />;\n}\n\nexport default TeamsPageController;\n","import styled from 'styled-components';\n\nexport const Title = styled.div<{\n color?: string;\n}>`\n font-size: 20px;\n font-weight: 800;\n width: 100%;\n color: ${props => (!!props.color ? props.color : 'var(--ps-black-main)')};\n`;\n\nexport const StyledConfirmModalTitle = styled.div<{ marginBottom?: number }>`\n font-size: 20px;\n font-weight: 800;\n letter-spacing: 0.5px;\n color: var(--ps-black-main);\n text-align: left;\n margin-bottom: ${props =>\n !!props.marginBottom ? `${props.marginBottom}px` : '14px'};\n text-align: left;\n font-stretch: normal;\n font-style: normal;\n line-height: 24px;\n letter-spacing: normal;\n`;\n\nexport const StyledConfirmModalDescription = styled.div<{\n marginBottom?: number;\n}>`\n color: var(--ps-grey-1);\n font-size: 13px;\n text-align: left;\n margin-bottom: ${props =>\n !!props.marginBottom ? `${props.marginBottom}px` : '37px'};\n white-space: break-spaces;\n`;\n\nexport const ProgressBarContainer = styled.div`\n margin: 1rem 0 1.5rem 0;\n`;\n\nexport const ActionsContainer = styled.div<{\n justify?: string;\n}>`\n display: flex;\n align-items: center;\n justify-content: ${props => (!!props.justify ? props.justify : 'flex-end')};\n`;\n\nexport const ActionWarningContainer = styled.div`\n display: flex;\n`;\n\nexport const WarningText = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n max-width: 165px;\n margin-left: 10px;\n`;\n\nexport const Description = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n margin: 10px 0 20px 0;\n`;\n","import { useEffect } from 'react';\n\nimport { Button } from '../Button';\nimport DialogWrapper from '../DialogWrapper/DialogWrapper';\nimport { ActionsContainer, Description, Title } from './styles';\nimport { BulkActionStopConfirmationModalViewProps } from './types';\n\nfunction StopBulkActionModalView(\n props: BulkActionStopConfirmationModalViewProps\n) {\n const { modalTitle, dataTest, onStopBulkActionService, onCancel } = props;\n\n\n useEffect(() => {\n return () => {\n onCancel();\n };\n }, [onCancel]);\n \n\n return (\n <DialogWrapper customization={{ width: 402, padding: '35px 40px' }}>\n <Title\n color=\"var(--ps-red-main)\"\n data-test={dataTest && `${dataTest}-stop-title`}\n >\n Stop: {modalTitle}?\n </Title>\n\n <Description data-test={dataTest && `${dataTest}-stop-description`}>\n The operation hasn't been completed yet. If you stop performing\n this operation, some data won't have been processed.\n </Description>\n\n <ActionsContainer>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onCancel}\n variant=\"inverse\"\n color=\"warning-inverse\"\n customColor=\"var(--ps-red-main)\"\n dataTest={dataTest && `${dataTest}-cancel-stop`}\n >\n Cancel\n </Button>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onStopBulkActionService}\n color=\"warning-inverse\"\n customColor=\"var(--ps-red-main)\"\n style={{ marginLeft: '15px' }}\n dataTest={dataTest && `${dataTest}-confirm-stop`}\n >\n Stop\n </Button>\n </ActionsContainer>\n </DialogWrapper>\n );\n}\n\nexport default StopBulkActionModalView;\n","import { Button } from '../Button';\nimport DialogWrapper from '../DialogWrapper/DialogWrapper';\nimport { ActionsContainer, Description, Title } from './styles';\nimport { GeneralBulkActionModalInterface } from './types';\n\nfunction FailedModalView(props: GeneralBulkActionModalInterface) {\n const { modalTitle, dataTest = 'failed-progress-modal', onClose } = props;\n\n return (\n <DialogWrapper\n customization={{ width: 402, padding: '35px 40px' }}\n >\n <Title\n color=\"var(--ps-red-main)\"\n data-test={dataTest && `${dataTest}-title`}\n >\n Failed: {modalTitle}\n </Title>\n\n <Description data-test={dataTest && `${dataTest}-description`}>\n Oops! Something went wrong, please try again or contact our\n support team.\n </Description>\n\n <ActionsContainer>\n <Button\n width=\"128px\"\n height=\"40px\"\n action={onClose}\n color=\"warning-inverse\"\n customColor=\"var(--ps-red-main)\"\n style={{ marginLeft: '15px' }}\n dataTest={dataTest && `${dataTest}-got-it`}\n >\n Got it\n </Button>\n </ActionsContainer>\n </DialogWrapper>\n );\n}\n\nexport default FailedModalView;\n","import { Reducer } from 'redux';\n\nimport { AppState } from '../../../store/reducers';\nimport { initialState, SET_PERCENTAGE } from './constants';\nimport { ChunkServiceActions, ChunkServiceInterface } from './types';\n\nconst chunkServiceReducer: Reducer<\n ChunkServiceInterface,\n ChunkServiceActions\n> = (state = initialState, action): ChunkServiceInterface => {\n switch (action.type) {\n case SET_PERCENTAGE:\n return {\n ...state,\n percentage: action.percentage,\n };\n default:\n return state;\n }\n};\n\nexport const getChunkServiceState = (state: AppState) => state.chunkService;\n\nexport default chunkServiceReducer;\n","import { forwardRef } from 'react';\n\nimport { IconProps } from './types';\n\nexport const StopWarning = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.47.22A.75.75 0 0 1 5 0h6a.75.75 0 0 1 .53.22l4.25 4.25c.141.14.22.331.22.53v6a.75.75 0 0 1-.22.53l-4.25 4.25A.75.75 0 0 1 11 16H5a.75.75 0 0 1-.53-.22L.22 11.53A.75.75 0 0 1 0 11V5a.75.75 0 0 1 .22-.53L4.47.22zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5H5.31zM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\"\n fill=\"#EC513D\"\n />\n </svg>\n );\n }\n);\n\nexport default StopWarning;\n","import { useCallback, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { getChunkServiceState } from '../../../services/ChunkRequestService/store/reducers';\nimport StopWarning from '../../icons/StopWarning';\nimport { Button } from '../Button';\nimport DialogWrapper from '../DialogWrapper/DialogWrapper';\nimport { StripedProgressBar } from '../ProgressBar';\nimport {\n ActionsContainer,\n ActionWarningContainer,\n ProgressBarContainer,\n Title,\n WarningText,\n} from './styles';\nimport { BulkActionProgressModalViewProps } from './types';\n\nfunction ProgressModalView(props: BulkActionProgressModalViewProps) {\n const { modalTitle, dataTest = 'progress-modal', onStopProgressModal, handleClickAwayProgressModal } =\n props;\n\n const { percentage } = useSelector(getChunkServiceState);\n\n /**\n * @function onUnload\n * @param { Event } event\n * @returns { void }\n */\n const onUnload = useCallback(\n (event: Event) => {\n if (percentage > 0 && percentage < 100) {\n event.preventDefault();\n event.returnValue = true;\n }\n },\n [percentage]\n );\n\n useEffect(() => {\n window.addEventListener('beforeunload', onUnload);\n\n return () => {\n window.removeEventListener('beforeunload', onUnload);\n };\n }, [onUnload]);\n\n return (\n <DialogWrapper\n customization={{ width: 400, padding: '30px 32px' }}\n onClickAway={handleClickAwayProgressModal}\n >\n <div onClick={event => event.stopPropagation()}>\n <Title data-test={dataTest && `${dataTest}-title`}>{modalTitle}</Title>\n\n <ProgressBarContainer>\n <StripedProgressBar percentage={percentage} dataTest={dataTest} />\n </ProgressBarContainer>\n\n <ActionsContainer justify=\"space-between\">\n <ActionWarningContainer>\n <span data-test={dataTest && `${dataTest}-warning-icon`}><StopWarning /></span>\n <WarningText data-test={dataTest && `${dataTest}-warning`}>\n Do not refresh or close the page to avoid losing\n data.\n </WarningText>\n </ActionWarningContainer>\n <Button\n width=\"110px\"\n height=\"40px\"\n action={onStopProgressModal}\n disabled={percentage === 100}\n dataTest={dataTest && `${dataTest}-stop`}\n >\n Stop\n </Button>\n </ActionsContainer>\n </div>\n </DialogWrapper>\n );\n}\n\nexport default ProgressModalView;","import { Reducer } from 'redux';\n\nimport { AppState } from '../../../../store/reducers';\nimport { ModalDialogActions } from './actions';\nimport {\n HIDE_MODAL,\n initialState,\n SHOW_MODAL,\n UPDATE_LOADING_STATUS,\n} from './constants';\nimport { ModalDialogInterface } from './types';\n\nconst modalDialogsReducer: Reducer<ModalDialogInterface, ModalDialogActions> = (\n state = initialState,\n action\n): ModalDialogInterface => {\n switch (action.type) {\n case SHOW_MODAL:\n return {\n ...action?.modalOptions,\n };\n case HIDE_MODAL:\n return initialState;\n\n case UPDATE_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading,\n };\n default:\n return state;\n }\n};\n\nexport const getModalDialogsState = (state: AppState) => state.modalDialogs;\n\nexport default modalDialogsReducer;","import { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport Dialog from '../DialogWrapper/DialogWrapper';\nimport { useHideModalDialog } from './store/actions';\nimport { getModalDialogsState } from './store/reducers';\nimport { ConfirmationModalViewProps } from './types';\n\nfunction ConfirmationModalView(props: ConfirmationModalViewProps) {\n const {\n modalTitle,\n description,\n onConfirm,\n cancelButtonText,\n confirmButtonText,\n customization,\n dialogType,\n dataTest = 'confirmation-modal',\n } = props;\n\n const onClose = useHideModalDialog();\n\n const { isLoading } = useSelector(getModalDialogsState);\n\n const handleConfirm = useCallback(() => {\n onConfirm?.();\n\n setTimeout(() => {\n onClose();\n }, 300);\n }, [onClose, onConfirm]);\n\n return (\n <Dialog\n modalTitle={modalTitle}\n description={description}\n cancelButtonText={cancelButtonText}\n confirmButtonText={confirmButtonText}\n onConfirm={handleConfirm}\n isLoading={isLoading}\n onCancel={onClose}\n customization={customization}\n dialogType={dialogType}\n dataTest={dataTest}\n />\n );\n}\n\nexport default ConfirmationModalView;","import { memo, useCallback, useState } from 'react';\n\nimport StopBulkActionModalView from './StopBulkActionModal.view';\nimport FailedModalView from './FailedModal.view';\nimport ProgressModalView from './ProgressModal.view';\n\nimport { getModalDialogsState } from './store/reducers';\nimport { useSelector } from 'react-redux';\nimport {\n BulkActionProgressModalViewProps,\n BulkActionStopConfirmationModalViewProps,\n ConfirmationModalViewProps,\n GeneralBulkActionModalInterface,\n} from './types';\nimport ConfirmationModalView from './ConfirmationModal.view';\n\nfunction ModalDialogsController() {\n const { modalType, modalProps } = useSelector(getModalDialogsState);\n\n const [isStopBulkActionModalOpen, setIsStopBulkActionModalOpen] =\n useState<boolean>(false);\n\n /**\n * @function handleStopProgressModal\n * @returns { void }\n */\n const handleStopProgressModal = (): void => {\n setIsStopBulkActionModalOpen(true);\n };\n\n /**\n * @function handleStopBulkActionServiceModal\n * @returns { void }\n */\n const handleStopBulkActionServiceModal = useCallback(() => {\n Promise.resolve().then(() => {\n (\n modalProps as BulkActionStopConfirmationModalViewProps\n ).onStopBulkActionService();\n setIsStopBulkActionModalOpen(false);\n });\n }, [modalProps]);\n\n /**\n * @function handleCancelClick\n * @returns { void }\n */\n const handleCancelClick = (): void => {\n setIsStopBulkActionModalOpen(false);\n };\n\n /**\n * @function handleClickAwayProgressModal\n * @returns { void }\n */\n const handleClickAwayProgressModal = (): void => {\n let confirmAction = window.confirm(\n 'Are you sure you want to leave this page?'\n );\n\n if (confirmAction) {\n handleStopBulkActionServiceModal();\n }\n };\n\n let modalComponent = <></>;\n\n if (!modalProps) {\n return modalComponent;\n }\n\n switch (modalType) {\n case 'BULK_ACTION_PROGRESS_MODAL':\n {\n const { modalTitle, dataTest, onClose } =\n modalProps as BulkActionProgressModalViewProps;\n modalComponent = (\n <ProgressModalView\n modalTitle={modalTitle}\n dataTest={dataTest}\n onStopProgressModal={handleStopProgressModal}\n handleClickAwayProgressModal={\n handleClickAwayProgressModal\n }\n onClose={onClose}\n />\n );\n }\n break;\n case 'BULK_ACTION_FAILED_MODAL':\n {\n const { modalTitle, onClose, dataTest } =\n modalProps as GeneralBulkActionModalInterface;\n modalComponent = (\n <FailedModalView\n modalTitle={modalTitle}\n dataTest={dataTest}\n onClose={onClose}\n />\n );\n }\n\n break;\n\n case 'CONFIRMATION_MODAL':\n {\n const {\n modalTitle,\n description,\n onConfirm,\n cancelButtonText,\n confirmButtonText,\n dialogType,\n customization,\n dataTest,\n } = modalProps as ConfirmationModalViewProps;\n modalComponent = (\n <ConfirmationModalView\n modalTitle={modalTitle}\n description={description}\n onConfirm={onConfirm}\n confirmButtonText={confirmButtonText}\n cancelButtonText={cancelButtonText}\n dialogType={dialogType}\n customization={customization}\n dataTest={dataTest}\n />\n );\n }\n\n break;\n }\n\n return (\n <>\n {modalComponent}\n {isStopBulkActionModalOpen && (\n <StopBulkActionModalView\n modalTitle={modalProps.modalTitle}\n dataTest={modalProps.dataTest}\n onStopBulkActionService={handleStopBulkActionServiceModal}\n onCancel={handleCancelClick}\n onClose={handleCancelClick}\n />\n )}\n </>\n );\n}\n\nexport default memo(ModalDialogsController);","import { memo } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { useGetSubmissionIdByOldId } from '../../../../api';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { OldSubmissionRouterParams } from './types';\n\nfunction OldSubmissionRouterController({\n id,\n type,\n singleRoute,\n allRoute,\n }: OldSubmissionRouterParams) {\n const getSubmissionIdByOldId = useGetSubmissionIdByOldId();\n const showMessage = useShowMessage();\n const history = useHistory();\n \n getSubmissionIdByOldId(id, type)\n .then(response => {\n history.push(singleRoute.replace(':submissionId', response.id.toString()));\n })\n .catch((error: ErrorResult) => {\n showMessage(error.message, 'error');\n history.push(allRoute);\n });\n\n return <></>;\n}\n\nexport default memo(OldSubmissionRouterController);","import OldSubmissionRouter from './controller';\n\nexport default OldSubmissionRouter;","import { memo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport OldSubmissionRouter from '../components/OldSubmissionRouter';\nimport ROUTES from '../../../routes/routes';\n\nfunction OldAccuracyTestController() {\n const params = useParams<{ submissionId: string }>();\n\n return <OldSubmissionRouter\n id={params.submissionId}\n type=\"scenario\"\n singleRoute={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.SINGLE}\n allRoute={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.ALL}\n />;\n}\n\nexport default memo(OldAccuracyTestController)","import OldAccuracyTest from './controller';\n\nexport default OldAccuracyTest;","import { memo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport OldSubmissionRouter from '../components/OldSubmissionRouter';\nimport ROUTES from '../../../routes/routes';\n\nfunction OldChallengeController() {\n const params = useParams<{ submissionId: string }>();\n\n return <OldSubmissionRouter\n id={params.submissionId}\n type=\"challenge\"\n singleRoute={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.SINGLE}\n allRoute={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL}\n />;\n}\n\nexport default memo(OldChallengeController)","import { ListResult } from \"../../../constants/interfaces/PaginationResult\";\nimport { ReportItem } from \"../../../constants/interfaces/ReportItem\";\n\nexport enum ACTIONS {\n GET_REPORTS_START = 'GET_REPORTS_START',\n GET_REPORTS_SUCCESS = 'GET_REPORTS_SUCCESS',\n GET_REPORTS_FAILURE = 'GET_REPORTS_FAILURE',\n}\n\nexport function getReportsStart() {\n return {\n type: ACTIONS.GET_REPORTS_START as ACTIONS.GET_REPORTS_START,\n };\n}\n\nexport function getReportsSuccess(data: ListResult<ReportItem>) {\n return {\n type: ACTIONS.GET_REPORTS_SUCCESS as ACTIONS.GET_REPORTS_SUCCESS,\n data\n };\n}\n\nexport function getReportsFailure(error: string) {\n return {\n type: ACTIONS.GET_REPORTS_FAILURE as ACTIONS.GET_REPORTS_FAILURE,\n error\n };\n}","import OldChallenge from './controller';\n\nexport default OldChallenge;","import { useDispatch } from 'react-redux'\nimport { useCallback } from 'react';\nimport { useGetReportsApi } from '../../../api/reports';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { ReportItem } from '../../../constants/interfaces/ReportItem';\nimport {\n getReportsStart,\n getReportsSuccess,\n getReportsFailure,\n} from './actions';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\n\n/**\n * @function useGetReportsService\n * @returns { CallableFunction }\n */\nexport const useGetReportsService = () => {\n const dispatch = useDispatch();\n const getReportsApi = useGetReportsApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback(() => {\n dispatch(getReportsStart());\n return getReportsApi()\n .then((data: ListResult<ReportItem>) => {\n dispatch(getReportsSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(getReportsFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getReportsApi, showMessage]);\n}","export interface ReportItem {\n id: number;\n type: ReportType;\n}\n\nexport enum ReportType {\n PRACTIS_SET_SUMMARY = 'practis_set_summary',\n USERS_ACTIVITY = 'users_activity',\n TEAM_LEADER_ACTIVITY = 'team_leader_activity',\n BILLING = 'billing',\n TRAINING_TIME = 'training_time',\n}","import { useCallback } from 'react';\nimport { useHttp } from '../../tools/http/Http';\nimport {\n GenerateReportApiParams,\n GetReportAvailabilityApiParams,\n GetReportsApiParams\n} from './types';\n\n/**\n * @function useGetReports\n * @returns { GetReportsApiParams }\n */\nexport function useGetReportsApi(): GetReportsApiParams {\n const http = useHttp();\n return useCallback(\n () => http.get('/reports', undefined, undefined, true),\n [http]\n );\n}\n\n/**\n * @function useGenerateReportApi\n * @returns { GetReportsApiParams }\n */\nexport function useGenerateReportApi(): GenerateReportApiParams {\n const http = useHttp();\n return useCallback(\n (reportType, reportData) =>\n http.post(`/reports/${reportType}/request`, reportData, true),\n [http]\n );\n}\n\n/**\n * @function useGenerateReportApi\n * @returns { GetReportsApiParams }\n */\nexport function useGetReportAvailabilityApi(): GetReportAvailabilityApiParams {\n const http = useHttp();\n return useCallback(\n (reportType, reportData) =>\n http.post(`/reports/${reportType}/request/availability`, reportData, true),\n [http]\n );\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { ListResult } from '../../../constants/interfaces/PaginationResult';\nimport { ReportItem } from '../../../constants/interfaces/ReportItem';\n\nexport interface ReportsState {\n data?: ListResult<ReportItem>;\n isLoading: boolean;\n error?: string;\n}\n\nexport type ReportsStateSelector = (state: any) => ReportsState;\n\nexport const ReportsStateSelectorContext = React.createContext<ReportsStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useReportsState(): ReportsState {\n return useSelector(useContext(ReportsStateSelectorContext));\n}\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PractisSetSummary = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fill=\"#4AA9E2\" d=\"M.833 5h38.333v4.167H.833z\"/>\n <path d=\"M33.473 35.33H6.526a3.482 3.482 0 0 1-3.482-3.483V9.721h33.911v22.126a3.482 3.482 0 0 1-3.482 3.482z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"m13.333 10 2.34 2.631a3.334 3.334 0 0 0 2.49 1.119h4.09c.952 0 1.859-.407 2.491-1.119L27.084 10\" stroke=\"#222431\" stroke-width=\"1.567\"/>\n <path d=\"M39.219 4.67H.78v5.051H39.22v-5.05zM10 29.167h1.5M10 20h1.5M10 24.167h1.5M15 29.166h6.5M15 20h10M15 24.166h15\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n );\n }\n);\n\nexport default PractisSetSummary;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TeamLeaderSummary = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path d=\"M3.323 14.563v16.873h33.354V14.583\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"m19.159 10.402-7.247 8.218-7.046-4.562M35.148 14.05l-7.06 4.57-7.24-8.21\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <mask id=\"uup75c9s0a\" mask-type=\"luminance\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"40\" height=\"40\">\n <path d=\"M0 0h40v40H0V0z\" fill=\"#fff\"/>\n </mask>\n <g mask=\"url(#uup75c9s0a)\">\n <path d=\"M38.483 36.127H1.517v-4.69h36.966v4.69zM23.258 7.16c0 1.815-1.459 3.287-3.258 3.287-1.8 0-3.258-1.472-3.258-3.287 0-1.816 1.459-3.287 3.258-3.287 1.8 0 3.258 1.471 3.258 3.287zM39.219 11.912c0 1.416-1.138 2.565-2.542 2.565s-2.542-1.149-2.542-2.565 1.138-2.564 2.542-2.564 2.542 1.148 2.542 2.564zM5.865 11.912c0 1.416-1.138 2.565-2.542 2.565S.78 13.328.78 11.912 1.92 9.348 3.323 9.348s2.542 1.148 2.542 2.564z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M32.188 25.395a2.194 2.194 0 1 1-4.389 0 2.194 2.194 0 0 1 4.389 0zM24.131 23.7a4.131 4.131 0 1 1-8.262 0 4.131 4.131 0 0 1 8.262 0zM12.2 25.395a2.194 2.194 0 1 1-4.388 0 2.194 2.194 0 0 1 4.389 0z\" fill=\"#4AA9E2\"/>\n </g>\n </svg>\n );\n }\n);\n\nexport default TeamLeaderSummary;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const UserActivity = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#1ox9uh36ua)\">\n <path d=\"M32.917 23.75 35 21.667l2.5 1.25 2.5 3.75v5h-9.167v-5l2.084-2.917zM12.917 10.833h3.75l2.083 1.25 1.667 4.584V22.5h-7.5l1.25-5.417-1.667-3.75.417-2.5zM13.333 30.833 15 29.583l2.083-.833L20 34.583v4.584h-8.75l.417-5 .416-2.084 1.25-1.25z\" fill=\"#4AA9E2\"/>\n <path d=\"M25 6.12v-.705C25 2.89 22.757.833 20 .833s-5 2.056-5 4.582v.706c0 1.632.937 3.067 2.344 3.879h5.312C24.063 9.188 25 7.753 25 6.12zM20 14.9v5.542M23.9 22.86a4.685 4.685 0 0 1 2.768-.899h7.844c2.6 0 4.707 2.107 4.707 4.707v4.707H27.43M12.569 31.375H.781v-4.707c0-2.6 2.107-4.707 4.707-4.707h7.844c1.035 0 1.991.334 2.768.9M23.53 10.194 20 14.901l-3.53-4.707h7.06z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M30.59 21.961a4.314 4.314 0 0 1-4.315-4.314v-.785a4.314 4.314 0 0 1 8.63 0v.785a4.314 4.314 0 0 1-4.315 4.314z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"m34.12 21.961-3.53 4.707-3.53-4.707h7.06zM30.59 26.668v4.706M9.41 21.961a4.314 4.314 0 0 1-4.314-4.314v-.785a4.314 4.314 0 0 1 8.628 0v.785A4.314 4.314 0 0 1 9.41 21.96zM12.94 21.961l-3.53 4.707-3.53-4.707h7.06zM9.41 26.668v4.706\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.689 13.198a4.708 4.708 0 0 1 4.389-3.004h7.844a4.708 4.708 0 0 1 4.389 3.004\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M25.096 25.491v-.785A5.102 5.102 0 0 0 20 19.611a5.102 5.102 0 0 0-5.096 5.095v.785c0 1.816.956 3.412 2.39 4.314h5.412a5.095 5.095 0 0 0 2.39-4.314z\" fill=\"#fff\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M23.53 29.805 20 34.512l-3.53-4.707h7.06zM20 34.512v4.707\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M23.922 29.805c2.6 0 4.707 2.108 4.707 4.707v4.707H11.37v-4.707c0-2.6 2.107-4.707 4.707-4.707h7.844z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"1ox9uh36ua\">\n <path fill=\"#fff\" d=\"M0 0h40v40H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default UserActivity;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const BillingReport = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5.781 17.781h3.438v3.438H5.781z\"/>\n <path stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5.781 17.781h3.438v3.438H5.781zM5.781 24.781h3.438v3.438H5.781zM12.781 24.781h3.438v3.438h-3.438zM5.781 31.781h3.438v3.438H5.781zM12.781 31.781h3.438v3.438h-3.438zM19.781 24.781h3.438v10.438h-3.438zM12.781 17.781h3.438v3.438h-3.438zM19.781 17.781h3.438v3.438h-3.438z\"/>\n <rect x=\"2.781\" y=\"5.781\" width=\"23.438\" height=\"33.438\" rx=\"1.219\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 6.343V5a4 4 0 0 1 4-4h18.5a4 4 0 0 1 4 4v30h1.643A4.857 4.857 0 0 0 38 30.143h-6.5M27 35h4\" stroke=\"#222431\" stroke-width=\"1.56\"/>\n <path d=\"M24 6V5a4 4 0 0 1 4-4\" stroke=\"#222431\" stroke-width=\"1.56\"/>\n <path fill=\"#4AA9E2\" d=\"M5 8h19v7H5z\"/>\n </svg>\n );\n }\n);\n\nexport default BillingReport;","export const DATE_RANGE_PARAM_NAME = 'dateRange';","import dayjs from \"dayjs\";\nimport { DATE_RANGE_PARAM_NAME } from \"../../features/filters/dynamic-filter/date-filter/constants\";\nimport ROUTES from \"../../routes/routes\"\n\nconst getLastWeekDateRangeParam = () =>\n new URLSearchParams({[DATE_RANGE_PARAM_NAME]: `${dayjs(new Date().getTime() - 604800000).format('YYYY-MM-DD')},${dayjs(new Date()).format('YYYY-MM-DD')}`});\n\nexport const getTeamLeaderReportUrl = () => ROUTES.REPORTS.TEAM_LEADER_ACTIVITY_REPORT + `?${getLastWeekDateRangeParam()}`;\n\nexport const getTrainingTimeReportUrl = () => ROUTES.REPORTS.TRAINING_TIME_REPORT + `?${getLastWeekDateRangeParam()}`;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const TrainingTime = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 40 40\"\n className={className}\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#bur0pzbema)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.266 14.897h34.267V7.283H23.767v1.332c0 1.026-.856 1.866-1.903 1.866h-7.615c-1.047 0-1.904-.84-1.904-1.866V7.282H1.266v7.615z\" fill=\"#4AA9E2\"/>\n <path clip-rule=\"evenodd\" d=\"M31.615 23c4.188 0 7.615 3.427 7.615 7.615 0 4.188-3.427 7.615-7.615 7.615h0c-4.188 0-7.615-3.427-7.615-7.615C24 26.427 27.427 23 31.615 23z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M25.5 35.5H1.266V7.282h10.698m12.184 0h11.384V24M35.423 30.615h-3.808v-3.807\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path clip-rule=\"evenodd\" d=\"M12.345 6.747h1.906c-.084-2.118 1.64-3.882 3.805-3.882 2.164 0 3.89 1.764 3.804 3.882h1.907v1.867c0 1.026-.857 1.866-1.904 1.866H14.25c-1.048 0-1.904-.84-1.904-1.866V6.747z\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M18.056 6.748h.002M8.88 26.32H5.073m0 3.806H8.88m3.808 0h3.807m3.807 0H24m1-3.807h-4.698m-3.807 0h-3.807M8.88 18.704H5.073m0 3.808H8.88m3.807 0h3.808m3.807 0h3.808m7.614-3.808h-3.807m-3.807 0h-3.808m-3.807 0h-3.807\" stroke=\"#222431\" stroke-width=\"1.563\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"bur0pzbema\">\n <path fill=\"#fff\" d=\"M0 0h40v40H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default TrainingTime;","import React from 'react'\nimport { range } from 'lodash';\nimport { ReportType } from '../../constants/interfaces/ReportItem';\nimport { ReportingCardProps } from '../../ui/components/ReportingCard/types';\nimport PractisSetSummary from '../../ui/icons/PractisSetSummary';\nimport TeamLeaderSummary from '../../ui/icons/TeamLeaderSummary';\nimport UserActivity from '../../ui/icons/UserActivity';\nimport ROUTES from '../../routes/routes';\nimport BillingReport from '../../ui/icons/BillingReport';\nimport { getTeamLeaderReportUrl, getTrainingTimeReportUrl } from './helpers';\nimport TrainingTime from '../../ui/icons/TrainingTime';\n\nexport const LOADING_ITEMS_COUNT = 3;\nexport const LOADING_ITEMS = range(0, LOADING_ITEMS_COUNT);\n\nexport const ReportInfoMap: Record<ReportType, ReportingCardProps> = {\n [ReportType.PRACTIS_SET_SUMMARY]: {\n url: ROUTES.REPORTS.PRACTIS_SET_SUMMARY_REPORT,\n icon: React.createElement(PractisSetSummary),\n title: 'Practis Set Summary',\n description: 'Shows more information about a particular practis set.',\n resultFormat: 'Excel'\n },\n [ReportType.USERS_ACTIVITY]: {\n url: ROUTES.REPORTS.USER_ACTIVITY_REPORT,\n icon: React.createElement(UserActivity),\n title: 'User Activity',\n description: 'Understand your team(s) progress on all their Practis Sets.',\n resultFormat: 'Excel'\n },\n [ReportType.TEAM_LEADER_ACTIVITY]: {\n url: getTeamLeaderReportUrl(),\n icon: React.createElement(TeamLeaderSummary),\n title: 'Team Leader Engagement',\n description: 'How engaged are Team Leaders in their learner\\'s training.',\n resultFormat: 'Excel'\n },\n [ReportType.BILLING]: {\n url: ROUTES.REPORTS.BILLING_REPORT,\n icon: React.createElement(BillingReport),\n title: 'Billing Report',\n description: 'Generate a list of monthly active users on the platform.',\n resultFormat: 'Excel'\n },\n [ReportType.TRAINING_TIME]: {\n url: getTrainingTimeReportUrl(),\n icon: React.createElement(TrainingTime),\n title: 'Training Time Report',\n description: 'Tracking overall training time by learners by date range.',\n resultFormat: 'Excel'\n },\n}","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding-top: 25px;\n max-width: 1450px;\n`;\n\nexport const Item = styled.div`\n display: inline-block;\n padding-right: 8px;\n padding-bottom: 8px;\n`","import styled from 'styled-components';\nimport { NavLink } from 'react-router-dom';\n\nexport const Link = styled(NavLink)`\n display: inline-block;\n width: 280px;\n height: 184px;\n padding: 24px 16px;\n border-radius: 4px;\n border: solid 1px var(--ps-grey-4);\n background-color: var(--ps-white-1);\n text-decoration: none;\n\n &:hover {\n box-shadow: 0 4px 24px 0 var(--ps-grey-20);\n }\n`;\n\nexport const Title = styled.div`\n font-size: 15px;\n font-weight: 800;\n line-height: 20px;\n padding-top: 6px;\n color: var(--ps-black);\n`;\n\nexport const Description = styled.div`\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-black-main);\n`;\n\nexport const ResultFormat = styled.div`\n font-size: 11px;\n font-weight: 600;\n color: var(--ps-black-main);\n padding: 2px 8px;\n border-radius: 2px;\n background-color: var(--ps-grey-3);\n display: inline-block;\n margin-top: 8px;\n`;","import { kebabCase } from 'lodash';\nimport {\n Link,\n Title,\n Description,\n ResultFormat,\n} from './styles';\nimport { ReportingCardProps } from './types';\n\nfunction ReportingCardView({\n url,\n icon,\n title,\n description,\n resultFormat\n}: ReportingCardProps) {\n const dataTest = kebabCase(title);\n return <Link to={url} data-test={`${dataTest}-link`}>\n <span data-test={`${dataTest}-icon`}>{icon}</span>\n <Title data-test={`${dataTest}-title`}>{title}</Title>\n <Description data-test={`${dataTest}-description`}>{description}</Description>\n <ResultFormat data-test={`${dataTest}-excel`}>{resultFormat}</ResultFormat>\n </Link>\n}\n\nexport default ReportingCardView;","import ReportingCard from './view';\n\nexport default ReportingCard;","import styled from 'styled-components';\n\nexport const CardContainer = styled.div`\n width: 280px;\n height: 184px;\n padding: 24px 16px;\n border-radius: 4px;\n border: solid 1px var(--ps-grey-4);\n background-color: var(--ps-white-1);\n`;\n\nexport const Icon = styled.div<{size: number}>`\n width: ${props => props.size}px;\n height: ${props => props.size}px;\n border-radius: ${props => props.size / 2}px;\n background-color: var(--ps-grey-4);\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0% {\n opacity: 0.2;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 0.2;\n }\n }\n`;\n\nexport const CardIcon = styled(Icon)`\n margin-bottom: 20px;\n`;\n\nexport const SingleTextLine = styled.div<{ width: number, height?: number }>`\n width: ${props => props.width}px;\n height: ${props => props.height ?? 8}px;\n background-color: var(--ps-grey-4);\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0% {\n opacity: 0.2;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 0.2;\n }\n }\n`;\n\nexport const RoundSkeleton = styled(SingleTextLine)`\n border-radius: 50%\n`;\n\n\nexport const TextLine = styled(SingleTextLine)`\n margin-bottom: 10px;\n`;\n\nexport const ResultFormat = styled.div`\n width: 44px;\n height: 20px;\n border-radius: 2px;\n background-color: var(--ps-grey-4);\n display: inline-block;\n margin-top: 2px;\n\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0% {\n opacity: 0.2;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 0.2;\n }\n }\n`;","import { CardContainer, CardIcon, TextLine, ResultFormat } from './styles';\n\nfunction ReportingCardSkeletonView() {\n return (\n <CardContainer>\n <CardIcon size={40} />\n <TextLine width={164} />\n <TextLine width={232} />\n <TextLine width={103} />\n <ResultFormat />\n </CardContainer>\n );\n}\n\nexport default ReportingCardSkeletonView;","import { TextLine } from './styles';\n\nfunction FilterSkeletonView() {\n return (\n <>\n <TextLine width={81} />\n <TextLine width={149} />\n <TextLine width={120} />\n </>\n );\n}\n\nexport default FilterSkeletonView;","import MainWrapper from '../../ui/wrapper/MainWrapper/MainWrapper';\nimport { LOADING_ITEMS, ReportInfoMap } from './constants';\nimport { ReportsViewProps } from './types';\nimport { Container, Item } from './styles';\nimport ReportingCard from '../../ui/components/ReportingCard';\nimport { ReportingCardSkeleton } from '../../ui/components/Skeleton';\n\nfunction ReportsView({ isLoading, data }: ReportsViewProps) {\n return (\n <MainWrapper subTitle=\"Reports\" contentSize={false} dataTest=\"reports\" htmlPageTitle=\"Reports - Practis\">\n <Container>\n {isLoading &&\n LOADING_ITEMS.map(() => (\n <Item>\n <ReportingCardSkeleton />\n </Item>\n ))}\n {!isLoading &&\n data &&\n data.items.map(report => (\n <Item>\n <ReportingCard {...ReportInfoMap[report.type]} />\n </Item>\n ))}\n </Container>\n </MainWrapper>\n );\n}\n\nexport default ReportsView;","import { useEffect } from 'react';\nimport { useGetReportsService } from './store/services';\nimport { useReportsState } from './store/states';\nimport ReportsView from './view';\n\nfunction ReportsController() {\n const getReports = useGetReportsService();\n const reportsState = useReportsState();\n\n useEffect(() => {\n getReports();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return <ReportsView\n isLoading={reportsState.isLoading}\n data={reportsState.data}\n />\n}\n\nexport default ReportsController;","import { ListResult } from \"../../../../constants/interfaces/PaginationResult\";\nimport { Roleplay } from \"../../../../constants/interfaces/Roleplay\";\n\nexport enum ACTIONS {\n GET_ROLEPLAYS_START = 'GET_ROLEPLAYS_START',\n GET_ROLEPLAYS_SUCCESS = 'GET_ROLEPLAYS_SUCCESS',\n GET_ROLEPLAYS_FAILURE = 'GET_ROLEPLAYS_FAILURE',\n}\n\nexport function getRoleplaysStart() {\n return {\n type: ACTIONS.GET_ROLEPLAYS_START as ACTIONS.GET_ROLEPLAYS_START,\n };\n}\n\nexport function getRoleplaysSuccess(data: ListResult<Roleplay>) {\n return {\n type: ACTIONS.GET_ROLEPLAYS_SUCCESS as ACTIONS.GET_ROLEPLAYS_SUCCESS,\n data\n };\n}\n\nexport function getRoleplaysFailure(error: string) {\n return {\n type: ACTIONS.GET_ROLEPLAYS_FAILURE as ACTIONS.GET_ROLEPLAYS_FAILURE,\n error\n };\n}","import Reports from './controller';\n\nexport default Reports;","import styled from 'styled-components';\n\nexport const FieldContainer = styled.div`\n height: 78px;\n\n .company-select {\n width: 400px;\n border: solid 1px var(--ps-grey-3);\n\n &.company-select-open {\n border: solid 1px var(--ps-grey-2);\n }\n\n .company-select-input > div {\n color: var(--ps-black-main);\n }\n\n .company-select-input > div[disabled] {\n color: var(--ps-grey-2);\n }\n\n .content-area {\n padding: 8px 0;\n\n > div {\n padding: 5px 12px;\n border-radius: 0;\n margin-bottom: 0;\n min-height: auto;\n font-weight: 400;\n\n &.selected-item {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n\n &:hover {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n }\n }\n }\n\n .company-select-label {\n left: 12px;\n }\n\n .company-select-arrow {\n right: 12px;\n }\n\n .company-select-input {\n padding: 0 12px;\n }\n`;\n\nexport const FieldName = styled.div`\n font-size: 13px;\n font-weight: 800;\n color: var(--ps-black-main);\n padding-bottom: 4px;\n display: flex;\n flex-direction: row;\n`;\n\nexport const AdvancedSettingsHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-top: 2px;\n margin-bottom: 8px;\n`;\n\nexport const AdvancedSettingsTitle = styled.div`\n font-size: 12px;\n font-weight: bold;\n color: var(--ps-grey-1);\n`;\n\nexport const ResetButton = styled.div<{ isActive: boolean }>`\n font-size: 13px;\n color: ${props => props.isActive ? 'var(--ps-blue-main)' : 'var(--ps-grey-2)' };\n cursor: ${props => props.isActive ? 'pointer' : 'default' };\n`;\n\nexport const AdvancedFieldContainer = styled.div`\n height: 68px;\n\n .input-range__label--min,\n .input-range__label--max {\n font-size: 12px;\n font-weight: bold;\n color: var(--ps-grey-1);\n bottom: -0.9rem;\n }\n\n .input-range__track {\n height: 2px;\n }\n\n .input-range__slider {\n background: var(--ps-blue-main) !important;\n width: 12px;\n height: 12px;\n margin-top: -7px;\n }\n\n .input-range--disabled .input-range__slider {\n background: var(--ps-grey-2) !important;\n }\n`;\n\nexport const QuestionContainer = styled.div`\n margin-left: 3px;\n cursor: pointer;\n display: inline-block;\n vertical-align: middle;\n`;\n\nexport const TooltipContainer = styled.div`\n padding: 4px;\n`\n\nexport const TootlipTitle = styled.div`\n padding-top: 16px;\n font-size: 13px;\n font-weight: 800;\n color: var(--ps-black-main);\n\n &:first-child {\n padding-top: 0;\n }\n`;\n\nexport const TootlipContent = styled.div`\n padding-top: 4px;\n font-size: 13px;\n color: var(--ps-black-main);\n`;\n\nexport const SampleTextContainer = styled.div`\n margin-top: 8px;\n`;","export const ITEMS_PER_PAGE = 20;\n\nexport const initialSearchParams = {\n searchTerm: '',\n orderBy: null,\n limit: ITEMS_PER_PAGE,\n numberOfPages: 0,\n offset: 0,\n};\n\n","import styled from 'styled-components';\n\nexport const Subheader = styled.div`\n display: flex;\n font-size: 13px;\n`;\n\nexport const Container = styled.div`\n display: flex;\n justify-content: start;\n flex-wrap: wrap;\n margin-top: 10px;\n`;\n\nexport const Title = styled.div`\n font-size: 15px;\n font-weight: 800;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.33;\n letter-spacing: normal;\n text-align: left;\n color: var(--black-1);\n display: -webkit-box;\n max-width: 400px;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nexport const RoleplayCard = styled.div<{isDotMenuVisible: boolean}>`\n width: 290px;\n height: 120px;\n margin-right: 8px;\n margin-top: 8px;\n padding: 16px;\n padding-right: 12px;\n border-radius: 4px;\n border: solid 1px var(--ps-grey-4);\n background-color: var(--ps-white-1);\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n cursor: pointer;\n\n .dot-container {\n visibility: hidden;\n\n .dot-icon-container {\n svg {\n min-width: 16px !important;\n height: 16px;\n }\n\n width: 11px;\n height: 24px;\n }\n }\n \n :hover {\n box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.12);\n\n .dot-container {\n visibility: ${props => props.isDotMenuVisible ? 'visible' : 'hidden'};\n }\n }\n`;\n\nexport const Footer = styled.div`\n display: flex;\n justify-content: space-between\n`;\n\nexport const SelectionTitle = styled.div`\n font-weight: 700;\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-black-main);\n padding-bottom: 8px;\n`;\n\nexport const SingleTextLine = styled.div<{ width: number }>`\n width: ${props => props.width}px;\n height: 8px;\n background-color: var(--ps-grey-4);\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0% {\n opacity: 0.2;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 0.2;\n }\n }\n`;\n\nexport const SkeletonContainer = styled.div`\n display: flex;\n`;\n\nexport const SelectionTitleSkeleton = styled(SingleTextLine)`\n margin-top: 6px;\n margin-bottom: 12px;\n`;\n\nexport const NoRoleplayLink = styled.div`\n display: flex;\n margin-top: 12px;\n flex-direction: column;\n margin-left: 15px;\n align-items: center;\n`;\n\nexport const Text = styled.div`\nfont-size: 15px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.33;\n margin-top: 17px;\n`;\n\nexport const OwnerName = styled.div`\n max-width: 93px;\n overflow-x: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`;\n\nexport const DotsIconContainer = styled.div<{ disabled: boolean }>`\n height: 100%;\n padding: 0 6px 0 4px;\n width: 22px;\n cursor: pointer;\n color: ${props =>\n props.disabled ? 'var(--ps-grey-1)' : 'var(--ps-white-1)'};\n &:hover {\n color: ${props =>\n props.disabled ? 'var(--ps-grey-1)' : 'var(--ps-white-1)'};\n }\n visibility: hidden;\n`;\n\nexport const NameContainer = styled.div`\nfont-size: 11px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.45;\n letter-spacing: normal;\n text-align: left;\n color: var(--ps-grey-1);\n display: flex;\n padding-top: 5px;\n padding-bottom: 5px;\n\n`;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SidebarRoleplaysLarge = forwardRef<SVGSVGElement, IconProps>(\n ({ className, dataTest}, ref) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"57\" height=\"56\" viewBox=\"0 0 57 56\" fill=\"none\" data-test={dataTest}>\n <g clip-path=\"url(#kifedtetla)\">\n <mask id=\"aiohq7s5hb\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"-1\" width=\"57\" height=\"57\">\n <path d=\"M.5-.002h56v56H.5v-56z\" fill=\"#fff\"/>\n </mask>\n <g mask=\"url(#aiohq7s5hb)\" stroke=\"#B1C0CB\" stroke-width=\"3.379\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M2.14 9.792v28.382l9.02-6.435a6.078 6.078 0 0 1 3.53-1.13h19.84c2.59 0 4.692-2.1 4.692-4.692V5.099H6.833a4.692 4.692 0 0 0-4.692 4.693z\"/>\n <path d=\"M45.785 17.823h4.383a4.693 4.693 0 0 1 4.692 4.694v28.381l-9.02-6.434a6.078 6.078 0 0 0-3.53-1.13H22.47a4.693 4.693 0 0 1-4.692-4.693v-1.47M31.252 14.037H12.297M31.252 21.693H12.297\"/>\n </g>\n </g>\n <defs>\n <clipPath id=\"kifedtetla\">\n <path fill=\"#fff\" transform=\"translate(.5)\" d=\"M0 0h56v56H0z\"/>\n </clipPath>\n </defs>\n </svg>)\n }\n);\n\nexport default SidebarRoleplaysLarge;\n","import { useDispatch } from 'react-redux'\nimport { useCallback } from 'react';\nimport { useGetRoleplaysApi } from '../../../../api/roleplay';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { Roleplay } from '../../../../constants/interfaces/Roleplay';\nimport {\n getRoleplaysStart,\n getRoleplaysSuccess,\n getRoleplaysFailure,\n} from './actions';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\n\n/**\n * @function useGetRoleplaysService\n * @returns { CallableFunction }\n */\nexport const useGetRoleplaysService = () => {\n const dispatch = useDispatch();\n const getRoleplaysApi = useGetRoleplaysApi();\n const showMessage = useShowMessage();\n\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback((searchParams) => {\n dispatch(getRoleplaysStart());\n const sp = {\n offset: searchParams.offset,\n limit: searchParams.limit,\n query: searchParams.searchTerm,\n companyId: searchParams.companyId\n }\n return getRoleplaysApi(sp)\n .then((data: ListResult<Roleplay>) => { \n dispatch(getRoleplaysSuccess(data));\n })\n .catch((error: ErrorResult) => {\n dispatch(getRoleplaysFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getRoleplaysApi, showMessage]);\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { ListResult } from '../../../../constants/interfaces/PaginationResult';\nimport { Roleplay } from '../../../../constants/interfaces/Roleplay';\n\nexport interface RoleplaysState {\n data?: ListResult<Roleplay>;\n isLoading: boolean;\n error?: string;\n}\n\nexport type RoleplaysStateSelector = (state: any) => RoleplaysState;\n\nexport const RoleplaysStateSelectorContext = React.createContext<RoleplaysStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useRoleplaysState(): RoleplaysState {\n return useSelector(useContext(RoleplaysStateSelectorContext));\n}\n","import styled from 'styled-components';\nimport { SingleTextLine } from '../../../../ui/components/Skeleton/styles';\n\nexport const Container = styled.div`\n margin-right: 8px;\n margin-top: 7px;\n border: 1px solid var(--ps-grey-4);\n border-radius: 4px;\n padding: 20px 12px;\n`;\n\nexport const BodySkeletonContainer = styled.div`\n padding: 0px 20px;\n margin-bottom: 32px;\n`;\n\nexport const RoleplayContainer = styled.div`\n padding: 0px;\n`;\n\nexport const RoleplaySkeletonContainer = styled(Container)`\n padding: 24px 31px 20px 16px;\n`\n\n\nexport const LineSkeleton = styled(SingleTextLine)<{marginTop?: string}>`\n margin-top: ${props => props.marginTop ?? '11px'};\n margin-right: 8px;\n\n &:first-child {\n margin-top: 0;\n }\n`;\n\nexport const HeaderSkeletonContainer = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 17px;\n`;\n\nexport const LineContainer = styled.div`\n display: flex;\n`;","import { RoleplaySkeletonContainer, LineSkeleton, RoleplayContainer } from \"./styles\";\nconst bodyLineWidths = [\n {\n lineWidths: [232,164,123]\n },\n {\n lineWidths: [232,164,123]\n },\n {\n lineWidths: [232,164,123]\n }\n];\n\nfunction RoleplaySceleton() {\n return <>{bodyLineWidths.map(({lineWidths}, index) => {\n return <RoleplayContainer key={index} data-test=\"roleplay-content-skeleton\">\n <RoleplaySkeletonContainer>\n {\n lineWidths.map((width, index) => <LineSkeleton width={width} height={8} key={index} marginTop={index === lineWidths.length - 1 ? \"40px\" : undefined} data-test=\"roleplay-content-skeleton-line\"/>)\n }\n </RoleplaySkeletonContainer>\n </RoleplayContainer>\n })}</>\n}\n\nexport default RoleplaySceleton;","// src/hooks/useGoogleAnalyticsEvents.ts\n\nimport { useEffect } from 'react';\n\nexport interface AnalyticsInformation {\n UserID?: string;\n UserName?: string;\n Email?: string;\n CompanyID?: number;\n CompanyName?: string;\n Environment?: string;\n CharacterLimit?: number;\n}\n\nexport interface EventOptions {\n category: string;\n action: string;\n label?: string;\n value?: number;\n userInformation?: AnalyticsInformation;\n}\n\n\nconst useGoogleAnalyticsEvents = () => {\n if (window && window.gtag) { \n window.gtag('config', 'G-QB6SGQF7VJ', { 'allow_enhanced_measurement': false }); \n }\n\n const sendEvent = ({ category, action, value, userInformation }: EventOptions) => {\n const eventPayload = {\n event_category: category,\n value: value,\n ...userInformation,\n };\n\n if (window && window.gtag) {\n window.gtag('event', action, eventPayload);\n }\n };\n\n useEffect(() => {\n if (typeof window.gtag !== 'function') {\n console.error(\"Google Analytics 'gtag' function not found. Make sure Google Analytics is properly set up.\");\n }\n }, []);\n\n return sendEvent;\n};\n\nexport default useGoogleAnalyticsEvents;\n","import useGoogleAnalyticsEvents, { EventOptions, AnalyticsInformation } from '../../../services/GoogleAnalytics';\nimport { useCallback } from 'react';\nimport { getProfileState } from '../../UserProfile/store/reducers';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from '../../CompanySettings/store/reducers';\n\n// export const EventObjects = {\n// ROLEPLAYS_SCREEN_OPEN: 'roleplays_screen_open',\n// ROLEPLAYS_SCREEN_DUPLICATE: 'roleplays_screen_duplicate',\n// ROLEPLAYS_SCREEN_DELETE: 'roleplays_screen_delete',\n// ROLEPLAYS_SCREEN_SEARCH: 'roleplays_screen_search',\n// ROLEPLAYS_SCREEN_HINT: 'roleplays_screen_hint',\n// ROLEPLAYS_SCREEN_NEW: 'roleplays_screen_new',\n// CONTEXT_WIZARD_SCREEN_OPEN: 'context_wizard_screen_open',\n// CONTEXT_WIZARD_SCREEN_SITUATION_FILLED: 'context_wizard_screen_situation_filled',\n// CONTEXT_WIZARD_SCREEN_SITUATION_HINT: 'context_wizard_screen_situation_hint',\n// CONTEXT_WIZARD_SCREEN_CUSTOMER_FILLED: 'context_wizard_screen_customer_filled',\n// CONTEXT_WIZARD_SCREEN_CUSTOMER_HINT: 'context_wizard_screen_customer_hint',\n// CONTEXT_WIZARD_SCREEN_PRODUCT_FILLED: 'context_wizard_screen_product_filled',\n// CONTEXT_WIZARD_SCREEN_PRODUCT_HINT: 'context_wizard_screen_product_hint',\n// CONTEXT_WIZARD_SCREEN_GOAL_FILLED: 'context_wizard_screen_goal_filled',\n// CONTEXT_WIZARD_SCREEN_GOAL_HINT: 'context_wizard_screen_goal_hint',\n// CONTEXT_WIZARD_SCREEN_NUANCES_FILLED: 'context_wizard_screen_nuances_filled',\n// CONTEXT_WIZARD_SCREEN_NUANCES_HINT: 'context_wizard_screen_nuances_hint',\n// CONTEXT_WIZARD_SCREEN_METHOD_FILLED: 'context_wizard_screen_method_filled',\n// CONTEXT_WIZARD_SCREEN_METHOD_HINT: 'context_wizard_screen_method_hint',\n// CONTEXT_WIZARD_SCREEN_CLOSE: 'context_wizard_screen_close',\n// CONTEXT_WIZARD_SCREEN_CREATE: 'context_wizard_screen_create',\n// CONTEXT_WIZARD_SCREEN_LEFT_EMPTY: 'context_wizard_screen_left_empty',\n// ROLEPLAY_SCREEN_OPEN_NEW: 'roleplay_screen_open_new',\n// ROLEPLAY_SCREEN_OPEN_EDIT: 'roleplay_screen_open_edit',\n// ROLEPLAY_SCREEN_OPEN_READ_ONLY: 'roleplay_screen_open_read_only',\n// ROLEPLAY_SCREEN_SITUATION_UPDATED: 'roleplay_screen_situation_updated',\n// ROLEPLAY_SCREEN_SITUATION_HINT: 'roleplay_screen_situation_hint',\n// ROLEPLAY_SCREEN_CUSTOMER_UPDATED: 'roleplay_screen_customer_updated',\n// ROLEPLAY_SCREEN_CUSTOMER_HINT: 'roleplay_screen_customer_hint',\n// ROLEPLAY_SCREEN_PRODUCT_UPDATED: 'roleplay_screen_product_updated',\n// ROLEPLAY_SCREEN_PRODUCT_HINT: 'roleplay_screen_product_hint',\n// ROLEPLAY_SCREEN_GOAL_UPDATED: 'roleplay_screen_goal_updated',\n// ROLEPLAY_SCREEN_GOAL_HINT: 'roleplay_screen_goal_hint',\n// ROLEPLAY_SCREEN_NUANCES_UPDATED: 'roleplay_screen_nuances_updated',\n// ROLEPLAY_SCREEN_NUANCES_HINT: 'roleplay_screen_nuances_hint',\n// ROLEPLAY_SCREEN_METHOD_UPDATED: 'roleplay_screen_method_updated',\n// ROLEPLAY_SCREEN_METHOD_HINT: 'roleplay_screen_method_hint',\n// ROLEPLAY_SCREEN_GENERATE: 'roleplay_screen_generate',\n// ROLEPLAY_SCREEN_TITLE_UPDATED: 'roleplay_screen_title_updated',\n// ROLEPLAY_SCREEN_SCRIPT_GENERATED: 'roleplay_screen_script_generated',\n// ROLEPLAY_SCREEN_RESET: 'roleplay_screen_reset',\n// ROLEPLAY_SCREEN_REGENERATE: 'roleplay_screen_regenerate',\n// ROLEPLAY_SCREEN_AUDIO_PLAYBACK: 'roleplay_screen_audio_playback',\n// ROLEPLAY_SCREEN_CREATE_SCRENARIO: 'roleplay_screen_create_screnario',\n// ROLEPLAY_SCREEN_CREATE_CHALLENGE: 'roleplay_screen_create_challenge',\n// ROLEPLAY_SCREEN_SAVE_FILE: 'roleplay_screen_save_file',\n// ROLEPLAY_SCREEN_COPY_CLIPBOARD: 'roleplay_screen_copy_clipboard',\n// ROLEPLAY_SCREEN_INSTRUCTION_SENT_MANUALLY: 'roleplay_screen_instruction_sent_manually',\n// ROLEPLAY_SCREEN_INSTRUCTION_SENT_AUTO: 'roleplay_screen_instruction_sent_auto',\n// ROLEPLAY_SCREEN_DUPLICATE: 'roleplay_screen_duplicate',\n// ROLEPLAY_SCREEN_DISCLAIMER: 'roleplay_screen_disclaimer',\n// ROLEPLAY_SCREEN_GENERATE_ERROR: 'roleplay_screen_generate_error',\n// };\n\nconst useGoogleAnalyticsWithRoleplay = () => {\n const sendEvent = useGoogleAnalyticsEvents();\n const profile = useSelector(getProfileState);\n const company = useSelector(getCompanyState);\n\n const trackEventWithRoleplay = useCallback((action: string, additionalData?: AnalyticsInformation) => {\n const userInformation: AnalyticsInformation = {\n UserID: profile?.id?.toString() || 'N/A',\n UserName: profile ? profile?.firstName + ' ' + profile?.lastName : 'N/A',\n Email: profile?.email || 'N/A',\n CompanyID: company?.id || 0,\n CompanyName: company?.name || 'N/A',\n Environment: process.env.REACT_APP_DEV_ENV?.toUpperCase() ?? 'DEV', \n ...(additionalData || {})\n };\n\n const eventOptions: EventOptions = {\n category: 'Roleplay',\n action,\n userInformation,\n };\n\n sendEvent(eventOptions);\n }, [sendEvent, company, profile]);\n\n return trackEventWithRoleplay;\n};\n\nexport default useGoogleAnalyticsWithRoleplay;\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { pushModal, useHistory } from '../../../tools/router';\nimport { TableWrapper } from '../../../ui/components/table-wrapper';\nimport { useTableStateHelper } from '../../../ui/components/table-wrapper/helper';\nimport { QuestionTooltip } from '../../../ui/components/Tooltip/QuestionTooltip';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { QuestionContainer, TooltipContainer, TootlipContent, TootlipTitle } from '../../CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/styles';\nimport { initialSearchParams, ITEMS_PER_PAGE } from './constants';\nimport { Container, Footer, NameContainer, NoRoleplayLink, OwnerName, RoleplayCard, SkeletonContainer, Subheader, Text, Title } from './styles';\nimport {\n SearchParams,\n useSearchParamsState,\n} from '../../../constants/interfaces/filters';\nimport SidebarRoleplaysLarge from '../../../ui/icons/SidebarRoleplaysLarge';\nimport dayjs from 'dayjs';\nimport { useGetRoleplaysService } from './store/services';\nimport { getProfileState } from '../../UserProfile/store/reducers';\nimport { useSelector } from 'react-redux';\nimport { useRoleplaysState } from './store/states';\nimport PlusInCircleIcon from '../../../ui/icons/PlusInCircleIcon';\nimport { Button } from '../../../ui/components/Button';\nimport ROUTES from '../../../routes/routes';\nimport { isPractisAdminRole, isAdminRole } from '../../../constants/enums';\nimport { ActionButton, ActionItem } from '../../../ui/components/ActionButton';\nimport { useDeleteRoleplayApi, useDuplicateRoleplayApi } from '../../../api/roleplay';\nimport { generateCopyOfEntityName } from '../../../services/GeneralBulkActionServices/helpers';\nimport { useShowConfirmModalDialog } from '../../../ui/components/ModalDialogs/store/actions';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport RoleplaySceleton from '../components/Skeletons/RoleplaySkeleton';\nimport useGoogleAnalyticsWithRoleplay from '../GoogleAnalytics';\nimport { debounce } from 'lodash';\n\nconst qs = require('query-string');\n\nfunction RoleplaysController() {\n const getRoleplays = useGetRoleplaysService();\n const duplicateRoleplay = useDuplicateRoleplayApi();\n const deleteRoleplay = useDeleteRoleplayApi();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n const showMessage = useShowMessage();\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n\n const profile = useSelector(getProfileState);\n const { isLoading, data: roleplays } = useRoleplaysState();\n const [lastRefreshed, setLastRefreshed] = useState(new Date());\n\n const history = useHistory();\n const location = history.location;\n const pageIndex = parseInt(qs.parse(location.search).page) || 1;\n\n const initialOffset = (pageIndex - 1) * ITEMS_PER_PAGE;\n\n const usableParams: SearchParams = initialSearchParams;\n const infoPanel = localStorage.getItem('infoPanel');\n\n const { searchParams, setSearchTerm, setOffset } =\n useSearchParamsState(usableParams);\n\n const handleTableStates = useTableStateHelper();\n const tableStates = handleTableStates({\n searchTerm: searchParams?.searchTerm,\n itemsCount: roleplays?.items?.length || 0,\n });\n\n useEffect(() => {\n profile?.companyId && getRoleplays({ ...searchParams, companyId: profile?.companyId });\n setLastRefreshed(new Date());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [profile?.companyId]);\n\n /**\n * @function handlePageChange\n * @param { number } limit\n * @param { number } offset\n * @returns { void }\n */\n const handlePageChange = useCallback(\n (_, offset: number): void => {\n setOffset(offset);\n profile?.companyId && getRoleplays({ ...searchParams, offset, companyId: profile?.companyId });\n },\n [searchParams, getRoleplays, setOffset, profile?.companyId]\n );\n\n const isDotMenuVisible = useMemo(() => {\n return isAdminRole(profile?.role?.name) || isPractisAdminRole(profile?.role?.name)\n }, [profile?.role?.name]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const roleplaySeachTrackEvent = useCallback(\n debounce(() => trackEventWithRoleplay('roleplays_screen_search'), 500),\n []\n );\n\n useEffect(() => {\n searchParams.searchTerm && roleplaySeachTrackEvent?.();\n }, [searchParams.searchTerm, roleplaySeachTrackEvent])\n\n useEffect(() => {\n trackEventWithRoleplay('roleplays_screen_open');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n /**\n * @function refreshData\n * @returns { void }\n */\n const refreshData = useCallback(() => {\n trackEventWithRoleplay('roleplay_list_refresh')\n searchParams.limit = ITEMS_PER_PAGE;\n searchParams.offset = initialOffset;\n profile?.companyId && getRoleplays({ ...searchParams, companyId: profile?.companyId });\n setLastRefreshed(new Date());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialOffset, searchParams, getRoleplays, profile?.companyId]);\n\n /**\n * @function handleSearchChange\n * @param { string } searchTerm\n */\n const handleSearchChange = useCallback(\n (searchTerm: string) => {\n setSearchTerm(searchTerm)\n profile?.companyId && getRoleplays({ ...searchParams, searchTerm, companyId: profile?.companyId });\n },\n [searchParams, getRoleplays, setSearchTerm, profile?.companyId]\n );\n\n const handleCreateRoleplay = () => { pushModal(history, ROUTES.ROLEPLAYS.NEW_ROLEPLAY); trackEventWithRoleplay('roleplays_screen_new') };\n const handleDuplicate = (id: number, title: string) => {\n duplicateRoleplay({\n roleplayId: id.toString(),\n title: generateCopyOfEntityName(title)\n }).then((roleplay) => {\n showMessage('Roleplay has been duplicated', 'success');\n trackEventWithRoleplay('roleplays_screen_duplicate')\n history.push(`${ROUTES.ROLEPLAYS.SINGLE.replace(\n ':roleplayId',\n roleplay.id.toString()\n )}`)\n infoPanel === null && localStorage.setItem(\n 'infoPanel',\n 'true'\n );\n })\n };\n\n const handleDeleteRoleplay = useCallback(\n (event: React.MouseEvent<HTMLElement>, roleplayId: number) => {\n event.stopPropagation();\n showConfirmationModalDialog({\n modalTitle: 'Delete Roleplay?',\n description:\n 'It will be permanently deleted from the collection. This action cannot be undone.',\n confirmButtonText: 'Delete',\n cancelButtonText: 'Cancel',\n onConfirm: () => {\n deleteRoleplay([roleplayId.toString()]).then((data) => {\n trackEventWithRoleplay('roleplays_screen_delete');\n showMessage('Roleplay has been deleted', 'success');\n refreshData();\n })\n },\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [showConfirmationModalDialog, deleteRoleplay, refreshData, showMessage]\n ); \n\n \n const canCreateRoleplay = profile && (isAdminRole(profile.role?.name) || isPractisAdminRole(profile.role?.name));\n\n const NoEntryText = <NoRoleplayLink>\n <Text>{canCreateRoleplay ? 'No Roleplays Yet' : 'No Roleplays Yet. Only Admins can create them.'}</Text>\n <Button disabled={!canCreateRoleplay} fontSize={15} style={{ fontWeight: 'bold', cursor: canCreateRoleplay ? 'pointer' : 'default' }} variant=\"transparent\" action={handleCreateRoleplay} type=\"button\" dataTest=\"roleplay-create-new\">Create Roleplay</Button>\n </NoRoleplayLink>;\n\n return <MainWrapper subTitle=\"Roleplay AI\" htmlPageTitle=\"Roleplay AI - Practis\" contentSize={false} dataTest=\"roleplays\" subHeader={\n <Subheader data-test=\"roleplay-subheader\"><div>Collection of AI-powered sales situations</div>\n <QuestionContainer>\n <QuestionTooltip\n action={() => trackEventWithRoleplay('roleplays_screen_hint')}\n text={<TooltipContainer>\n <TootlipTitle>Discover a variety of sales situations processed by advanced AI</TootlipTitle>\n <TootlipContent> Each situation realistically simulates interactions between salespeople and customers. These roleplays are designed to enhance your sales skills through practical, interactive examples, incorporating the best sales methodologies.</TootlipContent>\n </TooltipContainer>}\n isHtmlContent={true}\n dataTest='roleplay-tooltip'\n />\n </QuestionContainer>\n </Subheader>\n }>\n <TableWrapper\n tableStates={tableStates}\n data={roleplays?.items}\n tableRefreshConfigurations={{\n lastRefreshed: lastRefreshed,\n refreshData: refreshData,\n dataTest: 'roleplays-timestamp',\n buttons: [\n {\n name: 'Create Roleplay',\n icon: <PlusInCircleIcon />,\n onPress: handleCreateRoleplay,\n dataTest: 'create-roleplay-btn',\n disabled: !canCreateRoleplay\n },\n ]\n }}\n tableToolsOptions={{\n pagingOptions: {\n totalCount: roleplays?.count,\n itemsPerPage: ITEMS_PER_PAGE,\n onPageChange: handlePageChange,\n searchOrFiltersApplied: false,\n dataTest: 'roleplays-paging'\n },\n searchInputOptions: {\n initialValue: searchParams.searchTerm,\n onSearchChange: handleSearchChange,\n dataTest: 'roleplays-search',\n isSearchInputDisabled:\n !roleplays?.items.length &&\n !searchParams.searchTerm.length,\n },\n }}\n tableEmptyStateConfigurations={{\n shouldShowEmptyState:\n !isLoading && roleplays?.items?.length === 0,\n noEntriesOptions: {\n icon: SidebarRoleplaysLarge,\n text: NoEntryText,\n dataTest: 'no-results',\n },\n noSearchResultsOptions: {\n entityName: 'Roleplays',\n dataTest: 'no-roleplays-found',\n },\n }}\n configurations={{\n columns: [],\n rowConfig: {\n dataTest: 'roleplay-item',\n cells: []\n },\n }}\n />\n {\n isLoading ?\n <SkeletonContainer>\n <RoleplaySceleton/>\n </SkeletonContainer> :\n <Container>\n {!!roleplays?.items?.length && roleplays?.items.map((roleplay) => {\n return <RoleplayCard data-test=\"roleplay-card\" onClick={(e) => {\n e.stopPropagation();\n history.push(ROUTES.ROLEPLAYS.SINGLE.replace(\n ':roleplayId',\n roleplay.id.toString()\n ))\n trackEventWithRoleplay('roleplay_screen_open_edit');\n }} isDotMenuVisible={isDotMenuVisible}>\n <Title data-test=\"roleplay-title\">{roleplay.title}</Title>\n <Footer>\n <NameContainer>\n <OwnerName data-test=\"roleplay-owner-name\">{roleplay?.owner?.firstName + ' ' + roleplay?.owner?.lastName}</OwnerName> • <span data-test=\"roleplay-createdAt\">{dayjs(roleplay.dateCreated).format('MMM D, YY hh:mm A')}\n </span>\n </NameContainer>\n <div className='dot-container'>\n <ActionButton customWidth={200} isHidden={false} dataTest=\"roleplay-item\" customLeft={5}>\n <ActionItem dataTest=\"duplicate-action\" onClick={() => handleDuplicate(roleplay.id, roleplay.title)}>\n Duplicate\n </ActionItem>\n <ActionItem dataTest=\"delete-action\" destructive={true} onClick={(e) => handleDeleteRoleplay(e, roleplay.id)}>\n Delete\n </ActionItem>\n </ActionButton>\n </div>\n </Footer>\n </RoleplayCard>\n })}\n </Container>\n }\n </MainWrapper>\n}\n\nexport default RoleplaysController;","import { Action } from 'redux';\nimport { SearchableFilterHeaderKey } from './types';\n\nexport enum ACTIONS {\n SET_FILTER_HEADER_SEARCH_ACTIVE = 'SET_FILTER_HEADER_SEARCH_ACTIVE',\n SET_FILTER_HEADER_SEARCH_TERM = 'SET_FILTER_HEADER_SEARCH_TERM',\n}\n\nexport type SetFilterHeaderSearchActiveAction = Action<ACTIONS.SET_FILTER_HEADER_SEARCH_ACTIVE> & {\n key: SearchableFilterHeaderKey;\n isSearchActive: boolean;\n};\n\nexport const setFilterHeaderSearchActive = (\n key: SearchableFilterHeaderKey,\n isSearchActive: boolean\n): SetFilterHeaderSearchActiveAction => ({\n type: ACTIONS.SET_FILTER_HEADER_SEARCH_ACTIVE,\n key,\n isSearchActive,\n});\n\nexport type SetFilterHeaderSearchTermAction = Action<ACTIONS.SET_FILTER_HEADER_SEARCH_TERM> & {\n key: SearchableFilterHeaderKey;\n searchTerm: string;\n};\n\nexport const setFilterHeaderSearchTerm = (\n key: SearchableFilterHeaderKey,\n searchTerm: string\n): SetFilterHeaderSearchTermAction => ({\n type: ACTIONS.SET_FILTER_HEADER_SEARCH_TERM,\n key,\n searchTerm,\n});\n\n\nexport type SearchableFilterHeaderActions =\n SetFilterHeaderSearchActiveAction | SetFilterHeaderSearchTermAction;","import Roleplays from './controller';\n\nexport default Roleplays;","export type SearchableFilterHeaderItemState = {\n isSearchActive: boolean;\n searchTerm: string;\n}\n\nexport enum SearchableFilterHeaderKey {\n SINGLE_TEAM = 'SINGLE_TEAM',\n PRACTIS_SET = 'PRACTIS_SET',\n MULTIPLE_TEAMS = 'MULTIPLE_TEAMS',\n LABELS = 'LABELS',\n}\n\nexport type SearchableFilterHeaderState = Record<SearchableFilterHeaderKey, SearchableFilterHeaderItemState | undefined>;","import { Action } from 'redux';\n\nexport enum ACTIONS {\n SELECT_PRACTIS_SET = 'SELECT_PRACTIS_SET',\n DISABLE_PRACTIS_SET_FILTER = 'DISABLE_PRACTIS_SET_FILTER'\n}\n\nexport type SelectPractisSetAction = Action<ACTIONS.SELECT_PRACTIS_SET> & {\n selectedPractisSetId: number | null;\n};\n\nexport const selectPractisSet = (\n selectedPractisSetId: number | null\n): SelectPractisSetAction => ({\n type: ACTIONS.SELECT_PRACTIS_SET,\n selectedPractisSetId,\n});\n\n\nexport type DisablePractisSetFilterAction = Action<ACTIONS.DISABLE_PRACTIS_SET_FILTER> & {\n isDisabled: boolean;\n};\n\nexport const disablePractisSetFilter = (\n isDisabled: boolean\n): DisablePractisSetFilterAction => ({\n type: ACTIONS.DISABLE_PRACTIS_SET_FILTER,\n isDisabled,\n});\n\nexport type PractisSetFilterActions = SelectPractisSetAction | DisablePractisSetFilterAction;","import { useCallback } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { setFilterHeaderSearchActive, setFilterHeaderSearchTerm } from \"./actions\";\nimport { SearchableFilterHeaderKey } from \"./types\";\n\nexport const useSetFilterHeaderSearchActive = (key: SearchableFilterHeaderKey) => {\n const dispatch = useDispatch();\n\n return useCallback((isSearchActive: boolean) => {\n dispatch(setFilterHeaderSearchActive(key, isSearchActive));\n if (!isSearchActive) {\n dispatch(setFilterHeaderSearchTerm(key, ''));\n }\n }, [key, dispatch]);\n};\n\nexport const useSetFilterHeaderSearchTerm = (key: SearchableFilterHeaderKey) => {\n const dispatch = useDispatch();\n\n return useCallback((searchTerm: string) => {\n dispatch(setFilterHeaderSearchTerm(key, searchTerm));\n }, [key, dispatch]);\n};","import { Action } from 'redux';\n\nexport enum ACTIONS {\n SELECT_SINGLE_TEAM = 'SELECT_SINGLE_TEAM',\n DISABLE_SINGLE_TEAM_FILTER = 'DISABLE_SINGLE_TEAM_FILTER'\n}\n\nexport type SelectSingleTeamAction = Action<ACTIONS.SELECT_SINGLE_TEAM> & {\n selectedTeamId: number | null;\n};\n\nexport const selectSingleTeam = (\n selectedTeamId: number | null\n): SelectSingleTeamAction => ({\n type: ACTIONS.SELECT_SINGLE_TEAM,\n selectedTeamId,\n});\n\nexport type DisableSingleTeamFilterAction = Action<ACTIONS.DISABLE_SINGLE_TEAM_FILTER> & {\n isDisabled: boolean;\n};\n\nexport const disableSingleTeamFilter = (\n isDisabled: boolean\n): DisableSingleTeamFilterAction => ({\n type: ACTIONS.DISABLE_SINGLE_TEAM_FILTER,\n isDisabled,\n});\n\nexport type SingleTeamFilterActions = SelectSingleTeamAction | DisableSingleTeamFilterAction;","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useSetFilterHeaderSearchActive } from '../../../searchable-filter-header/store/services';\nimport { SearchableFilterHeaderKey } from '../../../searchable-filter-header/store/types';\n\nimport { disablePractisSetFilter, selectPractisSet } from './actions';\n\nexport const useSelectPractisSet = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (selectedPractisSetId: number) => {\n dispatch(selectPractisSet(selectedPractisSetId));\n },\n [dispatch]\n );\n};\n\nexport const useClearSelectedPractisSet = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(selectPractisSet(null));\n }, [dispatch]);\n};\n\nexport const useDisablePractisSetFilter = () => {\n const dispatch = useDispatch();\n\n return useCallback((isDisabled: boolean) => {\n dispatch(disablePractisSetFilter(isDisabled));\n }, [dispatch]);\n}\n\nexport const useClearPractisSetFilter = () => {\n const clearSelectedPractisSet = useClearSelectedPractisSet();\n const setPractisSetSearchActive = useSetFilterHeaderSearchActive(SearchableFilterHeaderKey.PRACTIS_SET);\n\n return useCallback(() => {\n clearSelectedPractisSet();\n setPractisSetSearchActive(false);\n }, [clearSelectedPractisSet, setPractisSetSearchActive]);\n};\n","import { SingleTeamFilterState } from './types';\n\nexport const initialSingleTeamFilterState: SingleTeamFilterState = {\n selectedTeamId: null,\n isDisabled: false,\n};","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, SingleTeamFilterActions } from './actions';\nimport { initialSingleTeamFilterState } from './constants';\nimport { SingleTeamFilterState } from './types';\n\nexport const singleTeamFilterReducer: Reducer<\n SingleTeamFilterState,\n SingleTeamFilterActions\n> = (state = initialSingleTeamFilterState, action) => {\n switch (action.type) {\n case ACTIONS.SELECT_SINGLE_TEAM:\n return {\n ...state,\n selectedTeamId: action.selectedTeamId,\n };\n case ACTIONS.DISABLE_SINGLE_TEAM_FILTER:\n return {\n ...state,\n isDisabled: action.isDisabled,\n }\n\n default:\n return state;\n }\n};\n\nexport const useSingleTeamFilterState = () =>\n useSelector(state => state.singleTeamFilterReducer);","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useSetFilterHeaderSearchActive } from '../../../searchable-filter-header/store/services';\nimport { SearchableFilterHeaderKey } from '../../../searchable-filter-header/store/types';\n\nimport { disableSingleTeamFilter, selectSingleTeam } from './actions';\n\nexport const useSelectSingleTeam = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (selectedTeamId: number) => {\n dispatch(selectSingleTeam(selectedTeamId));\n },\n [dispatch]\n );\n};\n\nexport const useClearSelectedTeam = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(selectSingleTeam(null));\n }, [dispatch]);\n};\n\nexport const useDisableSingleTeamFilter = () => {\n const dispatch = useDispatch();\n\n return useCallback((isDisabled: boolean) => {\n dispatch(disableSingleTeamFilter(isDisabled));\n }, [dispatch]);\n}\n\nexport const useClearSingleTeamFilter = () => {\n const clearSelectedSingleTeam = useClearSelectedTeam();\n const setSingleTeamSearchActive = useSetFilterHeaderSearchActive(SearchableFilterHeaderKey.SINGLE_TEAM);\n\n return useCallback(() => {\n clearSelectedSingleTeam();\n setSingleTeamSearchActive(false);\n }, [clearSelectedSingleTeam, setSingleTeamSearchActive]);\n};\n","import { useRef, useState, useEffect, useCallback } from \"react\";\n\nconst COUNTDOWN_DATE_KEY = 'COUNTDOWN_DATE';\n\nexport default function useCountdown(from: number, interval: number = 1000) {\n const [value, setValue] = useState<number | undefined>();\n const valueInterval: any = useRef();\n\n /**\n * @function stop\n * @description clears interval callbacks, session storage key\n * and state value (if it's not called from unmount)\n * @param { boolean } unmount\n * @returns { void }\n */\n const stop = useCallback((unmount = false) => {\n clearInterval(valueInterval.current);\n sessionStorage.removeItem(COUNTDOWN_DATE_KEY);\n if (!unmount) {\n setValue(undefined);\n }\n }, []);\n\n /**\n * @function start\n * @description starts interval callbacks with 1 second interval.\n * Countdown value is calculated as a difference between \"from\"\n * and a number of seconds passed from the moment when start function was called.\n * Start date is stored in session storage in order to have a reliable value\n * of passed time and to be independent on possible setInterval() issues\n * @returns { void }\n */\n const start = useCallback(() => {\n setValue(from);\n sessionStorage.setItem(COUNTDOWN_DATE_KEY, new Date().toString());\n valueInterval.current = setInterval(\n () => {\n const startDateFromStorage = sessionStorage.getItem(COUNTDOWN_DATE_KEY);\n if (startDateFromStorage) {\n const startDate = new Date(startDateFromStorage);\n const nowDate = new Date();\n const diffInMiliseconds = nowDate.getTime() - startDate.getTime();\n const diffInSeconds = Math.round(diffInMiliseconds / 1000);\n const value = Math.max(from - diffInSeconds, 0);\n setValue(value);\n } else {\n stop();\n }\n },\n interval\n );\n }, [from, interval, stop]);\n\n useEffect(() => {\n if (typeof value === 'number' && value === 0) {\n stop();\n }\n }, [stop, value]);\n\n useEffect(() => {\n return () => {\n stop(true);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { value, start };\n}","import { useCallback, useMemo, useState } from 'react';\nimport { useGenerateReportApi, useGetReportAvailabilityApi } from '../../../api/reports';\nimport { ErrorResult } from '../../../constants/interfaces/ErrorResult';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ReportData } from '../../../api/reports/types';\nimport useCountdown from '../../../helpers/hooks/useCountdown';\nimport { debounce } from 'lodash';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport { isPractisAdminRole } from '../../../constants/enums';\n\n/**\n * @function useGenerateReportService\n * @returns {{\n * isGenerating: boolean;\n * generateReport: (reportType: string) => void;\n * }}\n */\nexport function useGenerateReportService() {\n const { value: remainingTimeout, start: startCountDown } = useCountdown(60);\n const [isGenerating, setIsGenerating] = useState(false);\n const profile = useSelector(getProfileState);\n\n const generateReportApi = useGenerateReportApi();\n const showMessage = useShowMessage();\n\n const generateReport = useCallback(\n (reportType: string, reportData: ReportData) => {\n setIsGenerating(true);\n generateReportApi(reportType, reportData)\n .then(() => {\n showMessage(\n 'The report is being generated. Check your email in a few minutes.',\n 'success'\n );\n if (!isPractisAdminRole(profile?.role?.name)) {\n startCountDown();\n }\n setIsGenerating(false);\n })\n .catch((error: ErrorResult) => {\n setIsGenerating(false);\n error?.message && showMessage(error.message, 'error');\n });\n },\n [generateReportApi, profile?.role?.name, showMessage, startCountDown]\n );\n\n return { isGenerating, remainingTimeout, generateReport };\n}\n\nconst REPORT_AVAILABILITY_DEBOUNCE_DELAY = 250;\n/**\n * @function useGetReportAvailabilityService\n * @returns {{\n* isAvailable: boolean;\n* getReportAvailability: (reportType: string, reportData: ReportData) => void;\n* }}\n*/\nexport function useGetReportAvailabilityService() {\n const [isAvailable, setIsAvailable] = useState(true);\n const getReportAvailabilityApi = useGetReportAvailabilityApi();\n const showMessage = useShowMessage();\n\n const getReportAvailability = useMemo(() =>\n debounce((reportType: string, reportData: ReportData) => {\n getReportAvailabilityApi(reportType, reportData)\n .then((result) => {\n setIsAvailable(result.available);\n })\n .catch((error: ErrorResult) => {\n error?.message && showMessage(error.message, 'error');\n });\n }, REPORT_AVAILABILITY_DEBOUNCE_DELAY),\n [getReportAvailabilityApi, showMessage]\n );\n\n return { isAvailable, getReportAvailability };\n}","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n`;\n\nexport const Buttons = styled.div`\n display: flex;\n flex-direction: row;\n width: 312px;\n justify-content: space-between;\n`;\n\nexport const InfoText = styled.div`\n padding-top: 3px;\n font-size: 11px;\n line-height: 16px;\n color: var(--ps-grey-1);\n`;\n\nexport const EmailText = styled.span`\n font-weight: 600;\n`;","import { Button } from '../Button';\nimport { Container, Buttons, InfoText, EmailText } from './styles';\nimport { ReportingControlPanelViewProps } from './types';\n\nfunction ReportingControlPanelView({\n isSubmitDisabled,\n isSubmitLoading,\n submitText,\n onSubmit,\n isClearDisabled,\n clearText,\n onClear,\n userEmail,\n}: ReportingControlPanelViewProps) {\n return (\n <Container>\n <Buttons>\n <Button\n color={isSubmitDisabled ? 'gray' : 'default'}\n disabled={isSubmitDisabled}\n loading={isSubmitLoading}\n loadingSize={24}\n loadingColor=\"white\"\n label={submitText}\n action={onSubmit}\n width=\"186px\"\n dataTest=\"generate-report-button\"\n />\n <Button\n color={isClearDisabled ? 'gray' : 'default'}\n disabled={isClearDisabled}\n label={clearText}\n action={() => onClear()}\n variant=\"inverse\"\n width=\"110px\"\n dataTest=\"clear-report-button\"\n />\n </Buttons>\n <InfoText data-test=\"report-email-info\">\n Report will be sent to <EmailText>{userEmail}</EmailText>\n </InfoText>\n </Container>\n );\n}\n\nexport default ReportingControlPanelView;","import dayjs from 'dayjs';\nimport { useMemo } from 'react';\nimport { ReportingControlPanelProps } from './types';\nimport ReportingControlPanelView from './view';\n\nfunction ReportingControlPanelController({\n mode,\n userEmail,\n onSubmit,\n onClear,\n remainingTimeout,\n}: ReportingControlPanelProps) {\n const submitText = useMemo(() => {\n switch (mode) {\n case 'loading':\n return '';\n case 'noData':\n return 'No data for a report';\n default:\n if (mode === 'timeout' && remainingTimeout) {\n const time = dayjs()\n .startOf('day')\n .add(remainingTimeout, 'second')\n .format('mm:ss');\n return `Generate in ${time}`;\n }\n return 'Generate';\n }\n }, [mode, remainingTimeout]);\n\n return (\n <ReportingControlPanelView\n isSubmitDisabled={mode !== 'enabled'}\n isSubmitLoading={mode === 'loading'}\n submitText={submitText}\n onSubmit={onSubmit}\n isClearDisabled={mode === 'disabled'}\n clearText=\"Clear\"\n onClear={onClear}\n userEmail={userEmail}\n />\n );\n}\n\nexport default ReportingControlPanelController;","import ReportingControlPanel from './controller';\n\nexport default ReportingControlPanel;","import { useEffect, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\n\n/**\n * @function useQueryParamListener\n * @param { string } paramName\n * @param { Function} callback\n * @returns { void }\n */\nexport default function useQueryParamListener(\n paramName: string,\n callback: (paramValue: string | null) => void\n) {\n const location = useLocation();\n const paramValueRef = useRef<string | null>(null);\n\n useEffect(() => {\n const queryParams = new URLSearchParams(location.search);\n const paramValue = queryParams.get(paramName);\n\n if (paramValue !== paramValueRef.current) {\n paramValueRef.current = paramValue;\n callback(paramValue);\n }\n }, [callback, location.search, paramName]);\n}","import { useCallback } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\n\n\n/**\n * @function useSetQueryParam\n* @returns { CallableFunction }\n */\nexport function useSetQueryParam() {\n const location = useLocation();\n const history = useHistory();\n\n return useCallback(\n (paramName: string, paramValue: string) => {\n const queryParams = new URLSearchParams(location.search);\n queryParams.set(paramName, paramValue);\n\n // Update the URL with the new query params\n history.replace({ search: queryParams.toString() });\n },\n [history, location.search]\n );\n}\n\n/**\n * @function useRemoveQueryParam\n* @returns { CallableFunction }\n */\nexport function useRemoveQueryParam() {\n const location = useLocation();\n const history = useHistory();\n\n return useCallback(\n (paramName: string) => {\n const queryParams = new URLSearchParams(location.search);\n queryParams.delete(paramName);\n\n // Update the URL with the new query params\n history.replace({ search: queryParams.toString() });\n },\n [history, location.search]\n );\n}\n","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const initialSearchParams: SearchParams = {\n searchTerm: '',\n orderBy: { field: 'name', asc: true },\n limit: 100000,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n filterByStatus: [],\n};\n\nexport const PRACTIS_SET_QUERY_PARAM_NAME = 'practisSet';","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const NoReportingPractisSets = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 33 32\"\n className={className}\n width=\"33\"\n height=\"32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M30.5 29.867V12.8c1.104 0 2-.955 2-2.134V2.133C32.5.955 31.605 0 30.5 0h-28C1.395 0 .5.955.5 2.133v8.534c0 1.178.895 2.134 2 2.134v17.066c0 1.177.896 2.133 2 2.133h24c1.105 0 2-.956 2-2.133zm-25 0c-.552 0-1-.478-1-1.067V13.866c0-.588.448-1.064 1-1.064h5v4.265c0 1.179.896 2.133 2 2.133h8c1.105 0 2-.954 2-2.133v-4.265h5c.552 0 1 .476 1 1.064V28.8c0 .59-.448 1.067-1 1.067h-22zM20.5 16v-3.198h-8V16c0 .59.447 1.067 1 1.067h6c.552 0 1-.478 1-1.067zm9-13.867c.552 0 1 .479 1 1.067v6.4c0 .59-.448 1.067-1 1.067h-26c-.553 0-1-.478-1-1.066V3.2c0-.589.448-1.067 1-1.067h26z\" fill=\"#B1C0CB\"/>\n </svg>\n );\n }\n);\n\nexport default NoReportingPractisSets;\n","import styled from 'styled-components';\nimport { SingleTextLine } from '../../../ui/components/Skeleton/styles';\n\nexport const Container = styled.div`\n width: 100%;\n height: 40px;\n border-bottom: 1px solid var(--ps-grey-4);\n background: var(--ps-grey-3);\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nexport const Title = styled.div<{ isDisabled?: boolean }>`\n padding-left: 24px;\n font-size: 13px;\n line-height: 18px;\n color: ${props => props.isDisabled ? 'var(--ps-grey-1)' : 'var(--ps-black-main)'};\n font-weight: 800;\n`;\n\nexport const TitleSkeleton = styled(SingleTextLine)`\n margin-left: 24px;\n background-color: var(--ps-grey-2);\n`;\n\nexport const SubHeader = styled.div`\n font-size: 13px;\n font-weight: normal;\n color: var(--ps-grey-1);\n margin-right: 25px;\n`;","import { kebabCase } from 'lodash';\nimport {\n Container,\n Title,\n TitleSkeleton,\n SubHeader\n} from './styles';\nimport { FilterHeaderProps } from './types';\n\nfunction FilterHeaderView({\n title,\n isLoading,\n isDisabled,\n subHeader\n}: FilterHeaderProps) {\n return (\n <Container>\n {isLoading ? (\n <>\n <TitleSkeleton width={119} />\n </>\n ) : (\n <>\n <Title\n isDisabled={isDisabled}\n data-test={`${kebabCase(title)}-filter-title`}\n >\n {title}\n </Title>\n {subHeader && <SubHeader data-test={`${kebabCase(title)}-filter-subtitle`}>{subHeader}</SubHeader>}\n </>\n )}\n </Container>\n );\n}\n\nexport default FilterHeaderView;","import { SearchableFilterHeaderKey, SearchableFilterHeaderState } from \"./types\";\n\nexport const initialFilterHeaderState: SearchableFilterHeaderState = {\n [SearchableFilterHeaderKey.SINGLE_TEAM]: undefined,\n [SearchableFilterHeaderKey.PRACTIS_SET]: undefined,\n [SearchableFilterHeaderKey.MULTIPLE_TEAMS]: undefined,\n [SearchableFilterHeaderKey.LABELS]: undefined,\n}","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, SearchableFilterHeaderActions } from './actions';\nimport { SearchableFilterHeaderState } from './types';\nimport { initialFilterHeaderState } from './constants';\n\nexport const filterHeaderReducer: Reducer<\n SearchableFilterHeaderState,\n SearchableFilterHeaderActions\n> = (state = initialFilterHeaderState, action) => {\n const stateByKey = state[action.key] ?? {};\n switch (action.type) {\n case ACTIONS.SET_FILTER_HEADER_SEARCH_ACTIVE:\n return {\n ...state,\n [action.key]: {\n ...stateByKey,\n isSearchActive: action.isSearchActive,\n }\n };\n case ACTIONS.SET_FILTER_HEADER_SEARCH_TERM:\n return {\n ...state,\n [action.key]: {\n ...stateByKey,\n searchTerm: action.searchTerm\n }\n }\n\n default:\n return state;\n }\n};\n\nexport const useFilterHeaderState = () =>\n useSelector(state => state.filterHeader);","import styled from 'styled-components';\nimport { Input } from '../../../../../ui/components/input';\nimport Search from '../../../../../ui/icons/Search';\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n height: 100%;\n flex-grow: 1;\n overflow: hidden;\n padding-right: 4px;\n`;\n\nexport const InputWrapper = styled.div`\n flex: 1;\n`;\n\nexport const StyledInput = styled(Input)<{ ref?: any }>`\n padding: 0;\n`;\n\nexport const IconContainer = styled.div`\n width: 14px;\n height: 100%;\n margin-left: 24px;\n margin-right: 9px;\n`;\n\nexport const SearchIcon = styled(Search)`\n color: var(--ps-grey-1);\n`;\n","import {\n Container,\n InputWrapper,\n StyledInput,\n IconContainer,\n SearchIcon,\n} from './styles';\nimport { SearchInputViewProps } from './types';\n\nfunction SearchInputView({\n value,\n onChange,\n onBlur,\n onKeyDown,\n inputRef,\n}: SearchInputViewProps) {\n return (\n <Container>\n <IconContainer data-test=\"filter-search-icon\">\n <SearchIcon />\n </IconContainer>\n <InputWrapper>\n <StyledInput\n ref={inputRef}\n placeholder=\"Search\"\n handleChange={onChange}\n value={value}\n fontSize=\"13px\"\n height=\"24px\"\n autoFocus={true}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n dataTest=\"filter-search-input\"\n />\n </InputWrapper>\n </Container>\n );\n}\n\nexport default SearchInputView;","import { useCallback, ChangeEvent } from 'react';\nimport SearchInputView from './view';\nimport { SearchInputProps } from './types';\nimport { escPressed } from '../../../../../helpers/functions/key-down-helpers';\n\nfunction SearchInputController({ value, onChange, onExit, inputRef }: SearchInputProps) {\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n e.persist();\n const value = e.target.value;\n onChange(value);\n },\n [onChange]\n );\n\n /**\n * @description handles ESC events on input key down\n * @function handleKeyDown\n * @param { KeyboardEvent } event\n * @returns { void }\n */\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.currentTarget as HTMLInputElement;\n if (escPressed(event)) {\n onExit();\n target.blur();\n }\n },\n [onExit]\n );\n\n const handleBlur = useCallback(() => {\n if (!value) {\n onExit();\n }\n }, [onExit, value]);\n\n return (\n <SearchInputView\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n inputRef={inputRef}\n />\n );\n}\n\nexport default SearchInputController;","import SearchInput from './controller';\n\nexport default SearchInput;","import styled from 'styled-components';\nimport {\n SingleTextLine,\n Icon,\n} from '../../../ui/components/Skeleton/styles';\nimport Search from '../../../ui/icons/Search';\n\nexport const Container = styled.div`\n width: 100%;\n height: 40px;\n border-bottom: 1px solid var(--ps-grey-4);\n background: var(--ps-grey-3);\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nexport const Title = styled.div<{ isDisabled?: boolean }>`\n padding-left: 24px;\n font-size: 13px;\n line-height: 18px;\n color: ${props => props.isDisabled ? 'var(--ps-grey-1)' : 'var(--ps-black-main)'};\n font-weight: 800;\n`;\n\nexport const ShowSearch = styled.div`\n margin-right: 24px;\n width: 14px;\n height: 100%;\n`;\n\nexport const SearchIcon = styled(Search)<{ isDisabled?: boolean}>`\n color: var(${props => props.isDisabled ? \"--ps-grey-2\" : \"--ps-grey-1\"});\n cursor: ${props => props.isDisabled ? \"default\" : \"pointer\"};\n`;\n\nexport const TitleSkeleton = styled(SingleTextLine)`\n margin-left: 24px;\n background-color: var(--ps-grey-2);\n`;\n\nexport const IconSkeleton = styled(Icon)`\n margin-right: 16px;\n background-color: var(--ps-grey-2);\n`;\n\nexport const InputContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n height: 100%;\n width: 100%;\n`;\n\nexport const SearchButtons = styled.div`\n display: flex;\n justify-content: end;\n align-items: center;\n width: 80px;\n`;\n\nexport const ClearButton = styled.div`\n font-size: 11px;\n color: var(--ps-blue-main);\n cursor: pointer;\n`;\n\nexport const ClearSeparator = styled.div`\n width: 1px;\n height: 17px;\n margin: 0 8px;\n background-color: var(--ps-grey-4);\n`\n\nexport const SearchClose = styled.div`\n display: flex;\n flex-basis: 12px;\n flex-shrink: 0;\n align-items: center;\n height: 100%;\n padding-right: 20px;\n cursor: pointer;\n box-sizing: content-box;\n color: var(--ps-black-main);\n`","import { kebabCase } from 'lodash';\nimport StyledInput from './components/SearchInput';\nimport Close from '../../../ui/icons/Close';\nimport {\n Container,\n Title,\n ShowSearch,\n SearchIcon,\n TitleSkeleton,\n IconSkeleton,\n InputContainer,\n SearchButtons,\n SearchClose,\n ClearButton,\n ClearSeparator,\n} from './styles';\nimport { SearchableFilterHeaderViewProps } from './types';\n\nfunction SearchableFilterHeaderView({\n title,\n isLoading,\n hasSearch,\n isDisabled,\n disableSearch,\n showSearchInput,\n searchTerm,\n onShowSearch,\n onHideSearch,\n onSearch,\n onClear,\n inputRef,\n}: SearchableFilterHeaderViewProps) {\n return (\n <Container>\n {showSearchInput ? (\n <InputContainer>\n <StyledInput\n inputRef={inputRef}\n value={searchTerm}\n onChange={onSearch}\n onExit={onHideSearch}\n />\n <SearchButtons>\n {!!searchTerm && <>\n <ClearButton\n onClick={onClear}\n data-test=\"filter-search-input-clear\"\n >\n Clear\n </ClearButton>\n <ClearSeparator />\n </>}\n <SearchClose\n onClick={onHideSearch}\n data-test=\"filter-search-input-close\"\n >\n <Close type='thin' />\n </SearchClose>\n </SearchButtons>\n </InputContainer>\n ) : isLoading ? (\n <>\n <TitleSkeleton width={119} />\n <IconSkeleton size={16} />\n </>\n ) : (\n <>\n <Title\n isDisabled={isDisabled}\n data-test={`${kebabCase(title)}-filter-title`}\n >\n {title}\n </Title>\n {hasSearch && (\n <ShowSearch onClick={onShowSearch} data-test=\"filter-search-icon\">\n <SearchIcon isDisabled={isDisabled || disableSearch} />\n </ShowSearch>\n )}\n </>\n )}\n </Container>\n );\n}\n\nexport default SearchableFilterHeaderView;","import { debounce } from 'lodash';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { SEARCH_INPUT_DEBOUNCE_DELAY } from '../../../constants/variables/component-settings';\nimport { useFocus } from '../../../helpers/hooks/useFocus';\nimport { usePreviousData } from '../../../helpers/hooks/usePreviousData';\nimport { useFilterHeaderState } from './store/reducers';\nimport {\n useSetFilterHeaderSearchActive,\n useSetFilterHeaderSearchTerm\n} from './store/services';\nimport { SearchableFilterHeaderProps } from './types';\nimport SearchableFilterHeaderView from './view';\n\nfunction SearchableFilterHeader({\n storeKey,\n title,\n isLoading,\n hasSearch,\n isDisabled,\n disableSearch,\n onSearch,\n}: SearchableFilterHeaderProps) {\n const { searchTerm, isSearchActive } = useFilterHeaderState()[storeKey] ?? {};\n const setSearchActive = useSetFilterHeaderSearchActive(storeKey);\n const setSearchTerm = useSetFilterHeaderSearchTerm(storeKey);\n const prevSearchTerm = usePreviousData(searchTerm);\n const [inputRef, setFocus] = useFocus();\n\n const handleShowSearch = useCallback(() => {\n if (hasSearch && !isDisabled && !disableSearch) {\n setSearchActive(true);\n }\n }, [hasSearch, isDisabled, disableSearch, setSearchActive]);\n\n const handleHideSearch = useCallback(() => {\n setSearchActive(false);\n }, [setSearchActive]);\n\n const handleClear = useCallback(() => {\n setSearchTerm('');\n setFocus();\n }, [setFocus, setSearchTerm]);\n\n const onSearchDebounced = useMemo(\n () => debounce(onSearch, SEARCH_INPUT_DEBOUNCE_DELAY),\n [onSearch]\n );\n\n useEffect(() => {\n if ((!prevSearchTerm && !searchTerm) || prevSearchTerm === searchTerm) return;\n onSearchDebounced(searchTerm!);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchTerm]);\n\n return (\n <SearchableFilterHeaderView\n title={title}\n isLoading={isLoading}\n hasSearch={hasSearch}\n isDisabled={isDisabled}\n disableSearch={disableSearch}\n showSearchInput={isSearchActive ?? false}\n searchTerm={searchTerm ?? ''}\n onShowSearch={handleShowSearch}\n onHideSearch={handleHideSearch}\n onSearch={setSearchTerm}\n onClear={handleClear}\n inputRef={inputRef}\n />\n );\n}\n\nexport default SearchableFilterHeader;","import SearchableFilterHeader from './controller';\n\nexport default SearchableFilterHeader;","import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n width: 312px;\n min-height: 132px;\n border-radius: 4px;\n border: solid 1px var(--ps-grey-4);\n`;","import { FilterHeader } from '../filter-header';\nimport SearchableFilterHeader from '../searchable-filter-header';\nimport { SearchableFilterHeaderProps } from '../searchable-filter-header/types';\nimport { Wrapper } from './styles';\nimport { FilterContainerViewProps } from './types';\n\nfunction FilterContainerView(props: FilterContainerViewProps) {\n const { headerProps, children } = props;\n const searchableHeaderProps = headerProps as SearchableFilterHeaderProps;\n\n return (\n <Wrapper>\n {searchableHeaderProps.storeKey\n ? <SearchableFilterHeader {...searchableHeaderProps} />\n : <FilterHeader {...headerProps} />\n } {children}\n </Wrapper>\n );\n}\n\nexport default FilterContainerView;","import styled from 'styled-components';\n\nexport const Container = styled.div`\n margin-top: 1px;\n padding: 5px 24px;\n max-height: 270px;\n overflow: auto;\n overflow-x: hidden;\n`;\n\nexport const SkeletonContainer = styled.div`\n padding-top: 13px;\n`;\n\nexport const EmptyStateContainer = styled.div`\n padding-top: 13px;\n`;\n","import { isEmpty } from 'lodash';\n\nimport { EmptyState } from '../../../../ui/components/EmptyStates';\nimport RadioButton from '../../../../ui/components/RadioButton';\nimport { FilterSkeleton } from '../../../../ui/components/Skeleton';\nimport NoReportingPractisSets from '../../../../ui/icons/NoReportingPractisSets';\nimport NoSearchResult from '../../../../ui/icons/NoSearchResult';\nimport { FilterContainer } from '../../filter-container';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\nimport {\n Container,\n EmptyStateContainer,\n SkeletonContainer\n} from './styles';\nimport { PractisSetFilterViewProps } from './types';\n\nfunction PractisSetFilterView(props: PractisSetFilterViewProps) {\n const {\n practisSetData,\n loading,\n isNoSearchResultState,\n selectedTeamId,\n selectedPractisSetId,\n isDisabled,\n onPractisSetSearch,\n handleSelectPractisSet,\n } = props;\n\n return (\n <FilterContainer\n headerProps={{\n storeKey: SearchableFilterHeaderKey.PRACTIS_SET,\n title: 'Practis Set',\n hasSearch: !isEmpty(practisSetData?.items),\n onSearch: onPractisSetSearch,\n isLoading: loading,\n isDisabled: isDisabled,\n }}\n >\n <Container>\n {loading ? (\n <SkeletonContainer><FilterSkeleton /></SkeletonContainer>\n ) : isEmpty(practisSetData?.items) ? (\n <EmptyStateContainer>\n <EmptyState\n fontSize={11}\n icon={\n isNoSearchResultState\n ? NoSearchResult\n : NoReportingPractisSets\n }\n iconStyle={{\n width: 32,\n height: 32,\n marginBottom: 4,\n }}\n dataTest={'no-practis-sets'}\n >\n {isNoSearchResultState ? (\n 'No Search Results'\n ) : selectedTeamId ? (\n 'No Practis Sets yet'\n ) : (\n <span data-test=\"select-team-to-see-practis-sets\">\n Select the team to see Practis Sets\n </span>\n )}\n </EmptyState>\n </EmptyStateContainer>\n ) : (\n practisSetData?.items.map(item => (\n <RadioButton\n key={item.practisSetId}\n handleChange={() =>\n handleSelectPractisSet(item.practisSetId)\n }\n checked={selectedPractisSetId === item.practisSetId}\n size={12}\n label={item.name}\n dataTest=\"practis-set-filter-item\"\n disabled={isDisabled}\n />\n ))\n )}\n </Container>\n </FilterContainer>\n );\n}\n\nexport default PractisSetFilterView;","import { PractisSetFilterState } from './types';\n\nexport const initialPractisSetFilterState: PractisSetFilterState = {\n selectedPractisSetId: null,\n isDisabled: false,\n};","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, PractisSetFilterActions } from './actions';\nimport { initialPractisSetFilterState } from './constants';\nimport { PractisSetFilterState } from './types';\n\nexport const practisSetFilterReducer: Reducer<\n PractisSetFilterState,\n PractisSetFilterActions\n> = (state = initialPractisSetFilterState, action) => {\n switch (action.type) {\n case ACTIONS.SELECT_PRACTIS_SET:\n return {\n ...state,\n selectedPractisSetId: action.selectedPractisSetId,\n };\n case ACTIONS.DISABLE_PRACTIS_SET_FILTER:\n return {\n ...state,\n isDisabled: action.isDisabled,\n }\n\n default:\n return state;\n }\n};\n\nexport const usePractisSetFilterState = () =>\n useSelector(state => state.practisSetFilterReducer);\n","import { useCallback, useEffect, useMemo } from 'react';\nimport { isEmpty } from 'lodash';\n\nimport useQueryParamListener from '../../../../helpers/hooks/useQueryParamListener';\nimport { useSetQueryParam } from '../../../../helpers/hooks/useSetQueryParam';\nimport { useSearchTrainingPractisSets } from '../../../teams/store/services';\nimport { useSingleTeamFilterState } from '../single-team-filter/store/reducers';\nimport { initialSearchParams, PRACTIS_SET_QUERY_PARAM_NAME } from './constants';\nimport {\n useClearSelectedPractisSet,\n useSelectPractisSet,\n} from './store/services';\nimport PractisSetFilterView from './view';\nimport { useTrainerPractisSetState } from '../../../teams/store/states';\nimport { usePractisSetFilterState } from './store/reducers';\nimport { usePreviousData } from '../../../../helpers/hooks/usePreviousData';\nimport { useSetFilterHeaderSearchActive } from '../../searchable-filter-header/store/services';\nimport { useFilterHeaderState } from '../../searchable-filter-header/store/reducers';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\n\nfunction PractisSetFilterController() {\n const { selectedTeamId } = useSingleTeamFilterState();\n const { data, loading } = useTrainerPractisSetState();\n const prevSelectedTeamId = usePreviousData(selectedTeamId);\n\n const { selectedPractisSetId, isDisabled } = usePractisSetFilterState();\n const { searchTerm } = useFilterHeaderState()[SearchableFilterHeaderKey.PRACTIS_SET] ?? {}\n const setSearchActive = useSetFilterHeaderSearchActive(SearchableFilterHeaderKey.PRACTIS_SET);\n const clearSelectedPractisSet = useClearSelectedPractisSet();\n const onSelectPractisSet = useSelectPractisSet();\n const setQueryParam = useSetQueryParam();\n\n const isNoSearchResultState = useMemo(\n () => isEmpty(data?.items) && !!searchTerm && searchTerm.length > 0,\n [data?.items, searchTerm]\n );\n\n const setSelectedPractisSetInStore = useCallback((practisSetId?: number | null) => {\n if (practisSetId) {\n onSelectPractisSet(practisSetId);\n } else {\n clearSelectedPractisSet();\n }\n }, [clearSelectedPractisSet, onSelectPractisSet]);\n\n const setSelectedPractisSet = useCallback((practisSetId?: number) => {\n setQueryParam(PRACTIS_SET_QUERY_PARAM_NAME, practisSetId?.toString() ?? '');\n setSelectedPractisSetInStore(practisSetId);\n }, [setQueryParam, setSelectedPractisSetInStore]);\n\n useQueryParamListener(PRACTIS_SET_QUERY_PARAM_NAME, practisSetId => {\n const id = practisSetId ? +practisSetId : null;\n const isEqual = (!selectedPractisSetId && !id) || selectedPractisSetId === id;\n if (!isEqual) {\n setSelectedPractisSetInStore(id);\n }\n });\n\n const searchTrainingPractisSets = useSearchTrainingPractisSets(\n (selectedTeamId || 0).toString()\n );\n\n const searchByTeamId = useMemo(\n () => selectedTeamId ? searchTrainingPractisSets : null,\n [searchTrainingPractisSets, selectedTeamId]\n );\n\n const handleSearch = useCallback((searchTerm) => {\n searchByTeamId?.({\n ...initialSearchParams,\n searchTerm,\n });\n }, [searchByTeamId]);\n\n useEffect(() => {\n if (selectedTeamId) {\n // do not clear selected practis set on page load (prevSelectedTeamId is empty)\n // as initially it's set from query parameter\n if (prevSelectedTeamId) {\n setSelectedPractisSet(undefined);\n setSearchActive(false);\n }\n searchByTeamId?.(initialSearchParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTeamId]);\n\n return (\n <PractisSetFilterView\n practisSetData={data}\n loading={loading}\n isNoSearchResultState={isNoSearchResultState}\n selectedTeamId={selectedTeamId}\n selectedPractisSetId={selectedPractisSetId}\n isDisabled={isDisabled}\n onPractisSetSearch={handleSearch}\n handleSelectPractisSet={setSelectedPractisSet}\n />\n );\n}\n\nexport default PractisSetFilterController;","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n orderBy: null,\n limit: 100000,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n};\n\nexport const SINGLE_TEAM_QUERY_PARAM_NAME = 'team';","import styled from 'styled-components';\nimport NoSearchResult from '../../../../ui/icons/NoSearchResult';\n\nexport const Container = styled.div`\n margin-top: 1px;\n padding: 5px 24px;\n max-height: 270px;\n overflow: auto;\n`;\n\nexport const SkeletonContainer = styled.div`\n padding-top: 13px;\n`;\n\nexport const EmptyStateContainer = styled.div`\n padding-top: 13px;\n`;\n\nexport const StyledNoSearchResultIcon = styled(NoSearchResult)`\n width: 32px !important;\n font-size: 32px !important;\n margin: 0 !important;\n`;","import { isEmpty } from 'lodash';\nimport { EmptyState } from '../../../../ui/components/EmptyStates';\n\nimport RadioButton from '../../../../ui/components/RadioButton';\nimport { FilterSkeleton } from '../../../../ui/components/Skeleton';\nimport NoSearchResult from '../../../../ui/icons/NoSearchResult';\nimport { FilterContainer } from '../../filter-container';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\nimport {\n Container,\n SkeletonContainer,\n EmptyStateContainer\n} from './styles';\nimport { SingleSelectTeamFilterViewProps } from './types';\n\nfunction SingleSelectTeamFilterView({\n selectedTeamId, isLoading, myTeams, isDisabled, onTeamSearch, onTeamSelect\n}: SingleSelectTeamFilterViewProps) {\n return (\n <FilterContainer\n headerProps={{\n storeKey: SearchableFilterHeaderKey.SINGLE_TEAM,\n title: 'Team',\n hasSearch: true,\n onSearch: onTeamSearch,\n isLoading,\n isDisabled\n }}\n >\n <Container>\n {isLoading ? (\n <SkeletonContainer><FilterSkeleton /></SkeletonContainer>\n ) : isEmpty(myTeams?.items) ? (\n <EmptyStateContainer>\n <EmptyState\n fontSize={11}\n icon={NoSearchResult}\n iconStyle={{\n width: 32,\n height: 32,\n marginBottom: 4,\n }}\n dataTest=\"no-teams\"\n >\n No Search Results\n </EmptyState>\n </EmptyStateContainer>\n ) : (\n myTeams?.items.map(item => (\n <RadioButton\n key={item.id}\n handleChange={() => onTeamSelect(item.id!)}\n checked={selectedTeamId === item.id}\n size={12}\n label={item.name}\n dataTest=\"team-filter-item\"\n disabled={isDisabled}\n />\n ))\n )}\n </Container>\n </FilterContainer>\n );\n}\n\nexport default SingleSelectTeamFilterView;","import { useCallback, useEffect } from 'react';\n\nimport useQueryParamListener from '../../../../helpers/hooks/useQueryParamListener';\nimport { useSetQueryParam } from '../../../../helpers/hooks/useSetQueryParam';\n\nimport { useSearchTeamsService } from '../../../teams/store/services';\nimport { useTeamsState } from '../../../teams/store/states';\nimport { initialSearchParams, SINGLE_TEAM_QUERY_PARAM_NAME } from './constants';\nimport { useSingleTeamFilterState } from './store/reducers';\nimport { useClearSelectedTeam, useSelectSingleTeam } from './store/services';\nimport SingleSelectTeamFilterView from './view';\n\nfunction SingleSelectTeamFilterController() {\n const searchTeams = useSearchTeamsService();\n const selectSingeTeam = useSelectSingleTeam();\n const clearSelectedTeam = useClearSelectedTeam();\n const setQueryParam = useSetQueryParam();\n\n const { loading, myTeams } = useTeamsState();\n const { selectedTeamId, isDisabled } = useSingleTeamFilterState();\n\n const setSelectedTeamInStore = useCallback((teamId?: number | null) => {\n if (teamId) {\n selectSingeTeam(teamId);\n } else {\n clearSelectedTeam();\n }\n }, [clearSelectedTeam, selectSingeTeam]);\n\n const setSelectedTeam = useCallback((teamId?: number) => {\n setQueryParam(SINGLE_TEAM_QUERY_PARAM_NAME, teamId?.toString() ?? '');\n setSelectedTeamInStore(teamId);\n }, [setQueryParam, setSelectedTeamInStore]);\n\n useQueryParamListener(SINGLE_TEAM_QUERY_PARAM_NAME, teamId => {\n const id = teamId ? +teamId : null;\n const isEqual = (!selectedTeamId && !id) || selectedTeamId === id;\n if (!isEqual) {\n setSelectedTeamInStore(id);\n }\n });\n\n const handleTeamSearch = useCallback((searchTerm: string) => {\n searchTeams({\n ...initialSearchParams,\n searchTerm,\n });\n }, [searchTeams]);\n\n useEffect(() => {\n searchTeams(initialSearchParams);\n }, [searchTeams]);\n\n return (\n <SingleSelectTeamFilterView\n selectedTeamId={selectedTeamId}\n isLoading={loading}\n myTeams={myTeams}\n isDisabled={isDisabled}\n onTeamSearch={handleTeamSearch}\n onTeamSelect={setSelectedTeam}\n />\n );\n}\n\nexport default SingleSelectTeamFilterController;","import { Action } from 'redux';\n\nexport enum ACTIONS {\n SELECT_MULTIPLE_TEAMS = 'SELECT_MULTIPLE_TEAMS',\n DISABLE_MULTIPLE_TEAMS_FILTER = 'DISABLE_MULTIPLE_TEAMS_FILTER'\n}\n\nexport type SelectMultipleTeamsAction = Action<ACTIONS.SELECT_MULTIPLE_TEAMS> & {\n teamIds: number[] | null;\n};\n\nexport const selectMultipleTeams = (\n teamIds: number[] | null\n): SelectMultipleTeamsAction => ({\n type: ACTIONS.SELECT_MULTIPLE_TEAMS,\n teamIds,\n});\n\nexport type DisableMultipleTeamsFilterAction = Action<ACTIONS.DISABLE_MULTIPLE_TEAMS_FILTER> & {\n isDisabled: boolean;\n};\n\nexport const disableMultipleTeamsFilter = (\n isDisabled: boolean\n): DisableMultipleTeamsFilterAction => ({\n type: ACTIONS.DISABLE_MULTIPLE_TEAMS_FILTER,\n isDisabled,\n});\n\nexport type MultipleTeamsFilterActions = SelectMultipleTeamsAction | DisableMultipleTeamsFilterAction;","import { SearchParams } from '../../../../constants/interfaces/filters';\n\nexport const initialSearchParams: SearchParams = {\n searchTerm: '',\n filters: [],\n orderBy: null,\n limit: 100000,\n offset: 0,\n totalCount: 0,\n numberOfPages: 0,\n};\n\nexport const TEAMS_QUERY_PARAM_NAME = 'teams';","import { MultipleTeamsFilterState } from './types';\n\nexport const initialMultipleTeamsFilterState: MultipleTeamsFilterState = {\n selectedTeamIds: null,\n isDisabled: false,\n};","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, MultipleTeamsFilterActions } from './actions';\nimport { initialMultipleTeamsFilterState } from './constants';\nimport { MultipleTeamsFilterState } from './types';\n\nexport const multipleTeamsFilterReducer: Reducer<\n MultipleTeamsFilterState,\n MultipleTeamsFilterActions\n> = (state = initialMultipleTeamsFilterState, action) => {\n switch (action.type) {\n case ACTIONS.SELECT_MULTIPLE_TEAMS:\n return {\n ...state,\n selectedTeamIds: action.teamIds,\n };\n case ACTIONS.DISABLE_MULTIPLE_TEAMS_FILTER:\n return {\n ...state,\n isDisabled: action.isDisabled,\n }\n default:\n return state;\n }\n};\n\nexport const useMultipleTeamsFilterState = () =>\n useSelector(state => state.multipleTeamsFilter);","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useSetFilterHeaderSearchActive } from '../../../searchable-filter-header/store/services';\nimport { SearchableFilterHeaderKey } from '../../../searchable-filter-header/store/types';\nimport {\n disableMultipleTeamsFilter,\n selectMultipleTeams,\n} from './actions';\n\nexport const useSelectMultipleTeams = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (selectedTeamIds: number[]) => {\n dispatch(selectMultipleTeams(selectedTeamIds));\n },\n [dispatch]\n );\n};\n\nexport const useClearMultipleTeams = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n () => {\n dispatch(selectMultipleTeams([]));\n },\n [dispatch]\n );\n};\n\nexport const useDisableMultipleTeamsFilter = () => {\n const dispatch = useDispatch();\n\n return useCallback((isDisabled: boolean) => {\n dispatch(disableMultipleTeamsFilter(isDisabled));\n }, [dispatch]);\n}\n\nexport const useClearMultipleTeamsFilter = () => {\n const clearMultipleTeams = useClearMultipleTeams();\n const setMultipleTeamsSearchActive = useSetFilterHeaderSearchActive(SearchableFilterHeaderKey.MULTIPLE_TEAMS);\n\n return useCallback(() => {\n clearMultipleTeams();\n setMultipleTeamsSearchActive(false);\n }, [clearMultipleTeams, setMultipleTeamsSearchActive]);\n};\n","import styled from 'styled-components';\nimport Checkbox from '../../../../ui/components/Checkbox';\n\nexport const Container = styled.div`\n padding: 0 4px 16px 4px;\n`;\n\nexport const SkeletonContainer = styled.div`\n padding: 16px 20px 0 20px;\n`;\n\nexport const EmptyStateContainer = styled.div`\n padding-top: 19px;\n`;\n\nexport const CounterContainer = styled.div`\n font-size: 11px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 4px 20px 4px 20px;\n`;\n\nexport const SelectionCounter = styled.div`\n color: var(--ps-grey-1);\n font-weight: 500;\n`;\n\nexport const ToggleAllSelection = styled.span<{ isDisabled: boolean }>`\n cursor: ${props => props.isDisabled ? 'default' : 'pointer'};\n color: ${props => props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-blue-main)'};\n font-weight: ${props => props.isDisabled ? '400' : '500'};\n`;\n\nexport const ListContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n height: auto;\n max-height: 266px;\n overflow: auto;\n padding: 0 20px;\n`;\n\nexport const StyledCheckbox = styled(Checkbox)`\n padding: 4px 0;\n`","import { isEmpty } from 'lodash';\nimport { Variables } from '../../../../theme/variables';\nimport { EmptyState } from '../../../../ui/components/EmptyStates';\nimport { FilterSkeleton } from '../../../../ui/components/Skeleton';\nimport NoSearchResult from '../../../../ui/icons/NoSearchResult';\nimport { FilterContainer } from '../../filter-container';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\nimport {\n Container,\n SkeletonContainer,\n EmptyStateContainer,\n ListContainer,\n StyledCheckbox,\n CounterContainer,\n SelectionCounter,\n ToggleAllSelection,\n} from './styles';\nimport { MultipleSelectTeamsFilterViewProps } from './types';\nimport { pluralize } from '../../../../helpers/functions/pluralize';\n\nfunction MultipleSelectTeamsFilterView({\n loading, myTeams, selectedTeamIds, isDisabled, onTeamSearch, onTeamToggle, onAllToggle\n}: MultipleSelectTeamsFilterViewProps) {\n const isAllSelected = selectedTeamIds?.length === myTeams?.count;\n return (\n <FilterContainer\n headerProps={{\n storeKey: SearchableFilterHeaderKey.MULTIPLE_TEAMS,\n title: 'Teams',\n hasSearch: true,\n onSearch: onTeamSearch,\n isLoading: loading,\n isDisabled,\n }}\n >\n <Container>\n {loading ? (\n <SkeletonContainer>\n <FilterSkeleton />\n </SkeletonContainer>\n ) : isEmpty(myTeams?.items) ? (\n <EmptyStateContainer>\n <EmptyState\n fontSize={11}\n icon={NoSearchResult}\n iconStyle={{\n width: 32,\n height: 32,\n marginBottom: 4,\n }}\n dataTest=\"no-teams\"\n >\n No Search Results\n </EmptyState>\n </EmptyStateContainer>\n ) : (\n <>\n <CounterContainer>\n <SelectionCounter data-test=\"teams-selection-counter\">\n {selectedTeamIds?.length\n ? `${pluralize(\n selectedTeamIds.length,\n 'item'\n )} selected`\n : 'No Items selected'}\n </SelectionCounter>\n <ToggleAllSelection\n onClick={onAllToggle}\n data-test={\n isAllSelected\n ? 'teams-unselect-all'\n : 'teams-select-all'\n }\n isDisabled={isDisabled}\n >\n {isAllSelected ? 'Unselect All' : 'Select All'}\n </ToggleAllSelection>\n </CounterContainer>\n <ListContainer>\n {myTeams?.items.map(item => {\n const isSelected =\n selectedTeamIds?.includes(item.id!) ??\n false;\n return (\n <StyledCheckbox\n key={item.id}\n handleChange={() =>\n onTeamToggle(item.id!)\n }\n checked={isSelected}\n size={12}\n label={item.name}\n fontColor={isDisabled ? Variables.Colors.steelGrey : Variables.Colors.black}\n labelStyles={{\n fontWeight: isSelected\n ? 'bold'\n : 'normal',\n }}\n dataTest=\"team-filter-item-checkbox\"\n disabled={isDisabled}\n disabledCheckedBackground={Variables.Colors.cloudyBlue}\n />\n );\n })}\n </ListContainer>\n </>\n )}\n </Container>\n </FilterContainer>\n );\n}\n\nexport default MultipleSelectTeamsFilterView;","import { useCallback, useEffect } from 'react';\n\nimport { useSearchTeamsService } from '../../../teams/store/services';\nimport { useTeamsState } from '../../../teams/store/states';\nimport { initialSearchParams, TEAMS_QUERY_PARAM_NAME } from './constants';\nimport { useMultipleTeamsFilterState } from './store/reducers';\nimport {\n useClearMultipleTeams,\n useSelectMultipleTeams,\n} from './store/services';\nimport useQueryParamListener from '../../../../helpers/hooks/useQueryParamListener';\nimport { useSetQueryParam } from '../../../../helpers/hooks/useSetQueryParam';\nimport MultipleSelectTeamsFilterView from './view';\nimport { isEqual } from 'lodash';\n\nfunction MultipleSelectTeamsFilterController() {\n const searchTeams = useSearchTeamsService();\n const selectMultipleTeams = useSelectMultipleTeams();\n const clearMultipleTeams = useClearMultipleTeams();\n const { loading, myTeams } = useTeamsState();\n const { selectedTeamIds, isDisabled } = useMultipleTeamsFilterState();\n const setQueryParam = useSetQueryParam();\n\n const setSelectedTeamsInStore = useCallback((teamIds: number[]) => {\n if (teamIds.length) {\n selectMultipleTeams(teamIds);\n } else {\n clearMultipleTeams();\n }\n }, [clearMultipleTeams, selectMultipleTeams]);\n\n const setSelectedTeams = useCallback((teamIds: number[]) => {\n const paramValue = teamIds.join(',');\n setQueryParam(TEAMS_QUERY_PARAM_NAME, paramValue);\n setSelectedTeamsInStore(teamIds);\n }, [setQueryParam, setSelectedTeamsInStore]);\n\n const handleTeamSearch = useCallback(\n (searchTerm: string) => {\n searchTeams({ ...initialSearchParams, searchTerm });\n },\n [searchTeams]\n );\n\n const handleTeamToggle = useCallback(\n (teamId: number) => {\n const teamIds = selectedTeamIds ?? [];\n const newTeamIds = teamIds.includes(teamId)\n ? teamIds.filter(id => id !== teamId)\n : teamIds.concat(teamId);\n setSelectedTeams(newTeamIds);\n },\n [selectedTeamIds, setSelectedTeams]\n );\n\n const handleAllToggle = useCallback(() => {\n if (isDisabled) return;\n if (selectedTeamIds && selectedTeamIds?.length === myTeams?.count) {\n setSelectedTeams([]);\n } else if (myTeams) {\n setSelectedTeams(myTeams.items.map(item => item.id!));\n }\n }, [isDisabled, myTeams, selectedTeamIds, setSelectedTeams]);\n\n useQueryParamListener(TEAMS_QUERY_PARAM_NAME, teamIds => {\n const ids = teamIds?.length ? teamIds.split(',').map(id => Number(id)) : [];\n if (!isEqual(ids, selectedTeamIds)) {\n setSelectedTeamsInStore(ids);\n }\n });\n\n useEffect(() => {\n searchTeams(initialSearchParams);\n }, [searchTeams]);\n\n return (\n <MultipleSelectTeamsFilterView\n loading={loading}\n myTeams={myTeams}\n selectedTeamIds={selectedTeamIds}\n isDisabled={isDisabled}\n onTeamSearch={handleTeamSearch}\n onTeamToggle={handleTeamToggle}\n onAllToggle={handleAllToggle}\n />\n );\n}\n\nexport default MultipleSelectTeamsFilterController;","import { Action } from 'redux';\n\nexport enum ACTIONS {\n DISABLE_LABELS_FILTER = 'DISABLE_LABELS_FILTER'\n}\n\nexport type DisableLabelsFilterAction = Action<ACTIONS.DISABLE_LABELS_FILTER> & {\n isDisabled: boolean;\n};\n\nexport const disableLabelsFilter = (\n isDisabled: boolean\n): DisableLabelsFilterAction => ({\n type: ACTIONS.DISABLE_LABELS_FILTER,\n isDisabled,\n});\n\nexport type LablesFilterActions = DisableLabelsFilterAction;","export const LABELS_QUERY_PARAM_NAME = 'labels';","import { useSelector } from \"react-redux\";\nimport { compose, Reducer } from \"redux\";\nimport { withLabelsInitialState, withLabelsReducer } from \"../../../../portableLabels/store/hors/withLabels\";\nimport { ACTIONS, LablesFilterActions } from \"./actions\";\nimport { LabelsFilterState } from \"./types\";\n\nconst labelsFilterBaseReducer: Reducer<LabelsFilterState, any> = (\n state = withLabelsInitialState({ isDisabled: false }, 'labelsFilter'),\n action: LablesFilterActions\n): LabelsFilterState => {\n switch (action.type) {\n case ACTIONS.DISABLE_LABELS_FILTER:\n return {\n ...state,\n isDisabled: action.isDisabled,\n }\n default:\n return state;\n }\n};\n\nexport const labelsFilterReducer = compose<Reducer<LabelsFilterState, any>>(\n withLabelsReducer({ reducerName: 'labelsFilter' })\n)(labelsFilterBaseReducer);\n\nexport const useLabelsFilterState = () =>\n useSelector(state => state.labelsFilter);","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding: 0 4px 16px 4px;\n`;\n\nexport const SkeletonContainer = styled.div`\n padding: 16px 20px 0 20px;\n`;\n\nexport const EmptyStateContainer = styled.div`\n padding-top: 19px;\n`;\n\nexport const CounterContainer = styled.div`\n font-size: 11px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 4px 20px;\n`;\n\nexport const SelectionCounter = styled.div`\n color: var(--ps-grey-1);\n font-weight: 500;\n`;\n\nexport const ToggleAllSelection = styled.span<{ isDisabled: boolean }>`\n cursor: ${props => props.isDisabled ? 'default' : 'pointer'};\n color: ${props => props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-blue-main)'};\n font-weight: ${props => props.isDisabled ? '400' : '500'};\n`;\n\nexport const ListContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n height: auto;\n max-height: 266px;\n overflow: auto;\n padding: 0 20px;\n`;","import styled from 'styled-components';\nimport Checkbox from '../../../../../../ui/components/Checkbox';\n\nexport const ChildContainer = styled.div`\n margin-left: 15px;\n width: calc(100% - 15px);\n`;\n\nexport const StyledCheckbox = styled(Checkbox)`\n height: 100%;\n`;\n\nexport const Container = styled.div`\n padding: 4px 0;\n display: flex;\n align-items: center;\n width: 100%;\n`;\n\nexport const ArrowContainer = styled.div`\n width: 8px;\n margin-right: 9px;\n cursor: pointer;\n`;\n\nexport const CollapseArrow = styled.div`\n height: 8px;\n display: flex;\n color: var(--ps-grey-2)\n`;\n\nexport const NameInput = styled.input<{ isSelected: boolean, isDisabled: boolean, hasChildren: boolean }>`\n color: ${props => props.isDisabled ? 'var(--ps-grey-1)' : 'var(--ps-black-main)'};\n font-size: 13px;\n font-weight: ${props => props.isSelected ? 'bold' : 'normal'};\n text-overflow: ellipsis;\n margin-left: 8px;\n border: 0;\n white-space: nowrap;\n cursor: ${props => props.hasChildren ? 'pointer' : 'default'};\n width: 100%;\n`;\n","import { Variables } from '../../../../../../theme/variables';\nimport TriangleDown from '../../../../../../ui/icons/TriangleDown';\nimport TriangleRight from '../../../../../../ui/icons/TriangleRight';\nimport {\n Container,\n StyledCheckbox,\n ArrowContainer,\n CollapseArrow,\n NameInput,\n ChildContainer,\n} from './styles';\nimport { LabelsFilterItemViewProps } from './types';\n\nfunction LabelsFilterItemView({\n label,\n hasChildren,\n children,\n isSelected,\n isPartiallySelected,\n isOpen,\n isDisabled,\n onToggle,\n onToggleCollapse,\n}: LabelsFilterItemViewProps) {\n return (\n <>\n <Container\n onClick={e => {\n e.stopPropagation();\n onToggleCollapse(label.id);\n }}\n data-test=\"label-filter-item\"\n >\n <ArrowContainer>\n {hasChildren && (\n <CollapseArrow data-test={`label-filter-item-${isOpen ? 'expanded' : 'collapsed'}-arrow`}>\n {isOpen ? (\n <TriangleDown />\n ) : (\n <TriangleRight />\n )}\n </CollapseArrow>\n )}\n </ArrowContainer>\n <StyledCheckbox\n checked={isSelected || isPartiallySelected}\n partial={isPartiallySelected}\n handleChange={onToggle}\n size={12}\n border=\"var(--ps-grey-2)\"\n dataTest=\"label-filter-item-checkbox\"\n disabled={isDisabled}\n disabledCheckedBackground={Variables.Colors.cloudyBlue}\n />\n <NameInput\n isSelected={isSelected || isPartiallySelected}\n isDisabled={isDisabled}\n hasChildren={hasChildren}\n readOnly={true}\n value={label.name}\n title={label.name}\n data-test=\"label-filter-item-name\"\n />\n </Container>\n {!!children && <ChildContainer>{children}</ChildContainer>}\n </>\n );\n}\n\nexport default LabelsFilterItemView;\n","import { useHandleSelectLabels } from '../../../../../labels/tools';\nimport LabelsFilterItemView from './view'\nimport { LabelsFilterItemProps } from './types';\nimport { useCallback } from 'react';\n\nfunction LabelsFilterItemController({\n label,\n allLabels,\n openLabels,\n selectedLabels,\n isDisabled,\n onToggleCollapse,\n onSelect,\n}: LabelsFilterItemProps) {\n const handleSelectLabels = useHandleSelectLabels();\n\n const isSelected = selectedLabels.includes(label.id);\n const isPartiallySelected = selectedLabels.includes(-label.id);\n const isOpen = openLabels.includes(label.id);\n const hasChildren = !!label.children && label.children.length > 0;\n\n const handleToggle = useCallback(() => {\n onSelect(\n handleSelectLabels(label, selectedLabels, allLabels)\n );\n }, [allLabels, handleSelectLabels, label, selectedLabels, onSelect]);\n\n return (\n <>\n <LabelsFilterItemView\n label={label}\n hasChildren={hasChildren}\n isSelected={isSelected}\n isPartiallySelected={isPartiallySelected}\n isOpen={isOpen}\n isDisabled={isDisabled}\n onToggle={handleToggle}\n onToggleCollapse={onToggleCollapse}\n >\n {hasChildren && isOpen && (\n label.children!.map((childLabel) => (\n <LabelsFilterItemController\n key={childLabel.id}\n label={childLabel}\n allLabels={allLabels}\n openLabels={openLabels}\n selectedLabels={selectedLabels}\n onToggleCollapse={onToggleCollapse}\n onSelect={onSelect}\n isDisabled={isDisabled}\n />\n ))\n )}\n </LabelsFilterItemView>\n </>\n );\n}\n\nexport default LabelsFilterItemController;","import { isEmpty } from 'lodash';\nimport { EmptyState } from '../../../../ui/components/EmptyStates';\nimport { FilterSkeleton } from '../../../../ui/components/Skeleton';\nimport NoSearchResult from '../../../../ui/icons/NoSearchResult';\nimport { FilterContainer } from '../../filter-container';\nimport { LabelsFilterViewProps } from './types';\nimport {\n Container,\n SkeletonContainer,\n EmptyStateContainer,\n ListContainer,\n CounterContainer,\n SelectionCounter,\n ToggleAllSelection,\n} from './styles';\nimport { LabelsFilterItem } from './components/labels-filter-item';\nimport NoLabels from '../../../../ui/icons/NoLabels';\nimport { pluralize } from '../../../../helpers/functions/pluralize';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\n\nfunction LabelsFilterView({\n loading,\n labels,\n allLabels,\n openLabels,\n selectedLabels,\n isAllSelected,\n isInSearch,\n isDisabled,\n onToggleCollapse,\n onSelect,\n onToggleAll,\n onSearch,\n}: LabelsFilterViewProps) {\n return (\n <FilterContainer\n headerProps={{\n storeKey: SearchableFilterHeaderKey.LABELS,\n title: 'Labels',\n hasSearch: true,\n isDisabled,\n disableSearch: isEmpty(labels) && !isInSearch,\n onSearch: onSearch,\n isLoading: loading,\n }}\n >\n <Container>\n {loading ? (\n <SkeletonContainer>\n <FilterSkeleton />\n </SkeletonContainer>\n ) : isEmpty(labels) ? (\n <EmptyStateContainer>\n <EmptyState\n fontSize={11}\n icon={isInSearch ? NoSearchResult : NoLabels}\n iconStyle={{\n width: 32,\n height: 32,\n marginBottom: 4,\n }}\n dataTest=\"no-labels\"\n >\n {isInSearch ? 'No Search Results' : 'No Labels yet'}\n </EmptyState>\n </EmptyStateContainer>\n ) : (\n <>\n <CounterContainer>\n <SelectionCounter data-test=\"labels-selection-counter\">\n {selectedLabels?.length\n ? `${pluralize(\n selectedLabels.length,\n 'item'\n )} selected`\n : 'No Items selected'}\n </SelectionCounter>\n <ToggleAllSelection\n onClick={onToggleAll}\n data-test={\n isAllSelected\n ? 'labels-unselect-all'\n : 'labels-select-all'\n }\n isDisabled={isDisabled}\n >\n {isAllSelected ? 'Unselect All' : 'Select All'}\n </ToggleAllSelection>\n </CounterContainer>\n <ListContainer>\n {labels.map(label => {\n return (\n <LabelsFilterItem\n allLabels={allLabels}\n key={label.id}\n label={label}\n openLabels={openLabels}\n selectedLabels={selectedLabels}\n isDisabled={isDisabled}\n onSelect={onSelect}\n onToggleCollapse={onToggleCollapse}\n />\n );\n })}\n </ListContainer>\n </>\n )}\n </Container>\n </FilterContainer>\n );\n}\n\nexport default LabelsFilterView;","import { useCallback, useMemo, useState } from 'react';\nimport { compose } from 'redux';\nimport { Label } from '../../../../constants/interfaces/Label';\nimport { listToTree } from '../../../../helpers/functions/list-to-tree';\nimport { treeToArray } from '../../../../helpers/functions/tree-to-list';\nimport useQueryParamListener from '../../../../helpers/hooks/useQueryParamListener';\nimport { useSetQueryParam } from '../../../../helpers/hooks/useSetQueryParam';\nimport { filterLabels, sortLabels } from '../../../labels/tools';\nimport {\n useResetCollapseAllLabels,\n useSelectLabels,\n useToggleCollapseAllLabels,\n useToggleCollapseLabel,\n} from '../../../portableLabels/store/hors/withLabels/services';\n import { useLabelsState } from '../../../portableLabels/store/hors/withLabels/states';\n import { usePortableLabelsState } from '../../../portableLabels/store/states';\nimport { useFilterHeaderState } from '../../searchable-filter-header/store/reducers';\nimport { SearchableFilterHeaderKey } from '../../searchable-filter-header/store/types';\nimport { LABELS_QUERY_PARAM_NAME } from './constants';\nimport { useLabelsFilterState } from './store/reducers';\nimport LabelsFilterView from './view';\nimport { isEqual } from 'lodash';\n\nfunction LabelsFilterController() {\n const { selected: selectedLabels, collapsed: openLabels } = useLabelsState();\n const { isDisabled } = useLabelsFilterState();\n const { data, loading } = usePortableLabelsState();\n const { searchTerm } = useFilterHeaderState()[SearchableFilterHeaderKey.LABELS] ?? {};\n const toggleCollapse = useToggleCollapseLabel();\n const toggleCollapseAll = useToggleCollapseAllLabels();\n const resetCollapsed = useResetCollapseAllLabels() \n const select = useSelectLabels();\n const setQueryParam = useSetQueryParam();\n\n const [processedIds, setProcessedIds] = useState<number[]>([]);\n\n const processedLabels = useMemo(() => {\n const result = compose<Label[]>(\n filterLabels(searchTerm ?? ''),\n sortLabels\n )(listToTree(data?.items));\n\n if (result.length > 0) {\n const filteredAndSortedLabelsArray = treeToArray(result);\n const processedDataIds = filteredAndSortedLabelsArray.map((item: any) => item.id!)\n setProcessedIds(processedDataIds);\n }\n\n return result;\n }, [data?.items, searchTerm]);\n\n const isAllSelected = selectedLabels.length === processedIds.length;\n const isInSearch = !!searchTerm && searchTerm.length > 0;\n\n const setSelectedLabels = useCallback((labelIds: number[]) => {\n const paramValue = labelIds.join(',');\n setQueryParam(LABELS_QUERY_PARAM_NAME, paramValue);\n select(labelIds);\n }, [select, setQueryParam]);\n\n const handleToggleAll = useCallback(() => {\n if (isDisabled) return;\n\n if (isAllSelected) {\n resetCollapsed();\n setSelectedLabels([]);\n } else {\n if (searchTerm) {\n setSelectedLabels(processedIds);\n }\n else {\n setSelectedLabels(processedIds);\n }\n }\n }, [isDisabled, isAllSelected, resetCollapsed, setSelectedLabels, searchTerm, processedIds]);\n\n const handleSearch = useCallback((term: string) => {\n if (term) {\n toggleCollapseAll();\n }\n }, [toggleCollapseAll]);\n\n useQueryParamListener(LABELS_QUERY_PARAM_NAME, labelIds => {\n const ids = labelIds?.length ? labelIds.split(',').map(id => Number(id)) : []\n if (!isEqual(selectedLabels, ids)) {\n select(ids);\n }\n });\n\n return (\n <LabelsFilterView\n loading={loading}\n labels={processedLabels}\n allLabels={data.items}\n openLabels={openLabels}\n selectedLabels={selectedLabels}\n isAllSelected={isAllSelected}\n isInSearch={isInSearch}\n isDisabled={isDisabled}\n onToggleCollapse={toggleCollapse}\n onSelect={setSelectedLabels}\n onToggleAll={handleToggleAll}\n onSearch={handleSearch}\n />\n );\n}\n\nexport default LabelsFilterController;","import { Action } from 'redux';\n\nexport enum ACTIONS {\n SELECT_YEAR = 'SELECT_YEAR',\n SELECT_MONTH = 'SELECT_MONTH',\n CLEAR_YEAR_AND_MONTH = 'CLEAR_YEAR_AND_MONTH',\n DISABLE_MONTH_FILTER = 'DISABLE_MONTH_FILTER'\n}\n\nexport type SelectYearAction = Action<ACTIONS.SELECT_YEAR> & {\n year: number;\n};\n\nexport const selectYear = (\n year: number\n): SelectYearAction => ({\n type: ACTIONS.SELECT_YEAR,\n year,\n});\n\nexport type SelectMonthAction = Action<ACTIONS.SELECT_MONTH> & {\n year: number;\n month: number;\n};\n\nexport const selectMonth = (\n year: number,\n month: number\n): SelectMonthAction => ({\n type: ACTIONS.SELECT_MONTH,\n year,\n month\n});\n\nexport type ClearYearAndMonthAction = Action<ACTIONS.CLEAR_YEAR_AND_MONTH> & {};\n\nexport const clearYearAndMonth = (\n): ClearYearAndMonthAction => ({\n type: ACTIONS.CLEAR_YEAR_AND_MONTH,\n});\n\nexport type DisableMonthFilterAction = Action<ACTIONS.DISABLE_MONTH_FILTER> & {\n isDisabled: boolean;\n};\n\nexport const disableMonthFilter = (\n isDisabled: boolean\n): DisableMonthFilterAction => ({\n type: ACTIONS.DISABLE_MONTH_FILTER,\n isDisabled,\n});\n\nexport type MonthFilterActions = SelectYearAction\n | SelectMonthAction\n | ClearYearAndMonthAction\n | DisableMonthFilterAction;","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, MonthFilterActions } from './actions';\nimport { MonthFilterState } from './types';\n\nexport const monthFilterReducer: Reducer<\n MonthFilterState,\n MonthFilterActions\n> = (state = { isDisabled: false }, action) => {\n switch (action.type) {\n case ACTIONS.SELECT_YEAR:\n return {\n ...state,\n currentYear: action.year,\n };\n case ACTIONS.SELECT_MONTH:\n return {\n ...state,\n selectedMonth: action.month,\n selectedYear: action.year,\n };\n case ACTIONS.CLEAR_YEAR_AND_MONTH:\n return {\n ...state,\n currentYear: undefined,\n selectedMonth: undefined,\n selectedYear: undefined,\n };\n case ACTIONS.DISABLE_MONTH_FILTER:\n return {\n ...state,\n isDisabled: action.isDisabled,\n }\n default:\n return state;\n }\n};\n\nexport const useMonthFilterState = () =>\n useSelector(state => state.monthFilter);\n","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport {\n selectYear,\n selectMonth,\n clearYearAndMonth,\n disableMonthFilter\n} from './actions';\n\nexport const useSelectYear = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (year: number) => {\n dispatch(selectYear(year));\n },\n [dispatch]\n );\n};\n\nexport const useSelectMonth = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (year: number, month: number) => {\n dispatch(selectMonth(year, month));\n },\n [dispatch]\n );\n};\n\nexport const useClearYearAndMonth = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(clearYearAndMonth());\n }, [dispatch]);\n};\n\nexport const useDisableMonthFilter = () => {\n const dispatch = useDispatch();\n\n return useCallback((isDisabled: boolean) => {\n dispatch(disableMonthFilter(isDisabled));\n }, [dispatch]);\n}","import styled from 'styled-components';\n\nexport const Container = styled.div<{\n isDisabled: boolean;\n isSelected: boolean;\n}>`\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 63px;\n height: 36px;\n color: ${props => \n props.isSelected\n ? 'var(--ps-white-1)'\n : props.isDisabled\n ? 'var(--ps-grey-2)'\n : 'var(--ps-black-main)'\n };\n border-radius: 2px;\n cursor: ${props => props.isDisabled ? 'default' : 'pointer'};\n background: ${props => \n props.isSelected\n ? (props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-blue-main)')\n : 'var(--ps-white-1)'\n };\n\n &:hover {\n ${props => !props.isDisabled && !props.isSelected ? 'background: var(--ps-grey-3);' : ''}\n }\n`;\n\nexport const Underline = styled.div<{\n isDisabled: boolean;\n isSelected: boolean;\n}>`\n width: 27px;\n height: 2px;\n margin: 2px 0 0;\n background: ${props =>\n props.isSelected\n ? 'var(--ps-white-1)'\n : (props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-black-main)')\n };\n position: absolute;\n bottom: 5px;\n`;","import {\n Container,\n Underline,\n} from './styles';\nimport { MonthItemViewProps } from './types';\n\nfunction MonthItemView({\n title, isDisabled, isSelected, isCurrent, onSelect\n}: MonthItemViewProps) {\n return (\n <Container\n isDisabled={isDisabled}\n isSelected={isSelected}\n onClick={onSelect}\n data-test={\n isSelected\n ? \"selected-month\"\n : isCurrent\n ? \"current-month\"\n : \"month-item\"\n }\n >\n {title}\n {isCurrent && <Underline\n isSelected={isSelected}\n isDisabled={isDisabled}\n data-text=\"current-month-underline\"\n />}\n </Container>\n );\n}\n\nexport default MonthItemView;","export const MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n];","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n width: 265px;\n`;","import { MonthItem } from '../month-item';\nimport { MONTHS } from './constants';\nimport { Container } from './styles';\nimport { MonthSelectorViewProps } from './types';\n\nfunction MonthSelectorView({\n isDisabledMonth,\n isSelectedMonth,\n isCurrentMonth,\n onSelectMonth,\n}: MonthSelectorViewProps) {\n return (\n <Container>\n {MONTHS.map((title, index) => (\n <MonthItem\n title={title}\n isDisabled={isDisabledMonth(index)}\n isSelected={isSelectedMonth(index)}\n onSelect={() => onSelectMonth(index)}\n isCurrent={isCurrentMonth(index)}\n />\n ))}\n </Container>\n );\n}\n\nexport default MonthSelectorView;","import { useCallback, useMemo } from \"react\";\nimport { MonthSelectorProps } from \"./types\";\nimport MonthSelectorView from \"./view\";\n\nfunction MonthSelector({\n selectedYear,\n selectedMonth,\n currentYear,\n isDisabled,\n onSelect\n}: MonthSelectorProps) {\n const presentYear = useMemo(() => new Date().getFullYear(), []);\n const presentMonth = useMemo(() => new Date().getMonth(), []);\n\n const isDisabledMonth = useCallback((month: number) => {\n return currentYear > presentYear || (currentYear === presentYear && month > presentMonth) || isDisabled;\n }, [currentYear, isDisabled, presentMonth, presentYear]);\n\n const isSelectedMonth = useCallback((month: number) => {\n return month === selectedMonth && currentYear === selectedYear;\n }, [currentYear, selectedMonth, selectedYear]);\n\n const isCurrentMonth = useCallback((month: number) => {\n return month === presentMonth && currentYear === presentYear;\n }, [presentMonth, currentYear, presentYear]);\n\n const handleSelectMonth = useCallback((month: number) => {\n if (!isDisabledMonth(month)) {\n onSelect(month);\n }\n }, [isDisabledMonth, onSelect]);\n \n return (\n <MonthSelectorView\n isDisabledMonth={isDisabledMonth}\n isSelectedMonth={isSelectedMonth}\n isCurrentMonth={isCurrentMonth}\n onSelectMonth={handleSelectMonth}\n />\n );\n}\n\nexport default MonthSelector;","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const YearLeftArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"17\"\n viewBox=\"0 0 16 17\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m11 14.5-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n );\n }\n);\n\nexport default YearLeftArrow;\n","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const YearRightArrow = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n className={className}\n width=\"16\"\n height=\"17\"\n viewBox=\"0 0 16 17\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m5 3 6 6-6 6\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n );\n }\n);\n\nexport default YearRightArrow;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const ArrowContainer = styled.div<{ isAvailable: boolean }>`\n display: flex;\n cursor: ${props => props.isAvailable ? 'pointer' : 'default'};\n color: ${props => props.isAvailable ? 'var(--ps-blue-main)' : 'var(--ps-grey-2)'};\n`\n\nexport const Year = styled.div<{ isDisabled: boolean }>`\n font-size: 18px;\n font-weight: bold;\n color: ${props => props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-black-main)'};\n padding: 0 12px;\n`;","import YearLeftArrow from '../../../../../../ui/icons/YearLeftArrow';\nimport YearRightArrow from '../../../../../../ui/icons/YearRightArrow';\nimport {\n Container,\n ArrowContainer,\n Year,\n} from './styles';\nimport { YearSelectorViewProps } from './types';\n\nfunction YearSelectorView({\n selectedYear,\n isNextAvailable,\n isPrevAvailable,\n isDisabled,\n onNext,\n onPrev\n}: YearSelectorViewProps) {\n return (\n <Container>\n <ArrowContainer\n isAvailable={isPrevAvailable}\n onClick={onPrev}\n data-test=\"prev-year-button\"\n >\n <YearLeftArrow />\n </ArrowContainer>\n <Year data-test=\"current-year-text\" isDisabled={isDisabled}>{selectedYear}</Year>\n <ArrowContainer\n isAvailable={isNextAvailable}\n onClick={onNext}\n data-test=\"next-year-button\"\n >\n <YearRightArrow />\n </ArrowContainer>\n </Container>\n );\n}\n\nexport default YearSelectorView;","import { useCallback, useMemo } from 'react';\nimport { YearSelectorProps } from './types';\nimport YearSelectorView from './view';\n\nfunction YearSelector({\n selectedYear,\n minYear,\n isDisabled,\n onChange,\n}: YearSelectorProps) {\n const presentYear = useMemo(() => new Date().getFullYear(), []);\n const isNextAvailable = selectedYear < presentYear && !isDisabled;\n const isPrevAvailable = selectedYear >= minYear && !isDisabled;\n\n const handlePrev = useCallback(() => {\n if (isPrevAvailable) {\n onChange(selectedYear - 1);\n }\n }, [isPrevAvailable, onChange, selectedYear]);\n\n const handleNext = useCallback(() => {\n if (isNextAvailable) {\n onChange(selectedYear + 1);\n }\n }, [isNextAvailable, onChange, selectedYear]);\n \n return (\n <YearSelectorView\n selectedYear={selectedYear}\n isNextAvailable={isNextAvailable}\n isPrevAvailable={isPrevAvailable}\n isDisabled={isDisabled}\n onPrev={handlePrev}\n onNext={handleNext}\n />\n );\n}\n\nexport default YearSelector;","export const MIN_MONTH_FILTER_YEAR = 2015;\nexport const MONTH_DATE_QUERY_PARAM_NAME = 'date';","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 15px;\n padding-bottom: 16px;\n`;\n\nexport const MonthSelectorContainer = styled.div`\n padding-top: 12px;\n`;","import { FilterContainer } from '../../filter-container';\nimport { MonthSelector } from './components/month-selector';\nimport { YearSelector } from './components/year-selector';\nimport { MIN_MONTH_FILTER_YEAR } from './constants';\nimport {\n Container,\n MonthSelectorContainer,\n} from './styles';\nimport { MonthFilterViewProps } from './types';\n\nfunction MonthFilterView({\n selectedMonth,\n selectedYear,\n currentYear,\n isDisabled,\n onSelectYear,\n onSelectMonth,\n}: MonthFilterViewProps) {\n return (\n <FilterContainer\n headerProps={{\n title: 'Month',\n isDisabled\n }}\n >\n <Container>\n <YearSelector\n selectedYear={currentYear}\n minYear={MIN_MONTH_FILTER_YEAR}\n isDisabled={isDisabled}\n onChange={onSelectYear}\n />\n <MonthSelectorContainer>\n <MonthSelector\n selectedYear={selectedYear}\n selectedMonth={selectedMonth}\n currentYear={currentYear}\n isDisabled={isDisabled}\n onSelect={onSelectMonth}\n />\n </MonthSelectorContainer>\n </Container>\n </FilterContainer>\n );\n}\n\nexport default MonthFilterView;","import { useCallback, useMemo } from \"react\";\nimport { useMonthFilterState } from \"./store/reducers\";\nimport { useSelectMonth, useSelectYear } from \"./store/services\";\nimport MonthFilterView from \"./view\";\nimport { useSetQueryParam } from \"../../../../helpers/hooks/useSetQueryParam\";\nimport { MONTH_DATE_QUERY_PARAM_NAME } from \"./constants\";\nimport useQueryParamListener from \"../../../../helpers/hooks/useQueryParamListener\";\nimport dayjs from \"dayjs\";\n\nfunction MonthFilter() {\n const { selectedYear, selectedMonth, currentYear, isDisabled } = useMonthFilterState();\n const selectYear = useSelectYear();\n const selectMonth = useSelectMonth();\n const setQueryParam = useSetQueryParam();\n\n const presentYear = useMemo(() => new Date().getFullYear(), []);\n const currentOrPresentYear = currentYear ?? selectedYear ?? presentYear;\n\n const handleSelectMonth = useCallback((month) => {\n setQueryParam(\n MONTH_DATE_QUERY_PARAM_NAME,\n dayjs(new Date(currentOrPresentYear, month, 1)).format('YYYY-MM-DD')\n );\n selectMonth(currentOrPresentYear, month);\n }, [currentOrPresentYear, selectMonth, setQueryParam]);\n\n useQueryParamListener(MONTH_DATE_QUERY_PARAM_NAME, value => {\n if (value) {\n const date = dayjs(value);\n if (date.isValid() && (date.year() !== selectedYear || date.month() !== selectedMonth)) {\n selectMonth(date.year(), date.month());\n }\n }\n })\n \n return (\n <MonthFilterView\n selectedYear={selectedYear}\n selectedMonth={selectedMonth}\n currentYear={currentOrPresentYear}\n isDisabled={isDisabled}\n onSelectYear={selectYear}\n onSelectMonth={handleSelectMonth}\n />\n );\n}\n\nexport default MonthFilter;","import { Action } from 'redux';\nimport { DateRangeType } from '../types';\n\nexport enum ACTIONS {\n SELECT_DATE_RANGE = 'SELECT_DATE_RANGE',\n CLEAR_DATE_RANGE = 'CLEAR_DATE_RANGE',\n}\n\nexport type SelectDateRangeAction = Action<ACTIONS.SELECT_DATE_RANGE> & {\n dateRange?: DateRangeType;\n};\n\nexport const selectDateRange = (\n dateRange: DateRangeType\n): SelectDateRangeAction => ({\n type: ACTIONS.SELECT_DATE_RANGE,\n dateRange,\n});\n\nexport type ClearDateRangeAction = Action<ACTIONS.CLEAR_DATE_RANGE> & {};\n\nexport const clearDateRange = (\n): ClearDateRangeAction => ({\n type: ACTIONS.CLEAR_DATE_RANGE,\n});\n\nexport type DateRangeFilterActions = SelectDateRangeAction | ClearDateRangeAction;","import { Reducer } from 'redux';\nimport { useSelector } from 'react-redux';\n\nimport { ACTIONS, DateRangeFilterActions } from './actions';\nimport { DateRangeFilterState } from './types';\n\nexport const dateRangeFilterReducer: Reducer<\n DateRangeFilterState,\n DateRangeFilterActions\n> = (state = {}, action) => {\n switch (action.type) {\n case ACTIONS.SELECT_DATE_RANGE:\n return {\n ...state,\n dateRange: action.dateRange,\n };\n case ACTIONS.CLEAR_DATE_RANGE:\n return {\n ...state,\n dateRange: undefined,\n };\n default:\n return state;\n }\n};\n\nexport const useDateRangeState = () =>\n useSelector(state => state.dateRange);\n","import { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { DateRangeType } from '../types';\n\nimport {selectDateRange, clearDateRange} from './actions';\n\nexport const useSelectDateRange = () => {\n const dispatch = useDispatch();\n\n return useCallback(\n (dateRange: DateRangeType) => {\n dispatch(selectDateRange(dateRange));\n },\n [dispatch]\n );\n};\n\nexport const useResetDateRange = () => {\n const dispatch = useDispatch();\n\n return useCallback(() => {\n dispatch(clearDateRange());\n }, [dispatch]);\n};\n","import styled from 'styled-components';\n\nexport const StyledCalendarSection = styled.div`\n width: 100%;\n padding: 0 18px 0 18px;\n`;\n\nexport const StyledCalendarContainer = styled.div`\n display: flex;\n align-items: start;\n flex-direction: column;\n\n width: 310px;\n min-height: 326px;\n padding-top: 25px;\n\n border-radius: 4px;\n box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.1);\n background: var(--ps-white-1);\n\n .react-calendar__navigation .react-calendar__navigation__label {\n font-size: 18px;\n padding-left: 14px;\n padding-right: 14px;\n width: 200px;\n }\n\n .react-calendar__navigation__arrow react-calendar__navigation__prev-button, .react-calendar__navigation__arrow react-calendar__navigation__next-button {\n width: 6px;\n height: 12px; \n }\n\n .react-calendar__month-view__weekdays .react-calendar__month-view__weekdays__weekday {\n font-size: 15px;\n font-weight: 800;\n }\n\n .react-calendar__month-view__days .react-calendar__month-view__days__day {\n font-size: 15px;\n abbr {\n color: var(--ps-black-main);\n }\n }\n\n .react-calendar__tile.react-calendar__tile--now.react-calendar__month-view__days__day {\n abbr {\n color: var(--ps-black-main);\n border-bottom: 2px solid var(--ps-black-main);\n width: 24px;\n height: 20px;\n background: none;\n }\n }\n\n .react-calendar__tile.react-calendar__tile--now.react-calendar__month-view__days__day.react-calendar__tile--rangeEnd {\n background: var(--ps-blue-main);\n abbr {\n color: var(--ps-white-1);\n border-bottom: 2px solid var(--ps-white-1)\n };\n }\n\n .react-calendar__month-view__days .react-calendar__month-view__days__day:disabled {\n background: none;\n abbr {\n color: var(--ps-grey-2);\n }\n }\n\n .react-calendar__month-view__days .react-calendar__tile--range {\n abbr {\n color: var(--ps-white-1);\n }\n }\n`;\n\nexport const ClearText = styled.div<{isDisabled: boolean}>`\n margin-bottom: 20px;\n font-size: 13px;\n font-weight: 500;\n cursor: ${({isDisabled}) => isDisabled ? 'default': 'pointer'};\n color: ${({isDisabled}) => isDisabled ? 'var(--ps-grey-2)': 'var(--ps-blue-main)'};\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-left: 25px;\n width: 52px;\n`;","import { CustomCalendar } from \"../../../../ui/components/Calendar\";\nimport { FilterContainer } from \"../../filter-container\";\nimport { ClearText, StyledCalendarContainer, StyledCalendarSection } from './styles';\nimport { TrashBin } from '../../../../ui/icons/TrashBin';\nimport { DateFilterViewProps } from './types';\nimport dayjs from \"dayjs\";\n\nfunction DateFilterView({\n dateRange,\n handleSelectDate,\n isDisabled,\n resetDate\n}: DateFilterViewProps) {\n const subHeader = dateRange?.start && dateRange?.end ? `${dayjs(new Date(dateRange.start)).format('MM/DD/YY')} - ${dayjs(new Date(dateRange.end)).format('MM/DD/YY')}` : 'MM/DD/YY – MM/DD/YY';\n \n return <FilterContainer\n headerProps={{\n title: 'Date Range',\n subHeader\n }}>\n <StyledCalendarContainer>\n <StyledCalendarSection>\n <CustomCalendar\n value={dateRange || { start: null, end: null }}\n handleChange={handleSelectDate}\n selectRange={true}\n restrictPast={false}\n restrictFuture={true}\n />\n </StyledCalendarSection>\n <ClearText\n onClick={(e) => {\n if (isDisabled) return;\n e.stopPropagation();\n resetDate();\n }}\n isDisabled={isDisabled}\n data-test=\"date-range-filter-clear\"\n >\n <TrashBin />Clear\n </ClearText>\n </StyledCalendarContainer>\n </FilterContainer>\n}\n\nexport default DateFilterView;","import { useCallback } from \"react\";\nimport { useRemoveQueryParam, useSetQueryParam } from \"../../../../helpers/hooks/useSetQueryParam\";\nimport dayjs from \"dayjs\";\nimport { DATE_RANGE_PARAM_NAME } from \"./constants\";\nimport { useDateRangeState } from \"./store/reducers\";\nimport { useResetDateRange, useSelectDateRange } from \"./store/services\";\nimport useQueryParamListener from \"../../../../helpers/hooks/useQueryParamListener\";\nimport DateFilterView from \"./view\";\nimport { DateRangeType } from \"./types\";\nimport { isEqual } from \"lodash\";\n\nfunction DateRangeFilter() {\n const { dateRange } = useDateRangeState();\n const selectDateRange = useSelectDateRange();\n const resetReduxDateRange = useResetDateRange();\n const setQueryParam = useSetQueryParam();\n const resetDateRange = useRemoveQueryParam();\n\n const handleSelectDate = useCallback((date: DateRangeType) => {\n setQueryParam(\n DATE_RANGE_PARAM_NAME,\n `${dayjs(date.start!).format('YYYY-MM-DD')},${dayjs(date.end!).format('YYYY-MM-DD')}`,\n );\n selectDateRange(date);\n }, [selectDateRange, setQueryParam]);\n\n const resetDate = useCallback(() => {\n resetReduxDateRange();\n resetDateRange(DATE_RANGE_PARAM_NAME);\n }, [resetReduxDateRange, resetDateRange]);\n\n const isDisabled = !(dateRange?.start || dateRange?.end);\n useQueryParamListener(DATE_RANGE_PARAM_NAME, value => {\n if (value) {\n const [start, end] = value.split(',');\n const startDate = dayjs(start).toDate();\n const endDate = dayjs(end).endOf('d').toDate();\n if (!isEqual(startDate, dateRange?.start) || !isEqual(endDate, dateRange?.end)) {\n selectDateRange({ start: startDate, end: endDate });\n }\n }\n })\n\n return (\n <DateFilterView dateRange={dateRange} resetDate={resetDate} handleSelectDate={handleSelectDate} isDisabled={isDisabled} />\n );\n}\n\nexport default DateRangeFilter;","import { PractisSetFilter } from './practis-set-filter';\nimport { SingleSelectTeamFilter } from './single-team-filter';\nimport { MultipleSelectTeamsFilter } from './multiple-teams-filter';\nimport {\n DynamicFilterComponentListType,\n DynamicFilterControllerProps,\n} from './types';\nimport { LabelsFilter } from './labels-filter';\nimport { MonthFilter } from './month-filter';\nimport { DateFilter } from './date-filter';\n\nconst DynamicFilterComponentList: DynamicFilterComponentListType = {\n SINGLE_SELECT_TEAM: <SingleSelectTeamFilter />,\n MULTIPLE_SELECT_TEAMS: <MultipleSelectTeamsFilter />,\n PRACTIS_SET: <PractisSetFilter />,\n LABELS: <LabelsFilter />,\n MONTH: <MonthFilter />,\n DATE: <DateFilter />\n};\n\nfunction DynamicFilterController(props: DynamicFilterControllerProps) {\n const { filterType } = props;\n\n return (\n DynamicFilterComponentList[filterType] || (\n <div>[DEV]: Please define a correct filter type!</div>\n )\n );\n}\n\nexport default DynamicFilterController;","import styled from 'styled-components';\n\nexport const Wrapper = styled.div<{ headerHeight: string }>`\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 360px;\n height: calc(100vh - ${props => props.headerHeight});\n box-shadow: 0 10px 10px 0 rgba(0, 0, 0, 0.12);\n background-color: var(--ps-white-1);\n`;\n\nexport const DynamicFiltersContainer = styled.div`\n padding: 24px 24px 0 24px;\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n`;\n\nexport const DynamicFilterWrapper = styled.div`\n margin-bottom: 12px;\n`;\n\nexport const StyledDivider = styled.hr`\n margin-bottom: 12px;\n background-color: var(--ps-grey-4);\n width: 100%;\n height: 1px;\n border: none;\n`;\n\nexport const ControlPanelContainer = styled.div`\n padding: 0 24px 12px 24px;\n`;","import ReportingControlPanel from '../../../ui/components/ReportingControlPanel';\nimport { DynamicFilter } from '../dynamic-filter';\nimport {\n Wrapper,\n DynamicFiltersContainer,\n DynamicFilterWrapper,\n StyledDivider,\n ControlPanelContainer,\n} from './styles';\nimport { FiltersSidebarViewProps } from './types';\n\nfunction FiltersSidebarView(props: FiltersSidebarViewProps) {\n const {\n filtersConfig,\n onGenerateReport,\n onClearFilters,\n controlPanelMode,\n userEmail,\n remainingTimeout,\n headerHeight,\n } = props;\n\n return (\n <Wrapper headerHeight={headerHeight}>\n <DynamicFiltersContainer>\n {filtersConfig.map(({ filterType }, index) => (\n <DynamicFilterWrapper key={index}>\n <DynamicFilter filterType={filterType} />\n </DynamicFilterWrapper>\n ))}\n </DynamicFiltersContainer>\n <div>\n <StyledDivider />\n <ControlPanelContainer>\n <ReportingControlPanel\n mode={controlPanelMode}\n userEmail={userEmail}\n onSubmit={onGenerateReport}\n onClear={onClearFilters}\n remainingTimeout={remainingTimeout}\n />\n </ControlPanelContainer>\n </div>\n </Wrapper>\n );\n}\n\nexport default FiltersSidebarView;","import { useSelector } from 'react-redux';\n\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport { FiltersSidebarControllerProps } from './types';\nimport FiltersSidebarView from './view';\n\nfunction FiltersSidebarController(props: FiltersSidebarControllerProps) {\n const {\n filtersConfig,\n controlPanelMode,\n onClearFilters,\n onGenerateReport,\n remainingTimeout,\n headerHeight,\n } = props;\n const meProfile = useSelector(getProfileState);\n\n return (\n <FiltersSidebarView\n filtersConfig={filtersConfig}\n onGenerateReport={onGenerateReport}\n onClearFilters={onClearFilters}\n userEmail={meProfile?.email || ''}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight={headerHeight}\n />\n );\n}\n\nexport default FiltersSidebarController;","import { SidebarFiltersConfig } from '../../../features/filters/filters-sidebar/types';\n\nexport const PractisSetSummaryReportFiltersConfig: SidebarFiltersConfig[] = [\n {\n filterType: 'SINGLE_SELECT_TEAM',\n },\n {\n filterType: 'PRACTIS_SET',\n },\n];","import styled from 'styled-components';\n\nexport const PractisSetSummaryReportSubHeader = styled.div`\n font-size: 13px;\n color: var(--ps-black-main);\n`;","import { FiltersSidebar } from '../../../features/filters/filters-sidebar';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { PractisSetSummaryReportFiltersConfig } from './constants';\nimport { PractisSetSummaryReportSubHeader } from './styles';\nimport { PractisSetSummaryReportViewProps } from './types';\n\nfunction PractisSetSummaryReportView(props: PractisSetSummaryReportViewProps) {\n const {\n onClearFilters,\n onGenerateReport,\n controlPanelMode,\n remainingTimeout,\n } = props;\n\n return (\n <MainWrapper\n title=\"Reports\"\n subTitle=\"Practis Set Summary\"\n subHeader={\n <PractisSetSummaryReportSubHeader data-test=\"practis-set-summary-page-description\">\n Understand progress for a specific Practis Set.\n </PractisSetSummaryReportSubHeader>\n }\n htmlPageTitle=\"Reports - Practis\"\n useGoBack\n headerMinHeight=\"124px\"\n headerPadding=\"0 24px\"\n contentPadding=\"0\"\n isScrollable={false}\n contentSize={false}\n dataTest=\"practis-set-summary\"\n >\n <FiltersSidebar\n filtersConfig={PractisSetSummaryReportFiltersConfig}\n onClearFilters={onClearFilters}\n onGenerateReport={onGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight=\"124px\"\n />\n </MainWrapper>\n );\n}\n\nexport default PractisSetSummaryReportView;","import { useCallback, useEffect, useMemo } from 'react';\nimport { useHistory } from '../../../tools/router';\nimport { isEmpty } from 'lodash';\n\nimport { ReportType } from '../../../constants/interfaces/ReportItem';\nimport { useClearPractisSetFilter, useDisablePractisSetFilter } from '../../../features/filters/dynamic-filter/practis-set-filter/store/services';\nimport { useSingleTeamFilterState } from '../../../features/filters/dynamic-filter/single-team-filter/store/reducers';\nimport { useClearSingleTeamFilter, useDisableSingleTeamFilter } from '../../../features/filters/dynamic-filter/single-team-filter/store/services';\nimport { useGenerateReportService } from '../../../features/filters/filters-sidebar/services';\nimport { useClearTrainerPractisSet } from '../../../features/teams/store/services';\nimport { useTrainerPractisSetState } from '../../../features/teams/store/states';\nimport { ReportingControlPanelMode } from '../../../ui/components/ReportingControlPanel/types';\nimport PractisSetSummaryReportView from './view';\nimport { usePractisSetFilterState } from '../../../features/filters/dynamic-filter/practis-set-filter/store/reducers';\nimport ROUTES from '../../../routes/routes';\n\nfunction PractisSetSummaryReportController() {\n const { isGenerating, remainingTimeout, generateReport } =\n useGenerateReportService();\n const clearTrainerPractisSetData = useClearTrainerPractisSet();\n const clearSingleTeamFilter = useClearSingleTeamFilter();\n const disableSingleTeamFilter = useDisableSingleTeamFilter();\n const clearPractisSetFilter = useClearPractisSetFilter();\n const disablePractisSetFilter = useDisablePractisSetFilter();\n const { selectedTeamId } = useSingleTeamFilterState();\n const { selectedPractisSetId } = usePractisSetFilterState();\n const { data } = useTrainerPractisSetState();\n const history = useHistory();\n \n const onClearFilters = useCallback(\n (isCalledFromUnmount?: boolean) => {\n Promise.resolve().then(() => {\n clearTrainerPractisSetData();\n clearSingleTeamFilter();\n clearPractisSetFilter();\n });\n \n if (!isCalledFromUnmount) {\n history.replace(ROUTES.REPORTS.PRACTIS_SET_SUMMARY_REPORT);\n }\n },\n [clearTrainerPractisSetData, clearSingleTeamFilter, clearPractisSetFilter, history]\n );\n\n const controlPanelMode: ReportingControlPanelMode = useMemo(() => {\n const statusMap = {\n timeout: () => remainingTimeout,\n disabled: () => !selectedTeamId || !selectedPractisSetId,\n loading: () => isGenerating,\n noData: () => isEmpty(data?.items),\n };\n\n for (const [status, condition] of Object.entries(statusMap)) {\n if (condition()) {\n return status as ReportingControlPanelMode;\n }\n }\n\n return 'enabled';\n }, [\n remainingTimeout,\n selectedTeamId,\n selectedPractisSetId,\n isGenerating,\n data?.items,\n ]);\n\n const handleGeneratePractisSetSummaryReport = useCallback(() => {\n if (selectedTeamId && selectedPractisSetId) {\n generateReport(ReportType.PRACTIS_SET_SUMMARY, {\n team: selectedTeamId,\n practisSet: selectedPractisSetId,\n });\n }\n }, [generateReport, selectedPractisSetId, selectedTeamId]);\n\n useEffect(() => {\n clearTrainerPractisSetData();\n\n return () => {\n onClearFilters(true);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n disableSingleTeamFilter(isGenerating);\n disablePractisSetFilter(isGenerating);\n }, [disablePractisSetFilter, disableSingleTeamFilter, isGenerating]);\n\n return (\n <PractisSetSummaryReportView\n onClearFilters={onClearFilters}\n onGenerateReport={handleGeneratePractisSetSummaryReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n />\n );\n}\n\nexport default PractisSetSummaryReportController;","import { SidebarFiltersConfig } from '../../../features/filters/filters-sidebar/types';\n\nexport const UserActivityReportFiltersConfig: SidebarFiltersConfig[] = [\n {\n filterType: 'MULTIPLE_SELECT_TEAMS',\n },\n {\n filterType: 'LABELS',\n }\n];","import styled from 'styled-components';\n\nexport const SubHeader = styled.div`\n font-size: 13px;\n color: var(--ps-black-main);\n`;","import { FiltersSidebar } from '../../../features/filters/filters-sidebar';\nimport ROUTES from '../../../routes/routes';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { UserActivityReportFiltersConfig } from './constants';\nimport { SubHeader } from './styles';\nimport { UserActivityReportViewProps } from './types';\n\nfunction UserActivityReportView({\n onClearFilters, onGenerateReport, controlPanelMode, remainingTimeout\n}: UserActivityReportViewProps) {\n return (\n <MainWrapper\n title=\"Reports\"\n subTitle=\"User Activity\"\n subHeader={\n <SubHeader data-test=\"user-activity-report-page-description\">\n Understand your team(s) progress on all their Practis Sets.\n </SubHeader>\n }\n htmlPageTitle=\"Reports - Practis\"\n goBackUrl={ROUTES.REPORTS.LIST_OF_REPORTS}\n headerPadding=\"0 24px\"\n headerMinHeight=\"124px\"\n contentPadding=\"0\"\n isScrollable={false}\n contentSize={false}\n dataTest=\"user-activity-report\"\n >\n <FiltersSidebar\n filtersConfig={UserActivityReportFiltersConfig}\n onClearFilters={onClearFilters}\n onGenerateReport={onGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight=\"124px\"\n />\n </MainWrapper>\n );\n}\n\nexport default UserActivityReportView;","import { useCallback } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { useSelectLabels } from \"../../../../portableLabels/store/hors/withLabels/services\";\nimport { useSetFilterHeaderSearchActive } from \"../../../searchable-filter-header/store/services\";\nimport { SearchableFilterHeaderKey } from \"../../../searchable-filter-header/store/types\";\nimport { disableLabelsFilter } from \"./actions\";\n\nexport const useClearLabelsFilter = () => {\n const selectLabels = useSelectLabels();\n const setLabelsSearchActive = useSetFilterHeaderSearchActive(SearchableFilterHeaderKey.LABELS);\n\n return useCallback(() => {\n selectLabels([]);\n setLabelsSearchActive(false);\n }, [selectLabels, setLabelsSearchActive]);\n};\n\nexport const useDisableLabelsFilter = () => {\n const dispatch = useDispatch();\n\n return useCallback((isDisabled: boolean) => {\n dispatch(disableLabelsFilter(isDisabled));\n }, [dispatch]);\n}","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { useMultipleTeamsFilterState } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/reducers';\nimport { useGenerateReportService, useGetReportAvailabilityService } from '../../../features/filters/filters-sidebar/services';\nimport { ReportingControlPanelMode } from '../../../ui/components/ReportingControlPanel/types';\nimport UserActivityReportView from './view';\nimport { useTeamsState } from '../../../features/teams/store/states';\nimport { usePortableLabelsState } from '../../../features/portableLabels/store/states';\nimport { useLabelsState } from '../../../features/portableLabels/store/hors/withLabels/states';\nimport { WithLabelsContext } from '../../../features/portableLabels';\nimport { ReportType } from '../../../constants/interfaces/ReportItem';\nimport { useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\nimport { useClearMultipleTeamsFilter, useDisableMultipleTeamsFilter } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/services';\nimport { useClearLabelsFilter, useDisableLabelsFilter } from '../../../features/filters/dynamic-filter/labels-filter/store/services';\n\nfunction UserActivityReportController() {\n const { isGenerating, remainingTimeout, generateReport } = useGenerateReportService();\n const { isAvailable, getReportAvailability } = useGetReportAvailabilityService();\n const { selectedTeamIds } = useMultipleTeamsFilterState();\n const { loading: isTeamsLoading } = useTeamsState();\n const { loading: isLabelsLoading } = usePortableLabelsState();\n const { selected: selectedLabels } = useLabelsState();\n const clearMultipleTeamsFilter = useClearMultipleTeamsFilter();\n const disableMultipleTeamsFilter = useDisableMultipleTeamsFilter();\n const clearLabelsFilter = useClearLabelsFilter();\n const disableLabelsFilter = useDisableLabelsFilter();\n const history = useHistory();\n\n const handleClearFilters = useCallback(() => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n history.replace(ROUTES.REPORTS.USER_ACTIVITY_REPORT);\n }, [clearLabelsFilter, clearMultipleTeamsFilter, history]);\n\n const controlPanelMode: ReportingControlPanelMode = useMemo(() => {\n if (remainingTimeout) {\n return 'timeout';\n }\n \n if (isTeamsLoading || isLabelsLoading || isGenerating) {\n return 'loading';\n }\n\n if (!selectedTeamIds?.length && !selectedLabels.length) {\n return 'disabled';\n }\n\n if (!isAvailable) {\n return 'noData';\n }\n\n return 'enabled';\n }, [remainingTimeout, isTeamsLoading, isLabelsLoading, isGenerating, selectedTeamIds?.length, selectedLabels.length, isAvailable]);\n\n const getReportParams = useCallback(() => {\n if (!selectedTeamIds?.length && !selectedLabels?.length) return;\n return {\n teams: selectedTeamIds ?? [],\n labels: selectedLabels?.length\n ? selectedLabels.filter(id => id > 0)\n : selectedLabels\n }\n }, [selectedLabels, selectedTeamIds]);\n\n const handleGenerateReport = useCallback(() => {\n const params = getReportParams();\n if (params) {\n generateReport(ReportType.USERS_ACTIVITY, params);\n }\n }, [generateReport, getReportParams]);\n\n useEffect(() => {\n return () => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const params = getReportParams();\n if (params) {\n getReportAvailability(ReportType.USERS_ACTIVITY, params);\n }\n }, [getReportAvailability, getReportParams]);\n\n useEffect(() => {\n disableMultipleTeamsFilter(isGenerating);\n disableLabelsFilter(isGenerating);\n }, [disableLabelsFilter, disableMultipleTeamsFilter, isGenerating]);\n\n return (\n <UserActivityReportView\n onClearFilters={handleClearFilters}\n onGenerateReport={handleGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n />\n );\n}\n\nfunction UserActivityReportWithLabelsContext() {\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'labelsFilter' }}>\n <UserActivityReportController />\n </WithLabelsContext.Provider>\n );\n}\n\nexport default UserActivityReportWithLabelsContext;","import { SidebarFiltersConfig } from '../../../features/filters/filters-sidebar/types';\n\nexport const TeamLeaderActivityReportFiltersConfig: SidebarFiltersConfig[] = [\n {\n filterType: 'MULTIPLE_SELECT_TEAMS',\n },\n {\n filterType: 'LABELS',\n },\n {\n filterType: 'DATE',\n }\n];","import styled from 'styled-components';\n\nexport const SubHeader = styled.div`\n font-size: 13px;\n color: var(--ps-black-main);\n`;","import { FiltersSidebar } from '../../../features/filters/filters-sidebar';\nimport ROUTES from '../../../routes/routes';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { TeamLeaderActivityReportFiltersConfig } from './constants';\nimport { SubHeader } from './styles';\nimport { TeamLeaderActivityReportViewProps } from './types';\n\nfunction TeamLeaderActivityReportView({\n onClearFilters, onGenerateReport, controlPanelMode, remainingTimeout\n}: TeamLeaderActivityReportViewProps) {\n return (\n <MainWrapper\n title=\"Reports\"\n subTitle=\"Team Leader Engagement\"\n subHeader={\n <SubHeader data-test=\"team-leader-report-page-description\">\n How engaged are Team Leaders in their learner's training.\n </SubHeader>\n }\n htmlPageTitle=\"Reports - Practis\"\n goBackUrl={ROUTES.REPORTS.LIST_OF_REPORTS}\n headerPadding=\"0 24px\"\n headerMinHeight=\"124px\"\n contentPadding=\"0\"\n isScrollable={false}\n contentSize={false}\n dataTest=\"team-leader-report\"\n >\n <FiltersSidebar\n filtersConfig={TeamLeaderActivityReportFiltersConfig}\n onClearFilters={onClearFilters}\n onGenerateReport={onGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight=\"124px\"\n />\n </MainWrapper>\n );\n}\n\nexport default TeamLeaderActivityReportView;","import { SidebarFiltersConfig } from '../../../features/filters/filters-sidebar/types';\n\nexport const DATE_FORMAT = 'YYYY-MM-DD';\n\nexport const BillingReportFiltersConfig: SidebarFiltersConfig[] = [\n {\n filterType: 'MONTH',\n }\n];","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { useMultipleTeamsFilterState } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/reducers';\nimport { useGenerateReportService, useGetReportAvailabilityService } from '../../../features/filters/filters-sidebar/services';\nimport { ReportingControlPanelMode } from '../../../ui/components/ReportingControlPanel/types';\nimport TeamLeaderActivityReportView from './view';\nimport { useTeamsState } from '../../../features/teams/store/states';\nimport { usePortableLabelsState } from '../../../features/portableLabels/store/states';\nimport { useLabelsState } from '../../../features/portableLabels/store/hors/withLabels/states';\nimport { WithLabelsContext } from '../../../features/portableLabels';\nimport { ReportType } from '../../../constants/interfaces/ReportItem';\nimport { useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\nimport { useClearMultipleTeamsFilter, useDisableMultipleTeamsFilter } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/services';\nimport { useClearLabelsFilter, useDisableLabelsFilter } from '../../../features/filters/dynamic-filter/labels-filter/store/services';\nimport { useDateRangeState } from '../../../features/filters/dynamic-filter/date-filter/store/reducers';\nimport { useResetDateRange } from '../../../features/filters/dynamic-filter/date-filter/store/services';\nimport { DATE_FORMAT } from '../BillingReport/constants';\nimport dayjs from 'dayjs';\n\nfunction TeamLeaderActivityReportController() {\n const { isGenerating, remainingTimeout, generateReport } = useGenerateReportService();\n const { isAvailable, getReportAvailability } = useGetReportAvailabilityService();\n const { selectedTeamIds } = useMultipleTeamsFilterState();\n const { loading: isTeamsLoading } = useTeamsState();\n const { loading: isLabelsLoading } = usePortableLabelsState();\n const { selected: selectedLabels } = useLabelsState();\n const { dateRange } = useDateRangeState();\n const clearMultipleTeamsFilter = useClearMultipleTeamsFilter();\n const disableMultipleTeamsFilter = useDisableMultipleTeamsFilter();\n const clearLabelsFilter = useClearLabelsFilter();\n const clearDateRangeFilter = useResetDateRange();\n const disableLabelsFilter = useDisableLabelsFilter();\n const history = useHistory();\n\n const isDisabled = (!selectedTeamIds?.length && !selectedLabels.length)\n || !(dateRange?.start && dateRange?.end);\n\n const handleClearFilters = useCallback(() => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n clearDateRangeFilter()\n history.replace(ROUTES.REPORTS.TEAM_LEADER_ACTIVITY_REPORT);\n }, [clearLabelsFilter, clearMultipleTeamsFilter, clearDateRangeFilter, history]);\n\n const controlPanelMode: ReportingControlPanelMode = useMemo(() => {\n if (remainingTimeout) {\n return 'timeout';\n }\n \n if (isTeamsLoading || isLabelsLoading || isGenerating) {\n return 'loading';\n }\n\n if (isDisabled) {\n return 'disabled';\n }\n\n if (!isAvailable) {\n return 'noData';\n }\n\n return 'enabled';\n }, [remainingTimeout, isTeamsLoading, isLabelsLoading, isGenerating, isDisabled, isAvailable]);\n\n const getReportParams = useCallback(() => {\n if (isDisabled) return;\n return {\n teams: selectedTeamIds ?? [],\n labels: selectedLabels?.length\n ? selectedLabels.filter(id => id > 0)\n : selectedLabels,\n dateStart: dateRange?.start && dayjs(new Date(dateRange?.start)).format(DATE_FORMAT),\n dateEnd: dateRange?.end && dayjs(new Date(dateRange?.end)).format(DATE_FORMAT)\n }\n }, [selectedLabels, selectedTeamIds, dateRange, isDisabled]);\n\n const handleGenerateReport = useCallback(() => {\n const params = getReportParams();\n if (params) {\n generateReport(ReportType.TEAM_LEADER_ACTIVITY, params);\n }\n }, [generateReport, getReportParams]);\n\n useEffect(() => {\n return () => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n clearDateRangeFilter();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const params = getReportParams();\n if (params) {\n getReportAvailability(ReportType.TEAM_LEADER_ACTIVITY, params);\n }\n }, [getReportAvailability, getReportParams]);\n\n useEffect(() => {\n disableMultipleTeamsFilter(isGenerating);\n disableLabelsFilter(isGenerating);\n }, [disableLabelsFilter, disableMultipleTeamsFilter, isGenerating]);\n\n return (\n <TeamLeaderActivityReportView\n onClearFilters={handleClearFilters}\n onGenerateReport={handleGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n />\n );\n}\n\nfunction UserActivityReportWithLabelsContext() {\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'labelsFilter' }}>\n <TeamLeaderActivityReportController />\n </WithLabelsContext.Provider>\n );\n}\n\nexport default UserActivityReportWithLabelsContext;","import styled from 'styled-components';\n\nexport const SubHeader = styled.div`\n font-size: 13px;\n color: var(--ps-black-main);\n`;","import { FiltersSidebar } from '../../../features/filters/filters-sidebar';\nimport ROUTES from '../../../routes/routes';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { BillingReportFiltersConfig } from './constants';\nimport { SubHeader } from './styles';\nimport { BillingReportViewProps } from './types';\n\nfunction BillingReportView({\n onClearFilters, onGenerateReport, controlPanelMode, remainingTimeout\n}: BillingReportViewProps) {\n return (\n <MainWrapper\n title=\"Reports\"\n subTitle=\"Billing Report\"\n subHeader={\n <SubHeader data-test=\"billing-report-page-description\">\n Generate a list of monthly active users on the platform.\n </SubHeader>\n }\n htmlPageTitle=\"Reports - Practis\"\n goBackUrl={ROUTES.REPORTS.LIST_OF_REPORTS}\n headerPadding=\"0 24px\"\n headerMinHeight=\"124px\"\n contentPadding=\"0\"\n isScrollable={false}\n contentSize={false}\n dataTest=\"billing-report\"\n >\n <FiltersSidebar\n filtersConfig={BillingReportFiltersConfig}\n onClearFilters={onClearFilters}\n onGenerateReport={onGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight=\"124px\"\n />\n </MainWrapper>\n );\n}\n\nexport default BillingReportView;","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { useGenerateReportService, useGetReportAvailabilityService } from '../../../features/filters/filters-sidebar/services';\nimport { ReportingControlPanelMode } from '../../../ui/components/ReportingControlPanel/types';\nimport BillingReportView from './view';\nimport { ReportType } from '../../../constants/interfaces/ReportItem';\nimport { useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\nimport { useMonthFilterState } from '../../../features/filters/dynamic-filter/month-filter/store/reducers';\nimport { useClearYearAndMonth, useDisableMonthFilter } from '../../../features/filters/dynamic-filter/month-filter/store/services';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from '../../CompanySettings/store/reducers';\nimport dayjs from 'dayjs';\nimport { DATE_FORMAT } from './constants';\n\nfunction BillingReportController() {\n const { isGenerating, remainingTimeout, generateReport } = useGenerateReportService();\n const { isAvailable, getReportAvailability } = useGetReportAvailabilityService();\n const { selectedYear, selectedMonth } = useMonthFilterState();\n const clearYearAndMonth = useClearYearAndMonth();\n const disableMonthFilter = useDisableMonthFilter();\n const company = useSelector(getCompanyState);\n const history = useHistory();\n\n const handleClearFilters = useCallback(() => {\n clearYearAndMonth();\n history.replace(ROUTES.REPORTS.BILLING_REPORT);\n }, [clearYearAndMonth, history]);\n\n const controlPanelMode: ReportingControlPanelMode = useMemo(() => {\n if (remainingTimeout) {\n return 'timeout';\n }\n \n if (isGenerating) {\n return 'loading';\n }\n\n if (typeof selectedMonth === 'undefined') {\n return 'disabled';\n }\n\n if (!isAvailable) {\n return 'noData';\n }\n\n return 'enabled';\n }, [remainingTimeout, isGenerating, selectedMonth, isAvailable]);\n\n const getReportParams = useCallback(() => {\n if (typeof selectedMonth === 'undefined') return;\n const dateStart = dayjs(new Date(selectedYear!, selectedMonth, 1));\n const dateEnd = dateStart.add(1, 'month');\n if (!company?.id) return;\n return {\n companyId: company.id,\n dateStart: dateStart.format(DATE_FORMAT),\n dateEnd: dateEnd.format(DATE_FORMAT),\n };\n }, [company?.id, selectedMonth, selectedYear]);\n\n const handleGenerateReport = useCallback(() => {\n const params = getReportParams();\n if (params) {\n generateReport(ReportType.BILLING, params);\n }\n }, [generateReport, getReportParams]);\n\n useEffect(() => {\n return () => {\n clearYearAndMonth()\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const params = getReportParams();\n if (params) {\n getReportAvailability(ReportType.BILLING, params);\n }\n }, [getReportAvailability, getReportParams]);\n\n useEffect(() => {\n disableMonthFilter(isGenerating);\n }, [disableMonthFilter, isGenerating]);\n\n return (\n <BillingReportView\n onClearFilters={handleClearFilters}\n onGenerateReport={handleGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n />\n );\n}\n\nexport default BillingReportController;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const DetailsNav = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#fh3wk325da)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1.5 14.25c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25v12.5zM1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.75.75 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.75.75 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75h-3zM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75zM3.75 6a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h-.5zM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75zM7.75 9a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h-.5zM7 6.75A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75zM7.75 3a.75.75 0 0 0 0 1.5h.5a.75.75 0 0 0 0-1.5h-.5z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"fh3wk325da\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default DetailsNav;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Seats = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5.441 3.5a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-3.5 2A3.5 3.5 0 1 1 7.84 8.05a5.507 5.507 0 0 1 3.034 4.083.75.75 0 1 1-1.482.235 4.001 4.001 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.043 8.05 3.49 3.49 0 0 1 1.941 5.5zm9-1.5a.75.75 0 1 0 0 1.5 1.5 1.5 0 0 1 .666 2.844.75.75 0 0 0-.416.672v.352a.75.75 0 0 0 .574.73c1.2.29 2.162 1.2 2.522 2.372a.75.75 0 1 0 1.434-.44 5.01 5.01 0 0 0-2.56-3.012A3 3 0 0 0 10.941 4z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n\nexport default Seats;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const LogoNav = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#shsp2nykna)\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"currentColor\">\n <path d=\"M0 14.25C0 15.216.784 16 1.75 16h12.5A1.75 1.75 0 0 0 16 14.25V1.75A1.75 1.75 0 0 0 14.25 0H1.75A1.75 1.75 0 0 0 0 1.75v12.5zm1.75.25a.25.25 0 0 1-.25-.25V1.75a.25.25 0 0 1 .25-.25h12.5a.25.25 0 0 1 .25.25v12.5a.25.25 0 0 1-.25.25H1.75z\"/>\n <path d=\"M4 7.18C4 4.873 5.79 3 8 3s4 1.872 4 4.18c0 2.31-1.79 4.182-4 4.182H6.022L4 13.108V7.18zm6.013-.004c0-1.19-.913-2.154-2.038-2.154-1.126 0-2.039.964-2.039 2.154v2.155h2.039c1.114 0 2.02-.946 2.037-2.12v-.035z\"/>\n </g>\n <defs>\n <clipPath id=\"shsp2nykna\">\n <path fill=\"#fff\" transform=\"rotate(-90 8 8)\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default LogoNav;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Voice = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <g clip-path=\"url(#7jt8yiv5ra)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m4.852.878 2.852 4.888a.25.25 0 0 1-.147.366l-2.807.802V8.25H.25V9a4.759 4.759 0 0 0 3.18 4.487A4.269 4.269 0 0 1 1 14.25v1.5c1.797 0 3.51-.848 4.592-2.288a.757.757 0 0 0-.606-1.212 3.246 3.246 0 0 1-3.149-2.5H6.25V8.066l1.719-.491a1.75 1.75 0 0 0 1.03-2.565L6.15.122 4.851.878zM1 2.5a1.5 1.5 0 1 0 3 0 1.5 1.5 0 0 0-3 0zm9.508 8.163c0-1.018-.32-1.959-.864-2.731l1.227-.864a6.225 6.225 0 0 1 1.137 3.595c0 1.51-.537 2.897-1.43 3.978l-1.156-.955a4.727 4.727 0 0 0 1.086-3.023zm1.379-4.231c.63.896 1.62 2.327 1.62 4.231 0 2.257-.86 3.482-1.585 4.36l1.156.955c.847-1.025 1.93-2.579 1.93-5.315 0-2.405-1.248-4.177-1.882-5.076l-.013-.019-1.226.864z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"7jt8yiv5ra\">\n <path fill=\"#fff\" transform=\"matrix(-1 0 0 1 15 0)\" d=\"M0 0h15v16H0z\"/>\n </clipPath>\n </defs>\n </svg>\n );\n }\n);\n\nexport default Voice;\n","import { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\n\nexport const ModalTitle = styled.div`\n padding: 8px 50px 8px 24px;\n font-size: 18px;\n font-weight: 800;\n color: var(--ps-black-main);\n`;\n\nexport const CompanyName = styled.span`\n font-weight: 400;\n`;\n\nexport const ModalContent = styled.div`\n display: flex;\n flex-direction: row;\n min-height: 215px;\n`;\n\nexport const ModalSidebar = styled.div`\n width: 190px;\n background-color: var(--ps-grey-3);\n border-right: 1px solid var(--ps-grey-4);\n border-bottom-left-radius: 8px;\n`;\n\nexport const NavigationItem = styled(NavLink)`\n margin-top: 18px;\n padding-left: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n font-size: 13px;\n color: var(--ps-grey-1);\n display: flex;\n text-decoration: none;\n position: relative;\n\n &:first-child {\n margin-top: 24px;\n }\n\n &.is-active {\n font-weight: bold;\n color: var(--ps-black-main);\n\n &::before {\n width: 4px;\n height: 24px;\n background: var(--ps-black-main);\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n border-radius: 0 10px 10px 0;\n }\n\n div {\n color: var(--ps-black-main);\n }\n }\n`;\n\nexport const NavigationIcon = styled.div`\n width: 16px;\n height: 16px;\n color: var(--ps-grey-1);\n margin-right: 12px;\n`;\n\nexport const TabContent = styled.div`\n width: 600px;\n min-height: 630px;\n`;","import { Form } from 'formik';\nimport styled from 'styled-components';\n\nexport const StyledForm = styled(Form)`\n height: 100%;\n`;\n\nexport const Content = styled.div`\n height: calc(100% - 65px);\n padding: 24px;\n box-sizing: border-box;\n`;\n\nexport const FieldContainer = styled.div`\n height: 84px;\n width: 400px;\n\n & input:disabled {\n color: var(--ps-grey-1);\n }\n\n .company-select {\n width: 400px;\n border: solid 1px var(--ps-grey-3);\n\n &.company-select-open {\n border: solid 1px var(--ps-grey-2);\n }\n\n .company-select-input > div {\n color: var(--ps-black-main);\n }\n\n .content-area {\n padding: 8px 0;\n\n > div {\n padding: 5px 12px;\n border-radius: 0;\n margin-bottom: 0;\n min-height: auto;\n font-weight: 400;\n\n &.selected-item {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n\n &:hover {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n }\n }\n }\n\n .company-select-label {\n left: 12px;\n }\n\n .company-select-arrow {\n right: 12px;\n }\n\n .company-select-input {\n padding: 0 12px;\n }\n`;\n\nexport const FieldName = styled.div`\n font-size: 13px;\n font-weight: 800;\n color: var(--ps-black-main);\n padding-bottom: 4px;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n border-top: 1px solid var(--ps-grey-4);\n align-items: center;\n padding-right: 24px;\n height: 64px;\n`;","import * as Yup from 'yup';\n\nexport const COMPANY_NAME_MAX_LENGTH = 80;\n\nexport const MAX_LENGTH_EXCEEDED_TEXT = 'Character limit reached'\n\nexport const ValidationSchema = Yup.object().shape({\n name: Yup.string()\n .required('Company name is required')\n .max(COMPANY_NAME_MAX_LENGTH, MAX_LENGTH_EXCEEDED_TEXT),\n});\n\nexport const NAME_ALREADY_EXISTS_ERROR = 'Entity \"company:name\" already exists';\n\nexport const API_ERROR_MESSAGE = {\n [NAME_ALREADY_EXISTS_ERROR]: 'The company name is taken',\n}\n\nexport const NO_ACCOUNT_OWNER_TEXT = 'No Account Owner';","import styled from 'styled-components';\n\nexport const StyledFormikField = styled.div`\n width: 100%;\n flex: 1;\n`;\n\nexport const StyledErrorContainer = styled.div`\n color: ${props => props.theme.Colors.coral};\n font-weight: 500;\n font-size: 13px;\n padding: 8px 5px 0 27px;\n`;\n","import { getIn } from 'formik';\n\nimport PractisSelect from '../Select/Select';\nimport { StyledErrorContainer, StyledFormikField } from './style';\nimport { SelectProps } from './type';\n\nconst FormikSelect = ({\n form,\n field,\n items,\n label,\n disabled,\n height,\n fontSize,\n dataTest,\n ...props\n}: SelectProps) => {\n let errorContent;\n const error = getIn(form.errors, field.name);\n const touch = getIn(form.touched, field.name);\n\n errorContent = touch && error && (\n <StyledErrorContainer>{error}</StyledErrorContainer>\n );\n\n return (\n <StyledFormikField data-test={dataTest}>\n <PractisSelect\n {...field}\n field={field}\n items={items}\n label={label}\n disabled={disabled}\n height={height}\n fontSize={fontSize}\n error={touch && error}\n dataTest={dataTest}\n {...props}\n />\n {errorContent}\n </StyledFormikField>\n );\n};\n\nexport default FormikSelect;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n position: relative;\n`;\n\nexport const Input = styled.input<{ counter?: number, showError: boolean, suffix?: string }>`\n width: 100%;\n height: 40px;\n padding: 11px 12px;\n padding-right: ${props => props.suffix ? `${8 + props.suffix.length * 8.4}px` : '12px'};\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-black-main);\n border-radius: 4px;\n border: solid 1px ${props => props.showError ? 'var(--ps-red-main)' : 'var(--ps-grey-3)'};\n background-color: var(--ps-grey-3);\n box-sizing: border-box;\n\n &:focus {\n border: solid 1px ${props => props.showError ? 'var(--ps-red-main)' : 'var(--ps-grey-2)'};\n ${props => typeof props.counter === 'number'\n ? `padding-right: ${props.suffix\n ? `${4 + (props.counter.toString().length + props.suffix.length) * 8.4}px`\n : `${15 + (props.counter.toString().length) * 8.4}px`\n };`\n : ''\n }\n\n & + div > div {\n display: block;\n }\n }\n\n &:disabled {\n color: var(--ps-grey-2);\n }\n`;\n\nexport const SuffixContainer = styled.div`\n display: flex;\n flex-direction: row;\n position: absolute;\n right: 0;\n top: 0;\n`;\n\nexport const Counter = styled.div<{ isMaxLengthExceeded: boolean, hasSuffix: boolean }>`\n display: none;\n margin-top: 11px;\n margin-right: ${props => props.hasSuffix ? '8px' : '12px'};\n font-size: 13px;\n color: ${props => props.isMaxLengthExceeded ? 'var(--ps-red-main)' : 'var(--ps-grey-1)'};\n`;\n\nexport const Suffix = styled.div<{ isMaxLengthExceeded: boolean }>`\n margin-top: 8px;\n margin-right: 8px;\n height: 24px;\n padding: 3px 0 3px 8px;\n font-size: 13px;\n line-height: 18px;\n color: var(--ps-grey-1);\n border-left: 1px solid ${props => props.isMaxLengthExceeded ? 'var(--ps-red-main)' : 'var(--ps-grey-2)'};\n`;\n\nexport const Label = styled.div`\n color: var(--ps-grey-1);\n font-size: 11px;\n line-height: 16px;\n font-weight: 500;\n`;\n\nexport const Error = styled.div`\n color: var(--ps-red-main);\n font-size: 11px;\n line-height: 16px;\n font-weight: 500;\n`;","import { kebabCase } from 'lodash';\n\nexport const encodeStringForAttribute = (value: string, maxLenght: number = 35, maxWords: number = 6) => {\n const encodedValue = kebabCase(value);\n if (encodedValue.length <= maxLenght) {\n return encodedValue;\n }\n const words = encodedValue.split('-');\n return words.slice(0, maxWords).join('-');\n}","import {\n Container,\n Input,\n Counter,\n Suffix,\n Label,\n Error,\n SuffixContainer,\n} from './styles';\nimport { encodeStringForAttribute } from './tools';\nimport { CustomizedInputViewProps } from './types';\n\nfunction CustomizedInputView({\n field,\n inputRef,\n remainingLength,\n isMaxLengthExceeded,\n suffix,\n label,\n showError,\n error,\n disabled,\n onChange,\n dataTest,\n}: CustomizedInputViewProps) {\n const hasCounter = typeof remainingLength === 'number';\n return (\n <Container>\n <Input\n {...field}\n ref={inputRef}\n counter={remainingLength}\n suffix={suffix}\n showError={showError}\n disabled={disabled}\n onChange={onChange}\n data-test={dataTest && `${dataTest}-input`}\n />\n <SuffixContainer>\n {hasCounter && <Counter\n isMaxLengthExceeded={isMaxLengthExceeded}\n hasSuffix={!!suffix}\n data-test={dataTest && `${dataTest}-counter`}\n >\n {remainingLength}\n </Counter>\n }\n {suffix && (\n <Suffix\n isMaxLengthExceeded={isMaxLengthExceeded}\n data-test={dataTest && `${dataTest}-suffix`}\n >\n {suffix}\n </Suffix>\n )}\n </SuffixContainer>\n {showError && (\n <Error data-test={`${encodeStringForAttribute(error)}-error`}>{error}</Error>\n )}\n {label && !showError && (\n <Label data-test={dataTest && `${dataTest}-label`}>{label}</Label>\n )}\n </Container>\n );\n}\n\nexport default CustomizedInputView;","import { getIn } from 'formik'\nimport { ChangeEvent, useCallback, useEffect, useRef } from 'react';\nimport { CustomizedInputProps } from './types';\nimport CustomizedInputView from './view';\n\nfunction CustomizedInput({\n form,\n field,\n maxLength,\n autoFocus,\n suffix,\n label,\n disabled,\n transformValue,\n dataTest,\n}: CustomizedInputProps) {\n const error = getIn(form.errors, field.name);\n const isTouched = !!getIn(form.touched, field.name);\n const remainingLength = maxLength ? Math.max(maxLength - field.value?.length, 0) : undefined;\n const isMaxLengthExceeded = !!maxLength && maxLength < field.value?.length;\n const showError = (isTouched || isMaxLengthExceeded) && !!error;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const targetValue = e.target?.value;\n const value = transformValue ? transformValue(targetValue) : targetValue;\n form.setFieldValue(field.name, value);\n }, [field.name, form, transformValue]);\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus]);\n\n return (\n <CustomizedInputView\n remainingLength={remainingLength}\n field={field}\n inputRef={inputRef}\n suffix={suffix}\n label={label}\n isMaxLengthExceeded={isMaxLengthExceeded}\n showError={showError}\n error={error}\n disabled={disabled}\n onChange={handleChange}\n dataTest={dataTest}\n />\n );\n}\n\nexport default CustomizedInput;","import { Field, Formik } from 'formik';\nimport {\n StyledForm,\n FieldContainer,\n FieldName,\n Footer,\n Content,\n} from './styles';\nimport { Button } from '../../../../ui/components/Button';\nimport { CompanyDetailsViewProps, CompanyDetailsFormValues } from './types';\nimport { ValidationSchema } from './constants';\nimport { FormikSelect } from '../../../../ui/components/FormikSelect';\nimport { CustomizedInput } from '../../../../ui/components/CustomizedInput';\n\nfunction CompanyDetailsView({\n formRef,\n initialValues,\n companyAdminItems,\n onSubmit,\n onApiResultValidation,\n}: CompanyDetailsViewProps) {\n return (\n <Formik<CompanyDetailsFormValues>\n ref={formRef}\n initialValues={initialValues}\n onSubmit={onSubmit}\n validationSchema={ValidationSchema}\n validate={onApiResultValidation}\n >\n {({ values, dirty, isValid, isSubmitting, handleChange }) => {\n return (\n <StyledForm>\n <Content>\n <FieldContainer>\n <FieldName data-test=\"company-name-title\">Name</FieldName>\n <Field\n name=\"name\"\n component={CustomizedInput}\n maxLength={80}\n height=\"40px\"\n disabled={isSubmitting}\n dataTest=\"company-name-input\"\n />\n </FieldContainer>\n <FieldContainer>\n <FieldName data-test=\"workspace-url-title\">Workspace URL</FieldName>\n <Field\n name=\"workspaceUrl\"\n component={CustomizedInput}\n height=\"40px\"\n disabled={true}\n dataTest=\"workspace-url-input\"\n />\n </FieldContainer>\n <FieldContainer>\n <FieldName data-test=\"account-owner-title\">Account Owner</FieldName>\n <Field\n type=\"text\"\n items={companyAdminItems}\n value={values.ownerId}\n component={FormikSelect}\n onChange={handleChange}\n height={40}\n variant=\"outlined\"\n name=\"ownerId\"\n className=\"company-select\"\n dataTest=\"account-owner-dropdown\"\n />\n </FieldContainer>\n </Content>\n <Footer>\n <Button\n width=\"130px\"\n height=\"40px\"\n disabled={!dirty || !isValid || isSubmitting}\n loadingColor=\"white\"\n loadingSize={24}\n loading={isSubmitting}\n dataTest=\"apply-button\"\n >\n Apply\n </Button>\n </Footer>\n </StyledForm>\n );\n }}\n </Formik>\n )\n}\n\nexport default CompanyDetailsView;","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport CompanyDetailsView from './view';\nimport { ApiValidationError, CompanyAdminSelectItem, CompanyDetailsFormValues, CompanyDetailsProps } from './types';\nimport { useClearCompanyAdmins, useGetCompanyAdmins } from '../../store/services';\nimport { useUserRolesState } from '../../../../features/roles/store/states';\nimport { useLoadUserRolesService } from '../../../../features/roles/store/services';\nimport { useCompanyAdminsState } from '../../store/states';\nimport { useUpdateCompanyNameApi, useSetCompanyOwnerApi } from '../../../../api';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { API_ERROR_MESSAGE, NAME_ALREADY_EXISTS_ERROR, NO_ACCOUNT_OWNER_TEXT } from './constants';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\n\nfunction CompanyDetails({ company, onCompanyUpdate }: CompanyDetailsProps) {\n const formRef = useRef<any>(null);\n const [nameApiError, setNameApiError] = useState<ApiValidationError | undefined>();\n const companyAdmins = useCompanyAdminsState().data;\n const getCompanyAdmins = useGetCompanyAdmins();\n const userRoles = useUserRolesState();\n const loadUserRoles = useLoadUserRolesService();\n const updateCompanyNameApi = useUpdateCompanyNameApi();\n const setCompanyOwnerApi = useSetCompanyOwnerApi();\n const clearCompanyAdmins = useClearCompanyAdmins();\n const showMessage = useShowMessage();\n\n const companyAdminItems = useMemo(() => {\n if (!companyAdmins) return;\n const emptyItem = { name: NO_ACCOUNT_OWNER_TEXT, value: null } as CompanyAdminSelectItem;\n const mainItems = companyAdmins.map(admin => ({\n name: admin.firstName + ' ' + admin.lastName,\n value: admin.id,\n }));\n return [emptyItem].concat(mainItems);\n }, [companyAdmins]);\n\n const initialValues = useMemo(() => {\n return {\n name: company.name,\n workspaceUrl: company.subdomain ? `${company.subdomain}.gopractis.com` : '',\n ownerId: !!company.owner?.id && !!companyAdminItems?.find(item => item.value === company.owner!.id)\n ? company.owner.id\n : null\n } as CompanyDetailsFormValues\n }, [company.name, company.owner, company.subdomain, companyAdminItems]);\n\n const handleApiResultValidation = useCallback((values: CompanyDetailsFormValues) => {\n const errors: Record<string, string> = {};\n if (values.name === nameApiError?.paramValue) {\n errors.name = nameApiError.error;\n }\n return errors;\n }, [nameApiError]);\n\n const handleError = useCallback((e: ErrorResult, values: CompanyDetailsFormValues) => {\n switch(e.message) {\n case NAME_ALREADY_EXISTS_ERROR:\n setNameApiError({\n paramValue: values.name,\n error: API_ERROR_MESSAGE[NAME_ALREADY_EXISTS_ERROR]\n });\n break;\n default:\n showMessage(e.message, 'error');\n break;\n }\n formRef.current.setSubmitting(false);\n formRef.current.validateForm();\n }, [showMessage]);\n\n const handleSubmit = useCallback((values: CompanyDetailsFormValues) => {\n const companyNamePromise = company.name?.toLowerCase() !== values.name.toLowerCase()\n ? updateCompanyNameApi(company.id!, values.name)\n : Promise.resolve();\n companyNamePromise\n .then(() => {\n const isOwnerChanged = !!company.owner?.id\n ? company.owner?.id !== values.ownerId\n : !!values.ownerId;\n const ownerPromise = isOwnerChanged\n ? setCompanyOwnerApi(company.id!, values.ownerId!)\n : Promise.resolve();\n ownerPromise\n .then(() => {\n formRef.current.setSubmitting(false);\n formRef.current.resetForm(values);\n onCompanyUpdate();\n })\n .catch((e: ErrorResult) => {\n handleError(e, values);\n });\n })\n .catch((e: ErrorResult) => {\n handleError(e, values);\n });\n }, [company, handleError, onCompanyUpdate, updateCompanyNameApi, setCompanyOwnerApi]);\n\n useEffect(() => {\n if (!userRoles?.list?.length) {\n loadUserRoles();\n }\n }, [userRoles?.list?.length, loadUserRoles]);\n\n useEffect(() => {\n if (userRoles?.list?.length) {\n getCompanyAdmins(userRoles.list, company.id!);\n }\n }, [getCompanyAdmins, company.id, userRoles?.list]);\n\n useEffect(() => {\n formRef.current.resetForm(initialValues);\n }, [initialValues]);\n\n useEffect(() => {\n return () => {\n clearCompanyAdmins();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <CompanyDetailsView\n formRef={formRef}\n initialValues={initialValues}\n companyAdminItems={companyAdminItems}\n onSubmit={handleSubmit}\n onApiResultValidation={handleApiResultValidation}\n />\n )\n}\n\nexport default CompanyDetails;","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding: 24px;\n width: 440px;\n`;\n\nexport const TipText = styled.div`\n padding-top: 8px;\n color: var(--ps-black-main);\n font-size: 13px;\n`;\n\nexport const Buttons = styled.div`\n padding-top: 24px;\n width: 330px;\n display: flex;\n justify-content: space-between;\n`;\n","import styled from 'styled-components';\n\nexport const Counts = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n`;","import Skeleton from '@material-ui/lab/Skeleton';\nimport { CompanyUserStatsInfoViewProps } from './types';\nimport {\n Counts\n} from './styles';\nimport CompanyUserStatsTextView from '../CompanyUserStatsText/view';\n\nfunction CompanyUserStatsInfoView({\n userStats\n}: CompanyUserStatsInfoViewProps) {\n return (\n <>\n {userStats ? (<>\n <CompanyUserStatsTextView\n userStats={userStats}\n showUnlimited={true}\n style={{ fontSize: '15px', fontWeight: 'bolder', color: 'var(--ps-black-main)', height: 'auto' }}\n />\n <Counts>\n <span data-test=\"registered-users-count\">{userStats.registered} Registered</span> • \n <span data-test=\"pending-users-count\">{userStats.pending} Pending Registration</span> • \n <span data-test=\"deactivated-users-count\">{userStats.deactivated} Deactivated</span>\n </Counts>\n </>) : (<>\n <Skeleton\n variant=\"text\"\n style={{ background: 'var(--ps-grey-3)' }}\n width={170}\n height={20}\n />\n <Skeleton\n variant=\"text\"\n style={{ background: 'var(--ps-grey-3)' }}\n width={320}\n height={20}\n />\n </>)}\n </>\n );\n}\n\nexport default CompanyUserStatsInfoView;","import { useEffect } from 'react';\nimport { useGetCompanyUserStatsService } from '../../../pages/CompanySettings/store/services';\nimport { useCompanyUserStatsState } from '../../../pages/CompanySettings/store/states';\nimport { CompanyUserStatsInfoProps } from './types';\nimport CompanyUserStatsInfoView from './view';\n\nfunction CompanyUserStatsInfo({\n companyId,\n}: CompanyUserStatsInfoProps) {\n const userStatsState = useCompanyUserStatsState();\n const getCompanyUserStats = useGetCompanyUserStatsService();\n\n useEffect(() => {\n getCompanyUserStats(companyId);\n }, [companyId, getCompanyUserStats]);\n\n return (\n <CompanyUserStatsInfoView\n userStats={userStatsState.data}\n />\n );\n}\n\nexport default CompanyUserStatsInfo;","import { CompanyUserLimitViewProps } from './types';\nimport { Buttons, Container, TipText } from './styles';\nimport { CompanyUserStatsInfo } from '../../../../ui/components/CompanyUserStatsInfo';\nimport { Button } from '../../../../ui/components/Button';\n\nfunction CompanyUserLimitView({\n companyId,\n onRequestLimitChange,\n onManageInvitations,\n}: CompanyUserLimitViewProps) {\n return (\n <Container>\n <CompanyUserStatsInfo companyId={companyId} />\n <TipText data-test=\"limit-tip\">\n 💡 <b>Quick tip:</b> You may be able to find unaccepted invitations and revoke them, which will free up some seats.\n </TipText>\n <Buttons>\n <Button\n height=\"40px\"\n action={onRequestLimitChange}\n dataTest=\"request-limit-change-button\"\n >\n Request Limit Change\n </Button>\n <Button\n height=\"40px\"\n variant=\"inverse\"\n action={onManageInvitations}\n dataTest=\"manage-invitations-button\"\n >\n Manage Invitations\n </Button>\n </Buttons>\n </Container>\n );\n}\n\nexport default CompanyUserLimitView;","import { useCallback } from 'react';\nimport { CompanyUserLimitProps } from './types';\nimport CompanyUserLimitView from './view';\nimport { useHistory } from '../../../../tools/router';\nimport { useSelector } from 'react-redux';\nimport { getProfileState } from '../../../UserProfile/store/reducers';\nimport ROUTES from '../../../../routes/routes';\nimport { sendEmail } from '../../../../helpers/functions/email-helpers';\n\nfunction CompanyUserLimit({\n company\n}: CompanyUserLimitProps) {\n const history = useHistory();\n const profile = useSelector(getProfileState);\n\n const handleRequestLimitChange = useCallback(() => {\n if (!profile) return;\n sendEmail(\n `Licensed seats limit change request from ${profile.firstName} ${profile.lastName} at ${company.name}`\n );\n }, [company, profile]);\n\n const handleManageInvitations = useCallback(() => {\n history.push(ROUTES.INVITATIONS);\n }, [history]);\n\n return (\n <CompanyUserLimitView\n companyId={company.id!}\n onRequestLimitChange={handleRequestLimitChange}\n onManageInvitations={handleManageInvitations}\n />\n );\n}\n\nexport default CompanyUserLimit;","import styled from 'styled-components';\nimport { makeStyles } from '@material-ui/core';\n\nexport const Container = styled.div<{ hasFooter: boolean }>`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n flex-direction: column;\n align-items: center;\n height: ${props => props.hasFooter ? 'calc(100% - 65px)' : '100%'};\n`;\n\nexport const InfoText = styled.div`\n font-family: Manrope;\n font-size: 13px;\n font-weight: normal;\n margin-right: 30px;\n`;\n\nexport const LinkInfo = styled.a`\nfont-family: Manrope;\n font-size: 13px;\n font-weight: normal;\n font-stretch: normal;\n color: var(--ps-blue-main);\n text-decoration: none;\n margin-right: 34px;\n`;\n\nexport const useStyles = makeStyles(() => ({\n companyLogoUploader: {\n marginBottom: '60px'\n }\n}));\n\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n border-top: 1px solid var(--ps-grey-4);\n padding: 23px 5px 0 5px;\n width: 100%;\n height: 64px;\n align-items: center;\n padding: 0 24px 0 0;\n box-sizing: border-box;\n`;\n\nexport const NextButton = styled.div`\n width: 40px;\n height: 40px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n border: 1px solid var(--ps-blue-main);\n margin-left: 16px;\n cursor: pointer;\n`;\n\nexport const NextButtonIcon = styled.div`\n width: 9px;\n height: 14px;\n color: var(--ps-blue-main);\n position: relative;\n display: flex;\n`;\n\nexport const Wrapper = styled.div`\n width: 100%;\n display: flex;\n height: 100%;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n justify-content: space-between;\n`;","import { ImageUploader } from '../../../../ui/components/ImageUploader';\nimport { Container, InfoText, LinkInfo, useStyles } from './styles';\nimport { MAX_COMPANY_LOGO_SIZE } from './constants';\nimport { CompanyUpdateLogoViewProps } from './types';\nimport {\n Footer,\n NextButton,\n NextButtonIcon,\n Wrapper\n} from './styles';\nimport ArrowRight from '../../../../ui/icons/ArrowRight';\n\nfunction CompanyUpdateLogoView({\n company,\n showGuidelines,\n isInProgress,\n onNext,\n setProfileImage,\n deleteLogo\n} : CompanyUpdateLogoViewProps ) {\n const classes = useStyles();\n const hasFooter = !!onNext;\n\n return <Wrapper>\n <Container hasFooter={hasFooter}>\n <ImageUploader\n setProfileImage={setProfileImage}\n initialImage={company?.logoUrl}\n placeHolder={company?.name?.charAt(0).toUpperCase() || ''}\n dataTest=\"company-logo\"\n className={classes.companyLogoUploader}\n maxImageSize={MAX_COMPANY_LOGO_SIZE}\n onFileDelete={deleteLogo}\n rectStyled={true}\n isInProgress={isInProgress}\n />\n <InfoText data-test=\"company-logo-info\">\n PNG, JPG, JPEG • Less than 2 MB\n </InfoText>\n {showGuidelines &&\n <LinkInfo\n href=\"https://docs.google.com/document/d/11TjuZ2KiHSpqstobHeAfp9OhOMOa6gpkMAbGcHvU1aY/edit?pli=1\"\n target=\"_blank\"\n data-test=\"company-logo-guidelines\"\n >\n Guidelines\n </LinkInfo>\n }\n </Container>\n {hasFooter && (\n <Footer>\n <NextButton onClick={onNext} data-test=\"next-button\">\n <NextButtonIcon><ArrowRight /></NextButtonIcon>\n </NextButton>\n </Footer>\n )}\n </Wrapper>\n}\n\nexport default CompanyUpdateLogoView;","export const MAX_COMPANY_LOGO_SIZE = 2097152","import { CompanyUpdateLogoProps } from './types';\nimport { useDeleteCompanyLogoApi } from '../../../../api';\nimport CompanyUpdateLogoView from './view';\nimport { useUploadLogoService } from '../../store/services';\nimport { useCallback, useEffect, useState } from 'react';\n\nfunction CompanyUpdateLogo({\n company,\n showGuidelines,\n onNext,\n onCompanyUpdate\n} : CompanyUpdateLogoProps) {\n const [isInProgress, setIsInProgress] = useState(false);\n const uploadCompanyLogo = useUploadLogoService();\n const deleteCompanyLogo = useDeleteCompanyLogoApi();\n\n const setProfileImage = useCallback((image: File) => {\n if (!company?.id) return;\n setIsInProgress(true);\n uploadCompanyLogo(company.id, image)\n .then(onCompanyUpdate);\n }, [company?.id, onCompanyUpdate, uploadCompanyLogo]);\n\n const deleteLogo = useCallback(() => {\n if (!company?.id) return;\n setIsInProgress(true);\n deleteCompanyLogo(company?.id)\n .then(onCompanyUpdate);\n }, [company?.id, deleteCompanyLogo, onCompanyUpdate]);\n\n useEffect(() => {\n setIsInProgress(false);\n }, [company]);\n\n return <CompanyUpdateLogoView\n company={company}\n showGuidelines={showGuidelines}\n isInProgress={isInProgress}\n deleteLogo={deleteLogo}\n setProfileImage={setProfileImage}\n onNext={onNext}\n />;\n}\n\nexport default CompanyUpdateLogo;","import { VoiceSettingsRole } from '../../../../constants/interfaces/CompanyVoiceSettings';\nimport { VoiceSettingsSelectItem } from './types';\n\nexport const DEFAULT_CUSTOMER_SAMPLE_TEXT = 'Hello can you help me with something? I bought these wireless headphones online last week. Sound is horrible. Total disappointment. Just want someone to set me up with a quality pair of headphones.';\nexport const DEFAULT_REP_SAMPLE_TEXT = 'Sorry to hear that. The headphone market is so saturated these days. It can be really difficult to make an informed decision. Especially when buying online. I can help. These are the new headphones by InTunes. Everybody loves these!';\n\nexport const RoleItems: VoiceSettingsSelectItem<VoiceSettingsRole>[] = [\n {\n name: 'Customer',\n value: 'customer'\n },\n {\n name: 'Representative',\n value: 'representative'\n }\n];","import { Form } from 'formik';\nimport styled from 'styled-components';\n\nexport const StyledForm = styled(Form)`\n height: 100%;\n`;\n\nexport const Content = styled.div`\n width: 400px;\n height: 498px;\n margin: 24px 24px 43px 24px;\n box-sizing: border-box;\n`;\n\nexport const FieldContainer = styled.div`\n height: 78px;\n\n .company-select {\n width: 400px;\n border: solid 1px var(--ps-grey-3);\n\n &.company-select-open {\n border: solid 1px var(--ps-grey-2);\n }\n\n .company-select-input > div {\n color: var(--ps-black-main);\n }\n\n .company-select-input > div[disabled] {\n color: var(--ps-grey-2);\n }\n\n .content-area {\n padding: 8px 0;\n\n > div {\n padding: 5px 12px;\n border-radius: 0;\n margin-bottom: 0;\n min-height: auto;\n font-weight: 400;\n\n &.selected-item {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n\n &:hover {\n color: var(--ps-white-1);\n background: var(--ps-blue-main);\n }\n }\n }\n }\n\n .company-select-label {\n left: 12px;\n }\n\n .company-select-arrow {\n right: 12px;\n }\n\n .company-select-input {\n padding: 0 12px;\n }\n`;\n\nexport const FieldName = styled.div`\n font-size: 13px;\n font-weight: 800;\n color: var(--ps-black-main);\n padding-bottom: 4px;\n display: flex;\n flex-direction: row;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n border-top: 1px solid var(--ps-grey-4);\n align-items: center;\n padding-right: 24px;\n height: 64px;\n`;","import React, { FC } from 'react';\nimport styled from 'styled-components';\nimport InputRange from 'react-input-range';\nimport { Variables } from '../../../../theme/variables';\nimport { countDecimals } from '../../../../helpers/functions/count-decimals';\n\nexport interface Range {\n max: number;\n min: number;\n}\n\nconst RangeSliderContainer = styled.div<{ color: string; disabled?: boolean }>`\n margin-bottom: 24px;\n font-family: 'Manrope';\n .input-range {\n height: 1rem;\n position: relative;\n width: 100%;\n }\n .input-range__slider {\n appearance: none;\n border-radius: 100%;\n cursor: pointer;\n display: block;\n height: 16px;\n width: 16px;\n margin-left: -8px;\n margin-top: -9px;\n outline: none;\n position: absolute;\n top: 50%;\n transition: transform 0.3s ease-out, box-shadow 0.3s ease-out;\n }\n .input-range__slider:active {\n transform: scale(1.05);\n }\n .input-range__slider:focus {\n box-shadow: 0 0 0 5px rgba(63, 81, 181, 0.2);\n }\n .input-range--disabled .input-range__slider {\n background: #cccccc;\n border: 1px solid #cccccc;\n box-shadow: none;\n transform: none;\n }\n\n .input-range__slider-container {\n transition: left 0.3s ease-out;\n }\n\n .input-range__label {\n color: #aaaaaa;\n font-family: 'Helvetica Neue', san-serif;\n font-size: 0.8rem;\n transform: translateZ(0);\n white-space: nowrap;\n }\n\n .input-range__label--min,\n .input-range__label--max {\n bottom: -1.4rem;\n position: absolute;\n }\n\n .input-range__label--min {\n left: 0;\n span {\n left: 0;\n }\n }\n\n .input-range__label--max {\n right: 0;\n span {\n left: 0 !important;\n }\n }\n\n .input-range__label--value {\n position: absolute;\n top: -1.8rem;\n }\n\n .input-range__label-container {\n left: -50%;\n position: relative;\n color: ${props => props.theme.Colors.steelGrey};\n font-size: 11px;\n font-family: 'Manrope';\n }\n .input-range__label--max .input-range__label-container {\n left: 50%;\n }\n\n .input-range__track {\n background: #eeeeee;\n border-radius: 0.3rem;\n cursor: pointer;\n display: block;\n height: 1px;\n position: relative;\n transition: left 0.3s ease-out, width 0.3s ease-out;\n }\n .input-range--disabled .input-range__track {\n background: #eeeeee;\n }\n\n .input-range__track--background {\n left: 0;\n margin-top: -0.15rem;\n position: absolute;\n right: 0;\n top: 50%;\n }\n\n .input-range__track--active {\n background: #3f51b5;\n }\n\n && .input-range__track--active {\n background: ${props =>\n props.disabled ? Variables.Colors.cloudyBlue : props.color};\n }\n\n && .input-range__slider {\n background: ${props =>\n props.disabled ? Variables.Colors.cloudyBlue : '#e4f2fb'};\n border: 1px solid\n ${props =>\n props.disabled ? Variables.Colors.cloudyBlue : props.color};\n }\n`;\n\nconst Label = styled.div`\n font-size: 13px;\n color: ${Variables.Colors.steelGrey};\n margin-bottom: 23px;\n`;\n\nexport const RangeInput: FC<{\n min: number;\n max: number;\n value: number | { min: number; max: number };\n onChange: (value: number | Range) => void;\n step?: number;\n color?: string;\n label?: string;\n disabled?: boolean;\n formatLabel?: (value: number, type: string) => string;\n dataTest?: string;\n}> = ({\n min,\n max,\n value,\n onChange,\n color,\n label,\n step,\n disabled,\n formatLabel,\n dataTest,\n}) => {\n const decimals = step ? countDecimals(step) : 0;\n return (\n <RangeSliderContainer\n disabled={disabled}\n color={color ? color : Variables.Colors.darkSkyBlue}\n >\n {label && <Label data-test={dataTest && `${dataTest}-label`}>{label}</Label>}\n <span data-test={dataTest && `${dataTest}-slider`}>\n <InputRange\n disabled={disabled}\n maxValue={max}\n minValue={min}\n onChange={onChange}\n value={value}\n step={step}\n draggableTrack={false}\n formatLabel={formatLabel ?? (value => `${value.toFixed(decimals)}`)}\n />\n </span>\n </RangeSliderContainer>\n );\n};\n","export const countDecimals = function(value: number) {\n if (Math.floor(value) === value) return 0;\n return value.toString().split('.')[1].length || 0;\n};\n","export const formatStabilityLabel = (value: number, type: string) => {\n switch(type) {\n case 'min':\n return 'More variable';\n case 'max':\n return 'More stable';\n default:\n return '';\n }\n};\n\nexport const formatSimilarityLabel = (value: number, type: string) => {\n switch(type) {\n case 'min':\n return 'Low';\n case 'max':\n return 'High';\n default:\n return '';\n }\n};","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const Sound = forwardRef<SVGSVGElement, IconProps>(\n ({ className, width, height }, ref) => {\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 16 16\"\n className={className}\n width={width ?? 16}\n height={height ?? 16}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.563 2.069A.75.75 0 0 1 8 2.75v10.5a.75.75 0 0 1-1.238.57L3.472 11H1.75A1.75 1.75 0 0 1 0 9.25v-2.5C0 5.784.784 5 1.75 5h1.723l3.289-2.82a.75.75 0 0 1 .801-.111zM6.5 4.38 4.238 6.319a.75.75 0 0 1-.488.181h-2a.25.25 0 0 0-.25.25v2.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .488.18L6.5 11.62V4.38zm6.096-2.038a.75.75 0 0 1 1.06 0 8 8 0 0 1 0 11.314.75.75 0 0 1-1.06-1.06 6.5 6.5 0 0 0 0-9.193.75.75 0 0 1 0-1.06v-.001zm-1.06 2.121a.75.75 0 1 0-1.061 1.061 3.5 3.5 0 0 1 0 4.95.75.75 0 1 0 1.06 1.06 5 5 0 0 0 0-7.07l.001-.001z\" fill=\"currentColor\"/>\n </svg>\n );\n }\n);\n\nexport default Sound;\n","import styled from 'styled-components';\n\nexport const Container = styled.div<{ isFocused: boolean }>`\n position: relative;\n\n .voice-sample-textbox {\n border-radius: 4px;\n padding: 7px 11px;\n background: var(--ps-grey-3);\n border: 1px solid ${props => props.isFocused ? 'var(--ps-grey-2)' : 'var(--ps-grey-3)'};\n\n textarea {\n padding: 0;\n min-height: 108px;\n font-size: 13px;\n line-height: 18px!important;\n background: transparent!important;;\n\n &:disabled {\n color: var(--ps-grey-2);\n }\n }\n }\n`;\n\nexport const PlayButton = styled.div<{ isActive: boolean }>`\n position: absolute;\n left: 12px;\n bottom: 8px;\n color: ${props => props.isActive ? 'var(--ps-blue-main)' : 'var(--ps-grey-2)'};\n cursor: ${props => props.isActive && props.onClick ? 'pointer' : 'default'};\n display: flex;\n align-items: center;\n\n span {\n padding-left: 4px;\n }\n`","import { Variables } from '../../../../../../theme/variables';\nimport { Loading } from '../../../../../../ui/components/LoadingCopmonent';\nimport TextAreaPlaceholderBox from '../../../../../../ui/components/TextAreaPlaceholderBox/TextAreaPlaceholderBox';\nimport Sound from '../../../../../../ui/icons/Sound';\nimport StopCircle from '../../../../../../ui/icons/StopCircle';\nimport { Container, PlayButton } from './styles';\nimport { VoiceSampleTextViewProps } from './types';\n\nfunction VoiceSampleTextView({\n value,\n isFocused,\n canPlay,\n status,\n blobUrl,\n audioRef,\n dataTest,\n onChange,\n setIsFocused,\n onAudioLoaded,\n onPlay,\n onStop,\n}: VoiceSampleTextViewProps) {\n return (\n <Container isFocused={isFocused}>\n <TextAreaPlaceholderBox\n max={250}\n maxRows={6}\n minHeight=\"140px\"\n placeholder=\"Type or paste text here. The model works best on longer fragments.\"\n value={value}\n className=\"voice-sample-textbox\"\n counterColor={Variables.Colors.cloudyBlue}\n disabled={status !== 'stopped'}\n onChange={e => onChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n dataTest={dataTest}\n />\n {status === 'stopped' && <>\n <PlayButton\n isActive={canPlay}\n onClick={onPlay}\n data-test={dataTest && `${dataTest}-listen`}\n >\n <Sound /><span>Listen</span>\n </PlayButton>\n </>}\n {status === 'generating' && <>\n <PlayButton\n isActive={true}\n data-test={dataTest && `${dataTest}-generating`}\n >\n <Loading size={16} /><span>Generating...</span>\n </PlayButton>\n </>}\n {status === 'playing' && <>\n <PlayButton\n isActive={true}\n onClick={onStop}\n data-test={dataTest && `${dataTest}-stop`}\n >\n <StopCircle /><span>Stop</span>\n </PlayButton>\n </>}\n <audio\n src={blobUrl}\n ref={audioRef}\n onLoadedData={onAudioLoaded}\n onEnded={onStop}\n />\n </Container>\n )\n}\n\nexport default VoiceSampleTextView;","import { useCallback, useEffect, useState, useRef } from 'react'\nimport { VoiceSampleStatus, VoiceSampleTextProps } from './types';\nimport VoiceSampleTextView from './view';\nimport { generateAudioWithElevenLabs } from '../../../../../../services/ElevenLabs';\n\nfunction VoiceSampleText({\n settings,\n initialValue,\n isDisabled,\n dataTest,\n onAction,\n}: VoiceSampleTextProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [value, setValue] = useState<string | undefined>();\n const [status, setStatus] = useState<VoiceSampleStatus>('stopped');\n const [blobUrl, setBlobUrl] = useState<string | undefined>();\n const audioRef = useRef<HTMLAudioElement>(null);\n\n const resultValue = value ?? initialValue;\n const canPlay = resultValue.trim().length > 0 && !isDisabled;\n\n /**\n * @function handleStop\n * @description stops audio play and sets stopped status\n * @returns { void }\n */\n const handleStop = useCallback(() => {\n audioRef.current!.pause();\n audioRef.current!.currentTime = 0;\n setStatus('stopped');\n }, []);\n\n /**\n * @function handleChange\n * @description stores new value in the state and resets audio data\n * @param { string } val\n * @returns { void }\n */\n const handleChange = useCallback((val: string) => {\n setValue(val);\n handleStop();\n setBlobUrl(undefined);\n }, [handleStop]);\n\n /**\n * @function handleAudioLoaded\n * @description plays audio and sets playing status\n * @returns { void }\n */\n const handleAudioLoaded = useCallback(() => {\n audioRef.current!.play();\n setStatus('playing');\n }, []);\n\n /**\n * @function handlePlay\n * @description if audio is already generated, plays it. otherwise, it sends a request to generate a new audio and then plays it\n * @returns { void }\n */\n const handlePlay = useCallback(() => {\n if (!canPlay) return;\n if (blobUrl) {\n handleAudioLoaded();\n } else {\n setStatus('generating');\n generateAudioWithElevenLabs({\n text: resultValue,\n stability: settings.stability,\n similarityBoost: settings.similarity,\n voiceId: settings.voice\n }).then(blob => {\n const url = URL.createObjectURL(blob);\n setBlobUrl(url);\n });\n }\n }, [canPlay, blobUrl, handleAudioLoaded, resultValue, settings]);\n\n useEffect(() => {\n onAction(status !== 'stopped');\n }, [onAction, status]);\n\n useEffect(() => {\n handleStop();\n setBlobUrl(undefined);\n }, [handleStop, settings]);\n\n return (\n <VoiceSampleTextView\n value={resultValue}\n isFocused={isFocused}\n canPlay={canPlay}\n status={status}\n blobUrl={blobUrl}\n audioRef={audioRef}\n dataTest={dataTest}\n onChange={handleChange}\n setIsFocused={setIsFocused}\n onAudioLoaded={handleAudioLoaded}\n onPlay={handlePlay}\n onStop={handleStop}\n />\n )\n}\n\nexport default VoiceSampleText;","import { ChangeEvent } from 'react'\nimport { upperFirst } from 'lodash';\nimport { PartialVoiceSettingsViewProps } from './types';\nimport {\n AdvancedFieldContainer,\n AdvancedSettingsHeader,\n AdvancedSettingsTitle,\n FieldContainer,\n FieldName,\n QuestionContainer,\n ResetButton,\n SampleTextContainer,\n TooltipContainer,\n TootlipContent,\n TootlipTitle,\n} from './styles';\nimport { Field } from 'formik';\nimport { FormikSelect } from '../../../../../../ui/components/FormikSelect';\nimport { QuestionTooltip } from '../../../../../../ui/components/Tooltip/QuestionTooltip';\nimport { RangeInput } from '../../../../../../ui/components/RangeInput';\nimport { formatSimilarityLabel, formatStabilityLabel } from './helpers';\nimport { VoiceSampleText } from '../VoiceSampleText';\n\nfunction PartialVoiceSettingsView({\n role,\n voiceItems,\n values,\n initialSampleText,\n isDisabled,\n canReset,\n getFieldName,\n setFieldValue,\n onReset,\n onSampleAction,\n}: PartialVoiceSettingsViewProps) {\n return (\n <>\n <FieldContainer>\n <FieldName data-test=\"voice-title\">\n {upperFirst(role)}'s Voice\n </FieldName>\n <Field\n items={voiceItems}\n value={values.voice}\n component={FormikSelect}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setFieldValue(getFieldName('voice'), e.target.value)}\n height={40}\n variant=\"outlined\"\n name={getFieldName('voice')}\n className=\"company-select\"\n disabled={isDisabled}\n dataTest=\"voice-dropdown\"\n />\n </FieldContainer>\n <AdvancedSettingsHeader>\n <AdvancedSettingsTitle data-test=\"advanced-settings-title\">\n ADVANCED VOICE SETTINGS\n </AdvancedSettingsTitle>\n <ResetButton\n isActive={canReset}\n onClick={onReset}\n data-test=\"to-default-button\"\n >\n To Default\n </ResetButton>\n </AdvancedSettingsHeader>\n <AdvancedFieldContainer>\n <FieldName>\n <span data-test=\"stability-title\">Stability</span>\n <QuestionContainer>\n <QuestionTooltip\n text={<TooltipContainer>\n <TootlipTitle>More variable</TootlipTitle>\n <TootlipContent>Increasing variability can make speech more expressive with output varying between re-generations. It can also lead to instabilities.</TootlipContent>\n <TootlipTitle>More stable</TootlipTitle>\n <TootlipContent>Increasing stability will make the voice more consistent between re-generations, but it can also make it sounds a bit monotone. On longer text fragments we recommend lowering this value.</TootlipContent>\n </TooltipContainer>}\n isHtmlContent={true}\n dataTest='stability-tooltip'\n />\n </QuestionContainer>\n </FieldName>\n <RangeInput\n min={0}\n max={1}\n value={values.stability}\n onChange={value => setFieldValue(getFieldName('stability'), value as number)}\n step={0.01}\n disabled={isDisabled}\n dataTest=\"stability-slider\"\n formatLabel={formatStabilityLabel}\n />\n </AdvancedFieldContainer>\n <AdvancedFieldContainer>\n <FieldName>\n <span data-test=\"similarity-title\">Clarity + Similarity Enhancement</span>\n <QuestionContainer>\n <QuestionTooltip\n text={<TooltipContainer>\n <TootlipTitle>Low</TootlipTitle>\n <TootlipContent>Low values are recommended if background artifacts are present in generated speech.</TootlipContent>\n <TootlipTitle>High</TootlipTitle>\n <TootlipContent>It boosts overall voice clarity and target speaker similarity. Very high values can cause artifacts, so adjusting this setting to find the optimal value is encouraged.</TootlipContent>\n </TooltipContainer>}\n isHtmlContent={true}\n dataTest='similarity-tooltip'\n />\n </QuestionContainer>\n </FieldName>\n <RangeInput\n min={0}\n max={1}\n value={values.similarity}\n onChange={value => setFieldValue(getFieldName('similarity'), value as number)}\n step={0.01}\n disabled={isDisabled}\n dataTest=\"similarity-slider\"\n formatLabel={formatSimilarityLabel}\n />\n </AdvancedFieldContainer>\n <SampleTextContainer>\n <FieldName data-test=\"sample-text-title\">Sample Text</FieldName>\n <VoiceSampleText\n settings={values}\n initialValue={initialSampleText}\n isDisabled={isDisabled}\n dataTest=\"sample-text-input\"\n onAction={onSampleAction}\n />\n </SampleTextContainer>\n </>\n )\n}\n\nexport default PartialVoiceSettingsView;","import { useCallback, useMemo } from 'react';\nimport { PartialVoiceSettingsProps } from './types';\nimport PartialVoiceSettingsView from './view';\nimport { VoiceSettingsSelectItem } from '../../types';\nimport { DEFAULT_CUSTOMER_VOICE_ID, DEFAULT_REP_VOICE_ID } from '../../../../../../features/textToSpeech/constants';\n\nfunction PartialVoiceSettings({\n role,\n voices,\n defaultSimilarity,\n defaultStability,\n initialSampleText,\n values,\n isDisabled,\n setFieldValue,\n onSampleAction,\n}: PartialVoiceSettingsProps) {\n const canReset = !isDisabled\n && (values.similarity !== defaultSimilarity\n || values.stability !== defaultStability);\n const defaultVoiceId = role === 'customer' ? DEFAULT_CUSTOMER_VOICE_ID : DEFAULT_REP_VOICE_ID;\n\n const voiceItems = useMemo(() => {\n return voices\n .map(voice => {\n return {\n name: voice.name + (voice.voice_id === defaultVoiceId ? ' (Default)' : ''),\n value: voice.voice_id\n } as VoiceSettingsSelectItem<string>\n })\n .sort((item1, item2) => {\n if (item1.value === defaultVoiceId) {\n return -1;\n }\n if (item2.value === defaultVoiceId) {\n return 1;\n }\n return item1.name >= item2.name ? 1 : -1\n });\n }, [defaultVoiceId, voices]);\n\n /**\n * @function getFieldName\n * @description builds form field name based on current role\n * @param { string } name\n * @returns { boolean }\n */\n const getFieldName = useCallback(\n (name: string) => `${role}.${name}`,\n [role]\n );\n\n /**\n * @function handleReset\n * @description sets advanced fields to default values if reset is available\n * @returns { void }\n */\n const handleReset = useCallback(() => {\n if (!canReset) return;\n setFieldValue(getFieldName('stability'), defaultStability);\n setFieldValue(getFieldName('similarity'), defaultSimilarity);\n }, [canReset, defaultSimilarity, defaultStability, getFieldName, setFieldValue]);\n\n return (\n <PartialVoiceSettingsView\n role={role}\n voiceItems={voiceItems}\n values={values}\n initialSampleText={initialSampleText}\n isDisabled={isDisabled}\n canReset={canReset}\n getFieldName={getFieldName}\n setFieldValue={setFieldValue}\n onReset={handleReset}\n onSampleAction={onSampleAction}\n />\n );\n}\n\nexport default PartialVoiceSettings;","import Skeleton from '@material-ui/lab/Skeleton';\nimport styled from 'styled-components';\n\nexport const StyledSkeleton = styled(Skeleton)`\n background: var(--ps-grey-4);\n border-radius: 0!important;\n height: 8px!important;\n transform: none!important;\n`;\n\nexport const InputSkeleton = styled.div<{ padding: string }>`\n background: var(--ps-grey-3);\n padding: ${props => props.padding};\n`;\n\nexport const TwoElementsContainer = styled.div<{ padding: string }>`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: ${props => props.padding};\n`;","import {\n InputSkeleton,\n StyledSkeleton,\n TwoElementsContainer\n} from './styles';\n\nfunction VoiceSettingsSkeleton() {\n return (\n <>\n <StyledSkeleton\n width={38}\n style={{ marginTop: '7px', marginBottom: '8px' }}\n />\n <InputSkeleton padding=\"17px 12px 15px 12px\">\n <StyledSkeleton width={114} />\n </InputSkeleton>\n <TwoElementsContainer padding=\"23px 0 0 0\">\n <StyledSkeleton width={163} />\n <StyledSkeleton width={62} />\n </TwoElementsContainer>\n <StyledSkeleton\n width={77}\n style={{ marginTop: '18px' }}\n />\n <StyledSkeleton\n width={400}\n style={{ marginTop: '12px' }}\n />\n <StyledSkeleton\n width={123}\n style={{ marginTop: '40px' }}\n />\n <StyledSkeleton\n width={400}\n style={{ marginTop: '12px' }}\n />\n <StyledSkeleton\n width={77}\n style={{ marginTop: '49px', marginBottom: '8px' }}\n />\n <InputSkeleton padding=\"14px 12px 12px 12px\">\n <StyledSkeleton width={376} />\n <StyledSkeleton\n width={348}\n style={{ marginTop: '10px' }}\n />\n <StyledSkeleton\n width={265}\n style={{ marginTop: '10px' }}\n />\n <TwoElementsContainer padding=\"70px 0 0 0\">\n <StyledSkeleton width={58} />\n <StyledSkeleton width={58} />\n </TwoElementsContainer>\n </InputSkeleton>\n </>\n );\n}\n\nexport default VoiceSettingsSkeleton;","import { ChangeEvent } from 'react'\nimport { Formik } from 'formik';\nimport { CompanyVoiceFormValues, CompanyVoiceViewProps } from './types';\nimport { DEFAULT_CUSTOMER_SAMPLE_TEXT, DEFAULT_REP_SAMPLE_TEXT, RoleItems } from './constants';\nimport { Button } from '../../../../ui/components/Button';\nimport Select from '../../../../ui/components/Select/Select';\nimport {\n Content,\n FieldContainer,\n FieldName,\n Footer,\n StyledForm,\n} from './styles';\nimport { PartiaVoiceSettings } from './components/PartialVoiceSettings';\nimport { VoiceSettingsSkeleton } from './components/VoiceSettingsSkeleton';\nimport { VoiceSettingsRole } from '../../../../constants/interfaces/CompanyVoiceSettings';\nimport {\n DEFAULT_CUSTOMER_VOICE_SIMILARITY,\n DEFAULT_CUSTOMER_VOICE_STABILITY,\n DEFAULT_REP_VOICE_SIMILARITY,\n DEFAULT_REP_VOICE_STABILITY\n} from '../../../../features/textToSpeech/constants';\n\nfunction CompanyVoiceView({\n formRef,\n role,\n voices,\n initialFormValues,\n canChange,\n isLoading,\n onChangeRole,\n onSampleAction,\n onSubmit,\n}: CompanyVoiceViewProps) {\n return (\n <Formik<CompanyVoiceFormValues>\n ref={formRef}\n initialValues={initialFormValues}\n onSubmit={onSubmit}\n >\n {({ values, dirty, isValid, isSubmitting, setFieldValue }) => {\n return (\n <StyledForm>\n <Content>\n <FieldContainer>\n <FieldName data-test=\"role-title\">Role</FieldName>\n <Select\n items={RoleItems}\n value={role}\n height={40}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChangeRole(e.target.value as VoiceSettingsRole)}\n className=\"company-select\"\n disabled={!canChange || isSubmitting}\n dataTest=\"role-dropdown\"\n />\n </FieldContainer>\n {isLoading && <VoiceSettingsSkeleton />}\n {!isLoading && (\n <>\n <div style={{ display: role === 'customer' ? 'block' : 'none' }}>\n <PartiaVoiceSettings\n role={role}\n voices={voices}\n defaultSimilarity={DEFAULT_CUSTOMER_VOICE_SIMILARITY}\n defaultStability={DEFAULT_CUSTOMER_VOICE_STABILITY}\n initialSampleText={DEFAULT_CUSTOMER_SAMPLE_TEXT}\n values={values.customer}\n isDisabled={!canChange || isSubmitting}\n setFieldValue={setFieldValue}\n onSampleAction={onSampleAction}\n />\n </div>\n <div style={{ display: role === 'representative' ? 'block' : 'none' }}>\n <PartiaVoiceSettings\n role={role}\n voices={voices}\n defaultSimilarity={DEFAULT_REP_VOICE_SIMILARITY}\n defaultStability={DEFAULT_REP_VOICE_STABILITY}\n initialSampleText={DEFAULT_REP_SAMPLE_TEXT}\n values={values.representative}\n isDisabled={!canChange || isSubmitting}\n setFieldValue={setFieldValue}\n onSampleAction={onSampleAction}\n />\n </div>\n </>\n )}\n </Content>\n <Footer>\n <Button\n width=\"130px\"\n height=\"40px\"\n disabled={!dirty || !isValid || isSubmitting}\n loadingColor=\"white\"\n loadingSize={24}\n loading={isSubmitting}\n dataTest=\"apply-button\"\n >\n Apply\n </Button>\n </Footer>\n </StyledForm>\n );\n }}\n </Formik>\n );\n}\n\nexport default CompanyVoiceView;","import { useEffect, useState, useRef, useCallback, useMemo } from 'react';\nimport CompanyVoiceView from './view';\nimport { getElevenLabsVoices } from '../../../../services/ElevenLabs';\nimport { CompanyVoiceFormValues, CompanyVoiceProps } from './types';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { useSetCompanyVoiceSettingsApi } from '../../../../api';\nimport { CompanyVoiceSettings, VoiceSettingsRole } from '../../../../constants/interfaces/CompanyVoiceSettings';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { useCompanyVoiceSettingsState } from '../../store/states';\nimport { useLoadVoiceSettingsService } from '../../store/services';\nimport { getTextToSpeechSettingsOrDefault } from '../../../../features/textToSpeech/helpers';\nimport { VoiceData } from '../../../../services/ElevenLabs/types';\n\nfunction CompanyVoice({ companyId }: CompanyVoiceProps) {\n const [role, setRole] = useState<VoiceSettingsRole>('customer');\n const [voices, setVoices] = useState<VoiceData[]>([]);\n const { data: voiceSettings, loading } = useCompanyVoiceSettingsState();\n const loadVoiceSettings = useLoadVoiceSettingsService();\n const [isSampleInProgress, setIsSampleInProgress] = useState(false);\n const formRef = useRef<any>(null);\n const showMessage = useShowMessage();\n const setCompanyVoiceSettingsApi = useSetCompanyVoiceSettingsApi();\n\n const initialFormValues = useMemo((): CompanyVoiceFormValues => {\n const settingsOrDefault = getTextToSpeechSettingsOrDefault(voiceSettings);\n return {\n customer: {\n voice: settingsOrDefault.customer.voiceId,\n stability: settingsOrDefault.customer.stability,\n similarity: settingsOrDefault.customer.similarityBoost,\n },\n representative: {\n voice: settingsOrDefault.representative.voiceId,\n stability: settingsOrDefault.representative.stability,\n similarity: settingsOrDefault.representative.similarityBoost,\n }\n };\n }, [voiceSettings]);\n\n const handleChangeRole = useCallback((role: VoiceSettingsRole) => {\n setRole(role);\n }, []);\n\n /**\n * @function handleSubmit\n * @description transforms form values to API data, sends API request to save voice settings and resets form with current values\n * @param { CompanyVoiceFormValues } values\n * @returns { void }\n */\n const handleSubmit = useCallback((values: CompanyVoiceFormValues) => {\n const data: CompanyVoiceSettings[] = [{\n companyId,\n role: 'customer',\n voiceId: values.customer.voice,\n stability: values.customer.stability,\n similarityBoost: values.customer.similarity,\n style: 0\n }, {\n companyId,\n role: 'representative',\n voiceId: values.representative.voice,\n stability: values.representative.stability,\n similarityBoost: values.representative.similarity,\n style: 0\n }];\n return setCompanyVoiceSettingsApi(data)\n .then(() => {\n formRef.current.resetForm(values);\n formRef.current.setSubmitting(false);\n })\n .catch((e: ErrorResult) => {\n showMessage(e.message, 'error');\n formRef.current.setSubmitting(false);\n });\n }, [companyId, setCompanyVoiceSettingsApi, showMessage]);\n \n useEffect(() => {\n loadVoiceSettings(companyId);\n getElevenLabsVoices()\n .then(response => {\n setVoices(response.voices);\n })\n .catch(e => {\n showMessage('Voices loading error', 'error');\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n formRef.current.resetForm(initialFormValues);\n }, [initialFormValues]);\n\n return (\n <CompanyVoiceView\n formRef={formRef}\n role={role}\n voices={voices}\n initialFormValues={initialFormValues}\n canChange={!isSampleInProgress}\n isLoading={loading}\n onChangeRole={handleChangeRole}\n onSampleAction={setIsSampleInProgress}\n onSubmit={handleSubmit}\n />\n )\n}\n\nexport default CompanyVoice;","import { Switch } from 'react-router-dom';\nimport PrivateRoute from '../../routes/PrivateRouter';\nimport { ModalWithCross } from '../../ui/components/ModalWithCross';\nimport DetailsNav from '../../ui/icons/DetailsNav';\nimport Seats from '../../ui/icons/Seats';\nimport LogoNav from '../../ui/icons/LogoNav';\nimport Voice from '../../ui/icons/Voice';\nimport ROUTES from '../../routes/routes';\nimport { CompanySettingsViewProps } from './types';\nimport {\n CompanyName,\n ModalContent,\n ModalSidebar,\n ModalTitle,\n NavigationIcon,\n NavigationItem,\n TabContent\n} from './styles';\nimport { CompanyDetails } from './components/CompanyDetails';\nimport { CompanyUserLimit } from './components/CompanyUserLimit';\nimport { CompanyUpdateLogo } from './components/CompanyUpdateLogo';\nimport { CompanyVoice } from './components/CompanyVoice';\n\nfunction CompanySettingsView({\n company,\n onClose,\n onCompanyUpdate,\n createNavigationDescriptor,\n}: CompanySettingsViewProps) {\n const isCompanyLoaded = !!company?.id;\n\n return (\n <ModalWithCross\n titleContent={\n <ModalTitle>\n <span data-test=\"company-settings-modal-title\">Company Settings</span>\n {isCompanyLoaded &&\n <CompanyName>\n • \n <span data-test=\"company-name-modal-title\">{company!.name}</span>\n </CompanyName>\n }\n </ModalTitle>\n }\n onClose={onClose}\n width={790}\n dataTest=\"company-settings-modal\"\n >\n <ModalContent>\n <ModalSidebar>\n <NavigationItem\n to={createNavigationDescriptor(ROUTES.COMPANY_SETTINGS.ROOT)}\n activeClassName={'is-active'}\n exact\n data-test=\"details-tab\"\n >\n <NavigationIcon><DetailsNav /></NavigationIcon>\n Details\n </NavigationItem>\n <NavigationItem\n to={createNavigationDescriptor(ROUTES.COMPANY_SETTINGS.LOGO)}\n activeClassName={'is-active'}\n data-test=\"logo-tab\"\n >\n <NavigationIcon><LogoNav /></NavigationIcon>\n Logo\n </NavigationItem>\n <NavigationItem\n to={createNavigationDescriptor(ROUTES.COMPANY_SETTINGS.USER_LIMIT)}\n activeClassName={'is-active'}\n data-test=\"licensed-seats-tab\"\n >\n <NavigationIcon><Seats /></NavigationIcon>\n Licensed Seats\n </NavigationItem>\n <NavigationItem\n to={createNavigationDescriptor(ROUTES.COMPANY_SETTINGS.VOICE)}\n activeClassName={'is-active'}\n data-test=\"voice-tab\"\n >\n <NavigationIcon><Voice /></NavigationIcon>\n AI Voice\n </NavigationItem>\n </ModalSidebar>\n <TabContent>\n <Switch>\n <PrivateRoute\n path={ROUTES.COMPANY_SETTINGS.ROOT}\n exact\n >\n {isCompanyLoaded &&\n <CompanyDetails\n company={company!}\n onCompanyUpdate={onCompanyUpdate}\n />\n }\n </PrivateRoute>\n <PrivateRoute\n path={ROUTES.COMPANY_SETTINGS.LOGO}\n exact\n >\n {isCompanyLoaded &&\n <CompanyUpdateLogo\n company={company!}\n onCompanyUpdate={onCompanyUpdate}\n />\n }\n </PrivateRoute>\n <PrivateRoute\n path={ROUTES.COMPANY_SETTINGS.USER_LIMIT}\n exact\n >\n {isCompanyLoaded && (\n <CompanyUserLimit\n company={company!}\n />\n )}\n </PrivateRoute>\n <PrivateRoute\n path={ROUTES.COMPANY_SETTINGS.VOICE}\n exact\n >\n {isCompanyLoaded && (\n <CompanyVoice\n companyId={company!.id!}\n />\n )}\n </PrivateRoute>\n </Switch>\n </TabContent>\n </ModalContent>\n </ModalWithCross>\n );\n}\n\nexport default CompanySettingsView;","import { useHistory } from '../../tools/router';\nimport { useCallback, useEffect } from 'react';\nimport { CompanySettingsProps } from './types';\nimport CompanySettingsView from './view';\nimport { useSelector } from 'react-redux';\nimport { getCompanyState } from './store/reducers';\nimport { useGetCompanyService } from './store/services';\nimport { getProfileState } from '../UserProfile/store/reducers';\n\nfunction CompanySettings({\n closeGoingBack,\n closePath,\n}: CompanySettingsProps) {\n const company = useSelector(getCompanyState);\n const profile = useSelector(getProfileState);\n const getCompany = useGetCompanyService();\n const history = useHistory();\n const prevLocation = history.location.state?.prevLocation ?? history.location.state?.background;\n\n const handleClose = useCallback(() => {\n if (closeGoingBack && prevLocation) {\n history.replace(prevLocation.pathname);\n } else {\n history.replace(closePath);\n }\n }, [closeGoingBack, closePath, history, prevLocation]);\n\n const createNavigationDescriptor = useCallback((route: string) => {\n return {\n pathname: route,\n state: { background: prevLocation },\n }\n }, [prevLocation]);\n\n const loadCompany = useCallback(\n () => getCompany(profile!.companyId),\n [getCompany, profile]\n );\n\n useEffect(() => {\n if (profile?.companyId) {\n loadCompany();\n }\n }, [getCompany, loadCompany, profile?.companyId]);\n\n return (\n <CompanySettingsView\n company={company}\n onCompanyUpdate={loadCompany}\n onClose={handleClose}\n createNavigationDescriptor={createNavigationDescriptor}\n />\n )\n}\n\nexport default CompanySettings;","import { SidebarFiltersConfig } from '../../../features/filters/filters-sidebar/types';\n\nexport const TrainingTimeReportFiltersConfig: SidebarFiltersConfig[] = [\n {\n filterType: 'MULTIPLE_SELECT_TEAMS',\n },\n {\n filterType: 'LABELS',\n },\n {\n filterType: 'DATE',\n }\n];","import styled from 'styled-components';\n\nexport const SubHeader = styled.div`\n font-size: 13px;\n color: var(--ps-black-main);\n`;","import { FiltersSidebar } from '../../../features/filters/filters-sidebar';\nimport ROUTES from '../../../routes/routes';\nimport MainWrapper from '../../../ui/wrapper/MainWrapper/MainWrapper';\nimport { TrainingTimeReportFiltersConfig } from './constants';\nimport { SubHeader } from './styles';\nimport { TrainingTimeReportViewProps } from './types';\n\nfunction TrainingTimeReportView({\n onClearFilters, onGenerateReport, controlPanelMode, remainingTimeout\n}: TrainingTimeReportViewProps) {\n return (\n <MainWrapper\n title=\"Reports\"\n subTitle=\"Training Time Report\"\n subHeader={\n <SubHeader data-test=\"training-time-report-page-description\">\n Tracking overall training time by learners by date range.\n </SubHeader>\n }\n htmlPageTitle=\"Reports - Practis\"\n goBackUrl={ROUTES.REPORTS.LIST_OF_REPORTS}\n headerPadding=\"0 24px\"\n headerMinHeight=\"124px\"\n contentPadding=\"0\"\n isScrollable={false}\n contentSize={false}\n dataTest=\"training-time-report\"\n >\n <FiltersSidebar\n filtersConfig={TrainingTimeReportFiltersConfig}\n onClearFilters={onClearFilters}\n onGenerateReport={onGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n headerHeight=\"124px\"\n />\n </MainWrapper>\n );\n}\n\nexport default TrainingTimeReportView;","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { useMultipleTeamsFilterState } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/reducers';\nimport { useGenerateReportService, useGetReportAvailabilityService } from '../../../features/filters/filters-sidebar/services';\nimport { ReportingControlPanelMode } from '../../../ui/components/ReportingControlPanel/types';\nimport TrainingTimeReportView from './view';\nimport { useTeamsState } from '../../../features/teams/store/states';\nimport { usePortableLabelsState } from '../../../features/portableLabels/store/states';\nimport { useLabelsState } from '../../../features/portableLabels/store/hors/withLabels/states';\nimport { WithLabelsContext } from '../../../features/portableLabels';\nimport { ReportType } from '../../../constants/interfaces/ReportItem';\nimport { useHistory } from '../../../tools/router';\nimport ROUTES from '../../../routes/routes';\nimport { useClearMultipleTeamsFilter, useDisableMultipleTeamsFilter } from '../../../features/filters/dynamic-filter/multiple-teams-filter/store/services';\nimport { useClearLabelsFilter, useDisableLabelsFilter } from '../../../features/filters/dynamic-filter/labels-filter/store/services';\nimport { useDateRangeState } from '../../../features/filters/dynamic-filter/date-filter/store/reducers';\nimport { useResetDateRange } from '../../../features/filters/dynamic-filter/date-filter/store/services';\nimport { DATE_FORMAT } from '../BillingReport/constants';\nimport dayjs from 'dayjs';\n\nfunction TrainingTimeReportController() {\n const { isGenerating, remainingTimeout, generateReport } = useGenerateReportService();\n const { isAvailable, getReportAvailability } = useGetReportAvailabilityService();\n const { selectedTeamIds } = useMultipleTeamsFilterState();\n const { loading: isTeamsLoading } = useTeamsState();\n const { loading: isLabelsLoading } = usePortableLabelsState();\n const { selected: selectedLabels } = useLabelsState();\n const { dateRange } = useDateRangeState();\n const clearMultipleTeamsFilter = useClearMultipleTeamsFilter();\n const disableMultipleTeamsFilter = useDisableMultipleTeamsFilter();\n const clearLabelsFilter = useClearLabelsFilter();\n const clearDateRangeFilter = useResetDateRange();\n const disableLabelsFilter = useDisableLabelsFilter();\n const history = useHistory();\n\n const isDisabled = (!selectedTeamIds?.length && !selectedLabels.length)\n || !(dateRange?.start && dateRange?.end);\n\n const handleClearFilters = useCallback(() => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n clearDateRangeFilter()\n history.replace(ROUTES.REPORTS.TRAINING_TIME_REPORT);\n }, [clearLabelsFilter, clearMultipleTeamsFilter, clearDateRangeFilter, history]);\n\n const controlPanelMode: ReportingControlPanelMode = useMemo(() => {\n if (remainingTimeout) {\n return 'timeout';\n }\n \n if (isTeamsLoading || isLabelsLoading || isGenerating) {\n return 'loading';\n }\n\n if (isDisabled) {\n return 'disabled';\n }\n\n if (!isAvailable) {\n return 'noData';\n }\n\n return 'enabled';\n }, [remainingTimeout, isTeamsLoading, isLabelsLoading, isGenerating, isDisabled, isAvailable]);\n\n const getReportParams = useCallback(() => {\n if (isDisabled) return;\n return {\n teams: selectedTeamIds ?? [],\n labels: selectedLabels?.length\n ? selectedLabels.filter(id => id > 0)\n : selectedLabels,\n dateStart: dateRange?.start && dayjs(new Date(dateRange?.start)).format(DATE_FORMAT),\n dateEnd: dateRange?.end && dayjs(new Date(dateRange?.end)).format(DATE_FORMAT)\n }\n }, [selectedLabels, selectedTeamIds, dateRange, isDisabled]);\n\n const handleGenerateReport = useCallback(() => {\n const params = getReportParams();\n if (params) {\n generateReport(ReportType.TRAINING_TIME, params);\n }\n }, [generateReport, getReportParams]);\n\n useEffect(() => {\n return () => {\n clearMultipleTeamsFilter();\n clearLabelsFilter();\n clearDateRangeFilter();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const params = getReportParams();\n if (params) {\n getReportAvailability(ReportType.TRAINING_TIME, params);\n }\n }, [getReportAvailability, getReportParams]);\n\n useEffect(() => {\n disableMultipleTeamsFilter(isGenerating);\n disableLabelsFilter(isGenerating);\n }, [disableLabelsFilter, disableMultipleTeamsFilter, isGenerating]);\n\n return (\n <TrainingTimeReportView\n onClearFilters={handleClearFilters}\n onGenerateReport={handleGenerateReport}\n controlPanelMode={controlPanelMode}\n remainingTimeout={remainingTimeout}\n />\n );\n}\n\nfunction TrainingTimeReportWithLabelsContext() {\n return (\n <WithLabelsContext.Provider value={{ reducerName: 'labelsFilter' }}>\n <TrainingTimeReportController />\n </WithLabelsContext.Provider>\n );\n}\n\nexport default TrainingTimeReportWithLabelsContext;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ObjectiveIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#iyfsdcj2ra)\" fill=\"#6D7F8C\">\n <path d=\"M7.678 7.438a1.876 1.876 0 0 0-2.681 1.69c0 1.034.84 1.875 1.874 1.875a1.876 1.876 0 0 0 1.69-2.681l2.004-2.004h2.499L16 3.382l-2.875-.507L12.618 0 9.682 2.936v2.499L7.678 7.438zm-.807 2.316a.625.625 0 1 1 .001-1.251.625.625 0 0 1-.001 1.25zm4.06-6.3.874-.874.242 1.373 1.373.242-.874.874h-1.615V3.454z\"/>\n <path d=\"M12.274 7.567A5.628 5.628 0 0 1 6.87 14.75 5.626 5.626 0 0 1 1.249 9.13a5.628 5.628 0 0 1 7.183-5.402v-1.29A6.879 6.879 0 0 0 0 9.128a6.874 6.874 0 0 0 6.87 6.87 6.879 6.879 0 0 0 6.872-6.87 6.84 6.84 0 0 0-.182-1.562h-1.286z\"/>\n <path d=\"M6.87 6.005c.15 0 .298.011.442.032L8.34 5.01a4.377 4.377 0 0 0-5.84 4.118 4.377 4.377 0 0 0 4.371 4.373A4.377 4.377 0 0 0 10.99 7.66L9.962 8.687a3.127 3.127 0 0 1-3.092 3.565 3.127 3.127 0 0 1-3.123-3.124A3.127 3.127 0 0 1 6.87 6.005z\"/>\n </g>\n <defs>\n <clipPath id=\"iyfsdcj2ra\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n</svg> );\n }\n);\n\nexport default ObjectiveIcon;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ObjectiveIconActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#8xe4jq1bga)\" fill=\"#212121\">\n <path d=\"M7.678 7.438a1.876 1.876 0 0 0-2.681 1.69c0 1.034.84 1.875 1.873 1.875a1.876 1.876 0 0 0 1.691-2.681l2.004-2.004h2.498L16 3.382l-2.874-.507L12.618 0 9.68 2.936v2.499L7.678 7.438zM6.87 9.754a.625.625 0 1 1 .002-1.251.625.625 0 0 1-.002 1.25zm4.06-6.3.874-.874.243 1.373 1.372.242-.873.874H10.93V3.454z\"/>\n <path d=\"M12.274 7.567A5.628 5.628 0 0 1 6.87 14.75 5.626 5.626 0 0 1 1.249 9.13a5.628 5.628 0 0 1 7.183-5.402v-1.29A6.879 6.879 0 0 0 0 9.128a6.874 6.874 0 0 0 6.87 6.87 6.879 6.879 0 0 0 6.872-6.87 6.84 6.84 0 0 0-.182-1.562h-1.286z\"/>\n <path d=\"M6.87 6.005c.15 0 .298.011.443.032L8.339 5.01A4.377 4.377 0 0 0 2.5 9.128a4.377 4.377 0 0 0 4.372 4.373 4.377 4.377 0 0 0 4.118-5.841L9.963 8.687a3.127 3.127 0 0 1-3.092 3.565 3.127 3.127 0 0 1-3.123-3.124A3.127 3.127 0 0 1 6.87 6.005z\"/>\n </g>\n <defs>\n <clipPath id=\"8xe4jq1bga\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg> );\n }\n);\n\nexport default ObjectiveIconActive;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ProductIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#o8m0jnx73a)\">\n <path d=\"M12.33 3.75A4.382 4.382 0 0 0 8 0a4.382 4.382 0 0 0-4.33 3.75H1.125v10.375C1.125 15.159 1.966 16 3 16h10a1.877 1.877 0 0 0 1.875-1.875V3.75H12.33zM8 1.25a3.13 3.13 0 0 1 3.062 2.5H4.938A3.13 3.13 0 0 1 8 1.25zm5.625 12.875c0 .345-.28.625-.625.625H3a.626.626 0 0 1-.625-.625V5h11.25v9.125zM8 12.5c2.36 0 4.375-2.17 4.375-5v-.625h-1.25V7.5c0 2.068-1.402 3.75-3.125 3.75S4.875 9.568 4.875 7.5v-.625h-1.25V7.5c0 2.84 2.023 5 4.375 5z\" fill=\"#6D7F8C\"/>\n </g>\n <defs>\n <clipPath id=\"o8m0jnx73a\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n</svg> );\n }\n);\n\nexport default ProductIcon;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ProductIconActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#jnibpiuuwa)\">\n <path d=\"M12.33 3.75A4.382 4.382 0 0 0 8 0a4.382 4.382 0 0 0-4.33 3.75H1.125v10.375C1.125 15.159 1.966 16 3 16h10a1.877 1.877 0 0 0 1.875-1.875V3.75H12.33zM8 1.25a3.13 3.13 0 0 1 3.062 2.5H4.938A3.13 3.13 0 0 1 8 1.25zm5.625 12.875c0 .345-.28.625-.625.625H3a.626.626 0 0 1-.625-.625V5h11.25v9.125zM8 12.5c2.36 0 4.375-2.17 4.375-5v-.625h-1.25V7.5c0 2.068-1.402 3.75-3.125 3.75S4.875 9.568 4.875 7.5v-.625h-1.25V7.5c0 2.84 2.023 5 4.375 5z\" fill=\"#212121\"/>\n </g>\n <defs>\n <clipPath id=\"jnibpiuuwa\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n</svg>);\n }\n);\n\nexport default ProductIconActive;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ProspectIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#k19nog47na)\">\n <path d=\"M13.657 10.343a7.97 7.97 0 0 0-3.04-1.907 4.623 4.623 0 0 0 2.008-3.811A4.63 4.63 0 0 0 8 0a4.63 4.63 0 0 0-4.625 4.625c0 1.58.796 2.977 2.008 3.811a7.968 7.968 0 0 0-3.04 1.907A7.947 7.947 0 0 0 0 16h1.25a6.751 6.751 0 0 1 3.159-5.713l1.638 1.97 1.328-1.12V16h1.25v-4.877l1.365 1.131 1.614-1.959A6.751 6.751 0 0 1 14.75 16H16a7.948 7.948 0 0 0-2.343-5.657zm-7.454.147-.65-.781a6.704 6.704 0 0 1 2.113-.45L6.203 10.49zM4.625 4.625A3.379 3.379 0 0 1 8 1.25a3.379 3.379 0 0 1 3.375 3.375A3.379 3.379 0 0 1 8 8a3.379 3.379 0 0 1-3.375-3.375zm5.197 5.867-1.49-1.234a6.705 6.705 0 0 1 2.13.457l-.64.777z\" fill=\"#6D7F8C\"/>\n </g>\n <defs>\n <clipPath id=\"k19nog47na\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n</svg>);\n }\n);\n\nexport default ProspectIcon;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const ProspectIconActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#6ru8l4o1ha)\">\n <path d=\"M13.657 10.343a7.97 7.97 0 0 0-3.04-1.907 4.623 4.623 0 0 0 2.008-3.811A4.63 4.63 0 0 0 8 0a4.63 4.63 0 0 0-4.625 4.625c0 1.58.796 2.977 2.008 3.811a7.968 7.968 0 0 0-3.04 1.907A7.947 7.947 0 0 0 0 16h1.25a6.751 6.751 0 0 1 3.159-5.713l1.638 1.97 1.328-1.12V16h1.25v-4.877l1.365 1.131 1.614-1.959A6.751 6.751 0 0 1 14.75 16H16a7.948 7.948 0 0 0-2.343-5.657zm-7.454.147-.65-.781a6.704 6.704 0 0 1 2.113-.45L6.203 10.49zM4.625 4.625A3.379 3.379 0 0 1 8 1.25a3.379 3.379 0 0 1 3.375 3.375A3.379 3.379 0 0 1 8 8a3.379 3.379 0 0 1-3.375-3.375zm5.197 5.867-1.49-1.234a6.705 6.705 0 0 1 2.13.457l-.64.777z\" fill=\"#212121\"/>\n </g>\n <defs>\n <clipPath id=\"6ru8l4o1ha\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>);\n }\n);\n\nexport default ProspectIconActive;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SituationIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#40w8w2vhfa)\">\n <path d=\"M4.375 1.875a1.25 1.25 0 1 1-2.5 0 1.25 1.25 0 0 1 2.5 0zM.625 5.938v1.937h5V5.937c0-.862-.7-1.562-1.563-1.562H2.188c-.862 0-1.562.7-1.562 1.563zM12.875.625h-2.25a2.5 2.5 0 0 0-2.5 2.5v2.5h4.75a2.5 2.5 0 0 0 0-5zm0 7.5a1.25 1.25 0 1 1 0 2.5 1.25 1.25 0 0 1 0-2.5zm-2.5 5.313v1.937h5v-1.938c0-.862-.7-1.562-1.563-1.562h-1.874c-.863 0-1.563.7-1.563 1.563zm-9.75-.563a2.5 2.5 0 0 0 2.5 2.5h4.75v-2.5a2.5 2.5 0 0 0-2.5-2.5h-2.25a2.5 2.5 0 0 0-2.5 2.5z\" stroke=\"#6D7F8C\" stroke-width=\"1.3\" stroke-miterlimit=\"10\"/>\n </g>\n <defs>\n <clipPath id=\"40w8w2vhfa\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n</svg>);\n }\n);\n\nexport default SituationIcon;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SituationIconActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className }, ref) => {\n return (<svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#r9v6jdbmua)\">\n <path d=\"M4.375 1.875a1.25 1.25 0 1 1-2.5 0 1.25 1.25 0 0 1 2.5 0zM.625 5.938v1.937h5V5.937c0-.862-.7-1.562-1.563-1.562H2.188c-.862 0-1.562.7-1.562 1.563zM12.875.625h-2.25a2.5 2.5 0 0 0-2.5 2.5v2.5h4.75a2.5 2.5 0 0 0 0-5zm0 7.5a1.25 1.25 0 1 1 0 2.5 1.25 1.25 0 0 1 0-2.5zm-2.5 5.313v1.937h5v-1.938c0-.862-.7-1.562-1.563-1.562h-1.874c-.863 0-1.563.7-1.563 1.563zm-9.75-.563a2.5 2.5 0 0 0 2.5 2.5h4.75v-2.5a2.5 2.5 0 0 0-2.5-2.5h-2.25a2.5 2.5 0 0 0-2.5 2.5z\" stroke=\"#212121\" stroke-width=\"1.3\" stroke-miterlimit=\"10\"/>\n </g>\n <defs>\n <clipPath id=\"r9v6jdbmua\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\"/>\n </clipPath>\n </defs>\n </svg>);\n }\n);\n\nexport default SituationIconActive;","export const SalesMethologies = [{\n name: \"None (default)\",\n value: 'null'\n},{\n name: \"Focuses on teaching, tailoring, and taking control. Challenge the customer's thinking by offering unique insights and pushing them out of their comfort zone. Best for complex sales environments where customers are well-informed.\",\n value: 'The Challenger Sale',\n}, {\n name: \"Emphasizes building a relationship as a trusted advisor. Uses a non-traditional approach by avoiding hard selling and instead encourages the customer to discover their own needs through guided questioning. Suitable for creating long-term customer relationships.\",\n value: 'Sandler Sales Training'\n}, {\n name: \"Centers around four types of questions — Situation, Problem, Implication, Need-payoff. Aims to lead the customer through a discovery process, identifying and understanding their problems and the impact of solving these. Effective for high-value, consultative sales.\",\n value: 'SPIN Selling'\n}, {\n name: \"Focuses on understanding and managing complex sales processes. This methodology involves identifying key decision-makers, understanding customer organization, and strategically aligning sales efforts. Ideal for B2B sales with multiple stakeholders.\",\n value: 'Miller-Heiman'\n}, {\n name: \"Based on the principle of diagnosing the customer's needs and then offering the best solution. Involves active listening, problem identification, and addressing specific pain points with tailored solutions. Suitable for selling products or services that require customization to client needs.\",\n value: 'Solution Selling'\n}]","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding: 0 24px 24px 24px;\n\n .sales-method-select {\n border: 0px;\n\n .sales-method-select-input {\n width: calc(100% - 10px);\n div {\n color: var(--ps-black-1);\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n .content-area {\n padding: 0px\n }\n .selected-item, .content-area > div {\n padding: 8px;\n margin: 0px;\n border-radius: 0px;\n display: inline-block;\n font-size: 15px;\n width: 100%;\n\n .bold-text {\n color: var(--ps-grey-1);\n\n b {\n color: var(--ps-black-1)\n }\n }\n }\n\n .selected-item, .content-area > div:hover {\n background: var(--ps-blue-main);\n\n .bold-text {\n color: var(--ps-white-1) !important;\n b {\n color: var(--ps-white-1) !important;\n }\n\n }\n }\n }\n`;\n\nexport const Title = styled.div`\n display: flex;\n justify-content: space-between;\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 5px;\n`;\n\nexport const TitleContainer = styled.div`\n display: flex;\n`;\n","import { Field, Formik } from \"formik\";\nimport { ChangeEvent } from \"react\";\nimport { FormikSelect } from \"../../../../ui/components/FormikSelect\";\nimport { QuestionTooltip } from \"../../../../ui/components/Tooltip/QuestionTooltip\";\nimport { QuestionContainer, TooltipContainer, TootlipContent } from \"../../../CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/styles\";\nimport useGoogleAnalyticsWithRoleplay from \"../../GoogleAnalytics\";\nimport { SalesMethologies } from \"./constants\";\nimport { Container, Title, TitleContainer } from \"./styles\";\nimport { AiParamTexboxProps } from \"./types\";\n\nfunction AIParamSelect({ title, tooltip, onChange, value, dataTest, isEditMode, analyticsKey }: AiParamTexboxProps) {\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n\n return <Container>\n <Title>\n <TitleContainer data-test={`${dataTest}-title`}>\n {title}\n <QuestionContainer>\n <QuestionTooltip\n position=\"top\"\n action={() => trackEventWithRoleplay(`${analyticsKey}_hint`)}\n text={<TooltipContainer>\n <TootlipContent>{tooltip}</TootlipContent>\n </TooltipContainer>}\n isHtmlContent={true}\n dataTest={`${dataTest}-tooltip`}\n />\n </QuestionContainer>\n </TitleContainer>\n </Title>\n {!isEditMode ?\n <div className=\"bold-text\" data-test={dataTest + '-text'}><b>{value !== 'null' ? value + ':' : SalesMethologies.find((item) => value === item.value)?.name}</b> {value !== 'null' && SalesMethologies.find((item) => value === item.value)?.name}</div>\n :\n <Formik\n initialValues={{ method: '' }}\n onSubmit={() => {}}\n >\n <Field\n items={SalesMethologies}\n value={value}\n component={FormikSelect}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n height={40}\n variant=\"outlined\"\n name={'method'}\n className=\"sales-method-select\"\n dataTest={`${dataTest}-dropdown`}\n menuPosition='top'\n customMenuItem={(item: { value: string, name: string }) => <div className=\"bold-text\"><b>{item.value !== 'null' ? item.value + ':' : item.name}</b> {item.value !== 'null' && item.name}</div>}\n />\n </Formik>\n }\n\n </Container>\n}\n\nexport default AIParamSelect;","import AIParamSelect from './controller';\n\nexport default AIParamSelect;","import styled from 'styled-components';\n\nexport const Container = styled.div<{ isFocused: boolean }>`\n padding: 0 24px 24px 24px;\n \n .rolename-textbox {\n border-radius: 4px;\n padding: 7px 11px;\n background: var(--ps-grey-3);\n border: 1px solid ${props => props.isFocused ? 'var(--ps-grey-2)' : 'var(--ps-grey-3)'};\n\n textarea {\n padding: 0;\n min-height: 140px;\n font-size: 15px;\n line-height: 18px !important;\n background: transparent !important;\n\n &:disabled {\n color: var(--ps-grey-2);\n }\n \n ::placeholder {\n color: var(--ps-grey-22) !important;\n }\n }\n }\n\n .rolename-textbox.warning {\n border: 1px solid var(--ps-red-main);\n }\n`;\n\nexport const Title = styled.div`\n display: flex;\n justify-content: space-between;\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 8px;\n`;\n\nexport const TitleContainer = styled.div`\n display: inline-block;\n`;\n\nexport const RequiredText = styled.span`\n color: var(--ps-grey-1)\n`;\n\nexport const TextAreaContainer = styled.div `\n cursor: pointer;\n`\n\nexport const ParamsContainer = styled.div<{isDisabled?: boolean}>`\n position: relative;\n cursor: pointer;\n ${props => props.isDisabled && 'pointer-events: none;'}\n :hover {\n .pencil-container {\n visibility: visible\n }\n }\n`\n\nexport const TextContainer = styled.div<{isEmpty: boolean}>`\n max-width: 472px;\n font-family: Manrope;\n font-size: 15px;\n font-weight: normal;\n line-height: 1.33;\n text-align: left;\n color: ${props => !props.isEmpty ? 'var(--ps-black-1)' : 'var(--ps-grey-2)'};\n`;\n\nexport const WarningText = styled.span`\n color: var(--ps-red-main);\n font-size: 11px;\n`;","import { useEffect, useState } from \"react\";\nimport TextAreaPlaceholderBox from \"../../../../ui/components/TextAreaPlaceholderBox/TextAreaPlaceholderBox\";\nimport { QuestionTooltip } from \"../../../../ui/components/Tooltip/QuestionTooltip\";\nimport { QuestionContainer, TooltipContainer, TootlipContent } from \"../../../CompanySettings/components/CompanyVoice/components/PartialVoiceSettings/styles\";\nimport useGoogleAnalyticsWithRoleplay from \"../../GoogleAnalytics\";\nimport { Container, TextContainer, RequiredText, ParamsContainer, TextAreaContainer, Title, TitleContainer, WarningText } from \"./styles\";\nimport { AiParamTexboxProps } from \"./types\";\n\nfunction AIParamTextbox({ title, placeholder, isRequired, isInvalid, tooltip, onChange, value, autoFocus, dataTest, isEditMode, onFocus, isDisabled, analyticsKey }: AiParamTexboxProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [warningText, setWarningText] = useState('');\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n const max = 500;\n\n useEffect(() => {\n setWarningText(isInvalid ? 'This field can’t be empty' : '' )\n }, [isInvalid]);\n\n return <Container isFocused={isFocused}>\n <Title>\n <TitleContainer data-test={`${dataTest}-title`}>\n <span>{title}\n {isRequired &&\n <RequiredText data-test={`${dataTest}-required`}>\n {` (required)`}\n </RequiredText>}</span>\n <QuestionContainer>\n <QuestionTooltip\n action={() => trackEventWithRoleplay(`${analyticsKey}_hint`)}\n text={<TooltipContainer>\n <TootlipContent>{tooltip}</TootlipContent>\n </TooltipContainer>}\n isHtmlContent={true}\n dataTest={`${dataTest}-tooltip`}\n />\n </QuestionContainer>\n </TitleContainer>\n </Title>\n {!isEditMode ? <TextContainer isEmpty={!value} data-test={dataTest + '-text'}>{value ? value : 'Not specified. Click the Edit Context to change it.'}</TextContainer> : <ParamsContainer isDisabled={isDisabled}>\n <TextAreaContainer>\n <TextAreaPlaceholderBox\n max={max}\n maxRows={10}\n minHeight=\"140px\"\n placeholder={placeholder}\n value={value}\n className={`rolename-textbox ${!!warningText ? 'warning' : ''}`}\n onChange={e => {\n if (e.target.value === '' || e.target.value.length === max) {\n isRequired && e.target.value === '' && setWarningText('This field can’t be empty'); \n e.target.value.length === max && setWarningText('Character limit reached'); \n } else {\n setWarningText('');\n }\n \n onChange(e.target.value);\n }}\n onBlur={() => setIsFocused(false)}\n onFocus={(e) => {\n let val = e.target.value;\n e.target.value = '';\n e.target.value = val;\n onFocus?.(e);\n setIsFocused(true)\n }}\n dataTest={`${dataTest}-textbox`}\n autoFocus={autoFocus}\n counterPosition=\"left\"\n key=\"rolename-focus\"\n counterWarningText={!!warningText ? <WarningText> • {warningText} </WarningText> : undefined}\n />\n </TextAreaContainer>\n </ParamsContainer>}\n </Container>\n}\n\nexport default AIParamTextbox;","\n\nimport AIParamSelect from \"../AIParamSelect\";\nimport AIParamTextbox from \"../AIParamTextbox/controller\";\nimport { AiParamsProps } from \"./types\"\n\nfunction ObjectiveAiParam({ handleChange, roleplayData, isEditMode, autoFocus, analyticsKey }: AiParamsProps) {\n return <>\n <AIParamTextbox title=\"Describe the objective you want the Salesperson to achieve in this situation\"\n tooltip=\"Provide a clear and specific goal for the salesperson in this scenario. This could be closing a deal, scheduling a follow-up meeting, introducing a new product, or addressing a client's concern. The more precise your objective, the more tailored the AI-generated script will be.\"\n isRequired={false}\n isEditMode={isEditMode}\n placeholder=\"For example: Salesperson should convince the homeowner to subscribe to Eco-friendly Lawn Care Package. Emphasize its affordability, efficiency, and how it aligns with their desire for a beautiful garden with minimal environmental impact. Address their budget concerns by highlighting the long-term cost-effectiveness and proven results of this package, overcoming their resistance to new solutions.\"\n onChange={(val) => handleChange('objectiveRep', val)}\n value={roleplayData?.objectiveRep} autoFocus={autoFocus}\n analyticsKey={`${analyticsKey}_goal`}\n dataTest=\"rep-objective\" />\n <AIParamTextbox title=\"List key recommendations, tactics, or nuances the Salesperson should consider\"\n tooltip=\"Detail any specific strategies, communication styles, or persuasive tactics that the salesperson should use in this situation. Consider the customer's personality, preferences, and potential objections.\"\n isRequired={false}\n isEditMode={isEditMode}\n analyticsKey={`${analyticsKey}_nuances`}\n placeholder=\"For example: Highlight the time-saving and expertise aspects of the Eco-friendly Lawn Care Package, appealing to the homeowner's need for convenience. Use empathetic communication to acknowledge their budget concerns, suggesting the long-term savings of the package. Avoid aggressive sales tactics; instead, use testimonials or case studies to build trust and demonstrate the effectiveness and value of the service.\"\n onChange={(val) => handleChange('objectiveNuances', val)} value={roleplayData?.objectiveNuances} dataTest=\"nuances\" />\n <AIParamSelect title=\"Choose a sales methodology\"\n tooltip=\"Select a sales approach that aligns with the situation. Each methodology has unique principles and tactics that can be more effective depending on the customer's needs, decision-making style, and the nature of the product or service being offered.\"\n onChange={(val) => handleChange('salesMethod', val)}\n value={roleplayData?.salesMethod}\n dataTest=\"sales-method\" \n analyticsKey={`${analyticsKey}_method`}\n isEditMode={isEditMode}\n />\n </>\n}\n\nexport default ObjectiveAiParam","import AIParamTextbox from \"../AIParamTextbox/controller\"\nimport { AiParamsProps } from \"./types\"\n\nfunction ProductAiParam({ handleChange, roleplayData, emptyRequiredProps, isEditMode, autoFocus, analyticsKey }: AiParamsProps) {\n return <AIParamTextbox title=\"Describe the product or service, highlighting its features, price, unique selling points\" tooltip=\"Provide a concise description of the product or service, focusing on its key features, pricing, and unique selling points.\" isRequired={true} isEditMode={isEditMode}\n isInvalid={emptyRequiredProps?.includes('product')}\n analyticsKey={`${analyticsKey}_product`}\n placeholder=\"For example: Eco-friendly Lawn Care Package. Priced at $150 per month, this comprehensive service includes bi-weekly lawn mowing, seasonal fertilization, and organic weed control. Emphasizing sustainability and efficiency, this package offers long-term garden health with minimal environmental impact, designed to fit within a modest budget.\"\n onChange={(val) => handleChange('product', val)} value={roleplayData?.product} autoFocus={autoFocus} dataTest=\"product\"></AIParamTextbox>\n}\n\nexport default ProductAiParam","import AIParamTextbox from \"../AIParamTextbox/controller\"\nimport { AiParamsProps } from \"./types\"\n\nfunction ProspectAiParam({ handleChange, roleplayData, isEditMode, emptyRequiredProps, autoFocus, analyticsKey }: AiParamsProps) {\n return <AIParamTextbox title=\"Describe the customer's profile and characteristics\" tooltip=\"Provide a detailed description of the customer, including their personality, behavior, and any relevant background information, so AI can tailor the Roleplay to realistic Customer responses.\"\n isRequired={true}\n isEditMode={isEditMode}\n analyticsKey={`${analyticsKey}_customer`}\n placeholder=\"For example: A middle-aged homeowner passionate about gardening, yet lacking the time and expertise for regular maintenance. They are friendly but are constrained by a tight budget. The homeowner is cautious in decision-making and prefers cost-effective, proven solutions for yard and garden maintenance, showing some resistance to change and innovation.\"\n onChange={(val) => handleChange('prospect', val)}\n isInvalid={emptyRequiredProps?.includes('prospect')}\n value={roleplayData?.prospect} autoFocus={autoFocus} dataTest=\"prospect\"\n />\n \n}\n\nexport default ProspectAiParam","import AIParamTextbox from \"../AIParamTextbox/controller\"\nimport { AiParamsProps } from \"./types\"\n\nfunction SituationAiParam({ handleChange, roleplayData, isEditMode, emptyRequiredProps, autoFocus, analyticsKey }: AiParamsProps) {\n return <AIParamTextbox title=\"Describe the sales situation you want to explore\" tooltip=\"Provide a brief overview of the situation you're interested in. Include key elements like the overall setting and sales environment. This description will shape the AI-generated Roleplay, creating a tailored sales simulation for your practice.\"\n isRequired={true}\n isEditMode={isEditMode}\n analyticsKey={`${analyticsKey}_situation`}\n isInvalid={emptyRequiredProps?.includes('situation')}\n placeholder=\"For example: A homeowner wants to improve their yard and garden. A salesperson from a local landscaping company visits their home to assess the area and provide expert advice. They discuss various options for lawn care, garden maintenance, and the best equipment and services to create a beautiful and thriving outdoor space.\"\n onChange={(val) => handleChange('situation', val)} value={roleplayData?.situation} autoFocus={autoFocus} dataTest=\"situation\"></AIParamTextbox>\n}\n\nexport default SituationAiParam","import ObjectiveIcon from \"../../../ui/icons/ObjectiveIcon\";\nimport ObjectiveIconActive from \"../../../ui/icons/ObjectiveIconActive\";\nimport ProductIcon from \"../../../ui/icons/ProductIcon\";\nimport ProductIconActive from \"../../../ui/icons/ProductIconActive\";\nimport ProspectIcon from \"../../../ui/icons/ProspectIcon\";\nimport ProspectIconActive from \"../../../ui/icons/ProspectIconActive\";\nimport SituationIcon from \"../../../ui/icons/SitationIcon\";\nimport SituationIconActive from \"../../../ui/icons/SitationIconActive\";\nimport ObjectiveAiParam from \"../components/AiParamsComponents/Objective\";\nimport ProductAiParam from \"../components/AiParamsComponents/ProductService\";\nimport ProspectAiParam from \"../components/AiParamsComponents/Prospect\";\nimport SituationAiParam from \"../components/AiParamsComponents/Situation\";\nimport { RolePlayContextParams, RoleplayRouteTypes } from \"./types\";\n\nexport const RouteSettings: {\n text: string;\n icon: any;\n iconActive: any;\n name: RoleplayRouteTypes\n}[] = [\n {\n text: \"Situation\",\n icon: SituationIcon,\n iconActive: SituationIconActive,\n name: 'situation'\n },\n {\n text: \"Customer\",\n icon: ProspectIcon,\n iconActive: ProspectIconActive,\n name: 'prospect'\n },\n {\n text: \"Product\",\n icon: ProductIcon,\n iconActive: ProductIconActive,\n name: \"product\"\n },\n {\n text: \"Approach\",\n icon: ObjectiveIcon,\n iconActive: ObjectiveIconActive,\n name: \"objective\"\n }\n ]\n\nexport const routeComponents = {\n 'situation': SituationAiParam,\n 'prospect': ProspectAiParam,\n \"product\": ProductAiParam,\n \"objective\": ObjectiveAiParam,\n}\n\nexport const initialRolePlayData = {\n title: 'Untitled',\n salesMethod: 'null',\n 'situation': '',\n 'prospect': '',\n \"product\": '',\n 'objectiveRep': '',\n 'objectiveNuances': ''\n}\n\n// keys for google analytics\nexport const keysForGA = {\n 'salesMethod': 'method',\n 'situation': 'situation',\n 'prospect': 'customer',\n \"product\": 'product',\n 'objectiveRep': 'goal',\n 'objectiveNuances': 'nuances'\n}\n\nexport const requiredContextParams: RolePlayContextParams[] = ['situation', 'prospect', 'product']","import styled from 'styled-components';\n\nexport const ModalContent = styled.div`\n display: flex;\n flex-direction: row;\n min-height: 215px;\n`;\n\nexport const ModalSidebar = styled.div`\n display: flex;\n justify-content: space-between;\n flex-direction: column;\n background-color: var(--ps-grey-3);\n width: 190px;\n background-color: var(--ps-grey-3);\n border-right: 1px solid var(--ps-grey-4);\n border-bottom-left-radius: 8px;\n`;\n\nexport const NavigationItem = styled.div<{ isActive: boolean }>`\n margin-top: 18px;\n padding-left: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n font-size: 13px;\n color: ${props => props.isActive ? 'var(--ps-black-main)' : 'var(--ps-grey-1)'};\n display: flex;\n text-decoration: none;\n position: relative;\n font-weight: bold;\n cursor: pointer;\n\n &:first-child {\n margin-top: 24px;\n }\n\n &:hover {\n color: var(--ps-black-main);\n & .act-icon {\n display: block;\n }\n & .icon {\n display: none;\n }\n }\n\n .act-icon {\n display: none\n }\n\n .icon {\n display: block;\n }\n\n ${props => props.isActive && `&::before {\n width: 4px;\n height: 24px;\n background: var(--ps-black-main);\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n border-radius: 0 10px 10px 0;\n } \n \n .act-icon {\n display: block;\n }\n .icon {\n display: none;\n }\n `}\n`;\n\nexport const NavigationIcon = styled.div`\n width: 16px;\n height: 16px;\n color: var(--ps-black-main);\n margin-right: 12px;\n`;\n\nexport const TabContent = styled.div`\n width: 627px;\n min-height: 636px;\n padding-top: 24px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nexport const Title = styled.div`\n font-size: 15px;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n border-top: 1px solid var(--ps-grey-4);\n padding: 23px 5px 0 5px;\n width: 100%;\n box-sizing: border-box;\n height: 64px;\n align-items: center;\n padding: 0 24px 0 0;\n`;","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useCreateRoleplayApi } from '../../../api/roleplay';\nimport ROUTES from '../../../routes/routes';\nimport { useHistory } from '../../../tools/router';\nimport { Button } from '../../../ui/components/Button';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ModalWithCross } from '../../../ui/components/ModalWithCross';\nimport { ModalTitle } from '../../../ui/components/ModalWithCross/styles';\nimport useGoogleAnalyticsWithRoleplay from '../GoogleAnalytics';\nimport { initialRolePlayData, keysForGA, requiredContextParams, routeComponents, RouteSettings } from './constants';\nimport { Footer, ModalContent, ModalSidebar, NavigationIcon, NavigationItem, TabContent, Title } from './styles';\nimport { RolePlayContextParams, RoleplayCreateProps, RoleplayData, RoleplayRouteTypes } from './types';\n\nfunction RoleplayCreate({\n closeGoingBack,\n closePath\n}: RoleplayCreateProps) {\n const [activePage, setActivePage] = useState<RoleplayRouteTypes>('situation');\n const [roleplayData, setRoleplayData] = useState<RoleplayData>(initialRolePlayData);\n const [emptyRequiredProps, setEmptyRequiredProps] = useState<RolePlayContextParams[]>();\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n const infoPanel = localStorage.getItem('infoPanel');\n\n const history = useHistory();\n const showMessage = useShowMessage();\n\n const createRoleplay = useCreateRoleplayApi();\n const prevLocation = history.location.state?.prevLocation ?? history.location.state?.background;\n const handleChange = (key: RolePlayContextParams, value: string) => {\n setRoleplayData(roleplayData ? { ...roleplayData, [key]: value } : { [key]: value })\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => trackEventWithRoleplay('context_wizard_screen_open'), []);\n\n const routes = Object.keys(routeComponents);\n const handleClose = useCallback(() => {\n if (closeGoingBack && prevLocation) {\n history.replace(prevLocation.pathname);\n } else {\n history.replace(closePath);\n }\n trackEventWithRoleplay('context_wizard_screen_close');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [closeGoingBack, closePath, history, prevLocation]);\n\n const isValidForm = () => {\n const arr: RolePlayContextParams[] = [];\n requiredContextParams.forEach((item) => {\n if (item === activePage && roleplayData?.[item] === '') {\n arr.push(item)\n }\n });\n\n if (arr?.length) {\n setEmptyRequiredProps(arr?.length ? arr : undefined);\n return false;\n } else {\n setEmptyRequiredProps(undefined);\n }\n return true;\n }\n\n const handlePrevNext = (step: number) => {\n if (!isValidForm()) {\n return;\n }\n\n const index = routes.indexOf(activePage);\n setActivePage(routes[index + step] as RoleplayRouteTypes);\n }\n\n const saveRolePlay = () => {\n roleplayData && createRoleplay(roleplayData).then((roleplay) => {\n showMessage('Roleplay has been created', 'success');\n\n trackEventWithRoleplay('context_wizard_screen_create');\n trackEventWithRoleplay('roleplay_screen_open_new');\n\n roleplayData && Object.entries(roleplayData).forEach(([key, value]) => {\n if (value !== initialRolePlayData[key as keyof typeof initialRolePlayData]) {\n const keyGA = keysForGA[key as keyof typeof keysForGA];\n keyGA && trackEventWithRoleplay(`context_wizard_screen_${keyGA}_filled`);\n }\n });\n\n history.push(`${ROUTES.ROLEPLAYS.SINGLE.replace(\n ':roleplayId',\n roleplay.id.toString()\n )}`)\n infoPanel === null && localStorage.setItem(\n 'infoPanel',\n 'true'\n );\n }).catch((e) => {\n showMessage(e.message, 'error');\n });\n }\n\n const Component = useMemo(() => routeComponents[activePage], [activePage]);\n\n return (<ModalWithCross\n titleContent={\n <ModalTitle>\n <Title data-test=\"roleplay-create-modal-title\">New Roleplay AI</Title>\n </ModalTitle>\n }\n onClose={handleClose}\n width={790}\n dataTest=\"roleplay-create-modal\"\n >\n <ModalContent>\n <ModalSidebar>\n <div>\n {RouteSettings.map((route) => {\n const isActive = activePage === route.name;\n return <NavigationItem\n data-test={`${route.name}-tab`}\n onClick={() => {\n if (!isValidForm()) {\n return;\n }\n setActivePage(route.name);\n }}\n isActive={isActive}\n key={route.name}\n >\n <NavigationIcon><route.iconActive className=\"act-icon\" /><route.icon className=\"icon\" /></NavigationIcon>\n {route.text}\n </NavigationItem>\n })}\n </div>\n </ModalSidebar>\n <TabContent>\n <Component handleChange={handleChange} roleplayData={roleplayData} autoFocus={true} isEditMode={true} emptyRequiredProps={emptyRequiredProps} analyticsKey={'context_wizard_screen'} />\n <Footer>\n {routes.indexOf(activePage) !== 0 && <Button\n width=\"130px\"\n height=\"40px\"\n loadingColor=\"white\"\n loadingSize={24}\n dataTest=\"previous-button\"\n variant='inverse'\n style={{ marginRight: '10px' }}\n action={() => handlePrevNext(-1)}\n >\n Previous\n </Button>}\n {routes.indexOf(activePage) < routes.length - 1 && <Button\n width=\"130px\"\n height=\"40px\"\n loadingColor=\"white\"\n loadingSize={24}\n dataTest=\"next-button\"\n action={() => handlePrevNext(1)}\n >\n Next\n </Button>}\n {routes.indexOf(activePage) === routes.length - 1 && <Button\n width=\"130px\"\n height=\"40px\"\n loadingColor=\"white\"\n loadingSize={24}\n dataTest=\"create-button\"\n action={saveRolePlay}\n >\n Create\n </Button>}\n </Footer>\n </TabContent>\n </ModalContent>\n </ModalWithCross>)\n}\n\nexport default RoleplayCreate;","import RoleplayCreate from './controller';\n\nexport default RoleplayCreate;","import { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const InfoIcon = forwardRef<SVGSVGElement, IconProps>(\n () => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#92d0cvhvka)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zM0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm6.5-.25A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75zM8 6a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\" fill=\"#24292E\" />\n </g>\n <defs>\n <clipPath id=\"92d0cvhvka\">\n <path fill=\"#fff\" d=\"M0 0h16v16H0z\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n);","import { useEffect, useRef, useState } from 'react';\nimport { getConfig } from '../../../tools/config';\n\ninterface WebSocketHook {\n sendMessage: (message: Message) => void;\n closeConnection: () => void;\n response: string;\n}\n\ntype Message = {\n event: 'authenticate' | 'watch',\n data: string\n}\n\nconst useWebSocket = (): WebSocketHook => {\n const [response, setResponse] = useState<string>('');\n const socketRef = useRef<WebSocket | null>(null);\n const currentConnection = useRef<number | null>(null);\n\n const config = getConfig();\n const url = config.API_SOCKET_ENDPOINT;\n\n const createWebSocket = () => {\n const newSocket = new WebSocket(url);\n socketRef.current = newSocket;\n\n newSocket.addEventListener('open', () => {\n setResponse('opened');\n if (currentConnection.current !== null) {\n currentConnection.current = null;\n }\n });\n\n newSocket.addEventListener('message', (event) => {\n setResponse(event.data);\n });\n\n newSocket.addEventListener('close', (event) => {\n if (!currentConnection.current) {\n currentConnection.current = 1\n createWebSocket();\n }\n });\n };\n\n const closeConnection = () => {\n if (currentConnection.current !== null) {\n currentConnection.current = null;\n }\n if (socketRef.current !== null) {\n socketRef.current.close();\n }\n }\n\n useEffect(() => {\n createWebSocket();\n\n return () => {\n closeConnection()\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const sendMessage = (message: Message) => {\n if (socketRef.current && socketRef.current.readyState === WebSocket.OPEN) {\n socketRef.current.send(JSON.stringify(message));\n }\n };\n\n return { sendMessage, response, closeConnection };\n};\n\nexport default useWebSocket;\n\n","import styled from 'styled-components';\nimport AvatarPlaceholder from '../../../ui/components/AvatarPlaceholder/AvatarPlaceholder';\nimport { Button } from '../../../ui/components/Button';\n\nexport const HeaderContainer = styled.div`\n height: 68px;\n display: flex;\n justify-content: start;\n border-bottom: 1px solid var(--ps-grey-4);\n align-items: start;\n padding-left: 24px;\n`;\n\nexport const Header = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 12px;\n`;\n\nexport const Title = styled.div`\n font-size: 20px;\n font-weight: 800;\n line-height: 1.4;\n display: flex;\n align-items: center;\n`;\n\nexport const SubTitle = styled.div`\n font-size: 18px;\n font-weight: 800;\n padding-left: 24px;\n`;\n\nexport const BodyContainer = styled.div`\n width: 100%;\n display: flex;\n`;\n\nexport const ContextContainer = styled.div<{ fullHeight: boolean }>`\n width: 528px;\n height: calc(100vh - ${props => props.fullHeight ? 68 : 156}px);\n border-right: 1px solid var(--ps-grey-4);\n padding-top: 24px;\n overflow-y: hidden; \n`;\n\nexport const ParamsContainer = styled.div`\n height: calc(100vh - 180px);\n overflow-y: scroll;\n`;\n\nexport const ContentContainer = styled.div<{ fullHeight: boolean }>`\n height: calc(100vh - ${props => props.fullHeight ? 68 : 152}px);\n display: flex;\n justify-content: start;\n align-items: center;\n flex-direction: column;\n width: calc(100% - 528px);\n`;\n\nexport const IconContainer = styled.div`\n width: 12px;\n height: 12px;\n margin-right: 20px;\n cursor: pointer;\n margin-top: 17px;\n`;\n\nexport const NoEntryContainer = styled.div`\n color: var(--ps-grey-2);\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: auto;\n`;\n\nexport const IconCountainer = styled.div<{ isDisabled: boolean }>`\n margin-left: 10px;\n cursor: ${props => props.isDisabled ? 'default' : 'pointer'};\n`;\n\nexport const ModalBody = styled.div`\n padding: 35px;\n display: flex;\n flex-direction: column;\n align-items: self-end;\n`;\n\nexport const ModalText = styled.div`\n font-size: 13px;\n color: var(--ps-grey-1);\n margin-bottom: 32px;\n`;\n\nexport const ModalHeader = styled.div`\n font-size: 20px;\n font-weight: 800;\n font-stretch: normal;\n margin-bottom: 16px;\n width: 100%;\n`\n\nexport const Footer = styled.div`\n height: 84px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\n\nexport const ButtonContainer = styled.div`\n height: 88px;\n width: 100%;\n padding: 24px;\n display: flex;\n justify-content: start;\n align-items: center;\n\n button {\n margin-right: 16px;\n }\n\n .action-button-element {\n padding-left: 16px;\n }\n`\n\nexport const InfoText = styled.div`\n font-size: 15px;\n margin-left: 8px;\n line-height: 1.33;\n`;\n\nexport const Container = styled.div`\n width: 100%;\n position: relative;\n overflow: hidden;\n`;\n\nexport const ContentPanelContainer = styled.div<{height?: number}>`\n width: 100%;\n position: relative;\n overflow: scroll;\n height : ${props => props.height ? `calc(100% - ${props.height + 20}px)` : `calc(100% - 104px)`}\n`\n\nexport const BtnCont = styled.div`\n display: flex; \n justify-content: end;\n`;\n\nexport const Contentbox = styled.div`\n padding: 17px 40px;\n background: var(--ps-grey-3);\n border-bottom: 1px solid var(--ps-grey-4);\n justify-content: center;\n display: flex;\n`;\n\nexport const ContentBoxContainer = styled.div`\n width: 580px;\n`;\n\nexport const ContentItem = styled.div`\n display: flex;\n margin-bottom: 18px;\n &.error-item { flex-direction: column }\n\n .avatar-logo, .customer-logo {\n max-width: 32px;\n min-width: 32px;\n height: 32px;\n margin-right: 12px;\n }\n\n .avatar-logo.no-border {\n border: 0px;\n }\n\n .command-author-pic {\n font-weight: normal;\n }\n`;\n\nexport const Img = styled(AvatarPlaceholder)`\n max-width: 32px;\n height: 32px;\n border-radius: 4px;\n margin-right: 12px;\n border: 1px solid var(--ps-gey-4)\n`;\n\nexport const TextBox = styled.div`\n display: flex;\n`;\n\nexport const Author = styled.div`\n font-size: 15px;\n font-weight: 800;\n`;\n\nexport const Message = styled.p`\n font-size: 15px;\n max-width: 600px;\n min-width: 100px;\n margin: 0px;\n white-space: pre-line;\n\n b {\n font-weight: 600;\n }\n`;\n\nexport const Sendbox = styled.div`\n min-height: 100px;\n padding: 8px 40px;\n display: flex;\n justify-content: center;\n position: fixed;\n bottom: 0px;\n background: white;\n right: 0px;\n width: calc(100% - 776px);\n`;\n\nexport const SendBoxContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: start;\n width: 580px;\n`;\n\nexport const DateText = styled.div`\n color: var(--ps-grey-1);\n margin-bottom: 8px;\n font-size: 11px;\n font-weight: 500;\n`;\n\nexport const BtnContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n padding-right: 10px;\n`;\n\nexport const PlayButton = styled.div<{ isDisabled: boolean }>`\n width: 36px;\n height: 36px;\n margin-right: 10px;\n border-radius: 50%;\n border: 3px solid ${props => props.isDisabled ? 'var(--ps-grey-2) ' : 'var(--ps-blue-main) '}; \n cursor: ${props => !props.isDisabled && 'pointer'};\n \n .play-btn {\n color: ${props => props.isDisabled ? 'var(--ps-grey-2) ' : 'var(--ps-blue-main) '}; ;\n width: 12px;\n margin-left: 11px;\n}`;\n\nexport const SpinnerContainer = styled.div`\n width: 36px;\n height: 36px;\n position: relative;\n margin-right: 10px;\n\n .MuiCircularProgress-colorPrimary {\n color: var(--ps-blue-main);\n }\n\n .spinner-icn {\n position: absolute;\n top: 9px;\n left: 8px;\n }\n`;\n\n\nexport const StopIcon = styled.div`\n width: 12px;\n height: 12px;\n background: var(--ps-blue-main);\n margin: 9px auto;\n cursor: pointer;\n`;\n\nexport const MenuButton = styled.div<{ isDisabled?: boolean }>`\n height: 36px;\n margin-right: 10px;\n border-radius: 50%;\n background: ${props => props.isDisabled ? 'var(--ps-grey-2) ' : 'var(--ps-blue-main) '}; ;\n min-width: 36px;\n margin-left: ${props => props.isDisabled ? '0px' : '20px'};\n\n .dots-btn {\n rotate: 90deg;\n width: 19px;\n color: var(--ps-white-1);\n margin-left: 9px;\n }\n}`;\n\nexport const RoleplayMenuDots = styled(Button)<{ isDisabled?: boolean }>`\n max-width: 40px;\n padding: 0px;\n .dots-btn {\n rotate: 90deg;\n width: 20px;\n height: 20px;\n }\n`;\n\nexport const RegenerateBtn = styled.div<{ isDisabled?: boolean }>`\n font-size: 13px;\n font-weight: 500;\n color: ${props => props.isDisabled ? 'var(--ps-grey-2)' : 'var(--ps-blue-main)'};\n display: flex;\n align-items: center;\n justify-content: end;\n\n svg {\n margin-right: 4px;\n }\n\n cursor: ${props => props.isDisabled ? 'default' : 'pointer'};\n`;\n\nexport const CommandContainer = styled.div`\n margin-top: 23px;\n border-bottom: 1px solid var(--ps-grey-4);\n display: flex;\n justify-content: center;\n padding: 0px 40px;\n`;\n\nexport const CommandBox = styled.div`\n width: 580px;\n`; \n\nexport const ErrorContainer = styled.div`\n padding: 17px 41px;\n background-color: rgba(236, 81, 61, 0.1);\n border-bottom: 1px solid var(--ps-grey-4);\n display: flex;\n justify-content: center;\n \n .error-icon {\n margin-right: 10px;\n margin-top: 5px;\n max-width: 32px;\n min-width: 32px;\n }\n`;\n\nexport const ErrorBox = styled.div`\n width: 580px;\n`;\n\nexport const WarningBtnContainer = styled.div`\n display: flex;\n margin-right: 12px;\n margin-top: 12px;\n\n button:disabled {\n background: rgb(236, 81, 61, 0.4) !important;\n }\n\n button.inverse:disabled {\n div {\n border: 1px solid rgb(236, 81, 61, 0.4) !important;;\n }\n box-shadow: none;\n color: rgb(236, 81, 61, 0.4) !important;;\n background: transparent !important;\n }\n`;\n\nexport const BlueDot = styled.span`\n width: 12px;\n height: 12px;\n border-radius: 33px;\n background-color: var(--ps-blue-main);\n display: inline-block;\n margin-left: 5px;\n\n @keyframes pulse {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n\n animation: pulse 0.8s infinite;\n`;\n\nexport const StopGenIcon = styled.div<{ isDisabled?: boolean }>`\n width: 16px;\n height: 16px;\n margin: 1px 4px 1px 0;\n border: 2px solid ${props => props.isDisabled ? 'var(--ps-grey-2) ' : 'var(--ps-blue-main) '}; \n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n\n div {\n width: 6px;\n height: 6px;\n background: ${props => props.isDisabled ? 'var(--ps-grey-2) ' : 'var(--ps-blue-main) '}; ;\n \n border-radius: 1px;\n }\n`","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SendActive = forwardRef<SVGSVGElement, IconProps>(\n ({className, dataTest}) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" className={className} data-test={dataTest}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m3.333 2.1 18.438 9.219a.92.92 0 0 1 0 1.645L3.333 22.183c-.733.366-1.543-.336-1.284-1.113l2.67-8.009h7.663a.92.92 0 0 0 0-1.839H4.72L2.05 3.213C1.79 2.436 2.6 1.733 3.333 2.1z\" fill=\"#4AA9E2\" />\n </svg>);\n }\n);\n\nexport default SendActive;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const SendIcon = forwardRef<SVGSVGElement, IconProps>(\n ({className, dataTest}) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" className={className} data-test={dataTest}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m3.333 2.1 18.438 9.219a.92.92 0 0 1 0 1.645L3.333 22.183c-.733.366-1.543-.336-1.284-1.113l2.67-8.009h7.663a.92.92 0 0 0 0-1.839H4.72L2.05 3.213C1.79 2.436 2.6 1.733 3.333 2.1z\" fill=\"#B1C0CB\" />\n </svg>);\n }\n);\n\nexport default SendIcon;\n","import React, { ChangeEventHandler, FocusEventHandler, FC, KeyboardEvent } from 'react';\nimport styled from 'styled-components';\nimport { Textarea } from '../../../../ui/components/Textarea/Textarea';\nimport { Cross } from '../../../../ui/icons/Cross';\nimport { Check } from '@material-ui/icons';\nimport { Button } from '../../../../ui/components/Button';\nimport SendActive from '../../../../ui/icons/SendActive';\nimport SendIcon from '../../../../ui/icons/SendIcon';\n\nconst StyledFormikField = styled.div`\n margin-top: 10px;\n`;\n\nconst WarningText = styled.div`\n display: inline;\n color: var(--ps-red-main);\n`;\n\nconst StledTextareaContainer = styled.div<{\n isWarning?: boolean;\n width?: string;\n disabled?: boolean\n}>`\n position: relative;\n border-radius: 4px;\n padding: 4px;\n display: flex;\n align-items: center;\n width: ${props => props.width || 'auto'};\n min-height: 40px;\n padding: 8px 8px 8px 12px;\n border-radius: 4px;\n border: 1px solid ${props => props.disabled ? 'none' : (!props.isWarning ? 'var(--ps-grey-2)' : 'var(--ps-red-main)')};\n background: ${props => props.disabled ? 'var(--ps-grey-3)' : 'none'};\n\n .cross-button {\n width: 28px;\n height: 24px;\n padding: 0px;\n min-width: unset;\n }\n`;\n\nexport const CrossContainer = styled.div`\n width: 10px;\n height: 16px\n`;\n\nexport const BtnContainer = styled.div`\n margin-right: 8px\n`;\n\nexport const CheckContainer = styled.div`\n svg {\n width: 16px;\n margin-top: 3px;\n }\n`;\n\nexport const SendContainer = styled.div`\n height: 24px;\n\n .send-btn {\n color: var(--ps-blue-main);\n }\n\n .send-btn.active {\n cursor: pointer;\n }\n`;\n\nconst StyledTextarea = styled(Textarea) <{\n fontSize?: string;\n fontWeight?: number;\n minHeight?: string;\n disabled?: boolean;\n}>`\n min-height: ${props => props.minHeight};\n color: ${props => props.disabled && 'var(--ps-grey-2)'};\n &:disabled {\n background: transparent !important;\n }\n &::placeholder {\n font-size: '15px';\n font-weight: 600;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n }\n`;\n\nconst StyledCounter = styled.div<{disabled?: boolean}>`\n text-align: left;\n color: var(--ps-grey-10);\n font-size: 11px;\n margin-left: 12px;\n\n visibility: ${props => props.disabled ? 'hidden' : 'visible'}\n`;\n\nexport const TextInputWithButtons: FC<{\n value?: string;\n field?: any;\n form?: { touched: any; errors: any };\n name?: string;\n onChange?: ChangeEventHandler<HTMLTextAreaElement>;\n onFocus?: FocusEventHandler<HTMLTextAreaElement>;\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n onKeyDown?: (e: KeyboardEvent<HTMLTextAreaElement>) => void;\n max?: number;\n width?: string;\n background?: string;\n color?: string;\n disabled?: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n readOnly?: boolean;\n padding?: string;\n fontSize?: string;\n minRows?: number;\n maxRows?: number;\n borderRadius?: string;\n placeholderFontWeight?: number;\n minHeight?: string;\n counterColor?: string;\n textAreaMinHeight?: string;\n dataTest?: string;\n className?: string;\n onClose?: () => void;\n onApply?: () => void;\n isRequired?: boolean\n}> = ({\n field,\n value,\n disabled,\n max,\n autoFocus,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n placeholder,\n readOnly,\n minRows,\n placeholderFontWeight,\n textAreaMinHeight,\n dataTest,\n className,\n onClose,\n onApply,\n isRequired,\n maxRows,\n width\n}) => {\n const TextAreaStyles = {\n flex: 1,\n lineHeight: 1.13,\n letterSpacing: '0.4px',\n fontSize: '15px',\n };\n\n const isLimitReached = value?.length === max;\n\n return (\n <StyledFormikField>\n <StledTextareaContainer\n className={className}\n isWarning={isLimitReached || isRequired}\n data-test={`${dataTest}-container`}\n width={width}\n disabled={disabled}\n >\n <StyledTextarea\n value={value}\n styles={TextAreaStyles}\n {...field}\n placeholder={placeholder}\n max={max}\n onChange={onChange}\n onFocus={\n (e) => {\n let val = e.target.value;\n e.target.value = '';\n e.target.value = val;\n onFocus?.(e);\n }\n }\n onBlur={onBlur}\n disabled={disabled}\n autoFocus={autoFocus}\n readOnly={readOnly}\n fontSize={'15px'}\n minRows={minRows}\n maxRows={maxRows || 1}\n fontWeight={placeholderFontWeight}\n minHeight={textAreaMinHeight}\n dataTest={dataTest}\n onKeyDown={onKeyDown}\n />\n {!!onClose ? <>\n <BtnContainer>\n <Button variant='inverse' className='cross-button' action={onClose} dataTest={`${dataTest}-close-icon`}>\n <CrossContainer><Cross /></CrossContainer>\n </Button>\n </BtnContainer>\n <Button action={onApply} variant=\"primary\" className='cross-button' dataTest={`${dataTest}-apply-icon`} ><CheckContainer><Check /></CheckContainer></Button>\n </> :\n <>{\n disabled || value === '' ?\n <SendContainer><SendIcon className='send-btn' dataTest={`${dataTest}-send-icon`} /></SendContainer> :\n <SendContainer onClick={onApply}><SendActive className='send-btn active' dataTest={`${dataTest}-send-icon`} /></SendContainer>\n }\n </>\n }\n </StledTextareaContainer>\n {max && (\n <StyledCounter data-test={dataTest && `${dataTest}-counter`} disabled={disabled}>\n {value ? value.length : '0'}/{max}\n {isLimitReached &&\n <>\n <span data-test={`${dataTest}-text-dot`}>•</span>\n <WarningText data-test={`${dataTest}-warming-text`}> Character limit reached</WarningText>\n </>\n }\n {\n isRequired &&\n <>\n <span data-test={`${dataTest}-text-dot`}>•</span>\n <WarningText data-test={`${dataTest}-required-text`}> Title required</WarningText>\n </>\n }\n </StyledCounter>\n )}\n </StyledFormikField>\n );\n };\n\nexport default TextInputWithButtons;\n","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const RefreshCircle = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" data-test={dataTest}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 2.5a5.487 5.487 0 0 0-4.131 1.869l1.204 1.204A.25.25 0 0 1 4.896 6H1.25A.25.25 0 0 1 1 5.75V2.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.001 7.001 0 0 1 14.929 7h-1.52A5.502 5.502 0 0 0 8 2.5zM1.07 9a7.001 7.001 0 0 0 12.123 3.693l1.38 1.38a.25.25 0 0 0 .427-.177V10.25a.25.25 0 0 0-.25-.25h-3.646a.25.25 0 0 0-.177.427l1.204 1.204A5.502 5.502 0 0 1 2.591 9H1.07z\" fill=\"#4AA9E2\"/>\n</svg>);\n }\n);\n\nexport default RefreshCircle;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const WarningIcon = forwardRef<SVGSVGElement, IconProps>(\n ({ className, dataTest }) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" className={className} data-test={dataTest}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.046.327C9.255.117 9.539 0 9.835 0h12.33c.296 0 .58.118.79.327l8.718 8.719c.21.209.327.493.327.789v12.33c0 .296-.118.58-.327.79l-8.719 8.718c-.209.21-.493.327-.789.327H9.835c-.296 0-.58-.118-.79-.327L.328 22.954A1.116 1.116 0 0 1 0 22.165V9.835c0-.296.118-.58.327-.79L9.046.328z\" fill=\"#EC513D\" />\n <path d=\"M16 8.559c.617 0 1.116.5 1.116 1.116v6.697a1.116 1.116 0 1 1-2.232 0V9.675c0-.617.5-1.116 1.116-1.116zM16 23.442a1.488 1.488 0 1 0 0-2.977 1.488 1.488 0 0 0 0 2.977z\" fill=\"#fff\" />\n </svg>);\n }\n);\n\nexport default WarningIcon;\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Roleplay } from '../../../../constants/interfaces/Roleplay';\n\nexport interface RoleplayState {\n data?: Roleplay;\n isLoading: boolean;\n error?: string;\n}\n\nexport type RoleplayStateSelector = (state: any) => RoleplayState;\n\nexport const RoleplayStateSelectorContext = React.createContext<RoleplayStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useRoleplayState(): RoleplayState {\n return useSelector(useContext(RoleplayStateSelectorContext));\n}\n","export const commandTexts = {\n situation: 'Situation',\n prospect: 'Customer',\n product: 'Product',\n objectiveRep: 'Objective',\n objectiveNuances: 'Nuances & Tactics',\n salesMethod: 'Sales Methodology'\n}\n\nexport const commandPattern = /Change\\s(Situation|Customer|Product|Objective|Nuances & Tactics|Sales Methodology)\\sto:/g\n\nexport const formatConversationToClipboard = (title: string, conversation: Array<{ role: string, text: string }>, summary: string): string => {\n const formattedConversation = conversation.map(({ role, text }) => `[${role.toUpperCase()}] ${text}`).join('\\n\\n');\n const formattedRoleplay = `${title}\\n---\\n${formattedConversation}\\n---\\n${summary}`;\n return formattedRoleplay;\n}\n\n\nexport function downloadTxtFile(text: string, filename: string) {\n const blob = new Blob([text], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n \n const link = document.createElement('a');\n \n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n \n link.click();\n \n document.body.removeChild(link);\n \n URL.revokeObjectURL(url);\n}\n\n ","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const CustomerAvatar = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" data-test={dataTest} className={className}>\n <rect width=\"32\" height=\"32\" rx=\"4\" fill=\"#B1C0CB\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.481 25H23.52c.828-1.274.498-3.823-.33-4.673-.384-.395-3.407-1.18-4.8-1.527 1.498-1.167 2.41-3.322 2.41-5.377C20.8 10.428 19.928 8 16 8c-3.93 0-4.802 2.428-4.802 5.423 0 2.06.917 4.222 2.423 5.387-1.426.348-4.403 1.113-4.8 1.517-.835.85-1.172 3.399-.339 4.673zm9.118-5.206c2.006.48 4.36 1.137 4.906 1.43.343.44.641 1.839.426 2.716H9.07c-.217-.877.088-2.28.436-2.717.539-.294 2.88-.941 4.895-1.414v-1.696c-1.338-.906-2.132-2.878-2.132-4.67 0-2.421.622-4.385 3.73-4.385 3.11 0 3.731 1.964 3.731 4.385 0 1.79-.792 3.76-2.13 4.667v1.684z\" fill=\"#fff\" />\n </svg>\n );\n }\n);\n\nexport default CustomerAvatar;","import SidebarRoleplaysLarge from \"../../../../ui/icons/SidebarRoleplaysLarge\";\nimport { NoEntryContainer } from \"../../RoleplayPage/styles\";\nimport { Text } from \"../../RoleplaysList/styles\";\n\nfunction ContentLoading() {\n return <NoEntryContainer data-test=\"roleplay-loading-container\">\n <SidebarRoleplaysLarge dataTest=\"roleplay-loading-icon\" />\n <Text data-test=\"roleplay-loading-text\">Loading Roleplays...</Text>\n </NoEntryContainer>\n}\n\nexport default ContentLoading;","import { Roleplay } from \"../../../../constants/interfaces/Roleplay\";\n\nexport enum ACTIONS {\n GET_ROLEPLAY_START = 'GET_ROLEPLAY_START',\n GET_ROLEPLAY_SUCCESS = 'GET_ROLEPLAY_SUCCESS',\n GET_ROLEPLAY_FAILURE = 'GET_ROLEPLAY_FAILURE',\n UPDATE_ROLEPLAY_START = 'UPDATE_ROLEPLAY_START',\n UPDATE_ROLEPLAY_SUCCESS = 'UPDATE_ROLEPLAY_SUCCESS',\n UPDATE_ROLEPLAY_FAILURE = 'UPDATE_ROLEPLAY_FAILURE',\n CLEAR_ROLEPLAY = 'CLEAR_ROLEPLAY'\n}\n\nexport function getRoleplayStart() {\n return {\n type: ACTIONS.GET_ROLEPLAY_START as ACTIONS.GET_ROLEPLAY_START,\n };\n}\n\nexport function getRoleplaySuccess(data: Roleplay) {\n return {\n type: ACTIONS.GET_ROLEPLAY_SUCCESS as ACTIONS.GET_ROLEPLAY_SUCCESS,\n data\n };\n}\n\nexport function getRoleplayFailure(error: string) {\n return {\n type: ACTIONS.GET_ROLEPLAY_FAILURE as ACTIONS.GET_ROLEPLAY_FAILURE,\n error\n };\n}\n\nexport function updateRoleplayStart() {\n return {\n type: ACTIONS.UPDATE_ROLEPLAY_START as ACTIONS.UPDATE_ROLEPLAY_START,\n };\n}\n\nexport function updateRoleplaySuccess(data: Roleplay) {\n return {\n type: ACTIONS.UPDATE_ROLEPLAY_SUCCESS as ACTIONS.UPDATE_ROLEPLAY_SUCCESS,\n data\n };\n}\n\nexport function updateRoleplayFailure(error: string) {\n return {\n type: ACTIONS.UPDATE_ROLEPLAY_FAILURE as ACTIONS.UPDATE_ROLEPLAY_FAILURE,\n error\n };\n}\n\nexport function clearRoleplay() {\n return {\n type: ACTIONS.CLEAR_ROLEPLAY as ACTIONS.CLEAR_ROLEPLAY,\n };\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const RefreshCircleDisabled = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" data-test={dataTest}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 2.5a5.487 5.487 0 0 0-4.131 1.869l1.204 1.204A.25.25 0 0 1 4.896 6H1.25A.25.25 0 0 1 1 5.75V2.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.001 7.001 0 0 1 14.929 7h-1.52A5.502 5.502 0 0 0 8 2.5zM1.07 9a7.001 7.001 0 0 0 12.123 3.693l1.38 1.38a.25.25 0 0 0 .427-.177V10.25a.25.25 0 0 0-.25-.25h-3.646a.25.25 0 0 0-.177.427l1.204 1.204A5.502 5.502 0 0 1 2.591 9H1.07z\" fill=\"#B1C0CB\"/>\n</svg>);\n }\n);\n\nexport default RefreshCircleDisabled;","import { useDispatch } from 'react-redux'\nimport { useCallback } from 'react';\nimport { useCreateCommandRoleplayApi, useGetRoleplayApi, useGetRoleplayContentApi, useUpdateRoleplayApi } from '../../../../api/roleplay';\nimport { useShowMessage } from '../../../../ui/components/ErrorMessages/ErrorMessages';\nimport { ConversationItem, Roleplay } from '../../../../constants/interfaces/Roleplay';\nimport {\n getRoleplayStart,\n getRoleplaySuccess,\n getRoleplayFailure,\n updateRoleplayStart,\n updateRoleplaySuccess,\n updateRoleplayFailure,\n clearRoleplay,\n} from './actions';\nimport { ErrorResult } from '../../../../constants/interfaces/ErrorResult';\nimport { RoleplayData } from '../../CreateRoleplay/types';\nimport { commandTexts } from '../constants';\nimport { useCompanyVoiceSettingsState } from '../../../CompanySettings/store/states';\nimport { getTextToSpeechSettingsOrDefault } from '../../../../features/textToSpeech/helpers';\nimport { useTextToSpeechService } from '../../../../features/textToSpeech/store/services';\n\n/**\n * @function useGetRoleplayService\n * @returns { CallableFunction }\n */\nexport const useGetRoleplayService = () => {\n const dispatch = useDispatch();\n const getRoleplayApi = useGetRoleplayApi();\n const showMessage = useShowMessage();\n const getRoleplayContent = useGetRoleplayContentApi();\n\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback((roleplayId) => {\n dispatch(getRoleplayStart());\n return getRoleplayApi(roleplayId)\n .then((data: Roleplay) => {\n if (data) {\n getRoleplayContent(roleplayId).then((content) => {\n const rp = { ...data, content: content || null }\n dispatch(getRoleplaySuccess(rp));\n })\n }\n })\n .catch((error: ErrorResult) => {\n dispatch(getRoleplayFailure(error.message));\n showMessage(error.message, 'error');\n });\n }, [dispatch, getRoleplayApi, showMessage, getRoleplayContent]);\n}\n\n\nexport const useUpdateRoleplayService = () => {\n const dispatch = useDispatch();\n const updateRoleplayApi = useUpdateRoleplayApi();\n const showMessage = useShowMessage();\n const createCommand = useCreateCommandRoleplayApi()\n\n return useCallback(\n (roleplayId, roleplay, keys?: RoleplayData, type?) => {\n dispatch(updateRoleplayStart());\n const rp = {\n title: roleplay.title,\n salesMethod: roleplay.salesMethod,\n 'situation': roleplay.situation,\n 'prospect': roleplay.prospect,\n \"product\": roleplay.product,\n 'objectiveRep': roleplay.objectiveRep,\n 'objectiveNuances': roleplay.objectiveNuances\n }\n return updateRoleplayApi(roleplayId, rp)\n .then(data => {\n dispatch(updateRoleplaySuccess({ ...roleplay, ...data }))\n\n if (type === 'command') {\n let str = '';\n if (keys) {\n str = Object.entries(keys).reduce((acc, [key, value]) => {\n const keyStr = commandTexts[key as keyof typeof commandTexts];\n return acc + `Change ${keyStr} to: ${value && value !== 'null' ? value : 'N/A'} \\n`;\n }, '');\n }\n\n createCommand({ roleplayId, text: str });\n }\n return data;\n })\n .catch((error: ErrorResult) => {\n dispatch(updateRoleplayFailure(error.message));\n showMessage(error.message, 'error');\n });\n },\n [dispatch, showMessage, updateRoleplayApi, createCommand]\n );\n};\n\n/**\n * @function useClearRoleplayService\n * @returns { CallableFunction }\n */\nexport const useClearRoleplayService = () => {\n const dispatch = useDispatch();\n /**\n * @function callbackFunction\n * @returns { Promise }\n */\n return useCallback(() => {\n dispatch(clearRoleplay());\n }, [dispatch]);\n}\n\nexport const useGenerateAudioForRoleplay = () => {\n const voiceSettings = useCompanyVoiceSettingsState().data;\n const textToSpeech = useTextToSpeechService();\n const settings = getTextToSpeechSettingsOrDefault(voiceSettings)\n return useCallback(async (lines: ConversationItem[]) => {\n const reportedLines = [];\n for (let line of lines) {\n const lineSettings = line.role === 'prospect'\n ? settings.customer\n : settings.representative;\n\n reportedLines.push(await textToSpeech(\n line.text,\n lineSettings,\n { feature: 'scenario', itemId: lines.indexOf(line) }\n ))\n }\n return reportedLines;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [settings])\n}","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const LoadingAudio = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow, dataTest }, ref) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" data-test={dataTest} className={className}>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.002 18h.002a.761.761 0 0 0 .771-.75V2.75a.761.761 0 0 0-.771-.75.76.76 0 0 0-.772.75v14.5a.76.76 0 0 0 .77.75zM6.657 5.75A.76.76 0 0 0 5.886 5a.76.76 0 0 0-.772.75v8.5c0 .414.346.75.772.75a.76.76 0 0 0 .771-.75v-8.5zm-4.114 3A.761.761 0 0 0 1.77 8 .76.76 0 0 0 1 8.75v2.5c0 .414.345.75.771.75a.761.761 0 0 0 .772-.75v-2.5zm10.804 5.5c0 .414.345.75.771.75a.761.761 0 0 0 .771-.75v-8.5a.761.761 0 0 0-.77-.75.76.76 0 0 0-.772.75v8.5zm4.114-3c0 .414.345.75.771.75a.761.761 0 0 0 .772-.75v-2.5a.76.76 0 0 0-.772-.75.761.761 0 0 0-.771.75v2.5z\" fill=\"#4AA9E2\" />\n </svg>\n );\n }\n);\n\nexport default LoadingAudio;","import { Author, ContentPanelContainer, DateText, Contentbox, ErrorContainer, ErrorBox, ContentBoxContainer, SendBoxContainer, CommandBox, RegenerateBtn, BtnContainer, PlayButton, ContentItem, Img, Message, BtnCont, Sendbox, TextBox, MenuButton, CommandContainer, NoEntryContainer, WarningBtnContainer, BlueDot, StopIcon, StopGenIcon, SpinnerContainer } from \"../styles\";\nimport dayjs from \"dayjs\";\nimport { ActionButton, ActionItem } from \"../../../../ui/components/ActionButton\";\nimport PlayIcon from \"../../../../ui/icons/PlayIcon\";\nimport Dots from \"../../../../ui/icons/Dots\";\nimport TextInputWithButtons from \"../../components/TextInputWithButtons/TextInputWithButtons\";\nimport RefreshCircle from \"../../../../ui/icons/RefreshCircle\";\nimport { KeyboardEvent, ReactElement, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCreateCommandRoleplayApi, useRegenerateRoleplayApi } from \"../../../../api/roleplay\";\nimport { getProfileState } from \"../../../UserProfile/store/reducers\";\nimport { useSelector } from \"react-redux\";\nimport { Button } from \"../../../../ui/components/Button\";\nimport WarningIcon from \"../../../../ui/icons/WarningIcon\";\nimport { useHistory } from \"../../../../tools/router\";\nimport ROUTES from \"../../../../routes/routes\";\nimport { useRoleplayState } from \"../store/states\";\nimport NamePlaceholder from '../../../../ui/components/AvatarPlaceholder';\nimport { getCompanyState } from \"../../../CompanySettings/store/reducers\";\nimport SidebarRoleplaysLarge from \"../../../../ui/icons/SidebarRoleplaysLarge\";\nimport { Text } from \"../../RoleplaysList/styles\";\nimport { commandPattern, downloadTxtFile, formatConversationToClipboard } from \"../constants\";\nimport CustomerAvatar from \"../../../../ui/icons/CustomerAvatar\";\nimport ContentLoading from \"../../components/Skeletons/ContentLoading\";\nimport { ContentItem as ContentItemType, ConversationItem } from \"../../../../constants/interfaces/Roleplay\";\nimport RefreshCircleDisabled from \"../../../../ui/icons/RefreshCircleDisables\";\nimport { useShowMessage } from \"../../../../ui/components/ErrorMessages/ErrorMessages\";\nimport { copyTextToClipboard } from '../../../../helpers/functions/copy-to-clipboard';\nimport { useGenerateAudioForRoleplay } from \"../store/services\";\nimport LoadingAudio from \"../../../../ui/icons/LoadingAudio\";\nimport { CircularProgress } from \"@material-ui/core\";\nimport { useLoadVoiceSettingsService } from \"../../../CompanySettings/store/services\";\nimport { isTeamLeader } from \"../../../../constants/enums\";\nimport useGoogleAnalyticsWithRoleplay from \"../../GoogleAnalytics\";\n\nfunction ContentPanel({ isGenerating, contentData, revertCommand, isDisabled, stopIsDisabled }: { isGenerating: boolean, contentData?: ContentItemType[], revertCommand: (isStop?: boolean) => void, isDisabled?: boolean, stopIsDisabled?: boolean }) {\n const { data: roleplay, isLoading } = useRoleplayState();\n\n const sendCommand = useCreateCommandRoleplayApi();\n const regenerateRoleplayApi = useRegenerateRoleplayApi();\n const generateAudio = useGenerateAudioForRoleplay();\n const history = useHistory();\n const [message, setMessage] = useState('');\n const profile = useSelector(getProfileState);\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const lastItemRef = useRef<HTMLDivElement>(null);\n const observedDivRef = useRef<HTMLDivElement>(null);\n const [observedHeight, setObservedHeight] = useState<number>(0);\n const [userScrolled, setUserScrolled] = useState(false);\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n\n const handleUserScroll = useCallback(() => {\n if (messagesContainerRef.current) {\n const container = messagesContainerRef.current;\n const lastItem = lastItemRef.current;\n\n if (container && lastItem) {\n const containerBottom = container.scrollTop + container.clientHeight;\n const lastItemBottom = lastItem.offsetTop + lastItem.clientHeight;\n\n const isAtBottom = lastItemBottom - 10 <= containerBottom;\n\n isGenerating ? setUserScrolled(!isAtBottom) : setUserScrolled(false);\n }\n }\n }, [isGenerating]);\n\n const roleplayId = useMemo(() => roleplay?.id, [roleplay]);\n const company = useSelector(getCompanyState);\n const showMessage = useShowMessage();\n const [audioFiles, setAudioFiles] = useState<{ [id: number]: Blob[] } | null>(null);\n const [audioStatus, setAudioStatus] = useState<{ id: number, status: string, currentAudio?: HTMLAudioElement } | null>(null);\n const loadVoiceSettings = useLoadVoiceSettingsService();\n const handleLoadVoiceSettings = useCallback(\n () => profile?.companyId && !isTeamLeader(profile.role?.name) && loadVoiceSettings(profile?.companyId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadVoiceSettings, profile?.companyId]\n );\n\n const sendCustomCommand = () => {\n roleplay?.id && sendCommand({ roleplayId: roleplay.id.toString(), text: message }).then(() => {\n setMessage('');\n trackEventWithRoleplay('roleplay_screen_instruction_sent_manually', { CharacterLimit: message.length });\n })\n }\n\n const isOwner = useMemo(() => {\n return roleplay?.owner.id === profile?.id\n }, [\n profile?.id, roleplay?.owner.id\n ])\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { handleLoadVoiceSettings() }, [isOwner]);\n\n useEffect(() => {return () => {\n audioRef.current?.pause()\n }}, [])\n\n\n const handleKeyDownChange = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendCustomCommand();\n }\n }\n\n const regenerateRoleplay = (isRetry?: boolean) => {\n roleplay?.id && regenerateRoleplayApi({ roleplayId: roleplay.id.toString() });\n isRetry ? trackEventWithRoleplay('roleplay_screen_error_retry') : trackEventWithRoleplay('roleplay_screen_regenerate');\n }\n\n const copyClipboard = (roleplayConversation: ContentItemType) => {\n const roleplayText = roleplay ? formatConversationToClipboard(roleplay?.title, roleplayConversation.conversation, roleplayConversation?.summary || '') : ''\n const copy: 'silent' | boolean = copyTextToClipboard(roleplayText);\n trackEventWithRoleplay('roleplay_screen_copy_clipboard');\n if (copy !== 'silent') {\n if (copy) {\n showMessage(\n 'Copied to the clipboard',\n 'success'\n );\n } else {\n showMessage('Could not copy to clipboard', 'error');\n }\n }\n }\n\n const downloadFile = (roleplayConversation: ContentItemType) => {\n const roleplayText = roleplay ? formatConversationToClipboard(roleplay?.title, roleplayConversation.conversation, roleplayConversation?.summary || '') : '';\n downloadTxtFile(roleplayText, `Roleplay - ${roleplay?.title}`);\n showMessage('Saved as File', \"success\");\n trackEventWithRoleplay('roleplay_screen_save_file');\n }\n\n const playAudio = useCallback((conversation: ConversationItem[], conversationId: number) => {\n stopAudioPlaying();\n trackEventWithRoleplay('roleplay_screen_audio_playback');\n if (audioFiles?.[conversationId]) {\n setAudioStatus({ id: conversationId, status: 'playing' })\n playAudioBlobs(audioFiles?.[conversationId]);\n } else {\n setAudioStatus({ id: conversationId, status: 'generating' })\n generateAudio(conversation).then((data) => {\n setAudioFiles((oldState) => ({ ...oldState, [conversationId]: data }));\n setAudioStatus({ id: conversationId, status: 'playing' })\n playAudioBlobs(data);\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [generateAudio, audioFiles, audioStatus])\n\n const playAudioBlobs = useCallback((blobs: Blob[], currentAudioIndex = 0) => {\n if (currentAudioIndex >= blobs.length) {\n setAudioStatus(null);\n return;\n }\n\n const audioBlob = blobs[currentAudioIndex];\n const audioUrl = URL.createObjectURL(audioBlob);\n const audio = new Audio(audioUrl);\n audio.preload = 'metadata';\n audioRef.current = audio;\n \n audio.play().then(() => setAudioStatus((oldState) => (oldState && { ...oldState, currentAudio: audio }))).catch(error => console.error('Error playing audio:', error));\n\n audio.onended = () => {\n URL.revokeObjectURL(audioUrl);\n playAudioBlobs(blobs, currentAudioIndex + 1);\n };\n }, []);\n\n const stopAudioPlaying = () => {\n if (audioStatus?.status === 'playing') {\n if (audioStatus.currentAudio) {\n audioStatus.currentAudio.pause();\n }\n setAudioStatus(null);\n }\n }\n\n const getHighlightedText = (text: string) => {\n const splitText = text.replace(commandPattern, '%%').split('%%').filter((val) => val);\n const matches = text.match(commandPattern);\n if (!matches) return [<>{text}</>];\n\n const elements: ReactElement[] = [];\n splitText.forEach((part: string, index: number) => {\n matches && elements.push(<b key={index}>{matches[index]}</b>);\n elements.push(<>{part}</>);\n });\n\n return elements;\n };\n\n useEffect(() => {\n if (!isLoading && contentData?.length && !userScrolled && messagesContainerRef.current) {\n const lastItem = lastItemRef.current;\n if (lastItem) {\n const topPosition = lastItem.offsetTop;\n messagesContainerRef.current.scrollTo({ top: topPosition, behavior: 'smooth' });\n setUserScrolled(false)\n }\n }\n }, [isLoading, contentData, userScrolled]);\n\n useEffect(() => {\n const observedDiv = observedDivRef.current;\n\n const resizeObserver = new ResizeObserver(entries => {\n for (let entry of entries) {\n setObservedHeight(entry.contentRect.height);\n }\n });\n\n if (observedDiv) {\n resizeObserver.observe(observedDiv);\n }\n\n return () => {\n if (observedDiv) {\n resizeObserver.unobserve(observedDiv);\n }\n };\n }, [message]);\n\n return roleplay && !contentData?.length ?\n <NoEntryContainer>\n <SidebarRoleplaysLarge dataTest=\"roleplay-icon\" />\n <Text data-test=\"no-roleplay-text\">No Roleplays Yet</Text>\n </NoEntryContainer>\n : <>\n {isLoading ? <ContentLoading /> :\n <ContentPanelContainer ref={messagesContainerRef} height={!isOwner ? -20 : observedHeight} onScroll={handleUserScroll}>\n <div>\n {contentData && contentData?.map((contentItem) => {\n if (contentItem.type === 'conversation' && contentItem.conversation.length) {\n return <Contentbox data-test=\"conversation-container\" key={contentItem.id}>\n <ContentBoxContainer>\n <DateText data-test=\"conversation-date\">{dayjs(contentItem.createdAt).format('MMM D, YY hh:mm A')}</DateText>\n {contentItem.conversation?.map((item, index) => {\n return <ContentItem>\n {\n item.role === 'salesperson' ?\n <NamePlaceholder\n image={company.logo || company.logoUrl}\n name={company.name}\n dataTest={`salesperson-company-logo`}\n className={`avatar-logo ${(company.logo || company.logoUrl) && 'no-border'}`}\n /> :\n <CustomerAvatar\n dataTest={`customer-pic`}\n className=\"customer-logo\"\n />\n }\n <div>\n <Author data-test={`${item.role}-title`}>\n {item.role === 'prospect' ? 'Customer ' : 'Salesperson'}\n </Author>\n <Message data-test={`${item.role}-text`}>\n {item.text}\n {!contentItem.isFinished && index === contentItem.conversation.length - 1 && <BlueDot />}\n </Message>\n </div>\n </ContentItem>\n })}\n {contentItem.isFinished && <BtnContainer>\n {audioStatus?.id !== contentItem.id && <PlayButton data-test=\"play-btn\" isDisabled={!isOwner} onClick={() => isOwner && playAudio(contentItem.conversation, contentItem.id)}><PlayIcon className=\"play-btn\" /></PlayButton>}\n {audioStatus?.id === contentItem.id && audioStatus?.status === 'playing' && <PlayButton data-test=\"stop-btn\" isDisabled={!isOwner} onClick={stopAudioPlaying}><StopIcon /></PlayButton>}\n {audioStatus?.id === contentItem.id && audioStatus?.status === 'generating' && <SpinnerContainer data-test=\"Loading-btn\" onClick={stopAudioPlaying}><CircularProgress\n size={36}\n /><LoadingAudio className=\"spinner-icn\" /></SpinnerContainer>}\n {!isOwner ?\n <MenuButton isDisabled={!isOwner}><Dots className=\"dots-btn\" dataTest=\"dots-menu\" /></MenuButton>\n : <ActionButton customWidth={200} isHidden={false} dataTest=\"roleplay-menu\" button={<MenuButton><Dots className=\"dots-btn\" dataTest=\"dots-menu\" /></MenuButton>}>\n <ActionItem dataTest=\"challenge-action\" onClick={() => {\n history.push(`${ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE.replace(\n ':challengeId',\n 'new'\n )}?roleplayId=${roleplayId}&contentId=${contentItem.id.toString()}`)\n trackEventWithRoleplay('roleplay_screen_create_challenge');\n }}>\n Create Challenge\n </ActionItem>\n <ActionItem dataTest=\"scenario-action\" onClick={() => {\n history.push(`${ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE.replace(\n ':scenarioId',\n 'new'\n )}?roleplayId=${roleplayId}&contentId=${contentItem.id.toString()}`)\n trackEventWithRoleplay('roleplay_screen_create_scenario');\n }} >\n Create Scenario\n </ActionItem>\n <ActionItem dataTest=\"save-file-action\" onClick={() => downloadFile(contentItem)}>\n Save as File\n </ActionItem>\n <ActionItem dataTest=\"copy-action\" onClick={() => copyClipboard(contentItem)} >\n Copy to Clipboard\n </ActionItem>\n </ActionButton>\n }\n </BtnContainer>}\n </ContentBoxContainer>\n </Contentbox>\n }\n if (contentItem.type === 'command') {\n return <CommandContainer data-test=\"command-container\" key={contentItem.id}>\n <CommandBox>\n <DateText data-test=\"command-date\">{dayjs(contentItem.createdAt).format('MMM D, YY hh:mm A')}</DateText>\n <ContentItem>\n <Img\n profile={roleplay?.owner}\n loading={isLoading}\n size=\"default\"\n dataTest=\"command-author-pic\"\n className=\"command-author-pic\"\n />\n <div>\n <Author data-test=\"command-author-name\">\n {roleplay?.owner.firstName + ' ' + roleplay?.owner.lastName}\n </Author>\n <Message data-test=\"command-text\">\n {getHighlightedText(contentItem.text)}\n </Message>\n </div>\n </ContentItem>\n </CommandBox>\n </CommandContainer>\n }\n if (contentItem.type === 'error') {\n return <ErrorContainer data-test=\"command-container\" key={contentItem.id}>\n <ErrorBox>\n <DateText data-test=\"error-date\" >{dayjs(contentItem.createdAt).format('MMM D, YY hh:mm A')}</DateText>\n <TextBox>\n <WarningIcon dataTest=\"error-icon\" className=\"error-icon\"></WarningIcon>\n <ContentItem className=\"error-item\">\n <div>\n <Author data-test=\"error-title\">\n Roleplay Generation Error\n </Author>\n <Message data-test=\"error-text\">\n An error occurred while generating the Roleplay, please try again in a few seconds.\n </Message>\n </div>\n <WarningBtnContainer>\n <Button color={'warning'} disabled={!isOwner} width=\"140px\" dataTest=\"retry-btn\" className=\"retry-btn\" action={() => regenerateRoleplay(true)}>Try again</Button>\n <Button color={'warning-inverse'} variant='inverse' disabled={!isOwner} width=\"140px\" dataTest=\"revert-btn\" className=\"revert-btn\" style={{ marginLeft: '12px' }} action={() => revertCommand()}>Revert</Button>\n </WarningBtnContainer>\n </ContentItem>\n </TextBox>\n </ErrorBox>\n </ErrorContainer>\n }\n return <></>\n })}\n <div ref={lastItemRef}></div>\n </div>\n\n {isOwner && <Sendbox ref={observedDivRef}>\n <SendBoxContainer>\n {isGenerating ?\n <BtnCont>\n <RegenerateBtn isDisabled={stopIsDisabled} data-test=\"stop-generation-btn\" onClick={() => {isGenerating && !stopIsDisabled && revertCommand(true)}}><StopGenIcon data-test=\"stop-generation-icon\" isDisabled={stopIsDisabled}><div /></StopGenIcon>Stop generating</RegenerateBtn>\n </BtnCont>\n :\n <BtnCont>\n <RegenerateBtn isDisabled={isDisabled} data-test=\"regenerate-btn\" onClick={() => !isGenerating && !isDisabled && regenerateRoleplay()}>{isDisabled ? <RefreshCircleDisabled dataTest=\"regenerate-icon\" /> : <RefreshCircle dataTest=\"regenerate-icon\" />} Regenerate</RegenerateBtn>\n </BtnCont>\n }\n <TextInputWithButtons max={500} disabled={isDisabled} maxRows={7} value={message} textAreaMinHeight={'25px'} onChange={(e) => setMessage(e.target.value)} onKeyDown={handleKeyDownChange} dataTest=\"command\" onApply={sendCustomCommand} placeholder=\"Tell Roleplay AI what to do...\" />\n </SendBoxContainer>\n </Sendbox>}\n </ContentPanelContainer>\n }\n </>\n}\n\nexport default ContentPanel","import { LineSkeleton, BodySkeletonContainer } from \"./styles\";\nconst bodyLineWidths = [\n {\n headerWidth: 72,\n subHeaderWidth: 137,\n lineWidths: [448,327,177]\n },\n {\n headerWidth: 149,\n subHeaderWidth: 84,\n lineWidths: [327,448,291]\n },\n {\n headerWidth: 109,\n subHeaderWidth: 95,\n lineWidths: [282,219,342]\n }\n];\n\nfunction BodySkeleton() {\n return <>{bodyLineWidths.map(({headerWidth, subHeaderWidth, lineWidths}, index) => {\n return <BodySkeletonContainer key={index} data-test=\"roleplay-context-skeleton\" >\n <LineSkeleton width={headerWidth} height={12} data-test=\"roleplay-context-skeleton-line\" />\n <LineSkeleton width={subHeaderWidth} height={8} marginTop={'17px'} data-test=\"roleplay-context-skeleton-line\"/>\n {\n lineWidths.map((width, index) => <LineSkeleton width={width} height={8} key={index} data-test=\"roleplay-context-skeleton-line\"/>)\n }\n </BodySkeletonContainer>\n })}</>\n}\n\nexport default BodySkeleton;","import ObjectiveAiParam from \"../../components/AiParamsComponents/Objective\";\nimport ProductAiParam from \"../../components/AiParamsComponents/ProductService\";\nimport ProspectAiParam from \"../../components/AiParamsComponents/Prospect\";\nimport SituationAiParam from \"../../components/AiParamsComponents/Situation\";\nimport BodySkeleton from \"../../components/Skeletons/BodySkeleton\";\nimport { RolePlayContextParams, RoleplayData } from \"../../CreateRoleplay/types\";\nimport { useRoleplayState } from \"../store/states\";\nimport { ParamsContainer, SubTitle } from \"../styles\";\n\nfunction ContextPanel({ emptyRequiredProps, isEditMode, handleChange, rpdata } : { emptyRequiredProps?: RolePlayContextParams[], isEditMode: boolean, handleChange: (key: RolePlayContextParams, value: string) => void; rpdata: RoleplayData }) {\n const { isLoading } = useRoleplayState();\n return <ParamsContainer>\n {\n isLoading ? <BodySkeleton /> : <>\n <SubTitle data-test=\"sitation-title\">Situation</SubTitle>\n <SituationAiParam handleChange={handleChange} roleplayData={rpdata} isEditMode={isEditMode} autoFocus={true} emptyRequiredProps={emptyRequiredProps} analyticsKey={'roleplay_screen'}/>\n <SubTitle data-test=\"prospect-title\" >Customer</SubTitle>\n <ProspectAiParam handleChange={handleChange} roleplayData={rpdata} isEditMode={isEditMode} emptyRequiredProps={emptyRequiredProps} analyticsKey={'roleplay_screen'}/>\n <SubTitle data-test=\"product-title\" >Product</SubTitle>\n <ProductAiParam handleChange={handleChange} roleplayData={rpdata} isEditMode={isEditMode} emptyRequiredProps={emptyRequiredProps} analyticsKey={'roleplay_screen'}/>\n <SubTitle data-test=\"objective-title\" >Approach</SubTitle>\n <ObjectiveAiParam handleChange={handleChange} roleplayData={rpdata} isEditMode={isEditMode} analyticsKey={'roleplay_screen'}/>\n </>\n }\n </ParamsContainer>\n}\n\nexport default ContextPanel;","import React, { forwardRef } from 'react';\nimport { IconProps } from './types';\n\nexport const PencilIconActive = forwardRef<SVGSVGElement, IconProps>(\n ({ className, shadow }, ref) => {\n return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.085a1.75 1.75 0 0 1 0 2.475l-8.61 8.61c-.21.21-.47.363-.756.445l-3.25.929a.75.75 0 0 1-.928-.927l.929-3.251a1.75 1.75 0 0 1 .445-.757l8.61-8.61zm1.414 1.06a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354l-1.086-1.086zM11.189 6.25 9.75 4.81l-6.286 6.287a.25.25 0 0 0-.064.108l-.558 1.953 1.953-.558a.249.249 0 0 0 .108-.064l6.286-6.286z\" fill=\"#4AA9E2\"/>\n</svg>\n );\n }\n);\n\nexport default PencilIconActive;\n","import { RoundSkeleton } from \"../../../../ui/components/Skeleton/styles\";\nimport { LineSkeleton, HeaderSkeletonContainer, LineContainer } from \"./styles\";\n\nfunction HeaderSkeleton() {\n return <HeaderSkeletonContainer data-test=\"roleplay-header-skeleton\">\n <LineContainer>\n <LineSkeleton width={146} height={12} data-test=\"roleplay-header-skeleton-line\" />\n <RoundSkeleton width={12} height={12} data-test=\"roleplay-header-skeleton-round\"/>\n </LineContainer>\n <LineSkeleton width={117} height={8} data-test=\"roleplay-header-skeleton-line\"/>\n </HeaderSkeletonContainer>\n\n}\n\nexport default HeaderSkeleton;","import dayjs from \"dayjs\";\nimport { useState } from \"react\";\nimport ROUTES from \"../../../../routes/routes\";\nimport { useHistory } from \"../../../../tools/router\";\nimport TextInputWithButtons from \"../../components/TextInputWithButtons/TextInputWithButtons\";\nimport BackArrow from \"../../../../ui/icons/BackArrow\";\nimport PencilIcon from \"../../../../ui/icons/PencilIcon\";\nimport PencilIconActive from \"../../../../ui/icons/PencilIconActive\";\nimport { NameContainer, OwnerName } from \"../../RoleplaysList/styles\";\nimport { useUpdateRoleplayService } from \"../store/services\";\nimport { useRoleplayState } from \"../store/states\";\nimport { Header, HeaderContainer, IconContainer, IconCountainer, Title } from \"../styles\";\nimport HeaderSkeleton from \"../../components/Skeletons/HeaderSkeleton\";\nimport useGoogleAnalyticsWithRoleplay from \"../../GoogleAnalytics\";\n\nfunction RoleplayHeader({ isDisabled }: { isDisabled: boolean }) {\n const history = useHistory();\n const { data: roleplay, isLoading } = useRoleplayState();\n const updateRoleplay = useUpdateRoleplayService();\n const [editmode, setEditMode] = useState<{ [key: string]: string }>({});\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n\n const closeEditMode = () => {\n setEditMode({});\n }\n\n const handleNameChange = () => {\n roleplay && editmode['title'] && updateRoleplay(roleplay?.id.toString(), {\n ...roleplay,\n title: editmode['title'],\n }).then(() => {\n closeEditMode();\n trackEventWithRoleplay('roleplay_screen_title_updated');\n });\n }\n\n const isRequiredTitle = editmode['title'] === '';\n \n return <HeaderContainer>{editmode['title'] === undefined ?\n <>\n <IconContainer onClick={() => {\n history.push(ROUTES.ROLEPLAYS.LIST_OF_ROLEPLAYS)\n }} data-test=\"back-button\"><BackArrow /></IconContainer>\n {\n isLoading ? <HeaderSkeleton /> : <Header>\n <Title>\n <span data-test=\"roleplay-title\">{roleplay?.title}</span>\n <IconCountainer onClick={() => !isDisabled && roleplay?.title && setEditMode({ 'title': roleplay?.title })} isDisabled={isDisabled} data-test={`rename-edit-icon`}>\n {!isDisabled ? <PencilIconActive /> : <PencilIcon />}\n </IconCountainer>\n </Title>\n <NameContainer>\n {roleplay &&\n <><OwnerName data-test=\"roleplay-owner-name\">\n {roleplay?.owner?.firstName + ' ' + roleplay?.owner?.lastName}\n </OwnerName> •\n <span data-test=\"roleplay-createdAt\">{dayjs(roleplay?.dateCreated).format('MMM D, YY hh:mm A')}</span></>\n }\n </NameContainer>\n </Header>\n }\n \n </>\n :\n <TextInputWithButtons width={'681px'} max={80} value={editmode['title']} onChange={(e) => setEditMode({ 'title': e.target.value })} autoFocus={true} onClose={closeEditMode} onApply={handleNameChange} dataTest=\"rename\" isRequired={isRequiredTitle} />\n }</HeaderContainer>\n}\n\nexport default RoleplayHeader;","import { Button } from \"../../../../ui/components/Button\"\nimport { ModalWithCross } from \"../../../../ui/components/ModalWithCross\"\nimport { ModalBody, ModalHeader, ModalText } from \"../styles\"\n\nfunction RoleplayInfoModal({onClose, dataTest} : {dataTest: string, onClose: () => void} ) {\n\n return <ModalWithCross\n onClose={() => {}}\n width={400}\n dataTest={dataTest}\n hideCross={true}\n >\n <ModalBody data-test=\"modal-body\">\n <ModalHeader data-test=\"modal-header\">Disclaimer: Roleplay AI</ModalHeader>\n <ModalText data-test=\"modal-text\">Please note, these roleplays are generated by AI and may contain inaccuracies or misleading information. The Roleplay AI is continuously learning and enhancing, aiming to provide more realistic and effective sales situations over time.</ModalText>\n <Button variant=\"primary\" action={onClose} dataTest=\"got-it-button\">Got it</Button>\n </ModalBody>\n </ModalWithCross>\n}\n\nexport default RoleplayInfoModal;","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useParams } from \"react-router-dom\";\nimport { useDuplicateRoleplayApi, useGenerateRoleplayApi, useGetRoleplayContentApi, useResetRoleplayApi, useRevertRoleplayApi } from \"../../../api/roleplay\";\nimport { isAdminRole, isPractisAdminRole } from \"../../../constants/enums\";\nimport { ContentItem } from \"../../../constants/interfaces/Roleplay\";\nimport useHtmlPageTitle from \"../../../helpers/hooks/useHtmlPageTitle\";\nimport ROUTES from \"../../../routes/routes\";\nimport { generateCopyOfEntityName } from \"../../../services/GeneralBulkActionServices/helpers\";\nimport { useHistory } from \"../../../tools/router\";\nimport { ActionButton, ActionItem } from \"../../../ui/components/ActionButton\";\nimport { Button } from \"../../../ui/components/Button\";\nimport { useShowMessage } from \"../../../ui/components/ErrorMessages/ErrorMessages\";\nimport { useShowConfirmModalDialog } from \"../../../ui/components/ModalDialogs/store/actions\";\nimport Dots from \"../../../ui/icons/Dots\";\nimport { InfoIcon } from \"../../../ui/icons/InfoIcon\";\nimport MainWrapper from \"../../../ui/wrapper/MainWrapper/MainWrapper\";\nimport { getProfileState } from \"../../UserProfile/store/reducers\";\nimport { initialRolePlayData, keysForGA, requiredContextParams } from \"../CreateRoleplay/constants\";\nimport { RolePlayContextParams, RoleplayData } from \"../CreateRoleplay/types\";\nimport useGoogleAnalyticsWithRoleplay from \"../GoogleAnalytics\";\nimport useWebSocket from \"../websocketV2/service\";\nimport ContentPanel from \"./components/ContentPanel\";\nimport ContextPanel from \"./components/ContextPanel\";\nimport RoleplayHeader from \"./components/RoleplayHeader\";\nimport RoleplayInfoModal from \"./components/RoleplayInfoModal\";\nimport { useClearRoleplayService, useGetRoleplayService, useUpdateRoleplayService } from \"./store/services\";\nimport { useRoleplayState } from \"./store/states\";\nimport { BodyContainer, Container, ContentContainer, ContextContainer, Footer, InfoText, ButtonContainer, RoleplayMenuDots } from \"./styles\";\n\nfunction RoleplayPage() {\n const { roleplayId }: { roleplayId: string } = useParams();\n const getRoleplay = useGetRoleplayService();\n const getRoleplayContent = useGetRoleplayContentApi();\n const clearRoleplay = useClearRoleplayService();\n const duplicateRoleplay = useDuplicateRoleplayApi();\n const showMessage = useShowMessage();\n const generateRoleplay = useGenerateRoleplayApi();\n const resetRoleplayApi = useResetRoleplayApi();\n const [emptyRequiredProps, setEmptyRequiredProps] = useState<RolePlayContextParams[]>();\n const updateRoleplay = useUpdateRoleplayService();\n const showConfirmationModalDialog = useShowConfirmModalDialog();\n const { response, sendMessage, closeConnection } = useWebSocket();\n const token = localStorage.getItem('token');\n const [isEditMode, setIsEditMode] = useState(false);\n useHtmlPageTitle('Roleplay AI');\n const infoPanel = localStorage.getItem('infoPanel');\n\n const [isGenerating, setIsGenerating] = useState<boolean>(false);\n const [isLastError, setLastError] = useState<boolean>(false);\n const [stopIsDisabled, setStopIsDisabled] = useState<boolean>(false);\n const [actionSent, setActionSent] = useState<boolean>(false);\n const [contentData, setContentData] = useState<ContentItem[]>();\n const history = useHistory();\n const trackEventWithRoleplay = useGoogleAnalyticsWithRoleplay();\n\n const [showInfoPanel, setShowInfoPanel] = useState<boolean>(false);\n const profile = useSelector(getProfileState);\n const revertRoleplayApi = useRevertRoleplayApi();\n const [edittedRoleplay, setEdittedRoleplay] = useState<RoleplayData | null>({} || null);\n\n const handleChange = (key: RolePlayContextParams, value: string) => {\n setEdittedRoleplay({ ...edittedRoleplay, [key]: value });\n }\n\n const { data: roleplay, isLoading } = useRoleplayState();\n\n useEffect(() => {\n infoPanel === 'true' && setShowInfoPanel(true)\n }, [infoPanel])\n\n const isOwner = useMemo(() => {\n return roleplay?.owner.id === profile?.id;\n }, [profile?.id, roleplay?.owner.id]);\n\n useEffect(() => {\n if (!actionSent && !!profile?.id && !!roleplay?.owner.id && profile?.id !== roleplay?.owner.id) {\n trackEventWithRoleplay('roleplay_screen_open_read_only');\n setActionSent(true);\n } \n }, [isOwner, trackEventWithRoleplay, profile?.id, roleplay?.owner.id, actionSent])\n\n const hasContent = useMemo(() => {\n return !!contentData?.length\n }, [\n contentData\n ])\n\n const getContent = useCallback(() => {\n getRoleplayContent({ roleplayId }).then((content) => {\n if (content) {\n setContentData(content);\n if (content.length && content[content.length - 1].type === 'error') {\n setLastError(true);\n setIsGenerating(false);\n } else {\n setLastError(false);\n }\n }\n })\n }, [roleplayId, setLastError, getRoleplayContent])\n\n useEffect(() => {\n isLastError && trackEventWithRoleplay('roleplay_screen_generate_error');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLastError])\n\n const isAdmin = useMemo(() => {\n return isAdminRole(profile?.role?.name) || isPractisAdminRole(profile?.role?.name)\n }, [profile?.role?.name])\n\n useEffect(() => {\n getRoleplay({ roleplayId });\n getContent();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [roleplayId, getRoleplay]);\n\n const handleDuplicate = () => {\n roleplay && duplicateRoleplay({\n roleplayId: roleplay.id.toString(),\n title: generateCopyOfEntityName(roleplay.title)\n }).then((roleplay) => {\n trackEventWithRoleplay('roleplay_screen_duplicate');\n showMessage('Roleplay has been duplicated', 'success');\n history.replace(`${ROUTES.ROLEPLAYS.SINGLE.replace(\n ':roleplayId',\n roleplay.id.toString()\n )}`)\n infoPanel === null && localStorage.setItem(\n 'infoPanel',\n 'true'\n );\n })\n };\n\n const generateFirstRoleplay = useCallback(() => {\n roleplay?.id && generateRoleplay({ roleplayId: roleplay.id.toString() });\n trackEventWithRoleplay('roleplay_screen_generate');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [setEmptyRequiredProps, generateRoleplay, roleplay, showMessage])\n\n const resetRoleplay = () => {\n showDiscardModal();\n }\n\n const revertCommand = useCallback((isStop?: boolean) => {\n setStopIsDisabled(true);\n isStop ? trackEventWithRoleplay('roleplay_screen_stop_generation'): trackEventWithRoleplay('roleplay_screen_error_revert');\n roleplay?.id && revertRoleplayApi({ roleplayId: roleplay.id.toString() }).then(() => {\n getContent();\n setIsGenerating(false);\n setStopIsDisabled(false);\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [roleplay?.id, revertRoleplayApi])\n\n const showDiscardModal = useCallback(\n () => {\n showConfirmationModalDialog({\n modalTitle: 'Reset Roleplay?',\n description:\n 'It will permanently delete all history of generated replays and custom instructions while keeping your context intact.',\n confirmButtonText: 'Reset',\n cancelButtonText: 'Cancel',\n onConfirm: () => {\n roleplay?.id && resetRoleplayApi({ roleplayId: roleplay.id.toString() }).then(() => {\n getContent();\n trackEventWithRoleplay('roleplay_screen_reset');\n })\n },\n dataTest: 'reset-roleplay'\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [showConfirmationModalDialog, resetRoleplayApi, roleplay, getRoleplay]\n );\n\n useEffect(() => {\n if (response === 'opened' && roleplayId && isOwner) {\n token && sendMessage({ event: 'authenticate', data: token });\n } else {\n try {\n const socketResponse = JSON.parse(response);\n if (socketResponse.type === 'auth') {\n sendMessage({\n \"event\": \"watch\",\n \"data\": `roleplay:${roleplayId}`\n })\n }\n if (socketResponse.type === 'roleplay.content') {\n const dataItem = socketResponse.data;\n if (dataItem.type === 'conversation') {\n setIsGenerating(!dataItem.isFinished)\n }\n if (dataItem.type === 'conversation' && dataItem.isFinished) {\n trackEventWithRoleplay('roleplay_screen_script_generated');\n }\n if (dataItem.type === 'error') {\n setLastError(true);\n setIsGenerating(false);\n }\n setContentData((prevState) => {\n const updatedConversation = [...(prevState || [])];\n\n const existingItemIndex = prevState ? prevState.findIndex((item) => {\n return item.id === dataItem.id\n }) : -1;\n if (existingItemIndex !== -1) {\n updatedConversation[existingItemIndex] = dataItem;\n } else {\n updatedConversation.push(dataItem);\n }\n return updatedConversation;\n });\n\n }\n } catch (e) {}\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [response, token, roleplayId, setContentData, setLastError, setIsGenerating, isOwner]);\n\n useEffect(() => {\n return () => {\n clearRoleplay();\n closeConnection();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const saveChanges = () => {\n if (edittedRoleplay) {\n const arr: RolePlayContextParams[] = [];\n requiredContextParams.forEach((item) => {\n if ({ ...roleplay, ...edittedRoleplay }?.[item] === '') {\n arr.push(item)\n }\n })\n if (arr?.length) {\n setEmptyRequiredProps(arr?.length ? arr : undefined)\n showMessage('One or more required fields are missing', 'error')\n } else {\n setEmptyRequiredProps(undefined);\n\n edittedRoleplay && Object.entries(edittedRoleplay).forEach(([key, value]) => {\n if (value !== initialRolePlayData[key as keyof typeof initialRolePlayData]) {\n const keyGA = keysForGA[key as keyof typeof keysForGA];\n keyGA && trackEventWithRoleplay(`roleplay_screen_${keyGA}_updated`);\n }\n });\n\n updateRoleplay(roleplay?.id, { ...roleplay, ...edittedRoleplay }, edittedRoleplay, hasContent ? 'command' : undefined).then(() => {\n cancelChanges();\n });\n trackEventWithRoleplay('roleplay_screen_save_context');\n hasContent && trackEventWithRoleplay('roleplay_screen_instruction_sent_auto', {CharacterLimit: Object.values(edittedRoleplay).join('').length});\n }\n } else {\n cancelChanges();\n }\n }\n\n const cancelChanges = () => {\n setIsEditMode(false);\n setEdittedRoleplay(null);\n setEmptyRequiredProps(undefined);\n }\n\n return <MainWrapper subTitle=\"Roleplay AI\" contentSize={false} dataTest=\"roleplay\" hideHeader contentPadding=\"0px\" marginBottom=\"0px\">\n <Container>\n <RoleplayHeader isDisabled={!isOwner || isGenerating || isEditMode} />\n <BodyContainer>\n <ContextContainer fullHeight={isLoading || isOwner}>\n <ContextPanel emptyRequiredProps={emptyRequiredProps} rpdata={{ ...roleplay, ...edittedRoleplay }} isEditMode={isEditMode} handleChange={handleChange} />\n {roleplay && <ButtonContainer>\n {\n isEditMode ?\n <>\n <Button width=\"140px\" action={saveChanges} dataTest=\"save-button\">\n Save\n </Button>\n <Button dataTest=\"cancel-button\" width=\"140px\" variant='inverse' action={() => {trackEventWithRoleplay('roleplay_screen_cancel_context'); cancelChanges()}}>\n Cancel\n </Button>\n </> :\n <>\n {!hasContent &&\n <Button width=\"164px\" action={generateFirstRoleplay} dataTest=\"generate-button\">\n Generate Roleplay\n </Button>\n }\n <Button dataTest=\"edit-context-button\" width=\"140px\" disabled={isGenerating || isLastError} variant='inverse' action={() => {trackEventWithRoleplay('roleplay_screen_edit_context'); setIsEditMode(true)}}>\n Edit Context\n </Button>\n {hasContent &&\n <ActionButton isDisabled={isGenerating || isLastError} customWidth={200} placement={'bottom-start'} isHidden={false} dataTest=\"roleplay-menu\" customLeft={1} button={<RoleplayMenuDots disabled={isGenerating || isLastError} dataTest=\"roleplay-action-dots\" width=\"40px\" variant='inverse'><Dots className=\"dots-btn\" dataTest=\"dots-menu\" /></RoleplayMenuDots>}>\n <ActionItem dataTest=\"reset-button\" onClick={resetRoleplay} destructive={true}>\n Reset\n </ActionItem>\n </ActionButton>\n }\n </>\n }\n </ButtonContainer>}\n </ContextContainer>\n <ContentContainer fullHeight={isLoading || isOwner}>\n <ContentPanel isDisabled={isGenerating || isLastError || isEditMode} isGenerating={isGenerating} contentData={contentData} revertCommand={revertCommand} stopIsDisabled={stopIsDisabled} />\n </ContentContainer>\n </BodyContainer>\n {roleplay && !isOwner && <Footer>\n {\n !isAdmin && <>\n <InfoIcon dataTest=\"info-icon\" />\n <InfoText data-test=\"info-text\">\n Roleplay is in view-only mode. You need the Admin rights to edit it.</InfoText>\n </>\n }\n {\n isAdmin &&\n <Button action={handleDuplicate} width=\"164px\" dataTest=\"duplicate-button\">\n Duplicate to edit\n </Button>\n }\n </Footer>}\n </Container>\n {\n showInfoPanel && <RoleplayInfoModal dataTest=\"roleplay-info-modal\" onClose={() => {\n setShowInfoPanel(false);\n trackEventWithRoleplay('roleplay_screen_disclaimer');\n localStorage.setItem(\n 'infoPanel',\n 'false'\n )\n }} />\n }\n </MainWrapper >\n}\n\nexport default RoleplayPage;","import RoleplayPage from './controller';\n\nexport default RoleplayPage;","import React, { useCallback, useEffect } from 'react';\nimport { History } from 'history';\n\nimport ROUTES from '../../../routes/routes';\nimport { UrlBuilder, useUrlBuilder } from '../../../tools/url/UrlBuilder';\nimport { useHistory } from '../../../tools/router';\nimport {\n setAuthToken,\n redirectAfterLogin,\n} from '../../../helpers/functions/auth-helpers';\nimport LoginAuthWrapper from '../../../ui/wrapper/LoginAuthWrapper';\nimport { UserV2 } from '../../../constants/interfaces/User';\nimport useHtmlPageTitle from '../../../helpers/hooks/useHtmlPageTitle';\nimport { useAuthZeroTokenTypeApi } from '../../../api';\nimport { useShowMessage } from '../../../ui/components/ErrorMessages/ErrorMessages';\n\nconst qs = require('query-string');\n\nconst Auth0Callback = () => {\n const history: History<any> = useHistory();\n const from = history.location.state?.from as Location;\n const showMessage = useShowMessage();\n const authZeroTokenTypeApi = useAuthZeroTokenTypeApi();\n const urlBuilder = useUrlBuilder();\n /**\n * @function handleRedirectToLoginPage\n * @returns { void }\n */\n const handleRedirectToLoginPage = useCallback(() => {\n history.push(ROUTES.AUTH_PAGES.LOGIN);\n }, [history]);\n\n const handleAccessToken = (accessToken: any, urlBuilder: UrlBuilder) => {\n authZeroTokenTypeApi({ token: accessToken })\n .then((response: { user: UserV2; token: string }) => {\n const user = response.user;\n setAuthToken(user, response.token);\n redirectAfterLogin(\n history,\n urlBuilder,\n user,\n response.token,\n from,\n );\n // }\n })\n .catch(() => {\n showMessage('Account doesn’t exist, or you don’t have access', 'error');\n handleRedirectToLoginPage();\n });\n\n };\n\n useEffect(() => {\n const hash = window.location.hash;\n const accessToken = qs.parse(hash).access_token ?? null;\n if (accessToken) {\n handleAccessToken(accessToken, urlBuilder);\n } else {\n showMessage('Account doesn’t exist, or you don’t have access', 'error');\n handleRedirectToLoginPage();\n }\n }, [handleRedirectToLoginPage, urlBuilder]);\n\n useHtmlPageTitle('Auth0 Callback');\n\n return (\n <LoginAuthWrapper contentWidth={324} heightToShowScroll={500}>\n <div />\n </LoginAuthWrapper>\n );\n};\n\nexport default Auth0Callback;","import { useEffect } from 'react';\r\nimport { Route, Switch, useLocation, Redirect } from 'react-router-dom';\r\nimport { isEqual } from 'lodash';\r\n\r\nimport './assets/styles/fonts.css';\r\nimport ErrorMessages from './ui/components/ErrorMessages/ErrorMessages';\r\nimport ForgotPassword from './pages/Auth/ForgotPassword';\r\nimport Login from './pages/Auth/Login/Login';\r\nimport LogOut from './pages/Auth/LogOut/LogOut';\r\nimport InternalLogin from './pages/Auth/InternalLogin/InternalLogin';\r\nimport { Register } from './pages/Auth/Register';\r\nimport { Registration } from './pages/Auth/Registration';\r\nimport ResetPassword from './pages/Auth/ResetPassword';\r\nimport HealthPage from './pages/Health/Health';\r\nimport UserProfile from './pages/UserProfile/UserProfile';\r\nimport ROUTES from './routes/routes';\r\nimport PrivateRoute from './routes/PrivateRouter';\r\nimport NotFoundPage from './pages/NotFoud/NotFound';\r\nimport LandingPage from './pages/LandingPage/LandingPage';\r\nimport Progress from './features/teams/pages/Training/Progress';\r\nimport { useLocations } from './tools/router';\r\nimport NewUserContainer from './pages/ActionPages/NewUser/pages/NewUser';\r\nimport NewScenario from './pages/ActionPages/NewScenario/NewScenario';\r\nimport PractisSets from './pages/ActionPages/PractisSets/PractisSets';\r\nimport Library from './features/library/pages/Library';\r\nimport TermsPage from './pages/Terms/Terms';\r\nimport PrivacyPage from './pages/Privacy/Privacy';\r\nimport SupportPage from './pages/Support/Support';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { getProfileState } from './pages/UserProfile/store/reducers';\r\nimport InvitationsContainer from './features/users/pages/Invitations/Invitations';\r\nimport UsersContainer from './features/users/pages/Users/Users';\r\nimport EditChallenge from './features/challenges/pages/EditChallenge';\r\nimport InjectNewRelic from './features/newRelic/index';\r\nimport ChallengeSubmissions from './features/submissions/pages/ChallengeSubmissions';\r\nimport AccuracyTests from './features/submissions/pages/AccuracyTests'\r\nimport Submissions from './features/submissions/pages/Submissions';\r\nimport SubmissionDetails from './features/submissions/pages/SubmissionDetails';\r\nimport TraineeLogin from './pages/Auth/TraineeLogin/TraineeLogin';\r\nimport PerformanceContainer from './features/users/pages/Performance/Performance';\r\nimport PublicRoute from './routes/PublicRouter';\r\nimport CompanyLogsContainer from './features/logs/pages/Logs';\r\nimport MobileNumberLogin from './pages/Auth/MobileNumberLogin/MobileNumberLogin';\r\nimport VerifyMobileNumber from './pages/Auth/VerifyMobileNumber';\r\nimport Telepromter from './features/telepromter/pages';\r\nimport DraftsContainer from './features/users/pages/Drafts/Drafts';\r\nimport CompanyAiAssessmentContainer from './features/assessment-logs/pages/AiAssessment';\r\nimport TeamsContainer from './features/teams/pages/ListOfTeams/ListOfTeams';\r\nimport { OverdueLearners } from './features/teams/pages/OverdueLearners';\r\nimport ManageTeamContainer from './features/teams/pages/ManageTeam/ManageTeam';\r\nimport CreateTeam from './features/teams/pages/CreateTeam';\r\nimport PractisSetReportContainer from './features/teams/pages/Training/PractisSetReport';\r\nimport { ScenarioRepsContainer } from './features/teams/pages/Training/ScenarioReps';\r\nimport TraineeQuickAssignmentContainer from './features/teams/pages/Training/TraineeQuickAssignment';\r\nimport TraineeInvitationContainer from './features/teams/pages/Training/TraineeInvitation';\r\nimport { PlaybackScreen } from './ui/components/PlaybackVideo';\r\nimport ProgressPage from './features/socketProgress(api1)/progresspage';\r\nimport { getSearchState } from './features/searchState/store/reducer';\r\nimport { deleteSearchState, setSecondarySearchState } from './features/searchState/store/actions';\r\nimport { checkChildrenKeys } from './features/searchState/helpers';\r\nimport { SEARCH_STATE } from './features/searchState/constants';\r\nimport { deleteSecondarySearchState } from './features/searchState/store/actions';\r\nimport { generateColorVariables } from './ui/variables/generate-variables';\r\nimport { useRedirectToPhoneVerification } from './helpers/hooks/useRedirectToPhoneVerification';\r\nimport Onboarding from './pages/Auth/Onboarding';\r\nimport InvalidInvite from './pages/Auth/InvalidInvite';\r\nimport AddMobileNumber from './pages/Auth/AddMobileNumber';\r\nimport TraineeSplash from './pages/Auth/TraineeSplash';\r\nimport BrokenSharedLink from './ui/components/BrokenSharedLink';\r\nimport { TeamsPage } from './features/teams/pages';\r\nimport { ModalDialogs } from './ui/components/ModalDialogs';\r\nimport OldAccuracyTest from './pages/OldSubmission/OldAccuracyTest';\r\nimport OldChallenge from './pages/OldSubmission/OldChallenge';\r\nimport Storage from './services/Storage';\r\nimport { storageKeys } from './constants/variables/general';\r\nimport { PractisWebMode } from './constants/enums';\r\nimport Reports from './pages/Reports';\r\nimport Roleplays from './pages/Roleplays/RoleplaysList';\r\nimport { PractisSetSummaryReport } from './pages/Reports/PractisSetSummaryReport';\r\nimport { UserActivityReport } from './pages/Reports/UserActivityReport';\r\nimport { TeamLeaderActivityReport } from './pages/Reports/TeamLeaderActivityReport';\r\nimport { BillingReport } from './pages/Reports/BillingReport';\r\nimport { CompanySettings } from './pages/CompanySettings';\r\nimport { TrainingTimeReport } from './pages/Reports/TrainingTimeReport';\r\nimport RoleplayCreate from './pages/Roleplays/CreateRoleplay';\r\nimport RoleplayPage from './pages/Roleplays/RoleplayPage';\r\nimport Auth0Callback from './pages/Auth/Auth0Callback/Auth0Callback';\r\n\r\nconst App: React.FC = () => {\r\n let { rootLocation, modalLocation } = useLocations();\r\n const user = useSelector(getProfileState, isEqual);\r\n const searchState = useSelector(getSearchState, isEqual);\r\n const location = useLocation();\r\n const dispatch = useDispatch();\r\n const redirectToPhoneVerification = useRedirectToPhoneVerification();\r\n const mobileDeepLinkRoutes = Object.keys(ROUTES.MOBILE_DEEP_LINKS);\r\n\r\n useEffect(() => {\r\n if (\r\n searchState.key === SEARCH_STATE.TEAMS.name ||\r\n searchState.key === SEARCH_STATE.TRAINING.name\r\n ) {\r\n const keyName =\r\n searchState.key === SEARCH_STATE.TEAMS.name\r\n ? SEARCH_STATE.TEAMS.name\r\n : SEARCH_STATE.TRAINING.name;\r\n dispatch(setSecondarySearchState(keyName, searchState.params));\r\n }\r\n\r\n if (\r\n !location.pathname.includes(SEARCH_STATE.MEMBERS.name) &&\r\n !location.pathname.includes(SEARCH_STATE.TEAMS.name)\r\n ) {\r\n dispatch(deleteSecondarySearchState());\r\n }\r\n\r\n if (!checkChildrenKeys(location.pathname, searchState?.childrenKeys)) {\r\n dispatch(deleteSearchState());\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [dispatch, location.pathname]);\r\n\r\n useEffect(() => {\r\n generateColorVariables();\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (user?.id && !user?.phoneNumberVerified) {\r\n redirectToPhoneVerification({ user }, true);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user?.id, redirectToPhoneVerification])\r\n\r\n\r\n useEffect(() => {\r\n Storage.set(storageKeys.PRACTIS_WEB, PractisWebMode['WEB_PORTAL']);\r\n }, []);\r\n \r\n return (\r\n <div>\r\n <ProgressPage />\r\n <InjectNewRelic />\r\n <Switch location={rootLocation}>\r\n <PublicRoute\r\n path={ROUTES.AUTH_PAGES.LOGIN}\r\n exact\r\n component={Login}\r\n />\r\n <PublicRoute\r\n path={ROUTES.AUTH_PAGES.INTERNAL_LOGIN}\r\n exact\r\n component={InternalLogin}\r\n />\r\n <PublicRoute\r\n path={ROUTES.AUTH_PAGES.AUTH0_CALLBACK}\r\n exact\r\n component={Auth0Callback}\r\n />\r\n <PublicRoute\r\n path={ROUTES.AUTH_PAGES.MOBILE_NUMBER_LOGIN}\r\n exact\r\n component={MobileNumberLogin}\r\n />\r\n <PublicRoute\r\n path={ROUTES.AUTH_PAGES.MOBILE_NUMBER_VERIFY}\r\n exact\r\n component={VerifyMobileNumber}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.TRAINEE_LOGIN}\r\n exact\r\n component={TraineeLogin}\r\n />\r\n <Route path={ROUTES.AUTH_PAGES.LOGOUT} component={LogOut} />\r\n <Route path={ROUTES.AUTH_PAGES.REGISTER} component={Register} />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.REGISTRATION}\r\n component={Registration}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.FORGOT_PASSWORD}\r\n exact\r\n component={ForgotPassword}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.RESET_PASSWORD}\r\n exact\r\n component={ResetPassword}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.ONBOARDING}\r\n component={Onboarding}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.INVALID_INVITE}\r\n component={InvalidInvite}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.ADD_MOBILE_NUMBER}\r\n component={AddMobileNumber}\r\n />\r\n <Route\r\n path={ROUTES.AUTH_PAGES.TRAINEE_SPLASH}\r\n component={TraineeSplash}\r\n />\r\n <Route path={ROUTES.LANDING} exact component={LandingPage} />\r\n <Route path={ROUTES.SUPPORT} exact component={SupportPage} />\r\n <Route path={ROUTES.TERMS} exact component={TermsPage} />\r\n <Route path={ROUTES.PRIVACY} exact component={PrivacyPage} />\r\n <Route path={ROUTES.Health} exact component={HealthPage} />\r\n <Route\r\n path={ROUTES.BROKEN_SHARED_LINK}\r\n component={BrokenSharedLink}\r\n />\r\n <PrivateRoute path={ROUTES.PROGRESS} component={Progress} />\r\n <PrivateRoute path={ROUTES.PROFILE} component={UserProfile} />\r\n <PrivateRoute\r\n path={ROUTES.AUTH_PAGES.VERIFY_MOBILE_NUMBER_PRIVATE}\r\n exact\r\n component={VerifyMobileNumber}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.ORGANIZATION_LOGS}\r\n component={CompanyLogsContainer}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.ORGANIZATION_ASSESSMENT_LOGS}\r\n component={CompanyAiAssessmentContainer}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSIONS}\r\n exact\r\n component={Submissions}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.ALL}\r\n exact\r\n component={AccuracyTests}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.SINGLE}\r\n exact\r\n component={PlaybackScreen}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.ACCURACY_TESTS.OLD_SINGLE}\r\n exact\r\n component={OldAccuracyTest}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.ALL}\r\n exact\r\n component={ChallengeSubmissions}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.SINGLE}\r\n exact\r\n component={SubmissionDetails}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.SUBMISSION_SETTINGS.CHALLENGES.OLD_SINGLE}\r\n exact\r\n component={OldChallenge}\r\n />\r\n <PrivateRoute path={ROUTES.LIBRARY} component={Library} />\r\n <PrivateRoute\r\n path={ROUTES.TELEPROMTER}\r\n component={Telepromter}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.USERS}\r\n exact\r\n component={UsersContainer}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.TRAINEE_DETAILS}\r\n >\r\n <PractisSetReportContainer />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.USER_PERFORMANCE}\r\n component={PerformanceContainer}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.INVITATION_PERFORMANCE}\r\n exact\r\n component={PerformanceContainer}\r\n propsData={{ type: 'invitation' }}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.USER_INVITATIONS}\r\n component={InvitationsContainer}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.DRAFTS}\r\n component={DraftsContainer}\r\n />\r\n <PrivateRoute path={ROUTES.TEAMS_PAGES.LIST_OF_TEAMS} exact>\r\n <TeamsContainer />\r\n </PrivateRoute>\r\n <PrivateRoute path={ROUTES.TEAMS_PAGES.MEMBERS} exact>\r\n <TeamsPage />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.TEAMS_PAGES.TRAINING}\r\n component={TeamsPage}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.OVERDUE_LEARNERS}\r\n >\r\n <OverdueLearners />\r\n </PrivateRoute>\r\n {mobileDeepLinkRoutes.map(key =>\r\n <PrivateRoute\r\n path={ROUTES.MOBILE_DEEP_LINKS[key as keyof typeof ROUTES.MOBILE_DEEP_LINKS]}\r\n >\r\n <Redirect to={{ pathname: ROUTES.SUBMISSIONS }} />\r\n </PrivateRoute>\r\n )}\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.LIST_OF_REPORTS}\r\n exact\r\n component={Reports}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.ROLEPLAYS.LIST_OF_ROLEPLAYS}\r\n exact\r\n component={Roleplays}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.ROLEPLAYS.SINGLE}\r\n exact\r\n component={RoleplayPage}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.PRACTIS_SET_SUMMARY_REPORT}\r\n component={PractisSetSummaryReport}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.USER_ACTIVITY_REPORT}\r\n component={UserActivityReport}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.TEAM_LEADER_ACTIVITY_REPORT}\r\n component={TeamLeaderActivityReport}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.BILLING_REPORT}\r\n component={BillingReport}\r\n />\r\n <PrivateRoute\r\n path={ROUTES.REPORTS.TRAINING_TIME_REPORT}\r\n component={TrainingTimeReport}\r\n />\r\n <PrivateRoute component={NotFoundPage} />\r\n </Switch>\r\n <Switch location={modalLocation || rootLocation}>\r\n <PrivateRoute path={ROUTES.ACTION_ITEMS.NEW_USER} exact>\r\n <NewUserContainer\r\n closePath={ROUTES.DRAFTS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.LIBRARY_SETTINGS.SCENARIOS.SINGLE}\r\n exact\r\n >\r\n <NewScenario\r\n closePath={ROUTES.LIBRARY_SETTINGS.SCENARIOS.ALL}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.LIBRARY_SETTINGS.CHALLENGES.SINGLE}\r\n exact\r\n >\r\n <EditChallenge\r\n closePath={ROUTES.LIBRARY_SETTINGS.CHALLENGES.ALL}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.SINGLE}\r\n exact\r\n >\r\n <PractisSets\r\n closePath={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.TEAMS_PAGES.TRAINING_PAGES.TRAINEE_INVITATION}\r\n exact\r\n >\r\n <TraineeInvitationContainer\r\n closePath={ROUTES.TEAMS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.QUICK_ASSIGNMENT}\r\n exact\r\n >\r\n <TraineeQuickAssignmentContainer\r\n closePath={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ALL}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.LIBRARY_SETTINGS.PRACTISSETS.ASSIGN_USERS}\r\n exact\r\n >\r\n <TraineeInvitationContainer\r\n closePath={ROUTES.TEAMS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute path={ROUTES.TEAMS_PAGES.MANAGE_TEAM}>\r\n <ManageTeamContainer\r\n closePath={ROUTES.TEAMS_PAGES.LIST_OF_TEAMS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute path={ROUTES.TEAMS_PAGES.NEW_TEAM}>\r\n <CreateTeam\r\n closePath={ROUTES.TEAMS_PAGES.LIST_OF_TEAMS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute\r\n path={ROUTES.TRAINEE_DETAILS_REPS}\r\n exact\r\n >\r\n <ScenarioRepsContainer\r\n closePath={ROUTES.TRAINEE_DETAILS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute path={ROUTES.COMPANY_SETTINGS.ROOT}>\r\n <CompanySettings\r\n closePath={ROUTES.SUBMISSIONS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n <PrivateRoute path={ROUTES.ROLEPLAYS.NEW_ROLEPLAY}>\r\n <RoleplayCreate\r\n closePath={ROUTES.ROLEPLAYS.LIST_OF_ROLEPLAYS}\r\n closeGoingBack={!!modalLocation}\r\n />\r\n </PrivateRoute>\r\n </Switch>\r\n <ErrorMessages />\r\n <ModalDialogs />\r\n </div>\r\n );\r\n};\r\n\r\nexport default App;\r\n","\nexport const checkChildrenKeys = (pathname: string, childrenKeys: string[]) => {\n if(!childrenKeys.length){\n return null;\n }\n\n return childrenKeys.some((item: string) => pathname.includes(item))\n}","import { COLORS } from './constants';\n\nexport const generateColorVariables = () => {\n let styles = '';\n const tagId = 'practis-variables';\n\n for (const [key, value] of Object.entries(COLORS)) {\n styles += `--ps-${key}: ${value}; \\n`;\n }\n\n const colorStyles = `:root {${styles}}`;\n\n const sheet = document.getElementById(tagId);\n const head = document.head;\n\n if (sheet) {\n sheet.innerHTML = colorStyles;\n } else {\n const style = document.createElement('style');\n\n style.id = tagId;\n style.innerHTML = colorStyles;\n head.prepend(style);\n }\n\n return colorStyles;\n};\n\n","import { EnvironmentConfigs } from './tools/config';\nimport { getDevApiUrl } from './helpers/functions/url-helpers';\n\nexport const APP_CONFIG: EnvironmentConfigs = {\n default: {\n APP_VERSION: '5.0.0',\n API_CLIENT: 'WEB',\n API_BASE_URL: 'NOT_CONFIGURED',\n API_V2_BASE_URL: 'NOT_CONFIGURED',\n CHATGPT_API_KEY: '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',\n ADMIN_PORTAL_BASE_URL: 'NOT_CONFIGURED',\n COMPANY_PORTAL_BASE_URL: 'NOT_CONFIGURED',\n COMMIT_ID: '',\n BUILD_ID: '',\n S3_FILES_BASE_URL:\n 'https://practis-files-dev.s3-us-west-1.amazonaws.com/',\n NEW_RELIC_LICENSE_KEY: 'NRJS-7064dc987d35d780d7c',\n NEW_RELIC_APP_ID: 'NOT_CONFIGURED',\n API_SOCKET_ENDPOINT: 'NOT_CONFIGURED',\n googleClientId: '999094876822-i3029amhpv2pm9a4qj0fnvtuvn8d76np.apps.googleusercontent.com',\n ELEVEN_LABS_KEY: 'd757da3c3c9659a55b5aa5d66e0d9d6f',\n },\n local: {\n API_BASE_URL: `https://${getDevApiUrl('v1')}/api/`,\n API_V2_BASE_URL: `https://${getDevApiUrl('v2')}`,\n ADMIN_PORTAL_BASE_URL: 'http://localhost:4000/',\n COMPANY_PORTAL_BASE_URL: 'http://localhost:3000/',\n NEW_RELIC_APP_ID: '255699936',\n API_SOCKET_ENDPOINT: `wss://${getDevApiUrl('v2')}`,\n googleClientId: '999094876822-i3029amhpv2pm9a4qj0fnvtuvn8d76np.apps.googleusercontent.com'\n },\n dev: {\n API_BASE_URL: `https://${getDevApiUrl('v1')}/api/`,\n API_V2_BASE_URL: `https://${getDevApiUrl('v2')}`,\n ADMIN_PORTAL_BASE_URL: 'https://admin-dev.gopractis.com/',\n COMPANY_PORTAL_BASE_URL: 'https://portal-dev.gopractis.com/',\n NEW_RELIC_APP_ID: '255699936',\n API_SOCKET_ENDPOINT: `wss://${getDevApiUrl('v2')}`,\n googleClientId: '999094876822-i3029amhpv2pm9a4qj0fnvtuvn8d76np.apps.googleusercontent.com'\n },\n beta: {\n API_BASE_URL: 'https://api-beta.gopractis.com/api/',\n API_V2_BASE_URL: 'https://api-beta-v2.gopractis.com/',\n ADMIN_PORTAL_BASE_URL: 'https://admin-beta.gopractis.com/',\n COMPANY_PORTAL_BASE_URL: 'https://portal-beta.gopractis.com/',\n S3_FILES_BASE_URL:\n 'https://practis-files-beta.s3-us-west-1.amazonaws.com/',\n NEW_RELIC_APP_ID: '255708755',\n API_SOCKET_ENDPOINT: 'wss://api-beta-v2.gopractis.com',\n googleClientId: '999094876822-o4ocaic126v332htbagjak5035057i0r.apps.googleusercontent.com'\n },\n prod: {\n API_BASE_URL: 'https://api.gopractis.com/api/',\n API_V2_BASE_URL: 'https://api-v2.gopractis.com/',\n ADMIN_PORTAL_BASE_URL: 'https://admin.gopractis.com/',\n COMPANY_PORTAL_BASE_URL: 'https://portal.gopractis.com/',\n S3_FILES_BASE_URL:\n 'https://practis-files-prod.s3-us-west-1.amazonaws.com/',\n NEW_RELIC_APP_ID: '255709065',\n API_SOCKET_ENDPOINT: 'wss://api-v2.gopractis.com',\n googleClientId: '999094876822-vtnll7dbk74sblvdfmmuks9j10aot7jc.apps.googleusercontent.com'\n }\n};\n","import React, { Context, FC } from 'react';\n\nexport interface MultiContextProviderItem<TValue = any> {\n context: Context<TValue>;\n value: TValue;\n}\n\nexport function contextItem<TValue>(\n context: Context<TValue>,\n value: TValue\n): MultiContextProviderItem<TValue> {\n return {\n context,\n value,\n };\n}\n\nexport const MultiContextProvider: FC<{\n items: MultiContextProviderItem[];\n}> = ({ items, children }) => (\n <>\n {items.reverse().reduce(\n (prev, item, idx) => (\n <item.context.Provider key={idx} value={item.value}>\n {prev}\n </item.context.Provider>\n ),\n children\n )}\n </>\n);\n","interface ErrorResultDetails {\n message: string;\n field: string;\n}\n\ninterface ErrorResultValidation {\n [key: string]: string;\n}\n\nexport interface ErrorResult {\n code: number;\n errorCode?: number;\n message: string;\n status?: string;\n details?: ErrorResultDetails[];\n validation?: ErrorResultValidation;\n}\n\nexport function parseValidation(\n details?: ErrorResultDetails[]\n): ErrorResultValidation | undefined {\n if (details && details.reduce) {\n return details.reduce<ErrorResultValidation>(\n (result, detail) =>\n detail.field && detail.message\n ? { ...result, [detail.field]: detail.message }\n : result,\n {}\n );\n }\n return;\n}\n","import Axios, { AxiosError, AxiosResponse } from 'axios';\r\nimport {\r\n ErrorResult,\r\n parseValidation,\r\n} from '../../constants/interfaces/ErrorResult';\r\nimport { UrlBuilder } from '../url/UrlBuilder';\r\nimport { Http, HttpMethod } from './Http';\r\n\r\nexport interface DefaultHttpOptions {\r\n urlBuilder: UrlBuilder;\r\n clientHeader: string;\r\n getToken(): string | null | undefined;\r\n onError(error: ErrorResult): void;\r\n}\r\n\r\nexport class DefaultHttp implements Http {\r\n private readonly options: DefaultHttpOptions;\r\n\r\n constructor(options: DefaultHttpOptions) {\r\n this.options = options;\r\n }\r\n\r\n request(\r\n method: HttpMethod,\r\n path: string,\r\n data?: any,\r\n responseType?: 'blob',\r\n isV2?: boolean,\r\n dataInQuery?: boolean\r\n ): Promise<any> {\r\n return Axios({\r\n method: method,\r\n responseType: responseType,\r\n url: this.options.urlBuilder.buildApiUrl({\r\n path,\r\n isV2,\r\n query: dataInQuery ? data : undefined,\r\n }),\r\n data: data,\r\n headers: this.generateHeaders(),\r\n })\r\n .then((response: AxiosResponse) => {\r\n if (responseType) {\r\n return response;\r\n } else {\r\n return response.data;\r\n }\r\n })\r\n .catch((error: AxiosError) => {\r\n var errorResult: ErrorResult;\r\n if (error.response) {\r\n let message = '';\r\n switch (error.response.status) {\r\n case 401:\r\n case 400:\r\n case 403:\r\n case 404:\r\n case 409:\r\n case 500:\r\n message = error.response.data.message;\r\n break;\r\n default:\r\n message = 'Unexpected Error';\r\n }\r\n errorResult = {\r\n code: error.response.status,\r\n message,\r\n errorCode: error.response.data\r\n ? error.response.data.code\r\n : 0,\r\n details: error.response.data.details,\r\n validation: parseValidation(\r\n error.response.data.details\r\n ),\r\n };\r\n } else if (error.request) {\r\n errorResult = {\r\n code: 0,\r\n message: 'Check your network connection.',\r\n };\r\n } else {\r\n errorResult = {\r\n code: 0,\r\n message: 'Unexpected Error',\r\n };\r\n }\r\n this.options.onError(errorResult);\r\n throw errorResult;\r\n });\r\n }\r\n\r\n get(\r\n path: string,\r\n data?: any,\r\n responseType?: 'blob',\r\n isV2?: boolean\r\n ): Promise<any> {\r\n return this.request('get', path, data, responseType, isV2, true);\r\n }\r\n\r\n post(path: string, data?: any, isV2?: boolean): Promise<any> {\r\n return this.request('post', path, data, undefined, isV2);\r\n }\r\n\r\n delete(path: string, data?: any, isV2?: boolean): Promise<any> {\r\n return this.request('delete', path, data, undefined, isV2);\r\n }\r\n\r\n put(path: string, data: any, isV2?: boolean): Promise<any> {\r\n return this.request('put', path, data, undefined, isV2);\r\n }\r\n\r\n patch(path: string, data: any, isV2?: boolean): Promise<any> {\r\n return this.request('patch', path, data, undefined, isV2);\r\n }\r\n\r\n private generateHeaders() {\r\n let contentType = { 'Content-Type': 'application/json' };\r\n let client = { Client: this.options.clientHeader };\r\n let token = this.options.getToken();\r\n let authorization = token ? { Authorization: 'JWT ' + token } : {};\r\n return {\r\n ...contentType,\r\n ...authorization,\r\n ...client,\r\n };\r\n }\r\n}\r\n","import * as qs from 'query-string';\n\nexport type TQueryParamValue = string | undefined;\nexport type TRawQueryParamValue = TQueryParamValue | string[];\n\nexport interface IQueryString {\n [key: string]: TQueryParamValue;\n}\n\nexport interface IRawQueryString {\n [key: string]: TRawQueryParamValue;\n}\n\ninterface IParseResult {\n url: string;\n query: IQueryString;\n}\n\ninterface IRawParseResult {\n url: string;\n query: IRawQueryString;\n}\n\nfunction parseRawQueryString(url: string): IRawParseResult {\n return qs.parseUrl(url) as IRawParseResult;\n}\n\nfunction parseQueryString(url: string): IParseResult {\n const rawQuery = parseRawQueryString(url).query;\n const query: IQueryString = {};\n Object.keys(rawQuery).map(key => {\n query[key] = flatQueryValue(key, rawQuery[key]);\n return key;\n });\n return {\n url,\n query,\n };\n}\n\nfunction flatQueryValue(\n key: string,\n value: TRawQueryParamValue\n): TQueryParamValue {\n if (Array.isArray(value)) {\n const result = value.filter(v => !!v);\n return result.length ? result[0] : undefined;\n }\n return value;\n}\n\nexport function getRawQueryStringFromUrl(url: string): IRawQueryString {\n return parseRawQueryString(url).query;\n}\n\nexport function getQueryStringFromUrl(url: string): IQueryString {\n return parseQueryString(url).query;\n}\n\nexport function getQueryStringFromCurrentUrl(): IQueryString {\n return getQueryStringFromUrl(getCurrentUrl());\n}\n\nexport function setQueryParameterToUrl(\n url: string,\n name: string,\n value?: string\n) {\n // TODO: [MM]: Add Array value support\n const { url: parsedUrl, query } = parseRawQueryString(url);\n query[name] = value;\n const resultQuery = qs.stringify(query);\n return parsedUrl + (resultQuery ? `?${resultQuery}` : '');\n}\n\nexport function setQueryObjectToUrl(url: string, obj: any) {\n const { url: parsedUrl, query } = parseRawQueryString(url);\n Object.keys(obj).map(key => {\n const v = obj[key];\n query[key] = typeof v !== 'boolean' && typeof v !== 'number' && !v ? undefined : v;\n return key;\n });\n const resultQuery = qs.stringify(query);\n return parsedUrl + (resultQuery ? `?${resultQuery}` : '');\n}\n\nexport function removeQueryObjectFromUrl(url: string, obj: any) {\n const emptyObj: any = {};\n Object.keys(obj).map(key => {\n emptyObj[key] = null;\n return key;\n });\n return setQueryObjectToUrl(url, emptyObj);\n}\n\nexport function getCurrentUrl(): string {\n return window.location ? window.location.href : '';\n}\n\nexport function setCurrentUrl(url: string) {\n if (window.history.replaceState) {\n window.history.replaceState({ path: url }, '', url);\n }\n}\n","import _ from 'lodash';\nimport { BuildUrlOptions, BuildApiUrlOptions, UrlBuilder } from './UrlBuilder';\nimport { setQueryObjectToUrl } from './UrlUtils';\n\ninterface DefaultUrlBuilderOptions {\n companyBaseUrl: string;\n adminBaseUrl: string;\n apiBaseUrl: string;\n apiV2BaseUrl: string;\n}\n\nexport class DefaultUrlBuilder implements UrlBuilder {\n private readonly options: DefaultUrlBuilderOptions;\n\n constructor(options: DefaultUrlBuilderOptions) {\n this.options = options;\n }\n\n buildCompanyUrl(o: BuildUrlOptions): string {\n return buildUrl(this.options.companyBaseUrl, o);\n }\n\n buildAdminUrl(o: BuildUrlOptions): string {\n return buildUrl(this.options.adminBaseUrl, o);\n }\n\n buildApiUrl(o: BuildApiUrlOptions): string {\n const apiBaseUrl = o.isV2\n ? this.options.apiV2BaseUrl\n : this.options.apiBaseUrl;\n return buildUrl(apiBaseUrl, { ...o, absolute: true });\n }\n}\n\nfunction buildUrl(baseUrl: string, o: BuildUrlOptions): string {\n var path = o.path || '';\n if (path && o.params) {\n for (var name in o.params) {\n path = replaceParam(path, name, o.params[name]);\n }\n }\n const result = !!o.absolute\n ? joinSegments([baseUrl, path])\n : joinSegments([path]);\n return o.query ? setQueryObjectToUrl(result, o.query) : result;\n}\n\nfunction replaceParam(path: string, param: string, value: string): string {\n return _.replace(path, `:${param}`, value);\n}\n\nfunction joinSegments(segments: string[]): string {\n var result = segments\n .filter(s => !!s)\n .map(s => _.trim(s, '/'))\n .join('/');\n return result + '/';\n}\n","import { NewRelicApi } from './NewRelic';\n\nexport interface DefaultNewRelicOptions {\n newRelicLicenceKey: string;\n newRelicAppId: string;\n}\n\nexport class DefaultNewRelic implements NewRelicApi {\n private readonly options: DefaultNewRelicOptions;\n\n constructor(options: DefaultNewRelicOptions) {\n this.options = options;\n }\n\n getLicenseKey = () => {\n return this.options.newRelicLicenceKey;\n };\n\n getAppId = () => {\n return this.options.newRelicAppId;\n };\n}\n","import { LocalStorage } from './LocalStorage';\n\nexport class DefaultLocalStorage implements LocalStorage {\n private readonly storage = localStorage;\n\n get(key: string): any {\n const item = this.storage.getItem(key);\n\n if (item) {\n return JSON.parse(item);\n } else {\n return null;\n }\n }\n\n set(key: string, data: any): string | null {\n this.storage.setItem(key, JSON.stringify(data));\n return this.storage.getItem(key);\n }\n\n clear(): any {\n return this.storage.clear();\n }\n\n remove(key: string): boolean {\n if (this.storage.getItem(key) !== null) {\n this.storage.removeItem(key);\n return true;\n } else {\n return false;\n }\n }\n}\n","import { Reducer } from 'redux';\nimport Storage from '../services/Storage';\nimport {\n buildConfig,\n EnvironmentConfigs,\n registerConfig,\n} from '../tools/config';\nimport { WEB_SITE_ID } from '../tools/constants/WebSiteId';\nimport { DefaultHttp } from '../tools/http/DefaultHttp';\nimport { Http } from '../tools/http/Http';\nimport { ThunkContext } from '../tools/thunk/ThunkContext';\nimport { DefaultUrlBuilder } from '../tools/url/DefaultUrlBuilder';\nimport { UrlBuilder } from '../tools/url/UrlBuilder';\nimport { createStore } from './store';\nimport { NewRelicApi } from '../tools/newRelic/NewRelic';\nimport { DefaultNewRelic } from '../tools/newRelic/DefaultNewRelic';\nimport { DefaultLocalStorage } from '../tools/localStorage/DefaultLocalStorage';\nimport { LocalStorage } from '../tools/localStorage/LocalStorage';\nimport ROUTES from '../routes/routes';\nimport {\n clearAuthData,\n isAuthorized,\n getCurrentUserId\n} from '../helpers/functions/auth-helpers';\nimport { UserV2 } from '../constants/interfaces/User';\nimport { isUserRole } from '../constants/enums';\n\nconst loggedOutRoutes = [\n ROUTES.AUTH_PAGES.LOGIN,\n ROUTES.AUTH_PAGES.MOBILE_NUMBER_VERIFY.replace(':phoneNumber', ''),\n ROUTES.AUTH_PAGES.RESET_PASSWORD,\n ROUTES.AUTH_PAGES.AUTH0_CALLBACK,\n]\n\nfunction logOut() {\n clearAuthData();\n const isLoggedOutRoute = loggedOutRoutes.some(\n route => window.location.pathname.indexOf(route) === 0\n );\n if (!isLoggedOutRoute) {\n window.location.href = ROUTES.AUTH_PAGES.LOGIN;\n }\n}\n\nexport function configServices(\n webSiteId: WEB_SITE_ID,\n appConfig: EnvironmentConfigs,\n rootReducer: Reducer\n) {\n const config = buildConfig(appConfig);\n registerConfig(config);\n\n const urlBuilder: UrlBuilder = new DefaultUrlBuilder({\n adminBaseUrl: config.ADMIN_PORTAL_BASE_URL!,\n apiBaseUrl: config.API_BASE_URL!,\n apiV2BaseUrl: config.API_V2_BASE_URL!,\n companyBaseUrl: config.COMPANY_PORTAL_BASE_URL!,\n });\n\n const http: Http = new DefaultHttp({\n urlBuilder: urlBuilder,\n clientHeader: config.API_CLIENT!,\n getToken: () => Storage.get('token') || Storage.get('temp_token'),\n onError: error => {\n switch (error?.code) {\n case 401:\n logOut();\n break;\n case 403:\n // if user doesn't have permissions, we need to check if their role has not been changed to USER\n if (isAuthorized()) {\n http.get(`users/${getCurrentUserId()}`, undefined, undefined, true)\n .then((user: UserV2) => {\n if (isUserRole(user.role?.name)) {\n logOut();\n }\n });\n }\n break;\n }\n },\n });\n\n const localStorage: LocalStorage = new DefaultLocalStorage();\n\n const newRelicApi: NewRelicApi = new DefaultNewRelic({\n newRelicLicenceKey: config.NEW_RELIC_LICENSE_KEY,\n newRelicAppId: config.NEW_RELIC_APP_ID,\n });\n\n const thunkContext: ThunkContext = {\n webSiteId,\n http,\n localStorage,\n urlBuilder,\n newRelicApi,\n };\n\n const store = createStore(rootReducer, thunkContext);\n\n return {\n webSiteId,\n urlBuilder,\n http,\n localStorage,\n newRelicApi,\n store,\n };\n}\n\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\n\nexport interface AuthState {\n token: string;\n}\n\nexport type AuthStateSelector = (state: any) => AuthState;\n\nexport const AuthStateSelectorContext = React.createContext<AuthStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function useAuthState(): AuthState {\n return useSelector(useContext(AuthStateSelectorContext));\n}\n","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\n\nexport interface SocketProgressStateInterface {\n show?: boolean;\n}\n\nexport type SocketProgressStateSelector = (\n state: any\n) => SocketProgressStateInterface;\n\nexport const SocketProgressSelectorContext =\n React.createContext<SocketProgressStateSelector>(() => {\n throw new Error('Not implemented');\n });\n\nexport function SocketProgressState(): SocketProgressStateInterface {\n return useSelector(useContext(SocketProgressSelectorContext));\n}","import React, { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { SearchParams } from '../../../constants/interfaces/filters';\n\nexport interface SearchStateInterface {\n key: string,\n params?: SearchParams,\n childrenKeys: string[]\n}\n\nexport interface SecondarySearchStateInterface {\n key: string\n params?: SearchParams | undefined\n}\n\nexport type GlobalSearchStateSelector = (state: SearchStateInterface) => SearchStateInterface;\n\nexport const searchStateSelectorContext = React.createContext<GlobalSearchStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n\nexport function SearchState(): SearchStateInterface {\n return useSelector(useContext(searchStateSelectorContext));\n}\n\n\nexport type GlobalSecondarySearchStateSelector = (state: SearchStateInterface) => SearchStateInterface;\n\nexport function SecondarySearchState(): SearchStateInterface {\n return useSelector(useContext(secondarySearchStateSelectorContext));\n}\n\nexport const secondarySearchStateSelectorContext = React.createContext<GlobalSearchStateSelector>(\n () => {\n throw new Error('Not implemented');\n }\n);\n","import { Context } from 'react';\r\nimport { WEB_SITE_ID, WebSiteIdContext } from '../tools/constants/WebSiteId';\r\nimport { UrlBuilder, UrlBuilderContext } from '../tools/url/UrlBuilder';\r\nimport {\r\n EnrollmentStateSelectorContext,\r\n PractisSetReportStateSelectorContext,\r\n TrainerInvitationStateSelectorContext,\r\n TrainerStateSelectorContext,\r\n UpdatedProgressStateSelectorContext,\r\n UpdateMembersStateStateSelectorContext,\r\n} from '../features/teams/store/states';\r\nimport {\r\n ChallengeState,\r\n CompanyVoiceSettingsState,\r\n InvitationsState,\r\n LibraryChallengesState,\r\n LibraryPractisSetsState,\r\n LibraryScenariosState,\r\n PractisSetsEnrollmentState,\r\n selectTainerPractisSetState,\r\n SubmissionDetailsState,\r\n SubmissionsState,\r\n SubmissionPaginationState,\r\n AccuracyScoreState,\r\n PractisSetReportsState,\r\n TrainerInvitationState,\r\n UpdatedInvitationsState,\r\n UpdatedLibraryChallengesState,\r\n UpdatedLibraryPractisSetsState,\r\n UpdatedLibraryScenariosState,\r\n UpdatedSubmissionsState,\r\n UsersState,\r\n VoiceGenerationState,\r\n UserPerformanceState,\r\n LabelsState,\r\n UpdatedLabelsState,\r\n LabelsConfigState,\r\n UpdatedUsersState,\r\n selectUpdatedProgressState,\r\n SelectPermissionsState,\r\n UpdatedUserPractisSetsState,\r\n SelectLogsState,\r\n AuthState,\r\n SelectTelepromterState,\r\n SelectAiLogsState,\r\n DraftsState,\r\n UpdatedDraftsState,\r\n DraftEditState,\r\n TeamsState,\r\n UpdatedTeamsState,\r\n TeamMembersState,\r\n TeamsEditState,\r\n UpdatedMembersState,\r\n RolesState,\r\n CompanyAdminsState,\r\n ReportsState,\r\n OverdueLearnersState,\r\n ScenarioRepsState,\r\n CompanyUserStatsState,\r\n RoleplaysState,\r\n RoleplayState\r\n} from '../store/selectors';\r\nimport {\r\n InvitationsStateSelectorContext,\r\n UpdateInvitationStateStateSelectorContext,\r\n UpdateUsersStateStateSelectorContext,\r\n UserPerformanceStateSelectorContext,\r\n UsersStateSelectorContext,\r\n UpdatedUserPractisSetsStateSelectorContext,\r\n UpdateDraftsStateStateSelectorContext,\r\n DraftsStateSelectorContext,\r\n} from '../features/users/store/states';\r\nimport { VoiceGenerationSelectorContext } from '../features/textToSpeech/store/states';\r\nimport {\r\n LibraryPractisSetsStateSelectorContext,\r\n LibraryScenariosStateSelectorContext,\r\n LibraryChallengesStateSelectorContext,\r\n UpdatedLibraryPractisSetsSelectorContext,\r\n UpdatedLibraryScenariosSelectorContext,\r\n UpdatedLibraryChallengesStateSelectorContext,\r\n} from '../features/library/store/states';\r\nimport { ChallengeStateSelectorContext } from '../features/challenges/store/states';\r\nimport { NewRelicApi, NewRelicApiContext } from '../tools/newRelic/NewRelic';\r\nimport {\r\n SubmissionDetailsStateSelectorContext,\r\n SubmissionsStateSelectorContext,\r\n SubmissionPaginationStateSelectorContext,\r\n UpdatedSubmissionsStateSelectorContext,\r\n AccuracyScoreStateSelectorContext,\r\n} from '../features/submissions/store/states';\r\nimport {\r\n CompanyAdminsStateSelectorContext,\r\n CompanyUserStatsStateSelectorContext,\r\n CompanyVoiceSettingsStateSelectorContext,\r\n} from '../pages/CompanySettings/store/states';\r\nimport {\r\n LabelsConfigStateSelectorContext,\r\n LabelsStateSelectorContext,\r\n UpdatedLabelsStateSelectorContext,\r\n} from '../features/labels/store/states';\r\nimport {\r\n LocalStorage,\r\n LocalStorageContext,\r\n} from '../tools/localStorage/LocalStorage';\r\nimport { PermissionsStateSelectorContext } from '../features/permissions/store/state';\r\nimport { LogsStateSelectorContext } from '../features/logs/store/states';\r\nimport { AuthStateSelectorContext } from '../pages/Auth/store/states';\r\nimport { TelepromterStateSelectorContext } from '../features/telepromter/store/state';\r\nimport { AiLogsStateSelectorContext } from '../features/assessment-logs/store/states';\r\nimport { DraftEditStateSelectorContext } from '../pages/ActionPages/NewUser/store/states';\r\nimport {\r\n TeamMembersStateSelectorContext,\r\n TeamEditSelectorContext,\r\n TeamsStateSelectorContext,\r\n UpdateTeamsStateStateSelectorContext,\r\n} from '../features/teams/store/states';\r\nimport { UserRolesStateSelectorContext } from '../features/roles/store/states';\r\nimport {\r\n SocketProgressSelectorContext,\r\n SocketProgressState,\r\n} from '../features/socketProgress(api1)/store/states';\r\nimport { SearchState, searchStateSelectorContext } from '../features/searchState/store/states';\r\nimport { ReportsStateSelectorContext } from '../pages/Reports/store/states';\r\nimport { OverdueLearnersStateSelectorContext } from '../features/teams/pages/OverdueLearners/store/states';\r\nimport { ScenarioRepsStateSelectorContext } from '../features/teams/pages/Training/ScenarioReps/store/states';\r\nimport { RoleplaysStateSelectorContext } from '../pages/Roleplays/RoleplaysList/store/states';\r\nimport { RoleplayStateSelectorContext } from '../pages/Roleplays/RoleplayPage/store/states';\r\n\r\nexport interface ContextItem<TValue> {\r\n context: Context<TValue>;\r\n value: TValue;\r\n}\r\n\r\nexport function contextItem<TValue>(\r\n context: Context<TValue>,\r\n value: TValue\r\n): ContextItem<TValue> {\r\n return {\r\n context,\r\n value,\r\n };\r\n}\r\n\r\nexport function createContexts(\r\n webSiteId: WEB_SITE_ID,\r\n urlBuilder: UrlBuilder,\r\n localStorage: LocalStorage,\r\n newRelicApi: NewRelicApi\r\n): ContextItem<any>[] {\r\n return [\r\n contextItem(WebSiteIdContext, webSiteId),\r\n contextItem(UrlBuilderContext, urlBuilder),\r\n contextItem(LocalStorageContext, localStorage),\r\n contextItem(NewRelicApiContext, newRelicApi),\r\n contextItem(TrainerStateSelectorContext, selectTainerPractisSetState),\r\n contextItem(\r\n UpdatedProgressStateSelectorContext,\r\n selectUpdatedProgressState\r\n ),\r\n contextItem(EnrollmentStateSelectorContext, PractisSetsEnrollmentState),\r\n contextItem(\r\n TrainerInvitationStateSelectorContext,\r\n TrainerInvitationState\r\n ),\r\n contextItem(\r\n PractisSetReportStateSelectorContext,\r\n PractisSetReportsState\r\n ),\r\n contextItem(UsersStateSelectorContext, UsersState),\r\n contextItem(AuthStateSelectorContext, AuthState),\r\n contextItem(UpdateUsersStateStateSelectorContext, UpdatedUsersState),\r\n contextItem(InvitationsStateSelectorContext, InvitationsState),\r\n contextItem(\r\n UpdateInvitationStateStateSelectorContext,\r\n UpdatedInvitationsState\r\n ),\r\n contextItem(DraftsStateSelectorContext, DraftsState),\r\n contextItem(DraftEditStateSelectorContext, DraftEditState),\r\n contextItem(UpdateDraftsStateStateSelectorContext, UpdatedDraftsState),\r\n contextItem(UserPerformanceStateSelectorContext, UserPerformanceState),\r\n contextItem(\r\n UpdatedUserPractisSetsStateSelectorContext,\r\n UpdatedUserPractisSetsState\r\n ),\r\n contextItem(VoiceGenerationSelectorContext, VoiceGenerationState),\r\n contextItem(\r\n LibraryPractisSetsStateSelectorContext,\r\n LibraryPractisSetsState\r\n ),\r\n contextItem(\r\n LibraryScenariosStateSelectorContext,\r\n LibraryScenariosState\r\n ),\r\n contextItem(\r\n LibraryChallengesStateSelectorContext,\r\n LibraryChallengesState\r\n ),\r\n contextItem(\r\n UpdatedLibraryPractisSetsSelectorContext,\r\n UpdatedLibraryPractisSetsState\r\n ),\r\n contextItem(\r\n UpdatedLibraryScenariosSelectorContext,\r\n UpdatedLibraryScenariosState\r\n ),\r\n contextItem(\r\n UpdatedLibraryChallengesStateSelectorContext,\r\n UpdatedLibraryChallengesState\r\n ),\r\n contextItem(ChallengeStateSelectorContext, ChallengeState),\r\n contextItem(SubmissionsStateSelectorContext, SubmissionsState),\r\n contextItem(SubmissionPaginationStateSelectorContext, SubmissionPaginationState),\r\n contextItem(\r\n SubmissionDetailsStateSelectorContext,\r\n SubmissionDetailsState\r\n ),\r\n contextItem(\r\n UpdatedSubmissionsStateSelectorContext,\r\n UpdatedSubmissionsState\r\n ),\r\n contextItem(\r\n AccuracyScoreStateSelectorContext,\r\n AccuracyScoreState\r\n ),\r\n contextItem(\r\n AccuracyScoreStateSelectorContext,\r\n AccuracyScoreState\r\n ),\r\n contextItem(\r\n CompanyVoiceSettingsStateSelectorContext,\r\n CompanyVoiceSettingsState\r\n ),\r\n contextItem(LabelsStateSelectorContext, LabelsState),\r\n contextItem(LabelsConfigStateSelectorContext, LabelsConfigState),\r\n contextItem(UpdatedLabelsStateSelectorContext, UpdatedLabelsState),\r\n contextItem(PermissionsStateSelectorContext, SelectPermissionsState),\r\n contextItem(LogsStateSelectorContext, SelectLogsState),\r\n contextItem(TelepromterStateSelectorContext, SelectTelepromterState),\r\n contextItem(AiLogsStateSelectorContext, SelectAiLogsState),\r\n contextItem(TeamsStateSelectorContext, TeamsState),\r\n contextItem(\r\n UpdateMembersStateStateSelectorContext,\r\n UpdatedMembersState\r\n ),\r\n contextItem(UpdateTeamsStateStateSelectorContext, UpdatedTeamsState),\r\n contextItem(TeamMembersStateSelectorContext, TeamMembersState),\r\n contextItem(TeamEditSelectorContext, TeamsEditState),\r\n contextItem(UserRolesStateSelectorContext, RolesState),\r\n contextItem(SocketProgressSelectorContext, SocketProgressState),\r\n contextItem(searchStateSelectorContext, SearchState),\r\n contextItem(CompanyAdminsStateSelectorContext, CompanyAdminsState),\r\n contextItem(CompanyUserStatsStateSelectorContext, CompanyUserStatsState),\r\n contextItem(ReportsStateSelectorContext, ReportsState),\r\n contextItem(OverdueLearnersStateSelectorContext, OverdueLearnersState),\r\n contextItem(ScenarioRepsStateSelectorContext, ScenarioRepsState),\r\n contextItem(RoleplaysStateSelectorContext, RoleplaysState),\r\n contextItem(RoleplayStateSelectorContext, RoleplayState)\r\n\r\n ];\r\n}\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { Action } from 'redux';\nimport { TimeZoneInterface } from '../../constants/interfaces/general';\n\nexport const FETCH_TIMEZONES = 'FETCH_TIMEZONES';\nexport const FETCH_TIMEZONES_SUCCESS = 'FETCH_TIMEZONES_SUCCESS';\nexport const FETCH_TIMEZONES_FAILURE = 'FETCH_TIMEZONES_FAILURE';\n\nexport type FetchTimeZonesAction = Action<typeof FETCH_TIMEZONES>;\nexport function fetchTimeZonesAction(): FetchTimeZonesAction {\n return {\n type: FETCH_TIMEZONES,\n };\n}\n\nexport type FetchTimeZonesSuccessAction = Action<\n typeof FETCH_TIMEZONES_SUCCESS\n> & { data: TimeZoneInterface[] };\nexport function fetchTimeZonesActionSuccess(\n data: any\n): FetchTimeZonesSuccessAction {\n return {\n type: FETCH_TIMEZONES_SUCCESS,\n data,\n };\n}\n\nexport type FetchTimeZonesFailureAction = Action<\n typeof FETCH_TIMEZONES_FAILURE\n> & { error: string };\nexport function fetchTimeZonesActionFailure(\n error: any\n): FetchTimeZonesFailureAction {\n return {\n type: FETCH_TIMEZONES_FAILURE,\n error,\n };\n}\n\nexport type GlobalActions =\n | FetchTimeZonesAction\n | FetchTimeZonesSuccessAction\n | FetchTimeZonesFailureAction;\n","import { Reducer } from 'redux';\n\nimport {\n FETCH_TIMEZONES,\n FETCH_TIMEZONES_FAILURE,\n FETCH_TIMEZONES_SUCCESS,\n GlobalActions,\n} from '../actions';\nimport { AppState } from './index';\nimport { TimeZoneInterface } from '../../constants/interfaces/general';\n\nexport interface GlobalReducerInterface {\n timeZones: {\n list: TimeZoneInterface[];\n isLoading: boolean;\n errors: string;\n };\n}\n\nconst initialState: GlobalReducerInterface = {\n timeZones: {\n list: [],\n isLoading: true,\n errors: '',\n },\n};\n\nconst globalReducers: Reducer<GlobalReducerInterface, GlobalActions> = (\n state = initialState,\n action\n): GlobalReducerInterface => {\n switch (action.type) {\n case FETCH_TIMEZONES:\n return {\n timeZones: {\n ...state.timeZones,\n isLoading: true,\n },\n };\n case FETCH_TIMEZONES_SUCCESS:\n const newTimeZoneList = action.data.map((timeZone: any) => ({\n value: timeZone.id,\n name: timeZone.name,\n }));\n return {\n timeZones: {\n list: newTimeZoneList,\n errors: '',\n isLoading: false,\n },\n };\n case FETCH_TIMEZONES_FAILURE:\n return {\n timeZones: {\n list: [...state.timeZones.list],\n isLoading: false,\n errors: action.error,\n },\n };\n default:\n return state;\n }\n};\n\nexport const getTimeZoneState = (state: AppState) => state.global.timeZones;\n\nexport default globalReducers;\n","import { Reducer } from 'redux';\nimport { cloneDeep } from 'lodash';\n\nimport { Config } from './types';\nimport { Actions } from './actions';\nimport { decapsulateAction } from '../../../../../store/helpers/decapsulateAction';\nimport { PaginationResult } from '../../../../../constants/interfaces/PaginationResult';\nimport { AppState } from '../../../../../store/reducers';\nimport { DEFAULT_SCENARIOS_SCOPE, Scope, WithScenarioScopes } from './scopes';\nimport { Scenario } from '../../../../../constants/interfaces/Scenario';\nimport { toggleItemInArray } from '../../../../../helpers/functions/array-helpers';\n\n//region Reducer state\nexport type StateWithScenarios = {\n _scenarios: Record<Scope, ScenariosState>;\n};\n\nexport type ScenariosState = {\n data: PaginationResult<Scenario>;\n selected: number[];\n saved: number[];\n loading: boolean;\n error: string | null;\n};\n\nconst initialState: ScenariosState = {\n data: {\n items: [],\n limit: 0,\n offset: 0,\n numberOfPages: 0,\n totalCount: 0,\n lastUpdated: undefined,\n },\n selected: [],\n saved: [],\n loading: false,\n error: null,\n};\n\nexport const withScenariosInitialState = <T>(\n baseInitialState: T,\n reducerName: keyof AppState\n): T & StateWithScenarios => {\n const scopes =\n WithScenarioScopes[reducerName] === undefined\n ? [DEFAULT_SCENARIOS_SCOPE]\n : [\n ...(WithScenarioScopes[reducerName] as string[]),\n DEFAULT_SCENARIOS_SCOPE,\n ];\n\n return {\n ...baseInitialState,\n _scenarios: scopes.reduce((acc: Record<string, ScenariosState>, scope) => {\n acc[scope] = cloneDeep(initialState);\n return acc;\n }, {}),\n };\n};\n//endregion\n\n//region HOR\nexport const withScenariosReducer = <S extends StateWithScenarios>(config: Config) => (\n baseReducer: Reducer<S>\n) => (state: S, nativeAction: Actions): S => {\n let newState = state;\n const { reducerName } = config;\n \n const action = decapsulateAction(`${reducerName}/scenarios/`, nativeAction);\n const scope = action._scope;\n \n if (!scope) {\n return baseReducer(newState, action);\n }\n\n\n\n switch (action.type) {\n case 'clearScenarios':\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: [],\n partial: [],\n },\n },\n };\n break;\n case 'saveScenarios':\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n saved: [...state._scenarios[scope].selected],\n },\n },\n };\n break;\n case 'selectScenarios':\n let updatedSelectedState = [...state._scenarios[scope].selected];\n\n updatedSelectedState = toggleItemInArray(\n updatedSelectedState,\n action.id\n );\n\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: updatedSelectedState,\n },\n },\n };\n break;\n case 'selectMultipleScenarios': {\n \n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: action.ids,\n },\n },\n };\n break;\n }\n case 'selectAllScenarios':\n const newSelectedList = action.allScenarios;\n \n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: newSelectedList,\n },\n },\n };\n break;\n case 'deselectAllScenarios':\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: [],\n },\n },\n };\n break;\n case 'resetSelectedScenarios': {\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: state._scenarios[scope].saved,\n },\n },\n };\n break;\n }\n case 'resetScenarios':\n newState = {\n ...newState,\n _scenarios: {\n ...state._scenarios,\n [scope]: {\n ...state._scenarios[scope],\n selected: [],\n saved: [],\n collapsed: [],\n },\n },\n };\n break;\n }\n\n return baseReducer(newState, action);\n};\n//endregion\n","import { combineReducers, compose, Reducer } from 'redux';\r\nimport {\r\n EnrollmentState,\r\n PractisSetReportState,\r\n TeamEditState,\r\n TeamMembersBaseState,\r\n TeamMembersState,\r\n TeamsState,\r\n AssignUsersState,\r\n UpdatedProgressState,\r\n UpdateMembersState,\r\n UpdateTeamsState,\r\n PractisSetsTrainingState,\r\n TeamUpdateStatus\r\n} from './states';\r\nimport {\r\n ACTIONS,\r\n checkAllProgress,\r\n checkSingleProgress,\r\n deselectAllTeamLeadersSelectionAction,\r\n fetchAllTeamsFailure,\r\n fetchAllTeamsStart,\r\n fetchAllTeamsSuccess,\r\n getPractisSetFailure,\r\n getPractisSetReportFailure,\r\n getPractisSetReportStart,\r\n getPractisSetReportSuccess,\r\n getPractisSetStart,\r\n getPractisSetSuccess,\r\n getTeamInfoFailure,\r\n getTeamInfoStart,\r\n getTeamInfoSuccess,\r\n getTeamInfoTrainingFailure,\r\n getTeamInfoTrainingStart,\r\n getTeamInfoTrainingSuccess,\r\n modifyTeamName,\r\n removeSingleTeamAllUsersLabel,\r\n removeSingleTeamMemberLabel,\r\n resetPractisSetReport,\r\n resetSingleTeamPage,\r\n resetTeamInfo,\r\n resetTeamLeadersSelectionAction,\r\n saveTeamLeaderSelection,\r\n searchInvitationUsersFailure,\r\n searchInvitationUsersStart,\r\n searchInvitationUsersSuccess,\r\n searchPractisUsersFailure,\r\n searchPractisUsersStart,\r\n searchPractisUsersSuccess,\r\n searchSingleTeamAllUsersFailure,\r\n searchSingleTeamAllUsersStart,\r\n searchSingleTeamAllUsersSuccess,\r\n searchSingleTeamFailure,\r\n searchSingleTeamMembersFailure,\r\n searchSingleTeamMembersStart,\r\n searchSingleTeamMembersSuccess,\r\n searchSingleTeamStart,\r\n searchSingleTeamSuccess,\r\n searchTeamLeadersFailureAction,\r\n searchTeamLeadersStartAction,\r\n searchTeamLeadersSuccessAction,\r\n searchTeamMembersFailureAction,\r\n searchTeamMembersStartAction,\r\n searchTeamMembersSuccessAction,\r\n searchTrainerFailure,\r\n searchTrainerStart,\r\n searchTrainerSuccess,\r\n selectMultipleTeamLeaderAction,\r\n selectTeamLeaderAction,\r\n sendTraineeInvitationSuccess,\r\n setAssignedLabelsToSingleTeam,\r\n setDeletedLabelsToSingleTeam,\r\n updateAllSelectedInvitationTraineesState,\r\n updateAllSelectedPractisSetsState,\r\n updateAllSelectedTeamsState,\r\n updatedProgressActionFailure,\r\n updatedProgressActionStart,\r\n updatedProgressActionSuccess,\r\n updateMemberActionFailure,\r\n updateMemberActionStart,\r\n updateMemberActionSuccess,\r\n updateSelectedInvitationTraineesState,\r\n updateSelectedPractisSetState,\r\n updateSelectedTeamState,\r\n createSingleTeamSuccess,\r\n updateSingleTeamFailure,\r\n updateSingleTeamStart,\r\n updateSingleTeamSuccess,\r\n updateTeamActionFailure,\r\n updateTeamActionStart,\r\n updateTeamActionSuccess,\r\n updateTraineeDueDateAction,\r\n resetPractisSetDetails,\r\n updateTeamLead,\r\n clearTeamUpdateStatus,\r\n updateSingleTeamStop,\r\n clearTrainerPractisSet,\r\n} from './actions';\r\nimport {\r\n withLabelsInitialState,\r\n withLabelsReducer,\r\n} from '../../portableLabels/store/hors/withLabels';\r\nimport { toggleItemInArray } from '../../../helpers/functions/array-helpers';\r\nimport {\r\n withTeamsInitialState,\r\n withTeamsReducer,\r\n} from '../../portableTeams/store/hors/withTeams';\r\nimport { TeamV2 } from '../../../constants/interfaces/Team';\r\n\r\nconst initialTeamsState: TeamsState = withLabelsInitialState<TeamsState>(\r\n withTeamsInitialState<TeamsState>(\r\n {\r\n teamLeaders: {\r\n selected: [],\r\n saved: [],\r\n },\r\n },\r\n 'teams'\r\n ),\r\n 'teams'\r\n);\r\n\r\nexport type TeamsAction =\r\n | ReturnType<typeof fetchAllTeamsStart>\r\n | ReturnType<typeof fetchAllTeamsSuccess>\r\n | ReturnType<typeof fetchAllTeamsFailure>\r\n | ReturnType<typeof updateSelectedTeamState>\r\n | ReturnType<typeof updateAllSelectedTeamsState>\r\n | ReturnType<typeof searchTeamLeadersStartAction>\r\n | ReturnType<typeof searchTeamLeadersSuccessAction>\r\n | ReturnType<typeof searchTeamLeadersFailureAction>\r\n | ReturnType<typeof selectTeamLeaderAction>\r\n | ReturnType<typeof selectMultipleTeamLeaderAction>\r\n | ReturnType<typeof saveTeamLeaderSelection>\r\n | ReturnType<typeof resetTeamLeadersSelectionAction>\r\n | ReturnType<typeof deselectAllTeamLeadersSelectionAction>;\r\n\r\nexport const allTeamsBaseReducer: Reducer<TeamsState, TeamsAction> = (\r\n state = initialTeamsState,\r\n action: TeamsAction\r\n): TeamsState => {\r\n switch (action.type) {\r\n case ACTIONS.FETCH_ALL_TEAMS:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.FETCH_ALL_TEAMS_SUCCESS:\r\n return {\r\n ...state,\r\n myTeams: action.data,\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.FETCH_ALL_TEAMS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_SELECTED_TEAM_STATE:\r\n const selectedTeamIds = [...(state.selectedMyTeamsItems || [])];\r\n\r\n const selectedTeamIndex = selectedTeamIds.findIndex(\r\n (item: number) => item === action.teamId\r\n );\r\n if (selectedTeamIndex > -1) {\r\n selectedTeamIds.splice(selectedTeamIndex, 1);\r\n } else {\r\n selectedTeamIds.push(action.teamId);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedMyTeamsItems: selectedTeamIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_TEAMS_STATE:\r\n return {\r\n ...state,\r\n selectedMyTeamsItems:\r\n action.checked || action.partial ? action.teamIds : [],\r\n };\r\n case ACTIONS.SEARCH_TEAM_LEADERS_START:\r\n return {\r\n ...state,\r\n };\r\n case ACTIONS.SEARCH_TEAM_LEADERS_SUCCESS:\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n data: action.data,\r\n },\r\n };\r\n case ACTIONS.SEARCH_TEAM_LEADERS_FAILURE:\r\n return {\r\n ...state,\r\n error: action.error,\r\n };\r\n case ACTIONS.SELECT_TEAM_LEADER: {\r\n const updatedSelections = [...state.teamLeaders.selected];\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n selected: toggleItemInArray(\r\n updatedSelections,\r\n action.leaderId\r\n ),\r\n },\r\n };\r\n }\r\n case ACTIONS.SELECT_MULTIPLE_TEAM_LEADERS: {\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n selected: action.leaderIds,\r\n },\r\n };\r\n }\r\n case ACTIONS.SAVE_TEAM_LEADERS_SELECTION: {\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n saved: state.teamLeaders.selected,\r\n },\r\n };\r\n }\r\n case ACTIONS.RESET_TEAM_LEADERS_SELECTION: {\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n selected: state.teamLeaders.saved || [],\r\n },\r\n };\r\n }\r\n case ACTIONS.DESELECT_ALL_TEAM_LEADERS_SELECTION: {\r\n return {\r\n ...state,\r\n teamLeaders: {\r\n ...state.teamLeaders,\r\n selected: [],\r\n },\r\n };\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const allTeamsReducer = compose<Reducer<TeamsState, TeamsAction>>(\r\n withLabelsReducer({ reducerName: 'teams' }),\r\n withTeamsReducer({ reducerName: 'teams' })\r\n)(allTeamsBaseReducer);\r\n\r\nconst initialTeamEditState = withLabelsInitialState<TeamEditState>(\r\n {\r\n data: undefined,\r\n assignedLabels: [],\r\n deletedLabels: [],\r\n updatedTeam: undefined,\r\n loading: false,\r\n updateStatus: undefined,\r\n },\r\n 'teamEdit'\r\n);\r\n\r\nexport type TeamEditAction =\r\n | ReturnType<typeof searchSingleTeamStart>\r\n | ReturnType<typeof searchSingleTeamSuccess>\r\n | ReturnType<typeof searchSingleTeamFailure>\r\n | ReturnType<typeof searchSingleTeamAllUsersStart>\r\n | ReturnType<typeof searchSingleTeamAllUsersSuccess>\r\n | ReturnType<typeof searchSingleTeamAllUsersFailure>\r\n | ReturnType<typeof searchSingleTeamMembersStart>\r\n | ReturnType<typeof searchSingleTeamMembersSuccess>\r\n | ReturnType<typeof searchSingleTeamMembersFailure>\r\n | ReturnType<typeof modifyTeamName>\r\n | ReturnType<typeof setAssignedLabelsToSingleTeam>\r\n | ReturnType<typeof setDeletedLabelsToSingleTeam>\r\n | ReturnType<typeof removeSingleTeamAllUsersLabel>\r\n | ReturnType<typeof removeSingleTeamMemberLabel>\r\n | ReturnType<typeof resetSingleTeamPage>\r\n | ReturnType<typeof updateTeamLead>\r\n | ReturnType<typeof createSingleTeamSuccess>\r\n | ReturnType<typeof updateSingleTeamStart>\r\n | ReturnType<typeof updateSingleTeamSuccess>\r\n | ReturnType<typeof updateSingleTeamFailure>\r\n | ReturnType<typeof updateSingleTeamStop>\r\n | ReturnType<typeof clearTeamUpdateStatus>\r\n\r\nconst teamEditBaseReducer: Reducer<TeamEditState, TeamEditAction> = (\r\n state = initialTeamEditState,\r\n action: TeamEditAction\r\n): TeamEditState => {\r\n switch (action.type) {\r\n case ACTIONS.SEARCH_SINGLE_TEAM_START: {\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_SUCCESS: {\r\n return {\r\n ...state,\r\n data: action.data,\r\n loading: false,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_FAILURE: {\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.CREATE_SINGLE_TEAM_SUCCESS: {\r\n return {\r\n ...state,\r\n loading: false,\r\n updatedTeam: action.team,\r\n };\r\n }\r\n case ACTIONS.UPDATE_SINGLE_TEAM_START: {\r\n return {\r\n ...state,\r\n updateStatus: TeamUpdateStatus.IN_PROGRESS,\r\n };\r\n }\r\n case ACTIONS.UPDATE_SINGLE_TEAM_SUCCESS: {\r\n const team: TeamV2 = { ...state.data! };\r\n team.updatedAt = new Date().toUTCString();\r\n return {\r\n ...state,\r\n data: {\r\n ...team\r\n },\r\n updateStatus: TeamUpdateStatus.COMPLETED,\r\n updatedTeam: action.team,\r\n };\r\n }\r\n case ACTIONS.UPDATE_SINGLE_TEAM_FAILURE: {\r\n return {\r\n ...state,\r\n updateStatus: TeamUpdateStatus.ERROR,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.UPDATE_SINGLE_TEAM_STOP: {\r\n const team = {\r\n ...state.data!,\r\n updatedAt: new Date().toUTCString()\r\n };\r\n return {\r\n ...state,\r\n data: team,\r\n updateStatus: undefined,\r\n updatedTeam: team,\r\n }\r\n }\r\n case ACTIONS.CLEAR_TEAM_UPDATE_STATUS: {\r\n return {\r\n ...state,\r\n updateStatus: undefined,\r\n };\r\n }\r\n case ACTIONS.MODIFY_TEAM_NAME: {\r\n const team: TeamV2 = { ...state.data! };\r\n team.name = action.value;\r\n\r\n return {\r\n ...state,\r\n data: {\r\n ...team,\r\n },\r\n };\r\n }\r\n\r\n case ACTIONS.UPDATE_TEAM_LEAD: {\r\n const { teamMembers: currentTeamMembers } = state;\r\n const updatedTeamMembers = {\r\n count: currentTeamMembers?.count ?? 0,\r\n items:\r\n currentTeamMembers?.items?.map(item =>\r\n item.id === action.teamUserId\r\n ? { ...item, isTeamLead: action.isTeamLead }\r\n : item\r\n ) ?? [],\r\n };\r\n const { data: currentTeam } = state;\r\n const member = currentTeamMembers?.items?.find(item => item.id === action.teamUserId);\r\n let updatedTeam = currentTeam;\r\n\r\n if (member && currentTeam) {\r\n if (action.isTeamLead) {\r\n const teamLeader = currentTeam.leaders?.find(item => item.id === member.id);\r\n if (!teamLeader) {\r\n updatedTeam = {\r\n ...currentTeam,\r\n leaders: (currentTeam.leaders ?? []).concat({\r\n id: member.id,\r\n user: member.user,\r\n isViewed: false\r\n })\r\n };\r\n }\r\n } else {\r\n updatedTeam = {\r\n ...currentTeam,\r\n leaders: currentTeam.leaders?.filter(item => item.id !== member.id)\r\n };\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n data: updatedTeam,\r\n teamMembers: updatedTeamMembers,\r\n };\r\n }\r\n case ACTIONS.SET_ASSIGNED_LABELS_TO_SINGLE_TEAM: {\r\n return {\r\n ...state,\r\n assignedLabels: action.labelIDs,\r\n };\r\n }\r\n case ACTIONS.SET_DELETED_LABELS_TO_SINGLE_TEAM: {\r\n return {\r\n ...state,\r\n deletedLabels: action.labelIDs,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_START: {\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_SUCCESS: {\r\n return {\r\n ...state,\r\n loading: false,\r\n allUsers: action?.isRefreshed\r\n ? action.data\r\n : action.offset > 0 && state.allUsers?.items\r\n ? {\r\n ...action.data,\r\n items: state.allUsers.items.concat(action.data.items),\r\n }\r\n : action.data,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_ALL_USERS_FAILURE: {\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_START: {\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n }\r\n case ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_SUCCESS: {\r\n return {\r\n ...state,\r\n loading: false,\r\n teamMembers: action?.isRefreshed\r\n ? action.data\r\n : action.offset > 0 && state.teamMembers?.items\r\n ? {\r\n ...action.data,\r\n items: state.teamMembers.items.concat(\r\n action.data.items\r\n ),\r\n }\r\n : action.data,\r\n };\r\n }\r\n\r\n case ACTIONS.SEARCH_SINGLE_TEAM_MEMBERS_FAILURE: {\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.REMOVE_SINGLE_TEAM_ALL_USERS_LABEL: {\r\n if (!state.allUsers) return state;\r\n const allUsers = {\r\n ...state.allUsers,\r\n items: state.allUsers?.items.map(item => {\r\n if (item.id === action.userId)\r\n return {\r\n ...item,\r\n labels: item.labels?.filter(\r\n label => label !== action.labelId\r\n ),\r\n };\r\n return item;\r\n }),\r\n };\r\n return {\r\n ...state,\r\n allUsers,\r\n };\r\n }\r\n case ACTIONS.REMOVE_SINGLE_TEAM_MEMBER_LABEL: {\r\n if (!state.teamMembers) return state;\r\n const teamMembers = {\r\n ...state.teamMembers,\r\n items: state.teamMembers.items.map(item => {\r\n if (item.user.id === action.userId)\r\n return {\r\n ...item,\r\n labels: item.labels?.filter(\r\n labelId => labelId !== action.labelId\r\n ),\r\n };\r\n return item;\r\n }),\r\n };\r\n return {\r\n ...state,\r\n teamMembers,\r\n };\r\n }\r\n case ACTIONS.RESET_SINGLE_TEAM_PAGE: {\r\n return {\r\n ...state,\r\n data: undefined,\r\n teamMembers: undefined,\r\n allUsers: undefined,\r\n assignedLabels: [],\r\n deletedLabels: [],\r\n updatedTeam: undefined,\r\n loading: false,\r\n updateStatus: undefined,\r\n };\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const teamEditReducer = compose<Reducer<TeamEditState, TeamEditAction>>(\r\n withLabelsReducer({ reducerName: 'teamEdit' })\r\n)(teamEditBaseReducer);\r\n\r\nconst initialUpdateTeamState: UpdateTeamsState = {};\r\n\r\nexport type updateTeamAction =\r\n | ReturnType<typeof updateTeamActionStart>\r\n | ReturnType<typeof updateTeamActionSuccess>\r\n | ReturnType<typeof updateTeamActionFailure>;\r\n\r\nexport const updatedTeamReducer: Reducer<UpdateTeamsState, updateTeamAction> = (\r\n state = initialUpdateTeamState,\r\n action: updateTeamAction\r\n): UpdateTeamsState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_TEAM_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_TEAM_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.team,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_TEAM_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialUpdateMemberState: UpdateTeamsState = {};\r\n\r\nexport type updateMemberAction =\r\n | ReturnType<typeof updateMemberActionStart>\r\n | ReturnType<typeof updateMemberActionSuccess>\r\n | ReturnType<typeof updateMemberActionFailure>;\r\n\r\nexport const updatedMemberReducer: Reducer<\r\n UpdateMembersState,\r\n updateMemberAction\r\n> = (\r\n state = initialUpdateMemberState,\r\n action: updateMemberAction\r\n): UpdateTeamsState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_MEMBER_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_MEMBER_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.team,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_MEMBER_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\n//region Team members\r\nconst teamMembersInitialState = withLabelsInitialState<TeamMembersBaseState>(\r\n {\r\n itemsOnPage: 20,\r\n list: {\r\n items: [],\r\n count: 0,\r\n },\r\n loading: false,\r\n error: null,\r\n },\r\n 'teamMembers'\r\n);\r\n\r\nexport type TeamMembersAction =\r\n | ReturnType<typeof getTeamInfoStart>\r\n | ReturnType<typeof getTeamInfoSuccess>\r\n | ReturnType<typeof getTeamInfoFailure>\r\n | ReturnType<typeof resetTeamInfo>\r\n | ReturnType<typeof searchTeamMembersStartAction>\r\n | ReturnType<typeof searchTeamMembersSuccessAction>\r\n | ReturnType<typeof searchTeamMembersFailureAction>;\r\n\r\nconst teamMembersBaseReducer: Reducer<TeamMembersState, TeamMembersAction> = (\r\n state = teamMembersInitialState,\r\n action: TeamMembersAction\r\n): TeamMembersState => {\r\n switch (action.type) {\r\n case ACTIONS.GET_TEAM_INFO_START: {\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n }\r\n case ACTIONS.GET_TEAM_INFO_SUCCESS: {\r\n return {\r\n ...state,\r\n data: action.data,\r\n loading: false,\r\n };\r\n }\r\n case ACTIONS.GET_TEAM_INFO_FAILURE: {\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.RESET_TEAM_INFO: {\r\n return {\r\n ...state,\r\n data: undefined,\r\n };\r\n }\r\n case ACTIONS.SEARCH_TEAM_MEMBERS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: null,\r\n };\r\n case ACTIONS.SEARCH_TEAM_MEMBERS_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n list: action.data,\r\n };\r\n case ACTIONS.SEARCH_TEAM_MEMBERS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const teamMembersReducer = compose<\r\n Reducer<TeamMembersState, TeamMembersAction>\r\n>(withLabelsReducer({ reducerName: 'teamMembers' }))(teamMembersBaseReducer);\r\n\r\n//endregion\r\n\r\nconst initialState: PractisSetsTrainingState = withLabelsInitialState<PractisSetsTrainingState>(\r\n {\r\n checked: [],\r\n },\r\n 'practisSetsTraining'\r\n);\r\n\r\nexport type PractisSetsTrainingAction =\r\n | ReturnType<typeof getTeamInfoTrainingStart>\r\n | ReturnType<typeof getTeamInfoTrainingSuccess>\r\n | ReturnType<typeof getTeamInfoTrainingFailure>\r\n | ReturnType<typeof searchTrainerStart>\r\n | ReturnType<typeof searchTrainerSuccess>\r\n | ReturnType<typeof searchTrainerFailure>\r\n | ReturnType<typeof checkSingleProgress>\r\n | ReturnType<typeof checkAllProgress>\r\n | ReturnType<typeof updateAllSelectedPractisSetsState>\r\n | ReturnType<typeof clearTrainerPractisSet>\r\n | ReturnType<typeof updateSelectedPractisSetState>;\r\n\r\nconst trainerPractisSetsBaseReducer: Reducer<\r\n PractisSetsTrainingState,\r\n PractisSetsTrainingAction\r\n> = (\r\n state = initialState,\r\n action: PractisSetsTrainingAction\r\n): PractisSetsTrainingState => {\r\n switch (action.type) {\r\n case ACTIONS.GET_TEAM_INFO_TRAINING_START: {\r\n return {\r\n ...state,\r\n };\r\n }\r\n case ACTIONS.GET_TEAM_INFO_TRAINING_SUCCESS: {\r\n return {\r\n ...state,\r\n teamData: action.data,\r\n };\r\n }\r\n case ACTIONS.GET_TEAM_INFO_TRAINING_FAILURE: {\r\n return {\r\n ...state,\r\n error: action.error,\r\n };\r\n }\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_SUCCESS:\r\n return {\r\n ...state,\r\n data: {\r\n ...action.practisSets,\r\n items: action.practisSets.items,\r\n },\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_SETS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.CHECK_SINGLE_PROGRESS: {\r\n const selectedIds = [...state.checked];\r\n\r\n const selectedIdIndex = selectedIds.findIndex(\r\n (item: number) => item === action.id\r\n );\r\n if (selectedIdIndex > -1) {\r\n selectedIds.splice(selectedIdIndex, 1);\r\n } else {\r\n selectedIds.push(action.id);\r\n }\r\n\r\n return {\r\n ...state,\r\n checked: selectedIds,\r\n };\r\n }\r\n case ACTIONS.CHECK_ALL_PROGRESS:\r\n return {\r\n ...state,\r\n checked:\r\n action.checked || action.partial ? action.progressId : [],\r\n };\r\n case ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE:\r\n const selectedPractisSetIds = [\r\n ...(state.selectedPractisSets || []),\r\n ];\r\n\r\n const selectedPractisSetIndex = selectedPractisSetIds.findIndex(\r\n (item: number) => item === action.setId\r\n );\r\n if (selectedPractisSetIndex > -1) {\r\n selectedPractisSetIds.splice(selectedPractisSetIndex, 1);\r\n } else {\r\n selectedPractisSetIds.push(action.setId);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedPractisSets: selectedPractisSetIds,\r\n };\r\n case ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE:\r\n return {\r\n ...state,\r\n selectedPractisSets:\r\n action.checked || action.partial ? action.setIds : [],\r\n };\r\n case ACTIONS.CLEAR_TRAINER_PRACTIS_SETS_SUCCESS:\r\n return {\r\n ...state,\r\n data: {\r\n count: 0,\r\n items: [],\r\n },\r\n loading: false,\r\n error: '',\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const trainerPractisSetsReducer = compose<\r\n Reducer<PractisSetsTrainingState, PractisSetsTrainingAction>\r\n>(withLabelsReducer({ reducerName: 'practisSetsTraining' }))(\r\n trainerPractisSetsBaseReducer\r\n);\r\n\r\nconst initialEnrollmentsState: EnrollmentState = {};\r\n\r\nexport type EnrollmentsAction =\r\n | ReturnType<typeof searchPractisUsersStart>\r\n | ReturnType<typeof searchPractisUsersSuccess>\r\n | ReturnType<typeof searchPractisUsersFailure>\r\n | ReturnType<typeof getPractisSetStart>\r\n | ReturnType<typeof getPractisSetSuccess>\r\n | ReturnType<typeof getPractisSetFailure>\r\n | ReturnType<typeof resetPractisSetDetails>\r\n | ReturnType<typeof sendTraineeInvitationSuccess>;\r\n\r\nconst practisSetsEnrollmentReducer: Reducer<\r\n EnrollmentState,\r\n EnrollmentsAction\r\n> = (\r\n state = initialEnrollmentsState,\r\n action: EnrollmentsAction\r\n): EnrollmentState => {\r\n switch (action.type) {\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_SUCCESS:\r\n if (\r\n state.data &&\r\n state.data.offset !== action.users.offset &&\r\n action.users.offset !== 0\r\n ) {\r\n return {\r\n ...state,\r\n data: {\r\n ...action.users,\r\n items: state.data ? action.users.items : [],\r\n },\r\n loading: false,\r\n error: '',\r\n };\r\n } else {\r\n return {\r\n ...state,\r\n data: {\r\n ...action.users,\r\n items: action.users.items,\r\n },\r\n loading: false,\r\n error: '',\r\n };\r\n }\r\n case ACTIONS.SEARCH_TRAINER_PRACTIS_USERS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.GET_PRACTIS_SET_START:\r\n return {\r\n ...state,\r\n };\r\n case ACTIONS.GET_PRACTIS_SET_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n practisSet: action.practisSet,\r\n error: '',\r\n };\r\n case ACTIONS.GET_PRACTIS_SET_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n\r\n case ACTIONS.RESET_PRACTIS_SET_DETAILS:\r\n return initialEnrollmentsState;\r\n case ACTIONS.SEND_TRAINEE_INVITATION_SUCCESS: {\r\n const updatedArray = state.update ? [...state.update] : [];\r\n updatedArray.push(action.inviteType);\r\n return {\r\n ...state,\r\n update: updatedArray,\r\n };\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialPractisSetReportState: PractisSetReportState = {};\r\n\r\nexport type PractisSetReportActions =\r\n | ReturnType<typeof getPractisSetReportStart>\r\n | ReturnType<typeof getPractisSetReportSuccess>\r\n | ReturnType<typeof getPractisSetReportFailure>\r\n | ReturnType<typeof resetPractisSetReport>;\r\n\r\nconst practisSetReportsReducer: Reducer<\r\n PractisSetReportState,\r\n PractisSetReportActions\r\n> = (\r\n state = initialPractisSetReportState,\r\n action: PractisSetReportActions\r\n): PractisSetReportState => {\r\n switch (action.type) {\r\n case ACTIONS.GET_PRACTIS_SET_REPORT_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.GET_PRACTIS_SET_REPORT_SUCCESS:\r\n return {\r\n ...state,\r\n enrollment: action.enrollment,\r\n progress: action.progress,\r\n dailyTraining: action.dailyTraining,\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.GET_PRACTIS_SET_REPORT_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.RESET_PRACTIS_SET_REPORT:\r\n return {\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialUpdatedProgressState: UpdatedProgressState = {};\r\n\r\nexport type updatedProgressAction =\r\n | ReturnType<typeof updatedProgressActionStart>\r\n | ReturnType<typeof updatedProgressActionSuccess>\r\n | ReturnType<typeof updatedProgressActionFailure>;\r\n\r\nexport const updatedProgressReducer: Reducer<\r\n UpdatedProgressState,\r\n updatedProgressAction\r\n> = (\r\n state = initialUpdatedProgressState,\r\n action: updatedProgressAction\r\n): UpdatedProgressState => {\r\n switch (action.type) {\r\n case ACTIONS.UPDATE_PROGRESS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case ACTIONS.UPDATE_PROGRESS_SUCCESS:\r\n return {\r\n ...state,\r\n data: action.progress,\r\n updateType: action.updateType,\r\n loading: false,\r\n };\r\n case ACTIONS.UPDATE_PROGRESS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst initialInvitationState: AssignUsersState = withLabelsInitialState<AssignUsersState>(\r\n {},\r\n 'assignUsers'\r\n);\r\n\r\nexport type AssignUsersAction =\r\n | ReturnType<typeof searchInvitationUsersStart>\r\n | ReturnType<typeof searchInvitationUsersSuccess>\r\n | ReturnType<typeof searchInvitationUsersFailure>\r\n | ReturnType<typeof sendTraineeInvitationSuccess>\r\n | ReturnType<typeof updateSelectedInvitationTraineesState>\r\n | ReturnType<typeof updateAllSelectedInvitationTraineesState>\r\n | ReturnType<typeof updateTraineeDueDateAction>;\r\n\r\nconst assignUsersBaseReducer: Reducer<AssignUsersState, AssignUsersAction> = (\r\n state = initialInvitationState,\r\n action: AssignUsersAction\r\n): AssignUsersState => {\r\n switch (action.type) {\r\n case ACTIONS.SEARCH_TRAINER_INVITATION_USERS_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_TRAINER_INVITATION_USERS_SUCCESS:\r\n return {\r\n ...state,\r\n data: action?.isRefreshed\r\n ? action.users\r\n : action.offset > 0 && state.data?.items\r\n ? {\r\n ...action.users,\r\n items: state.data.items.concat(action.users.items),\r\n }\r\n : action.users,\r\n\r\n loading: false,\r\n error: '',\r\n };\r\n case ACTIONS.SEARCH_TRAINER_INVITATION_USERS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.error,\r\n };\r\n case ACTIONS.SEND_TRAINEE_INVITATION_SUCCESS: {\r\n const updatedArray = state.update ? [...state.update] : [];\r\n updatedArray.push(action.inviteType);\r\n return {\r\n ...state,\r\n update: updatedArray,\r\n };\r\n }\r\n case ACTIONS.UPDATE_TRAINEE_DUE_DATE: {\r\n const traineeItems = state.data?.items.map(trainee => {\r\n let dueDate = trainee.dueDate\r\n\r\n if (action.trainees.includes(trainee.id)) {\r\n dueDate = action.dueDate ?? undefined\r\n }\r\n\r\n return {\r\n ...trainee,\r\n dueDate\r\n }\r\n })\r\n \r\n return {\r\n ...state,\r\n data: state.data ? { ...state.data, items: traineeItems ?? state.data?.items } : state.data\r\n }\r\n }\r\n case ACTIONS.UPDATE_SELECTED_INVITATION_TRAINEES_STATE: {\r\n const selectedUserIds = [...(state.selectedUsers || [])];\r\n\r\n const selectedUserIndex = selectedUserIds.findIndex(\r\n (item: number) => item === action.userId\r\n );\r\n if (selectedUserIndex > -1) {\r\n selectedUserIds.splice(selectedUserIndex, 1);\r\n } else {\r\n selectedUserIds.push(action.userId);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedUsers: selectedUserIds,\r\n };\r\n }\r\n case ACTIONS.UPDATE_ALL_SELECTED_INVITATION_TRAINEES_STATE:\r\n return {\r\n ...state,\r\n selectedUsers:\r\n action.checked || action.partial ? action.userIds : [],\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const assignUsersReducer = compose<\r\n Reducer<AssignUsersState, AssignUsersAction>\r\n>(withLabelsReducer({ reducerName: 'assignUsers' }))(assignUsersBaseReducer);\r\n\r\nexport const progressReducer = combineReducers({\r\n updatedProgress: updatedProgressReducer,\r\n enrollments: practisSetsEnrollmentReducer,\r\n report: practisSetReportsReducer,\r\n});\r\n","import { Reducer } from 'redux';\nimport {\n ACTIONS,\n voiceGenerationClear,\n voiceGenerationFailure,\n voiceGenerationStart,\n voiceGenerationSuccess,\n} from './actions';\nimport { VoiceGenerationState } from './states';\nimport { appendItem, modifyArrayItem, removeItem } from '../../../tools/ramda';\n\nconst initialState: VoiceGenerationState = {};\n\nexport type Action =\n | ReturnType<typeof voiceGenerationStart>\n | ReturnType<typeof voiceGenerationSuccess>\n | ReturnType<typeof voiceGenerationClear>\n | ReturnType<typeof voiceGenerationFailure>;\n\nexport const voiceGenerationReducer: Reducer<VoiceGenerationState, Action> = (\n state = initialState,\n action: Action\n): VoiceGenerationState => {\n switch (action.type) {\n case ACTIONS.VOICE_GENERATION_START: {\n const newData = appendItem(\n state[action.feature] ? state[action.feature].data : [],\n { id: action.itemId }\n );\n return {\n ...state,\n [action.feature]: {\n ...state[action.feature],\n generating: true,\n data: newData,\n },\n };\n }\n case ACTIONS.VOICE_GENERATION_SUCCESS: {\n return {\n ...state,\n [action.feature]: {\n ...state[action.feature],\n data: modifyArrayItem(\n state[action.feature].data,\n action.itemId,\n 'voice',\n action.voice\n ),\n },\n };\n }\n case ACTIONS.VOICE_GENERATION_FAILURE: {\n const newData = removeItem(state[action.feature].data, {\n id: action.itemId,\n });\n return {\n ...state,\n [action.feature]: {\n ...state[action.feature],\n generating: newData.length > 0,\n error: action.error,\n data: newData,\n },\n };\n }\n case ACTIONS.VOICE_GENERATION_CLEAR:\n const newData = removeItem(state[action.feature].data, {\n id: action.itemId,\n });\n return {\n ...state,\n [action.feature]: {\n ...state[action.feature],\n generating: newData.length > 0,\n data: newData,\n },\n };\n default:\n return state;\n }\n};\n","import {\n ACTIONS,\n createChallengeScriptLineAction,\n deleteChallengeScriptLineAction,\n fetchChallengeFailure,\n fetchChallengeStart,\n fetchChallengeSuccess,\n modifyChallengeAction,\n modifyChallengeScriptLineAction,\n resetChallengeAction,\n resetChallengeLogoAction,\n restoreChallengeFromTempAction,\n storeChallengeTempCopyAction,\n updateChallengeScriptLineAction,\n uploadChallengeAudioFailure,\n uploadChallengeAudioStart,\n uploadChallengeAudioSuccess,\n} from './actions';\nimport {\n ACTIONS as LIBRARY_ACTIONS,\n updateLibraryChallengeSuccess,\n} from '../../library/store/actions';\nimport { ChallengeState } from './states';\nimport { ScriptLine } from '../../../constants/interfaces/ScriptLine';\nimport { ChallengeStatuses } from '../../../constants/interfaces/Challenge';\nimport { DEFAULT_CHALLENGE_TRY_LIMIT } from '../constants';\n\nexport const initialChallengeState: ChallengeState = {\n data: {\n title: '',\n description: '',\n instructions: '',\n status: ChallengeStatuses.DRAFT,\n script: {\n totalDuration: null,\n scenarioId: null,\n companyId: null,\n lines: [],\n },\n tryLimit: DEFAULT_CHALLENGE_TRY_LIMIT,\n },\n loading: false,\n case: 'init',\n error: '',\n};\n\ntype ChallengeActions =\n | ReturnType<typeof fetchChallengeStart>\n | ReturnType<typeof fetchChallengeSuccess>\n | ReturnType<typeof fetchChallengeFailure>\n | ReturnType<typeof modifyChallengeAction>\n | ReturnType<typeof createChallengeScriptLineAction>\n | ReturnType<typeof updateChallengeScriptLineAction>\n | ReturnType<typeof modifyChallengeScriptLineAction>\n | ReturnType<typeof deleteChallengeScriptLineAction>\n | ReturnType<typeof uploadChallengeAudioStart>\n | ReturnType<typeof uploadChallengeAudioSuccess>\n | ReturnType<typeof uploadChallengeAudioFailure>\n | ReturnType<typeof resetChallengeAction>\n | ReturnType<typeof resetChallengeLogoAction>\n | ReturnType<typeof updateLibraryChallengeSuccess>\n | ReturnType<typeof storeChallengeTempCopyAction>\n | ReturnType<typeof restoreChallengeFromTempAction>;\n\nexport const challengeReducer = (\n state = initialChallengeState,\n action: ChallengeActions\n): ChallengeState => {\n switch (action.type) {\n case ACTIONS.FETCH_CHALLENGE_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.FETCH_CHALLENGE_SUCCESS:\n return {\n data: {\n ...state.data,\n ...action.data,\n },\n loading: false,\n case: 'loaded',\n error: '',\n };\n case ACTIONS.FETCH_CHALLENGE_FAILURE:\n return {\n ...state,\n loading: false,\n case: 'error',\n error: action.error,\n };\n case ACTIONS.UPLOAD_CHALLENGE_AUDIO_START:\n return {\n ...state,\n };\n case ACTIONS.UPLOAD_CHALLENGE_AUDIO_SUCCESS:\n const updatedLines = state.data.script!.lines.map(\n (line: ScriptLine) => {\n if (line.id === action.data.scriptLineId) {\n const newLine = { ...line };\n newLine.audioUrl = action.data.response.url;\n newLine.audioId = action.data.response.id;\n newLine.duration =\n action.data.response.metadata.format.duration;\n return newLine;\n } else {\n return line;\n }\n }\n );\n return {\n ...state,\n data: {\n ...state.data,\n script: {\n ...state.data.script,\n totalDuration: updatedLines\n .map((lines: ScriptLine) =>\n lines.duration ? lines.duration : 0\n )\n .reduce((a, b) => a + b, 0),\n lines: updatedLines,\n },\n },\n case: 'modified',\n };\n case ACTIONS.UPLOAD_CHALLENGE_AUDIO_FAILURE:\n return {\n ...state,\n error: action.error,\n case: 'error',\n };\n case ACTIONS.CREATE_CHALLENGES_SCRIPT_LINE:\n const createdScriptLine = { ...state.data.script };\n createdScriptLine.lines.push(action.data);\n return {\n ...state,\n data: {\n ...state.data,\n script: {\n ...createdScriptLine,\n },\n },\n case: action.silent ? state.case : 'modified',\n error: '',\n };\n case ACTIONS.UPDATE_CHALLENGES_SCRIPT_LINE:\n return {\n ...state,\n data: {\n ...state.data,\n script: {\n ...state.data.script,\n lines: action.data.map(\n (line: ScriptLine, index: number) => {\n return { ...line, position: index };\n }\n ),\n },\n },\n case: 'modified',\n error: '',\n };\n case ACTIONS.MODIFY_CHALLENGES_SCRIPT_LINE:\n return {\n ...state,\n case: 'modified',\n data: {\n ...state.data,\n script: {\n ...state.data.script,\n lines: state.data.script.lines.map(\n (line: ScriptLine) => {\n if (line.id === action.lineId) {\n return {\n ...line,\n [action.field]: action.data,\n };\n } else {\n return line;\n }\n }\n ),\n },\n },\n };\n case ACTIONS.DELETE_CHALLENGES_SCRIPT_LINE:\n const newScriptLines = [...state.data.script.lines];\n const newScriptLinesArr = [\n ...newScriptLines.filter(\n (line: ScriptLine) => line.id !== action.data\n ),\n ];\n const newDurations = newScriptLinesArr\n .filter((line: ScriptLine) => line.audioUrl)\n .map((line: ScriptLine) => line.duration);\n return {\n ...state,\n data: {\n ...state.data,\n script: {\n ...state.data.script,\n totalDuration:\n newDurations.length > 0\n ? newDurations.reduce((a, b) => a + b)\n : 0,\n lines: newScriptLinesArr,\n },\n },\n case: 'modified',\n error: '',\n };\n case ACTIONS.MODIFY_CHALLENGE:\n const newChallenge: any = { ...state.data };\n newChallenge[action.field] = action.data;\n return {\n ...state,\n data: {\n ...newChallenge,\n },\n case: action.silent ? state.case : 'modified',\n };\n case ACTIONS.STORE_CHALLENGE_TEMP_COPY: {\n return {\n ...state,\n temp_data: JSON.parse(JSON.stringify(state.data)),\n };\n }\n case ACTIONS.RESTORE_CHALLENGE_FROM_TEMP: {\n return {\n ...state,\n data: JSON.parse(JSON.stringify(state.temp_data)),\n case: 'init',\n };\n }\n case ACTIONS.RESET_CHALLENGE: {\n return {\n ...initialChallengeState,\n data: {\n ...initialChallengeState.data,\n script: {\n ...initialChallengeState.data.script,\n lines: [],\n },\n },\n };\n }\n case LIBRARY_ACTIONS.UPDATE_LIBRARY_CHALLENGES_SUCCESS: {\n return {\n ...state,\n case: 'updated',\n };\n }\n default:\n return state;\n }\n};\n","import { compose, Reducer } from 'redux';\nimport {\n AccuracyScoreState,\n SubmissionPaginationState,\n SubmissionDetailsState,\n SubmissionsState,\n UpdatedSubmissionsState,\n} from './states';\nimport {\n ACTIONS,\n checkAllSubmissions,\n checkSingleSubmission,\n getSubmissionDetailsFailure,\n getSubmissionDetailsStart,\n getSubmissionDetailsSuccess,\n getSubmissionReviewSuccess,\n modifyScore,\n searchChallengeSubmissionsFailure,\n searchChallengeSubmissionsStart,\n searchChallengeSubmissionsSuccess,\n searchAccuracyScoreStart,\n searchAccuracyScoreFailure,\n searchAccuracyScoreSuccess,\n updateChallengeSubmissionFailure,\n updateChallengeSubmissionStart,\n updateChallengeSubmissionSuccess,\n updateSubmissionDeleteLabelSuccess,\n checkAllAccuracyScores,\n checkSingleAccuracyScore,\n searchSubmissionPaginationStart,\n searchSubmissionPaginationSuccess,\n searchSubmissionPaginationFailure,\n} from './actions';\nimport { SubmissionV2 } from '../../../constants/interfaces/Reviews';\nimport {\n withLabelsInitialState,\n withLabelsReducer,\n} from '../../portableLabels/store/hors/withLabels';\nimport {\n withTeamsInitialState,\n withTeamsReducer,\n} from '../../portableTeams/store/hors/withTeams';\nimport { withScenariosInitialState, withScenariosReducer } from '../../portableScenarios/store/hors/withTeams';\n\nconst initialSubmissionsState: SubmissionsState = withLabelsInitialState(\n withTeamsInitialState(\n {\n checked: [],\n },\n 'submissions'\n ),\n 'submissions',\n);\n\nconst initialAccuracyScoreState: AccuracyScoreState = withLabelsInitialState(\n withTeamsInitialState(\n withScenariosInitialState(\n {\n checked: [],\n },\n 'submissions'\n ),\n 'submissions'\n ),\n 'submissions'\n);\n\n\ntype SubmissionsAction =\n | ReturnType<typeof searchChallengeSubmissionsStart>\n | ReturnType<typeof searchChallengeSubmissionsSuccess>\n | ReturnType<typeof searchChallengeSubmissionsFailure>\n | ReturnType<typeof checkAllSubmissions>\n | ReturnType<typeof checkSingleSubmission>\n | ReturnType<typeof updateSubmissionDeleteLabelSuccess>;\n\nconst submissionsBaseReducer: Reducer<SubmissionsState, SubmissionsAction> = (\n state = initialSubmissionsState,\n action: SubmissionsAction\n): SubmissionsState => {\n switch (action.type) {\n case ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_SUCCESS:\n const prevItems = state.data?.items;\n return {\n ...state,\n data:\n !prevItems\n ? action.submissions\n : {\n ...action.submissions,\n items: action.submissions.items,\n },\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_CHALLENGE_SUBMISSIONS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.CHECK_SINGLE_SUBMISSION: {\n const selectedIds = [...state.checked];\n\n const selectedIdIndex = selectedIds.findIndex(\n (item: number) => item === action.id\n );\n if (selectedIdIndex > -1) {\n selectedIds.splice(selectedIdIndex, 1);\n } else {\n selectedIds.push(action.id);\n }\n\n return {\n ...state,\n checked: selectedIds,\n };\n }\n case ACTIONS.CHECK_ALL_SUBMISSIONS:\n return {\n ...state,\n checked:\n action.checked || action.partial ? action.submissionId : [],\n };\n case ACTIONS.UPDATE_SUBMISSION_DELETE_LABEL_SUCCESS:\n if (state.data) {\n return {\n ...state,\n data: {\n ...state.data,\n items: state.data.items.map((submission: SubmissionV2) =>\n submission.id === action.id\n ? {\n ...submission,\n userLabels: submission.userLabels?.filter(\n labelId => labelId !== action.labelId\n )\n }\n : submission\n ),\n },\n };\n } else {\n return state;\n }\n default:\n return state;\n }\n};\n\nexport const submissionsReducer = compose<Reducer<SubmissionsState, any>>(\n withLabelsReducer({ reducerName: 'submissions' }),\n withTeamsReducer({ reducerName: 'submissions' })\n)(submissionsBaseReducer);\n\nexport type UpdatedSubmissionsAction =\n | ReturnType<typeof updateChallengeSubmissionStart>\n | ReturnType<typeof updateChallengeSubmissionSuccess>\n | ReturnType<typeof updateChallengeSubmissionFailure>;\n\nexport const updatedSubmissionsReducer: Reducer<\n UpdatedSubmissionsState,\n UpdatedSubmissionsAction\n> = (state = {}, action: UpdatedSubmissionsAction): UpdatedSubmissionsState => {\n switch (action.type) {\n case ACTIONS.UPDATE_CHALLENGE_SUBMISSION_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.UPDATE_CHALLENGE_SUBMISSION_SUCCESS:\n return {\n ...state,\n data: action.submissionIds,\n updateType: action.updateType,\n loading: false,\n };\n case ACTIONS.UPDATE_CHALLENGE_SUBMISSION_FAILURE:\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n\nexport type SubmissionDetailsAction =\n | ReturnType<typeof getSubmissionDetailsStart>\n | ReturnType<typeof getSubmissionDetailsSuccess>\n | ReturnType<typeof getSubmissionDetailsFailure>\n | ReturnType<typeof getSubmissionReviewSuccess>\n | ReturnType<typeof modifyScore>;\n\nexport const submissionDetailsReducer: Reducer<\n SubmissionDetailsState,\n SubmissionDetailsAction\n> = (state = {}, action: SubmissionDetailsAction): SubmissionDetailsState => {\n switch (action.type) {\n case ACTIONS.GET_SUBMISSION_DETAILS_START:\n return {\n ...state,\n loading: true,\n error: ''\n };\n case ACTIONS.GET_SUBMISSION_DETAILS_SUCCESS:\n return {\n ...state,\n details: {\n ...action.submission,\n },\n review: {\n ...action.review\n },\n loading: false,\n error: ''\n };\n case ACTIONS.GET_SUBMISSION_DETAILS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.GET_SUBMISSION_REVIEW_SUCCESS:\n return {\n ...state,\n details: state.details ? {\n ...state.details,\n reviewedAt: action.review.date\n } : state.details,\n review: {\n ...action.review\n },\n loading: false,\n error: ''\n };\n case ACTIONS.MODIFY_SCORE:\n return {\n ...state,\n review: {\n ...state.review,\n [action.field]: action.value,\n },\n };\n default:\n return state;\n }\n};\n\nexport type AccuracyScoresAction =\n | ReturnType<typeof checkAllAccuracyScores>\n | ReturnType<typeof checkSingleAccuracyScore>\n | ReturnType<typeof searchAccuracyScoreStart>\n | ReturnType<typeof searchAccuracyScoreSuccess>\n | ReturnType<typeof searchAccuracyScoreFailure>;\n\n\n// Accuracy Scores\nconst accuracyScoresBaseReducer: Reducer<AccuracyScoreState, AccuracyScoresAction> = (\n state = initialAccuracyScoreState,\n action: AccuracyScoresAction\n): any => {\n switch (action.type) {\n case ACTIONS.SEARCH_ACCURACY_SCORE_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_ACCURACY_SCORE_SUCCESS:\n const prevItems = state.data?.items;\n \n return {\n ...state,\n data: !prevItems\n ? action.accuracyScores\n : {\n ...action.accuracyScores,\n items: action.accuracyScores.items,\n },\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_ACCURACY_SCORE_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.CHECK_SINGLE_ACCURACY_SCORE: {\n \n const selectedIds = [...state.checked];\n\n const selectedIdIndex = selectedIds.findIndex(\n (item: number) => item === action.id\n );\n if (selectedIdIndex > -1) {\n selectedIds.splice(selectedIdIndex, 1);\n } else {\n selectedIds.push(action.id);\n }\n\n return {\n ...state,\n checked: selectedIds,\n };\n }\n case ACTIONS.CHECK_ALL_ACCURACY_SCORES:\n return {\n ...state,\n checked:\n action.checked || action.partial ? action.submissionId : [],\n };\n default:\n return state;\n }\n};\n\nexport const accuracyScoreReducer = compose<Reducer<any, any>>(\n withLabelsReducer({ reducerName: 'accuracyscore' }),\n withTeamsReducer({ reducerName: 'accuracyscore' }),\n withScenariosReducer({reducerName: 'accuracyscore'})\n\n)(accuracyScoresBaseReducer);\n\nexport type SubmissionPaginationAction =\n | ReturnType<typeof searchSubmissionPaginationStart>\n | ReturnType<typeof searchSubmissionPaginationSuccess>\n | ReturnType<typeof searchSubmissionPaginationFailure>;\n\nexport const submissionPaginationReducer: Reducer<\n SubmissionPaginationState,\n SubmissionPaginationAction\n> = (state = {}, action: SubmissionPaginationAction): SubmissionPaginationState => {\n switch (action.type) {\n case ACTIONS.SEARCH_SUBMISSION_PAGINATION_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.SEARCH_SUBMISSION_PAGINATION_SUCCESS:\n return {\n ...state,\n submissionIds: action.submissionIds,\n totalCount: action.totalCount,\n loading: false,\n };\n case ACTIONS.SEARCH_SUBMISSION_PAGINATION_FAILURE:\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};","import { LabelsConfigState, LabelsState, UpdatedLabelsState } from './states';\nimport { Reducer } from 'redux';\nimport {\n ACTIONS,\n closeLabelCreationPanelAction,\n openLabelCreationPanelAction,\n searchLabelsFailure,\n searchLabelsStart,\n searchLabelsSuccess,\n setEditingLabelAction,\n setLabelsSearchTerm,\n collapseAllLabelsAction,\n expandAllLabelsAction,\n toggleCollapseLabelFieldAction,\n toggleCollapseAssignLabelFieldAction,\n updateLabelFailure,\n updateLabelStart,\n updateLabelSuccess,\n modifyLabelNameAction,\n selectLabelFilterAction,\n saveLabelFiltersStart,\n saveLabelFiltersSuccess,\n saveLabelFiltersFailure,\n setLabelFilterAction,\n clearLabelFilterAction,\n fetchFullLabelsListStart,\n fetchFullLabelsListSuccess,\n fetchFullLabelsListFailure,\n expandLabelFieldByIdAction,\n expandMultipleLabelsAction,\n setAssignLabelsAction,\n clearAssignLabelsAction,\n collapseAllTableLabelsAction,\n setPreviouslyAssignedLabels,\n} from './actions';\nimport { Label } from '../../../constants/interfaces/Label';\nimport {\n appendIfEmpty,\n toggleItemInArray,\n} from '../../../helpers/functions/array-helpers';\n\nconst initialLabelsState: LabelsState = {\n open: false,\n loading: true,\n saveLoading: false,\n collapseLabels: [],\n assignedLabels: [],\n collapseAssignLabels: [],\n selected: [],\n selectedModified: false,\n previouslyAssignedLabels: [],\n};\n\ntype LabelsAction =\n | ReturnType<typeof openLabelCreationPanelAction>\n | ReturnType<typeof closeLabelCreationPanelAction>\n | ReturnType<typeof toggleCollapseLabelFieldAction>\n | ReturnType<typeof toggleCollapseAssignLabelFieldAction>\n | ReturnType<typeof expandLabelFieldByIdAction>\n | ReturnType<typeof collapseAllLabelsAction>\n | ReturnType<typeof collapseAllTableLabelsAction>\n | ReturnType<typeof expandAllLabelsAction>\n | ReturnType<typeof expandMultipleLabelsAction>\n | ReturnType<typeof modifyLabelNameAction>\n | ReturnType<typeof searchLabelsStart>\n | ReturnType<typeof searchLabelsSuccess>\n | ReturnType<typeof searchLabelsFailure>\n | ReturnType<typeof fetchFullLabelsListStart>\n | ReturnType<typeof fetchFullLabelsListSuccess>\n | ReturnType<typeof fetchFullLabelsListFailure>\n | ReturnType<typeof selectLabelFilterAction>\n | ReturnType<typeof setLabelFilterAction>\n | ReturnType<typeof clearLabelFilterAction>\n | ReturnType<typeof setAssignLabelsAction>\n | ReturnType<typeof clearAssignLabelsAction>\n | ReturnType<typeof saveLabelFiltersStart>\n | ReturnType<typeof saveLabelFiltersSuccess>\n | ReturnType<typeof saveLabelFiltersFailure>\n | ReturnType<typeof setPreviouslyAssignedLabels>;\n\nexport const labelsReducer: Reducer<LabelsState, LabelsAction> = (\n state: LabelsState = initialLabelsState,\n action: LabelsAction\n): LabelsState => {\n switch (action.type) {\n case ACTIONS.OPEN_LABEL_CREATION_PANEL:\n return {\n ...state,\n open: true,\n };\n case ACTIONS.CLOSE_LABEL_CREATION_PANEL:\n return {\n ...state,\n open: false,\n };\n case ACTIONS.SEARCH_LABELS_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.SEARCH_LABELS_SUCCESS: {\n const labelsData = {\n ...action.data,\n items: action.data.items,\n };\n return {\n ...state,\n loading: false,\n searchResults: action.searchTerm\n ? action.data.items.map((label: Label) => label.id)\n : [],\n data: labelsData,\n };\n }\n case ACTIONS.SEARCH_LABELS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.FETCH_FULL_LABELS_LIST_START:\n return {\n ...state,\n };\n case ACTIONS.FETCH_FULL_LABELS_LIST_SUCCESS: {\n const labelsData = {\n ...action.data,\n items: action.data.items,\n };\n return {\n ...state,\n fullList: labelsData,\n };\n }\n case ACTIONS.FETCH_FULL_LABELS_LIST_FAILURE:\n return {\n ...state,\n error: action.error,\n };\n case ACTIONS.TOGGLE_COLLAPSE_LABEL_FIELD: {\n let newLabels = toggleItemInArray(\n state.collapseLabels,\n action.labelId\n );\n return {\n ...state,\n collapseLabels: newLabels,\n };\n }\n case ACTIONS.TOGGLE_COLLAPSE_ASSIGN_LABEL_FIELD: {\n let newLabels = toggleItemInArray(\n state.collapseAssignLabels,\n action.labelId\n );\n return {\n ...state,\n collapseAssignLabels: newLabels,\n };\n }\n case ACTIONS.EXPAND_LABEL_FIELD_BY_ID: {\n let newLabels = appendIfEmpty(state.collapseLabels, action.labelId);\n\n return {\n ...state,\n collapseLabels: newLabels,\n };\n }\n case ACTIONS.SELECT_LABEL_FILTER: {\n let selectedLabels = toggleItemInArray(\n state.selected,\n action.labelId\n );\n\n return {\n ...state,\n selected: selectedLabels,\n selectedModified: true,\n };\n }\n case ACTIONS.CLEAR_LABEL_FILTERS: {\n return {\n ...state,\n selected: [],\n selectedModified: true,\n };\n }\n case ACTIONS.SET_LABEL_FILTERS: {\n return {\n ...state,\n selected: action.labels,\n };\n }\n case ACTIONS.CLEAR_ASSIGN_LABELS: {\n return {\n ...state,\n assignedLabels: [],\n };\n }\n case ACTIONS.SET_ASSIGN_LABELS: {\n return {\n ...state,\n assignedLabels: action.labels,\n };\n }\n case ACTIONS.EXPAND_ALL_LABELS: {\n if (!state.data) return state;\n let newLabels = [\n ...state.data.items\n .filter(\n (label: Label) =>\n label.id &&\n label.children &&\n label.children.length > 0\n )\n .map((label: Label) => label.id),\n ];\n\n return {\n ...state,\n collapseLabels: newLabels,\n };\n }\n case ACTIONS.EXPAND_MULTIPLE_LABELS: {\n return {\n ...state,\n collapseLabels: action.labelIds,\n };\n }\n case ACTIONS.COLLAPSE_ALL_LABELS: {\n return {\n ...state,\n collapseLabels: [],\n };\n }\n case ACTIONS.COLLAPSE_ALL_TABLE_LABELS: {\n return {\n ...state,\n collapseAssignLabels: [],\n };\n }\n case ACTIONS.MODIFY_LABEL_NAME: {\n if (!state.data) return state;\n return {\n ...state,\n collapseLabels: [],\n };\n }\n case ACTIONS.SAVE_LABEL_FILTERS_START: {\n return {\n ...state,\n saveLoading: true,\n };\n }\n case ACTIONS.SAVE_LABEL_FILTERS_SUCCESS: {\n return {\n ...state,\n saveLoading: false,\n selectedModified: false,\n };\n }\n case ACTIONS.SAVE_LABEL_FILTERS_FAILURE: {\n return {\n ...state,\n saveLoading: false,\n error: action.error,\n };\n }\n case ACTIONS.SET_PREVIOUSLY_ASSIGNED_LABELS: {\n return {\n ...state,\n previouslyAssignedLabels: action.labels,\n };\n }\n default:\n return state;\n }\n};\nconst initialLabelsConfigState: LabelsConfigState = {\n searchTerm: '',\n};\ntype LabelsConfigAction =\n | ReturnType<typeof setLabelsSearchTerm>\n | ReturnType<typeof setEditingLabelAction>;\n\nexport const labelsConfigReducer: Reducer<\n LabelsConfigState,\n LabelsConfigAction\n> = (\n state: LabelsConfigState = initialLabelsConfigState,\n action: LabelsConfigAction\n): LabelsConfigState => {\n switch (action.type) {\n case ACTIONS.SET_LABELS_SEARCH_TERM:\n return {\n ...state,\n searchTerm: action.value,\n };\n case ACTIONS.SET_EDITING_LABEL:\n return {\n ...state,\n editingLabels: {\n id: action.configs && action.configs.id,\n mode: action.configs && action.configs.mode,\n },\n };\n default:\n return state;\n }\n};\n\nconst initialUpdatedLabelsState: UpdatedLabelsState = {};\ntype UpdatedLabelsAction =\n | ReturnType<typeof updateLabelStart>\n | ReturnType<typeof updateLabelSuccess>\n | ReturnType<typeof updateLabelFailure>;\n\nexport const updatedLabelsReducer: Reducer<\n UpdatedLabelsState,\n UpdatedLabelsAction\n> = (\n state: UpdatedLabelsState = initialUpdatedLabelsState,\n action: UpdatedLabelsAction\n): UpdatedLabelsState => {\n switch (action.type) {\n case ACTIONS.UPDATE_LABEL_START:\n return {\n ...state,\n };\n case ACTIONS.UPDATE_LABEL_SUCCESS:\n return {\n ...state,\n data: action.updatedLabel,\n updateType: action.updateType,\n };\n case ACTIONS.UPDATE_LABEL_FAILURE:\n return {\n ...state,\n };\n default:\n return state;\n }\n};\n","import { SET_TOKEN } from './actions';\n\nexport interface AuthInterface {\n token: string;\n}\n\nconst initialState: any = {\n token: '',\n};\n\nexport const authReducer = (state = initialState, action: any) => {\n switch (action.type) {\n case SET_TOKEN:\n return {\n ...state,\n token: action.token,\n };\n default:\n return state;\n }\n};\n","import { TelepromterState } from './state';\nimport { ScenarioStatuses } from '../../../constants/interfaces/Scenario';\nimport {\n ACTIONS,\n addGeneratedScriptLineAction,\n fetchTelepromterScenarioFailure,\n fetchTelepromterScenarioStart,\n fetchTelepromterScenarioSuccess,\n resetTelepromterAction,\n setRecordedVideoAction,\n} from './actions';\n\nexport const initialTelepromterState: TelepromterState = {\n scenario: {\n title: '',\n description: '',\n instructions: '',\n status: ScenarioStatuses.DRAFT,\n script: {\n totalDuration: null,\n scenarioId: null,\n companyId: null,\n lines: [],\n },\n },\n generatedLines: [],\n loading: true,\n error: '',\n};\n\ntype TelepromterActions =\n | ReturnType<typeof fetchTelepromterScenarioStart>\n | ReturnType<typeof fetchTelepromterScenarioSuccess>\n | ReturnType<typeof fetchTelepromterScenarioFailure>\n | ReturnType<typeof addGeneratedScriptLineAction>\n | ReturnType<typeof setRecordedVideoAction>\n | ReturnType<typeof resetTelepromterAction>;\n\nexport const telepromterReducer = (\n state = initialTelepromterState,\n action: TelepromterActions\n): TelepromterState => {\n switch (action.type) {\n case ACTIONS.FETCH_TELEPROMTER_SCENARIO_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.FETCH_TELEPROMTER_SCENARIO_SUCCESS:\n return {\n scenario: {\n ...state.scenario,\n ...action.data,\n },\n generatedLines: [],\n loading: false,\n error: '',\n };\n case ACTIONS.FETCH_TELEPROMTER_SCENARIO_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.ADD_GENERATED_SCRIPT_LINE:\n const generatedLines = [...state.generatedLines];\n generatedLines.push(action.scriptLine);\n return {\n ...state,\n generatedLines: generatedLines,\n };\n case ACTIONS.SET_RECORDED_VIDEO:\n return {\n ...state,\n videoBlob: action.videoBlob,\n };\n case ACTIONS.RESET_TELEPROMTER:\n return {\n ...state,\n generatedLines: [],\n videoBlob: undefined,\n };\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport { AiLogsState } from './states';\nimport { ACTIONS, AiLogsActions } from './actions';\n\nexport const initialAiLogsState: AiLogsState = {\n data: undefined,\n error: null,\n loading: false,\n loadingFlag: false,\n};\n\nexport const aiLogsReducer: Reducer<AiLogsState, AiLogsActions> = (\n state = initialAiLogsState,\n action\n) => {\n switch (action.type) {\n case ACTIONS.SEARCH_AI_LOGS_START:\n return {\n ...state,\n loading: true,\n error: null,\n };\n case ACTIONS.SEARCH_AI_LOGS_SUCCESS:\n const prevItems = state.data && state.data.items;\n return {\n ...state,\n data:\n !prevItems\n ? action.aiLogs\n : {\n ...action.aiLogs,\n items: action.aiLogs.items,\n \n },\n loading: false,\n error: null,\n };\n case ACTIONS.SEARCH_AI_LOGS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.SEARCH_AI_LOGS_DISPOSE:\n return {\n ...state,\n data: undefined,\n loading: false,\n error: null,\n };\n case ACTIONS.UPDATE_AI_LOGS_FLAG_START:\n return {\n ...state,\n loadingFlag: true,\n };\n case ACTIONS.UPDATE_AI_LOGS_FLAG_FAILURE:\n return {\n ...state,\n loadingFlag: false,\n error: action.error,\n };\n case ACTIONS.ADD_AI_LOGS_FLAG_SUCCESS: {\n const { submissionId, flagId } = action;\n \n return state.data?.items.length\n ? {\n ...state,\n data: {\n ...state.data,\n items: state.data.items.map(item =>\n item.id === submissionId\n ? {\n ...item,\n flagCompanyId: flagId\n }\n : item\n ),\n },\n loadingFlag: false,\n }\n : {\n ...state,\n loadingFlag: false,\n };\n }\n case ACTIONS.DELETE_AI_LOGS_FLAG_SUCCESS: {\n const { submissionId } = action;\n \n return state.data?.items.length\n ? {\n ...state,\n data: {\n ...state.data,\n items: state.data.items.map(item =>\n item.id === submissionId\n ? {\n ...item,\n flagCompanyId: undefined\n }\n : item\n ),\n },\n loadingFlag: false,\n }\n : {\n ...state,\n loadingFlag: false,\n };\n }\n default:\n return state;\n }\n};\n","import { compose, Reducer } from 'redux';\nimport * as EmailValidator from 'email-validator';\n\nimport { UpdatedDraftsState } from '../../../../features/users/store/states';\nimport {\n ACTIONS,\n modifyDraftUsersAction,\n searchDraftUsersFailure,\n searchDraftUsersStart,\n searchDraftUsersSuccess,\n updateDraftUsersStart,\n updateDraftUsersSuccess,\n updateDraftUsersFailure,\n resetDraftsPageAction,\n modifyDraftUsersWithoutValidationAction,\n} from './actions';\nimport { DraftEditBaseState, DraftEditState } from './states';\nimport {\n withLabelsInitialState,\n withLabelsReducer,\n} from '../../../../features/portableLabels/store/hors/withLabels';\nimport {\n withPractisSetsInitialState,\n withPractisSetsReducer,\n} from '../../../../features/portablePractisSets/store/hors/withPractisSets';\nimport {\n withTeamsInitialState,\n withTeamsReducer,\n} from '../../../../features/portableTeams/store/hors/withTeams';\n\nconst initialDraftEditState = withLabelsInitialState<DraftEditBaseState>(\n withTeamsInitialState(\n withPractisSetsInitialState(\n {\n loading: false,\n },\n 'draftEdit'\n ),\n 'draftEdit'\n ),\n 'draftEdit'\n);\n\nexport type draftEditAction =\n | ReturnType<typeof searchDraftUsersStart>\n | ReturnType<typeof searchDraftUsersSuccess>\n | ReturnType<typeof searchDraftUsersFailure>\n | ReturnType<typeof modifyDraftUsersAction>\n | ReturnType<typeof modifyDraftUsersWithoutValidationAction>\n | ReturnType<typeof updateDraftUsersStart>\n | ReturnType<typeof updateDraftUsersSuccess>\n | ReturnType<typeof updateDraftUsersFailure>\n | ReturnType<typeof resetDraftsPageAction>;\n\nexport const draftEditBaseReducer: Reducer<DraftEditState, draftEditAction> = (\n state = initialDraftEditState,\n action\n): DraftEditState => {\n switch (action.type) {\n case ACTIONS.SEARCH_DRAFT_USERS_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.SEARCH_DRAFT_USERS_SUCCESS:\n const updatedDataItems =\n action.data && action.data.items.length\n ? action.data.items.map((item, index) => {\n const isEmailDuplicated =\n !!item.email &&\n index < action.data.items.length - 1 &&\n action.data.items\n .slice(index + 1)\n .filter(user => user.email === item.email)\n .length > 0;\n const isEmailInvalid =\n !!item.email &&\n !EmailValidator.validate(item.email);\n const isFirstNameInvalid = !item.firstName;\n const isLastNameInvalid = !item.firstName;\n const isRoleInvalid = !item.roleId;\n\n return {\n ...item,\n drafted: true,\n isEntryInvalid:\n isEmailDuplicated ||\n isEmailInvalid ||\n isFirstNameInvalid ||\n isLastNameInvalid ||\n isRoleInvalid,\n };\n })\n : [];\n return {\n ...state,\n data: {\n ...action.data,\n items: updatedDataItems,\n },\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_DRAFT_USERS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.UPDATE_DRAFT_USERS_START:\n return {\n ...state,\n loadingUpdate: true,\n };\n case ACTIONS.UPDATE_DRAFT_USERS_SUCCESS:\n return {\n ...state,\n updateData: action.data,\n updateType: action.updateType,\n loadingUpdate: false,\n };\n case ACTIONS.UPDATE_DRAFT_USERS_FAILURE:\n return {\n ...state,\n error: action.error,\n };\n case ACTIONS.MODIFY_DRAFT_USERS: {\n const updatedDataItems =\n action.data && action.data.items.length\n ? action.data.items.map((item, index) => {\n const isEmailDuplicated =\n !!item.email &&\n index < action.data.items.length - 1 &&\n action.data.items\n .slice(index + 1)\n .filter(user => user.email === item.email)\n .length > 0;\n const isEmailInvalid =\n !!item.email &&\n !EmailValidator.validate(item.email);\n const isFirstNameInvalid = !item.firstName;\n const isLastNameInvalid = !item.firstName;\n const isRoleInvalid = !item.roleId;\n\n return {\n ...item,\n drafted: true,\n isEntryInvalid:\n isEmailDuplicated ||\n isEmailInvalid ||\n isFirstNameInvalid ||\n isLastNameInvalid ||\n isRoleInvalid,\n };\n })\n : [];\n return {\n ...state,\n data: {\n ...action.data,\n items: updatedDataItems,\n },\n };\n }\n case ACTIONS.MODIFY_DRAFT_USERS_WITHOUT_VALIDATION: {\n return {\n ...state,\n data: {\n ...action.data,\n items: action.data ? action.data.items : [],\n },\n };\n }\n case ACTIONS.RESET_DRAFTS_PAGE: {\n return {\n ...state,\n loading: false,\n data: undefined,\n };\n }\n default:\n return state;\n }\n};\n\nexport const draftEditReducer = compose<\n Reducer<DraftEditState, draftEditAction>\n>(\n withLabelsReducer({ reducerName: 'draftEdit' }),\n withTeamsReducer({ reducerName: 'draftEdit' }),\n withPractisSetsReducer({ reducerName: 'draftEdit' })\n)(draftEditBaseReducer);\n\nconst initialUpdatedDraftsState: UpdatedDraftsState = {};\n\nexport type updatedDraftsAction = ReturnType<typeof searchDraftUsersStart>;\n\nexport const updatedDraftsReducer: Reducer<\n UpdatedDraftsState,\n updatedDraftsAction\n> = (\n state = initialUpdatedDraftsState,\n action: updatedDraftsAction\n): UpdatedDraftsState => {\n switch (action.type) {\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport { PortableLabelsState, initialState } from './states';\nimport { PortableLabelsActions } from './actions';\n\nconst portableLabelsBaseReducer: Reducer<\n PortableLabelsState,\n PortableLabelsActions\n> = (\n state = initialState,\n action: PortableLabelsActions\n): PortableLabelsState => {\n switch (action.type) {\n case 'searchStartLabels':\n return {\n ...state,\n loading: true,\n };\n case 'searchSuccessLabels':\n return {\n data: action.result,\n loading: false,\n };\n case 'searchFailureLabels':\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n\nexport const portableLabelsReducer = portableLabelsBaseReducer;\n","import { Reducer } from 'redux';\nimport { UserRolesState } from './states';\nimport {\n ACTIONS,\n loadUserRolesFailure,\n loadUserRolesStart,\n loadUserRolesSuccess,\n} from './actions';\n\nconst initialState: UserRolesState = {\n list: [],\n loading: false,\n};\n\nexport type Action =\n | ReturnType<typeof loadUserRolesStart>\n | ReturnType<typeof loadUserRolesSuccess>\n | ReturnType<typeof loadUserRolesFailure>;\n\nexport const userRolesReducer: Reducer<UserRolesState, Action> = (\n state = initialState,\n action: Action\n): UserRolesState => {\n switch (action.type) {\n case ACTIONS.LOAD_USER_ROLES_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.LOAD_USER_ROLES_SUCCESS: {\n return {\n list: action.data,\n loading: false,\n };\n }\n case ACTIONS.LOAD_USER_ROLES_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n default:\n return state;\n }\n};\n","import {\n LibraryChallengesState,\n LibraryPractisSetsState,\n LibraryScenariosState,\n UpdatedLibraryChallengesState,\n UpdatedLibraryPractisSetsState,\n UpdatedLibraryScenariosState,\n} from './states';\nimport { compose, Reducer } from 'redux';\nimport {\n ACTIONS,\n getFullLibraryPractisSetsFailure,\n getFullLibraryPractisSetsStart,\n getFullLibraryPractisSetsSuccess,\n getTotalLibraryChallengesCountFailure,\n getTotalLibraryChallengesCountStart,\n getTotalLibraryChallengesCountSuccess,\n searchLibraryChallengesFailure,\n searchLibraryChallengesStart,\n searchLibraryChallengesSuccess,\n searchLibraryPractisSetsFailure,\n searchLibraryPractisSetsStart,\n searchLibraryPractisSetsSuccess,\n searchLibraryScenariosFailure,\n searchLibraryScenariosStart,\n searchLibraryScenariosSuccess,\n setSearchTermForLibraryPractisSet,\n updateAllChallengesCheckedState,\n updateAllPractisSetsCheckedState,\n updateAllScenarioCheckedState,\n updateAssignedLibraryPractisSet,\n updateChallengeDeleteLabelSuccess,\n updateLibraryChallengeCheckedState,\n updateLibraryChallengeFailure,\n updateLibraryChallengeStart,\n updateLibraryChallengeSuccess,\n updateLibraryPractisSetCheckedState,\n updateLibraryPractisSetFailure,\n updateLibraryPractisSetStart,\n updateLibraryPractisSetSuccess,\n updateLibraryScenarioCheckedState,\n updateLibraryScenarioFailure,\n updateLibraryScenarioStart,\n updateLibraryScenarioSuccess,\n updatePractisSetDeleteLabelSuccess,\n updateScenarioDeleteLabelSuccess,\n updateSeparateAssignedLibraryPractisSet,\n} from './actions';\nimport { Label } from '../../../constants/interfaces/Label';\nimport { PractisSets } from '../../../constants/interfaces/PractisSets';\nimport { Scenario } from '../../../constants/interfaces/Scenario';\nimport { Challenge } from '../../../constants/interfaces/Challenge';\nimport {\n withLabelsInitialState,\n withLabelsReducer,\n} from '../../portableLabels/store/hors/withLabels';\n\nconst initialLibraryPractisSetsState: LibraryPractisSetsState = withLabelsInitialState<\n LibraryPractisSetsState\n>({}, 'libraryPractisSets');\n\nexport type LibraryPractisSetsAction =\n | ReturnType<typeof searchLibraryPractisSetsStart>\n | ReturnType<typeof searchLibraryPractisSetsSuccess>\n | ReturnType<typeof searchLibraryPractisSetsFailure>\n | ReturnType<typeof getFullLibraryPractisSetsStart>\n | ReturnType<typeof getFullLibraryPractisSetsSuccess>\n | ReturnType<typeof getFullLibraryPractisSetsFailure>\n | ReturnType<typeof updateAssignedLibraryPractisSet>\n | ReturnType<typeof updateSeparateAssignedLibraryPractisSet>\n | ReturnType<typeof setSearchTermForLibraryPractisSet>\n | ReturnType<typeof updateAllPractisSetsCheckedState>\n | ReturnType<typeof updateLibraryPractisSetCheckedState>\n | ReturnType<typeof updatePractisSetDeleteLabelSuccess>;\n\nconst libraryPractisSetsBaseReducer: Reducer = (\n state = initialLibraryPractisSetsState,\n action: LibraryPractisSetsAction\n): LibraryPractisSetsState => {\n switch (action.type) {\n case ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_SUCCESS:\n const prevItems = state.data?.items;\n return {\n ...state,\n data:\n !prevItems\n ? action.practisSets\n : {\n ...action.practisSets,\n items: action.practisSets.items,\n \n },\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_PRACTIS_SETS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_SUCCESS:\n return {\n ...state,\n fullList: action.practisSets,\n loading: false,\n error: '',\n };\n case ACTIONS.GET_FULL_LIBRARY_PRACTIS_SETS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.UPDATE_ASSIGNED_LIBRARY_PRACTIS_SET:\n return {\n ...state,\n assignedPractisSets: action.assignedPractisSets,\n };\n case ACTIONS.UPDATE_SEPARATE_ASSIGNED_LIBRARY_PRACTIS_SET:\n return {\n ...state,\n separateAssignedPractisSets: action.assignedPractisSets,\n };\n case ACTIONS.SET_SEARCH_TERM_FOR_LIBRARY_PRACTIS_SET:\n return {\n ...state,\n searchTerm: action.value,\n };\n case ACTIONS.UPDATE_SELECTED_PRACTIS_SET_STATE:\n const selectedIds = [...(state.selectedPractisSets || [])];\n\n const selectedIdIndex = selectedIds.findIndex(\n (item: number) => item === action.id\n );\n if (selectedIdIndex > -1) {\n selectedIds.splice(selectedIdIndex, 1);\n } else {\n selectedIds.push(action.id);\n }\n\n return {\n ...state,\n selectedPractisSets: selectedIds,\n };\n case ACTIONS.UPDATE_ALL_SELECTED_PRACTIS_SETS_STATE:\n return {\n ...state,\n selectedPractisSets:\n action.checked || action.partial\n ? action.selectedPractisSetIds\n : [],\n };\n case ACTIONS.UPDATE_PRACTIS_SET_DELETE_LABEL_SUCCESS:\n return {\n ...state,\n data: {\n items: state.data.items.map((item: PractisSets) =>\n item.id === action.id\n ? {\n ...item,\n labels:\n item.labels &&\n item.labels.filter(\n (label: Label) =>\n label.id !== action.labelId\n ),\n }\n : item\n ),\n },\n };\n default:\n return state;\n }\n};\n\nexport const libraryPractisSetsReducer = compose<\n Reducer<LibraryPractisSetsState, any>\n>(withLabelsReducer({ reducerName: 'libraryPractisSets' }))(\n libraryPractisSetsBaseReducer\n);\n\ntype UpdatedLibraryPractisSetsAction =\n | ReturnType<typeof updateLibraryPractisSetStart>\n | ReturnType<typeof updateLibraryPractisSetSuccess>\n | ReturnType<typeof updateLibraryPractisSetFailure>;\n\nexport const updatedLibraryPractisSetsReducer: Reducer<\n UpdatedLibraryPractisSetsState,\n UpdatedLibraryPractisSetsAction\n> = (\n state = {},\n action: UpdatedLibraryPractisSetsAction\n): UpdatedLibraryPractisSetsState => {\n switch (action.type) {\n case ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_SUCCESS:\n return {\n ...state,\n data: action.updatedPractisSet,\n updateType: action.updateType,\n loading: false,\n };\n case ACTIONS.UPDATE_LIBRARY_PRACTIS_SET_FAILURE:\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n\nconst initialLibraryScenariosState: LibraryScenariosState = withLabelsInitialState<\n LibraryScenariosState\n>({}, 'libraryScenarios');\n\ntype LibraryScenariosAction =\n | ReturnType<typeof searchLibraryScenariosStart>\n | ReturnType<typeof searchLibraryScenariosSuccess>\n | ReturnType<typeof searchLibraryScenariosFailure>\n | ReturnType<typeof updateLibraryScenarioCheckedState>\n | ReturnType<typeof updateAllScenarioCheckedState>\n | ReturnType<typeof updateScenarioDeleteLabelSuccess>;\n\nconst libraryScenariosBaseReducer: Reducer = (\n state = initialLibraryScenariosState,\n action: LibraryScenariosAction\n): LibraryScenariosState => {\n switch (action.type) {\n case ACTIONS.SEARCH_LIBRARY_SCENARIOS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_SCENARIOS_SUCCESS:\n return {\n ...state,\n data: action.scenarios,\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_SCENARIOS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.UPDATE_SELECTED_SCENARIO_STATE:\n const selectedIds = [...(state.selectedScenarios || [])];\n\n const selectedIdIndex = selectedIds.findIndex(\n (item: number) => item === action.id\n );\n if (selectedIdIndex > -1) {\n selectedIds.splice(selectedIdIndex, 1);\n } else {\n selectedIds.push(action.id);\n }\n\n return {\n ...state,\n selectedScenarios: selectedIds,\n };\n case ACTIONS.UPDATE_ALL_SELECTED_SCENARIOS_STATE:\n return {\n ...state,\n selectedScenarios:\n action.checked || action.partial\n ? action.selectedScenarioIds\n : [],\n };\n case ACTIONS.UPDATE_SCENARIOS_DELETE_LABEL_SUCCESS:\n return {\n ...state,\n data: {\n items: state.data.items.map((item: Scenario) =>\n item.id === action.id\n ? {\n ...item,\n labels:\n item.labels &&\n item.labels.filter(\n (label: Label) =>\n label.id !== action.labelId\n ),\n }\n : item\n ),\n },\n };\n default:\n return state;\n }\n};\n\nexport const libraryScenariosReducer = compose<\n Reducer<LibraryScenariosState, any>\n>(withLabelsReducer({ reducerName: 'libraryScenarios' }))(\n libraryScenariosBaseReducer\n);\n\ntype UpdatedLibraryScenariosAction =\n | ReturnType<typeof updateLibraryScenarioStart>\n | ReturnType<typeof updateLibraryScenarioSuccess>\n | ReturnType<typeof updateLibraryScenarioFailure>;\n\nexport const updatedLibraryScenariosReducer: Reducer<\n UpdatedLibraryScenariosState,\n UpdatedLibraryScenariosAction\n> = (\n state = {},\n action: UpdatedLibraryScenariosAction\n): UpdatedLibraryScenariosState => {\n switch (action.type) {\n case ACTIONS.UPDATE_LIBRARY_SCENARIO_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.UPDATE_LIBRARY_SCENARIO_SUCCESS:\n return {\n ...state,\n data: action.updatedScenario,\n updateType: action.updateType,\n loading: false,\n };\n case ACTIONS.UPDATE_LIBRARY_SCENARIO_FAILURE:\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n\nconst initialLibraryChallengesState: LibraryChallengesState = withLabelsInitialState<\n LibraryChallengesState\n>({}, 'libraryChallenges');\n\ntype LibraryChallengesAction =\n | ReturnType<typeof searchLibraryChallengesStart>\n | ReturnType<typeof searchLibraryChallengesSuccess>\n | ReturnType<typeof searchLibraryChallengesFailure>\n | ReturnType<typeof getTotalLibraryChallengesCountStart>\n | ReturnType<typeof getTotalLibraryChallengesCountSuccess>\n | ReturnType<typeof getTotalLibraryChallengesCountFailure>\n | ReturnType<typeof updateLibraryChallengeCheckedState>\n | ReturnType<typeof updateAllChallengesCheckedState>\n | ReturnType<typeof updateChallengeDeleteLabelSuccess>;\n\nconst libraryChallengesBaseReducer: Reducer = (\n state = initialLibraryChallengesState,\n action: LibraryChallengesAction\n): LibraryChallengesState => {\n switch (action.type) {\n case ACTIONS.SEARCH_LIBRARY_CHALLENGES_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_CHALLENGES_SUCCESS:\n return {\n ...state,\n data: action.challenges,\n loading: false,\n error: '',\n };\n case ACTIONS.SEARCH_LIBRARY_CHALLENGES_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_START:\n return {\n ...state,\n };\n case ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_SUCCESS:\n return {\n ...state,\n totalCount: action.challenges.totalCount,\n };\n case ACTIONS.GET_TOTAL_LIBRARY_CHALLENGES_COUNT_FAILURE:\n return {\n ...state,\n error: action.error,\n };\n case ACTIONS.UPDATE_SELECTED_CHALLENGE_STATE:\n const selectedIds = [...(state.selectedChallenges || [])];\n\n const selectedIdIndex = selectedIds.findIndex(\n (item: number) => item === action.id\n );\n if (selectedIdIndex > -1) {\n selectedIds.splice(selectedIdIndex, 1);\n } else {\n selectedIds.push(action.id);\n }\n\n return {\n ...state,\n selectedChallenges: selectedIds,\n };\n case ACTIONS.UPDATE_ALL_SELECTED_CHALLENGES_STATE:\n return {\n ...state,\n selectedChallenges:\n action.checked || action.partial\n ? action.selectedChallengeIds\n : [],\n };\n case ACTIONS.UPDATE_CHALLENGES_DELETE_LABEL_SUCCESS:\n return {\n ...state,\n data: {\n items: state.data.items.map((item: Challenge) =>\n item.id === action.id\n ? {\n ...item,\n labels:\n item.labels &&\n item.labels.filter(\n (label: Label) =>\n label.id !== action.labelId\n ),\n }\n : item\n ),\n },\n };\n default:\n return state;\n }\n};\n\nexport const libraryChallengesReducer = compose<\n Reducer<LibraryChallengesState, any>\n>(withLabelsReducer({ reducerName: 'libraryChallenges' }))(\n libraryChallengesBaseReducer\n);\n\ntype UpdatedLibraryChallengesAction =\n | ReturnType<typeof updateLibraryChallengeStart>\n | ReturnType<typeof updateLibraryChallengeSuccess>\n | ReturnType<typeof updateLibraryChallengeFailure>;\n\nexport const updatedLibraryChallengesReducer: Reducer<\n UpdatedLibraryChallengesState,\n UpdatedLibraryChallengesAction\n> = (\n state = {},\n action: UpdatedLibraryChallengesAction\n): UpdatedLibraryChallengesState => {\n switch (action.type) {\n case ACTIONS.UPDATE_LIBRARY_CHALLENGES_START:\n return {\n ...state,\n loading: true,\n };\n case ACTIONS.UPDATE_LIBRARY_CHALLENGES_SUCCESS:\n return {\n ...state,\n data: action.updatedChallenge,\n updateType: action.updateType,\n loading: false,\n };\n case ACTIONS.UPDATE_LIBRARY_CHALLENGES_FAILURE:\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n","import { combineReducers } from 'redux';\r\nimport userProfileReducer, {\r\n UserProfileState,\r\n} from '../../pages/UserProfile/store/reducers';\r\nimport companyProfileReducer, {\r\n CompanyProfileInterface,\r\n companyVoiceSettingsReducer,\r\n companyAdminsReducer,\r\n companyUserStatsReducer,\r\n} from '../../pages/CompanySettings/store/reducers';\r\nimport {\r\n allUsersReducer,\r\n AllUsersInterface,\r\n userReducer,\r\n invitationsReducer,\r\n updateInvitationsReducer,\r\n userPerformanceReducer,\r\n updatedUserReducer,\r\n updatedUserPractisSetsReducer,\r\n draftsReducer,\r\n updatedDraftsReducer,\r\n userFeaturesReducer,\r\n UserState,\r\n userPreferencesReducer,\r\n} from '../../features/users/store/reducers';\r\nimport { USER_LOGOUT } from '../../pages/Auth/store/actions';\r\nimport {\r\n AllCompaniesInterface,\r\n allCompaniesReducer,\r\n} from '../../features/companies/store/reducers';\r\nimport {\r\n ScenarioInterface,\r\n scenarioReducer,\r\n} from '../../pages/ActionPages/NewScenario/store/reducers';\r\nimport globalReducers, { GlobalReducerInterface } from './globals';\r\nimport {\r\n PractisSetInterface,\r\n practisSetReducer,\r\n} from '../../pages/ActionPages/PractisSets/store/reducers';\r\nimport {\r\n AssignUsersState,\r\n PractisSetsTrainingState,\r\n ProgressState,\r\n UpdateMembersState,\r\n} from '../../features/teams/store/states';\r\nimport {\r\n assignUsersReducer,\r\n progressReducer,\r\n trainerPractisSetsReducer,\r\n updatedMemberReducer,\r\n} from '../../features/teams/store/reducers';\r\nimport { PacingsState } from '../../features/pacings/store/states';\r\nimport { pacingsReducer } from '../../features/pacings/store/reducers';\r\nimport { VoiceGenerationState } from '../../features/textToSpeech/store/states';\r\nimport { voiceGenerationReducer } from '../../features/textToSpeech/store/reducers';\r\nimport {\r\n DraftsState,\r\n InvitationsState,\r\n UpdatedDraftsState,\r\n UpdatedUserPractisSetsState,\r\n UpdateInvitationState,\r\n UpdateUsersState,\r\n UserPerformanceState,\r\n UserFeaturesState,\r\n UserPreferencesState,\r\n} from '../../features/users/store/states';\r\nimport {\r\n AudioInterface,\r\n audioReducer,\r\n} from '../../features/player/store/reducers';\r\nimport { ChallengeState } from '../../features/challenges/store/states';\r\nimport { challengeReducer } from '../../features/challenges/store/reducers';\r\nimport {\r\n AccuracyScoreState,\r\n SubmissionDetailsState,\r\n SubmissionsState,\r\n SubmissionPaginationState,\r\n UpdatedSubmissionsState,\r\n} from '../../features/submissions/store/states';\r\nimport {\r\n accuracyScoreReducer,\r\n submissionPaginationReducer,\r\n submissionDetailsReducer,\r\n submissionsReducer,\r\n updatedSubmissionsReducer,\r\n} from '../../features/submissions/store/reducers';\r\nimport {\r\n CompanyVoiceSettingsState,\r\n CompanyAdminsState,\r\n CompanyUserStatsState,\r\n} from '../../pages/CompanySettings/store/states';\r\nimport {\r\n LabelsConfigState,\r\n LabelsState,\r\n UpdatedLabelsState,\r\n} from '../../features/labels/store/states';\r\nimport {\r\n labelsConfigReducer,\r\n labelsReducer,\r\n updatedLabelsReducer,\r\n} from '../../features/labels/store/reducers';\r\nimport { logsReducer } from '../../features/logs/store/reducers';\r\nimport { LogsState } from '../../features/logs/store/states';\r\nimport { AuthInterface, authReducer } from '../../pages/Auth/store/reducers';\r\nimport { TelepromterState } from '../../features/telepromter/store/state';\r\nimport { telepromterReducer } from '../../features/telepromter/store/reducers';\r\nimport { aiLogsReducer } from '../../features/assessment-logs/store/reducers';\r\nimport { AiLogsState } from '../../features/assessment-logs/store/states';\r\nimport { DraftEditState } from '../../pages/ActionPages/NewUser/store/states';\r\nimport { draftEditReducer } from '../../pages/ActionPages/NewUser/store/reducers';\r\nimport {\r\n allTeamsReducer,\r\n teamEditReducer,\r\n teamMembersReducer,\r\n updatedTeamReducer,\r\n} from '../../features/teams/store/reducers';\r\nimport {\r\n TeamMembersState,\r\n TeamEditState,\r\n TeamsState,\r\n UpdateTeamsState,\r\n} from '../../features/teams/store/states';\r\nimport { portableLabelsReducer } from '../../features/portableLabels/store/reducer';\r\nimport { PortableLabelsState } from '../../features/portableLabels/store/states';\r\nimport { portableTeamsReducer } from '../../features/portableTeams/store/reducer';\r\nimport { PortableTeamsState } from '../../features/portableTeams/store/states';\r\nimport { UserRolesState } from '../../features/roles/store/states';\r\nimport { PortableScenariosState } from '../../features/portableScenarios/store/states';\r\nimport { SocketProgressReducer } from '../../features/socketProgress(api1)/store/reducer';\r\nimport { SocketProgressStateInterface } from '../../features/socketProgress(api1)/store/states';\r\nimport { userRolesReducer } from '../../features/roles/store/reducer';\r\nimport { PortablePractisSetsState } from '../../features/portablePractisSets/store/states';\r\nimport { portablePractisSetsReducer } from '../../features/portablePractisSets/store/reducer';\r\nimport {\r\n LibraryChallengesState,\r\n LibraryPractisSetsState,\r\n LibraryScenariosState,\r\n UpdatedLibraryChallengesState,\r\n UpdatedLibraryPractisSetsState,\r\n UpdatedLibraryScenariosState,\r\n} from '../../features/library/store/states';\r\nimport {\r\n libraryChallengesReducer,\r\n libraryPractisSetsReducer,\r\n libraryScenariosReducer,\r\n updatedLibraryChallengesReducer,\r\n updatedLibraryPractisSetsReducer,\r\n updatedLibraryScenariosReducer,\r\n} from '../../features/library/store/reducers';\r\nimport { InvitersState } from '../../features/inviters/store/states';\r\nimport { invitersReducer } from '../../features/inviters/store/reducers';\r\nimport { portableScenariosReducer } from '../../features/portableScenarios/store/reducer';\r\nimport { SearchStateReducer } from '../../features/searchState/store/reducer';\r\nimport { SearchStateInterface } from '../../features/searchState/store/states';\r\nimport { SecondarySearchStateInterface } from '../../features/searchState/store/states';\r\nimport { secondarySearchStateReducer } from '../../features/searchState/store/reducer';\r\nimport { ErrorMessagesInterface } from '../../ui/components/ErrorMessages/ErrorMessages';\r\nimport messageReducer from '../../ui/components/ErrorMessages/store/reducers';\r\nimport { ModalDialogInterface } from '../../ui/components/ModalDialogs/store/types';\r\nimport modalDialogsReducer from '../../ui/components/ModalDialogs/store/reducers';\r\nimport chunkServiceReducer from '../../services/ChunkRequestService/store/reducers';\r\nimport { ChunkServiceInterface } from '../../services/ChunkRequestService/store/types';\r\nimport { reportsReducer } from '../../pages/Reports/store/reducers';\r\nimport { ReportsState } from '../../pages/Reports/store/states';\r\nimport { SingleTeamFilterState } from '../../features/filters/dynamic-filter/single-team-filter/store/types';\r\nimport { singleTeamFilterReducer } from '../../features/filters/dynamic-filter/single-team-filter/store/reducers';\r\nimport { PractisSetFilterState } from '../../features/filters/dynamic-filter/practis-set-filter/store/types';\r\nimport { practisSetFilterReducer } from '../../features/filters/dynamic-filter/practis-set-filter/store/reducers';\r\nimport { overdueLearnersReducer } from '../../features/teams/pages/OverdueLearners/store/reducers';\r\nimport { MultipleTeamsFilterState } from '../../features/filters/dynamic-filter/multiple-teams-filter/store/types';\r\nimport { multipleTeamsFilterReducer } from '../../features/filters/dynamic-filter/multiple-teams-filter/store/reducers';\r\nimport { labelsFilterReducer } from '../../features/filters/dynamic-filter/labels-filter/store/reducers';\r\nimport { LabelsFilterState } from '../../features/filters/dynamic-filter/labels-filter/store/types';\r\nimport { OverdueLearnersState } from '../../features/teams/pages/OverdueLearners/store/states';\r\nimport { SearchableFilterHeaderState } from '../../features/filters/searchable-filter-header/store/types';\r\nimport { filterHeaderReducer } from '../../features/filters/searchable-filter-header/store/reducers';\r\nimport { MonthFilterState } from '../../features/filters/dynamic-filter/month-filter/store/types';\r\nimport { monthFilterReducer } from '../../features/filters/dynamic-filter/month-filter/store/reducers';\r\nimport { ScenarioRepsState } from '../../features/teams/pages/Training/ScenarioReps/store/states';\r\nimport { scenarioRepsReducer } from '../../features/teams/pages/Training/ScenarioReps/store/reducers';\r\nimport { DateRangeFilterState } from '../../features/filters/dynamic-filter/date-filter/store/types';\r\nimport { dateRangeFilterReducer } from '../../features/filters/dynamic-filter/date-filter/store/reducers';\r\nimport { RoleplaysState } from '../../pages/Roleplays/RoleplaysList/store/states';\r\nimport { roleplaysReducer } from '../../pages/Roleplays/RoleplaysList/store/reducers';\r\nimport { RoleplayState } from '../../pages/Roleplays/RoleplayPage/store/states';\r\nimport { roleplayReducer } from '../../pages/Roleplays/RoleplayPage/store/reducers';\r\n\r\nexport interface AppState {\r\n profile: UserProfileState;\r\n companies: AllCompaniesInterface;\r\n company: CompanyProfileInterface;\r\n chunkService: ChunkServiceInterface;\r\n users: AllUsersInterface;\r\n auth: AuthInterface;\r\n updatedUsers: UpdateUsersState;\r\n updatedMembers: UpdateMembersState;\r\n updatedTeams: UpdateTeamsState;\r\n invitations: InvitationsState;\r\n performance: UserPerformanceState;\r\n updatedUserPractisSets: UpdatedUserPractisSetsState;\r\n updatedInvitations: UpdateInvitationState;\r\n user: UserState;\r\n scenario: ScenarioInterface;\r\n challenge: ChallengeState;\r\n practisSet: PractisSetInterface;\r\n player: AudioInterface;\r\n messages: ErrorMessagesInterface;\r\n modalDialogs: ModalDialogInterface;\r\n libraryPractisSets: LibraryPractisSetsState;\r\n libraryUpdatedPractisSets: UpdatedLibraryPractisSetsState;\r\n libraryScenarios: LibraryScenariosState;\r\n libraryUpdatedScenarios: UpdatedLibraryScenariosState;\r\n libraryChallenges: LibraryChallengesState;\r\n libraryUpdatedChallenges: UpdatedLibraryChallengesState;\r\n global: GlobalReducerInterface;\r\n progress: ProgressState;\r\n assignUsers: AssignUsersState;\r\n inviters: InvitersState;\r\n pacings: PacingsState;\r\n submissions: SubmissionsState;\r\n submissionDetails: SubmissionDetailsState;\r\n submissionPagination: SubmissionPaginationState;\r\n accuracyscore: AccuracyScoreState;\r\n updatedSubmissions: UpdatedSubmissionsState;\r\n voiceGeneration: VoiceGenerationState;\r\n companyVoiceSettings: CompanyVoiceSettingsState;\r\n labels: LabelsState;\r\n labelsConfig: LabelsConfigState;\r\n portableLabels: PortableLabelsState;\r\n portableTeams: PortableTeamsState;\r\n portablePractisSets: PortablePractisSetsState;\r\n updatedLabels: UpdatedLabelsState;\r\n logs: LogsState;\r\n telepromter: TelepromterState;\r\n aiLogs: AiLogsState;\r\n drafts: DraftsState;\r\n draftEdit: DraftEditState;\r\n updatedDrafts: UpdatedDraftsState;\r\n teams: TeamsState;\r\n teamMembers: TeamMembersState;\r\n teamEdit: TeamEditState;\r\n practisSetsTraining: PractisSetsTrainingState;\r\n roles: UserRolesState;\r\n portableScenarios: PortableScenariosState;\r\n socketProgress: SocketProgressStateInterface;\r\n searchState: SearchStateInterface;\r\n secondarySearchState: SecondarySearchStateInterface;\r\n userFeatures: UserFeaturesState;\r\n companyAdmins: CompanyAdminsState;\r\n companyUserStats: CompanyUserStatsState;\r\n userPreferences: UserPreferencesState;\r\n reports: ReportsState;\r\n roleplays: RoleplaysState;\r\n roleplay: RoleplayState;\r\n singleTeamFilterReducer: SingleTeamFilterState;\r\n practisSetFilterReducer: PractisSetFilterState;\r\n multipleTeamsFilter: MultipleTeamsFilterState;\r\n labelsFilter: LabelsFilterState;\r\n overdueLearners: OverdueLearnersState;\r\n filterHeader: SearchableFilterHeaderState;\r\n monthFilter: MonthFilterState;\r\n scenarioReps: ScenarioRepsState;\r\n dateRange: DateRangeFilterState;\r\n}\r\n\r\nconst appReducer = combineReducers<AppState>({\r\n profile: userProfileReducer,\r\n companies: allCompaniesReducer,\r\n company: companyProfileReducer,\r\n users: allUsersReducer,\r\n auth: authReducer,\r\n updatedUsers: updatedUserReducer,\r\n updatedMembers: updatedMemberReducer,\r\n updatedTeams: updatedTeamReducer,\r\n user: userReducer,\r\n invitations: invitationsReducer,\r\n performance: userPerformanceReducer,\r\n updatedInvitations: updateInvitationsReducer,\r\n updatedUserPractisSets: updatedUserPractisSetsReducer,\r\n scenario: scenarioReducer,\r\n challenge: challengeReducer,\r\n practisSet: practisSetReducer,\r\n player: audioReducer,\r\n messages: messageReducer,\r\n modalDialogs: modalDialogsReducer,\r\n chunkService: chunkServiceReducer,\r\n libraryPractisSets: libraryPractisSetsReducer,\r\n libraryUpdatedPractisSets: updatedLibraryPractisSetsReducer,\r\n libraryScenarios: libraryScenariosReducer,\r\n libraryUpdatedScenarios: updatedLibraryScenariosReducer,\r\n libraryChallenges: libraryChallengesReducer,\r\n libraryUpdatedChallenges: updatedLibraryChallengesReducer,\r\n global: globalReducers,\r\n progress: progressReducer,\r\n assignUsers: assignUsersReducer,\r\n inviters: invitersReducer,\r\n pacings: pacingsReducer,\r\n submissions: submissionsReducer,\r\n submissionDetails: submissionDetailsReducer,\r\n submissionPagination: submissionPaginationReducer,\r\n accuracyscore: accuracyScoreReducer,\r\n updatedSubmissions: updatedSubmissionsReducer,\r\n voiceGeneration: voiceGenerationReducer,\r\n companyVoiceSettings: companyVoiceSettingsReducer,\r\n labels: labelsReducer,\r\n labelsConfig: labelsConfigReducer,\r\n portableLabels: portableLabelsReducer,\r\n portableTeams: portableTeamsReducer,\r\n portablePractisSets: portablePractisSetsReducer,\r\n updatedLabels: updatedLabelsReducer,\r\n logs: logsReducer,\r\n telepromter: telepromterReducer,\r\n drafts: draftsReducer,\r\n draftEdit: draftEditReducer,\r\n updatedDrafts: updatedDraftsReducer,\r\n aiLogs: aiLogsReducer,\r\n teams: allTeamsReducer,\r\n teamMembers: teamMembersReducer,\r\n teamEdit: teamEditReducer,\r\n practisSetsTraining: trainerPractisSetsReducer,\r\n roles: userRolesReducer,\r\n portableScenarios: portableScenariosReducer,\r\n socketProgress: SocketProgressReducer,\r\n searchState: SearchStateReducer,\r\n secondarySearchState: secondarySearchStateReducer,\r\n userFeatures: userFeaturesReducer,\r\n companyAdmins: companyAdminsReducer,\r\n companyUserStats: companyUserStatsReducer,\r\n userPreferences: userPreferencesReducer,\r\n reports: reportsReducer,\r\n roleplays: roleplaysReducer,\r\n roleplay: roleplayReducer,\r\n singleTeamFilterReducer: singleTeamFilterReducer,\r\n practisSetFilterReducer: practisSetFilterReducer,\r\n multipleTeamsFilter: multipleTeamsFilterReducer,\r\n labelsFilter: labelsFilterReducer,\r\n overdueLearners: overdueLearnersReducer,\r\n filterHeader: filterHeaderReducer,\r\n monthFilter: monthFilterReducer,\r\n scenarioReps: scenarioRepsReducer,\r\n dateRange: dateRangeFilterReducer\r\n});\r\n\r\nconst rootReducer = (state: AppState | undefined, action: any) => {\r\n if (action.type === USER_LOGOUT) {\r\n state = undefined;\r\n }\r\n\r\n return appReducer(state, action);\r\n};\r\n\r\nexport default rootReducer;","import { CompanyInterface } from '../../../constants/interfaces/Company';\nimport {\n SEARCH_ALL_COMPANIES_START,\n SEARCH_ALL_COMPANIES_SUCCESS,\n SEARCH_ALL_COMPANIES_FAILURE,\n FETCH_ACTIVE_COMPANIES_START,\n FETCH_ACTIVE_COMPANIES_SUCCESS,\n FETCH_ACTIVE_COMPANIES_FAILURE,\n} from './actions';\nimport { ListResult } from \"../../../constants/interfaces/PaginationResult\";\n\nexport interface AllCompaniesInterface {\n allCompanies?: ListResult<CompanyInterface>;\n loadingAllCompanies?: boolean;\n errorAllCompanies?: string;\n activeCompanies?: ListResult<CompanyInterface>;\n isActiveCompaniesLoading?: boolean;\n activeCompaniesError?: string;\n}\n\nexport const allCompaniesReducer = (state = {}, action: any) => {\n switch (action.type) {\n case SEARCH_ALL_COMPANIES_START:\n return {\n ...state,\n errorAllCompanies: '',\n loadingAllCompanies: true,\n };\n case SEARCH_ALL_COMPANIES_SUCCESS:\n return {\n ...state,\n allCompanies: action.data,\n errorAllCompanies: '',\n loadingAllCompanies: false,\n };\n case SEARCH_ALL_COMPANIES_FAILURE:\n return {\n ...state,\n errorAllCompanies: action.error,\n loadingAllCompanies: false,\n };\n case FETCH_ACTIVE_COMPANIES_START:\n return {\n ...state,\n isActiveCompaniesLoading: true,\n activeCompaniesError: undefined,\n };\n case FETCH_ACTIVE_COMPANIES_SUCCESS:\n return {\n activeCompanies: action.data,\n isActiveCompaniesLoading: false,\n activeCompaniesError: undefined,\n };\n case FETCH_ACTIVE_COMPANIES_FAILURE:\n return {\n ...state,\n isActiveCompaniesLoading: false,\n activeCompaniesError: action.error,\n };\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport { PortableTeamsState, initialState } from './states';\nimport { PortableTeamsActions } from './actions';\n\nexport const portableTeamsReducer: Reducer<\n PortableTeamsState,\n PortableTeamsActions\n> = (\n state = initialState,\n action: PortableTeamsActions\n): PortableTeamsState => {\n switch (action.type) {\n case 'searchStartTeams':\n return {\n ...state,\n loading: true,\n };\n case 'searchSuccessTeams':\n return {\n data: action.result,\n loading: false,\n };\n case 'searchFailureTeams':\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport { PortablePractisSetsState, initialState } from './states';\nimport { PortablePractisSetsActions } from './actions';\n\nexport const portablePractisSetsReducer: Reducer<\n PortablePractisSetsState,\n PortablePractisSetsActions\n> = (\n state = initialState,\n action: PortablePractisSetsActions\n): PortablePractisSetsState => {\n switch (action.type) {\n case 'searchStartPractisSets':\n return {\n ...state,\n loading: true,\n };\n case 'searchSuccessPractisSets':\n return {\n data: action.result,\n loading: false,\n };\n case 'searchFailurePractisSets':\n return {\n ...state,\n loading: false,\n };\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport {\n ACTIONS,\n searchLogsDispose,\n searchLogsFailure,\n searchLogsStart,\n searchLogsSuccess,\n} from './actions';\nimport { LogsState } from './states';\n\ntype CompaniesAction =\n | ReturnType<typeof searchLogsStart>\n | ReturnType<typeof searchLogsSuccess>\n | ReturnType<typeof searchLogsFailure>\n | ReturnType<typeof searchLogsDispose>;\n\nexport const logsReducer: Reducer<LogsState, CompaniesAction> = (\n state = {},\n action\n): LogsState => {\n switch (action.type) {\n case ACTIONS.SEARCH_LOGS_START:\n return {\n ...state,\n loading: true,\n error: '',\n };\n case ACTIONS.SEARCH_LOGS_SUCCESS: {\n const prevItems = state.data && state.data.items;\n return {\n data:\n action.logs.offset === 0 || !prevItems\n ? action.logs\n : {\n ...action.logs,\n items: action.logs.items,\n \n },\n loading: false,\n error: '',\n };\n }\n case ACTIONS.SEARCH_LOGS_FAILURE:\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n case ACTIONS.SEARCH_LOGS_DISPOSE: {\n return {\n data: undefined,\n loading: false,\n error: '',\n };\n }\n default:\n return state;\n }\n};\n","import { Reducer } from 'redux';\nimport { PortableScenariosState, initialState } from './states';\nimport { PortableScenariosActions } from './actions';\n\nexport const portableScenariosReducer: Reducer<\nPortableScenariosState,\n PortableScenariosActions\n> = (\n state = initialState,\n action: PortableScenariosActions\n): PortableScenariosState => {\n switch (action.type) {\n case 'searchStartScenarios':\n return {\n ...state,\n loading: true,\n };\n case 'searchSuccessScenarios':\n return {\n data: action.result,\n loading: false,\n };\n case 'searchFailureScenarios':\n return {\n ...state,\n loading: false,\n };\n case 'clearPortableScenarios':\n return {\n ...initialState,\n };\n default:\n return state;\n }\n};\n","import {\n ACTIONS,\n getReportsFailure,\n getReportsStart,\n getReportsSuccess\n} from './actions';\nimport { ReportsState } from './states';\n\ntype ReportsActions =\n | ReturnType<typeof getReportsStart>\n | ReturnType<typeof getReportsSuccess>\n | ReturnType<typeof getReportsFailure>;\n\nexport const reportsReducer = (\n state = { isLoading: false },\n action: ReportsActions\n): ReportsState => {\n switch(action.type) {\n case ACTIONS.GET_REPORTS_START:\n return {\n ...state,\n isLoading: true\n };\n case ACTIONS.GET_REPORTS_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.GET_REPORTS_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n default:\n return state;\n }\n}","import {\n ACTIONS,\n getRoleplaysFailure,\n getRoleplaysStart,\n getRoleplaysSuccess\n} from './actions';\nimport { RoleplaysState } from './states';\n\ntype RoleplaysActions =\n | ReturnType<typeof getRoleplaysStart>\n | ReturnType<typeof getRoleplaysSuccess>\n | ReturnType<typeof getRoleplaysFailure>;\n\nexport const roleplaysReducer = (\n state = { isLoading: false },\n action: RoleplaysActions\n): RoleplaysState => {\n switch(action.type) {\n case ACTIONS.GET_ROLEPLAYS_START:\n return {\n ...state,\n isLoading: true\n };\n case ACTIONS.GET_ROLEPLAYS_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.GET_ROLEPLAYS_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n default:\n return state;\n }\n}","import {\n ACTIONS,\n getRoleplayFailure,\n getRoleplayStart,\n getRoleplaySuccess,\n updateRoleplayStart,\n updateRoleplaySuccess,\n updateRoleplayFailure,\n clearRoleplay\n} from './actions';\nimport { RoleplayState } from './states';\n\ntype RoleplayActions =\n | ReturnType<typeof getRoleplayStart>\n | ReturnType<typeof getRoleplaySuccess>\n | ReturnType<typeof getRoleplayFailure>\n | ReturnType<typeof updateRoleplayStart>\n | ReturnType<typeof updateRoleplaySuccess>\n | ReturnType<typeof updateRoleplayFailure>\n | ReturnType<typeof clearRoleplay>;\n\nexport const roleplayReducer = (\n state = { isLoading: false },\n action: RoleplayActions\n): RoleplayState => {\n switch (action.type) {\n case ACTIONS.GET_ROLEPLAY_START:\n return {\n ...state,\n isLoading: true\n };\n case ACTIONS.GET_ROLEPLAY_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.GET_ROLEPLAY_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n case ACTIONS.UPDATE_ROLEPLAY_START:\n return {\n ...state,\n isLoading: false\n };\n case ACTIONS.UPDATE_ROLEPLAY_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.UPDATE_ROLEPLAY_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n case ACTIONS.CLEAR_ROLEPLAY:\n return {\n isLoading: false,\n data: undefined,\n error: ''\n };\n default:\n return state;\n }\n}","import {\n ACTIONS,\n getOverdueLearnersFailure,\n getOverdueLearnersStart,\n getOverdueLearnersSuccess\n} from './actions';\nimport { OverdueLearnersState } from './states';\n\ntype OverdueLearnersActions =\n | ReturnType<typeof getOverdueLearnersStart>\n | ReturnType<typeof getOverdueLearnersSuccess>\n | ReturnType<typeof getOverdueLearnersFailure>;\n\nexport const overdueLearnersReducer = (\n state = { isLoading: false },\n action: OverdueLearnersActions\n): OverdueLearnersState => {\n switch(action.type) {\n case ACTIONS.GET_OVERDUE_LEARNERS_START:\n return {\n ...state,\n isLoading: true\n };\n case ACTIONS.GET_OVERDUE_LEARNERS_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.GET_OVERDUE_LEARNERS_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n default:\n return state;\n }\n}","import {\n ACTIONS,\n clearScenarioReps,\n getScenarioRepsFailure,\n getScenarioRepsStart,\n getScenarioRepsSuccess\n} from './actions';\nimport { ScenarioRepsState } from './states';\n\ntype ScenarioRepsActions =\n | ReturnType<typeof getScenarioRepsStart>\n | ReturnType<typeof getScenarioRepsSuccess>\n | ReturnType<typeof getScenarioRepsFailure>\n | ReturnType<typeof clearScenarioReps>;\n\nexport const scenarioRepsReducer = (\n state = { isLoading: false },\n action: ScenarioRepsActions\n): ScenarioRepsState => {\n\n switch(action.type) {\n case ACTIONS.GET_SCENARIO_REPS_START:\n return {\n ...state,\n isLoading: true\n };\n case ACTIONS.GET_SCENARIO_REPS_SUCCESS:\n return {\n isLoading: false,\n data: action.data,\n error: ''\n };\n case ACTIONS.GET_SCENARIO_REPS_FAILURE:\n return {\n ...state,\n isLoading: false,\n error: action.error\n };\n case ACTIONS.CLEAR_SCENARIO_REPS:\n return {\n isLoading: false\n };\n default:\n return state;\n }\n}","import { createGlobalStyle } from 'styled-components';\nimport { Variables } from './variables';\n\nexport const GlobalStyle = createGlobalStyle`\n ::-webkit-scrollbar {\n width: 4px;\n height: 4px;\n }\n\n ::-webkit-scrollbar-track {\n background: transparent;\n }\n\n ::-webkit-scrollbar-thumb {\n background: ${Variables.Colors.paleGrey};\n border-radius: 4px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: ${Variables.Colors.paleGrey};\n }\n\n textarea:focus, input:focus {\n outline: none;\n }\n\n * {\n scrollbar-color: ${Variables.Colors.whiteThree};\n scrollbar-width: thin !important;\n }\n\n *:focus {\n outline: none;\n }\n\n /* Chrome, Safari, Edge, Opera */\n input::-webkit-outer-spin-button,\n input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n /* Firefox */\n input[type=number] {\n -moz-appearance: textfield;\n }\n\n body {\n font-family: Manrope !important;\n margin: 0;\n overflow: hidden;\n background-color: ${Variables.Colors.white} !important;\n }\n\n textarea {\n font-family: Manrope !important;\n }\n\n .inline-block{\n display: inline-block;\n }\n\n .inline-flex{\n display: inline-flex;\n }\n\n .tooltip-question {\n padding: 20px;\n width: 280px;\n word-break: break-word;\n white-space: normal;\n min-height: 84px;\n border-radius: 8px;\n\n &:before{\n content: '';\n width: 16px;\n height: 16px;\n background: #fff;\n position: absolute;\n left: 132px;\n top: -6px;\n transform: rotate(45deg);\n box-shadow: -3px -4px 5px rgba(0, 0, 0, 0.015),\n 0 0px white, \n -7px -3px 5px rgba(0, 0, 0, 0.015), \n 0 0px white;\n z-index: -1;\n }\n }\n\n .tooltip-question.top {\n &:before {\n bottom: -6px;\n top: unset;\n box-shadow: unset;\n }\n }\n\n // striped-progress-bar styles\n\n .progress-container {\n margin: auto;\n width: 100%;\n }\n\n\n .progress-title {\n font-size: 13px;\n color: var(--ps-grey-1);\n margin-bottom: 10px;\n }\n\n .progress {\n background-color: var(--ps-grey-4);\n border-radius: 58px;\n box-shadow: none;\n }\n\n\n .progress-bar {\n background-color: var(--ps-blue-main);\n height: 16px;\n border-radius: 58px;\n box-shadow: none;\n }\n\n .progress-bar.text-right span {\n margin-right: 10px;\n }\n\n @-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n\n to {\n background-position: 0 0;\n }\n }\n\n @keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n\n to {\n background-position: 0 0;\n }\n }\n\n .progress.active .progress-bar,\n .progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n }\n\n .progress-striped .progress-bar,\n .progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n }\n\n .progress-bar-default {\n background-color: #b0bec5;\n }\n`;","import { FC } from 'react';\nimport { useSelector } from 'react-redux';\nimport { isEqual } from 'lodash';\n\nimport { useFetchAllLabelsService } from '../../../features/portableLabels/store/hors/withLabels/services';\nimport { useSearchTeamsService } from '../../../features/portableTeams/store/hors/withTeams/services';\nimport { useSetLabelFilterActionService } from '../../../features/labels/store/services';\nimport { getProfileState } from '../../../pages/UserProfile/store/reducers';\nimport { useFetchAllPractisSetsService } from '../../../features/portablePractisSets/store/hors/withPractisSets/services';\nimport { useSessionEffect } from '../../../features/common';\nimport { useUpdatedLabelsState } from '../../../features/labels/store/states';\nimport { useUpdateTeamsState } from '../../../features/teams/store/states';\nimport { useUpdatedLibraryPractisSetsState } from '../../../features/library/store/states';\nimport { getConfig } from '../../../tools/config';\nimport Storage from '../../../services/Storage';\n\nconst PortableLoaderWrapper: FC = () => {\n const fetchLabels = useFetchAllLabelsService();\n const fetchTeams = useSearchTeamsService();\n const fetchAllPractisSets = useFetchAllPractisSetsService();\n const profile = useSelector(getProfileState);\n const setLabels = useSetLabelFilterActionService();\n\n const updatedLabels = useUpdatedLabelsState();\n const updatedTeams = useUpdateTeamsState();\n const updatedPractisSets = useUpdatedLibraryPractisSetsState();\n\n useSessionEffect(() => fetchLabels(), [fetchLabels, updatedLabels?.data]);\n\n useSessionEffect(() => fetchTeams(), [fetchTeams, updatedTeams?.data]);\n\n useSessionEffect(() => fetchAllPractisSets(), [\n fetchAllPractisSets,\n updatedPractisSets?.data,\n ]);\n\n useSessionEffect(() => {\n if (!!profile?.labelFilters?.length) {\n setLabels(profile.labelFilters);\n }\n }, [profile?.labelFilters, setLabels]);\n\n useSessionEffect(() => {\n const config = getConfig();\n\n const prevAppVersion = Storage.get('appVersion');\n const newAppVersion = config.APP_VERSION;\n\n if (!prevAppVersion) {\n Storage.set('appVersion', newAppVersion);\n } else if (!isEqual(prevAppVersion, newAppVersion)) {\n Storage.remove('appVersion');\n window.location.reload();\n }\n }, []);\n \n\n return null;\n};\n\nexport default PortableLoaderWrapper;\n","import Storage from '../services/Storage';\nimport {\n getCurrentUrl,\n getQueryStringFromUrl,\n setCurrentUrl,\n setQueryParameterToUrl,\n} from '../tools/url/UrlUtils';\n\nexport function configStorage() {\n const currentUrl = getCurrentUrl();\n const {t: token, id: userId, p: platform = 'develop'} = getQueryStringFromUrl(currentUrl);\n\n if (token) {\n Storage.set('token', token);\n Storage.set('userId', userId);\n Storage.set('apiPlatform', platform);\n\n setCurrentUrl(\n setQueryParameterToUrl(\n setQueryParameterToUrl(\n setQueryParameterToUrl(currentUrl, 'p'),\n 'id'\n ),\n 't'\n )\n );\n }\n\n return { isLoggedIn: !!Storage.get('token') };\n}\n","import DateFnsUtils from '@date-io/date-fns';\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { BrowserRouter } from 'react-router-dom';\nimport { ThemeProvider } from 'styled-components';\nimport App from './App';\nimport { APP_CONFIG } from './app.config';\nimport {\n contextItem,\n MultiContextProvider,\n MultiContextProviderItem,\n} from './ui/components/MultiContextProvider';\nimport { configServices } from './config';\nimport { createContexts } from './config/context';\nimport { configStorage } from './config/storage';\nimport * as serviceWorker from './serviceWorker';\nimport rootReducer from './store/reducers';\nimport { GlobalStyle } from './theme/GlobalStyle';\nimport { Variables } from './theme/variables';\nimport { WEB_SITE_ID } from './tools/constants/WebSiteId';\nimport { HttpContext } from './tools/http/Http';\nimport PortableLoaderWrapper from './ui/wrapper/PortableLoaderWrapper/PortableLoaderWrapper';\n\nconfigStorage();\nconst {\n store,\n webSiteId,\n urlBuilder,\n http,\n localStorage,\n newRelicApi,\n} = configServices(WEB_SITE_ID.COMPANY_PORTAL, APP_CONFIG, rootReducer);\nconst rootElement = document.getElementById('root');\nconst contextItems: MultiContextProviderItem[] = createContexts(\n webSiteId,\n urlBuilder,\n localStorage,\n newRelicApi\n).map(c => contextItem(c.context, c.value));\n\nReactDOM.render(\n <Provider store={store}>\n <BrowserRouter>\n <GlobalStyle />\n <ThemeProvider theme={Variables}>\n <MultiContextProvider items={contextItems}>\n <HttpContext.Provider value={http}>\n <MuiPickersUtilsProvider utils={DateFnsUtils}>\n <PortableLoaderWrapper />\n <App />\n </MuiPickersUtilsProvider>\n </HttpContext.Provider>\n </MultiContextProvider>\n </ThemeProvider>\n </BrowserRouter>\n </Provider>,\n rootElement\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import {\n applyMiddleware,\n createStore as reduxCreateStore,\n Reducer,\n compose as composeSource,\n StoreEnhancer,\n} from 'redux';\nimport { composeWithDevTools } from 'redux-devtools-extension';\nimport thunk from 'redux-thunk';\nimport { ThunkContext } from '../tools/thunk/ThunkContext';\n\nexport const createStore = (\n rootReducer: Reducer,\n thunkContext: ThunkContext\n) => {\n const middlewareEnhancer = applyMiddleware(\n thunk.withExtraArgument(thunkContext)\n );\n let compose = composeSource;\n if (process.env.REACT_APP_DEV_ENV === 'local') {\n compose = composeWithDevTools({\n trace: true,\n });\n }\n const composedEnhancer: StoreEnhancer = compose(middlewareEnhancer);\n\n return reduxCreateStore(rootReducer, composedEnhancer);\n};\n"],"sourceRoot":""}