@medplum/react 2.0.32 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +5 -5
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/esm/index.mjs +5 -5
- package/dist/esm/index.mjs.map +4 -4
- package/dist/types/AddressDisplay/AddressDisplay.d.ts +0 -1
- package/dist/types/AddressInput/AddressInput.d.ts +0 -1
- package/dist/types/AnnotationInput/AnnotationInput.d.ts +0 -1
- package/dist/types/AppShell/HeaderSearchInput.d.ts +0 -1
- package/dist/types/AppShell/Navbar.d.ts +0 -1
- package/dist/types/AsyncAutocomplete/AsyncAutocomplete.d.ts +0 -1
- package/dist/types/AttachmentArrayDisplay/AttachmentArrayDisplay.d.ts +0 -1
- package/dist/types/AttachmentArrayInput/AttachmentArrayInput.d.ts +0 -1
- package/dist/types/AttachmentDisplay/AttachmentDisplay.d.ts +0 -1
- package/dist/types/AttachmentInput/AttachmentInput.d.ts +0 -1
- package/dist/types/BackboneElementDisplay/BackboneElementDisplay.d.ts +0 -1
- package/dist/types/BackboneElementInput/BackboneElementInput.d.ts +0 -1
- package/dist/types/BookmarkDialog/BookmarkDialog.d.ts +0 -1
- package/dist/types/CalendarInput/CalendarInput.d.ts +0 -1
- package/dist/types/CodeInput/CodeInput.d.ts +0 -1
- package/dist/types/CodeableConceptDisplay/CodeableConceptDisplay.d.ts +0 -1
- package/dist/types/CodeableConceptInput/CodeableConceptInput.d.ts +0 -1
- package/dist/types/CodingDisplay/CodingDisplay.d.ts +0 -1
- package/dist/types/CodingInput/CodingInput.d.ts +0 -1
- package/dist/types/ContactDetailDisplay/ContactDetailDisplay.d.ts +0 -1
- package/dist/types/ContactDetailInput/ContactDetailInput.d.ts +0 -1
- package/dist/types/ContactPointDisplay/ContactPointDisplay.d.ts +0 -1
- package/dist/types/ContactPointInput/ContactPointInput.d.ts +0 -1
- package/dist/types/Container/Container.d.ts +0 -1
- package/dist/types/DateTimeInput/DateTimeInput.d.ts +0 -1
- package/dist/types/DefaultResourceTimeline/DefaultResourceTimeline.d.ts +0 -1
- package/dist/types/DiagnosticReportDisplay/DiagnosticReportDisplay.d.ts +0 -1
- package/dist/types/Document/Document.d.ts +0 -1
- package/dist/types/EncounterTimeline/EncounterTimeline.d.ts +0 -1
- package/dist/types/ExtensionInput/ExtensionInput.d.ts +0 -1
- package/dist/types/FhirPathDisplay/FhirPathDisplay.d.ts +0 -1
- package/dist/types/GoogleButton/GoogleButton.d.ts +0 -1
- package/dist/types/HumanNameDisplay/HumanNameDisplay.d.ts +0 -1
- package/dist/types/HumanNameInput/HumanNameInput.d.ts +0 -1
- package/dist/types/IdentifierDisplay/IdentifierDisplay.d.ts +0 -1
- package/dist/types/IdentifierInput/IdentifierInput.d.ts +0 -1
- package/dist/types/Loading/Loading.d.ts +0 -1
- package/dist/types/Logo/Logo.d.ts +0 -1
- package/dist/types/MoneyDisplay/MoneyDisplay.d.ts +0 -1
- package/dist/types/MoneyInput/MoneyInput.d.ts +0 -1
- package/dist/types/NoteDisplay/NoteDisplay.d.ts +0 -1
- package/dist/types/OperationOutcomeAlert/OperationOutcomeAlert.d.ts +0 -1
- package/dist/types/Panel/Panel.d.ts +0 -1
- package/dist/types/PatientTimeline/PatientTimeline.d.ts +0 -1
- package/dist/types/PeriodInput/PeriodInput.d.ts +0 -1
- package/dist/types/PlanDefinitionBuilder/PlanDefinitionBuilder.d.ts +0 -1
- package/dist/types/QuantityDisplay/QuantityDisplay.d.ts +0 -1
- package/dist/types/QuantityInput/QuantityInput.d.ts +0 -1
- package/dist/types/QuestionnaireBuilder/QuestionnaireBuilder.d.ts +0 -1
- package/dist/types/QuestionnaireForm/QuestionnaireForm.d.ts +1 -11
- package/dist/types/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem.d.ts +9 -0
- package/dist/types/RangeDisplay/RangeDisplay.d.ts +0 -1
- package/dist/types/RangeInput/RangeInput.d.ts +0 -1
- package/dist/types/RatioDisplay/RatioDisplay.d.ts +0 -1
- package/dist/types/RatioInput/RatioInput.d.ts +0 -1
- package/dist/types/ReferenceDisplay/ReferenceDisplay.d.ts +0 -1
- package/dist/types/ReferenceInput/ReferenceInput.d.ts +0 -1
- package/dist/types/ReferenceRangeEditor/ReferenceRangeEditor.d.ts +0 -1
- package/dist/types/RequestGroupDisplay/RequestGroupDisplay.d.ts +0 -1
- package/dist/types/ResourceArrayDisplay/ResourceArrayDisplay.d.ts +0 -1
- package/dist/types/ResourceArrayInput/ResourceArrayInput.d.ts +0 -1
- package/dist/types/ResourceAvatar/ResourceAvatar.d.ts +0 -1
- package/dist/types/ResourceBadge/ResourceBadge.d.ts +0 -1
- package/dist/types/ResourceBlame/ResourceBlame.d.ts +0 -1
- package/dist/types/ResourceDiff/ResourceDiff.d.ts +0 -1
- package/dist/types/ResourceDiffTable/ResourceDiffTable.d.ts +0 -1
- package/dist/types/ResourceForm/ResourceForm.d.ts +0 -1
- package/dist/types/ResourceHistoryTable/ResourceHistoryTable.d.ts +0 -1
- package/dist/types/ResourceInput/ResourceInput.d.ts +0 -1
- package/dist/types/ResourceName/ResourceName.d.ts +0 -1
- package/dist/types/ResourcePropertyDisplay/ResourcePropertyDisplay.d.ts +0 -1
- package/dist/types/ResourcePropertyInput/ResourcePropertyInput.d.ts +0 -1
- package/dist/types/ResourceTable/ResourceTable.d.ts +0 -1
- package/dist/types/ResourceTimeline/ResourceTimeline.d.ts +0 -1
- package/dist/types/Scheduler/Scheduler.d.ts +0 -1
- package/dist/types/SearchControl/SearchUtils.d.ts +0 -1
- package/dist/types/SearchExportDialog/SearchExportDialog.d.ts +0 -1
- package/dist/types/SearchFieldEditor/SearchFieldEditor.d.ts +0 -1
- package/dist/types/SearchFilterEditor/SearchFilterEditor.d.ts +0 -1
- package/dist/types/SearchFilterValueDialog/SearchFilterValueDialog.d.ts +0 -1
- package/dist/types/SearchFilterValueDisplay/SearchFilterValueDisplay.d.ts +0 -1
- package/dist/types/SearchFilterValueInput/SearchFilterValueInput.d.ts +0 -1
- package/dist/types/SearchPopupMenu/SearchPopupMenu.d.ts +0 -1
- package/dist/types/ServiceRequestTimeline/ServiceRequestTimeline.d.ts +0 -1
- package/dist/types/StatusBadge/StatusBadge.d.ts +0 -1
- package/dist/types/TimingInput/TimingInput.d.ts +0 -1
- package/dist/types/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +0 -1
- package/dist/types/auth/ChooseProfileForm.d.ts +0 -1
- package/dist/types/auth/ChooseScopeForm.d.ts +0 -1
- package/dist/types/auth/MfaForm.d.ts +0 -1
- package/dist/types/auth/NewProjectForm.d.ts +0 -1
- package/dist/types/stories/healthgorilla.d.ts +6 -0
- package/dist/types/utils/questionnaire.d.ts +2 -1
- package/package.json +1 -1
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/AddressDisplay/AddressDisplay.tsx", "../../src/AddressInput/AddressInput.tsx", "../../src/AnnotationInput/AnnotationInput.tsx", "../../src/MedplumProvider/MedplumProvider.tsx", "../../src/AppShell/AppShell.tsx", "../../src/ErrorBoundary/ErrorBoundary.tsx", "../../../../node_modules/@tabler/icons-react/src/defaultAttributes.js", "../../../../node_modules/@tabler/icons-react/src/createReactComponent.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAdjustmentsHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAlertCircle.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleachOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleach.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBoxMultiple.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBracketsContain.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucketOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucket.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCalendar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheck.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheckbox.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconChevronDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCircleMinus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCirclePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCloudUpload.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconColumns.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCopy.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCurrencyDollar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconDots.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEdit.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqualNot.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqual.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFileAlert.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilter.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconListDetails.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconLogout.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathGreater.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathLower.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMessage.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPin.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPinnedOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconRefresh.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSearch.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSettings.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortAscending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortDescending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSwitchHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTableExport.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTrash.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconX.js", "../../src/Loading/Loading.tsx", "../../src/AppShell/Header.tsx", "../../src/HumanNameDisplay/HumanNameDisplay.tsx", "../../src/ResourceAvatar/ResourceAvatar.tsx", "../../src/MedplumLink/MedplumLink.tsx", "../../src/utils/dom.ts", "../../src/useResource/useResource.ts", "../../src/AppShell/HeaderSearchInput.tsx", "../../src/AsyncAutocomplete/AsyncAutocomplete.tsx", "../../src/AppShell/Navbar.tsx", "../../src/BookmarkDialog/BookmarkDialog.tsx", "../../src/Form/Form.tsx", "../../src/Form/FormUtils.ts", "../../src/CodeInput/CodeInput.tsx", "../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx", "../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx", "../../src/AttachmentDisplay/AttachmentDisplay.tsx", "../../src/AttachmentArrayInput/AttachmentArrayInput.tsx", "../../src/AttachmentButton/AttachmentButton.tsx", "../../src/AttachmentInput/AttachmentInput.tsx", "../../src/BackboneElementDisplay/BackboneElementDisplay.tsx", "../../src/constants.ts", "../../src/DescriptionList/DescriptionList.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx", "../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx", "../../src/CodingDisplay/CodingDisplay.tsx", "../../src/ContactDetailDisplay/ContactDetailDisplay.tsx", "../../src/ContactPointDisplay/ContactPointDisplay.tsx", "../../src/IdentifierDisplay/IdentifierDisplay.tsx", "../../src/MoneyDisplay/MoneyDisplay.tsx", "../../src/QuantityDisplay/QuantityDisplay.tsx", "../../src/RangeDisplay/RangeDisplay.tsx", "../../src/RatioDisplay/RatioDisplay.tsx", "../../src/ReferenceDisplay/ReferenceDisplay.tsx", "../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx", "../../src/BackboneElementInput/BackboneElementInput.tsx", "../../src/CheckboxFormSection/CheckboxFormSection.tsx", "../../src/FormSection/FormSection.tsx", "../../src/utils/outcomes.ts", "../../src/ResourceForm/ResourceForm.tsx", "../../src/ResourcePropertyInput/ResourcePropertyInput.tsx", "../../src/CodeableConceptInput/CodeableConceptInput.tsx", "../../src/CodingInput/CodingInput.tsx", "../../src/ContactDetailInput/ContactDetailInput.tsx", "../../src/ContactPointInput/ContactPointInput.tsx", "../../src/DateTimeInput/DateTimeInput.tsx", "../../src/ExtensionInput/ExtensionInput.tsx", "../../src/HumanNameInput/HumanNameInput.tsx", "../../src/IdentifierInput/IdentifierInput.tsx", "../../src/MoneyInput/MoneyInput.tsx", "../../src/PeriodInput/PeriodInput.tsx", "../../src/QuantityInput/QuantityInput.tsx", "../../src/RangeInput/RangeInput.tsx", "../../src/RatioInput/RatioInput.tsx", "../../src/ReferenceInput/ReferenceInput.tsx", "../../src/ResourceInput/ResourceInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.tsx", "../../src/TimingInput/TimingInput.tsx", "../../src/CalendarInput/CalendarInput.tsx", "../../src/Container/Container.tsx", "../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx", "../../src/ResourceTimeline/ResourceTimeline.tsx", "../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx", "../../src/NoteDisplay/NoteDisplay.tsx", "../../src/ResourceBadge/ResourceBadge.tsx", "../../src/ResourceName/ResourceName.tsx", "../../src/StatusBadge/StatusBadge.tsx", "../../src/Panel/Panel.tsx", "../../src/ResourceDiffTable/ResourceDiffTable.tsx", "../../src/ResourceTable/ResourceTable.tsx", "../../src/Timeline/Timeline.tsx", "../../src/utils/date.ts", "../../src/Document/Document.tsx", "../../src/EncounterTimeline/EncounterTimeline.tsx", "../../src/FhirPathTable/FhirPathTable.tsx", "../../src/FhirPathDisplay/FhirPathDisplay.tsx", "../../src/SearchControl/SearchControl.tsx", "../../src/SearchExportDialog/SearchExportDialog.tsx", "../../src/SearchFieldEditor/SearchFieldEditor.tsx", "../../src/SearchControl/SearchUtils.tsx", "../../src/SearchFilterEditor/SearchFilterEditor.tsx", "../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx", "../../src/SearchFilterValueInput/SearchFilterValueInput.tsx", "../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx", "../../src/SearchPopupMenu/SearchPopupMenu.tsx", "../../src/SearchControl/SearchControlField.ts", "../../src/Logo/Logo.tsx", "../../src/OperationOutcomeAlert/OperationOutcomeAlert.tsx", "../../src/PatientTimeline/PatientTimeline.tsx", "../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx", "../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx", "../../src/QuestionnaireForm/
|
|
4
|
-
"sourcesContent": ["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nfunction getLine(address: Address, index: number): string {\n return address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { useMedplumProfile } from '../MedplumProvider/MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport type MepdlumNavigateFunction = (path: string) => void;\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n navigate?: MepdlumNavigateFunction;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n navigate: MepdlumNavigateFunction;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n * @param props The MedplumProvider React props.\n * @returns The MedplumProvider React node.\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n const navigate = props.navigate ?? defaultNavigate;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListener('change', eventListener);\n }, [medplum, state]);\n\n useEffect(() => {\n function eventListener(): void {\n showNotification({ color: 'red', message: 'No connection to server', autoClose: false });\n }\n medplum.addEventListener('offline', eventListener);\n return () => medplum.removeEventListener('offline', eventListener);\n }, [medplum]);\n\n const medplumContext = useMemo(\n () => ({\n ...state,\n medplum,\n navigate,\n }),\n [state, medplum, navigate]\n );\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n * @returns The MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n * @returns The MedplumClient instance.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the Medplum navigate function.\n * @returns The Medplum navigate function.\n */\nexport function useMedplumNavigate(): MepdlumNavigateFunction {\n return useMedplumContext().navigate;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n\n/**\n * The default \"navigate\" function which simply uses window.location.href.\n * @param path The path to navigate to.\n */\nfunction defaultNavigate(path: string): void {\n window.location.assign(path);\n}\n", "import { AppShell as MantineAppShell, useMantineTheme } from '@mantine/core';\nimport React, { Suspense, useState } from 'react';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Loading } from '../Loading/Loading';\nimport { useMedplum, useMedplumProfile } from '../MedplumProvider/MedplumProvider';\nimport { Header } from './Header';\nimport { Navbar, NavbarMenu } from './Navbar';\n\nexport interface AppShellProps {\n logo: React.ReactNode;\n pathname?: string;\n searchParams?: URLSearchParams;\n version?: string;\n menus?: NavbarMenu[];\n children: React.ReactNode;\n displayAddBookmark?: boolean;\n}\n\nexport function AppShell(props: AppShellProps): JSX.Element {\n const theme = useMantineTheme();\n const [navbarOpen, setNavbarOpen] = useState(localStorage['navbarOpen'] === 'true');\n const medplum = useMedplum();\n const profile = useMedplumProfile();\n\n function setNavbarOpenWrapper(open: boolean): void {\n localStorage['navbarOpen'] = open.toString();\n setNavbarOpen(open);\n }\n\n function closeNavbar(): void {\n setNavbarOpenWrapper(false);\n }\n\n function toggleNavbar(): void {\n setNavbarOpenWrapper(!navbarOpen);\n }\n\n if (medplum.isLoading()) {\n return <Loading />;\n }\n\n return (\n <MantineAppShell\n styles={{\n main: {\n background: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0],\n },\n }}\n padding={0}\n fixed={true}\n header={\n profile && (\n <Header\n pathname={props.pathname}\n searchParams={props.searchParams}\n logo={props.logo}\n version={props.version}\n navbarToggle={toggleNavbar}\n />\n )\n }\n navbar={\n profile && navbarOpen ? (\n <Navbar\n pathname={props.pathname}\n searchParams={props.searchParams}\n menus={props.menus}\n closeNavbar={closeNavbar}\n displayAddBookmark={props.displayAddBookmark}\n />\n ) : undefined\n }\n >\n <ErrorBoundary key={`${props.pathname}?${props.searchParams?.toString()}`}>\n <Suspense fallback={<Loading />}>{props.children}</Suspense>\n </ErrorBoundary>\n </MantineAppShell>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { forwardRef, createElement } from 'react';\nimport PropTypes from 'prop-types';\nimport defaultAttributes from './defaultAttributes';\n\nexport default (iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = 'currentColor', size = 24, stroke = 2, children, ...rest }, ref) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: stroke,\n className: `tabler-icon tabler-icon-${iconName}`,\n ...rest,\n },\n [...iconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...(children || [])],\n ),\n );\n\n Component.propTypes = {\n color: PropTypes.string,\n size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n stroke: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'adjustments-horizontal',\n 'IconAdjustmentsHorizontal',\n [\n ['path', { d: 'M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-0' }],\n ['path', { d: 'M4 6l8 0', key: 'svg-1' }],\n ['path', { d: 'M16 6l4 0', key: 'svg-2' }],\n ['path', { d: 'M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-3' }],\n ['path', { d: 'M4 12l2 0', key: 'svg-4' }],\n ['path', { d: 'M10 12l10 0', key: 'svg-5' }],\n ['path', { d: 'M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-6' }],\n ['path', { d: 'M4 18l11 0', key: 'svg-7' }],\n ['path', { d: 'M19 18l1 0', key: 'svg-8' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('alert-circle', 'IconAlertCircle', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M12 8v4', key: 'svg-1' }],\n ['path', { d: 'M12 16h.01', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach-off', 'IconBleachOff', [\n [\n 'path',\n {\n d: 'M5 19h14m1.986 -1.977a2 2 0 0 0 -.146 -.773l-7.1 -12.25a2 2 0 0 0 -3.5 0l-.815 1.405m-1.488 2.568l-4.797 8.277a2 2 0 0 0 1.75 2.75',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach', 'IconBleach', [\n [\n 'path',\n {\n d: 'M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('box-multiple', 'IconBoxMultiple', [\n [\n 'path',\n {\n d: 'M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('brackets-contain', 'IconBracketsContain', [\n ['path', { d: 'M7 4h-4v16h4', key: 'svg-0' }],\n ['path', { d: 'M17 4h4v16h-4', key: 'svg-1' }],\n ['path', { d: 'M8 16h.01', key: 'svg-2' }],\n ['path', { d: 'M12 16h.01', key: 'svg-3' }],\n ['path', { d: 'M16 16h.01', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket-off', 'IconBucketOff', [\n [\n 'path',\n {\n d: 'M5.029 5.036c-.655 .58 -1.029 1.25 -1.029 1.964c0 2.033 3.033 3.712 6.96 3.967m3.788 -.21c3.064 -.559 5.252 -2.029 5.252 -3.757c0 -2.21 -3.582 -4 -8 -4c-1.605 0 -3.1 .236 -4.352 .643',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.1 -.3 .252 -.812 .457 -1.535m.862 -3.146c.262 -.975 .735 -2.76 1.418 -5.354a7.45 7.45 0 0 0 .263 -1.965',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket', 'IconBucket', [\n ['path', { d: 'M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('calendar', 'IconCalendar', [\n [\n 'path',\n {\n d: 'M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M16 3v4', key: 'svg-1' }],\n ['path', { d: 'M8 3v4', key: 'svg-2' }],\n ['path', { d: 'M4 11h16', key: 'svg-3' }],\n ['path', { d: 'M11 15h1', key: 'svg-4' }],\n ['path', { d: 'M12 15v3', key: 'svg-5' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('check', 'IconCheck', [\n ['path', { d: 'M5 12l5 5l10 -10', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('checkbox', 'IconCheckbox', [\n ['path', { d: 'M9 11l3 3l8 -8', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('chevron-down', 'IconChevronDown', [\n ['path', { d: 'M6 9l6 6l6 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-minus', 'IconCircleMinus', [\n ['path', { d: 'M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12l6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-plus', 'IconCirclePlus', [\n ['path', { d: 'M20.987 12.497a9 9 0 1 0 -8.467 8.489', key: 'svg-0' }],\n ['path', { d: 'M16 19h6', key: 'svg-1' }],\n ['path', { d: 'M19 16v6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('cloud-upload', 'IconCloudUpload', [\n [\n 'path',\n {\n d: 'M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l3 -3l3 3', key: 'svg-1' }],\n ['path', { d: 'M12 12l0 9', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('columns', 'IconColumns', [\n ['path', { d: 'M4 6l5.5 0', key: 'svg-0' }],\n ['path', { d: 'M4 10l5.5 0', key: 'svg-1' }],\n ['path', { d: 'M4 14l5.5 0', key: 'svg-2' }],\n ['path', { d: 'M4 18l5.5 0', key: 'svg-3' }],\n ['path', { d: 'M14.5 6l5.5 0', key: 'svg-4' }],\n ['path', { d: 'M14.5 10l5.5 0', key: 'svg-5' }],\n ['path', { d: 'M14.5 14l5.5 0', key: 'svg-6' }],\n ['path', { d: 'M14.5 18l5.5 0', key: 'svg-7' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('copy', 'IconCopy', [\n [\n 'path',\n {\n d: 'M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('currency-dollar', 'IconCurrencyDollar', [\n [\n 'path',\n {\n d: 'M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M12 3v3m0 12v3', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('dots', 'IconDots', [\n ['path', { d: 'M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-0' }],\n ['path', { d: 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-1' }],\n ['path', { d: 'M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('edit', 'IconEdit', [\n [\n 'path',\n {\n d: 'M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M16 5l3 3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal-not', 'IconEqualNot', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n ['path', { d: 'M5 19l14 -14', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal', 'IconEqual', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-alert', 'IconFileAlert', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 17l.01 0', key: 'svg-2' }],\n ['path', { d: 'M12 11l0 3', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-plus', 'IconFilePlus', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 11l0 6', key: 'svg-2' }],\n ['path', { d: 'M9 14l6 0', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('filter', 'IconFilter', [\n [\n 'path',\n {\n d: 'M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('list-details', 'IconListDetails', [\n ['path', { d: 'M13 5h8', key: 'svg-0' }],\n ['path', { d: 'M13 9h5', key: 'svg-1' }],\n ['path', { d: 'M13 15h8', key: 'svg-2' }],\n ['path', { d: 'M13 19h5', key: 'svg-3' }],\n [\n 'path',\n {\n d: 'M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-4',\n },\n ],\n [\n 'path',\n {\n d: 'M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-5',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('logout', 'IconLogout', [\n [\n 'path',\n {\n d: 'M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12h12l-3 -3', key: 'svg-1' }],\n ['path', { d: 'M18 15l3 -3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-greater', 'IconMathGreater', [\n ['path', { d: 'M5 18l14 -6l-14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-lower', 'IconMathLower', [\n ['path', { d: 'M19 18l-14 -6l14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('message', 'IconMessage', [\n ['path', { d: 'M8 9h8', key: 'svg-0' }],\n ['path', { d: 'M8 13h6', key: 'svg-1' }],\n [\n 'path',\n {\n d: 'M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pin', 'IconPin', [\n [\n 'path',\n {\n d: 'M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-1' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pinned-off', 'IconPinnedOff', [\n ['path', { d: 'M3 3l18 18', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-2' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('plus', 'IconPlus', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M5 12l14 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('refresh', 'IconRefresh', [\n ['path', { d: 'M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4', key: 'svg-0' }],\n ['path', { d: 'M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('search', 'IconSearch', [\n ['path', { d: 'M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0', key: 'svg-0' }],\n ['path', { d: 'M21 21l-6 -6', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('settings', 'IconSettings', [\n [\n 'path',\n {\n d: 'M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-ascending', 'IconSortAscending', [\n ['path', { d: 'M4 6l7 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l9 0', key: 'svg-2' }],\n ['path', { d: 'M15 9l3 -3l3 3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-descending', 'IconSortDescending', [\n ['path', { d: 'M4 6l9 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l7 0', key: 'svg-2' }],\n ['path', { d: 'M15 15l3 3l3 -3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('square', 'IconSquare', [\n [\n 'path',\n {\n d: 'M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'switch-horizontal',\n 'IconSwitchHorizontal',\n [\n ['path', { d: 'M16 3l4 4l-4 4', key: 'svg-0' }],\n ['path', { d: 'M10 7l10 0', key: 'svg-1' }],\n ['path', { d: 'M8 13l-4 4l4 4', key: 'svg-2' }],\n ['path', { d: 'M4 17l9 0', key: 'svg-3' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('table-export', 'IconTableExport', [\n [\n 'path',\n {\n d: 'M12.5 21h-7.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v7.5',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 10h18', key: 'svg-1' }],\n ['path', { d: 'M10 3v18', key: 'svg-2' }],\n ['path', { d: 'M16 19h6', key: 'svg-3' }],\n ['path', { d: 'M19 16l3 3l-3 3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('trash', 'IconTrash', [\n ['path', { d: 'M4 7l16 0', key: 'svg-0' }],\n ['path', { d: 'M10 11l0 6', key: 'svg-1' }],\n ['path', { d: 'M14 11l0 6', key: 'svg-2' }],\n [\n 'path',\n { d: 'M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12', key: 'svg-3' },\n ],\n ['path', { d: 'M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('x', 'IconX', [\n ['path', { d: 'M18 6l-12 12', key: 'svg-0' }],\n ['path', { d: 'M6 6l12 12', key: 'svg-1' }],\n]);\n", "import { Center, Loader } from '@mantine/core';\nimport React from 'react';\n\nexport function Loading(): JSX.Element {\n return (\n <Center style={{ width: '100%', height: '100vh' }}>\n <Loader />\n </Center>\n );\n}\n", "import { Avatar, createStyles, Group, Header as MantineHeader, Menu, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { formatHumanName, getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { IconChevronDown, IconLogout, IconSettings, IconSwitchHorizontal } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { useMedplumContext } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { HeaderSearchInput } from './HeaderSearchInput';\n\nconst useStyles = createStyles((theme) => ({\n logoButton: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n user: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n userName: {\n fontWeight: 500,\n lineHeight: 1,\n marginRight: 3,\n\n [theme.fn.smallerThan('xs')]: {\n display: 'none',\n },\n },\n\n userActive: {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n}));\n\ninterface HeaderProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n logo: React.ReactNode;\n version?: string;\n navbarToggle: () => void;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const context = useMedplumContext();\n const { medplum, profile, navigate } = context;\n const logins = medplum.getLogins();\n const { classes, cx } = useStyles();\n const [userMenuOpened, setUserMenuOpened] = useState(false);\n\n return (\n <MantineHeader height={60} p={8} style={{ zIndex: 101 }}>\n <Group position=\"apart\">\n <Group spacing=\"xs\">\n <UnstyledButton className={classes.logoButton} onClick={props.navbarToggle}>\n {props.logo}\n </UnstyledButton>\n <HeaderSearchInput pathname={props.pathname} searchParams={props.searchParams} />\n </Group>\n\n <Menu\n width={260}\n shadow=\"xl\"\n position=\"bottom-end\"\n transitionProps={{ transition: 'pop-top-right' }}\n opened={userMenuOpened}\n onClose={() => setUserMenuOpened(false)}\n >\n <Menu.Target>\n <UnstyledButton\n className={cx(classes.user, { [classes.userActive]: userMenuOpened })}\n onClick={() => setUserMenuOpened((o) => !o)}\n >\n <Group spacing={7}>\n <ResourceAvatar value={profile} radius=\"xl\" size={24} />\n <Text size=\"sm\" className={classes.userName}>\n {formatHumanName(profile?.name?.[0] as HumanName)}\n </Text>\n <IconChevronDown size={12} stroke={1.5} />\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <Menu.Dropdown>\n <Stack align=\"center\" p=\"xl\">\n <ResourceAvatar size=\"xl\" radius={100} value={context.profile} />\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n <Text color=\"dimmed\" size=\"xs\">\n {medplum.getActiveLogin()?.project.display}\n </Text>\n </Stack>\n {logins.length > 1 && <Menu.Divider />}\n {logins.map(\n (login) =>\n login.profile.reference !== getReferenceString(context.profile as ProfileResource) && (\n <Menu.Item\n key={login.profile.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => window.location.reload())\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {login.profile.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {login.project.display}\n </Text>\n </div>\n </Group>\n </Menu.Item>\n )\n )}\n <Menu.Divider />\n <Menu.Item icon={<IconSwitchHorizontal size={14} stroke={1.5} />} onClick={() => navigate('/signin')}>\n Add another account\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} stroke={1.5} />}\n onClick={() => navigate(`/${getReferenceString(profile as ProfileResource)}`)}\n >\n Account settings\n </Menu.Item>\n <Menu.Item\n icon={<IconLogout size={14} stroke={1.5} />}\n onClick={async () => {\n await medplum.signOut();\n navigate('/signin');\n }}\n >\n Sign out\n </Menu.Item>\n <Text size=\"xs\" color=\"dimmed\" align=\"center\">\n {props.version}\n </Text>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </MantineHeader>\n );\n}\n", "import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n", "import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n", "import { Anchor, TextProps } from '@mantine/core';\nimport { isReference, isResource } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: React.MouseEventHandler;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n if (onClick) {\n onClick(e);\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if (isResource(to)) {\n return getResourceHref(to);\n } else if (isReference(to)) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n", "/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n", "import { deepEquals, isReference, isResource, MedplumClient, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @param setOutcome Optional callback to set the OperationOutcome.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(\n value: Reference<T> | T | undefined,\n setOutcome?: (outcome: OperationOutcome) => void\n): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n const setResourceIfChanged = useCallback(\n (r: T | undefined) => {\n if (!deepEquals(r, resource)) {\n setResource(r);\n }\n },\n [resource, setResource]\n );\n\n useEffect(() => {\n setResourceIfChanged(getInitialResource(medplum, value));\n }, [medplum, value, setResourceIfChanged]);\n\n useEffect(() => {\n let subscribed = true;\n\n if (isReference(value)) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResourceIfChanged(r);\n }\n })\n .catch((err) => {\n if (subscribed) {\n setResourceIfChanged(undefined);\n if (setOutcome) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }\n });\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value, setResourceIfChanged, setOutcome]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (value) {\n if (isResource(value)) {\n return value;\n }\n\n if (isReference(value)) {\n return medplum.getCachedReference(value as Reference<T>);\n }\n }\n\n return undefined;\n}\n", "import { createStyles, Group, Text } from '@mantine/core';\nimport { formatHumanName, getDisplayString, getReferenceString, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport { IconSearch } from '@tabler/icons-react';\nimport React, { forwardRef, useCallback } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum, useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nconst useStyles = createStyles(() => {\n return {\n searchInput: {\n input: {\n width: 220,\n transition: 'width 0.2s',\n },\n 'input:focus': {\n width: 400,\n },\n '@media (max-width: 800px)': {\n input: {\n width: 150,\n },\n 'input:focus': {\n width: 150,\n },\n },\n },\n };\n});\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nfunction toKey(resource: HeaderSearchTypes): string {\n return resource.id as string;\n}\n\nfunction toOption(resource: HeaderSearchTypes): AsyncAutocompleteOption<HeaderSearchTypes> {\n return {\n value: resource.id as string,\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport interface HeaderSearchInputProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const medplum = useMedplum();\n\n const loadData = useCallback(\n async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n const query = buildGraphQLQuery(input);\n const options = { signal };\n const response = (await medplum.graphql(query, undefined, undefined, options)) as SearchGraphQLResponse;\n return getResourcesFromResponse(response, input);\n },\n [medplum]\n );\n\n const handleSelect = useCallback(\n (item: HeaderSearchTypes[]): void => {\n if (item.length > 0) {\n navigate(`/${getReferenceString(item[0])}`);\n }\n },\n [navigate]\n );\n\n return (\n <AsyncAutocomplete\n key={`${props.pathname}?${props.searchParams}`}\n size=\"sm\"\n radius=\"md\"\n className={classes.searchInput}\n icon={<IconSearch size={16} />}\n placeholder=\"Search\"\n itemComponent={ItemComponent}\n toKey={toKey}\n toOption={toOption}\n onChange={handleSelect}\n loadOptions={loadData}\n maxSelectedValues={0}\n clearSearchOnChange\n clearable={false}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(\n ({ resource, ...others }: AsyncAutocompleteOption<HeaderSearchTypes>, ref) => {\n let helpText: string | undefined = undefined;\n\n if (resource.resourceType === 'Patient') {\n helpText = resource.birthDate;\n } else if (resource.resourceType === 'ServiceRequest') {\n helpText = resource.subject?.display;\n }\n\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{getDisplayString(resource)}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {helpText}\n </Text>\n </div>\n </Group>\n </div>\n );\n }\n);\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response The response from a search query.\n * @param query The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources The candidate resources.\n * @param query The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource The candidate resource.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str The candidate display string.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n", "import { Loader, MultiSelect, MultiSelectProps, SelectItem } from '@mantine/core';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { killEvent } from '../utils/dom';\n\nexport interface AsyncAutocompleteOption<T> extends SelectItem {\n resource: T;\n}\n\nexport interface AsyncAutocompleteProps<T>\n extends Omit<MultiSelectProps, 'data' | 'defaultValue' | 'loadOptions' | 'onChange' | 'onCreate' | 'searchable'> {\n defaultValue?: T | T[];\n toKey: (item: T) => string;\n toOption: (item: T) => AsyncAutocompleteOption<T>;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n onChange: (item: T[]) => void;\n onCreate?: (input: string) => T;\n creatable?: boolean;\n}\n\nexport function AsyncAutocomplete<T>(props: AsyncAutocompleteProps<T>): JSX.Element {\n const { defaultValue, toKey, toOption, loadOptions, onChange, onCreate, creatable, ...rest } = props;\n const defaultItems = toDefaultItems(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const [lastValue, setLastValue] = useState<string | undefined>(undefined);\n const [timer, setTimer] = useState<number>();\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n const [selected, setSelected] = useState<AsyncAutocompleteOption<T>[]>(defaultItems.map(toOption));\n const [options, setOptions] = useState<AsyncAutocompleteOption<T>[]>([]);\n\n const lastValueRef = useRef<string>();\n lastValueRef.current = lastValue;\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n const optionsRef = useRef<AsyncAutocompleteOption<T>[]>();\n optionsRef.current = options;\n\n const handleTimer = useCallback((): void => {\n setTimer(undefined);\n\n const value = inputRef.current?.value.trim() || '';\n if (value === lastValueRef.current) {\n // Nothing has changed, move on\n return;\n }\n\n setLastValue(value);\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n loadOptions(value, newAbortController.signal)\n .then((newValues: T[]) => {\n if (!newAbortController.signal.aborted) {\n setOptions(newValues.map(toOption));\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n if (newValues.length > 0) {\n onChange(newValues.slice(0, 1));\n }\n setAutoSubmit(false);\n }\n }\n })\n .catch((err) => {\n if (!(newAbortController.signal.aborted || err.message.includes('aborted'))) {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n }\n });\n }, [loadOptions, onChange, toOption]);\n\n const handleSearchChange = useCallback((): void => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }, [handleTimer]);\n\n const handleChange = useCallback(\n (values: string[]): void => {\n const result: T[] = [];\n const newSelected: AsyncAutocompleteOption<T>[] = [];\n for (const value of values) {\n let option = optionsRef.current?.find((option) => option.value === value);\n let item = option?.resource;\n if (!item && creatable !== false && onCreate) {\n item = onCreate(value);\n option = toOption(item);\n }\n\n if (item) {\n result.push(item);\n }\n\n if (option) {\n newSelected.push(option);\n }\n }\n onChange(result);\n setSelected(newSelected);\n },\n [creatable, onChange, onCreate, toOption]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent): void => {\n if (e.key === 'Enter') {\n if (!timerRef.current && !abortControllerRef.current) {\n killEvent(e);\n if (optionsRef.current && optionsRef.current.length > 0) {\n setOptions(optionsRef.current.slice(0, 1));\n handleChange([optionsRef.current[0].value]);\n }\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n },\n [handleChange]\n );\n\n const handleCreate = useCallback(\n (input: string): AsyncAutocompleteOption<T> => {\n const option = toOption((onCreate as (input: string) => T)(input));\n setOptions([...(optionsRef.current as AsyncAutocompleteOption<T>[]), option]);\n return option;\n },\n [onCreate, setOptions, toOption]\n );\n\n const handleFilter = useCallback((_value: string, selected: boolean) => !selected, []);\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return (\n <MultiSelect\n {...rest}\n ref={inputRef}\n defaultValue={defaultItems.map(toKey)}\n searchable\n onKeyDown={handleKeyDown}\n onSearchChange={handleSearchChange}\n data={[...selected, ...options]}\n onFocus={handleTimer}\n onChange={handleChange}\n onCreate={handleCreate}\n rightSectionWidth={40}\n rightSection={abortController ? <Loader size={16} /> : null}\n filter={handleFilter}\n creatable\n />\n );\n}\n\nfunction toDefaultItems<T>(defaultValue: T | T[] | undefined): T[] {\n if (!defaultValue) {\n return [];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue;\n }\n return [defaultValue];\n}\n", "import { Button, createStyles, Navbar as MantineNavbar, ScrollArea, Space, Text } from '@mantine/core';\nimport { IconPlus } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { BookmarkDialog } from '../BookmarkDialog/BookmarkDialog';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\n\nconst useStyles = createStyles((theme) => {\n return {\n menuTitle: {\n margin: '20px 0 4px 6px',\n fontSize: '9px',\n fontWeight: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '2px',\n },\n\n link: {\n ...theme.fn.focusStyles(),\n display: 'flex',\n alignItems: 'center',\n textDecoration: 'none',\n fontSize: theme.fontSizes.sm,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[7],\n padding: `8px 12px`,\n borderRadius: theme.radius.sm,\n fontWeight: 500,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n textDecoration: 'none',\n\n [`& svg`]: {\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n },\n },\n\n '& svg': {\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n marginRight: theme.spacing.sm,\n strokeWidth: 1.5,\n width: 18,\n height: 18,\n },\n },\n\n linkActive: {\n '&, &:hover': {\n backgroundColor: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).background,\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n [`& svg`]: {\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n },\n },\n },\n };\n});\n\nexport interface NavbarLink {\n icon?: JSX.Element;\n label?: string;\n href: string;\n}\n\nexport interface NavbarMenu {\n title?: string;\n links?: NavbarLink[];\n}\n\nexport interface NavbarProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n menus?: NavbarMenu[];\n closeNavbar: () => void;\n displayAddBookmark?: boolean;\n}\n\nexport function Navbar(props: NavbarProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const activeLink = getActiveLink(props.pathname, props.searchParams, props.menus);\n const [bookmarkDialogVisible, setBookmarkDialogVisible] = useState(false);\n\n function onLinkClick(e: React.SyntheticEvent, to: string): void {\n e.stopPropagation();\n e.preventDefault();\n navigate(to);\n if (window.innerWidth < 768) {\n props.closeNavbar();\n }\n }\n\n function navigateResourceType(resourceType: string | undefined): void {\n if (resourceType) {\n navigate(`/${resourceType}`);\n }\n }\n\n return (\n <>\n <MantineNavbar width={{ sm: 250 }} p=\"xs\">\n <ScrollArea>\n <MantineNavbar.Section mb=\"sm\">\n <CodeInput\n key={window.location.pathname}\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n property={{\n binding: {\n valueSet: 'https://medplum.com/fhir/ValueSet/resource-types',\n },\n }}\n onChange={(newValue) => navigateResourceType(newValue)}\n creatable={false}\n maxSelectedValues={0}\n clearSearchOnChange={true}\n clearable={false}\n />\n </MantineNavbar.Section>\n <MantineNavbar.Section grow>\n {props.menus?.map((menu) => (\n <React.Fragment key={`menu-${menu.title}`}>\n <Text className={classes.menuTitle}>{menu.title}</Text>\n {menu.links?.map((link) => (\n <NavbarLink\n key={link.href}\n to={link.href}\n active={link.href === activeLink?.href}\n onClick={(e) => onLinkClick(e, link.href)}\n >\n <NavLinkIcon to={link.href} icon={link.icon} />\n <span>{link.label}</span>\n </NavbarLink>\n ))}\n </React.Fragment>\n ))}\n {props.displayAddBookmark && (\n <Button\n variant=\"subtle\"\n size=\"xs\"\n mt=\"xl\"\n leftIcon={<IconPlus size=\"0.75rem\" />}\n onClick={() => setBookmarkDialogVisible(true)}\n >\n Add Bookmark\n </Button>\n )}\n </MantineNavbar.Section>\n </ScrollArea>\n </MantineNavbar>\n {props.pathname && props.searchParams && (\n <BookmarkDialog\n pathname={props.pathname}\n searchParams={props.searchParams}\n visible={bookmarkDialogVisible}\n onOk={() => setBookmarkDialogVisible(false)}\n onCancel={() => setBookmarkDialogVisible(false)}\n />\n )}\n </>\n );\n}\n\ninterface NavbarLinkProps {\n to: string;\n active: boolean;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}\n\nfunction NavbarLink(props: NavbarLinkProps): JSX.Element {\n const { classes, cx } = useStyles();\n return (\n <MedplumLink\n onClick={props.onClick}\n to={props.to}\n className={cx(classes.link, { [classes.linkActive]: props.active })}\n >\n {props.children}\n </MedplumLink>\n );\n}\n\ninterface NavLinkIconProps {\n to: string;\n icon?: JSX.Element;\n}\n\nfunction NavLinkIcon(props: NavLinkIconProps): JSX.Element {\n if (props.icon) {\n return props.icon;\n }\n return <Space w={30} />;\n}\n\n/**\n * Returns the best \"active\" link for the menu.\n * In most cases, the navbar links are simple, and an exact match can determine which link is active.\n * However, we ignore some search parameters to support pagination.\n * But we cannot ignore all search parameters, to support separate links based on search filters.\n * So in the end, we use a simple scoring system based on the number of matching query search params.\n * @param currentPathname The web browser current pathname.\n * @param currentSearchParams The web browser current search parameters.\n * @param menus Collection of navbar menus and links.\n * @returns The active link if one is found.\n */\nfunction getActiveLink(\n currentPathname: string | undefined,\n currentSearchParams: URLSearchParams | undefined,\n menus: NavbarMenu[] | undefined\n): NavbarLink | undefined {\n if (!currentPathname || !currentSearchParams || !menus) {\n return undefined;\n }\n\n let bestLink = undefined;\n let bestScore = 0;\n\n for (const menu of menus) {\n if (menu.links) {\n for (const link of menu.links) {\n const score = getLinkScore(currentPathname, currentSearchParams, link.href);\n if (score > bestScore) {\n bestScore = score;\n bestLink = link;\n }\n }\n }\n }\n\n return bestLink;\n}\n\n/**\n * Calculates a score for a link.\n * Zero means \"does not match at all\".\n * One means \"matches the pathname only\".\n * Additional increases for each matching search parameter.\n * Ignores pagination parameters \"_count\" and \"_offset\".\n * @param currentPathname The web browser current pathname.\n * @param currentSearchParams The web browser current search parameters.\n * @param linkHref A candidate link href.\n * @returns The link score.\n */\nfunction getLinkScore(currentPathname: string, currentSearchParams: URLSearchParams, linkHref: string): number {\n const linkUrl = new URL(linkHref, 'https://example.com');\n if (currentPathname !== linkUrl.pathname) {\n return 0;\n }\n const ignoredParams = ['_count', '_offset'];\n for (const [key, value] of linkUrl.searchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (currentSearchParams.get(key) !== value) {\n return 0;\n }\n }\n let count = 1;\n for (const [key, value] of currentSearchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (linkUrl.searchParams.get(key) === value) {\n count++;\n }\n }\n return count;\n}\n", "import { Button, Group, Modal, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { deepClone, normalizeErrorString } from '@medplum/core';\nimport { UserConfiguration } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\ninterface BookmarkDialogProps {\n pathname: string;\n searchParams: URLSearchParams;\n visible: boolean;\n onOk: () => void;\n onCancel: () => void;\n defaultValue?: string;\n}\nexport function BookmarkDialog(props: BookmarkDialogProps): JSX.Element | null {\n const medplum = useMedplum();\n const config = medplum.getUserConfiguration() as UserConfiguration;\n\n function submitHandler(formData: Record<string, string>): void {\n const { menuname, bookmarkname: name } = formData;\n const target = `${props.pathname}?${props.searchParams.toString()}`;\n const newConfig = deepClone(config) as UserConfiguration;\n const menu = newConfig.menu?.find(({ title }) => title === menuname);\n\n menu?.link?.push({ name, target });\n medplum\n .updateResource(newConfig)\n .then((res) => {\n // refresh current config menu\n config.menu = res.menu;\n medplum.dispatchEvent({ type: 'change' });\n showNotification({ color: 'green', message: 'Success' });\n props.onOk();\n })\n .catch((err: any) => {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n });\n }\n\n return (\n <Modal\n title=\"Add Bookmark\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <Form onSubmit={submitHandler}>\n <Stack>\n <SelectMenu config={config}></SelectMenu>\n <TextInput label=\"Bookmark Name\" type=\"text\" name=\"bookmarkname\" placeholder=\"bookmark name\" withAsterisk />\n <Group position=\"right\">\n <Button mt=\"sm\" type=\"submit\">\n OK\n </Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n );\n}\n\ninterface SelectMenuProps {\n config: UserConfiguration | undefined;\n}\n\nfunction SelectMenu(props: SelectMenuProps): JSX.Element {\n function userConfigToMenu(config: UserConfiguration | undefined): string[] {\n return config?.menu?.map((menu) => menu.title) as [];\n }\n const menus = userConfigToMenu(props.config);\n\n return (\n <NativeSelect\n name=\"menuname\"\n defaultValue={menus[0]}\n label=\"Select Menu Option\"\n placeholder=\"Menu\"\n data={menus}\n withAsterisk\n />\n );\n}\n", "import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n", "/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n * @returns Form values in key value pairs.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param result The result builder.\n * @param el The input element.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n", "import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n creatable?: boolean;\n maxSelectedValues?: number;\n clearSearchOnChange?: boolean;\n clearable?: boolean;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [value, setValue] = useState<string | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (props.onChange) {\n props.onChange(newCode);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={codeToValueSetElement(value)}\n onChange={handleChange}\n creatable={props.creatable}\n maxSelectedValues={props.maxSelectedValues ?? 1}\n clearSearchOnChange={props.clearSearchOnChange}\n clearable={props.clearable}\n />\n );\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n", "import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n elementDefinition: ElementDefinition;\n creatable?: boolean;\n clearable?: boolean;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n if (typeof element.code === 'string') {\n return element.code;\n }\n return JSON.stringify(element);\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n if (typeof item.display === 'string') {\n return item.display;\n }\n return toKey(item);\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: toKey(element),\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\n/**\n * A low-level component to autocomplete based on a FHIR Valueset.\n * This is the base component for CodeableConceptInput, CodingInput, and CodeInput.\n * @param props The ValueSetAutocomplete React props.\n * @returns The ValueSetAutocomplete React node.\n */\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { elementDefinition, creatable, clearable, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n if (!elementDefinition.binding) {\n return [];\n }\n const system = elementDefinition.binding.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input, { signal });\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, elementDefinition]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable={creatable ?? true}\n clearable={clearable ?? true}\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n onCreate={createValue}\n getCreateLabel={creatable === false ? undefined : (query: any) => `+ Create ${query}`}\n />\n );\n}\n", "import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values?.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n", "import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons-react';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n children(props: { onClick(e: React.MouseEvent): void }): React.ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: React.MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n * @param file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n", "import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n", "import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n const property = entry[1];\n if (!property.path) {\n property.path = typeName + '.' + key;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n", "export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n", "import { createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n display: 'grid',\n gridTemplateColumns: '30% 70%',\n margin: 0,\n\n '& > dt, & > dd': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n margin: 0,\n },\n },\n\n compact: {\n gridTemplateColumns: '20% 80%',\n\n '& > dt, & > dd': {\n padding: `0 ${theme.spacing.xs} ${theme.spacing.xs} 0`,\n border: 0,\n },\n },\n}));\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n const { classes, cx } = useStyles();\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n", "import {\n formatDateTime,\n formatPeriod,\n formatTiming,\n getElementDefinitionTypeName,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\nimport { ActionIcon, Box, CopyButton, Tooltip } from '@mantine/core';\nimport { IconCheck, IconCopy } from '@tabler/icons-react';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information.\n * @param props The ResourcePropertyDisplay React props.\n * @returns The ResourcePropertyDisplay React node.\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n const isIdProperty = property?.path?.endsWith('.id');\n if (isIdProperty) {\n return (\n <Box component=\"div\" sx={{ display: 'flex', gap: 3, alignItems: 'center' }}>\n {value}\n <CopyButton value={value} timeout={2000}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? 'Copied' : 'Copy'} withArrow position=\"right\">\n <ActionIcon color={copied ? 'teal' : 'gray'} onClick={copy}>\n {copied ? <IconCheck size=\"1rem\" /> : <IconCopy size=\"1rem\" />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n </Box>\n );\n }\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.string:\n return <div style={{ whiteSpace: 'pre-wrap' }}>{value}</div>;\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: getElementDefinitionTypeName(property), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n", "import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n", "import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n", "import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom) => (\n <ContactPointDisplay key={`telecom-${contactDetail.name}-${telecom.value}`} value={telecom} />\n ))}\n </>\n );\n}\n", "import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n", "import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n", "import { formatMoney } from '@medplum/core';\nimport { Money } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface MoneyDisplayProps {\n value?: Money;\n}\n\nexport function MoneyDisplay(props: MoneyDisplayProps): JSX.Element | null {\n return <>{formatMoney(props.value)}</>;\n}\n", "import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n", "import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n", "import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n / \n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n", "import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n", "import { Stack } from '@mantine/core';\nimport { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <Stack>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n const required = property.min !== undefined && property.min > 0;\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n withAsterisk={required}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n", "import { Group, Input } from '@mantine/core';\nimport React from 'react';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n withAsterisk?: boolean;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <Group noWrap>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n withAsterisk={props.withAsterisk}\n >\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n", "import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n withAsterisk?: boolean;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n withAsterisk={props.withAsterisk}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n", "import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n", "import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { capitalize, deepClone, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(deepClone(defaultValue));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={props.outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={props.outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n", "import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { capitalize, getElementDefinitionTypeName, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { MoneyInput } from '../MoneyInput/MoneyInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </Group>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n const required = property.min !== undefined && property.min > 0;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={value} onChange={props.onChange} outcome={props.outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Money:\n return <MoneyInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Duration:\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n case PropertyType.Timing:\n return <TimingInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementInput\n typeName={propertyType}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n default:\n return (\n <BackboneElementInput\n typeName={getElementDefinitionTypeName(property)}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n", "import { CodeableConcept, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const [value, setValue] = useState<CodeableConcept | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newConcept = valueSetElementToCodeableConcept(newValues);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codeableConceptToValueSetElement(value)}\n maxSelectedValues={1}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains[] | undefined {\n return concept.coding?.map((c) => ({\n system: c.system,\n code: c.code,\n display: c.display,\n }));\n}\n\nfunction valueSetElementToCodeableConcept(elements: ValueSetExpansionContains[]): CodeableConcept | undefined {\n if (elements.length === 0) {\n return undefined;\n }\n return {\n coding: elements.map((e) => ({\n system: e.system,\n code: e.code,\n display: e.display,\n })),\n };\n}\n", "import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n maxSelectedValues={1}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n onChange={(e) => setValue(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { isValidDate } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n autoFocus?: boolean;\n required?: boolean;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name}\n placeholder={props.placeholder}\n required={props.required}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n autoFocus={props.autoFocus}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @returns The input type for the current environment.\n */\nfunction getInputType(): string {\n return process.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n", "import { JsonInput } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-input\"\n defaultValue={stringify(props.defaultValue)}\n deserialize={JSON.parse}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n setValueWrapper({ ...valueRef.current, use: use || undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family || undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n defaultValue={value?.use}\n name={props.name + '-use'}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n />\n <TextInput\n placeholder=\"Prefix\"\n name={props.name + '-prefix'}\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Given\"\n name={props.name + '-given'}\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n />\n <TextInput\n name={props.name + '-family'}\n placeholder=\"Family\"\n defaultValue={value?.family}\n onChange={(e) => setFamily(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Suffix\"\n name={props.name + '-suffix'}\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n />\n </Group>\n );\n}\n", "import { NativeSelect, TextInput } from '@mantine/core';\nimport { Money } from '@medplum/fhirtypes';\nimport { IconCurrencyDollar } from '@tabler/icons-react';\nimport React, { useCallback, useState } from 'react';\n\n/*\n * Based on: https://github.com/mantinedev/ui.mantine.dev/blob/master/components/CurrencyInput/CurrencyInput.tsx\n */\n\n/**\n * List of currencies.\n *\n * Full list of currencies:\n * https://www.hl7.org/fhir/valueset-currencies.html\n *\n * Latest browsers can report list of supported currencies, but it's not widely supported:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/supportedValuesOf\n *\n * Using a short list for simplicity for now.\n */\nconst data = ['USD', 'EUR', 'CAD', 'GBP', 'AUD'];\n\nexport interface MoneyInputProps {\n name: string;\n label?: string;\n placeholder?: string;\n defaultValue?: Money;\n onChange?: (value: Money) => void;\n}\n\nexport function MoneyInput(props: MoneyInputProps): JSX.Element {\n const { onChange } = props;\n const [value, setValue] = useState(props.defaultValue);\n\n const setValueWrapper = useCallback(\n (newValue: Money): void => {\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const handleCurrencyChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n setValueWrapper({\n ...value,\n currency: e.currentTarget.value,\n });\n },\n [value, setValueWrapper]\n );\n\n const handleValueChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setValueWrapper({\n ...value,\n value: e.currentTarget.valueAsNumber,\n });\n },\n [value, setValueWrapper]\n );\n\n const select = (\n <NativeSelect\n defaultValue={value?.currency}\n data={data}\n styles={{\n input: {\n fontWeight: 500,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n width: 92,\n },\n }}\n onChange={handleCurrencyChange}\n />\n );\n\n return (\n <TextInput\n type=\"number\"\n label={props.label}\n placeholder={props.placeholder ?? 'Value'}\n defaultValue={value?.value?.toString() ?? 'USD'}\n icon={<IconCurrencyDollar size={14} />}\n rightSection={select}\n rightSectionWidth={92}\n onChange={handleValueChange}\n />\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React, { useState, WheelEvent } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n autoFocus?: boolean;\n onChange?: (value: Quantity) => void;\n disableWheel?: boolean;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name + '-value'}\n type=\"number\"\n placeholder=\"Value\"\n defaultValue={value?.value}\n autoFocus={props.autoFocus}\n step=\"any\"\n onWheel={(e: WheelEvent<HTMLInputElement>) => {\n if (props.disableWheel) {\n e.currentTarget.blur();\n }\n }}\n onChange={(e) => {\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n });\n }}\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n", "import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n autoFocus?: boolean;\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = getTargetTypes(props.targetTypes);\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getTargetTypes(targetTypes: string[] | undefined): string[] | undefined {\n if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {\n return undefined;\n }\n return targetTypes;\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n", "import { Group, Text } from '@mantine/core';\nimport { getDisplayString, getReferenceString } from '@medplum/core';\nimport { OperationOutcome, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { forwardRef, useCallback, useState } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Search parameter overrides for specific resource types.\n * Use this to specify the search parameter to use for a given resource type.\n * Otherwise it will fallback to \"name\" if the resource type is in NAME_RESOURCE_TYPES.\n * Otherwise it will fallback to \"_id\".\n */\nconst SEARCH_CODES: Record<string, string> = {\n Observation: 'code',\n User: 'email:contains',\n};\n\n/**\n * Resource types that should use the \"name\" search parameter.\n * This is the full list of resource types that have a \"name\" search parameter.\n * Otherwise it will fallback to \"_id\".\n */\nconst NAME_RESOURCE_TYPES = [\n 'AccessPolicy',\n 'Account',\n 'ActivityDefinition',\n 'Bot',\n 'CapabilityStatement',\n 'ClientApplication',\n 'CodeSystem',\n 'CompartmentDefinition',\n 'ConceptMap',\n 'EffectEvidenceSynthesis',\n 'Endpoint',\n 'EventDefinition',\n 'Evidence',\n 'EvidenceVariable',\n 'ExampleScenario',\n 'GraphDefinition',\n 'HealthcareService',\n 'ImplementationGuide',\n 'InsurancePlan',\n 'Library',\n 'Location',\n 'Measure',\n 'MedicinalProduct',\n 'MessageDefinition',\n 'NamingSystem',\n 'OperationDefinition',\n 'Organization',\n 'Patient',\n 'Person',\n 'PlanDefinition',\n 'Practitioner',\n 'Project',\n 'Questionnaire',\n 'RelatedPerson',\n 'ResearchDefinition',\n 'ResearchElementDefinition',\n 'RiskEvidenceSynthesis',\n 'SearchParameter',\n 'StructureDefinition',\n 'StructureMap',\n 'TerminologyCapabilities',\n 'TestScript',\n 'UserConfiguration',\n 'ValueSet',\n];\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: T['resourceType'];\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nfunction toOption<T extends Resource>(resource: T): AsyncAutocompleteOption<T> {\n return {\n value: getReferenceString(resource),\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element | null {\n const medplum = useMedplum();\n const resourceType = props.resourceType;\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const defaultValue = useResource(props.defaultValue, setOutcome);\n const onChange = props.onChange;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<T[]> => {\n const searchCode = getSearchParamForResourceType(resourceType);\n const searchParams = new URLSearchParams({\n [searchCode]: input,\n _count: '10',\n });\n\n const resources = await medplum.searchResources(resourceType, searchParams, { signal });\n return resources as unknown as T[];\n },\n [medplum, resourceType]\n );\n\n const handleChange = useCallback(\n (newResources: T[]) => {\n if (onChange) {\n onChange(newResources[0]);\n }\n },\n [onChange]\n );\n\n if (props.defaultValue && !outcome && !defaultValue) {\n // If a default value was specified, but the default resource is not loaded yet,\n // then return null to avoid rendering the input until the default resource is loaded.\n // The Mantine <MultiSelect> component does not reliably handle changes to defaultValue.\n return null;\n }\n\n return (\n <AsyncAutocomplete<T>\n name={props.name}\n itemComponent={ItemComponent}\n defaultValue={defaultValue}\n placeholder={props.placeholder}\n maxSelectedValues={1}\n toKey={getReferenceString}\n toOption={toOption}\n loadOptions={loadValues}\n onChange={handleChange}\n clearable\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ label, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{label}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n\n/**\n * Returns the search parameter to use for the given resource type.\n * If the resource type is in SEARCH_CODES, then that value is used.\n * Otherwise, if the resource type is in NAME_RESOURCE_TYPES, then \"name\" is used.\n * Otherwise, \"_id\" is used.\n * @param resourceType The FHIR resource type.\n * @returns The search parameter to use for the autocomplete input.\n */\nfunction getSearchParamForResourceType(resourceType: string): string {\n return SEARCH_CODES[resourceType] ?? (NAME_RESOURCE_TYPES.includes(resourceType) ? 'name' : '_id');\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { Button, Chip, Group, Modal, NativeSelect, Stack, Switch, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\ntype PeriodUnit = 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing | undefined>(props.defaultValue);\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nconst defaultValue: Timing = {\n repeat: {\n period: 1,\n periodUnit: 'd',\n },\n};\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || defaultValue);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat | undefined): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: PeriodUnit | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDaysOfWeek(newDaysOfWeek: DayOfWeek[] | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <Stack>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <Switch\n label=\"Repeat\"\n checked={!!value.repeat}\n onChange={(e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined)}\n />\n {value.repeat && (\n <>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value.repeat.period || 1}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value, 10) || 1)}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value.repeat.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as PeriodUnit | undefined)}\n data={[\n { label: 'second', value: 's' },\n { label: 'minute', value: 'min' },\n { label: 'hour', value: 'h' },\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n {value.repeat.periodUnit === 'wk' && (\n <FormSection title=\"Repeat on\">\n <Chip.Group multiple onChange={setDaysOfWeek as (v: string[] | undefined) => void}>\n <Group position=\"apart\" mt=\"md\" spacing=\"xs\">\n {daysOfWeek.map((day) => (\n <Chip key={day} value={day} size=\"xs\" radius=\"xl\">\n {day.charAt(0).toUpperCase()}\n </Chip>\n ))}\n </Group>\n </Chip.Group>\n </FormSection>\n )}\n </>\n )}\n <Group position=\"right\">\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n", "import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport React, { useMemo, useState } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n <\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n >\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "import { Container as MantineContainer, ContainerProps, createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles(() => ({\n root: {\n '@media (max-width: 800px)': {\n paddingLeft: 4,\n paddingRight: 4,\n },\n },\n}));\n\nexport function Container(props: ContainerProps): JSX.Element {\n const { children, ...others } = props;\n const { classes } = useStyles();\n\n return (\n <MantineContainer className={classes.root} {...others}>\n {children}\n </MantineContainer>\n );\n}\n", "import { MedplumClient } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory(resourceType, id),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n />\n );\n}\n", "import { ActionIcon, Center, createStyles, Group, Loader, Menu, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, MedplumClient, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { useMedplum, useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { Panel } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { useResource } from '../useResource/useResource';\nimport { sortByDateAndPriority } from '../utils/date';\n\nconst useStyles = createStyles((theme) => ({\n pinnedComment: {\n backgroundColor: theme.colors.blue[0],\n },\n}));\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n loadTimelineResources: (\n medplum: MedplumClient,\n resourceType: ResourceType,\n id: string\n ) => Promise<PromiseSettledResult<Bundle>[]>;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const medplum = useMedplum();\n const navigate = useMedplumNavigate();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const loadTimelineResources = props.loadTimelineResources;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n /**\n * Sorts and sets the items.\n *\n * Sorting is primarily a function of meta.lastUpdated, but there are special cases.\n * When displaying connected resources, for example a Communication in the context of an Encounter,\n * the Communication.sent time is used rather than Communication.meta.lastUpdated.\n *\n * Other examples of special cases:\n * - DiagnosticReport.issued\n * - Media.issued\n * - Observation.issued\n * - DocumentReference.date\n *\n * See \"sortByDateAndPriority()\" for more details.\n */\n const sortAndSetItems = useCallback(\n (newItmes: Resource[]): void => {\n sortByDateAndPriority(newItmes, resource);\n newItmes.reverse();\n setItems(newItmes);\n },\n [resource]\n );\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n const handleBatchResponse = useCallback(\n (batchResponse: PromiseSettledResult<Bundle>[]): void => {\n const newItems = [];\n\n for (const settledResult of batchResponse) {\n if (settledResult.status !== 'fulfilled') {\n // User may not have access to all resource types\n continue;\n }\n\n const bundle = settledResult.value;\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortAndSetItems(newItems);\n },\n [sortAndSetItems]\n );\n\n /**\n * Adds an array of resources to the timeline.\n * @param resource Resource to add.\n */\n const addResource = useCallback(\n (resource: Resource): void => sortAndSetItems([...itemsRef.current, resource]),\n [sortAndSetItems]\n );\n\n /**\n * Loads the timeline.\n */\n const loadTimeline = useCallback(() => {\n let resourceType: ResourceType;\n let id: string;\n if ('resourceType' in props.value) {\n resourceType = props.value.resourceType;\n id = props.value.id as string;\n } else {\n [resourceType, id] = props.value.reference?.split('/') as [ResourceType, string];\n }\n loadTimelineResources(medplum, resourceType, id).then(handleBatchResponse).catch(console.log);\n }, [medplum, props.value, loadTimelineResources, handleBatchResponse]);\n\n useEffect(() => loadTimeline(), [loadTimeline]);\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => addResource(result))\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResource(result))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Panel>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group spacing=\"xs\" noWrap style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Panel>\n )}\n {items.map((item) => {\n if (!item) {\n // TODO: Handle null history items for deleted versions.\n return null;\n }\n const key = `${item.resourceType}/${item.id}/${item.meta?.versionId}`;\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem key={key} history={history as Bundle} resource={item} onDetails={onVersionDetails} />\n );\n }\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n icon={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n icon={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n icon={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n icon={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n icon={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues forceUseInput />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const { classes } = useStyles();\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n dateTime={props.resource.sent}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n", "import { createStyles, Group, List, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatCodeableConcept, formatDateTime, formatObservationValue, isReference } from '@medplum/core';\nimport {\n Annotation,\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n Specimen,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NoteDisplay } from '../NoteDisplay/NoteDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n borderCollapse: 'collapse',\n\n '& td, & th': {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n padding: 4,\n },\n },\n\n criticalRow: {\n background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],\n border: `0.1px solid ${theme.colors.red[5]}`,\n color: theme.colors.red[5],\n fontWeight: 500,\n\n '& td': {\n border: `0.1px solid ${theme.colors.red[5]}`,\n },\n },\n\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n hideObservationNotes?: boolean;\n hideSpecimenInfo?: boolean;\n}\n\nDiagnosticReportDisplay.defaultProps = {\n hideObservationNotes: false,\n hideSpecimenInfo: false,\n} as DiagnosticReportDisplayProps;\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const diagnosticReport = useResource(props.value);\n const [specimens, setSpecimens] = useState<Specimen[]>();\n\n useEffect(() => {\n if (diagnosticReport?.specimen) {\n Promise.allSettled(diagnosticReport.specimen.map((ref) => medplum.readReference(ref)))\n .then((outcomes) =>\n outcomes\n .filter((outcome) => outcome.status === 'fulfilled')\n .map((outcome) => (outcome as PromiseFulfilledResult<Specimen>).value)\n )\n .then(setSpecimens)\n .catch(console.error);\n }\n }, [medplum, diagnosticReport]);\n\n if (!diagnosticReport) {\n return null;\n }\n\n const specimenNotes: Annotation[] = specimens?.flatMap((spec) => spec.note || []) || [];\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n specimenNotes.push({ text: window.atob(pf.data) });\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <DiagnosticReportHeader value={diagnosticReport} />\n {!props.hideSpecimenInfo && SpecimenInfo(specimens)}\n {diagnosticReport.result && (\n <ObservationTable hideObservationNotes={props.hideObservationNotes} value={diagnosticReport.result} />\n )}\n {specimenNotes.length > 0 && <NoteDisplay value={specimenNotes} />}\n </Stack>\n );\n}\n\ninterface DiagnosticReportHeaderProps {\n value: DiagnosticReport;\n}\n\nfunction DiagnosticReportHeader({ value }: DiagnosticReportHeaderProps): JSX.Element {\n return (\n <Group mt=\"md\" spacing={30}>\n {value.subject && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Subject\n </Text>\n <Text>\n <ResourceBadge value={value.subject} link={true} />\n </Text>\n </div>\n )}\n {value.resultsInterpreter?.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Interpreter\n </Text>\n <Text>\n <ResourceBadge value={interpreter} link={true} />\n </Text>\n </div>\n ))}\n {value.performer?.map((performer) => (\n <div key={performer.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Performer\n </Text>\n <Text>\n <ResourceBadge value={performer} link={true} />\n </Text>\n </div>\n ))}\n {value.issued && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(value.issued)}</Text>\n </div>\n )}\n {value.status && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(value.status)}</Text>\n </div>\n )}\n </Group>\n );\n}\n\nfunction SpecimenInfo(specimens: Specimen[] | undefined): JSX.Element {\n return (\n <Stack spacing={'xs'}>\n <Title order={2} size=\"h6\">\n Specimens\n </Title>\n\n <List type=\"ordered\">\n {specimens?.map((specimen) => (\n <List.Item ml={'sm'} key={`specimen-${specimen.id}`}>\n <Group spacing={20}>\n <Group spacing={5}>\n <Text fw={500}>Collected:</Text> {formatDateTime(specimen.collection?.collectedDateTime)}\n </Group>\n <Group spacing={5}>\n <Text fw={500}>Received:</Text> {formatDateTime(specimen.receivedTime)}\n </Group>\n </Group>\n </List.Item>\n ))}\n </List>\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n hideObservationNotes?: boolean;\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n const { classes } = useStyles();\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n <th>Category</th>\n <th>Performer</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation) => (\n <ObservationRow\n key={`obs-${isReference(observation) ? observation.reference : observation.id}`}\n hideObservationNotes={props.hideObservationNotes}\n value={observation}\n />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const { classes, cx } = useStyles();\n const observation = useResource(props.value);\n\n if (!observation) {\n return null;\n }\n const displayNotes = !props.hideObservationNotes && observation.note;\n\n const critical = isCritical(observation);\n\n return (\n <>\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td rowSpan={displayNotes ? 2 : 1}>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n <td>\n {observation.category && observation.category.length > 0 && (\n <ul>\n {observation.category.map((concept) => (\n <li key={`category-${formatCodeableConcept(concept)}`}>\n <CodeableConceptDisplay value={concept} />\n </li>\n ))}\n </ul>\n )}\n </td>\n <td>\n {observation.performer?.map((performer) => <ReferenceDisplay key={performer.reference} value={performer} />)}\n </td>\n <td>{observation.status && <StatusBadge status={observation.status} />}</td>\n </tr>\n {displayNotes && (\n <tr>\n <td colSpan={6}>\n <NoteDisplay value={observation.note} />\n </td>\n </tr>\n )}\n </>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n", "import { Blockquote, createStyles, Stack } from '@mantine/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface NoteDisplayProps {\n value?: Annotation[];\n}\n\nexport function NoteDisplay({ value }: NoteDisplayProps): JSX.Element | null {\n const { classes } = useStyles();\n if (!value) {\n return null;\n }\n\n return (\n <Stack justify=\"flex-start\" spacing=\"xs\">\n {value.map(\n (note) =>\n note.text && (\n <Blockquote\n key={`note-${note.text}`}\n classNames={{ cite: classes.noteCite, body: classes.noteBody, root: classes.noteRoot }}\n cite={note.authorReference?.display || note.authorString}\n icon={null}\n >\n {note.text}\n </Blockquote>\n )\n )}\n </Stack>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group spacing=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n", "import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const resource = useResource(value, setOutcome);\n let text: string;\n\n if (outcome && !isOk(outcome)) {\n text = `[${normalizeErrorString(outcome)}]`;\n } else if (resource) {\n text = getDisplayString(resource);\n } else {\n return null;\n }\n\n return link ? (\n <MedplumLink to={value} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n", "import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n corrected: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n", "import { createStyles, Paper, PaperProps, useComponentDefaultProps } from '@mantine/core';\nimport React from 'react';\n\nexport interface PanelStylesParams {\n width?: number;\n fill?: boolean;\n}\n\nconst useStyles = createStyles((theme, { width, fill }: PanelStylesParams) => ({\n paper: {\n maxWidth: width,\n margin: `${theme.spacing.xl} auto`,\n padding: fill ? 0 : theme.spacing.md,\n '@media (max-width: 800px)': {\n padding: fill ? 0 : 8,\n },\n '& img': {\n width: '100%',\n maxWidth: '100%',\n },\n '& video': {\n width: '100%',\n maxWidth: '100%',\n },\n },\n}));\n\nexport interface PanelProps extends PaperProps {\n width?: number;\n fill?: boolean;\n}\n\nconst defaultProps: Partial<PanelProps> = {\n shadow: 'xs',\n radius: 'md',\n withBorder: true,\n};\n\nexport function Panel(props: PanelProps): JSX.Element {\n const { className, children, width, fill, unstyled, ...others } = useComponentDefaultProps(\n 'Panel',\n defaultProps,\n props\n );\n const { classes, cx } = useStyles({ width, fill }, { name: 'Panel', unstyled });\n\n return (\n <Paper className={cx(classes.paper, className)} {...others}>\n {children}\n </Paper>\n );\n}\n", "import { createStyles } from '@mantine/core';\nimport { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n borderCollapse: 'collapse',\n width: '100%',\n\n '& tr': {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n '& th, & td': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n verticalAlign: 'top',\n },\n },\n\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema).catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className={classes.root}>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className={classes.removed}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className={classes.added}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n", "import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceTableProps {\n /**\n * The input value either as a resource or a reference.\n */\n value: Resource | Reference;\n\n /**\n * Optional flag to ignore missing values.\n * By default, missing values are displayed as empty strings.\n */\n ignoreMissingValues?: boolean;\n\n /**\n * Optional flag to force use the input value.\n * This is useful when you want to display a specific version of the resource,\n * and not use the latest version.\n */\n forceUseInput?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{\n type: value.resourceType,\n value: props.forceUseInput ? props.value : value,\n }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n", "import { ActionIcon, Group, Menu, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons-react';\nimport React from 'react';\nimport { Container } from '../Container/Container';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { Panel, PanelProps } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps extends PanelProps {\n resource: Resource;\n profile?: Reference;\n dateTime?: string;\n padding?: boolean;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const { resource, profile, padding, popupMenuItems, ...others } = props;\n const author = profile ?? resource.meta?.author;\n const dateTime = props.dateTime ?? resource.meta?.lastUpdated;\n\n return (\n <Panel data-testid=\"timeline-item\" fill={true} {...others}>\n <Group position=\"apart\" spacing={8} mx=\"xs\" my=\"sm\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName color=\"dark\" weight={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {formatDateTime(dateTime)}\n </MedplumLink>\n <Text component=\"span\" color=\"dimmed\" mx={8}>\n ·\n </Text>\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {padding && <div style={{ padding: '0 16px 16px 16px' }}>{props.children}</div>}\n {!padding && <>{props.children}</>}\n </ErrorBoundary>\n </Panel>\n );\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n * @param timelineResource Optional primary resource of a timeline view. If specified, the primary resource will be sorted by meta.lastUpdated descending.\n */\nexport function sortByDateAndPriority(resources: Resource[], timelineResource?: Resource): void {\n resources.sort((a: Resource, b: Resource): number => {\n const priority1 = getPriorityScore(a, timelineResource);\n const priority2 = getPriorityScore(b, timelineResource);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a, timelineResource) - getTime(b, timelineResource);\n });\n}\n\nfunction getPriorityScore(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use priority if not the primary resource of a timeline view.\n\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] ?? 0;\n }\n }\n return 0;\n}\n\nfunction getTime(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use special case timestamps if not the primary resource of a timeline view.\n\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n\nfunction isSameResourceType(a: Resource, b: Resource | undefined): boolean {\n return !!b && a.resourceType === b.resourceType && a.id === b.id;\n}\n", "import React from 'react';\nimport { Container } from '../Container/Container';\nimport { Panel, PanelProps } from '../Panel/Panel';\n\nexport function Document(props: PanelProps): JSX.Element {\n const { children, ...others } = props;\n return (\n <Container>\n <Panel {...others}>{children}</Panel>\n </Container>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n loadTimelineResources={async (medplum: MedplumClient, _resourceType: ResourceType, id: string) => {\n return Promise.allSettled([\n medplum.readHistory('Encounter', id),\n medplum.search('Communication', 'encounter=Encounter/' + id),\n medplum.search('Media', 'encounter=Encounter/' + id),\n ]);\n }}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, normalizeOperationOutcome, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface FhirPathTableField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: FhirPathTableField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n * @param props FhirPathTable React props.\n * @returns FhirPathTable React node.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .graphql(query)\n .then(setResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data.ResourceList.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data.ResourceList.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n", "import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n", "import {\n ActionIcon,\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconRefresh,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n * @param props The SearchControl React props.\n * @returns The SearchControl React node.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n const totalType = search.total ?? 'accurate';\n\n const loadResults = useCallback(\n (options?: RequestInit) => {\n setOutcome(undefined);\n\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: totalType, fields: undefined }),\n options\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n },\n [medplum, search, totalType, onLoad]\n );\n\n const refreshResults = useCallback(() => {\n setState({ ...stateRef.current, searchResponse: undefined });\n loadResults({ cache: 'reload' });\n }, [loadResults]);\n\n useEffect(() => {\n loadResults();\n }, [loadResults]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n const isAux = e.button === 1 || e.ctrlKey || e.metaKey;\n\n if (!isAux && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (isAux && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport ?? props.onExportCsv ?? props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema.types[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n <Group spacing={2}>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {`${totalType === 'estimate' ? '~' : ''}${lastResult.total?.toLocaleString()}`}\n </Text>\n )}\n <ActionIcon title=\"Refresh\" onClick={refreshResults}>\n <IconRefresh size=\"1.125rem\" />\n </ActionIcon>\n </Group>\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={state.filterDialogSearchParam?.code ? buildFieldNameString(state.filterDialogSearchParam.code) : ''}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue=\"\"\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter) => (\n <div key={`filter-${filter.code}-${filter.operator}-${filter.value}`}>\n {getOpString(filter.operator)}\n \n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset ?? 0) / (search.count ?? DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count ?? DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n", "import { Box, Button, Modal, Text } from '@mantine/core';\nimport React from 'react';\n\ninterface SearchExportDialogProps {\n visible: boolean;\n exportCsv?: () => void;\n exportTransactionBundle?: () => void;\n onCancel: () => void;\n}\n\nexport function SearchExportDialog(props: SearchExportDialogProps): JSX.Element | null {\n return (\n <Modal title=\"Export\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <Box display=\"flex\" sx={{ justifyContent: 'space-between' }}>\n {props.exportCsv && <ExportButton text=\"CSV\" exportLogic={props.exportCsv} onCancel={props.onCancel} />}\n {props.exportTransactionBundle && (\n <ExportButton\n text=\"Transaction Bundle\"\n exportLogic={props.exportTransactionBundle}\n onCancel={props.onCancel}\n />\n )}\n </Box>\n <Text sx={{ marginTop: '10px', marginLeft: '2px' }}>Limited to 1000 records</Text>\n </Modal>\n );\n}\n\ninterface ExportButtonProps {\n text: string;\n exportLogic: () => void;\n onCancel: () => void;\n}\n\nexport function ExportButton(props: ExportButtonProps): JSX.Element {\n return (\n <Button\n onClick={() => {\n props.exportLogic();\n props.onCancel();\n }}\n >\n {`Export as ${props.text}`}\n </Button>\n );\n}\n", "import { Button, Modal } from '@mantine/core';\nimport { globalSchema, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\ninterface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const availableRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleAvailableKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onAddField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleAvailableDoubleClick(): void {\n onAddField();\n }\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleSelectedKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onRemoveField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleSelectedDoubleClick(): void {\n onRemoveField();\n }\n\n /**\n * Handles a click on the \"Add\" button.\n * Moves the \"available\" selection into the \"selected\" list.\n */\n function onAddField(): void {\n const currentField = state.search.fields ?? [];\n const key = availableRef.current?.value;\n if (key) {\n const newFields = [...currentField, key];\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Remove\" button.\n * Moves the \"selected\" selection into the \"available\" list.\n */\n function onRemoveField(): void {\n const currentField = state.search.fields ?? [];\n const key = selectedRef.current?.value;\n if (key) {\n const newFields = [...currentField];\n newFields.splice(newFields.indexOf(key), 1);\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Up\" button.\n * Moves the selection up one position in the list.\n */\n function onMoveUp(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index <= 0) {\n return;\n }\n\n swapFields(newFields, index, index - 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Handles a click on the \"Down\" button.\n * Moves the selection down one position in the list.\n */\n function onMoveDown(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index >= newFields.length - 1) {\n return;\n }\n\n swapFields(newFields, index, index + 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Swaps two fields in the search.\n * @param fields The array of fields.\n * @param i The index of the first field.\n * @param j The index of the second field.\n */\n function swapFields(fields: string[], i: number, j: number): void {\n const temp = fields[i];\n fields[i] = fields[j];\n fields[j] = temp;\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const typeDef = globalSchema.types[resourceType];\n\n const selected = state.search.fields ?? [];\n const available = getFieldsList(typeDef)\n .filter((field) => !selected.includes(field))\n .sort((a, b) => a.localeCompare(b));\n\n return (\n <Modal title=\"Fields\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <div>\n <table style={{ margin: 'auto' }}>\n <thead>\n <tr>\n <th colSpan={2} align=\"center\">\n Available\n </th>\n <th colSpan={2} align=\"center\">\n Selected\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colSpan={2} align=\"center\">\n <select\n ref={availableRef}\n size={15}\n tabIndex={1}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleAvailableKeyDown(e)}\n onDoubleClick={() => handleAvailableDoubleClick()}\n data-testid=\"available\"\n >\n {available.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n <td colSpan={2} align=\"center\">\n <select\n ref={selectedRef}\n size={15}\n tabIndex={4}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleSelectedKeyDown(e)}\n onDoubleClick={() => handleSelectedDoubleClick()}\n data-testid=\"selected\"\n >\n {selected.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema The type definition.\n * @returns A list of fields/columns available for a resource type.\n */\nfunction getFieldsList(typeSchema: TypeSchema): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.properties)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (typeSchema.searchParams) {\n for (const code of Object.keys(typeSchema.searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(buildFieldNameString(code));\n }\n }\n }\n\n return result;\n}\n", "import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n identifier: 'identifier',\n iterate: 'iterate',\n};\n\n/**\n * Sets the array of filters.\n * @param definition The original search request.\n * @param filters The new filters.\n * @returns The updated search request.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n * @param definition The original search request.\n * @returns The updated search request.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n * @param definition The original search request.\n * @param code The field key name to clear filters.\n * @returns The updated search request.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters ?? []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n * @param definition The original search request.\n * @param field The field key name.\n * @param op The operation key name.\n * @param value The filter value.\n * @param opt_clear Optional flag to clear filters on the field.\n * @returns The updated search request.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value ?? '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields?.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n * @param definition The original search request.\n * @param index The filter index.\n * @returns The updated search request.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n * @param definition The original search request.\n * @param field The field key name.\n * @param delta The number of days from this day.\n * @returns The updated search request.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n * @param definition The original search request.\n * @param field The field key name.\n * @param delta The number of months from this month.\n * @returns The updated search request.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n * @param definition The original search request.\n * @param field The field key name.\n * @param d1 The start date.\n * @param d2 The end date.\n * @returns The updated search request.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n * @param definition The original search request.\n * @param field The field key name.\n * @param op The date/time operation.\n * @param value The date.\n * @returns The updated search request.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n * @param definition The original search request.\n * @param field The field key name.\n * @param value Optional boolean value. Default is true.\n * @returns The updated search request.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n * @param definition The original search request.\n * @param offset The offset number.\n * @returns The updated search request.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @returns The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n * @param definition The original search request.\n * @param sort The sort key.\n * @param desc Optional descending flag. Default is false.\n * @returns The updated search request.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n * @param definition The original search request.\n * @param key The field key name.\n * @returns The updated search request.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n * @param op The operation code.\n * @returns A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param field The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0]);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') ?? '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(resource: Resource, searchParam: SearchParameter): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n return (\n <>\n {value.map((v, index) => (\n <ResourcePropertyDisplay\n key={`${index}-${value.length}`}\n propertyType={v.type as PropertyType}\n value={v.value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n ))}\n </>\n );\n}\n", "import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, globalSchema, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = (globalSchema.types[resourceType].searchParams as Record<string, SearchParameter>) ?? {};\n const filters = search.filters || [];\n\n return (\n <Modal\n title=\"Filters\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n size={900}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={[\n '',\n ...Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })),\n ]}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && value.value && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n", "import {\n Filter,\n formatDateTime,\n getSearchParameterDetails,\n globalSchema,\n Operator,\n SearchParameterType,\n} from '@medplum/core';\nimport React from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType].searchParams?.[filter.code];\n if (searchParam) {\n if (\n searchParam.type === 'reference' &&\n (filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)\n ) {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n", "import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={props.defaultValue ? { reference: props.defaultValue } : undefined}\n targetTypes={props.searchParam.target}\n autoFocus={props.autoFocus}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return (\n <DateTimeInput\n name={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={props.onChange}\n />\n );\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n autoFocus={props.autoFocus}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n", "import { Button, Grid, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <Form onSubmit={onOk}>\n <Grid>\n <Grid.Col span={10}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Grid.Col>\n <Grid.Col span={2}>\n <Button onClick={onOk} fullWidth>\n OK\n </Button>\n </Grid.Col>\n </Grid>\n </Form>\n </Modal>\n );\n}\n", "import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons-react';\nimport React from 'react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>\n Before...\n </Menu.Item>\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item icon={<IconBracketsContain size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item icon={<IconCalendar size={14} />} onClick={() => props.onChange(addTodayFilter(props.search, code))}>\n Today\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>\n Less than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item icon={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item icon={<IconBleach size={14} />} onClick={() => props.onChange(addMissingFilter(props.search, code))}>\n Missing\n </Menu.Item>\n <Menu.Item\n icon={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n", "import { getSearchParameterDetails, globalSchema, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = globalSchema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinitions?.[0], searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n", "import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill ?? '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill ?? '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill ?? '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill ?? '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill ?? '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React from 'react';\n\nexport interface OperationOutcomeAlertProps {\n outcome?: OperationOutcome;\n issues?: OperationOutcomeIssue[];\n}\n\nexport function OperationOutcomeAlert(props: OperationOutcomeAlertProps): JSX.Element | null {\n const issues = props.outcome?.issue || props.issues;\n if (!issues || issues.length === 0) {\n return null;\n }\n return (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n const loadTimelineResources = useCallback((medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('Patient', id),\n medplum.search('Communication', { subject: ref, _count }),\n medplum.search('Device', { patient: ref, _count }),\n medplum.search('DeviceRequest', { patient: ref, _count }),\n medplum.search('DiagnosticReport', { subject: ref, _count }),\n medplum.search('Media', { subject: ref, _count }),\n medplum.search('ServiceRequest', { subject: ref, _count }),\n medplum.search('Task', { subject: ref, _count }),\n ]);\n }, []);\n\n return (\n <ResourceTimeline\n value={props.patient}\n loadTimelineResources={loadTimelineResources}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </Anchor>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @param existing Optional existing id which will update nextId.\n * @returns A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3), 10);\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n", "import { Anchor, Button, createStyles, NativeSelect, Textarea, TextInput, Title } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition, isResource as isResourceType } from '@medplum/core';\nimport {\n Coding,\n Extension,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\nimport { isChoiceQuestion, QuestionnaireItemType } from '../utils/questionnaire';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 4,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n onRepeatable?: (item: QuestionnaireItem) => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = isResourceType(props.item);\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n function toggleRepeatable(item: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.map((i) => (i === item ? { ...i, repeats: !i.repeats } : i)),\n });\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onChange={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {item.type === 'reference' && (\n <ReferenceProfiles item={item} onChange={(newOptions) => changeProperty('extension', newOptions)} />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} index={0} answers={{}} onChange={() => undefined} />}\n </>\n )}\n </div>\n {item.item?.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n onRepeatable={toggleRepeatable}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onChange={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem(createPage());\n }}\n >\n Add Page\n </Anchor>\n )}\n {editing && !isResource && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRepeatable) {\n props.onRepeatable(item);\n }\n }}\n >\n {item.repeats ? 'Remove Repeatable' : 'Make Repeatable'}\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n </>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </Anchor>\n </div>\n );\n}\n\ninterface ReferenceTypeProps {\n item: QuestionnaireItem;\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction ReferenceProfiles(props: ReferenceTypeProps): JSX.Element {\n const references = props.item.extension ?? [];\n const referenceProfiles =\n references.filter((e) => e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource') ?? [];\n return (\n <>\n {referenceProfiles.map((reference: Extension) => {\n return (\n <div key={reference.id}>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <TextInput\n key={reference.id}\n name=\"value[x]\"\n value={reference.valueCodeableConcept?.coding?.[0].code ?? ''}\n onChange={(e: any) => {\n e.preventDefault();\n const newReferences = [...references];\n const index = newReferences.findIndex((o) => o.id === reference.id);\n const coding = newReferences[index].valueCodeableConcept?.coding?.[0] ?? ([] as Coding);\n coding.display = e.target.value;\n coding.code = e.target.value;\n\n props.onChange(newReferences);\n }}\n />\n </div>\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(references.filter((r) => r.id !== reference.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...references,\n {\n id: generateId(),\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/fhir-types',\n display: '',\n code: '',\n },\n ],\n },\n },\n ]);\n }}\n >\n Add Resource\n </Anchor>\n </>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @param prefix The link ID prefix string.\n * @returns A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @returns A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n\nfunction createPage(): QuestionnaireItem {\n return {\n id: generateId(),\n linkId: generateLinkId('s'),\n type: 'group',\n text: `New Page`,\n extension: [\n {\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/questionnaire-item-control',\n code: 'page',\n },\n ],\n },\n } as Extension,\n ],\n } as QuestionnaireItem;\n}\n", "import {\n Anchor,\n Button,\n Checkbox,\n Group,\n NativeSelect,\n Radio,\n Stack,\n Stepper,\n Textarea,\n TextInput,\n Title,\n} from '@mantine/core';\nimport {\n capitalize,\n createReference,\n getExtension,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n evalFhirPathTyped,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n const [activePage, setActivePage] = useState(0);\n\n const numberOfPages = getNumberOfPages(questionnaire?.item ?? []);\n const nextStep = (): void => setActivePage((current) => (current >= numberOfPages ? current : current + 1));\n const prevStep = (): void => setActivePage((current) => (current <= 0 ? current : current - 1));\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n status: 'completed',\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n\n {questionnaire.item && (\n <QuestionnaireFormItemArray\n items={questionnaire.item}\n answers={answers}\n onChange={setItems}\n renderPages={numberOfPages > 1}\n activePage={activePage}\n />\n )}\n <Group position=\"right\" mt=\"xl\">\n <ButtonGroup\n activePage={activePage}\n numberOfPages={numberOfPages}\n nextStep={nextStep}\n prevStep={prevStep}\n submitButtonText={props.submitButtonText}\n />\n </Group>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n renderPages?: boolean;\n activePage?: number;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(responseId: string, newResponseItem: QuestionnaireResponseItem): void {\n const itemExists = responseItems.some((r) => r.id === responseId);\n let newResponseItems;\n if (itemExists) {\n newResponseItems = responseItems.map((r) => (r.id === responseId ? newResponseItem : r));\n } else {\n newResponseItems = [...responseItems, newResponseItem];\n }\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n const questionForm = props.items.map((item, index) => {\n if (props.renderPages) {\n return (\n <Stepper.Step label={item.text} key={item.linkId}>\n <QuestionnaireFormArrayContent\n key={`${item.linkId}-${index}`}\n item={item}\n index={index}\n answers={props.answers}\n responseItems={responseItems}\n setResponseItem={setResponseItem}\n />\n </Stepper.Step>\n );\n }\n return (\n <QuestionnaireFormArrayContent\n key={`${item.linkId}-${index}`}\n item={item}\n index={index}\n answers={props.answers}\n responseItems={responseItems}\n setResponseItem={setResponseItem}\n />\n );\n });\n\n if (props.renderPages) {\n return (\n <Stepper active={props.activePage ?? 0} allowNextStepsSelect={false}>\n {questionForm}\n </Stepper>\n );\n }\n return <Stack>{questionForm}</Stack>;\n}\n\ninterface QuestionnaireFormArrayContentProps {\n item: QuestionnaireItem;\n index: number;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n responseItems: QuestionnaireResponseItem[];\n setResponseItem: (responseId: string, newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nfunction QuestionnaireFormArrayContent(props: QuestionnaireFormArrayContentProps): JSX.Element | null {\n if (!isQuestionEnabled(props.item, props.answers)) {\n return null;\n }\n if (props.item.type === QuestionnaireItemType.display) {\n return <p key={props.item.linkId}>{props.item.text}</p>;\n }\n if (props.item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireRepeatWrapper\n key={props.item.linkId}\n item={props.item}\n answers={props.answers}\n responseItems={props.responseItems}\n onChange={(newResponseItem) => props.setResponseItem(newResponseItem.id as string, newResponseItem)}\n />\n );\n }\n return (\n <FormSection key={props.item.linkId} htmlFor={props.item.linkId} title={props.item.text ?? ''}>\n <QuestionnaireRepeatWrapper\n item={props.item}\n answers={props.answers}\n responseItems={props.responseItems}\n onChange={(newResponseItem) => props.setResponseItem(newResponseItem.id as string, newResponseItem)}\n />\n </FormSection>\n );\n}\n\nexport interface QuestionnaireRepeatWrapperProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n responseItems: QuestionnaireResponseItem[];\n onChange: (newResponseItem: QuestionnaireResponseItem, index?: number) => void;\n}\n\nexport function QuestionnaireRepeatWrapper(props: QuestionnaireRepeatWrapperProps): JSX.Element {\n const item = props.item;\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[], number?: number): void {\n const index = number ?? 0;\n const responses = props.responseItems.filter((r) => r.linkId === item.linkId);\n props.onChange({\n id: getResponseId(responses, index),\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <RepeatableGroup\n key={props.item.linkId}\n text={item.text ?? ''}\n item={item ?? []}\n answers={props.answers}\n onChange={onChangeItem}\n />\n );\n }\n return (\n <RepeatableItem item={props.item} key={props.item.linkId}>\n {({ index }: { index: number }) => <QuestionnaireFormItem {...props} index={index} />}\n </RepeatableItem>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n index: number;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n responseItems?: QuestionnaireResponseItem[];\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n const index = props.index;\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer, repeatedIndex?: number): void {\n const number = repeatedIndex ?? 0;\n const responses = props.responseItems?.filter((r) => r.linkId === item.linkId) ?? [];\n props.onChange({\n id: responses[0].id,\n linkId: item.linkId,\n text: item.text,\n answer: updateAnswerArray(responses[0]?.answer ?? [], number, newResponseAnswer),\n });\n }\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n switch (type) {\n case QuestionnaireItemType.boolean:\n return (\n <CheckboxFormSection key={props.item.linkId} title={props.item.text} htmlFor={props.item.linkId}>\n <Checkbox\n id={props.item.linkId}\n name={props.item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }, index)}\n />\n </CheckboxFormSection>\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber }, index)}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber }, index)}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue }, index)}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue }, index)}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n targetTypes={addTargetTypes(item)}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue }, index)}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue }, index)}\n disableWheel\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput\n name={name}\n item={item}\n initial={initial}\n onChangeAnswer={(e) => onChangeAnswer(e, index)}\n />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput\n name={name}\n item={item}\n initial={initial}\n onChangeAnswer={(e) => onChangeAnswer(e, index)}\n />\n );\n }\n default:\n return null;\n }\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\ninterface ButtonGroupProps {\n activePage: number;\n numberOfPages: number;\n submitButtonText?: string;\n nextStep: () => void;\n prevStep: () => void;\n}\n\nfunction ButtonGroup(props: ButtonGroupProps): JSX.Element {\n if (props.activePage === 0 && props.numberOfPages <= 0) {\n return <Button type=\"submit\">{props.submitButtonText ?? 'OK'}</Button>;\n } else if (props.activePage >= props.numberOfPages) {\n return (\n <>\n <Button onClick={props.prevStep}>Back</Button>\n <Button onClick={props.nextStep} type=\"submit\">\n {props.submitButtonText ?? 'OK'}\n </Button>\n </>\n );\n } else if (props.activePage === 0) {\n return (\n <>\n <Button onClick={props.nextStep}>Next</Button>\n </>\n );\n } else {\n return (\n <>\n <Button onClick={props.prevStep}>Back</Button>\n <Button onClick={props.nextStep}>Next</Button>\n </>\n );\n }\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n id: generateId(),\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nlet nextId = 1;\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n\n const enableBehavior = item.enableBehavior ?? 'any';\n\n for (const enableWhen of item.enableWhen) {\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n ) as TypedValue | undefined; // possibly undefined when question unanswered\n\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n ) as TypedValue;\n\n let match: boolean;\n\n const { operator } = enableWhen;\n\n // We handle exists separately since its so different in terms of comparisons than the other mathematical operators\n if (operator === 'exists') {\n // if actualAnswer is not undefined, then exists: true passes\n // if actualAnswer is undefined, then exists: false passes\n match = !!actualAnswer === expectedAnswer.value;\n } else if (actualAnswer === undefined) {\n match = false;\n } else {\n // `=` and `!=` should be treated as the FHIRPath `~` and `!~`\n // All other operators should be unmodified\n const fhirPathOperator = operator === '=' || operator === '!=' ? operator?.replace('=', '~') : operator;\n const [{ value }] = evalFhirPathTyped(`%actualAnswer ${fhirPathOperator} %expectedAnswer`, [actualAnswer], {\n actualAnswer,\n expectedAnswer,\n });\n match = value;\n }\n\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n\nfunction getNumberOfPages(items: QuestionnaireItem[]): number {\n const pages = items.filter((item) => {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl');\n return extension?.valueCodeableConcept?.coding?.[0]?.code === 'page';\n });\n return pages.length > 0 ? items.length : 0;\n}\n\nfunction addTargetTypes(item: QuestionnaireItem): string[] {\n if (item.type !== QuestionnaireItemType.reference) {\n return [];\n }\n const extensions = item.extension?.filter(\n (e) => e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource'\n );\n if (!extensions || extensions.length === 0) {\n return [];\n }\n const targets = extensions.map((e) => e.valueCodeableConcept?.coding?.[0]?.code) as string[];\n return targets;\n}\n\ninterface RepeatableGroupProps {\n item: QuestionnaireItem;\n text: string;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem[], index?: number) => void;\n}\n\nfunction RepeatableGroup(props: RepeatableGroupProps): JSX.Element | null {\n const [number, setNumber] = useState(1);\n const item = props.item;\n return (\n <>\n {[...Array(number)].map((_, i) => {\n return (\n <div key={i}>\n <h3>{props.text}</h3>\n <QuestionnaireFormItemArray\n items={item.item ?? []}\n answers={props.answers}\n onChange={(response) => props.onChange(response, i)}\n />\n </div>\n );\n })}\n {props.item.repeats && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Group</Anchor>}\n </>\n );\n}\n\ninterface RepeatableItemProps {\n item: QuestionnaireItem;\n children: (props: { index: number }) => JSX.Element;\n}\n\nfunction RepeatableItem(props: RepeatableItemProps): JSX.Element {\n const [number, setNumber] = useState(1);\n\n return (\n <>\n {[...Array(number)].map((_, i) => {\n return <React.Fragment key={`${props.item.linkId}-${i}`}>{props.children({ index: i })}</React.Fragment>;\n })}\n {props.item?.repeats && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Item</Anchor>}\n </>\n );\n}\n\nfunction updateAnswerArray(\n answers: QuestionnaireResponseItemAnswer[],\n index: number,\n newResponseAnswer: QuestionnaireResponseItemAnswer\n): QuestionnaireResponseItemAnswer[] {\n if (index < answers.length) {\n answers[index] = newResponseAnswer;\n return answers;\n } else {\n for (let i = answers.length; i < index; i++) {\n answers.push({});\n }\n answers.push(newResponseAnswer);\n return answers;\n }\n}\n\nfunction getResponseId(responses: QuestionnaireResponseItem[], index: number): string {\n if (responses.length === 0 || responses.length < index + 1) {\n return generateId();\n }\n return responses[index].id as string;\n}\n", "import { QuestionnaireItem } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n", "import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo', 'category'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return undefined;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId The reference range group ID.\n * @param changedInterval The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n <NativeSelect\n data={['', 'reference', 'critical', 'absolute']}\n label=\"Category: \"\n defaultValue={intervalGroup.filters.category}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n const newCategory: string | undefined = e.currentTarget.value;\n if (newCategory === '') {\n onChange(intervalGroup.id, { ...interval, category: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n category: newCategory as 'reference' | 'critical' | 'absolute',\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '', 10);\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals Array of reference range intervals.\n * @param setGroupId Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n `category=${interval.category}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n", "import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n", "import { createStyles } from '@mantine/core';\nimport { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n overflowX: 'auto',\n },\n\n root: {\n border: `0.1px solid ${theme.colors.gray[3]}`,\n borderCollapse: 'collapse',\n borderRadius: theme.radius.sm,\n borderSpacing: 0,\n fontSize: theme.fontSizes.xs,\n width: '100%',\n\n '& td': {\n padding: '2px 4px 0 4px',\n verticalAlign: 'top',\n whiteSpace: 'nowrap',\n },\n },\n\n startRow: {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n normalRow: {\n borderTop: 0,\n },\n\n author: {\n lineHeight: '10px',\n },\n\n dateTime: {\n borderRight: `0.1px solid ${theme.colors.gray[3]}`,\n lineHeight: '20px',\n },\n\n lineNumber: {\n backgroundColor: theme.colors.gray[1],\n border: 0,\n color: theme.colors.gray[5],\n fontFamily: theme.fontFamilyMonospace,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n textAlign: 'right',\n },\n\n line: {\n fontFamily: theme.fontFamilyMonospace,\n fontSize: theme.fontSizes.sm,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n },\n\n pre: {\n margin: 0,\n },\n}));\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n\n if (!resource) {\n return null;\n }\n\n const table = blame(value);\n\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n", "import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n", "/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path?.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n", "import { createStyles } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from '../utils/diff';\n\nconst useStyles = createStyles((theme) => ({\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n const { classes } = useStyles();\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n", "import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withBorder withColumnBorders>\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>{value.entry?.map((entry, index) => <HistoryRow key={'entry-' + index} entry={entry} />)}</tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <tr>\n <td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </td>\n <td>{formatDateTime(resource.meta?.lastUpdated)}</td>\n <td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n } else {\n return (\n <tr>\n <td colSpan={3}>{normalizeErrorString(response?.outcome)}</td>\n </tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n", "import { Button, createStyles, Stack, Text } from '@mantine/core';\nimport { getReferenceString } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { CalendarInput, getStartMonth } from '../CalendarInput/CalendarInput';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n display: 'flex',\n minHeight: 400,\n },\n\n info: {\n minWidth: 300,\n padding: 20,\n borderRight: `1px solid ${theme.colors.gray[3]}`,\n },\n\n selection: {\n minWidth: 300,\n padding: 20,\n },\n}));\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n useEffect(() => {\n if (schedule) {\n setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" weight={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n return new Date(Math.max(Date.now(), time)).toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, ResourceType, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('ServiceRequest', id),\n medplum.search('Communication', { 'based-on': ref, _count }),\n medplum.search('DiagnosticReport', { 'based-on': ref, _count }),\n medplum.search('Media', { 'based-on': ref, _count }),\n medplum.search('DocumentReference', { related: ref, _count }),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: React.ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, clientId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n clientId={clientId}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms of Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, Text, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: React.ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => {\n if (recaptchaSiteKey) {\n initRecaptcha(recaptchaSiteKey);\n }\n }, [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n let recaptchaToken = '';\n if (recaptchaSiteKey) {\n recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n }\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n clientId: props.clientId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{props.children}</Center>\n <OperationOutcomeAlert issues={issues} />\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms of Service</Anchor>.\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <Anchor href=\"https://policies.google.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://policies.google.com/terms\">Terms of Service</Anchor> apply.\n </Text>\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n", "import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n if (typeof window !== 'undefined') {\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n }\n\n return undefined;\n}\n", "/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n * @param onload Optional callback for the onload event.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload ?? null;\n head.appendChild(script);\n}\n", "import { createScriptTag } from './script';\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { BaseLoginRequest, LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { MfaForm } from './MfaForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly login?: string;\n readonly chooseScopes?: boolean;\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\n/**\n * The SignInForm component allows users to sign in to Medplum.\n *\n * \"Signing in\" is a multi-step process:\n * 1) Authentication - identify the user\n * 2) MFA - If MFA is enabled, prompt for MFA code\n * 3) Choose profile - If the user has multiple profiles, prompt to choose one\n * 4) Choose scope - If the user has multiple scopes, prompt to choose one\n * 5) Success - Return to the caller with either a code or a redirect\n * @param props The SignInForm React props.\n * @returns The SignInForm React node.\n */\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const {\n login: loginCode,\n chooseScopes,\n onSuccess,\n onForgotPassword,\n onRegister,\n onCode,\n ...baseLoginRequest\n } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [mfaRequired, setAuthenticatorRequired] = useState<boolean>(false);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n const handleCode = useCallback(\n (code: string): void => {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n },\n [medplum, onCode, onSuccess]\n );\n\n const handleAuthResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n setAuthenticatorRequired(!!response.mfaRequired);\n\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n },\n [chooseScopes, handleCode]\n );\n\n const handleScopeResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n handleCode(response.code as string);\n },\n [handleCode]\n );\n\n useEffect(() => {\n // Beware the race condition here\n // The `useMedplum` hook will return a new instance of the MedplumClient on login\n // We do not want to request the login status again in that case\n // Only request login status once\n if (loginCode && !login) {\n medplum\n .get('auth/login/' + loginCode)\n .then(handleAuthResponse)\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n }, [medplum, loginCode, login, handleAuthResponse]);\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n disableGoogleAuth={props.disableGoogleAuth}\n disableEmailAuth={props.disableEmailAuth}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (mfaRequired) {\n return <MfaForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n normalizeOperationOutcome,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, disableEmailAuth, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n {!disableEmailAuth && <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />}\n </>\n )}\n {!disableEmailAuth && (\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n )}\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n <div>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n </div>\n {!disableEmailAuth && <Button type=\"submit\">Next</Button>}\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack spacing=\"xl\">\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n", "import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title order={3}>Choose profile</Title>\n </Center>\n <OperationOutcomeAlert outcome={outcome} />\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n", "import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope ?? 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n", "import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,iBAAAA,OAAqB,gBAE9B,OAAOC,OAAW,QAMX,SAASC,GAAeC,EAAgD,CAC7E,IAAMC,EAAUD,EAAM,MACtB,OAAKC,EAIEH,GAAA,cAAAA,GAAA,cAAGD,GAAcI,CAAO,CAAE,EAHxB,IAIX,CCfA,OAAS,SAAAC,GAAO,gBAAAC,GAAc,aAAAC,OAAiB,gBAE/C,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAExC,SAASC,GAAQC,EAAkBC,EAAuB,CACxD,OAAOD,EAAQ,MAAQA,EAAQ,KAAK,OAASC,EAAQD,EAAQ,KAAKC,CAAK,EAAI,EAC7E,CAEA,SAASC,GAAQF,EAAkBC,EAAeE,EAAsB,CACtE,IAAMC,EAAiBJ,EAAQ,MAAQ,CAAC,EACxC,KAAOI,EAAK,QAAUH,GACpBG,EAAK,KAAK,EAAE,EAEd,OAAAA,EAAKH,CAAK,EAAIE,EACP,CAAE,GAAGH,EAAS,KAAAI,CAAK,CAC5B,CAQO,SAASC,GAAaC,EAAuC,CAClE,GAAM,CAACC,EAAOC,CAAQ,EAAIV,GAAkBQ,EAAM,cAAgB,CAAC,CAAC,EAE9DG,EAAWZ,GAAgB,EACjCY,EAAS,QAAUF,EAEnB,SAASG,EAAgBC,EAAyB,CAChDH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,SAASC,EAAOC,EAAyD,CACvEH,EAAgB,CAAE,GAAGD,EAAS,QAAS,IAAAI,CAAI,CAAC,CAC9C,CAEA,SAASC,EAAQC,EAA4C,CAC3DL,EAAgB,CAAE,GAAGD,EAAS,QAAS,KAAAM,CAAK,CAAC,CAC/C,CAEA,SAASC,EAASC,EAAqB,CACrCP,EAAgBR,GAAQO,EAAS,SAAW,CAAC,EAAG,EAAGQ,CAAK,CAAC,CAC3D,CAEA,SAASC,EAASC,EAAqB,CACrCT,EAAgBR,GAAQO,EAAS,SAAW,CAAC,EAAG,EAAGU,CAAK,CAAC,CAC3D,CAEA,SAASC,EAAQC,EAAoB,CACnCX,EAAgB,CAAE,GAAGD,EAAS,QAAS,KAAAY,CAAK,CAAC,CAC/C,CAEA,SAASC,EAASC,EAAqB,CACrCb,EAAgB,CAAE,GAAGD,EAAS,QAAS,MAAAc,CAAM,CAAC,CAChD,CAEA,SAASC,EAAcC,EAA0B,CAC/Cf,EAAgB,CAAE,GAAGD,EAAS,QAAS,WAAAgB,CAAW,CAAC,CACrD,CAEA,OACE7B,GAAA,cAACH,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BG,GAAA,cAACF,GAAA,CACC,cAAY,cACZ,aAAca,EAAM,IACpB,SAAWmB,GAAMd,EAAOc,EAAE,cAAc,KAAqD,EAC7F,KAAM,CAAC,GAAI,OAAQ,OAAQ,OAAQ,MAAO,SAAS,EACrD,EACA9B,GAAA,cAACF,GAAA,CACC,cAAY,eACZ,aAAca,EAAM,KACpB,SAAWmB,GAAMZ,EAAQY,EAAE,cAAc,KAAuC,EAChF,KAAM,CAAC,GAAI,SAAU,WAAY,MAAM,EACzC,EACA9B,GAAA,cAACD,GAAA,CACC,YAAY,SACZ,aAAcI,GAAQQ,EAAO,CAAC,EAC9B,SAAWmB,GAAMV,EAASU,EAAE,cAAc,KAAK,EACjD,EACA9B,GAAA,cAACD,GAAA,CACC,YAAY,SACZ,aAAcI,GAAQQ,EAAO,CAAC,EAC9B,SAAWmB,GAAMR,EAASQ,EAAE,cAAc,KAAK,EACjD,EACA9B,GAAA,cAACD,GAAA,CAAU,YAAY,OAAO,aAAcY,EAAM,KAAM,SAAWmB,GAAMN,EAAQM,EAAE,cAAc,KAAK,EAAG,EACzG9B,GAAA,cAACD,GAAA,CAAU,YAAY,QAAQ,aAAcY,EAAM,MAAO,SAAWmB,GAAMJ,EAASI,EAAE,cAAc,KAAK,EAAG,EAC5G9B,GAAA,cAACD,GAAA,CACC,YAAY,cACZ,aAAcY,EAAM,WACpB,SAAWmB,GAAMF,EAAcE,EAAE,cAAc,KAAK,EACtD,CACF,CAEJ,CCjGA,OAAS,aAAAC,OAAiB,gBAC1B,OAAS,mBAAAC,OAAuB,gBAEhC,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCHxC,OAAS,oBAAAC,OAAwB,yBAEjC,OAAOC,IAAS,iBAAAC,GAAe,cAAAC,GAAY,aAAAC,GAAW,WAAAC,GAAS,YAAAC,OAAgB,QAE/E,IAAMC,GAAeL,GAAc,MAAuC,EA0BnE,SAASM,GAAgBC,EAA0C,CACxE,IAAMC,EAAUD,EAAM,QAChBE,EAAWF,EAAM,UAAYG,GAE7B,CAACC,EAAOC,CAAQ,EAAIR,GAAS,CACjC,QAASI,EAAQ,WAAW,EAC5B,QAAS,EACX,CAAC,EAEDN,GAAU,IAAM,CACd,SAASW,GAAsB,CAC7BD,EAAS,CACP,GAAGD,EACH,QAASH,EAAQ,WAAW,CAC9B,CAAC,CACH,CAEA,OAAAA,EAAQ,iBAAiB,SAAUK,CAAa,EACzC,IAAML,EAAQ,oBAAoB,SAAUK,CAAa,CAClE,EAAG,CAACL,EAASG,CAAK,CAAC,EAEnBT,GAAU,IAAM,CACd,SAASW,GAAsB,CAC7Bf,GAAiB,CAAE,MAAO,MAAO,QAAS,0BAA2B,UAAW,EAAM,CAAC,CACzF,CACA,OAAAU,EAAQ,iBAAiB,UAAWK,CAAa,EAC1C,IAAML,EAAQ,oBAAoB,UAAWK,CAAa,CACnE,EAAG,CAACL,CAAO,CAAC,EAEZ,IAAMM,EAAiBX,GACrB,KAAO,CACL,GAAGQ,EACH,QAAAH,EACA,SAAAC,CACF,GACA,CAACE,EAAOH,EAASC,CAAQ,CAC3B,EAEA,OAAOV,GAAA,cAACM,GAAa,SAAb,CAAsB,MAAOS,GAAiBP,EAAM,QAAS,CACvE,CAMO,SAASQ,IAAoC,CAClD,OAAOd,GAAWI,EAAY,CAChC,CAOO,SAASW,GAA4B,CAC1C,OAAOD,GAAkB,EAAE,OAC7B,CAMO,SAASE,IAA8C,CAC5D,OAAOF,GAAkB,EAAE,QAC7B,CAOO,SAASG,IAAiD,CAC/D,OAAOH,GAAkB,EAAE,OAC7B,CAMA,SAASL,GAAgBS,EAAoB,CAC3C,OAAO,SAAS,OAAOA,CAAI,CAC7B,CDnGO,SAASC,GAAgBC,EAA0C,CACxE,IAAMC,EAASC,GAAkB,EAC3B,CAACC,EAAOC,CAAQ,EAAIC,GAAqBL,EAAM,cAAgB,CAAC,CAAC,EAEjEM,EAAWC,GAAmB,EACpCD,EAAS,QAAUH,EAEnB,SAASK,EAAQC,EAAoB,CACnC,IAAMC,EAAuBD,EACzB,CACE,KAAAA,EACA,gBAAiBR,GAAUU,GAAgBV,CAAM,EACjD,KAAM,IAAI,KAAK,EAAE,YAAY,CAC/B,EACA,CAAC,EAELG,EAASM,CAAQ,EACbV,EAAM,UACRA,EAAM,SAASU,CAAQ,CAE3B,CAEA,OACEE,GAAA,cAACC,GAAA,CACC,KAAMb,EAAM,KACZ,YAAY,kBACZ,aAAcG,EAAM,KACpB,SAAWW,GAAMN,EAAQM,EAAE,cAAc,KAAK,EAChD,CAEJ,CE1CA,OAAS,YAAYC,GAAiB,mBAAAC,OAAuB,gBAC7D,OAAOC,IAAS,YAAAC,GAAU,YAAAC,OAAgB,QCD1C,OAAS,SAAAC,OAAa,gBACtB,OAAS,wBAAAC,OAA4B,mGCDrC,IAAeC,GAAA,CACb,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,QAAS,YACT,KAAM,OACN,OAAQ,eACR,YAAa,EACb,cAAe,QACf,eAAgB,OAClB,olBCNAC,EAAe,CAACC,EAAUC,EAAgBC,IAAa,CACrD,IAAMC,EAAYC,GACd,CAACC,EAAsEC,IAAK,CAA3E,IAAAC,EAAAF,EAAE,CAAQ,MAAAG,EAAA,eAAgB,KAAAC,EAAO,GAAI,OAAAC,EAAS,EAAG,SAAAC,CAAjD,EAAAJ,EAA8DK,EAA9DC,GAAAN,EAA8D,CAA5D,QAAwB,OAAW,SAAY,UAAA,CAAA,EAC9C,OAAAO,GACI,MACAC,GAAAC,GAAAD,GAAA,CACE,IAAAT,CAAA,EACGW,EAFL,EAAA,CAGE,MAAOR,EACP,OAAQA,EACR,OAAQD,EACR,YAAaE,EACb,UAAW,2BAA2BV,CAAA,EACnC,CAAA,EAAAY,CAAA,EAEL,CAAC,GAAGV,EAAS,IAAI,CAAC,CAACgB,EAAKC,CAAK,IAAML,GAAcI,EAAKC,CAAK,CAAC,EAAG,GAAIR,GAAY,CAAA,CAAG,CAAA,CACtF,CAAA,EAGR,OAAAR,EAAU,UAAY,CACpB,MAAOiB,GAAU,OACjB,KAAMA,GAAU,UAAU,CAACA,GAAU,OAAQA,GAAU,MAAM,CAAC,EAC9D,OAAQA,GAAU,UAAU,CAACA,GAAU,OAAQA,GAAU,MAAM,CAAC,CAAA,EAGlEjB,EAAU,YAAc,GAAGF,CAAA,GAEpBE,CACT,EC/BA,IAAAkB,GAAeC,EACb,yBACA,4BACA,CACE,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,OAAA,CAAS,EACvE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,OAAA,CAAS,EACvE,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,OAAA,CAAS,EAC3C,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,OAAA,CAAS,EACxE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CACF,ECdA,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CAAC,OAAQ,CAAE,EAAG,uCAAwC,IAAK,OAAA,CAAS,EACpE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,OAAA,CAAS,EACvC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECJD,IAAAC,GAAeC,EAAqB,aAAc,gBAAiB,CACjE,CACE,OACA,CACE,EAAG,qIACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECTD,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CACE,OACA,CACE,EAAG,4FACH,IAAK,OACP,CACF,CACF,CAAC,ECRD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CACE,OACA,CACE,EAAG,kFACH,IAAK,OACP,CACF,EACA,CACE,OACA,CACE,EAAG,mEACH,IAAK,OACP,CACF,CACF,CAAC,ECfD,IAAAC,GAAeC,EAAqB,mBAAoB,sBAAuB,CAC7E,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,OAAA,CAAS,EAC5C,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,OAAA,CAAS,EAC7C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECND,IAAAC,GAAeC,EAAqB,aAAc,gBAAiB,CACjE,CACE,OACA,CACE,EAAG,yLACH,IAAK,OACP,CACF,EACA,CACE,OACA,CACE,EAAG,0LACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,EChBD,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,OAAA,CAAS,EACzE,CACE,OACA,CACE,EAAG,gJACH,IAAK,OACP,CACF,CACF,CAAC,ECTD,IAAAC,GAAeC,EAAqB,WAAY,eAAgB,CAC9D,CACE,OACA,CACE,EAAG,kFACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,OAAA,CAAS,EACvC,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,OAAA,CAAS,EACtC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,CAC1C,CAAC,ECbD,IAAAC,GAAeC,EAAqB,QAAS,YAAa,CACxD,CAAC,OAAQ,CAAE,EAAG,mBAAoB,IAAK,OAAA,CAAS,CAClD,CAAC,ECFD,IAAAC,GAAeC,EAAqB,WAAY,eAAgB,CAC9D,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CACE,OACA,CACE,EAAG,mEACH,IAAK,OACP,CACF,CACF,CAAC,ECTD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,OAAA,CAAS,CAC/C,CAAC,ECFD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,OAAA,CAAS,EAC1E,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,CAC3C,CAAC,ECHD,IAAAC,GAAeC,EAAqB,cAAe,iBAAkB,CACnE,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,OAAA,CAAS,EACrE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,CAC1C,CAAC,ECJD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CACE,OACA,CACE,EAAG,mEACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECVD,IAAAC,GAAeC,EAAqB,UAAW,cAAe,CAC5D,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,OAAA,CAAS,EAC3C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,OAAA,CAAS,EAC3C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,OAAA,CAAS,EAC3C,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,OAAA,CAAS,EAC7C,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,CAChD,CAAC,ECTD,IAAAC,GAAeC,EAAqB,OAAQ,WAAY,CACtD,CACE,OACA,CACE,EAAG,+EACH,IAAK,OACP,CACF,EACA,CACE,OACA,CACE,EAAG,+DACH,IAAK,OACP,CACF,CACF,CAAC,ECfD,IAAAC,GAAeC,EAAqB,kBAAmB,qBAAsB,CAC3E,CACE,OACA,CACE,EAAG,kFACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,CAChD,CAAC,ECTD,IAAAC,GAAeC,EAAqB,OAAQ,WAAY,CACtD,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,OAAA,CAAS,EACvE,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,OAAA,CAAS,EACxE,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,OAAA,CAAS,CAC1E,CAAC,ECJD,IAAAC,GAAeC,EAAqB,OAAQ,WAAY,CACtD,CACE,OACA,CACE,EAAG,6DACH,IAAK,OACP,CACF,EACA,CACE,OACA,CACE,EAAG,yEACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,CAC3C,CAAC,EChBD,IAAAC,GAAeC,EAAqB,YAAa,eAAgB,CAC/D,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,OAAA,CAAS,CAC9C,CAAC,ECJD,IAAAC,GAAeC,EAAqB,QAAS,YAAa,CACxD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,CAC1C,CAAC,ECHD,IAAAC,GAAeC,EAAqB,aAAc,gBAAiB,CACjE,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,OAAA,CAAS,EACvD,CACE,OACA,CACE,EAAG,yEACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,OAAA,CAAS,EAC5C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECXD,IAAAC,GAAeC,EAAqB,YAAa,eAAgB,CAC/D,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,OAAA,CAAS,EACvD,CACE,OACA,CACE,EAAG,yEACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,CAC3C,CAAC,ECXD,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CACE,OACA,CACE,EAAG,0GACH,IAAK,OACP,CACF,CACF,CAAC,ECRD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,OAAA,CAAS,EACvC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,OAAA,CAAS,EACvC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CACE,OACA,CACE,EAAG,+EACH,IAAK,OACP,CACF,EACA,CACE,OACA,CACE,EAAG,gFACH,IAAK,OACP,CACF,CACF,CAAC,ECnBD,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CACE,OACA,CACE,EAAG,kFACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,OAAA,CAAS,CAC7C,CAAC,ECVD,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CAAC,OAAQ,CAAE,EAAG,qBAAsB,IAAK,OAAA,CAAS,CACpD,CAAC,ECFD,IAAAC,GAAeC,EAAqB,aAAc,gBAAiB,CACjE,CAAC,OAAQ,CAAE,EAAG,sBAAuB,IAAK,OAAA,CAAS,CACrD,CAAC,ECFD,IAAAC,GAAeC,EAAqB,UAAW,cAAe,CAC5D,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,OAAA,CAAS,EACtC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,OAAA,CAAS,EACvC,CACE,OACA,CACE,EAAG,2FACH,IAAK,OACP,CACF,CACF,CAAC,ECVD,IAAAC,GAAeC,EAAqB,MAAO,UAAW,CACpD,CACE,OACA,CACE,EAAG,wDACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,OAAA,CAAS,CACjD,CAAC,ECVD,IAAAC,GAAeC,EAAqB,aAAc,gBAAiB,CACjE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CACE,OACA,CACE,EAAG,wGACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,OAAA,CAAS,CACjD,CAAC,ECXD,IAAAC,GAAeC,EAAqB,OAAQ,WAAY,CACtD,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECHD,IAAAC,GAAeC,EAAqB,UAAW,cAAe,CAC5D,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,OAAA,CAAS,EACxE,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,OAAA,CAAS,CACvE,CAAC,ECHD,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,OAAA,CAAS,EAC1E,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,OAAA,CAAS,CAC9C,CAAC,ECHD,IAAAC,GAAeC,EAAqB,WAAY,eAAgB,CAC9D,CACE,OACA,CACE,EAAG,8gBACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,qCAAsC,IAAK,OAAA,CAAS,CACpE,CAAC,ECTD,IAAAC,GAAeC,EAAqB,iBAAkB,oBAAqB,CACzE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECND,IAAAC,GAAeC,EAAqB,kBAAmB,qBAAsB,CAC3E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,OAAA,CAAS,EAC/C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,ECND,IAAAC,GAAeC,EAAqB,SAAU,aAAc,CAC1D,CACE,OACA,CACE,EAAG,kFACH,IAAK,OACP,CACF,CACF,CAAC,ECRD,IAAAC,GAAeC,EACb,oBACA,uBACA,CACE,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,OAAA,CAAS,EAC9C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,CAC3C,CACF,ECTA,IAAAC,GAAeC,EAAqB,eAAgB,kBAAmB,CACrE,CACE,OACA,CACE,EAAG,wEACH,IAAK,OACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,OAAA,CAAS,EACxC,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,OAAA,CAAS,CACjD,CAAC,ECZD,IAAAC,GAAeC,EAAqB,QAAS,YAAa,CACxD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,OAAA,CAAS,EACzC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,EAC1C,CACE,OACA,CAAE,EAAG,iDAAkD,IAAK,OAAQ,CACtE,EACA,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,OAAA,CAAS,CAC1E,CAAC,ECTD,IAAAC,GAAeC,EAAqB,IAAK,QAAS,CAChD,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,OAAA,CAAS,EAC5C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,OAAA,CAAS,CAC5C,CAAC,E7CDD,OAAOC,OAAqC,QAcrC,IAAMC,GAAN,cAA4BD,GAAM,SAAkD,CAGzF,YAAYE,EAA2B,CACrC,MAAMA,CAAK,EACX,KAAK,MAAQ,CAAC,CAChB,CAEA,OAAO,yBAAyBC,EAAgC,CAC9D,MAAO,CAAE,MAAAA,CAAM,CACjB,CAEA,kBAAkBA,EAAcC,EAA4B,CAC1D,QAAQ,MAAM,kBAAmBD,EAAOC,CAAS,CACnD,CAEA,QAAoB,CAClB,OAAI,KAAK,MAAM,MAEXJ,GAAA,cAACK,GAAA,CAAM,KAAML,GAAA,cAACM,GAAA,CAAgB,KAAM,GAAI,EAAI,MAAM,uBAAuB,MAAM,OAC5EC,GAAqB,KAAK,MAAM,KAAK,CACxC,EAIG,KAAK,MAAM,QACpB,CACF,E8C5CA,OAAS,UAAAC,GAAQ,UAAAC,OAAc,gBAC/B,OAAOC,OAAW,QAEX,SAASC,IAAuB,CACrC,OACED,GAAA,cAACF,GAAA,CAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,GAC9CE,GAAA,cAACD,GAAA,IAAO,CACV,CAEJ,CCTA,OAAS,UAAAG,GAAQ,gBAAAC,GAAc,SAAAC,GAAO,UAAUC,GAAe,QAAAC,GAAM,SAAAC,GAAO,QAAAC,GAAM,kBAAAC,OAAsB,gBACxG,OAAS,mBAAAC,GAAiB,sBAAAC,OAA2C,gBAGrE,OAAOC,GAAS,YAAAC,OAAgB,QCJhC,OAAS,mBAAAC,OAA+C,gBAExD,OAAOC,OAAW,QAOX,SAASC,GAAiBC,EAAkD,CACjF,IAAMC,EAAOD,EAAM,MACnB,OAAKC,EAIEH,GAAA,cAAAA,GAAA,cAAGD,GAAgBI,EAAMD,EAAM,OAAO,CAAE,EAHtC,IAIX,CChBA,OAAS,UAAAE,OAA2B,gBACpC,OAAS,oBAAAC,GAAkB,eAAAC,OAAmB,gBAE9C,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAyB,gBAClC,OAAS,eAAAC,GAAa,cAAAC,OAAkB,gBAExC,OAAOC,OAAW,QCGX,SAASC,EAAU,EAAuC,CAC/D,EAAE,eAAe,EACjB,EAAE,gBAAgB,CACpB,CAQO,SAASC,GAAeC,EAAsB,CACnD,GAAIC,GAAkBD,CAAE,EACtB,MAAO,GAGT,GAAIA,aAAc,qBAAsB,CACtC,IAAME,EAAWF,EAAG,SACpB,GAAIE,EAAS,SAAW,GAAKD,GAAkBC,EAAS,CAAC,CAAC,EACxD,MAAO,EAEX,CAEA,MAAO,EACT,CAEA,SAASD,GAAkBD,EAAsB,CAC/C,OAAOA,aAAc,kBAAoBA,EAAG,OAAS,UACvD,CDnBO,SAASG,GAAYC,EAAsC,CAChE,IAAMC,EAAWC,GAAmB,EAC9B,CAAE,GAAAC,EAAI,OAAAC,EAAQ,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,GAAGC,CAAK,EAAIR,EAEtDS,EAAOC,GAAQP,CAAE,EACrB,OAAIC,IACFK,GAAQ,IAAML,GAIdO,GAAA,cAACC,GAAA,CACC,KAAMH,EACN,aAAYJ,EACZ,QAAUQ,GAAwB,CAChCC,EAAUD,CAAC,EACPP,EACFA,EAAQO,CAAC,EACAV,GACTF,EAASQ,CAAI,CAEjB,EACC,GAAGD,GAEHD,CACH,CAEJ,CAEA,SAASG,GAAQP,EAAuD,CACtE,GAAIA,EAAI,CACN,GAAI,OAAOA,GAAO,SAChB,OAAOY,GAAcZ,CAAE,EAClB,GAAIa,GAAWb,CAAE,EACtB,OAAOc,GAAgBd,CAAE,EACpB,GAAIe,GAAYf,CAAE,EACvB,OAAOgB,GAAiBhB,CAAE,CAE9B,CACA,MAAO,GACT,CAEA,SAASY,GAAcZ,EAAoB,CACzC,OAAIA,EAAG,WAAW,SAAS,GAAKA,EAAG,WAAW,UAAU,GAAKA,EAAG,WAAW,GAAG,EACrEA,EAEF,IAAMA,CACf,CAEA,SAASc,GAAgBd,EAAsB,CAC7C,MAAO,IAAIA,EAAG,YAAY,IAAIA,EAAG,EAAE,EACrC,CAEA,SAASgB,GAAiBhB,EAAuB,CAC/C,MAAO,IAAIA,EAAG,SAAS,EACzB,CErEA,OAAS,cAAAiB,GAAY,eAAAC,GAAa,cAAAC,GAA2B,6BAAAC,OAAiC,gBAE9F,OAAS,eAAAC,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QAU1C,SAASC,EACdC,EACAC,EACe,CACf,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAAUC,CAAW,EAAIC,GAAwBC,GAAmBL,EAASF,CAAK,CAAC,EAEpFQ,EAAuBC,GAC1BC,GAAqB,CACfC,GAAWD,EAAGN,CAAQ,GACzBC,EAAYK,CAAC,CAEjB,EACA,CAACN,EAAUC,CAAW,CACxB,EAEA,OAAAO,GAAU,IAAM,CACdJ,EAAqBD,GAAmBL,EAASF,CAAK,CAAC,CACzD,EAAG,CAACE,EAASF,EAAOQ,CAAoB,CAAC,EAEzCI,GAAU,IAAM,CACd,IAAIC,EAAa,GAEjB,OAAIC,GAAYd,CAAK,GACnBE,EACG,cAAcF,CAAqB,EACnC,KAAMU,GAAM,CACPG,GACFL,EAAqBE,CAAC,CAE1B,CAAC,EACA,MAAOK,GAAQ,CACVF,IACFL,EAAqB,MAAS,EAC1BP,GACFA,EAAWe,GAA0BD,CAAG,CAAC,EAG/C,CAAC,EAGG,IAAOF,EAAa,EAC9B,EAAG,CAACX,EAASE,EAAUJ,EAAOQ,EAAsBP,CAAU,CAAC,EAExDG,CACT,CAWA,SAASG,GACPL,EACAF,EACe,CACf,GAAIA,EAAO,CACT,GAAIiB,GAAWjB,CAAK,EAClB,OAAOA,EAGT,GAAIc,GAAYd,CAAK,EACnB,OAAOE,EAAQ,mBAAmBF,CAAqB,CAE3D,CAGF,CHvEO,SAASkB,GAAeC,EAAyC,CACtE,IAAMC,EAAWC,EAAYF,EAAM,KAAK,EAClCG,EAAOF,EAAWG,GAAiBH,CAAQ,EAAID,EAAM,KAAO,GAC5DK,GAAYJ,GAAYK,GAAYL,CAAQ,IAAMD,EAAM,IACxDO,EAASP,EAAM,QAAU,KAEzBQ,EAAc,CAAE,GAAGR,CAAM,EAI/B,OAHA,OAAOQ,EAAY,MACnB,OAAOA,EAAY,KAEfR,EAAM,KAENS,GAAA,cAACC,GAAA,CAAY,GAAIT,GACfQ,GAAA,cAACE,GAAA,CAAO,IAAKN,EAAU,IAAKF,EAAM,OAAQI,EAAS,GAAGC,EAAa,CACrE,EAIGC,GAAA,cAACE,GAAA,CAAO,IAAKN,EAAU,IAAKF,EAAM,OAAQI,EAAS,GAAGC,EAAa,CAC5E,CI/BA,OAAS,gBAAAI,GAAc,SAAAC,GAAO,QAAAC,OAAY,gBAC1C,OAAS,mBAAAC,GAAiB,oBAAAC,GAAkB,sBAAAC,GAAoB,UAAAC,OAAc,gBAG9E,OAAOC,IAAS,cAAAC,GAAY,eAAAC,OAAmB,QCJ/C,OAAS,UAAAC,GAAQ,eAAAC,OAAiD,gBAClE,OAAOC,IAAS,eAAAC,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAChE,OAAS,oBAAAC,OAAwB,yBACjC,OAAS,wBAAAC,OAA4B,gBAkB9B,SAASC,GAAqBC,EAA+C,CAClF,GAAM,CAAE,aAAAC,EAAc,MAAAC,EAAO,SAAAC,EAAU,YAAAC,EAAa,SAAAC,EAAU,SAAAC,EAAU,UAAAC,EAAW,GAAGC,CAAK,EAAIR,EACzFS,EAAeC,GAAeT,CAAY,EAC1CU,EAAWC,GAAyB,IAAI,EACxC,CAACC,EAAWC,CAAY,EAAIC,GAA6B,MAAS,EAClE,CAACC,EAAOC,CAAQ,EAAIF,GAAiB,EACrC,CAACG,EAAiBC,CAAkB,EAAIJ,GAA0B,EAClE,CAACK,EAAYC,CAAa,EAAIN,GAAkB,EAChD,CAACO,EAAUC,CAAW,EAAIR,GAAuCN,EAAa,IAAIN,CAAQ,CAAC,EAC3F,CAACqB,EAASC,EAAU,EAAIV,GAAuC,CAAC,CAAC,EAEjEW,GAAed,GAAe,EACpCc,GAAa,QAAUb,EAEvB,IAAMc,GAAWf,GAAe,EAChCe,GAAS,QAAUX,EAEnB,IAAMY,EAAqBhB,GAAwB,EACnDgB,EAAmB,QAAUV,EAE7B,IAAMW,GAAgBjB,GAAgB,EACtCiB,GAAc,QAAUT,EAExB,IAAMU,EAAalB,GAAqC,EACxDkB,EAAW,QAAUN,EAErB,IAAMO,EAAcC,GAAY,IAAY,CAC1Cf,EAAS,MAAS,EAElB,IAAMgB,EAAQtB,EAAS,SAAS,MAAM,KAAK,GAAK,GAChD,GAAIsB,IAAUP,GAAa,QAEzB,OAGFZ,EAAamB,CAAK,EAElB,IAAMC,GAAqB,IAAI,gBAC/Bf,EAAmBe,EAAkB,EAErC9B,EAAY6B,EAAOC,GAAmB,MAAM,EACzC,KAAMC,IAAmB,CACnBD,GAAmB,OAAO,UAC7BT,GAAWU,GAAU,IAAIhC,CAAQ,CAAC,EAClCgB,EAAmB,MAAS,EACxBU,GAAc,UACZM,GAAU,OAAS,GACrB9B,EAAS8B,GAAU,MAAM,EAAG,CAAC,CAAC,EAEhCd,EAAc,EAAK,GAGzB,CAAC,EACA,MAAOe,IAAQ,CACRF,GAAmB,OAAO,SAAWE,GAAI,QAAQ,SAAS,SAAS,GACvEC,GAAiB,CAAE,MAAO,MAAO,QAASC,GAAqBF,EAAG,CAAE,CAAC,CAEzE,CAAC,CACL,EAAG,CAAChC,EAAaC,EAAUF,CAAQ,CAAC,EAE9BoC,GAAqBP,GAAY,IAAY,CAC7CJ,EAAmB,UACrBA,EAAmB,QAAQ,MAAM,EACjCT,EAAmB,MAAS,GAG1BQ,GAAS,UAAY,QACvB,OAAO,aAAaA,GAAS,OAAO,EAGtC,IAAMa,EAAW,OAAO,WAAW,IAAMT,EAAY,EAAG,GAAG,EAC3Dd,EAASuB,CAAQ,CACnB,EAAG,CAACT,CAAW,CAAC,EAEVU,GAAeT,GAClBU,GAA2B,CAC1B,IAAMC,GAAc,CAAC,EACfC,GAA4C,CAAC,EACnD,QAAWX,MAASS,EAAQ,CAC1B,IAAIG,GAASf,EAAW,SAAS,KAAMe,IAAWA,GAAO,QAAUZ,EAAK,EACpEa,GAAOD,IAAQ,SACf,CAACC,IAAQvC,IAAc,IAASD,IAClCwC,GAAOxC,EAAS2B,EAAK,EACrBY,GAAS1C,EAAS2C,EAAI,GAGpBA,IACFH,GAAO,KAAKG,EAAI,EAGdD,IACFD,GAAY,KAAKC,EAAM,CAE3B,CACAxC,EAASsC,EAAM,EACfpB,EAAYqB,EAAW,CACzB,EACA,CAACrC,EAAWF,EAAUC,EAAUH,CAAQ,CAC1C,EAEM4C,GAAgBf,GACnBgB,GAAiC,CAC5BA,EAAE,MAAQ,UACR,CAACrB,GAAS,SAAW,CAACC,EAAmB,SAC3CqB,EAAUD,CAAC,EACPlB,EAAW,SAAWA,EAAW,QAAQ,OAAS,IACpDL,GAAWK,EAAW,QAAQ,MAAM,EAAG,CAAC,CAAC,EACzCW,GAAa,CAACX,EAAW,QAAQ,CAAC,EAAE,KAAK,CAAC,IAK5CT,EAAc,EAAI,EAGxB,EACA,CAACoB,EAAY,CACf,EAEMS,EAAelB,GAClBmB,GAA8C,CAC7C,IAAMN,GAAS1C,EAAUG,EAAkC6C,CAAK,CAAC,EACjE,OAAA1B,GAAW,CAAC,GAAIK,EAAW,QAA0Ce,EAAM,CAAC,EACrEA,EACT,EACA,CAACvC,EAAUmB,GAAYtB,CAAQ,CACjC,EAEMiD,EAAepB,GAAY,CAACqB,EAAgB/B,KAAsB,CAACA,GAAU,CAAC,CAAC,EAErF,OAAAgC,GAAU,IACD,IAAM,CACP1B,EAAmB,SACrBA,EAAmB,QAAQ,MAAM,CAErC,EACC,CAAC,CAAC,EAGH2B,GAAA,cAACC,GAAA,CACE,GAAGhD,EACJ,IAAKG,EACL,aAAcF,EAAa,IAAIP,CAAK,EACpC,WAAU,GACV,UAAW6C,GACX,eAAgBR,GAChB,KAAM,CAAC,GAAGjB,EAAU,GAAGE,CAAO,EAC9B,QAASO,EACT,SAAUU,GACV,SAAUS,EACV,kBAAmB,GACnB,aAAchC,EAAkBqC,GAAA,cAACE,GAAA,CAAO,KAAM,GAAI,EAAK,KACvD,OAAQL,EACR,UAAS,GACX,CAEJ,CAEA,SAAS1C,GAAkBT,EAAwC,CACjE,OAAKA,EAGD,MAAM,QAAQA,CAAY,EACrBA,EAEF,CAACA,CAAY,EALX,CAAC,CAMZ,CDhLA,IAAMyD,GAAYC,GAAa,KACtB,CACL,YAAa,CACX,MAAO,CACL,MAAO,IACP,WAAY,YACd,EACA,cAAe,CACb,MAAO,GACT,EACA,4BAA6B,CAC3B,MAAO,CACL,MAAO,GACT,EACA,cAAe,CACb,MAAO,GACT,CACF,CACF,CACF,EACD,EAUD,SAASC,GAAMC,EAAqC,CAClD,OAAOA,EAAS,EAClB,CAEA,SAASC,GAASD,EAAyE,CACzF,MAAO,CACL,MAAOA,EAAS,GAChB,MAAOE,GAAiBF,CAAQ,EAChC,SAAAA,CACF,CACF,CAOO,SAASG,GAAkBC,EAA4C,CAC5E,GAAM,CAAE,QAAAC,CAAQ,EAAIR,GAAU,EACxBS,EAAWC,GAAmB,EAC9BC,EAAUC,EAAW,EAErBC,EAAWC,GACf,MAAOC,EAAeC,IAAsD,CAC1E,IAAMC,EAAQC,GAAkBH,CAAK,EAC/BI,EAAU,CAAE,OAAAH,CAAO,EACnBI,EAAY,MAAMT,EAAQ,QAAQM,EAAO,OAAW,OAAWE,CAAO,EAC5E,OAAOE,GAAyBD,EAAUL,CAAK,CACjD,EACA,CAACJ,CAAO,CACV,EAEMW,EAAeR,GAClBS,GAAoC,CAC/BA,EAAK,OAAS,GAChBd,EAAS,IAAIe,GAAmBD,EAAK,CAAC,CAAC,CAAC,EAAE,CAE9C,EACA,CAACd,CAAQ,CACX,EAEA,OACEgB,GAAA,cAACC,GAAA,CACC,IAAK,GAAGnB,EAAM,QAAQ,IAAIA,EAAM,YAAY,GAC5C,KAAK,KACL,OAAO,KACP,UAAWC,EAAQ,YACnB,KAAMiB,GAAA,cAACE,GAAA,CAAW,KAAM,GAAI,EAC5B,YAAY,SACZ,cAAeC,GACf,MAAO1B,GACP,SAAUE,GACV,SAAUkB,EACV,YAAaT,EACb,kBAAmB,EACnB,oBAAmB,GACnB,UAAW,GACb,CAEJ,CAEA,IAAMe,GAAgBC,GACpB,CAAC,CAAE,SAAA1B,EAAU,GAAG2B,CAAO,EAA+CC,IAAQ,CAC5E,IAAIC,EAEJ,OAAI7B,EAAS,eAAiB,UAC5B6B,EAAW7B,EAAS,UACXA,EAAS,eAAiB,mBACnC6B,EAAW7B,EAAS,SAAS,SAI7BsB,GAAA,cAAC,OAAI,IAAKM,EAAM,GAAGD,GACjBL,GAAA,cAACQ,GAAA,CAAM,OAAM,IACXR,GAAA,cAACS,GAAA,CAAe,MAAO/B,EAAU,EACjCsB,GAAA,cAAC,WACCA,GAAA,cAACU,GAAA,KAAM9B,GAAiBF,CAAQ,CAAE,EAClCsB,GAAA,cAACU,GAAA,CAAK,KAAK,KAAK,MAAM,UACnBH,CACH,CACF,CACF,CACF,CAEJ,CACF,EAEA,SAASd,GAAkBH,EAAuB,CAChD,IAAMqB,EAAU,KAAK,UAAUrB,CAAK,EACpC,OAAIsB,GAAOtB,CAAK,EACP;AAAA,oCACyBqB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAaXA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWhC,QAAQ,OAAQ,GAAG,EAEjB;AAAA,mCAC0BA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAaDA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAaXA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWvC,QAAQ,OAAQ,GAAG,CACxB,CAUA,SAASf,GAAyBD,EAAiCH,EAAoC,CACrG,IAAMqB,EAAY,CAAC,EACnB,OAAIlB,EAAS,KAAK,WAChBkB,EAAU,KAAK,GAAGlB,EAAS,KAAK,SAAS,EAEvCA,EAAS,KAAK,WAChBkB,EAAU,KAAK,GAAGlB,EAAS,KAAK,SAAS,EAEvCA,EAAS,KAAK,oBAChBkB,EAAU,KAAK,GAAGlB,EAAS,KAAK,kBAAkB,EAE7CmB,GAAgBC,GAAgBF,CAAS,EAAGrB,CAAK,EAAE,MAAM,EAAG,CAAC,CACtE,CAOA,SAASuB,GAAgBF,EAAqD,CAC5E,IAAMG,EAAM,IAAI,IACVC,EAAS,CAAC,EAEhB,QAAWvC,KAAYmC,EAChBG,EAAI,IAAItC,EAAS,EAAY,IAChCsC,EAAI,IAAItC,EAAS,EAAY,EAC7BuC,EAAO,KAAKvC,CAAQ,GAIxB,OAAOuC,CACT,CAQA,SAASH,GAAgBD,EAAgCrB,EAAoC,CAC3F,OAAOqB,EAAU,KAAK,CAACK,EAAsBC,IACpCC,GAAiBD,EAAG3B,CAAK,EAAI4B,GAAiBF,EAAG1B,CAAK,CAC9D,CACH,CASA,SAAS4B,GAAiB1C,EAA6Bc,EAAuB,CAC5E,IAAI6B,EAAY,EAEhB,GAAI3C,EAAS,WACX,QAAW4C,KAAc5C,EAAS,WAChC2C,EAAY,KAAK,IAAIA,EAAWE,GAAeD,EAAW,MAAO9B,CAAK,CAAC,EAI3E,GAAId,EAAS,eAAiB,WAAaA,EAAS,KAClD,QAAW8C,KAAQ9C,EAAS,KAC1B2C,EAAY,KAAK,IAAIA,EAAWE,GAAeE,GAAgBD,CAAI,EAAGhC,CAAK,CAAC,EAIhF,OAAO6B,CACT,CASA,SAASE,GAAeG,EAAyBlC,EAAuB,CACtE,GAAI,CAACkC,EACH,MAAO,GAET,IAAMC,EAAQD,EAAI,YAAY,EAAE,QAAQlC,EAAM,YAAY,CAAC,EAC3D,OAAImC,EAAQ,EACH,EAEF,IAAMA,CACf,CN3RA,IAAMC,GAAYC,GAAcC,IAAW,CACzC,WAAY,CACV,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAChD,aAAcA,EAAM,OAAO,GAC3B,WAAY,8BAEZ,UAAW,CACT,gBAAiBA,EAAM,GAAG,QACxBA,EAAM,GAAG,QAAQ,CAAE,QAAS,SAAU,MAAOA,EAAM,YAAa,CAAC,EAAE,WACnE,EACF,CACF,CACF,EAEA,KAAM,CACJ,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAChD,aAAcA,EAAM,OAAO,GAC3B,WAAY,8BAEZ,UAAW,CACT,gBAAiBA,EAAM,GAAG,QACxBA,EAAM,GAAG,QAAQ,CAAE,QAAS,SAAU,MAAOA,EAAM,YAAa,CAAC,EAAE,WACnE,EACF,CACF,CACF,EAEA,SAAU,CACR,WAAY,IACZ,WAAY,EACZ,YAAa,EAEb,CAACA,EAAM,GAAG,YAAY,IAAI,CAAC,EAAG,CAC5B,QAAS,MACX,CACF,EAEA,WAAY,CACV,gBAAiBA,EAAM,GAAG,QACxBA,EAAM,GAAG,QAAQ,CAAE,QAAS,SAAU,MAAOA,EAAM,YAAa,CAAC,EAAE,WACnE,EACF,CACF,CACF,EAAE,EAUK,SAASC,GAAOC,EAAiC,CACtD,IAAMC,EAAUC,GAAkB,EAC5B,CAAE,QAAAC,EAAS,QAAAC,EAAS,SAAAC,CAAS,EAAIJ,EACjCK,EAASH,EAAQ,UAAU,EAC3B,CAAE,QAAAI,EAAS,GAAAC,CAAG,EAAIZ,GAAU,EAC5B,CAACa,EAAgBC,CAAiB,EAAIC,GAAS,EAAK,EAE1D,OACEC,EAAA,cAACC,GAAA,CAAc,OAAQ,GAAI,EAAG,EAAG,MAAO,CAAE,OAAQ,GAAI,GACpDD,EAAA,cAACE,GAAA,CAAM,SAAS,SACdF,EAAA,cAACE,GAAA,CAAM,QAAQ,MACbF,EAAA,cAACG,GAAA,CAAe,UAAWR,EAAQ,WAAY,QAASP,EAAM,cAC3DA,EAAM,IACT,EACAY,EAAA,cAACI,GAAA,CAAkB,SAAUhB,EAAM,SAAU,aAAcA,EAAM,aAAc,CACjF,EAEAY,EAAA,cAACK,GAAA,CACC,MAAO,IACP,OAAO,KACP,SAAS,aACT,gBAAiB,CAAE,WAAY,eAAgB,EAC/C,OAAQR,EACR,QAAS,IAAMC,EAAkB,EAAK,GAEtCE,EAAA,cAACK,GAAK,OAAL,KACCL,EAAA,cAACG,GAAA,CACC,UAAWP,EAAGD,EAAQ,KAAM,CAAE,CAACA,EAAQ,UAAU,EAAGE,CAAe,CAAC,EACpE,QAAS,IAAMC,EAAmBQ,GAAM,CAACA,CAAC,GAE1CN,EAAA,cAACE,GAAA,CAAM,QAAS,GACdF,EAAA,cAACO,GAAA,CAAe,MAAOf,EAAS,OAAO,KAAK,KAAM,GAAI,EACtDQ,EAAA,cAACQ,GAAA,CAAK,KAAK,KAAK,UAAWb,EAAQ,UAChCc,GAAgBjB,GAAS,OAAO,CAAC,CAAc,CAClD,EACAQ,EAAA,cAACU,GAAA,CAAgB,KAAM,GAAI,OAAQ,IAAK,CAC1C,CACF,CACF,EACAV,EAAA,cAACK,GAAK,SAAL,KACCL,EAAA,cAACW,GAAA,CAAM,MAAM,SAAS,EAAE,MACtBX,EAAA,cAACO,GAAA,CAAe,KAAK,KAAK,OAAQ,IAAK,MAAOlB,EAAQ,QAAS,EAC/DW,EAAA,cAACY,GAAA,CAAiB,MAAOvB,EAAQ,SAAS,OAAO,CAAC,EAAgB,EAClEW,EAAA,cAACQ,GAAA,CAAK,MAAM,SAAS,KAAK,MACvBjB,EAAQ,eAAe,GAAG,QAAQ,OACrC,CACF,EACCG,EAAO,OAAS,GAAKM,EAAA,cAACK,GAAK,QAAL,IAAa,EACnCX,EAAO,IACLmB,GACCA,EAAM,QAAQ,YAAcC,GAAmBzB,EAAQ,OAA0B,GAC/EW,EAAA,cAACK,GAAK,KAAL,CACC,IAAKQ,EAAM,QAAQ,UACnB,QAAS,IAAM,CACbtB,EACG,eAAesB,CAAK,EACpB,KAAK,IAAM,OAAO,SAAS,OAAO,CAAC,EACnC,MAAM,QAAQ,GAAG,CACtB,GAEAb,EAAA,cAACE,GAAA,KACCF,EAAA,cAACe,GAAA,CAAO,OAAO,KAAK,EACpBf,EAAA,cAAC,OAAI,MAAO,CAAE,KAAM,CAAE,GACpBA,EAAA,cAACQ,GAAA,CAAK,KAAK,KAAK,OAAQ,KACrBK,EAAM,QAAQ,OACjB,EACAb,EAAA,cAACQ,GAAA,CAAK,MAAM,SAAS,KAAK,MACvBK,EAAM,QAAQ,OACjB,CACF,CACF,CACF,CAEN,EACAb,EAAA,cAACK,GAAK,QAAL,IAAa,EACdL,EAAA,cAACK,GAAK,KAAL,CAAU,KAAML,EAAA,cAACgB,GAAA,CAAqB,KAAM,GAAI,OAAQ,IAAK,EAAI,QAAS,IAAMvB,EAAS,SAAS,GAAG,qBAEtG,EACAO,EAAA,cAACK,GAAK,KAAL,CACC,KAAML,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,OAAQ,IAAK,EAC3C,QAAS,IAAMxB,EAAS,IAAIqB,GAAmBtB,CAA0B,CAAC,EAAE,GAC7E,kBAED,EACAQ,EAAA,cAACK,GAAK,KAAL,CACC,KAAML,EAAA,cAACkB,GAAA,CAAW,KAAM,GAAI,OAAQ,IAAK,EACzC,QAAS,SAAY,CACnB,MAAM3B,EAAQ,QAAQ,EACtBE,EAAS,SAAS,CACpB,GACD,UAED,EACAO,EAAA,cAACQ,GAAA,CAAK,KAAK,KAAK,MAAM,SAAS,MAAM,UAClCpB,EAAM,OACT,CACF,CACF,CACF,CACF,CAEJ,CQpKA,OAAS,UAAA+B,GAAQ,gBAAAC,GAAc,UAAUC,GAAe,cAAAC,GAAY,SAAAC,GAAO,QAAAC,OAAY,gBAEvF,OAAOC,IAAS,YAAAC,OAAgB,QCFhC,OAAS,UAAAC,GAAQ,SAAAC,GAAO,SAAAC,GAAO,gBAAAC,GAAc,SAAAC,GAAO,aAAAC,OAAiB,gBACrE,OAAS,oBAAAC,OAAwB,yBACjC,OAAS,aAAAC,GAAW,wBAAAC,OAA4B,gBAEhD,OAAOC,OAAW,QCJlB,OAAOC,OAA8B,QCK9B,SAASC,GAAUC,EAA+C,CACvE,IAAMC,EAAiC,CAAC,EAExC,QAAWC,KAAW,MAAM,KAAKF,EAAK,QAAQ,EACxCE,aAAmB,iBACrBC,GAAkBF,EAAQC,CAAO,EACxBA,aAAmB,oBAC5BD,EAAOC,EAAQ,IAAI,EAAIA,EAAQ,MACtBA,aAAmB,mBAC5BE,GAAmBH,EAAQC,CAAO,EAItC,OAAOD,CACT,CASA,SAASE,GAAkBF,EAAgCI,EAA4B,CACjFA,EAAG,WAKFA,EAAG,OAAS,YAAcA,EAAG,OAAS,UAAY,CAACA,EAAG,UAK3DJ,EAAOI,EAAG,IAAI,EAAIA,EAAG,MACvB,CAQA,SAASD,GAAmBH,EAAgCI,EAA6B,CACvFJ,EAAOI,EAAG,IAAI,EAAIA,EAAG,KACvB,CDxCO,SAASC,EAAKC,EAA+B,CAClD,OACEC,GAAA,cAAC,QACC,MAAOD,EAAM,MACb,cAAaA,EAAM,OACnB,SAAWE,GAA4B,CACrCA,EAAE,eAAe,EACjB,IAAMC,EAAWC,GAAUF,EAAE,MAAyB,EAClDF,EAAM,UACRA,EAAM,SAASG,CAAQ,CAE3B,GAECH,EAAM,QACT,CAEJ,CDVO,SAASK,GAAeC,EAAgD,CAC7E,IAAMC,EAAUC,EAAW,EACrBC,EAASF,EAAQ,qBAAqB,EAE5C,SAASG,EAAcC,EAAwC,CAC7D,GAAM,CAAE,SAAAC,EAAU,aAAcC,CAAK,EAAIF,EACnCG,EAAS,GAAGR,EAAM,QAAQ,IAAIA,EAAM,aAAa,SAAS,CAAC,GAC3DS,EAAYC,GAAUP,CAAM,EACrBM,EAAU,MAAM,KAAK,CAAC,CAAE,MAAAE,CAAM,IAAMA,IAAUL,CAAQ,GAE7D,MAAM,KAAK,CAAE,KAAAC,EAAM,OAAAC,CAAO,CAAC,EACjCP,EACG,eAAeQ,CAAS,EACxB,KAAMG,GAAQ,CAEbT,EAAO,KAAOS,EAAI,KAClBX,EAAQ,cAAc,CAAE,KAAM,QAAS,CAAC,EACxCY,GAAiB,CAAE,MAAO,QAAS,QAAS,SAAU,CAAC,EACvDb,EAAM,KAAK,CACb,CAAC,EACA,MAAOc,GAAa,CACnBD,GAAiB,CAAE,MAAO,MAAO,QAASE,GAAqBD,CAAG,CAAE,CAAC,CACvE,CAAC,CACL,CAEA,OACEE,GAAA,cAACC,GAAA,CACC,MAAM,eACN,iBAAkB,CAAE,aAAc,OAAQ,EAC1C,OAAQjB,EAAM,QACd,QAASA,EAAM,UAEfgB,GAAA,cAACE,EAAA,CAAK,SAAUd,GACdY,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAW,OAAQjB,EAAQ,EAC5Ba,GAAA,cAACK,GAAA,CAAU,MAAM,gBAAgB,KAAK,OAAO,KAAK,eAAe,YAAY,gBAAgB,aAAY,GAAC,EAC1GL,GAAA,cAACM,GAAA,CAAM,SAAS,SACdN,GAAA,cAACO,GAAA,CAAO,GAAG,KAAK,KAAK,UAAS,IAE9B,CACF,CACF,CACF,CACF,CAEJ,CAMA,SAASH,GAAWpB,EAAqC,CACvD,SAASwB,EAAiBrB,EAAiD,CACzE,OAAOA,GAAQ,MAAM,IAAKsB,GAASA,EAAK,KAAK,CAC/C,CACA,IAAMC,EAAQF,EAAiBxB,EAAM,MAAM,EAE3C,OACEgB,GAAA,cAACW,GAAA,CACC,KAAK,WACL,aAAcD,EAAM,CAAC,EACrB,MAAM,qBACN,YAAY,OACZ,KAAMA,EACN,aAAY,GACd,CAEJ,CGlFA,OAAOE,IAAS,YAAAC,OAAgB,QCAhC,OAAOC,IAAS,eAAAC,OAAmB,QAenC,SAASC,GAAMC,EAA4C,CACzD,OAAI,OAAOA,EAAQ,MAAS,SACnBA,EAAQ,KAEV,KAAK,UAAUA,CAAO,CAC/B,CAEA,SAASC,GAAWC,EAAyC,CAC3D,OAAI,OAAOA,EAAK,SAAY,SACnBA,EAAK,QAEPH,GAAMG,CAAI,CACnB,CAEA,SAASC,GAASH,EAAwF,CACxG,MAAO,CACL,MAAOD,GAAMC,CAAO,EACpB,MAAOC,GAAWD,CAAO,EACzB,SAAUA,CACZ,CACF,CAEA,SAASI,GAAYC,EAA0C,CAC7D,MAAO,CACL,KAAMA,EACN,QAASA,CACX,CACF,CAQO,SAASC,GAAqBC,EAA+C,CAClF,IAAMC,EAAUC,EAAW,EACrB,CAAE,kBAAAC,EAAmB,UAAAC,EAAW,UAAAC,EAAW,GAAGC,CAAK,EAAIN,EAEvDO,EAAaC,GACjB,MAAOV,EAAeW,IAA8D,CAClF,GAAI,CAACN,EAAkB,QACrB,MAAO,CAAC,EAEV,IAAMO,EAASP,EAAkB,QAAQ,SAEnCQ,GADW,MAAMV,EAAQ,eAAeS,EAAQZ,EAAO,CAAE,OAAAW,CAAO,CAAC,GACrC,WAAW,SACvCG,EAAuC,CAAC,EAC9C,QAAWC,KAAmBF,EACxBE,EAAgB,MAAQ,CAACD,EAAQ,KAAMjB,GAASA,EAAK,OAASkB,EAAgB,IAAI,GACpFD,EAAQ,KAAKC,CAAe,EAIhC,OAAOD,CACT,EACA,CAACX,EAASE,CAAiB,CAC7B,EAEA,OACEW,GAAA,cAACC,GAAA,CACE,GAAGT,EACJ,UAAWF,GAAa,GACxB,UAAWC,GAAa,GACxB,MAAOb,GACP,SAAUI,GACV,YAAaW,EACb,SAAUV,GACV,eAAgBO,IAAc,GAAQ,OAAaY,GAAe,YAAYA,CAAK,GACrF,CAEJ,CDvEO,SAASC,GAAUC,EAAoC,CAC5D,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAA6BH,EAAM,YAAY,EAEzE,SAASI,EAAaC,EAA8C,CAClE,IAAMC,EAAWD,EAAU,CAAC,EACtBE,EAAUC,GAAsBF,CAAQ,EAC9CJ,EAASK,CAAO,EACZP,EAAM,UACRA,EAAM,SAASO,CAAO,CAE1B,CAEA,OACEE,GAAA,cAACC,GAAA,CACC,kBAAmBV,EAAM,SACzB,KAAMA,EAAM,KACZ,YAAaA,EAAM,YACnB,aAAcW,GAAsBV,CAAK,EACzC,SAAUG,EACV,UAAWJ,EAAM,UACjB,kBAAmBA,EAAM,mBAAqB,EAC9C,oBAAqBA,EAAM,oBAC3B,UAAWA,EAAM,UACnB,CAEJ,CAEA,SAASW,GAAsBC,EAAiE,CAC9F,OAAOA,EAAO,CAAE,KAAAA,CAAK,EAAI,MAC3B,CAEA,SAASJ,GAAsBK,EAAoE,CACjG,OAAOA,GAAS,IAClB,CJzCA,IAAMC,GAAYC,GAAcC,IACvB,CACL,UAAW,CACT,OAAQ,iBACR,SAAU,MACV,WAAY,SACZ,cAAe,YACf,cAAe,KACjB,EAEA,KAAM,CACJ,GAAGA,EAAM,GAAG,YAAY,EACxB,QAAS,OACT,WAAY,SACZ,eAAgB,OAChB,SAAUA,EAAM,UAAU,GAC1B,MAAOA,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,EAChF,QAAS,WACT,aAAcA,EAAM,OAAO,GAC3B,WAAY,IAEZ,UAAW,CACT,gBAAiBA,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,EAC1F,MAAOA,EAAM,cAAgB,OAASA,EAAM,MAAQA,EAAM,MAC1D,eAAgB,OAEf,QAAU,CACT,MAAOA,EAAM,cAAgB,OAASA,EAAM,MAAQA,EAAM,KAC5D,CACF,EAEA,QAAS,CACP,MAAOA,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,EAChF,YAAaA,EAAM,QAAQ,GAC3B,YAAa,IACb,MAAO,GACP,OAAQ,EACV,CACF,EAEA,WAAY,CACV,aAAc,CACZ,gBAAiBA,EAAM,GAAG,QAAQ,CAAE,QAAS,QAAS,MAAOA,EAAM,YAAa,CAAC,EAAE,WACnF,MAAOA,EAAM,GAAG,QAAQ,CAAE,QAAS,QAAS,MAAOA,EAAM,YAAa,CAAC,EAAE,MACxE,QAAU,CACT,MAAOA,EAAM,GAAG,QAAQ,CAAE,QAAS,QAAS,MAAOA,EAAM,YAAa,CAAC,EAAE,KAC3E,CACF,CACF,CACF,EACD,EAqBM,SAASC,GAAOC,EAAiC,CACtD,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxBM,EAAWC,GAAmB,EAC9BC,EAAaC,GAAcL,EAAM,SAAUA,EAAM,aAAcA,EAAM,KAAK,EAC1E,CAACM,EAAuBC,CAAwB,EAAIC,GAAS,EAAK,EAExE,SAASC,EAAYC,EAAyBC,EAAkB,CAC9DD,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjBR,EAASS,CAAE,EACP,OAAO,WAAa,KACtBX,EAAM,YAAY,CAEtB,CAEA,SAASY,EAAqBC,EAAwC,CAChEA,GACFX,EAAS,IAAIW,CAAY,EAAE,CAE/B,CAEA,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAc,MAAO,CAAE,GAAI,GAAI,EAAG,EAAE,MACnCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACC,GAAc,QAAd,CAAsB,GAAG,MACxBD,GAAA,cAACG,GAAA,CACC,IAAK,OAAO,SAAS,SACrB,KAAK,eACL,YAAY,gBACZ,SAAU,CACR,QAAS,CACP,SAAU,kDACZ,CACF,EACA,SAAWC,GAAaN,EAAqBM,CAAQ,EACrD,UAAW,GACX,kBAAmB,EACnB,oBAAqB,GACrB,UAAW,GACb,CACF,EACAJ,GAAA,cAACC,GAAc,QAAd,CAAsB,KAAI,IACxBf,EAAM,OAAO,IAAKmB,GACjBL,GAAA,cAACA,GAAM,SAAN,CAAe,IAAK,QAAQK,EAAK,KAAK,IACrCL,GAAA,cAACM,GAAA,CAAK,UAAWnB,EAAQ,WAAYkB,EAAK,KAAM,EAC/CA,EAAK,OAAO,IAAKE,GAChBP,GAAA,cAACQ,GAAA,CACC,IAAKD,EAAK,KACV,GAAIA,EAAK,KACT,OAAQA,EAAK,OAASjB,GAAY,KAClC,QAAUM,GAAMD,EAAYC,EAAGW,EAAK,IAAI,GAExCP,GAAA,cAACS,GAAA,CAAY,GAAIF,EAAK,KAAM,KAAMA,EAAK,KAAM,EAC7CP,GAAA,cAAC,YAAMO,EAAK,KAAM,CACpB,CACD,CACH,CACD,EACArB,EAAM,oBACLc,GAAA,cAACU,GAAA,CACC,QAAQ,SACR,KAAK,KACL,GAAG,KACH,SAAUV,GAAA,cAACW,GAAA,CAAS,KAAK,UAAU,EACnC,QAAS,IAAMlB,EAAyB,EAAI,GAC7C,cAED,CAEJ,CACF,CACF,EACCP,EAAM,UAAYA,EAAM,cACvBc,GAAA,cAACY,GAAA,CACC,SAAU1B,EAAM,SAChB,aAAcA,EAAM,aACpB,QAASM,EACT,KAAM,IAAMC,EAAyB,EAAK,EAC1C,SAAU,IAAMA,EAAyB,EAAK,EAChD,CAEJ,CAEJ,CASA,SAASe,GAAWtB,EAAqC,CACvD,GAAM,CAAE,QAAAC,EAAS,GAAA0B,CAAG,EAAI/B,GAAU,EAClC,OACEkB,GAAA,cAACc,GAAA,CACC,QAAS5B,EAAM,QACf,GAAIA,EAAM,GACV,UAAW2B,EAAG1B,EAAQ,KAAM,CAAE,CAACA,EAAQ,UAAU,EAAGD,EAAM,MAAO,CAAC,GAEjEA,EAAM,QACT,CAEJ,CAOA,SAASuB,GAAYvB,EAAsC,CACzD,OAAIA,EAAM,KACDA,EAAM,KAERc,GAAA,cAACe,GAAA,CAAM,EAAG,GAAI,CACvB,CAaA,SAASxB,GACPyB,EACAC,EACAC,EACwB,CACxB,GAAI,CAACF,GAAmB,CAACC,GAAuB,CAACC,EAC/C,OAGF,IAAIC,EACAC,EAAY,EAEhB,QAAWf,KAAQa,EACjB,GAAIb,EAAK,MACP,QAAWE,KAAQF,EAAK,MAAO,CAC7B,IAAMgB,EAAQC,GAAaN,EAAiBC,EAAqBV,EAAK,IAAI,EACtEc,EAAQD,IACVA,EAAYC,EACZF,EAAWZ,EAEf,CAIJ,OAAOY,CACT,CAaA,SAASG,GAAaN,EAAyBC,EAAsCM,EAA0B,CAC7G,IAAMC,EAAU,IAAI,IAAID,EAAU,qBAAqB,EACvD,GAAIP,IAAoBQ,EAAQ,SAC9B,MAAO,GAET,IAAMC,EAAgB,CAAC,SAAU,SAAS,EAC1C,OAAW,CAACC,EAAKC,CAAK,IAAKH,EAAQ,aAAa,QAAQ,EACtD,GAAI,CAAAC,EAAc,SAASC,CAAG,GAG1BT,EAAoB,IAAIS,CAAG,IAAMC,EACnC,MAAO,GAGX,IAAIC,EAAQ,EACZ,OAAW,CAACF,EAAKC,CAAK,IAAKV,EAAoB,QAAQ,EACjDQ,EAAc,SAASC,CAAG,GAG1BF,EAAQ,aAAa,IAAIE,CAAG,IAAMC,GACpCC,IAGJ,OAAOA,CACT,CxD5PO,SAASC,GAASC,EAAmC,CAC1D,IAAMC,EAAQC,GAAgB,EACxB,CAACC,EAAYC,CAAa,EAAIC,GAAS,aAAa,aAAkB,MAAM,EAC5EC,EAAUC,EAAW,EACrBC,EAAUC,GAAkB,EAElC,SAASC,EAAqBC,EAAqB,CACjD,aAAa,WAAgBA,EAAK,SAAS,EAC3CP,EAAcO,CAAI,CACpB,CAEA,SAASC,GAAoB,CAC3BF,EAAqB,EAAK,CAC5B,CAEA,SAASG,GAAqB,CAC5BH,EAAqB,CAACP,CAAU,CAClC,CAEA,OAAIG,EAAQ,UAAU,EACbQ,GAAA,cAACC,GAAA,IAAQ,EAIhBD,GAAA,cAACE,GAAA,CACC,OAAQ,CACN,KAAM,CACJ,WAAYf,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,CACvF,CACF,EACA,QAAS,EACT,MAAO,GACP,OACEO,GACEM,GAAA,cAACG,GAAA,CACC,SAAUjB,EAAM,SAChB,aAAcA,EAAM,aACpB,KAAMA,EAAM,KACZ,QAASA,EAAM,QACf,aAAca,EAChB,EAGJ,OACEL,GAAWL,EACTW,GAAA,cAACI,GAAA,CACC,SAAUlB,EAAM,SAChB,aAAcA,EAAM,aACpB,MAAOA,EAAM,MACb,YAAaY,EACb,mBAAoBZ,EAAM,mBAC5B,EACE,QAGNc,GAAA,cAACK,GAAA,CAAc,IAAK,GAAGnB,EAAM,QAAQ,IAAIA,EAAM,cAAc,SAAS,CAAC,IACrEc,GAAA,cAACM,GAAA,CAAS,SAAUN,GAAA,cAACC,GAAA,IAAQ,GAAKf,EAAM,QAAS,CACnD,CACF,CAEJ,C8D7EA,OAAOqB,OAAW,QCDlB,OAAS,UAAAC,OAAc,gBAEvB,OAAOC,OAAW,QAOX,SAASC,GAAkBC,EAAmD,CACnF,IAAMC,EAAQD,EAAM,MACd,CAAE,YAAAE,EAAa,IAAAC,EAAK,MAAAC,CAAM,EAAIH,GAAS,CAAC,EAE9C,OAAKE,EAKHL,GAAA,cAAC,OAAI,cAAY,sBACdI,GAAa,WAAW,QAAQ,GAC/BJ,GAAA,cAAC,OAAI,cAAY,mBAAmB,MAAO,CAAE,SAAUE,EAAM,QAAS,EAAG,IAAKG,EAAK,IAAKF,GAAO,MAAO,EAEvGC,GAAa,WAAW,QAAQ,GAC/BJ,GAAA,cAAC,SAAM,cAAY,mBAAmB,MAAO,CAAE,SAAUE,EAAM,QAAS,EAAG,SAAU,IACnFF,GAAA,cAAC,UAAO,KAAMI,EAAa,IAAKC,EAAK,CACvC,EAEDD,IAAgB,mBAAqB,CAACE,GAAO,SAAS,MAAM,GAC3DN,GAAA,cAAC,OAAI,cAAY,iBAAiB,MAAO,CAAE,SAAUE,EAAM,SAAU,UAAW,GAAI,GAClFF,GAAA,cAAC,UACC,MAAM,OACN,OAAO,MACP,IAAKK,EAAM,cACX,gBAAiB,GACjB,YAAa,EACb,SAAU,GACZ,CACF,EAEFL,GAAA,cAAC,OAAI,cAAY,gBAAgB,MAAO,CAAE,QAAS,oBAAqB,GACtEA,GAAA,cAACD,GAAA,CAAO,KAAMI,GAAO,IAAK,cAAY,qBAAqB,OAAO,SAAS,IAAI,uBAC5EA,GAAO,OAAS,UACnB,CACF,CACF,EA9BO,IAgCX,CDrCO,SAASI,GAAuBC,EAAiD,CACtF,OACEC,GAAA,cAAC,WACED,EAAM,QAAQ,IAAI,CAACE,EAAGC,IACrBF,GAAA,cAAC,OAAI,IAAK,eAAiBE,GACzBF,GAAA,cAACG,GAAA,CAAkB,MAAOF,EAAG,SAAUF,EAAM,SAAU,CACzD,CACD,CACH,CAEJ,CEnBA,OAAS,cAAAK,OAAkB,gBAG3B,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCFxC,OAAOC,IAAS,UAAAC,OAAc,QAWvB,SAASC,GAAiBC,EAA2C,CAC1E,IAAMC,EAAUC,EAAW,EACrBC,EAAeC,GAAyB,IAAI,EAElD,SAASC,EAAQC,EAA2B,CAC1CC,EAAUD,CAAC,EACXH,EAAa,SAAS,MAAM,CAC9B,CAEA,SAASK,EAAaF,EAA4B,CAChDC,EAAUD,CAAC,EACX,IAAMG,EAASH,EAAE,OAA4B,MACzCG,GACF,MAAM,KAAKA,CAAK,EAAE,QAAQC,CAAW,CAEzC,CAMA,SAASA,EAAYC,EAAkB,CAMrC,GALI,CAACA,GAKD,CADaA,EAAK,KAEpB,OAGEX,EAAM,eACRA,EAAM,cAAc,EAGtB,IAAMY,EAAWD,EAAK,KAChBE,EAAcF,EAAK,MAAQ,2BACjCV,EACG,aAAaU,EAAMC,EAAUC,EAAab,EAAM,gBAAgB,EAChE,KAAMc,GAAmB,CACxBd,EAAM,SAAS,CACb,YAAac,EAAO,YACpB,IAAKA,EAAO,IACZ,MAAOF,CACT,CAAC,CACH,CAAC,EACA,MAAOG,GAA8B,CACpC,MAAMA,EAAQ,QAAQ,CAAC,GAAG,SAAS,IAAI,CACzC,CAAC,CACL,CAEA,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAAC,SACC,KAAK,OACL,cAAY,oBACZ,MAAO,CAAE,QAAS,MAAO,EACzB,IAAKb,EACL,SAAWG,GAAME,EAAaF,CAAC,EACjC,EACCN,EAAM,SAAS,CAAE,QAAAK,CAAQ,CAAC,CAC7B,CAEJ,CD5DO,SAASY,GAAqBC,EAA+C,CAClF,GAAM,CAACC,EAAQC,CAAS,EAAIC,GAAuBH,EAAM,cAAgB,CAAC,CAAC,EAErEI,EAAYC,GAAqB,EACvCD,EAAU,QAAUH,EAEpB,SAASK,EAAiBC,EAA+B,CACvDL,EAAUK,CAAS,EACfP,EAAM,UACRA,EAAM,SAASO,CAAS,CAE5B,CAEA,OACEC,GAAA,cAAC,SAAM,MAAO,CAAE,MAAO,MAAO,GAC5BA,GAAA,cAAC,gBACCA,GAAA,cAAC,OAAI,MAAM,MAAM,EACjBA,GAAA,cAAC,OAAI,MAAM,KAAK,CAClB,EACAA,GAAA,cAAC,aACEP,EAAO,IAAI,CAACQ,EAAeC,IAC1BF,GAAA,cAAC,MAAG,IAAK,GAAGE,CAAK,IAAIT,EAAO,MAAM,IAChCO,GAAA,cAAC,UACCA,GAAA,cAACG,GAAA,CAAkB,MAAOF,EAAG,SAAU,IAAK,CAC9C,EACAD,GAAA,cAAC,UACCA,GAAA,cAACI,GAAA,CACC,MAAM,SACN,KAAK,KACL,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACX,IAAME,EAAOd,EAAO,MAAM,EAC1Bc,EAAK,OAAOL,EAAO,CAAC,EACpBJ,EAAiBS,CAAI,CACvB,GAEAP,GAAA,cAACQ,GAAA,IAAgB,CACnB,CACF,CACF,CACD,EACDR,GAAA,cAAC,UACCA,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,UACCA,GAAA,cAACS,GAAA,CACC,SAAWC,GAA2B,CACpCZ,EAAiB,CAAC,GAAIF,EAAU,QAA0Bc,CAAU,CAAC,CACvE,GAEElB,GACAQ,GAAA,cAACI,GAAA,CAAY,GAAGZ,EAAO,MAAM,MAAM,KAAK,KAAK,MAAM,SACjDQ,GAAA,cAACW,GAAA,CAAgB,KAAM,GAAI,CAC7B,CAEJ,CACF,CACF,CACF,CACF,CAEJ,CE3EA,OAAS,UAAAC,OAAc,gBAEvB,OAAOC,IAAS,YAAAC,OAAgB,QAYzB,SAASC,GAAgBC,EAA0C,CACxE,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAASH,EAAM,YAAY,EAErD,SAASI,EAAgBC,EAAwC,CAC/DH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,OAAIJ,EAEAK,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAkB,MAAON,EAAO,SAAU,IAAK,EAChDK,GAAA,cAACE,GAAA,CACC,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACXL,EAAgB,MAAS,CAC3B,GACD,QAED,CACF,EAKFE,GAAA,cAACK,GAAA,CAAiB,SAAUP,GAAmBJ,GAAUM,GAAA,cAACE,GAAA,CAAQ,GAAGR,GAAO,WAAS,CAAU,CAEnG,CC3CA,OAAS,0BAAAY,GAAwB,gBAAAC,OAAgC,gBACjE,OAAOC,OAAW,QCDX,IAAMC,GAA6B,CACxC,OACA,gBACA,WACA,OACA,YACA,YACA,mBACF,ECRA,OAAS,gBAAAC,OAAoB,gBAC7B,OAAOC,OAAW,QAElB,IAAMC,GAAYF,GAAcG,IAAW,CACzC,KAAM,CACJ,QAAS,OACT,oBAAqB,UACrB,OAAQ,EAER,iBAAkB,CAChB,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAChD,UAAW,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC9C,OAAQ,CACV,CACF,EAEA,QAAS,CACP,oBAAqB,UAErB,iBAAkB,CAChB,QAAS,KAAKA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,KAClD,OAAQ,CACV,CACF,CACF,EAAE,EAOK,SAASC,GAAgBC,EAA0C,CACxE,GAAM,CAAE,SAAAC,EAAU,QAAAC,CAAQ,EAAIF,EACxB,CAAE,QAAAG,EAAS,GAAAC,CAAG,EAAIP,GAAU,EAClC,OAAOD,GAAA,cAAC,MAAG,UAAWQ,EAAGD,EAAQ,KAAM,CAAE,CAACA,EAAQ,OAAO,EAAGD,CAAQ,CAAC,GAAID,CAAS,CACpF,CAOO,SAASI,GAAqBL,EAA+C,CAClF,OACEJ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAAC,UAAII,EAAM,IAAK,EAChBJ,GAAA,cAAC,UAAII,EAAM,QAAS,CACtB,CAEJ,CCjDA,OACE,kBAAAM,GACA,gBAAAC,GACA,gBAAAC,GACA,gCAAAC,GACA,yBAAAC,GACA,gBAAAC,MAEK,gBAEP,OAAOC,MAAW,QCVlB,OAAS,yBAAAC,OAA6B,gBAEtC,OAAOC,OAAW,QAMX,SAASC,GAAuBC,EAAiD,CACtF,OAAOF,GAAA,cAAAA,GAAA,cAAGD,GAAsBG,EAAM,KAAK,CAAE,CAC/C,CCVA,OAAS,gBAAAC,OAAoB,gBAE7B,OAAOC,OAAW,QAMX,SAASC,GAAcC,EAAwC,CACpE,OAAOF,GAAA,cAAAA,GAAA,cAAGD,GAAaG,EAAM,KAAK,CAAE,CACtC,CCTA,OAAOC,OAAW,QCAlB,OAAOC,OAAW,QAMX,SAASC,GAAoBC,EAAqD,CACvF,IAAMC,EAAeD,EAAM,MAC3B,GAAI,CAACC,EACH,OAAO,KAGT,IAAMC,EAAU,CAAC,EAEjB,OAAID,EAAa,OACfC,EAAQ,KAAKD,EAAa,KAAK,GAG7BA,EAAa,KAAOA,EAAa,UACnCC,EAAQ,KAAK,IAAI,EAEbD,EAAa,KACfC,EAAQ,KAAKD,EAAa,GAAG,EAG3BA,EAAa,KAAOA,EAAa,QACnCC,EAAQ,KAAK,GAAG,EAGdD,EAAa,QACfC,EAAQ,KAAKD,EAAa,MAAM,EAGlCC,EAAQ,KAAK,GAAG,GAGXJ,GAAA,cAAAA,GAAA,cAAGI,EAAQ,KAAK,EAAE,EAAE,KAAK,CAAE,CACpC,CD9BO,SAASC,GAAqBC,EAAsD,CACzF,IAAMC,EAAgBD,EAAM,MAC5B,OAAKC,EAKHC,GAAA,cAAAA,GAAA,cACGD,EAAc,KACdA,EAAc,MAAQ,KACtBA,EAAc,SAAS,IAAKE,GAC3BD,GAAA,cAACE,GAAA,CAAoB,IAAK,WAAWH,EAAc,IAAI,IAAIE,EAAQ,KAAK,GAAI,MAAOA,EAAS,CAC7F,CACH,EAVO,IAYX,CEtBA,OAAOE,OAAW,QAMX,SAASC,GAAkBC,EAA4C,CAC5E,OACEF,GAAA,cAAC,WACEE,EAAM,OAAO,OAAO,KAAGA,EAAM,OAAO,KACvC,CAEJ,CCbA,OAAS,eAAAC,OAAmB,gBAE5B,OAAOC,OAAW,QAMX,SAASC,GAAaC,EAA8C,CACzE,OAAOF,GAAA,cAAAA,GAAA,cAAGD,GAAYG,EAAM,KAAK,CAAE,CACrC,CCVA,OAAS,kBAAAC,OAAsB,gBAE/B,OAAOC,OAAW,QAMX,SAASC,GAAgBC,EAAiD,CAC/E,OAAOF,GAAA,cAAAA,GAAA,cAAGD,GAAeG,EAAM,KAAK,CAAE,CACxC,CCVA,OAAS,eAAAC,OAAmB,gBAE5B,OAAOC,OAAW,QAMX,SAASC,GAAaC,EAA8C,CACzE,OAAOF,GAAA,cAAAA,GAAA,cAAGD,GAAYG,EAAM,KAAK,CAAE,CACrC,CCTA,OAAOC,OAAW,QAOX,SAASC,GAAaC,EAA8C,CACzE,IAAMC,EAAQD,EAAM,MACpB,OAAKC,EAKHC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAgB,MAAOF,EAAM,UAAW,EAAE,YAE3CC,GAAA,cAACC,GAAA,CAAgB,MAAOF,EAAM,YAAa,CAC7C,EARO,IAUX,CCrBA,OAAS,aAAAG,OAAiB,gBAE1B,OAAOC,OAAW,QAQX,SAASC,GAAiBC,EAAkD,CACjF,GAAI,CAACA,EAAM,MACT,OAAO,KAGT,IAAMC,EAAgBD,EAAM,MAAM,SAAWA,EAAM,MAAM,WAAaE,GAAUF,EAAM,KAAK,EAI3F,OAAIA,EAAM,OAAS,IAASA,EAAM,MAAM,UAC/BG,GAAA,cAACC,GAAA,CAAY,GAAIJ,EAAM,OAAQC,CAAc,EAE7CE,GAAA,cAAAA,GAAA,cAAGF,CAAc,CAE5B,CCtBA,OAAOI,OAAW,QAWX,SAASC,GAAqBC,EAA+C,CAClF,IAAMC,EAAWD,EAAM,SACjBE,EAASF,EAAM,QAAU,CAAC,EAC1BG,EAAeF,EAAS,OAAO,CAAC,GAAG,KACzC,OACEG,GAAA,cAAAA,GAAA,cACGF,EAAO,IAAI,CAACG,EAAQC,IACnBF,GAAA,cAAC,OAAI,IAAK,GAAGE,CAAK,IAAIJ,EAAO,MAAM,IACjCE,GAAA,cAACG,GAAA,CACC,aAAc,GACd,SAAUN,EACV,aAAcE,EACd,MAAOE,EACP,oBAAqBL,EAAM,oBAC3B,KAAMA,EAAM,KACd,CACF,CACD,CACH,CAEJ,CXNA,OAAS,cAAAQ,GAAY,OAAAC,GAAK,cAAAC,GAAY,WAAAC,OAAe,gBAkB9C,SAASC,GAAwBC,EAAkD,CACxF,GAAM,CAAE,SAAAC,EAAU,aAAAC,EAAc,MAAAC,CAAM,EAAIH,EAG1C,GADqBC,GAAU,MAAM,SAAS,KAAK,EAEjD,OACEG,EAAA,cAACC,GAAA,CAAI,UAAU,MAAM,GAAI,CAAE,QAAS,OAAQ,IAAK,EAAG,WAAY,QAAS,GACtEF,EACDC,EAAA,cAACE,GAAA,CAAW,MAAOH,EAAO,QAAS,KAChC,CAAC,CAAE,OAAAI,EAAQ,KAAAC,CAAK,IACfJ,EAAA,cAACK,GAAA,CAAQ,MAAOF,EAAS,SAAW,OAAQ,UAAS,GAAC,SAAS,SAC7DH,EAAA,cAACM,GAAA,CAAW,MAAOH,EAAS,OAAS,OAAQ,QAASC,GACnDD,EAASH,EAAA,cAACO,GAAA,CAAU,KAAK,OAAO,EAAKP,EAAA,cAACQ,GAAA,CAAS,KAAK,OAAO,CAC9D,CACF,CAEJ,CACF,EAIJ,GAAIX,GAAU,MAAQ,KAAO,CAACD,EAAM,aAClC,OAAIE,IAAiBW,EAAa,WACzBT,EAAA,cAACU,GAAA,CAAuB,OAAQX,EAAO,SAAUH,EAAM,SAAU,EAGxEI,EAAA,cAACW,GAAA,CACC,SAAUd,EACV,OAAQE,EACR,oBAAqBH,EAAM,oBAC3B,KAAMA,EAAM,KACd,EAIJ,OAAQE,EAAc,CACpB,KAAKW,EAAa,QAChB,OAAOT,EAAA,cAAAA,EAAA,cAAGD,IAAU,OAAY,IAAK,EAAQA,GAAO,SAAS,CAAE,EACjE,KAAKU,EAAa,aAClB,KAAKA,EAAa,OAChB,OAAOT,EAAA,cAAC,OAAI,MAAO,CAAE,WAAY,UAAW,GAAID,CAAM,EACxD,KAAKU,EAAa,KAClB,KAAKA,EAAa,KAClB,KAAKA,EAAa,QAClB,KAAKA,EAAa,YAClB,KAAKA,EAAa,YAClB,KAAKA,EAAa,IAClB,KAAKA,EAAa,IAChB,OAAOT,EAAA,cAAAA,EAAA,cAAGD,CAAM,EAClB,KAAKU,EAAa,UAChB,OAAOT,EAAA,cAACY,GAAA,CAAiB,MAAO,CAAE,UAAWb,CAAM,EAAG,KAAMH,EAAM,KAAM,EAC1E,KAAKa,EAAa,SAClB,KAAKA,EAAa,QAChB,OAAOT,EAAA,cAAAA,EAAA,cAAGa,GAAed,CAAK,CAAE,EAClC,KAAKU,EAAa,SAChB,OAAOT,EAAA,cAAC,WAAKD,CAAM,EACrB,KAAKU,EAAa,QAChB,OAAOT,EAAA,cAACc,GAAA,CAAe,MAAOf,EAAO,EACvC,KAAKU,EAAa,WAChB,OAAOT,EAAA,cAAAA,EAAA,cAAGD,GAAO,IAAK,EACxB,KAAKU,EAAa,WAChB,OAAOT,EAAA,cAACe,GAAA,CAAkB,MAAOhB,EAAO,SAAUH,EAAM,SAAU,EACpE,KAAKa,EAAa,gBAChB,OAAOT,EAAA,cAACgB,GAAA,CAAuB,MAAOjB,EAAO,EAC/C,KAAKU,EAAa,OAChB,OAAOT,EAAA,cAACiB,GAAA,CAAc,MAAOlB,EAAO,EACtC,KAAKU,EAAa,cAChB,OAAOT,EAAA,cAACkB,GAAA,CAAqB,MAAOnB,EAAO,EAC7C,KAAKU,EAAa,aAChB,OAAOT,EAAA,cAACmB,GAAA,CAAoB,MAAOpB,EAAO,EAC5C,KAAKU,EAAa,UAChB,OAAOT,EAAA,cAACoB,GAAA,CAAiB,MAAOrB,EAAO,EACzC,KAAKU,EAAa,WAChB,OAAOT,EAAA,cAACqB,GAAA,CAAkB,MAAOtB,EAAO,EAC1C,KAAKU,EAAa,MAChB,OAAOT,EAAA,cAACsB,GAAA,CAAa,MAAOvB,EAAO,EACrC,KAAKU,EAAa,OAChB,OAAOT,EAAA,cAAAA,EAAA,cAAGuB,GAAaxB,CAAK,CAAE,EAChC,KAAKU,EAAa,SAClB,KAAKA,EAAa,SAChB,OAAOT,EAAA,cAACwB,GAAA,CAAgB,MAAOzB,EAAO,EACxC,KAAKU,EAAa,MAChB,OAAOT,EAAA,cAACyB,GAAA,CAAa,MAAO1B,EAAO,EACrC,KAAKU,EAAa,MAChB,OAAOT,EAAA,cAAC0B,GAAA,CAAa,MAAO3B,EAAO,EACrC,KAAKU,EAAa,UAChB,OAAOT,EAAA,cAACY,GAAA,CAAiB,MAAOb,EAAO,KAAMH,EAAM,KAAM,EAC3D,KAAKa,EAAa,OAChB,OAAOT,EAAA,cAAAA,EAAA,cAAG2B,GAAa5B,CAAK,CAAE,EAChC,KAAKU,EAAa,OAClB,KAAKA,EAAa,aAChB,OACET,EAAA,cAAC4B,GAAA,CACC,MAAO,CAAE,KAAM9B,EAAc,MAAAC,CAAM,EACnC,QAAS,GACT,oBAAqBH,EAAM,oBAC7B,EAEJ,QACE,GAAI,CAACC,GAAU,KACb,MAAM,MAAM,+BAA+BD,EAAM,YAAY,mCAAmC,EAElG,OACEI,EAAA,cAAC4B,GAAA,CACC,MAAO,CAAE,KAAMC,GAA6BhC,CAAQ,EAAG,MAAAE,CAAM,EAC7D,QAAS,GACT,oBAAqBH,EAAM,oBAC7B,CAEN,CACF,CAYO,SAASkC,GAAgBC,EAAqBC,EAAmC,CACtF,IAAMC,EAAcC,GAAsBH,EAASC,CAAI,EACvD,OAAKC,EAID,MAAM,QAAQA,CAAW,EACpB,CAACA,EAAY,IAAKE,GAAMA,EAAE,KAAK,EAAGF,EAAY,CAAC,EAAE,IAAoB,EAGvE,CAACA,EAAY,MAAOA,EAAY,IAAoB,EAPlD,CAAC,OAAW,WAA2B,CAQlD,CHrKO,SAASG,GAAuBC,EAAwD,CAC7F,IAAMC,EAAaD,EAAM,MACnBE,EAAQD,EAAW,MACzB,GAAI,CAACC,EACH,OAAO,KAGT,IAAMC,EAAWF,EAAW,KACtBG,EAAaC,GAAa,MAAMF,CAAQ,EAC9C,OAAKC,EAKH,OAAOF,GAAU,UACjB,SAAUA,GACV,OAAO,KAAKA,CAAK,EAAE,SAAW,GAC9B,OAAOA,EAAM,MAAS,SAKfI,GAAA,cAAC,WAAKJ,EAAM,IAAK,EAIxBI,GAAA,cAACC,GAAA,CAAgB,QAASP,EAAM,SAC7B,OAAO,QAAQI,EAAW,UAAU,EAAE,IAAKI,GAAU,CACpD,IAAMC,EAAMD,EAAM,CAAC,EACnB,GAAIE,GAA2B,SAASD,CAAG,EACzC,OAAO,KAET,IAAME,EAAWH,EAAM,CAAC,EACnBG,EAAS,OACZA,EAAS,KAAOR,EAAW,IAAMM,GAEnC,GAAM,CAACG,EAAeC,CAAY,EAAIC,GAAgBb,EAAYQ,CAAG,EACrE,OACET,EAAM,sBACL,CAACY,GAAkB,MAAM,QAAQA,CAAa,GAAKA,EAAc,SAAW,GAEtE,KAGPN,GAAA,cAACS,GAAA,CAAqB,IAAKN,EAAK,KAAMO,GAAuBP,CAAG,GAC9DH,GAAA,cAACW,GAAA,CACC,SAAUN,EACV,aAAcE,EACd,MAAOD,EACP,oBAAqBZ,EAAM,oBAC3B,KAAMA,EAAM,KACd,CACF,CAEJ,CAAC,CACH,EA7COM,GAAA,cAAC,WAAKH,EAAS,qBAAqB,CA+C/C,CetEA,OAAS,SAAAe,OAAa,gBACtB,OAAS,0BAAAC,GAAwB,gBAAAC,OAAoB,gBAErD,OAAOC,IAAS,YAAAC,OAAgB,QCHhC,OAAS,SAAAC,GAAO,SAAAC,OAAa,gBAC7B,OAAOC,OAAW,QAUX,SAASC,GAAoBC,EAA8C,CAChF,OACEF,GAAA,cAACF,GAAA,CAAM,OAAM,IACXE,GAAA,cAAC,WAAKE,EAAM,QAAS,EACrBF,GAAA,cAAC,WACCA,GAAA,cAACD,GAAM,QAAN,CACC,GAAIG,EAAM,QACV,MAAOA,EAAM,MACb,YAAaA,EAAM,YACnB,aAAcA,EAAM,eAElB,IAAM,MAAM,CAChB,CACF,CACF,CAEJ,CC3BA,OAAS,SAAAC,OAAa,gBAEtB,OAAOC,OAAW,QCAX,SAASC,GACdC,EACAC,EACoB,CACpB,OAAOD,GAAS,OACZ,OAAQE,GAAUC,GAAkBD,EAAM,aAAa,CAAC,EAAGD,CAAU,CAAC,GACtE,IAAKC,GAAUA,EAAM,SAAS,IAAI,GAClC,KAAK;AAAA,CAAI,CACf,CAEO,SAASE,GACdJ,EACAC,EACqC,CACrC,OAAOD,GAAS,OAAO,OAAQE,GAAUC,GAAkBD,EAAM,aAAa,CAAC,EAAGD,CAAU,CAAC,CAC/F,CAEA,SAASE,GAAkBE,EAA2BC,EAAoC,CAExF,GAAID,IAAUC,EACZ,MAAO,GAET,GAAI,CAACD,GAAS,CAACC,EACb,MAAO,GAET,IAAMC,EAAOF,EAAM,QAAQ,GAAG,EAC9B,GAAIE,GAAQ,GAAKF,EAAM,UAAUE,EAAO,CAAC,IAAMD,EAC7C,MAAO,GAET,IAAME,EAAOF,EAAM,QAAQ,GAAG,EAC9B,OAAIE,GAAQ,GAAKF,EAAM,UAAUE,EAAO,CAAC,IAAMH,CAIjD,CDtBO,SAASI,GAAYC,EAAsC,CAChE,OACEC,GAAA,cAACC,GAAM,QAAN,CACC,GAAIF,EAAM,QACV,MAAOA,EAAM,MACb,YAAaA,EAAM,YACnB,aAAcA,EAAM,aACpB,MAAOG,GAAkBH,EAAM,QAASA,EAAM,OAAO,GAEpDA,EAAM,QACT,CAEJ,CE1BA,OAAS,UAAAI,GAAQ,SAAAC,GAAO,SAAAC,GAAO,aAAAC,OAAiB,gBAChD,OAAS,cAAAC,GAAY,aAAAC,OAA6C,gBAElE,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAapC,SAASC,GAAaC,EAAuC,CAClE,IAAMC,EAAUC,EAAW,EACrBC,EAAeC,EAAYJ,EAAM,YAAY,EAC7C,CAACK,EAAQC,CAAS,EAAIC,GAAiD,EACvE,CAACC,EAAOC,CAAQ,EAAIF,GAA+B,EASzD,OAPAG,GAAU,IAAM,CACVP,IACFM,EAASE,GAAUR,CAAY,CAAC,EAChCF,EAAQ,cAAcE,EAAa,YAAY,EAAE,KAAKG,CAAS,EAAE,MAAM,QAAQ,GAAG,EAEtF,EAAG,CAACL,EAASE,CAAY,CAAC,EAEtB,CAACE,GAAU,CAACG,EACPI,GAAA,cAAC,WAAI,YAAU,EAItBA,GAAA,cAAC,QACC,WAAU,GACV,aAAa,MACb,SAAWC,GAAuB,CAChCA,EAAE,eAAe,EACbb,EAAM,UACRA,EAAM,SAASQ,CAAK,CAExB,GAEAI,GAAA,cAACE,GAAA,CAAM,GAAG,MACRF,GAAA,cAACG,GAAA,CAAY,MAAM,gBAAgB,QAAQ,eAAe,QAASf,EAAM,SACvEY,GAAA,cAACI,GAAA,CAAU,KAAK,eAAe,aAAcR,EAAM,aAAc,SAAU,GAAM,CACnF,EACAI,GAAA,cAACG,GAAA,CAAY,MAAM,KAAK,QAAQ,KAAK,QAASf,EAAM,SAClDY,GAAA,cAACI,GAAA,CAAU,KAAK,KAAK,aAAcR,EAAM,GAAI,SAAU,GAAM,CAC/D,CACF,EACAI,GAAA,cAACK,GAAA,CACC,SAAUT,EAAM,aAChB,aAAcA,EACd,QAASR,EAAM,QACf,SAAUS,EACZ,EACAG,GAAA,cAACM,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBN,GAAA,cAACO,GAAA,CAAO,KAAK,UAAS,IAAE,EACvBnB,EAAM,UACLY,GAAA,cAACO,GAAA,CACC,QAAQ,UACR,MAAM,MACN,KAAK,SACL,QAAS,IAAM,CACZnB,EAAM,SAA0CQ,CAAK,CACxD,GACD,QAED,CAEJ,CACF,CAEJ,CAEO,SAASY,GACdC,EACAC,EACAC,EACAC,EACAhB,EACK,CACL,IAAMiB,EAAQD,EAAkB,KAChC,GAAIC,EAAM,OAAS,EACjB,QAAWC,KAAQD,EAAO,CACxB,IAAME,EAAcL,EAAI,QAAQ,MAAOM,GAAWF,EAAK,IAAc,CAAC,EAClEC,KAAeN,GACjB,OAAOA,EAAIM,CAAW,CAE1B,CAEF,OAAAN,EAAIE,CAAQ,EAAIf,EACTa,CACT,CC/FA,OAAS,YAAAQ,GAAU,SAAAC,GAAO,gBAAAC,GAAc,YAAAC,GAAU,aAAAC,OAAiB,gBACnE,OAAS,cAAAC,GAAY,gCAAAC,GAA8B,gBAAAC,MAAoB,gBAEvE,OAAOC,GAAS,YAAAC,OAAgB,QCFhC,OAAOC,IAAS,YAAAC,OAAgB,QAWzB,SAASC,GAAqBC,EAA+C,CAClF,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAsCH,EAAM,YAAY,EAElF,SAASI,EAAaC,EAA8C,CAClE,IAAMC,EAAaC,GAAiCF,CAAS,EAC7DH,EAASI,CAAU,EACfN,EAAM,UACRA,EAAM,SAASM,CAAU,CAE7B,CAEA,OACEE,GAAA,cAACC,GAAA,CACC,kBAAmBT,EAAM,SACzB,KAAMA,EAAM,KACZ,YAAaA,EAAM,YACnB,aAAcC,GAASS,GAAiCT,CAAK,EAC7D,kBAAmB,EACnB,SAAUG,EACZ,CAEJ,CAEA,SAASM,GAAiCC,EAAmE,CAC3G,OAAOA,EAAQ,QAAQ,IAAKC,IAAO,CACjC,OAAQA,EAAE,OACV,KAAMA,EAAE,KACR,QAASA,EAAE,OACb,EAAE,CACJ,CAEA,SAASL,GAAiCM,EAAoE,CAC5G,GAAIA,EAAS,SAAW,EAGxB,MAAO,CACL,OAAQA,EAAS,IAAKC,IAAO,CAC3B,OAAQA,EAAE,OACV,KAAMA,EAAE,KACR,QAASA,EAAE,OACb,EAAE,CACJ,CACF,CCrDA,OAAOC,IAAS,YAAAC,OAAgB,QAWzB,SAASC,GAAYC,EAAsC,CAChE,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAA6BH,EAAM,YAAY,EAEzE,SAASI,EAAaC,EAA8C,CAClE,IAAMC,EAAWD,EAAU,CAAC,EACtBE,EAAaD,GAAYE,GAAwBF,CAAQ,EAC/DJ,EAASK,CAAU,EACfP,EAAM,UACRA,EAAM,SAASO,CAAU,CAE7B,CAEA,OACEE,GAAA,cAACC,GAAA,CACC,kBAAmBV,EAAM,SACzB,KAAMA,EAAM,KACZ,YAAaA,EAAM,YACnB,aAAcC,GAASU,GAAwBV,CAAK,EACpD,kBAAmB,EACnB,SAAUG,EACZ,CAEJ,CAEA,SAASO,GAAwBC,EAA2C,CAC1E,MAAO,CACL,OAAQA,EAAO,OACf,KAAMA,EAAO,KACb,QAASA,EAAO,OAClB,CACF,CAEA,SAASJ,GAAwBK,EAA4C,CAC3E,MAAO,CACL,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,QAASA,EAAQ,OACnB,CACF,CClDA,OAAS,SAAAC,GAAO,aAAAC,OAAiB,gBAEjC,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCFxC,OAAS,SAAAC,GAAO,gBAAAC,GAAc,aAAAC,OAAiB,gBAE/C,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAQjC,SAASC,GAAkBC,EAA4C,CAC5E,GAAM,CAACC,EAAcC,CAAe,EAAIJ,GAASE,EAAM,YAAY,EAE7DG,EAAMN,GAAqB,EACjCM,EAAI,QAAUF,EAEd,SAASG,EAAuBC,EAA0C,CACpEA,GAAY,OAAO,KAAKA,CAAQ,EAAE,SAAW,IAC/CA,EAAW,QAEbH,EAAgBG,CAAQ,EACpBL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,SAASC,EAAUC,EAA6E,CAC9F,IAAMF,EAAyB,CAAE,GAAGF,EAAI,QAAS,OAAAI,CAAO,EACnDA,GACH,OAAOF,EAAS,OAElBD,EAAuBC,CAAQ,CACjC,CAEA,SAASG,EAAOC,EAAwD,CACtE,IAAMJ,EAAyB,CAAE,GAAGF,EAAI,QAAS,IAAAM,CAAI,EAChDA,GACH,OAAOJ,EAAS,IAElBD,EAAuBC,CAAQ,CACjC,CAEA,SAASK,EAASC,EAAqB,CACrC,IAAMN,EAAyB,CAAE,GAAGF,EAAI,QAAS,MAAAQ,CAAM,EAClDA,GACH,OAAON,EAAS,MAElBD,EAAuBC,CAAQ,CACjC,CAEA,OACET,GAAA,cAACH,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BG,GAAA,cAACF,GAAA,CACC,cAAY,SACZ,aAAcO,GAAc,OAC5B,SAAWW,GACTN,EAAUM,EAAE,cAAc,KAAsE,EAElG,KAAM,CAAC,GAAI,QAAS,QAAS,MAAO,QAAS,MAAO,OAAO,EAC7D,EACAhB,GAAA,cAACF,GAAA,CACC,cAAY,MACZ,aAAcO,GAAc,IAC5B,SAAWW,GAAMJ,EAAOI,EAAE,cAAc,KAAoD,EAC5F,KAAM,CAAC,GAAI,OAAQ,OAAQ,OAAQ,MAAO,QAAQ,EACpD,EACAhB,GAAA,cAACD,GAAA,CACC,YAAY,QACZ,aAAcM,GAAc,MAC5B,SAAWW,GAAMF,EAASE,EAAE,cAAc,KAAK,EACjD,CACF,CAEJ,CD9DO,SAASC,GAAmBC,EAA6C,CAC9E,GAAM,CAACC,EAAcC,CAAgB,EAAIC,GAASH,EAAM,YAAY,EAE9DI,EAAMC,GAAsB,EAClCD,EAAI,QAAUH,EAEd,SAASK,EAAwBC,EAA+B,CAC9DL,EAAiBK,CAAQ,EACrBP,EAAM,UACRA,EAAM,SAASO,CAAQ,CAE3B,CAEA,SAASC,EAAQC,EAAoB,CACnC,IAAMF,EAA0B,CAAE,GAAGH,EAAI,QAAS,KAAAK,CAAK,EAClDA,GACH,OAAOF,EAAS,KAElBD,EAAwBC,CAAQ,CAClC,CAEA,SAASG,EAAWC,EAAyC,CAC3D,IAAMJ,EAA0B,CAAE,GAAGH,EAAI,QAAS,QAASO,GAAW,CAACA,CAAO,CAAE,EAC3EA,GACH,OAAOJ,EAAS,QAElBD,EAAwBC,CAAQ,CAClC,CAEA,OACEK,GAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,GAAA,cAACE,GAAA,CACC,cAAad,EAAM,KAAO,QAC1B,KAAMA,EAAM,KAAO,QACnB,YAAY,OACZ,MAAO,CAAE,MAAO,GAAI,EACpB,aAAcC,GAAc,KAC5B,SAAWc,GAAMP,EAAQO,EAAE,cAAc,KAAK,EAChD,EACAH,GAAA,cAACI,GAAA,CACC,KAAMhB,EAAM,KAAO,WACnB,aAAcC,GAAc,UAAU,CAAC,EACvC,SAAUS,EACZ,CACF,CAEJ,CEzDA,OAAS,aAAAO,OAAiB,gBAC1B,OAAS,eAAAC,OAAmB,gBAE5B,OAAOC,OAAW,QAqBX,SAASC,GAAcC,EAAwC,CACpE,OACEC,GAAA,cAACC,GAAA,CACC,GAAIF,EAAM,KACV,KAAMA,EAAM,KACZ,iBAAgBA,EAAM,UACtB,cAAaA,EAAM,KACnB,YAAaA,EAAM,YACnB,SAAUA,EAAM,SAChB,KAAMG,GAAa,EACnB,aAAcC,GAAkBJ,EAAM,YAAY,EAClD,UAAWA,EAAM,UACjB,MAAOK,GAAkBL,EAAM,QAASA,EAAM,IAAI,EAClD,SAAWM,GAA2C,CACpD,GAAIN,EAAM,SAAU,CAClB,IAAMO,EAAWD,EAAE,cAAc,MACjCN,EAAM,SAASQ,GAAkBD,CAAQ,CAAC,CAC5C,CACF,EACF,CAEJ,CAOO,SAASH,GAAkBK,EAAuC,CACvE,GAAI,CAACA,EACH,MAAO,GAMT,IAAMC,EAAO,IAAI,KAAKD,CAAS,EAC/B,OAAKE,GAAYD,CAAI,EAKdA,EAAK,mBAAmB,IAAI,EAAI,IAAMA,EAAK,mBAAmB,IAAI,EAHhE,EAIX,CAOO,SAASF,GAAkBI,EAAyC,CACzE,GAAI,CAACA,EACH,MAAO,GAMT,IAAMF,EAAO,IAAI,KAAKE,CAAW,EACjC,OAAKD,GAAYD,CAAI,EAKdA,EAAK,YAAY,EAHf,EAIX,CAQA,SAASP,IAAuB,CAC9B,MAAkD,gBACpD,CCnGA,OAAS,aAAAU,OAAiB,gBAC1B,OAAS,aAAAC,OAAiB,gBAE1B,OAAOC,OAAW,QAQX,SAASC,GAAeC,EAAyC,CACtE,OACEF,GAAA,cAACF,GAAA,CACC,GAAII,EAAM,KACV,KAAMA,EAAM,KACZ,cAAY,kBACZ,aAAcH,GAAUG,EAAM,YAAY,EAC1C,YAAa,KAAK,MAClB,SAAWC,GAAa,CAClBD,EAAM,UACRA,EAAM,SAAS,KAAK,MAAMC,CAAQ,CAAC,CAEvC,EACF,CAEJ,CC1BA,OAAS,SAAAC,GAAO,gBAAAC,GAAc,aAAAC,OAAiB,gBAE/C,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAQjC,SAASC,GAAeC,EAAyC,CACtE,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,GAAgCE,EAAM,YAAY,EAEtEG,EAAWN,GAAkB,EACnCM,EAAS,QAAUF,EAEnB,SAASG,EAAgBC,EAA2B,CAClDH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,SAASC,EAAOC,EAAoG,CAClHH,EAAgB,CAAE,GAAGD,EAAS,QAAS,IAAKI,GAAO,MAAU,CAAC,CAChE,CAEA,SAASC,EAAUC,EAAsB,CACvCL,EAAgB,CACd,GAAGD,EAAS,QACZ,OAAQM,EAASA,EAAO,MAAM,GAAG,EAAI,MACvC,CAAC,CACH,CAEA,SAASC,EAASC,EAAqB,CACrCP,EAAgB,CACd,GAAGD,EAAS,QACZ,MAAOQ,EAAQA,EAAM,MAAM,GAAG,EAAI,MACpC,CAAC,CACH,CAEA,SAASC,EAAUC,EAAsB,CACvCT,EAAgB,CACd,GAAGD,EAAS,QACZ,OAAQU,GAAU,MACpB,CAAC,CACH,CAEA,SAASC,EAAUC,EAAsB,CACvCX,EAAgB,CACd,GAAGD,EAAS,QACZ,OAAQY,EAASA,EAAO,MAAM,GAAG,EAAI,MACvC,CAAC,CACH,CAEA,OACEnB,GAAA,cAACH,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BG,GAAA,cAACF,GAAA,CACC,aAAcO,GAAO,IACrB,KAAMD,EAAM,KAAO,OACnB,cAAY,MACZ,SAAWgB,GACTV,EAAOU,EAAE,cAAc,KAAoF,EAE7G,KAAM,CAAC,GAAI,OAAQ,MAAO,QAAS,WAAY,WAAY,YAAa,QAAQ,EAClF,EACApB,GAAA,cAACD,GAAA,CACC,YAAY,SACZ,KAAMK,EAAM,KAAO,UACnB,aAAcC,GAAO,QAAQ,KAAK,GAAG,EACrC,SAAWe,GAAMR,EAAUQ,EAAE,cAAc,KAAK,EAClD,EACApB,GAAA,cAACD,GAAA,CACC,YAAY,QACZ,KAAMK,EAAM,KAAO,SACnB,aAAcC,GAAO,OAAO,KAAK,GAAG,EACpC,SAAWe,GAAMN,EAASM,EAAE,cAAc,KAAK,EACjD,EACApB,GAAA,cAACD,GAAA,CACC,KAAMK,EAAM,KAAO,UACnB,YAAY,SACZ,aAAcC,GAAO,OACrB,SAAWe,GAAMJ,EAAUI,EAAE,cAAc,KAAK,EAClD,EACApB,GAAA,cAACD,GAAA,CACC,YAAY,SACZ,KAAMK,EAAM,KAAO,UACnB,aAAcC,GAAO,QAAQ,KAAK,GAAG,EACrC,SAAWe,GAAMF,EAAUE,EAAE,cAAc,KAAK,EAClD,CACF,CAEJ,CC5FA,OAAS,SAAAC,GAAO,aAAAC,OAAiB,gBAEjC,OAAOC,IAAS,YAAAC,OAAgB,QAQzB,SAASC,GAAgBC,EAA0C,CACxE,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,GAASE,EAAM,YAAY,EAErD,SAASG,EAAgBC,EAA4B,CACnDF,EAASE,CAAQ,EACbJ,EAAM,UACRA,EAAM,SAASI,CAAQ,CAE3B,CAEA,OACEP,GAAA,cAACF,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BE,GAAA,cAACD,GAAA,CACC,YAAY,SACZ,aAAcK,GAAO,OACrB,SAAWI,GAAMF,EAAgB,CAAE,GAAGF,EAAO,OAAQI,EAAE,cAAc,KAAM,CAAC,EAC9E,EACAR,GAAA,cAACD,GAAA,CACC,YAAY,QACZ,aAAcK,GAAO,MACrB,SAAWI,GAAMF,EAAgB,CAAE,GAAGF,EAAO,MAAOI,EAAE,cAAc,KAAM,CAAC,EAC7E,CACF,CAEJ,CClCA,OAAS,gBAAAC,GAAc,aAAAC,OAAiB,gBAGxC,OAAOC,IAAS,eAAAC,GAAa,YAAAC,OAAgB,QAiB7C,IAAMC,GAAO,CAAC,MAAO,MAAO,MAAO,MAAO,KAAK,EAUxC,SAASC,GAAWC,EAAqC,CAC9D,GAAM,CAAE,SAAAC,CAAS,EAAID,EACf,CAACE,EAAOC,CAAQ,EAAIN,GAASG,EAAM,YAAY,EAE/CI,EAAkBR,GACrBS,GAA0B,CACzBF,EAASE,CAAQ,EACbJ,GACFA,EAASI,CAAQ,CAErB,EACA,CAACJ,CAAQ,CACX,EAEMK,EAAuBV,GAC1BW,GAA4C,CAC3CH,EAAgB,CACd,GAAGF,EACH,SAAUK,EAAE,cAAc,KAC5B,CAAC,CACH,EACA,CAACL,EAAOE,CAAe,CACzB,EAEMI,EAAoBZ,GACvBW,GAA2C,CAC1CH,EAAgB,CACd,GAAGF,EACH,MAAOK,EAAE,cAAc,aACzB,CAAC,CACH,EACA,CAACL,EAAOE,CAAe,CACzB,EAEMK,EACJd,GAAA,cAACe,GAAA,CACC,aAAcR,GAAO,SACrB,KAAMJ,GACN,OAAQ,CACN,MAAO,CACL,WAAY,IACZ,oBAAqB,EACrB,uBAAwB,EACxB,MAAO,EACT,CACF,EACA,SAAUQ,EACZ,EAGF,OACEX,GAAA,cAACgB,GAAA,CACC,KAAK,SACL,MAAOX,EAAM,MACb,YAAaA,EAAM,aAAe,QAClC,aAAcE,GAAO,OAAO,SAAS,GAAK,MAC1C,KAAMP,GAAA,cAACiB,GAAA,CAAmB,KAAM,GAAI,EACpC,aAAcH,EACd,kBAAmB,GACnB,SAAUD,EACZ,CAEJ,CC5FA,OAAS,SAAAK,OAAa,gBAEtB,OAAOC,IAAS,YAAAC,OAAgB,QASzB,SAASC,GAAYC,EAAsC,CAChE,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAASH,EAAM,YAAY,EAErD,SAASI,EAAgBC,EAAwB,CAC/CH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,OACEC,GAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,SACnB,YAAY,QACZ,aAAcC,GAAO,MACrB,SAAWI,GAAaD,EAAgB,CAAE,GAAGH,EAAO,MAAOI,CAAS,CAAC,EACvE,EACAC,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,OACnB,YAAY,MACZ,aAAcC,GAAO,IACrB,SAAWI,GAAaD,EAAgB,CAAE,GAAGH,EAAO,IAAKI,CAAS,CAAC,EACrE,CACF,CAEJ,CCrCA,OAAS,SAAAI,GAAO,gBAAAC,GAAc,aAAAC,OAAiB,gBAE/C,OAAOC,IAAS,YAAAC,OAA4B,QAUrC,SAASC,GAAcC,EAAwC,CACpE,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,GAASE,EAAM,YAAY,EAErD,SAASG,EAAgBC,EAA0B,CACjDF,EAASE,CAAQ,EACbJ,EAAM,UACRA,EAAM,SAASI,CAAQ,CAE3B,CAEA,OACEP,GAAA,cAACH,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BG,GAAA,cAACF,GAAA,CACC,MAAO,CAAE,MAAO,EAAG,EACnB,cAAaK,EAAM,KAAO,cAC1B,aAAcC,GAAO,WACrB,KAAM,CAAC,GAAI,IAAK,KAAM,KAAM,GAAG,EAC/B,SAAWI,GACTF,EAAgB,CACd,GAAGF,EACH,WAAYI,EAAE,cAAc,KAC9B,CAAC,EAEL,EACAR,GAAA,cAACD,GAAA,CACC,GAAII,EAAM,KACV,KAAMA,EAAM,KACZ,iBAAgBA,EAAM,UACtB,cAAaA,EAAM,KAAO,SAC1B,KAAK,SACL,YAAY,QACZ,aAAcC,GAAO,MACrB,UAAWD,EAAM,UACjB,KAAK,MACL,QAAUK,GAAoC,CACxCL,EAAM,cACRK,EAAE,cAAc,KAAK,CAEzB,EACA,SAAWA,GAAM,CACfF,EAAgB,CACd,GAAGF,EACH,MAAOK,GAAeD,EAAE,cAAc,KAAK,CAC7C,CAAC,CACH,EACF,EACAR,GAAA,cAACD,GAAA,CACC,YAAY,OACZ,cAAaI,EAAM,KAAO,QAC1B,aAAcC,GAAO,KACrB,SAAWI,GACTF,EAAgB,CACd,GAAGF,EACH,KAAMI,EAAE,cAAc,KACxB,CAAC,EAEL,CACF,CAEJ,CAEA,SAASC,GAAeC,EAAiC,CACvD,GAAKA,EAGL,OAAO,WAAWA,CAAG,CACvB,CC9EA,OAAS,SAAAC,OAAa,gBAEtB,OAAOC,IAAS,YAAAC,OAAgB,QAezB,SAASC,GAAWC,EAAqC,CAC9D,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAASH,EAAM,YAAY,EAErD,SAASI,EAAgBC,EAAuB,CAC9CH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,OACEC,GAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,OACnB,aAAcC,GAAO,IACrB,SAAWQ,GACTL,EAAgB,CACd,GAAGH,EACH,IAAKQ,CACP,CAAC,EAEL,EAEAH,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,QACnB,aAAcC,GAAO,KACrB,SAAWQ,GACTL,EAAgB,CACd,GAAGH,EACH,KAAMQ,CACR,CAAC,EAEL,CACF,CAEJ,CCpDA,OAAS,SAAAC,OAAa,gBAEtB,OAAOC,IAAS,YAAAC,OAAgB,QAezB,SAASC,GAAWC,EAAqC,CAC9D,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAASH,EAAM,YAAY,EAErD,SAASI,EAAgBC,EAAuB,CAC9CH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,OACEC,GAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,aACnB,aAAcC,GAAO,UACrB,SAAWQ,GACTL,EAAgB,CACd,GAAGH,EACH,UAAWQ,CACb,CAAC,EAEL,EACAH,GAAA,cAACE,GAAA,CACC,KAAMR,EAAM,KAAO,eACnB,aAAcC,GAAO,YACrB,SAAWQ,GACTL,EAAgB,CACd,GAAGH,EACH,YAAaQ,CACf,CAAC,EAEL,CACF,CAEJ,CCnDA,OAAS,SAAAC,GAAO,gBAAAC,GAAc,aAAAC,OAAiB,gBAC/C,OAAS,mBAAAC,OAAuB,gBAEhC,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCHxC,OAAS,SAAAC,GAAO,QAAAC,OAAY,gBAC5B,OAAS,oBAAAC,GAAkB,sBAAAC,OAA0B,gBAErD,OAAOC,IAAS,cAAAC,GAAY,eAAAC,GAAa,YAAAC,OAAgB,QAYzD,IAAMC,GAAuC,CAC3C,YAAa,OACb,KAAM,gBACR,EAOMC,GAAsB,CAC1B,eACA,UACA,qBACA,MACA,sBACA,oBACA,aACA,wBACA,aACA,0BACA,WACA,kBACA,WACA,mBACA,kBACA,kBACA,oBACA,sBACA,gBACA,UACA,WACA,UACA,mBACA,oBACA,eACA,sBACA,eACA,UACA,SACA,iBACA,eACA,UACA,gBACA,gBACA,qBACA,4BACA,wBACA,kBACA,sBACA,eACA,0BACA,aACA,oBACA,UACF,EAWA,SAASC,GAA6BC,EAAyC,CAC7E,MAAO,CACL,MAAOC,GAAmBD,CAAQ,EAClC,MAAOE,GAAiBF,CAAQ,EAChC,SAAAA,CACF,CACF,CAEO,SAASG,GAA6CC,EAAkD,CAC7G,IAAMC,EAAUC,EAAW,EACrBC,EAAeH,EAAM,aACrB,CAACI,EAASC,CAAU,EAAIC,GAA2B,EACnDC,EAAeC,EAAYR,EAAM,aAAcK,CAAU,EACzDI,EAAWT,EAAM,SAEjBU,EAAaC,GACjB,MAAOC,EAAeC,IAAsC,CAC1D,IAAMC,EAAaC,GAA8BZ,CAAY,EACvDa,EAAe,IAAI,gBAAgB,CACvC,CAACF,CAAU,EAAGF,EACd,OAAQ,IACV,CAAC,EAGD,OADkB,MAAMX,EAAQ,gBAAgBE,EAAca,EAAc,CAAE,OAAAH,CAAO,CAAC,CAExF,EACA,CAACZ,EAASE,CAAY,CACxB,EAEMc,EAAeN,GAClBO,GAAsB,CACjBT,GACFA,EAASS,EAAa,CAAC,CAAC,CAE5B,EACA,CAACT,CAAQ,CACX,EAEA,OAAIT,EAAM,cAAgB,CAACI,GAAW,CAACG,EAI9B,KAIPY,GAAA,cAACC,GAAA,CACC,KAAMpB,EAAM,KACZ,cAAeqB,GACf,aAAcd,EACd,YAAaP,EAAM,YACnB,kBAAmB,EACnB,MAAOH,GACP,SAAUF,GACV,YAAae,EACb,SAAUO,EACV,UAAS,GACX,CAEJ,CAEA,IAAMI,GAAgBC,GAAgC,CAAC,CAAE,MAAAC,EAAO,SAAA3B,EAAU,GAAG4B,CAAO,EAAQC,IAExFN,GAAA,cAAC,OAAI,IAAKM,EAAM,GAAGD,GACjBL,GAAA,cAACO,GAAA,CAAM,OAAM,IACXP,GAAA,cAACQ,GAAA,CAAe,MAAO/B,EAAU,EACjCuB,GAAA,cAAC,WACCA,GAAA,cAACS,GAAA,KAAML,CAAM,EACbJ,GAAA,cAACS,GAAA,CAAK,KAAK,KAAK,MAAM,UAClBhC,EAAqB,SACzB,CACF,CACF,CACF,CAEH,EAUD,SAASmB,GAA8BZ,EAA8B,CACnE,OAAOV,GAAaU,CAAY,IAAMT,GAAoB,SAASS,CAAY,EAAI,OAAS,MAC9F,CDzJO,SAAS0B,GAAeC,EAAyC,CACtE,IAAMC,EAAcC,GAAeF,EAAM,WAAW,EAC9CG,EAAsBC,GAAuBJ,EAAM,aAAcC,CAAW,EAC5E,CAACI,EAAOC,CAAQ,EAAIC,GAAgCP,EAAM,YAAY,EACtE,CAACQ,EAAcC,CAAe,EAAIF,GAA6BJ,CAAmB,EAElFO,EAAWC,GAAkB,EACnCD,EAAS,QAAUL,EAEnB,IAAMO,EAAkBD,GAAe,EACvCC,EAAgB,QAAUJ,EAE1B,SAASK,EAAeC,EAAuC,CAC7DR,EAASQ,CAAQ,EACbd,EAAM,UACRA,EAAM,SAASc,CAAQ,CAE3B,CAEA,OACEC,GAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC5Bf,EACCc,GAAA,cAACE,GAAA,CACC,iBAAgBjB,EAAM,UACtB,cAAY,uCACZ,aAAcQ,EACd,UAAWR,EAAM,UACjB,SAAWkB,GAAMT,EAAgBS,EAAE,cAAc,KAAK,EACtD,KAAMjB,EACR,EAEAc,GAAA,cAACI,GAAA,CACC,iBAAgBnB,EAAM,UACtB,cAAY,sCACZ,aAAcQ,EACd,UAAWR,EAAM,UACjB,SAAWkB,GAAMT,EAAgBS,EAAE,cAAc,KAAK,EACxD,EAEFH,GAAA,cAACK,GAAA,CACC,aAAcZ,EACd,KAAMR,EAAM,KAAO,MACnB,YAAaA,EAAM,YACnB,aAAcK,EACd,SAAWgB,GAA+B,CACxCR,EAAeQ,EAAOC,GAAgBD,CAAI,EAAI,MAAS,CACzD,EACF,CACF,CAEJ,CAEA,SAASnB,GAAeD,EAAyD,CAC/E,GAAI,GAACA,GAAeA,EAAY,SAAW,GAAMA,EAAY,SAAW,GAAKA,EAAY,CAAC,IAAM,YAGhG,OAAOA,CACT,CAEA,SAASG,GACPmB,EACAtB,EACoB,CACpB,IAAMuB,EAA2BD,GAAc,WAAW,MAAM,GAAG,EAAE,CAAC,EACtE,GAAIC,EACF,OAAOA,EAGT,GAAIvB,GAAeA,EAAY,OAAS,EACtC,OAAOA,EAAY,CAAC,CAIxB,CExFA,OAAS,cAAAwB,OAAkB,gBAG3B,OAAOC,IAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAYjC,SAASC,GAAmBC,EAA6C,CAC9E,GAAM,CAACC,EAAQC,CAAS,EAAIC,GAC1BH,EAAM,cAAgB,MAAM,QAAQA,EAAM,YAAY,EAAIA,EAAM,aAAe,CAAC,CAClF,EAEMI,EAAYC,GAAc,EAChCD,EAAU,QAAUH,EAEpB,SAASK,EAAiBC,EAAwB,CAChDL,EAAUK,CAAS,EACfP,EAAM,UACRA,EAAM,SAASO,CAAS,CAE5B,CAEA,OACEC,GAAA,cAAC,SAAM,MAAO,CAAE,MAAO,OAAQ,eAAgB,UAAW,GACxDA,GAAA,cAAC,gBACCA,GAAA,cAAC,OAAI,MAAM,MAAM,EACjBA,GAAA,cAAC,OAAI,MAAM,KAAK,CAClB,EACAA,GAAA,cAAC,aACEP,EAAO,IAAI,CAACQ,EAAGC,IACdF,GAAA,cAAC,MAAG,IAAK,GAAGE,CAAK,IAAIT,EAAO,MAAM,IAChCO,GAAA,cAAC,UACCA,GAAA,cAACG,GAAA,CACC,aAAc,GACd,SAAUX,EAAM,SAChB,KAAMA,EAAM,KAAO,IAAMU,EACzB,aAAcD,EACd,SAAWG,GAAkB,CAC3B,IAAMC,EAAO,CAAC,GAAIT,EAAU,OAAiB,EAC7CS,EAAKH,CAAK,EAAIE,EACdN,EAAiBO,CAAI,CACvB,EACF,CACF,EACAL,GAAA,cAAC,MAAG,MAAO,CAAE,UAAW,OAAQ,GAC9BA,GAAA,cAACM,GAAA,CACC,MAAM,SACN,KAAK,KACL,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACX,IAAMF,EAAO,CAAC,GAAIT,EAAU,OAAiB,EAC7CS,EAAK,OAAOH,EAAO,CAAC,EACpBJ,EAAiBO,CAAI,CACvB,GAEAL,GAAA,cAACS,GAAA,IAAgB,CACnB,CACF,CACF,CACD,EACDT,GAAA,cAAC,UACCA,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,MAAG,MAAO,CAAE,UAAW,OAAQ,GAC9BA,GAAA,cAACM,GAAA,CACC,MAAM,MACN,KAAK,KACL,MAAM,QACN,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACX,IAAMF,EAAO,CAAC,GAAIT,EAAU,OAAiB,EAC7CS,EAAK,KAAK,MAAS,EACnBP,EAAiBO,CAAI,CACvB,GAEAL,GAAA,cAACU,GAAA,IAAe,CAClB,CACF,CACF,CACF,CACF,CAEJ,CCzFA,OAAS,UAAAC,GAAQ,QAAAC,GAAM,SAAAC,GAAO,SAAAC,GAAO,gBAAAC,GAAc,SAAAC,GAAO,UAAAC,GAAQ,aAAAC,OAAiB,gBACnF,OAAS,gBAAAC,OAAoB,gBAE7B,OAAOC,GAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAIxC,IAAMC,GAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAY5D,SAASC,GAAYC,EAAsC,CAChE,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAA6BH,EAAM,YAAY,EACnE,CAACI,EAAMC,CAAO,EAAIF,GAAS,EAAK,EAEhCG,EAAWC,GAAe,EAChC,OAAAD,EAAS,QAAUL,EAGjBO,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,EAAA,cAAC,YAAME,GAAaJ,EAAS,OAAO,GAAK,WAAY,EACrDE,EAAA,cAACG,GAAA,CAAO,QAAS,IAAMN,EAAQ,EAAI,GAAG,MAAI,CAC5C,EACAG,EAAA,cAACI,GAAA,CACC,QAASR,EACT,aAAcE,EAAS,QACvB,KAAOO,GAAa,CACdb,EAAM,UACRA,EAAM,SAASa,CAAQ,EAEzBX,EAASW,CAAQ,EACjBR,EAAQ,EAAK,CACf,EACA,SAAU,IAAMA,EAAQ,EAAK,EAC/B,CACF,CAEJ,CASA,IAAMS,GAAuB,CAC3B,OAAQ,CACN,OAAQ,EACR,WAAY,GACd,CACF,EAEA,SAASF,GAAmBZ,EAA6C,CACvE,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAiBH,EAAM,cAAgBc,EAAY,EAEvER,EAAWC,GAAe,EAChCD,EAAS,QAAUL,EAEnB,SAASc,EAASC,EAAwB,CACxCd,EAAS,CAAE,GAAGI,EAAS,QAAS,MAAO,CAACU,CAAQ,CAAE,CAAC,CACrD,CAEA,SAASC,EAAUC,EAAwC,CACzDhB,EAAS,CAAE,GAAGI,EAAS,QAAS,OAAAY,CAAO,CAAC,CAC1C,CAEA,SAASC,EAAUC,EAAqC,CACtDH,EAAU,CAAE,GAAGX,EAAS,SAAS,OAAQ,OAAQc,CAAU,CAAC,CAC9D,CAEA,SAASC,EAAcC,EAA6C,CAClEL,EAAU,CAAE,GAAGX,EAAS,SAAS,OAAQ,WAAYgB,CAAc,CAAC,CACtE,CAEA,SAASC,EAAcC,EAA8C,CACnEP,EAAU,CAAE,GAAGX,EAAS,SAAS,OAAQ,UAAWkB,CAAc,CAAC,CACrE,CAEA,OACEhB,EAAA,cAACiB,GAAA,CACC,MAAM,SACN,iBAAkB,CAAE,aAAc,OAAQ,EAC1C,OAAQzB,EAAM,QACd,QAAS,IAAMA,EAAM,SAAS,GAE9BQ,EAAA,cAACkB,GAAA,KACClB,EAAA,cAACmB,GAAA,CAAY,MAAM,YAAY,QAAS,uBACtCnB,EAAA,cAACoB,GAAA,CAAc,KAAM,sBAAuB,SAAWf,GAAaE,EAASF,CAAQ,EAAG,CAC1F,EACAL,EAAA,cAACqB,GAAA,CACC,MAAM,SACN,QAAS,CAAC,CAAC5B,EAAM,OACjB,SAAW6B,GAAMb,EAAUa,EAAE,cAAc,QAAUhB,GAAa,OAAS,MAAS,EACtF,EACCb,EAAM,QACLO,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACmB,GAAA,CAAY,MAAM,eAAe,QAAS,wBACzCnB,EAAA,cAACC,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BD,EAAA,cAACuB,GAAA,CACC,KAAK,SACL,KAAM,EACN,GAAG,uBACH,KAAK,uBACL,aAAc9B,EAAM,OAAO,QAAU,EACrC,SAAW6B,GAAMX,EAAU,SAASW,EAAE,cAAc,MAAO,EAAE,GAAK,CAAC,EACrE,EACAtB,EAAA,cAACwB,GAAA,CACC,GAAG,2BACH,KAAK,2BACL,aAAc/B,EAAM,OAAO,WAC3B,SAAW6B,GAAMT,EAAcS,EAAE,cAAc,KAA+B,EAC9E,KAAM,CACJ,CAAE,MAAO,SAAU,MAAO,GAAI,EAC9B,CAAE,MAAO,SAAU,MAAO,KAAM,EAChC,CAAE,MAAO,OAAQ,MAAO,GAAI,EAC5B,CAAE,MAAO,MAAO,MAAO,GAAI,EAC3B,CAAE,MAAO,OAAQ,MAAO,IAAK,EAC7B,CAAE,MAAO,QAAS,MAAO,IAAK,EAC9B,CAAE,MAAO,OAAQ,MAAO,GAAI,CAC9B,EACF,CACF,CACF,EACC7B,EAAM,OAAO,aAAe,MAC3BO,EAAA,cAACmB,GAAA,CAAY,MAAM,aACjBnB,EAAA,cAACyB,GAAK,MAAL,CAAW,SAAQ,GAAC,SAAUV,GAC7Bf,EAAA,cAACC,GAAA,CAAM,SAAS,QAAQ,GAAG,KAAK,QAAQ,MACrCX,GAAW,IAAKoC,GACf1B,EAAA,cAACyB,GAAA,CAAK,IAAKC,EAAK,MAAOA,EAAK,KAAK,KAAK,OAAO,MAC1CA,EAAI,OAAO,CAAC,EAAE,YAAY,CAC7B,CACD,CACH,CACF,CACF,CAEJ,EAEF1B,EAAA,cAACC,GAAA,CAAM,SAAS,SACdD,EAAA,cAACG,GAAA,CAAO,QAAS,IAAMX,EAAM,KAAKC,CAAK,GAAG,IAAE,CAC9C,CACF,CACF,CAEJ,CjBpHO,SAASkC,GAAsBC,EAAgD,CACpF,IAAMC,EAAWD,EAAM,SACjBE,EAAeF,EAAM,qBAAwBC,EAAS,OAAO,CAAC,GAAG,KACjEE,EAAOH,EAAM,KACbI,EAAQJ,EAAM,aAEpB,GAAIC,EAAS,MAAQ,KAAO,CAACD,EAAM,aACjC,OAAIE,IAAiBG,EAAa,WACzBC,EAAA,cAACC,GAAA,CAAqB,KAAMJ,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAEnFM,EAAA,cAACE,GAAA,CAAmB,SAAUP,EAAU,KAAME,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAG5G,IAAMS,EAAgBR,EAAS,KAC/B,OAAIQ,EAAc,OAAS,EAClBH,EAAA,cAACI,GAAA,CAA+B,uBAAwBD,EAAgB,GAAGT,EAAO,EAElFM,EAAA,cAACK,GAAA,CAA2B,sBAAuBF,EAAc,CAAC,EAAI,GAAGT,EAAO,CAE3F,CAMO,SAASU,GAA+BV,EAAoD,CACjG,IAAMS,EAAgBT,EAAM,uBACxBY,EACAZ,EAAM,sBACRY,EAAsBH,EAAc,KAAMI,GAAMA,EAAE,OAASb,EAAM,mBAAmB,GAEjFY,IACHA,EAAsBH,EAAc,CAAC,GAEvC,GAAM,CAACK,EAAcC,CAAe,EAAIC,GAASJ,CAAmB,EACpE,OACEN,EAAA,cAACW,GAAA,CAAM,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC7BX,EAAA,cAACY,GAAA,CACC,MAAO,CAAE,MAAO,OAAQ,EACxB,aAAcJ,EAAa,KAC3B,SAAWK,GAAM,CACfJ,EACEN,EAAc,KACXW,GAAgCA,EAAK,OAASD,EAAE,cAAc,KACjE,CACF,CACF,EACA,KAAMV,EAAc,IAAKW,IAAiC,CACxD,MAAOA,EAAK,KACZ,MAAOA,EAAK,IACd,EAAE,EACJ,EACAd,EAAA,cAACK,GAAA,CACE,GAAGX,EACJ,sBAAuBc,EACvB,SAAWO,GAAkB,CACvBrB,EAAM,UACRA,EAAM,SAASqB,EAAUrB,EAAM,KAAK,QAAQ,MAAOsB,GAAWR,EAAa,IAAc,CAAC,CAAC,CAE/F,EACF,CACF,CAEJ,CAMO,SAASH,GAA2BX,EAAqD,CAC9F,IAAMC,EAAWD,EAAM,SACjBE,EAAeF,EAAM,sBAAsB,KAC3CG,EAAOH,EAAM,KACbI,EAAQJ,EAAM,aACduB,EAAWtB,EAAS,MAAQ,QAAaA,EAAS,IAAM,EAE9D,OAAQC,EAAc,CAIpB,KAAKG,EAAa,aAClB,KAAKA,EAAa,UAClB,KAAKA,EAAa,OAClB,KAAKA,EAAa,KAClB,KAAKA,EAAa,IAClB,KAAKA,EAAa,IAChB,OACEC,EAAA,cAACkB,GAAA,CACC,GAAIrB,EACJ,KAAMA,EACN,cAAaA,EACb,aAAcC,EACd,SAAUmB,EACV,SAAWJ,GAAM,CACXnB,EAAM,UACRA,EAAM,SAASmB,EAAE,cAAc,KAAK,CAExC,EACA,MAAOM,GAAkBzB,EAAM,QAASG,CAAI,EAC9C,EAEJ,KAAKE,EAAa,KAChB,OACEC,EAAA,cAACkB,GAAA,CACC,KAAK,OACL,GAAIrB,EACJ,KAAMA,EACN,cAAaA,EACb,aAAcC,EACd,SAAUmB,EACV,SAAWJ,GAAM,CACXnB,EAAM,UACRA,EAAM,SAASmB,EAAE,cAAc,KAAK,CAExC,EACA,MAAOM,GAAkBzB,EAAM,QAASG,CAAI,EAC9C,EAEJ,KAAKE,EAAa,SAClB,KAAKA,EAAa,QAChB,OAAOC,EAAA,cAACoB,GAAA,CAAc,KAAMvB,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,QAASA,EAAM,QAAS,EAC3G,KAAKK,EAAa,QAClB,KAAKA,EAAa,QAClB,KAAKA,EAAa,YAClB,KAAKA,EAAa,YAChB,OACEC,EAAA,cAACkB,GAAA,CACC,KAAK,SACL,KAAMtB,IAAiBG,EAAa,QAAU,MAAQ,IACtD,GAAIF,EACJ,KAAMA,EACN,cAAaA,EACb,aAAcC,EACd,SAAUmB,EACV,SAAWJ,GAAM,CACXnB,EAAM,UACRA,EAAM,SAASmB,EAAE,cAAc,aAAa,CAEhD,EACF,EAEJ,KAAKd,EAAa,KAChB,OAAOC,EAAA,cAACqB,GAAA,CAAU,SAAU1B,EAAU,KAAME,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACnG,KAAKK,EAAa,QAChB,OACEC,EAAA,cAACsB,GAAA,CACC,GAAIzB,EACJ,KAAMA,EACN,cAAaA,EACb,eAAgB,CAAC,CAACC,EAClB,SAAWe,GAAM,CACXnB,EAAM,UACRA,EAAM,SAASmB,EAAE,cAAc,OAAO,CAE1C,EACF,EAEJ,KAAKd,EAAa,SAChB,OACEC,EAAA,cAACuB,GAAA,CACC,GAAI1B,EACJ,KAAMA,EACN,cAAaA,EACb,aAAcC,EACd,SAAUmB,EACV,SAAWJ,GAAM,CACXnB,EAAM,UACRA,EAAM,SAASmB,EAAE,cAAc,KAAK,CAExC,EACF,EAMJ,KAAKd,EAAa,QAChB,OAAOC,EAAA,cAACwB,GAAA,CAAa,KAAM3B,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAClF,KAAKK,EAAa,WAChB,OAAOC,EAAA,cAACyB,GAAA,CAAgB,KAAM5B,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACrF,KAAKK,EAAa,WAChB,OAAOC,EAAA,cAAC0B,GAAA,CAAgB,KAAM7B,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACrF,KAAKK,EAAa,gBAChB,OAAOC,EAAA,cAAC2B,GAAA,CAAqB,SAAUhC,EAAU,KAAME,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAC9G,KAAKK,EAAa,OAChB,OAAOC,EAAA,cAAC4B,GAAA,CAAY,SAAUjC,EAAU,KAAME,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACrG,KAAKK,EAAa,cAChB,OAAOC,EAAA,cAAC6B,GAAA,CAAmB,KAAMhC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACxF,KAAKK,EAAa,aAChB,OAAOC,EAAA,cAAC8B,GAAA,CAAkB,KAAMjC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACvF,KAAKK,EAAa,UAChB,OAAOC,EAAA,cAAC+B,GAAA,CAAe,KAAMlC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACpF,KAAKK,EAAa,UAChB,OAAOC,EAAA,cAACgC,GAAA,CAAe,KAAMnC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACpF,KAAKK,EAAa,WAChB,OAAOC,EAAA,cAACiC,GAAA,CAAgB,KAAMpC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACrF,KAAKK,EAAa,MAChB,OAAOC,EAAA,cAACkC,GAAA,CAAW,KAAMrC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAChF,KAAKK,EAAa,OAChB,OAAOC,EAAA,cAACmC,GAAA,CAAY,KAAMtC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACjF,KAAKK,EAAa,SAClB,KAAKA,EAAa,SAChB,OAAOC,EAAA,cAACoC,GAAA,CAAc,KAAMvC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACnF,KAAKK,EAAa,MAChB,OAAOC,EAAA,cAACqC,GAAA,CAAW,KAAMxC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAChF,KAAKK,EAAa,MAChB,OAAOC,EAAA,cAACsC,GAAA,CAAW,KAAMzC,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EAChF,KAAKK,EAAa,UAChB,OACEC,EAAA,cAACuC,GAAA,CACC,KAAM1C,EACN,aAAcC,EACd,YAAa0C,GAAe7C,CAAQ,EACpC,SAAUD,EAAM,SAClB,EAEJ,KAAKK,EAAa,OAChB,OAAOC,EAAA,cAACyC,GAAA,CAAY,KAAM5C,EAAM,aAAcC,EAAO,SAAUJ,EAAM,SAAU,EACjF,KAAKK,EAAa,OAClB,KAAKA,EAAa,aAChB,OACEC,EAAA,cAAC0C,GAAA,CACC,SAAU9C,EACV,aAAcE,EACd,SAAUJ,EAAM,SAChB,QAASA,EAAM,QACjB,EAEJ,QACE,OACEM,EAAA,cAAC0C,GAAA,CACC,SAAUC,GAA6BhD,CAAQ,EAC/C,aAAcG,EACd,SAAUJ,EAAM,SAChB,QAASA,EAAM,QACjB,CAEN,CACF,CAEA,SAAS8C,GAAe7C,EAAoD,CAC1E,OAAOA,GAAU,OAAO,CAAC,GAAG,eAAe,IAAKiD,GAAMA,EAAE,MAAM,GAAG,EAAE,IAAI,CAAW,CACpF,CLtQO,SAASC,GAAqBC,EAA+C,CAClF,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAcH,EAAM,cAAgB,CAAC,CAAC,EAEhE,SAASI,EAAgBC,EAAqB,CAC5CH,EAASG,CAAQ,EACbL,EAAM,UACRA,EAAM,SAASK,CAAQ,CAE3B,CAEA,IAAMC,EAAWN,EAAM,SACjBO,EAAaC,GAAa,MAAMF,CAAQ,EAC9C,GAAI,CAACC,EACH,OAAOE,GAAA,cAAC,WAAKH,EAAS,qBAAqB,EAG7C,IAAMI,EAAa,CAAE,KAAMJ,EAAU,MAAAL,CAAM,EAE3C,OACEQ,GAAA,cAACE,GAAA,KACE,OAAO,QAAQJ,EAAW,UAAU,EAAE,IAAKK,GAAU,CACpD,IAAMC,EAAMD,EAAM,CAAC,EACnB,GAAIC,IAAQ,MAAQC,GAA2B,SAASD,CAAG,EACzD,OAAO,KAET,IAAME,EAAWH,EAAM,CAAC,EACxB,GAAI,CAACG,EAAS,KACZ,OAAO,KAGT,GAAM,CAACC,EAAeC,CAAY,EAAIC,GAAgBR,EAAYG,CAAG,EAC/DM,EAAWJ,EAAS,MAAQ,QAAaA,EAAS,IAAM,EAE9D,OAAIA,EAAS,KAAK,SAAW,GAAKA,EAAS,KAAK,CAAC,EAAE,OAAS,UAExDN,GAAA,cAACW,GAAA,CACC,IAAKP,EACL,MAAOQ,GAAuBR,CAAG,EACjC,YAAaE,EAAS,WACtB,QAASF,GAETJ,GAAA,cAACa,GAAA,CACC,SAAUP,EACV,KAAMF,EACN,aAAcG,EACd,oBAAqBC,EACrB,QAASjB,EAAM,QACf,SAAU,CAACK,EAAekB,IAAsB,CAC9CnB,EAAgBoB,GAAiBvB,EAAOY,EAAKU,GAAYV,EAAKD,EAAM,CAAC,EAAGP,CAAQ,CAAC,CACnF,EACF,CACF,EAKFI,GAAA,cAACgB,GAAA,CACC,IAAKZ,EACL,MAAOQ,GAAuBR,CAAG,EACjC,YAAaE,EAAS,WACtB,aAAcI,EACd,QAASN,EACT,QAASb,EAAM,SAEfS,GAAA,cAACa,GAAA,CACC,SAAUP,EACV,KAAMF,EACN,aAAcG,EACd,oBAAqBC,EACrB,SAAU,CAACZ,EAAekB,IAAsB,CAC9CnB,EAAgBoB,GAAiBvB,EAAOY,EAAKU,GAAYV,EAAKD,EAAM,CAAC,EAAGP,CAAQ,CAAC,CACnF,EACF,CACF,CAEJ,CAAC,CACH,CAEJ,CuBhGA,OAAS,UAAAqB,GAAQ,gBAAAC,GAAc,SAAAC,OAAa,gBAE5C,OAAOC,IAAS,WAAAC,GAAS,YAAAC,OAAgB,QAEzC,IAAMC,GAAYL,GAAcM,IAAW,CACzC,MAAO,CACL,MAAO,IAEP,OAAQ,CACN,WAAY,SACZ,SAAU,GACV,QAAS,EACT,UAAW,QACb,EAEA,OAAQ,CACN,QAAS,SACX,EAEA,cAAe,CACb,MAAO,GACP,OAAQ,GACR,MAAOA,EAAM,OAAOA,EAAM,YAAY,EAAE,CAAC,EACzC,SAAU,GACV,WAAY,IACZ,UAAW,SACX,QAAS,EACT,gBAAiBA,EAAM,OAAOA,EAAM,YAAY,EAAE,CAAC,EACnD,OAAQ,EACR,aAAc,MACd,OAAQ,SACV,EAEA,oBAAqB,CACnB,gBAAiBA,EAAM,OAAOA,EAAM,YAAY,EAAE,CAAC,CACrD,EAEA,uBAAwB,CACtB,gBAAiB,cACjB,OAAQ,UACR,MAAOA,EAAM,OAAO,KAAK,CAAC,EAC1B,WAAY,QACd,CACF,CACF,EAAE,EAaK,SAASC,GAAeC,EAAoB,CACjD,OAAOA,EAAK,eAAe,UAAW,CAAE,MAAO,MAAO,CAAC,EAAI,IAAMA,EAAK,YAAY,CACpF,CASO,SAASC,GAAcC,EAAwC,CACpE,GAAM,CAAE,QAAAC,CAAQ,EAAIN,GAAU,EACxB,CAAE,cAAAO,EAAe,QAAAC,CAAQ,EAAIH,EAC7B,CAACI,EAAOC,CAAQ,EAAIX,GAAeY,EAAa,EAEtD,SAASC,EAAUC,EAAqB,CACtCH,EAAUI,GAAc,CACtB,IAAMC,EAAW,IAAI,KAAKD,EAAU,QAAQ,CAAC,EAC7C,OAAAC,EAAS,SAASD,EAAU,SAAS,EAAID,CAAK,EAC9CN,EAAcQ,CAAQ,EACfA,CACT,CAAC,CACH,CAEA,IAAMC,EAAOlB,GAAQ,IAAMmB,GAAUR,EAAOJ,EAAM,KAAK,EAAG,CAACI,EAAOJ,EAAM,KAAK,CAAC,EAE9E,OACER,GAAA,cAAC,WACCA,GAAA,cAACD,GAAA,CAAM,SAAS,QAAQ,QAAQ,KAAK,KAAI,GAAC,OAAM,IAC9CC,GAAA,cAAC,KAAE,MAAO,CAAE,KAAM,CAAE,GAAIK,GAAeO,CAAK,CAAE,EAC9CZ,GAAA,cAACD,GAAA,CAAM,SAAS,QAAQ,QAAQ,MAC9BC,GAAA,cAACH,GAAA,CAAO,QAAQ,UAAU,aAAW,iBAAiB,QAAS,IAAMkB,EAAU,EAAE,GAAG,GAEpF,EACAf,GAAA,cAACH,GAAA,CAAO,QAAQ,UAAU,aAAW,aAAa,QAAS,IAAMkB,EAAU,CAAC,GAAG,GAE/E,CACF,CACF,EACAf,GAAA,cAAC,SAAM,UAAWS,EAAQ,OACxBT,GAAA,cAAC,aACCA,GAAA,cAAC,UACCA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,EACPA,GAAA,cAAC,UAAG,KAAG,CACT,CACF,EACAA,GAAA,cAAC,aACEmB,EAAK,IAAI,CAACE,EAAMC,IACftB,GAAA,cAAC,MAAG,IAAK,QAAUsB,GAChBD,EAAK,IAAI,CAACE,EAAKC,IACdxB,GAAA,cAAC,MAAG,IAAK,OAASwB,GACfD,GACCvB,GAAA,cAACH,GAAA,CAAO,SAAU,CAAC0B,EAAI,UAAW,QAAS,IAAMZ,EAAQY,EAAI,IAAI,GAC9DA,EAAI,KAAK,QAAQ,CACpB,CAEJ,CACD,CACH,CACD,CACH,CACF,CACF,CAEJ,CAEO,SAAST,IAAsB,CACpC,IAAMW,EAAS,IAAI,KACnB,OAAAA,EAAO,QAAQ,CAAC,EAChBA,EAAO,SAAS,EAAG,EAAG,EAAG,CAAC,EACnBA,CACT,CAEA,SAASL,GAAUM,EAAiBC,EAAyC,CAC3E,IAAMC,EAAI,IAAI,KAAKF,EAAU,YAAY,EAAGA,EAAU,SAAS,CAAC,EAC1DP,EAAiC,CAAC,EACpCU,EAA8B,CAAC,EAGnC,QAASC,EAAI,EAAGA,EAAIF,EAAE,OAAO,EAAGE,IAC9BD,EAAI,KAAK,MAAS,EAGpB,KAAOD,EAAE,SAAS,IAAMF,EAAU,SAAS,GACzCG,EAAI,KAAK,CACP,KAAM,IAAI,KAAKD,EAAE,QAAQ,CAAC,EAC1B,UAAWG,GAAeH,EAAGD,CAAK,CACpC,CAAC,EAEGC,EAAE,OAAO,IAAM,IACjBT,EAAK,KAAKU,CAAG,EACbA,EAAM,CAAC,GAGTD,EAAE,QAAQA,EAAE,QAAQ,EAAI,CAAC,EAI3B,GAAIA,EAAE,OAAO,IAAM,EAAG,CACpB,QAASE,EAAIF,EAAE,OAAO,EAAGE,EAAI,EAAGA,IAC9BD,EAAI,KAAK,MAAS,EAEpBV,EAAK,KAAKU,CAAG,CACf,CAEA,OAAOV,CACT,CAQA,SAASY,GAAeR,EAAWI,EAAwB,CAEzD,QAAWK,KAAQL,EAAO,CACxB,IAAMM,EAAY,IAAI,KAAKD,EAAK,KAAe,EAC/C,GACEC,EAAU,YAAY,IAAMV,EAAI,YAAY,GAC5CU,EAAU,SAAS,IAAMV,EAAI,SAAS,GACtCU,EAAU,QAAQ,IAAMV,EAAI,QAAQ,EAEpC,MAAO,EAEX,CAEA,MAAO,EACT,CC/LA,OAAS,aAAaW,GAAkC,gBAAAC,OAAoB,gBAC5E,OAAOC,OAAW,QAElB,IAAMC,GAAYF,GAAa,KAAO,CACpC,KAAM,CACJ,4BAA6B,CAC3B,YAAa,EACb,aAAc,CAChB,CACF,CACF,EAAE,EAEK,SAASG,GAAUC,EAAoC,CAC5D,GAAM,CAAE,SAAAC,EAAU,GAAGC,CAAO,EAAIF,EAC1B,CAAE,QAAAG,CAAQ,EAAIL,GAAU,EAE9B,OACED,GAAA,cAACF,GAAA,CAAiB,UAAWQ,EAAQ,KAAO,GAAGD,GAC5CD,CACH,CAEJ,CCnBA,OAAOG,OAAW,QCFlB,OAAS,cAAAC,GAAY,UAAAC,GAAQ,gBAAAC,GAAc,SAAAC,GAAO,UAAAC,GAAQ,QAAAC,GAAM,cAAAC,GAAY,aAAAC,OAAiB,gBAC7F,OAAS,oBAAAC,GAAkB,sBAAAC,OAA0B,yBACrD,OAAS,sBAAAC,GAAmC,wBAAAC,OAA6C,gBAwBzF,OAAOC,GAAS,eAAAC,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QC1BhE,OAAS,gBAAAC,GAAc,SAAAC,GAAO,QAAAC,GAAM,SAAAC,GAAO,QAAAC,GAAM,SAAAC,OAAa,gBAC9D,OAAS,cAAAC,GAAY,yBAAAC,GAAuB,kBAAAC,GAAgB,0BAAAC,GAAwB,eAAAC,OAAmB,gBAUvG,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QCX3C,OAAS,cAAAC,GAAY,gBAAAC,GAAc,SAAAC,OAAa,gBAEhD,OAAOC,OAAW,QAElB,IAAMC,GAAYH,GAAcI,IAAW,CACzC,SAAU,CAAE,SAAUA,EAAM,UAAU,EAAG,EACzC,SAAU,CAAE,SAAUA,EAAM,UAAU,GAAI,iBAAkB,CAAE,EAC9D,SAAU,CAAE,QAAS,CAAE,CACzB,EAAE,EAMK,SAASC,GAAY,CAAE,MAAAC,CAAM,EAAyC,CAC3E,GAAM,CAAE,QAAAC,CAAQ,EAAIJ,GAAU,EAC9B,OAAKG,EAKHJ,GAAA,cAACD,GAAA,CAAM,QAAQ,aAAa,QAAQ,MACjCK,EAAM,IACJE,GACCA,EAAK,MACHN,GAAA,cAACH,GAAA,CACC,IAAK,QAAQS,EAAK,IAAI,GACtB,WAAY,CAAE,KAAMD,EAAQ,SAAU,KAAMA,EAAQ,SAAU,KAAMA,EAAQ,QAAS,EACrF,KAAMC,EAAK,iBAAiB,SAAWA,EAAK,aAC5C,KAAM,MAELA,EAAK,IACR,CAEN,CACF,EAlBO,IAoBX,CCrCA,OAAS,SAAAC,OAAa,gBAEtB,OAAOC,OAAW,QCFlB,OAAS,QAAAC,OAAuB,gBAChC,OAAS,oBAAAC,GAAkB,QAAAC,GAAM,wBAAAC,OAA4B,gBAE7D,OAAOC,IAAS,YAAAC,OAAgB,QASzB,SAASC,GAAaC,EAA8C,CACzE,GAAM,CAAE,MAAAC,EAAO,KAAAC,EAAM,GAAGC,CAAK,EAAIH,EAC3B,CAACI,EAASC,CAAU,EAAIC,GAAuC,EAC/DC,EAAWC,EAAYP,EAAOI,CAAU,EAC1CI,EAEJ,GAAIL,GAAW,CAACM,GAAKN,CAAO,EAC1BK,EAAO,IAAIE,GAAqBP,CAAO,CAAC,YAC/BG,EACTE,EAAOG,GAAiBL,CAAQ,MAEhC,QAAO,KAGT,OAAOL,EACLW,GAAA,cAACC,GAAA,CAAY,GAAIb,EAAQ,GAAGE,GACzBM,CACH,EAEAI,GAAA,cAACE,GAAA,CAAK,UAAU,OAAQ,GAAGZ,GACxBM,CACH,CAEJ,CDxBO,SAASO,GAAcC,EAAwC,CACpE,OACEC,GAAA,cAACC,GAAA,CAAM,QAAQ,MACbD,GAAA,cAACE,GAAA,CAAe,KAAM,GAAI,OAAQ,GAAI,MAAOH,EAAM,MAAO,KAAMA,EAAM,KAAM,EAC5EC,GAAA,cAACG,GAAA,CAAa,MAAOJ,EAAM,MAAO,KAAMA,EAAM,KAAM,CACtD,CAEJ,CElBA,OAAS,SAAAK,OAAkC,gBAC3C,OAAOC,OAAW,QAsBlB,IAAMC,GAAqD,CACzD,MAAO,OACP,OAAQ,OACR,UAAW,SACX,QAAS,MACT,UAAW,QACX,mBAAoB,MACpB,QAAS,OACT,QAAS,OACT,WAAY,OACZ,YAAa,OACb,MAAO,QACP,QAAS,SACT,UAAW,SACX,UAAW,MACX,UAAW,OACX,SAAU,OACV,SAAU,OACV,SAAU,MACV,MAAO,OACP,cAAe,OACf,OAAQ,MACR,SAAU,OACV,QAAS,OACT,OAAQ,OACR,QAAS,OACT,UAAW,QACX,OAAQ,MACR,aAAc,OACd,SAAU,OACV,QAAS,OACT,OAAQ,MACR,KAAM,MACN,KAAM,KACR,EAMO,SAASC,GAAYC,EAAsC,CAChE,OAAOH,GAAA,cAACD,GAAA,CAAM,MAAOE,GAAcE,EAAM,MAAM,GAAIA,EAAM,MAAO,CAClE,CJ3CA,IAAMC,GAAYC,GAAcC,IAAW,CACzC,MAAO,CACL,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,eAAgB,WAEhB,aAAc,CACZ,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,QAAS,CACX,CACF,EAEA,YAAa,CACX,WAAYA,EAAM,cAAgB,OAASA,EAAM,OAAO,IAAI,CAAC,EAAIA,EAAM,OAAO,IAAI,CAAC,EACnF,OAAQ,eAAeA,EAAM,OAAO,IAAI,CAAC,CAAC,GAC1C,MAAOA,EAAM,OAAO,IAAI,CAAC,EACzB,WAAY,IAEZ,OAAQ,CACN,OAAQ,eAAeA,EAAM,OAAO,IAAI,CAAC,CAAC,EAC5C,CACF,EAEA,SAAU,CAAE,SAAUA,EAAM,UAAU,EAAG,EACzC,SAAU,CAAE,SAAUA,EAAM,UAAU,GAAI,iBAAkB,CAAE,EAC9D,SAAU,CAAE,QAAS,CAAE,CACzB,EAAE,EAQFC,GAAwB,aAAe,CACrC,qBAAsB,GACtB,iBAAkB,EACpB,EAEO,SAASA,GAAwBC,EAAyD,CAC/F,IAAMC,EAAUC,EAAW,EACrBC,EAAmBC,EAAYJ,EAAM,KAAK,EAC1C,CAACK,EAAWC,CAAY,EAAIC,GAAqB,EAevD,GAbAC,GAAU,IAAM,CACVL,GAAkB,UACpB,QAAQ,WAAWA,EAAiB,SAAS,IAAKM,GAAQR,EAAQ,cAAcQ,CAAG,CAAC,CAAC,EAClF,KAAMC,GACLA,EACG,OAAQC,GAAYA,EAAQ,SAAW,WAAW,EAClD,IAAKA,GAAaA,EAA6C,KAAK,CACzE,EACC,KAAKL,CAAY,EACjB,MAAM,QAAQ,KAAK,CAE1B,EAAG,CAACL,EAASE,CAAgB,CAAC,EAE1B,CAACA,EACH,OAAO,KAGT,IAAMS,EAA8BP,GAAW,QAASQ,GAASA,EAAK,MAAQ,CAAC,CAAC,GAAK,CAAC,EAEtF,GAAIV,EAAiB,eAAiBA,EAAiB,cAAc,OAAS,EAAG,CAC/E,IAAMW,EAAKX,EAAiB,cAAc,CAAC,EACvCW,EAAG,aAAa,WAAW,YAAY,GAAKA,EAAG,MACjDF,EAAc,KAAK,CAAE,KAAM,OAAO,KAAKE,EAAG,IAAI,CAAE,CAAC,CAErD,CAEA,OACEC,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,KAAM,mBAAiB,EACxBF,EAAA,cAACG,GAAA,CAAuB,MAAOf,EAAkB,EAChD,CAACH,EAAM,kBAAoBmB,GAAad,CAAS,EACjDF,EAAiB,QAChBY,EAAA,cAACK,GAAA,CAAiB,qBAAsBpB,EAAM,qBAAsB,MAAOG,EAAiB,OAAQ,EAErGS,EAAc,OAAS,GAAKG,EAAA,cAACM,GAAA,CAAY,MAAOT,EAAe,CAClE,CAEJ,CAMA,SAASM,GAAuB,CAAE,MAAAI,CAAM,EAA6C,CACnF,OACEP,EAAA,cAACQ,GAAA,CAAM,GAAG,KAAK,QAAS,IACrBD,EAAM,SACLP,EAAA,cAAC,WACCA,EAAA,cAACS,GAAA,CAAK,KAAK,KAAK,UAAU,YAAY,MAAM,UAAS,SAErD,EACAT,EAAA,cAACS,GAAA,KACCT,EAAA,cAACU,GAAA,CAAc,MAAOH,EAAM,QAAS,KAAM,GAAM,CACnD,CACF,EAEDA,EAAM,oBAAoB,IAAKI,GAC9BX,EAAA,cAAC,OAAI,IAAKW,EAAY,WACpBX,EAAA,cAACS,GAAA,CAAK,KAAK,KAAK,UAAU,YAAY,MAAM,UAAS,aAErD,EACAT,EAAA,cAACS,GAAA,KACCT,EAAA,cAACU,GAAA,CAAc,MAAOC,EAAa,KAAM,GAAM,CACjD,CACF,CACD,EACAJ,EAAM,WAAW,IAAKK,GACrBZ,EAAA,cAAC,OAAI,IAAKY,EAAU,WAClBZ,EAAA,cAACS,GAAA,CAAK,KAAK,KAAK,UAAU,YAAY,MAAM,UAAS,WAErD,EACAT,EAAA,cAACS,GAAA,KACCT,EAAA,cAACU,GAAA,CAAc,MAAOE,EAAW,KAAM,GAAM,CAC/C,CACF,CACD,EACAL,EAAM,QACLP,EAAA,cAAC,WACCA,EAAA,cAACS,GAAA,CAAK,KAAK,KAAK,UAAU,YAAY,MAAM,UAAS,QAErD,EACAT,EAAA,cAACS,GAAA,KAAMI,GAAeN,EAAM,MAAM,CAAE,CACtC,EAEDA,EAAM,QACLP,EAAA,cAAC,WACCA,EAAA,cAACS,GAAA,CAAK,KAAK,KAAK,UAAU,YAAY,MAAM,UAAS,QAErD,EACAT,EAAA,cAACS,GAAA,KAAMK,GAAWP,EAAM,MAAM,CAAE,CAClC,CAEJ,CAEJ,CAEA,SAASH,GAAad,EAAgD,CACpE,OACEU,EAAA,cAACC,GAAA,CAAM,QAAS,MACdD,EAAA,cAACE,GAAA,CAAM,MAAO,EAAG,KAAK,MAAK,WAE3B,EAEAF,EAAA,cAACe,GAAA,CAAK,KAAK,WACRzB,GAAW,IAAK0B,GACfhB,EAAA,cAACe,GAAK,KAAL,CAAU,GAAI,KAAM,IAAK,YAAYC,EAAS,EAAE,IAC/ChB,EAAA,cAACQ,GAAA,CAAM,QAAS,IACdR,EAAA,cAACQ,GAAA,CAAM,QAAS,GACdR,EAAA,cAACS,GAAA,CAAK,GAAI,KAAK,YAAU,EAAO,IAAEI,GAAeG,EAAS,YAAY,iBAAiB,CACzF,EACAhB,EAAA,cAACQ,GAAA,CAAM,QAAS,GACdR,EAAA,cAACS,GAAA,CAAK,GAAI,KAAK,WAAS,EAAO,IAAEI,GAAeG,EAAS,YAAY,CACvE,CACF,CACF,CACD,CACH,CACF,CAEJ,CAOO,SAASX,GAAiBpB,EAA2C,CAC1E,GAAM,CAAE,QAAAgC,CAAQ,EAAIpC,GAAU,EAC9B,OACEmB,EAAA,cAAC,SAAM,UAAWiB,EAAQ,OACxBjB,EAAA,cAAC,aACCA,EAAA,cAAC,UACCA,EAAA,cAAC,UAAG,MAAI,EACRA,EAAA,cAAC,UAAG,OAAK,EACTA,EAAA,cAAC,UAAG,iBAAe,EACnBA,EAAA,cAAC,UAAG,gBAAc,EAClBA,EAAA,cAAC,UAAG,UAAQ,EACZA,EAAA,cAAC,UAAG,WAAS,EACbA,EAAA,cAAC,UAAG,QAAM,CACZ,CACF,EACAA,EAAA,cAAC,aACEf,EAAM,OAAO,IAAKiC,GACjBlB,EAAA,cAACmB,GAAA,CACC,IAAK,OAAOC,GAAYF,CAAW,EAAIA,EAAY,UAAYA,EAAY,EAAE,GAC7E,qBAAsBjC,EAAM,qBAC5B,MAAOiC,EACT,CACD,CACH,CACF,CAEJ,CAOA,SAASC,GAAelC,EAAgD,CACtE,GAAM,CAAE,QAAAgC,EAAS,GAAAI,CAAG,EAAIxC,GAAU,EAC5BqC,EAAc7B,EAAYJ,EAAM,KAAK,EAE3C,GAAI,CAACiC,EACH,OAAO,KAET,IAAMI,EAAe,CAACrC,EAAM,sBAAwBiC,EAAY,KAE1DK,EAAWC,GAAWN,CAAW,EAEvC,OACElB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC,MAAG,UAAWqB,EAAG,CAAE,CAACJ,EAAQ,WAAW,EAAGM,CAAS,CAAC,GACnDvB,EAAA,cAAC,MAAG,QAASsB,EAAe,EAAI,GAC9BtB,EAAA,cAACyB,GAAA,CAAY,GAAIP,GACflB,EAAA,cAAC0B,GAAA,CAAuB,MAAOR,EAAY,KAAM,CACnD,CACF,EACAlB,EAAA,cAAC,UACCA,EAAA,cAAC2B,GAAA,CAAwB,MAAOT,EAAa,CAC/C,EACAlB,EAAA,cAAC,UACCA,EAAA,cAAC4B,GAAA,CAAsB,MAAOV,EAAY,eAAgB,CAC5D,EACAlB,EAAA,cAAC,UACEkB,EAAY,gBAAkBA,EAAY,eAAe,OAAS,GACjElB,EAAA,cAAC0B,GAAA,CAAuB,MAAOR,EAAY,eAAe,CAAC,EAAG,CAElE,EACAlB,EAAA,cAAC,UACEkB,EAAY,UAAYA,EAAY,SAAS,OAAS,GACrDlB,EAAA,cAAC,UACEkB,EAAY,SAAS,IAAKW,GACzB7B,EAAA,cAAC,MAAG,IAAK,YAAY8B,GAAsBD,CAAO,CAAC,IACjD7B,EAAA,cAAC0B,GAAA,CAAuB,MAAOG,EAAS,CAC1C,CACD,CACH,CAEJ,EACA7B,EAAA,cAAC,UACEkB,EAAY,WAAW,IAAKN,GAAcZ,EAAA,cAAC+B,GAAA,CAAiB,IAAKnB,EAAU,UAAW,MAAOA,EAAW,CAAE,CAC7G,EACAZ,EAAA,cAAC,UAAIkB,EAAY,QAAUlB,EAAA,cAACgC,GAAA,CAAY,OAAQd,EAAY,OAAQ,CAAG,CACzE,EACCI,GACCtB,EAAA,cAAC,UACCA,EAAA,cAAC,MAAG,QAAS,GACXA,EAAA,cAACM,GAAA,CAAY,MAAOY,EAAY,KAAM,CACxC,CACF,CAEJ,CAEJ,CAMA,SAASS,GAAwB1C,EAAyD,CACxF,IAAMgD,EAAMhD,EAAM,MAClB,OAAOe,EAAA,cAAAA,EAAA,cAAGkC,GAAuBD,CAAG,CAAE,CACxC,CAMA,SAASL,GAAsB3C,EAAgD,CAC7E,IAAMkD,EAAQlD,EAAM,OAASA,EAAM,MAAM,OAAS,GAAKA,EAAM,MAAM,CAAC,EACpE,OAAKkD,EAGDA,EAAM,KACDnC,EAAA,cAAAA,EAAA,cAAGmC,EAAM,IAAK,EAEhBnC,EAAA,cAACoC,GAAA,CAAa,MAAOD,EAAO,EAL1B,IAMX,CAQA,SAASX,GAAWN,EAAmC,CACrD,IAAMmB,EAAOnB,EAAY,iBAAiB,CAAC,GAAG,SAAS,CAAC,GAAG,KAC3D,OAAOmB,IAAS,MAAQA,IAAS,MAAQA,IAAS,MAAQA,IAAS,GACrE,CK1TA,OAAS,gBAAAC,GAAc,SAAAC,GAAmB,4BAAAC,OAAgC,gBAC1E,OAAOC,OAAW,QAOlB,IAAMC,GAAYJ,GAAa,CAACK,EAAO,CAAE,MAAAC,EAAO,KAAAC,CAAK,KAA0B,CAC7E,MAAO,CACL,SAAUD,EACV,OAAQ,GAAGD,EAAM,QAAQ,EAAE,QAC3B,QAASE,EAAO,EAAIF,EAAM,QAAQ,GAClC,4BAA6B,CAC3B,QAASE,EAAO,EAAI,CACtB,EACA,QAAS,CACP,MAAO,OACP,SAAU,MACZ,EACA,UAAW,CACT,MAAO,OACP,SAAU,MACZ,CACF,CACF,EAAE,EAOIC,GAAoC,CACxC,OAAQ,KACR,OAAQ,KACR,WAAY,EACd,EAEO,SAASC,GAAMC,EAAgC,CACpD,GAAM,CAAE,UAAAC,EAAW,SAAAC,EAAU,MAAAN,EAAO,KAAAC,EAAM,SAAAM,EAAU,GAAGC,CAAO,EAAIZ,GAChE,QACAM,GACAE,CACF,EACM,CAAE,QAAAK,EAAS,GAAAC,CAAG,EAAIZ,GAAU,CAAE,MAAAE,EAAO,KAAAC,CAAK,EAAG,CAAE,KAAM,QAAS,SAAAM,CAAS,CAAC,EAE9E,OACEV,GAAA,cAACF,GAAA,CAAM,UAAWe,EAAGD,EAAQ,MAAOJ,CAAS,EAAI,GAAGG,GACjDF,CACH,CAEJ,CCnDA,OAAS,gBAAAK,OAAoB,gBAC7B,OAAS,0BAAAC,GAAoD,aAAAC,GAAW,gBAAAC,OAAoB,gBAE5F,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAI3C,IAAMC,GAAYC,GAAcC,IAAW,CACzC,KAAM,CACJ,eAAgB,WAChB,MAAO,OAEP,OAAQ,CACN,UAAW,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,EAChD,EAEA,aAAc,CACZ,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAChD,cAAe,KACjB,CACF,EAEA,QAAS,CACP,MAAOA,EAAM,OAAO,IAAI,CAAC,EACzB,eAAgB,cAClB,EAEA,MAAO,CACL,MAAOA,EAAM,OAAO,MAAM,CAAC,CAC7B,CACF,EAAE,EAOK,SAASC,GAAkBC,EAAmD,CACnF,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxBM,EAAUC,EAAW,EACrB,CAACC,EAAQC,CAAS,EAAIC,GAAiD,EAM7E,GAJAC,GAAU,IAAM,CACdL,EAAQ,cAAcF,EAAM,SAAS,YAAY,EAAE,KAAKK,CAAS,EAAE,MAAM,QAAQ,GAAG,CACtF,EAAG,CAACH,EAASF,EAAM,SAAS,YAAY,CAAC,EAErC,CAACI,EACH,OAAO,KAGT,IAAMI,EAAaJ,EAAO,MAAMJ,EAAM,SAAS,YAAY,EAC3D,OAAKQ,EAKHC,GAAA,cAAC,SAAM,UAAWR,EAAQ,MACxBQ,GAAA,cAAC,gBACCA,GAAA,cAAC,OAAI,MAAO,CAAE,MAAO,KAAM,EAAG,EAC9BA,GAAA,cAAC,OAAI,MAAO,CAAE,MAAO,KAAM,EAAG,EAC9BA,GAAA,cAAC,OAAI,MAAO,CAAE,MAAO,KAAM,EAAG,CAChC,EACAA,GAAA,cAAC,aACCA,GAAA,cAAC,UACCA,GAAA,cAAC,UAAG,UAAQ,EACZA,GAAA,cAAC,UAAG,QAAM,EACVA,GAAA,cAAC,UAAG,OAAK,CACX,CACF,EACAA,GAAA,cAAC,aACE,OAAO,QAAQD,EAAW,UAAU,EAAE,IAAKE,GAAU,CACpD,IAAMC,EAAMD,EAAM,CAAC,EACnB,GAAIC,IAAQ,MAAQA,IAAQ,OAC1B,OAAO,KAGT,IAAMC,EAAWF,EAAM,CAAC,EAClB,CAACG,EAAuBC,CAAoB,EAAIC,GAAgBC,GAAahB,EAAM,QAAQ,EAAGW,CAAG,EACjG,CAACM,EAAsBC,CAAmB,EAAIH,GAAgBC,GAAahB,EAAM,OAAO,EAAGW,CAAG,EAKpG,OAJIQ,GAAQN,CAAqB,GAAKM,GAAQF,CAAoB,GAI9DG,GAAUP,CAAqB,IAAMO,GAAUH,CAAoB,EAC9D,KAIPR,GAAA,cAAC,MAAG,IAAKE,GACPF,GAAA,cAAC,UAAIY,GAAuBV,CAAG,CAAE,EACjCF,GAAA,cAAC,MAAG,UAAWR,EAAQ,SACrBQ,GAAA,cAACa,GAAA,CACC,SAAUV,EACV,aAAcE,EACd,MAAOD,EACP,oBAAqB,GACvB,CACF,EACAJ,GAAA,cAAC,MAAG,UAAWR,EAAQ,OACrBQ,GAAA,cAACa,GAAA,CACC,SAAUV,EACV,aAAcM,EACd,MAAOD,EACP,oBAAqB,GACvB,CACF,CACF,CAEJ,CAAC,CACH,CACF,EA1DO,IA4DX,CAEA,SAASE,GAAQI,EAAyB,CACxC,MACE,CAACA,GACA,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,GACzC,OAAOA,GAAU,UAAY,OAAO,KAAKA,CAAK,EAAE,SAAW,CAEhE,CCtHA,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAyBpC,SAASC,GAAcC,EAA+C,CAC3E,IAAMC,EAAUC,EAAW,EACrBC,EAAQC,EAAYJ,EAAM,KAAK,EAC/B,CAACK,EAAQC,CAAS,EAAIC,GAAiD,EAQ7E,OANAC,GAAU,IAAM,CACVL,GACFF,EAAQ,cAAcE,EAAM,YAAY,EAAE,KAAKG,CAAS,EAAE,MAAM,QAAQ,GAAG,CAE/E,EAAG,CAACL,EAASE,CAAK,CAAC,EAEf,CAACE,GAAU,CAACF,EACP,KAIPM,GAAA,cAACC,GAAA,CACC,MAAO,CACL,KAAMP,EAAM,aACZ,MAAOH,EAAM,cAAgBA,EAAM,MAAQG,CAC7C,EACA,oBAAqBH,EAAM,oBAC7B,CAEJ,CCnDA,OAAS,cAAAW,GAAY,SAAAC,GAAO,QAAAC,GAAM,QAAAC,OAAY,gBAC9C,OAAS,kBAAAC,GAAgB,sBAAAC,OAA0B,gBAGnD,OAAOC,OAAW,QAYX,SAASC,GAASC,EAAmC,CAC1D,OAAOC,GAAA,cAACC,GAAA,KAAWF,EAAM,QAAS,CACpC,CAUO,SAASG,GAAaH,EAAuC,CAClE,GAAM,CAAE,SAAAI,EAAU,QAAAC,EAAS,QAAAC,EAAS,eAAAC,EAAgB,GAAGC,CAAO,EAAIR,EAC5DS,EAASJ,GAAWD,EAAS,MAAM,OACnCM,EAAWV,EAAM,UAAYI,EAAS,MAAM,YAElD,OACEH,GAAA,cAACU,GAAA,CAAM,cAAY,gBAAgB,KAAM,GAAO,GAAGH,GACjDP,GAAA,cAACW,GAAA,CAAM,SAAS,QAAQ,QAAS,EAAG,GAAG,KAAK,GAAG,MAC7CX,GAAA,cAACY,GAAA,CAAe,MAAOJ,EAAQ,KAAM,GAAM,KAAK,KAAK,EACrDR,GAAA,cAAC,OAAI,MAAO,CAAE,KAAM,CAAE,GACpBA,GAAA,cAACa,GAAA,CAAK,KAAK,MACTb,GAAA,cAACc,GAAA,CAAa,MAAM,OAAO,OAAQ,IAAK,MAAON,EAAQ,KAAM,GAAM,CACrE,EACAR,GAAA,cAACa,GAAA,CAAK,KAAK,MACTb,GAAA,cAACe,GAAA,CAAY,MAAM,SAAS,GAAIhB,EAAM,UACnCiB,GAAeP,CAAQ,CAC1B,EACAT,GAAA,cAACa,GAAA,CAAK,UAAU,OAAO,MAAM,SAAS,GAAI,GAAG,MAE7C,EACAb,GAAA,cAACe,GAAA,CAAY,MAAM,SAAS,GAAIhB,EAAM,UACnCA,EAAM,SAAS,YAClB,CACF,CACF,EACCO,GACCN,GAAA,cAACiB,GAAA,CAAK,SAAS,aAAa,OAAO,KAAK,MAAO,KAC7CjB,GAAA,cAACiB,GAAK,OAAL,KACCjB,GAAA,cAACkB,GAAA,CAAW,OAAO,KAAK,aAAY,eAAeC,GAAmBpB,EAAM,QAAQ,CAAC,IACnFC,GAAA,cAACoB,GAAA,IAAS,CACZ,CACF,EACCd,CACH,CAEJ,EACAN,GAAA,cAACqB,GAAA,KACEhB,GAAWL,GAAA,cAAC,OAAI,MAAO,CAAE,QAAS,kBAAmB,GAAID,EAAM,QAAS,EACxE,CAACM,GAAWL,GAAA,cAAAA,GAAA,cAAGD,EAAM,QAAS,CACjC,CACF,CAEJ,CC/DO,SAASuB,GAAsBC,EAAuBC,EAAmC,CAC9FD,EAAU,KAAK,CAACE,EAAaC,IAAwB,CACnD,IAAMC,EAAYC,GAAiBH,EAAGD,CAAgB,EAChDK,EAAYD,GAAiBF,EAAGF,CAAgB,EACtD,OAAIG,EAAYE,EACP,EAELF,EAAYE,EACP,GAEFC,GAAQL,EAAGD,CAAgB,EAAIM,GAAQJ,EAAGF,CAAgB,CACnE,CAAC,CACH,CAEA,SAASI,GAAiBG,EAAoBP,EAAgD,CAC5F,GAAI,CAACQ,GAAmBD,EAAUP,CAAgB,EAAG,CAGnD,IAAMS,EAAYF,EAAiB,SACnC,GAAI,OAAOE,GAAa,SACtB,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,OAAQ,CAAE,EAAEA,CAAQ,GAAK,CAExD,CACA,MAAO,EACT,CAEA,SAASH,GAAQC,EAAoBP,EAAgD,CACnF,GAAI,CAACQ,GAAmBD,EAAUP,CAAgB,EAAG,CAGnD,GAAIO,EAAS,eAAiB,iBAAmBA,EAAS,KACxD,OAAO,IAAI,KAAKA,EAAS,IAAI,EAAE,QAAQ,EAGzC,IACGA,EAAS,eAAiB,oBACzBA,EAAS,eAAiB,SAC1BA,EAAS,eAAiB,gBAC5BA,EAAS,OAET,OAAO,IAAI,KAAKA,EAAS,MAAM,EAAE,QAAQ,EAG3C,GAAIA,EAAS,eAAiB,qBAAuBA,EAAS,KAC5D,OAAO,IAAI,KAAKA,EAAS,IAAI,EAAE,QAAQ,CAE3C,CAEA,IAAMG,EAAWH,EAAS,MAAM,YAChC,OAAKG,EAGE,IAAI,KAAKA,CAAQ,EAAE,QAAQ,EAFzB,CAGX,CAEA,SAASF,GAAmBP,EAAaC,EAAkC,CACzE,MAAO,CAAC,CAACA,GAAKD,EAAE,eAAiBC,EAAE,cAAgBD,EAAE,KAAOC,EAAE,EAChE,CVxBA,IAAMS,GAAYC,GAAcC,IAAW,CACzC,cAAe,CACb,gBAAiBA,EAAM,OAAO,KAAK,CAAC,CACtC,CACF,EAAE,EAaK,SAASC,GAAqCC,EAA8C,CACjG,IAAMC,EAAUC,EAAW,EACrBC,EAAWC,GAAmB,EAC9BC,EAASJ,EAAQ,WAAW,EAC5BK,EAAWC,GAAyB,IAAI,EACxCC,EAAWC,EAAYT,EAAM,KAAK,EAClC,CAACU,EAASC,CAAU,EAAIC,GAAiB,EACzC,CAACC,EAAOC,CAAQ,EAAIF,GAAqB,CAAC,CAAC,EAC3CG,EAAwBf,EAAM,sBAE9BgB,EAAWT,GAAmBM,CAAK,EACzCG,EAAS,QAAUH,EAiBnB,IAAMI,EAAkBC,GACrBC,GAA+B,CAC9BC,GAAsBD,EAAUX,CAAQ,EACxCW,EAAS,QAAQ,EACjBL,EAASK,CAAQ,CACnB,EACA,CAACX,CAAQ,CACX,EAMMa,EAAsBH,GACzBI,GAAwD,CACvD,IAAMC,EAAW,CAAC,EAElB,QAAWC,MAAiBF,EAAe,CACzC,GAAIE,GAAc,SAAW,YAE3B,SAGF,IAAMC,GAASD,GAAc,MAK7B,GAJIC,GAAO,OAAS,WAClBd,EAAWc,EAAM,EAGfA,GAAO,MACT,QAAWC,MAASD,GAAO,MACzBF,EAAS,KAAKG,GAAM,QAAoB,CAG9C,CAEAT,EAAgBM,CAAQ,CAC1B,EACA,CAACN,CAAe,CAClB,EAMMU,EAAcT,GACjBV,GAA6BS,EAAgB,CAAC,GAAGD,EAAS,QAASR,CAAQ,CAAC,EAC7E,CAACS,CAAe,CAClB,EAKMW,EAAeV,GAAY,IAAM,CACrC,IAAIW,EACAC,EACA,iBAAkB9B,EAAM,OAC1B6B,EAAe7B,EAAM,MAAM,aAC3B8B,EAAK9B,EAAM,MAAM,IAEjB,CAAC6B,EAAcC,CAAE,EAAI9B,EAAM,MAAM,WAAW,MAAM,GAAG,EAEvDe,EAAsBd,EAAS4B,EAAcC,CAAE,EAAE,KAAKT,CAAmB,EAAE,MAAM,QAAQ,GAAG,CAC9F,EAAG,CAACpB,EAASD,EAAM,MAAOe,EAAuBM,CAAmB,CAAC,EAErEU,GAAU,IAAMH,EAAa,EAAG,CAACA,CAAY,CAAC,EAM9C,SAASI,EAAcC,EAA6B,CAC9C,CAACzB,GAAY,CAACR,EAAM,qBAIxBC,EACG,eAAeD,EAAM,oBAAoBQ,EAAUH,EAAQ4B,CAAa,CAAC,EACzE,KAAMC,GAAWP,EAAYO,CAAM,CAAC,EACpC,MAAM,QAAQ,GAAG,CACtB,CAMA,SAASC,EAAYC,EAA8B,CAC7C,CAAC5B,GAAY,CAACR,EAAM,aAIxBC,EACG,eAAeD,EAAM,YAAYQ,EAAUH,EAAQ+B,CAAU,CAAC,EAC9D,KAAMF,GAAWP,EAAYO,CAAM,CAAC,EACpC,KAAK,IACJG,GAAmB,CACjB,GAAI,sBACJ,MAAO,OACP,MAAO,kBACP,QAAS,GACT,KAAMC,EAAA,cAACC,GAAA,CAAU,KAAM,GAAI,EAC3B,UAAW,GACb,CAAC,CACH,EACC,MAAOC,GACNH,GAAmB,CACjB,GAAI,sBACJ,MAAO,MACP,MAAO,eACP,QAASI,GAAqBD,CAAM,EACpC,KAAMF,EAAA,cAACI,GAAA,CAAc,KAAM,GAAI,EAC/B,UAAW,GACb,CAAC,CACH,CACJ,CAEA,SAASC,EACPC,EACAC,EACwB,CACxB,OAAO5C,EAAQ,eAAe,CAAE,GAAG2C,EAAe,SAAAC,CAAS,CAAC,CAC9D,CAEA,SAASC,EAAMF,EAAoC,CACjDD,EAAYC,EAAe,MAAM,EAAE,KAAKhB,CAAY,EAAE,MAAM,QAAQ,GAAG,CACzE,CAEA,SAASmB,EAAQH,EAAoC,CACnDD,EAAYC,EAAe,SAAS,EAAE,KAAKhB,CAAY,EAAE,MAAM,QAAQ,GAAG,CAC5E,CAEA,SAASoB,EAAUC,EAA8B,CAC/C9C,EAAS,IAAI8C,EAAa,YAAY,IAAIA,EAAa,EAAE,EAAE,CAC7D,CAEA,SAASC,GAAOD,EAA8B,CAC5C9C,EAAS,IAAI8C,EAAa,YAAY,IAAIA,EAAa,EAAE,OAAO,CAClE,CAEA,SAASE,GAASF,EAA8B,CAC9C9C,EAAS,IAAI8C,EAAa,YAAY,IAAIA,EAAa,EAAE,SAAS,CACpE,CAEA,SAASG,GAAiBC,EAAyB,CACjDlD,EAAS,IAAIkD,EAAQ,YAAY,IAAIA,EAAQ,EAAE,aAAaA,EAAQ,MAAM,SAAS,EAAE,CACvF,CAEA,SAASC,GAAsB,CAC7BC,GAAiB,CACf,GAAI,sBACJ,QAAS,GACT,MAAO,yBACP,QAAS,iBACT,UAAW,GACX,gBAAiB,EACnB,CAAC,CACH,CAEA,SAASC,GAAiBC,EAAwB,CAChDpB,GAAmB,CACjB,GAAI,sBACJ,QAAS,GACT,MAAO,eACP,QAASqB,GAAmBD,CAAC,EAC7B,UAAW,GACX,gBAAiB,EACnB,CAAC,CACH,CAEA,OAAKjD,EASH8B,EAAA,cAACqB,GAAA,KACE3D,EAAM,qBACLsC,EAAA,cAACsB,GAAA,KACCtB,EAAA,cAACuB,EAAA,CACC,OAAO,gBACP,SAAWC,GAAqC,CAC9C9B,EAAc8B,EAAS,IAAI,EAE3B,IAAMC,EAAQzD,EAAS,QACnByD,IACFA,EAAM,MAAQ,GACdA,EAAM,MAAM,EAEhB,GAEAzB,EAAA,cAAC0B,GAAA,CAAM,QAAQ,KAAK,OAAM,GAAC,MAAO,CAAE,MAAO,MAAO,GAChD1B,EAAA,cAAC2B,GAAA,CAAe,MAAO5D,EAAQ,EAC/BiC,EAAA,cAAC4B,GAAA,CACC,KAAK,OACL,IAAK5D,EACL,YAAY,cACZ,MAAO,CAAE,MAAO,OAAQ,SAAU,GAAI,EACxC,EACAgC,EAAA,cAAC6B,GAAA,CAAW,KAAK,SAAS,OAAO,KAAK,MAAM,OAAO,QAAQ,UACzD7B,EAAA,cAAC8B,GAAA,CAAY,KAAM,GAAI,CACzB,EACA9B,EAAA,cAAC+B,GAAA,CACC,SAAUlC,EACV,cAAemB,EACf,iBAAkBE,IAEhBxD,GACAsC,EAAA,cAAC6B,GAAA,CAAY,GAAGnE,EAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,UACtDsC,EAAA,cAACgC,GAAA,CAAgB,KAAM,GAAI,CAC7B,CAEJ,CACF,CACF,CACF,EAEDzD,EAAM,IAAK0D,GAAS,CACnB,GAAI,CAACA,EAEH,OAAO,KAET,IAAMC,EAAM,GAAGD,EAAK,YAAY,IAAIA,EAAK,EAAE,IAAIA,EAAK,MAAM,SAAS,GACnE,GAAIA,EAAK,eAAiB/D,EAAS,cAAgB+D,EAAK,KAAO/D,EAAS,GACtE,OACE8B,EAAA,cAACmC,GAAA,CAAoB,IAAKD,EAAK,QAAS9D,EAAmB,SAAU6D,EAAM,UAAWnB,GAAkB,EAG5G,OAAQmB,EAAK,aAAc,CACzB,IAAK,aACH,OAAOjC,EAAA,cAACoC,GAAA,CAAuB,IAAKF,EAAK,SAAUD,EAAM,UAAWvB,EAAW,EACjF,IAAK,gBACH,OACEV,EAAA,cAACqC,GAAA,CACC,IAAKH,EACL,SAAUD,EACV,MAAOA,EAAK,WAAa,OAASzB,EAAQ,OAC1C,QAASyB,EAAK,WAAa,OAASxB,EAAU,OAC9C,UAAWC,EACX,OAAQE,GACR,SAAUC,GACZ,EAEJ,IAAK,mBACH,OACEb,EAAA,cAACsC,GAAA,CACC,IAAKJ,EACL,SAAUD,EACV,UAAWvB,EACX,OAAQE,GACR,SAAUC,GACZ,EAEJ,IAAK,QACH,OACEb,EAAA,cAACuC,GAAA,CAAkB,IAAKL,EAAK,SAAUD,EAAM,UAAWvB,EAAW,OAAQE,GAAQ,SAAUC,GAAU,EAE3G,QACE,OACEb,EAAA,cAACwC,GAAA,CAAa,IAAKN,EAAK,SAAUD,EAAM,QAAS,IAC/CjC,EAAA,cAACyC,GAAA,CAAc,MAAOR,EAAM,oBAAqB,GAAM,CACzD,CAEN,CACF,CAAC,CACH,EAhGEjC,EAAA,cAAC0C,GAAA,CAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,GAC7C1C,EAAA,cAAC2C,GAAA,IAAO,CACV,CAgGN,CAWA,SAASC,GAA0ClF,EAA8C,CAC/F,OACEsC,EAAA,cAAC6C,GAAK,SAAL,KACC7C,EAAA,cAAC6C,GAAK,MAAL,KAAW,UAAQ,EACnBnF,EAAM,OACLsC,EAAA,cAAC6C,GAAK,KAAL,CACC,KAAM7C,EAAA,cAAC8C,GAAA,CAAQ,KAAM,GAAI,EACzB,QAAS,IAAOpF,EAAM,MAAgCA,EAAM,QAAQ,EACpE,aAAY,OAAOqF,GAAmBrF,EAAM,QAAQ,CAAC,IACtD,KAED,EAEDA,EAAM,SACLsC,EAAA,cAAC6C,GAAK,KAAL,CACC,KAAM7C,EAAA,cAACgD,GAAA,CAAc,KAAM,GAAI,EAC/B,QAAS,IAAOtF,EAAM,QAAkCA,EAAM,QAAQ,EACtE,aAAY,SAASqF,GAAmBrF,EAAM,QAAQ,CAAC,IACxD,OAED,EAEDA,EAAM,WACLsC,EAAA,cAAC6C,GAAK,KAAL,CACC,KAAM7C,EAAA,cAACiD,GAAA,CAAgB,KAAM,GAAI,EACjC,QAAS,IAAOvF,EAAM,UAAoCA,EAAM,QAAQ,EACxE,aAAY,WAAWqF,GAAmBrF,EAAM,QAAQ,CAAC,IAC1D,SAED,EAEDA,EAAM,QACLsC,EAAA,cAAC6C,GAAK,KAAL,CACC,KAAM7C,EAAA,cAACkD,GAAA,CAAS,KAAM,GAAI,EAC1B,QAAS,IAAOxF,EAAM,OAAiCA,EAAM,QAAQ,EACrE,aAAY,QAAQqF,GAAmBrF,EAAM,QAAQ,CAAC,IACvD,MAED,EAEDA,EAAM,UACLsC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC6C,GAAK,QAAL,IAAa,EACd7C,EAAA,cAAC6C,GAAK,MAAL,KAAW,aAAW,EACvB7C,EAAA,cAAC6C,GAAK,KAAL,CACC,MAAM,MACN,KAAM7C,EAAA,cAACmD,GAAA,CAAU,KAAM,GAAI,EAC3B,QAAS,IAAOzF,EAAM,SAAmCA,EAAM,QAAQ,EACvE,aAAY,UAAUqF,GAAmBrF,EAAM,QAAQ,CAAC,IACzD,QAED,CACF,CAEJ,CAEJ,CAMA,SAASyE,GAAoBzE,EAA8C,CACzE,IAAM0F,EAAWC,GAAY3F,EAAM,QAASA,EAAM,QAAQ,EAC1D,OAAI0F,EAEApD,EAAA,cAACwC,GAAA,CAAa,SAAU9E,EAAM,SAAU,QAAS,GAAM,eAAgBsC,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GACvGsC,EAAA,cAACsD,GAAA,CAAkB,SAAUF,EAAU,QAAS1F,EAAM,SAAU,CAClE,EAIAsC,EAAA,cAACwC,GAAA,CAAa,SAAU9E,EAAM,SAAU,QAAS,GAAM,eAAgBsC,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GACvGsC,EAAA,cAAC,UAAG,SAAO,EACXA,EAAA,cAACyC,GAAA,CAAc,MAAO/E,EAAM,SAAU,oBAAmB,GAAC,cAAa,GAAC,CAC1E,CAGN,CAEA,SAAS2F,GAAYjF,EAAiB2C,EAAyC,CAC7E,IAAMwC,EAAUnF,EAAQ,MAClBoF,EAAQD,EAAQ,UAAWnE,GAAUA,EAAM,UAAU,MAAM,YAAc2B,EAAQ,MAAM,SAAS,EACtG,GAAI,EAAAyC,GAASD,EAAQ,OAAS,GAG9B,OAAOA,EAAQC,EAAQ,CAAC,EAAE,QAC5B,CAEA,SAASnB,GAA0B3E,EAA0D,CAC3F,GAAM,CAAE,QAAA+F,CAAQ,EAAInG,GAAU,EAExBoG,EADU,CAAChG,EAAM,SAAS,UAAYA,EAAM,SAAS,WAAa,UAC5C,OAAY+F,EAAQ,cAChD,OACEzD,EAAA,cAACwC,GAAA,CACC,SAAU9E,EAAM,SAChB,QAASA,EAAM,SAAS,OACxB,SAAUA,EAAM,SAAS,KACzB,QAAS,GACT,UAAWgG,EACX,eAAgB1D,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GAElDsC,EAAA,cAAC,SAAGtC,EAAM,SAAS,UAAU,CAAC,GAAG,aAAc,CACjD,CAEJ,CAEA,SAAS6E,GAAkB7E,EAAkD,CAC3E,IAAMiG,EAAcjG,EAAM,SAAS,SAAS,YACtCkG,EACJD,GACA,CAACA,EAAY,WAAW,QAAQ,GAChC,CAACA,EAAY,WAAW,QAAQ,GAChCA,IAAgB,kBAClB,OACE3D,EAAA,cAACwC,GAAA,CAAa,SAAU9E,EAAM,SAAU,QAAS,CAAC,CAACkG,EAAS,eAAgB5D,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GAC5GsC,EAAA,cAAC6D,GAAA,CAAkB,MAAOnG,EAAM,SAAS,QAAS,CACpD,CAEJ,CAEA,SAAS0E,GAAuB1E,EAAuD,CACrF,OACEsC,EAAA,cAACwC,GAAA,CAAa,SAAU9E,EAAM,SAAU,QAAS,GAAM,eAAgBsC,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GACvGsC,EAAA,cAAC8D,GAAA,KACC9D,EAAA,cAAC,WAAKtC,EAAM,SAAS,WAAY,CACnC,CACF,CAEJ,CAEA,SAAS4E,GAA6B5E,EAA6D,CACjG,OACEsC,EAAA,cAACwC,GAAA,CAAa,SAAU9E,EAAM,SAAU,QAAS,GAAM,eAAgBsC,EAAA,cAAC4C,GAAA,CAAuB,GAAGlF,EAAO,GACvGsC,EAAA,cAAC+D,GAAA,CAAwB,MAAOrG,EAAM,SAAU,CAClD,CAEJ,CAEA,SAAS0D,GAAmB,EAA0B,CACpD,GAAI,EAAE,iBAAkB,CACtB,IAAM4C,EAAW,IAAM,EAAE,OAAU,EAAE,MACrC,MAAO,aAAaC,GAAe,EAAE,MAAM,CAAC,MAAMA,GAAe,EAAE,KAAK,CAAC,IAAID,EAAQ,QAAQ,CAAC,CAAC,GACjG,CACA,MAAO,aAAaC,GAAe,EAAE,MAAM,CAAC,EAC9C,CAEA,SAASA,GAAeC,EAAuB,CAC7C,GAAIA,IAAU,EACZ,MAAO,SAET,IAAM/C,EAAI,KAAK,MAAM,KAAK,IAAI+C,CAAK,EAAI,KAAK,IAAI,IAAI,CAAC,EACrD,OAAQA,EAAQ,KAAK,IAAI,KAAM/C,CAAC,GAAG,QAAQ,CAAC,EAAI,IAAM,SAAS,OAAOA,CAAC,EAAI,GAC7E,CD5fO,SAASgD,GAAwBC,EAAkD,CACxF,OACEC,GAAA,cAACC,GAAA,CACC,MAAOF,EAAM,SACb,sBAAuB,MAAOG,EAAwBC,EAA4BC,IAAe,CAC/F,IAAMC,EAAM,GAAGF,CAAY,IAAIC,CAAE,GAC3BE,EAAS,IACf,OAAO,QAAQ,WAAW,CACxBJ,EAAQ,YAAYC,EAAcC,CAAE,EACpCF,EAAQ,OAAO,OAAQ,CAAE,QAAS,eAAeG,CAAG,gBAAgBA,CAAG,kBAAkBA,CAAG,GAAI,OAAAC,CAAO,CAAC,CAC1G,CAAC,CACH,EACF,CAEJ,CYvBA,OAAOC,OAAW,QAIX,SAASC,GAASC,EAAgC,CACvD,GAAM,CAAE,SAAAC,EAAU,GAAGC,CAAO,EAAIF,EAChC,OACEG,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAO,GAAGH,GAASD,CAAS,CAC/B,CAEJ,CCXA,OAAS,mBAAAK,OAAuD,gBAEhE,OAAOC,OAAW,QAOX,SAASC,GAAkBC,EAA4C,CAC5E,OACEC,GAAA,cAACC,GAAA,CACC,MAAOF,EAAM,UACb,sBAAuB,MAAOG,EAAwBC,EAA6BC,IAC1E,QAAQ,WAAW,CACxBF,EAAQ,YAAY,YAAaE,CAAE,EACnCF,EAAQ,OAAO,gBAAiB,uBAAyBE,CAAE,EAC3DF,EAAQ,OAAO,QAAS,uBAAyBE,CAAE,CACrD,CAAC,EAEH,oBAAqB,CAACC,EAAqBC,EAAyBC,KAAkB,CACpF,aAAc,gBACd,OAAQ,YACR,UAAWC,GAAgBH,CAAQ,EACnC,QAASA,EAAS,QAClB,OAAQG,GAAgBF,CAAM,EAC9B,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,QAAS,CAAC,CAAE,cAAeC,CAAK,CAAC,CACnC,GACA,YAAa,CAACF,EAAqBI,EAA2BC,KAAyB,CACrF,aAAc,QACd,OAAQ,YACR,UAAWF,GAAgBH,CAAQ,EACnC,QAASA,EAAS,QAClB,SAAUG,GAAgBC,CAAQ,EAClC,OAAQ,IAAI,KAAK,EAAE,YAAY,EAC/B,QAAAC,CACF,GACF,CAEJ,CCxCA,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,SAAAC,OAAa,gBACtC,OAAqC,6BAAAC,OAA+C,gBAEpF,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCHnD,OAAS,gBAAAC,OAAkC,gBAE3C,OAAOC,OAAW,QASX,SAASC,GAAgBC,EAAiD,CAC/E,IAAIC,EAEJ,GAAI,CACFA,EAAQC,GAAaF,EAAM,KAAMA,EAAM,QAAQ,CACjD,OAASG,EAAK,CACZ,eAAQ,KAAK,mBAAoBA,CAAG,EAC7B,IACT,CAEA,GAAIF,EAAM,OAAS,EACjB,MAAM,IAAI,MACR,4FACYA,EAAM,MAAM,qBACpB,KAAK,UAAUA,EAAO,KAAM,CAAC,CAAC,GACpC,EAEF,OAAOG,GAAA,cAACC,GAAA,CAAwB,MAAOJ,EAAM,CAAC,GAAK,GAAI,aAAcD,EAAM,aAAc,CAC3F,CC7BA,OACE,cAAAM,GACA,UAAAC,GACA,UAAAC,GACA,gBAAAC,GACA,SAAAC,GACA,UAAAC,GACA,QAAAC,GACA,cAAAC,GACA,SAAAC,GACA,QAAAC,GACA,kBAAAC,OACK,gBACP,OAAS,wBAAAC,GAA8B,qBAAAC,GAAmB,gBAAAC,OAAmC,gBAmB7F,OAAOC,GAAS,eAAAC,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QChChE,OAAS,OAAAC,GAAK,UAAAC,GAAQ,SAAAC,GAAO,QAAAC,OAAY,gBACzC,OAAOC,OAAW,QASX,SAASC,GAAmBC,EAAoD,CACrF,OACEF,GAAA,cAACF,GAAA,CAAM,MAAM,SAAS,iBAAkB,CAAE,aAAc,OAAQ,EAAG,OAAQI,EAAM,QAAS,QAASA,EAAM,UACvGF,GAAA,cAACJ,GAAA,CAAI,QAAQ,OAAO,GAAI,CAAE,eAAgB,eAAgB,GACvDM,EAAM,WAAaF,GAAA,cAACG,GAAA,CAAa,KAAK,MAAM,YAAaD,EAAM,UAAW,SAAUA,EAAM,SAAU,EACpGA,EAAM,yBACLF,GAAA,cAACG,GAAA,CACC,KAAK,qBACL,YAAaD,EAAM,wBACnB,SAAUA,EAAM,SAClB,CAEJ,EACAF,GAAA,cAACD,GAAA,CAAK,GAAI,CAAE,UAAW,OAAQ,WAAY,KAAM,GAAG,yBAAuB,CAC7E,CAEJ,CAQO,SAASI,GAAaD,EAAuC,CAClE,OACEF,GAAA,cAACH,GAAA,CACC,QAAS,IAAM,CACbK,EAAM,YAAY,EAClBA,EAAM,SAAS,CACjB,GAEC,aAAaA,EAAM,IAAI,EAC1B,CAEJ,CC7CA,OAAS,UAAAE,GAAQ,SAAAC,OAAa,gBAC9B,OAAS,gBAAAC,GAA6B,aAAAC,OAA6B,gBACnE,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCFnD,OACE,cAAAC,GACA,wBAAAC,GACA,qBAAAC,GAEA,kBAAAC,GACA,YAAAC,MAGK,gBAEP,OAAOC,OAAW,QAIlB,IAAMC,GAAqD,CACzD,OAAQ,CAACC,EAAS,OAAQA,EAAS,IAAKA,EAAS,SAAUA,EAAS,KAAK,EACzE,SAAU,CAACA,EAAS,OAAQA,EAAS,IAAKA,EAAS,SAAUA,EAAS,KAAK,EAC3E,MAAO,CAACA,EAAS,OAAQA,EAAS,GAAG,EACrC,UAAW,CAACA,EAAS,OAAQA,EAAS,GAAG,EACzC,QAAS,CACPA,EAAS,OACTA,EAAS,WACTA,EAAS,aACTA,EAAS,UACTA,EAAS,uBACTA,EAAS,mBACX,EACA,SAAU,CACRA,EAAS,OACTA,EAAS,WACTA,EAAS,aACTA,EAAS,UACTA,EAAS,uBACTA,EAAS,mBACX,EACA,KAAM,CACJA,EAAS,OACTA,EAAS,WACTA,EAAS,aACTA,EAAS,UACTA,EAAS,uBACTA,EAAS,oBACTA,EAAS,aACTA,EAAS,YACTA,EAAS,aACX,EACA,SAAU,CACRA,EAAS,OACTA,EAAS,WACTA,EAAS,aACTA,EAAS,UACTA,EAAS,uBACTA,EAAS,oBACTA,EAAS,aACTA,EAAS,YACTA,EAAS,aACX,CACF,EAEMC,GAA0C,CAC9C,GAAI,SACJ,GAAI,aACJ,GAAI,eACJ,GAAI,YACJ,GAAI,yBACJ,GAAI,sBACJ,GAAI,eACJ,GAAI,cACJ,GAAI,gBACJ,SAAU,WACV,MAAO,QACP,KAAM,OACN,IAAK,MACL,MAAO,QACP,MAAO,QACP,GAAI,KACJ,SAAU,SACV,UAAW,UACX,QAAS,UACT,WAAY,aACZ,QAAS,SACX,EAQO,SAASC,GAAWC,EAA2BC,EAAkC,CACtF,MAAO,CACL,GAAGD,EACH,QAASC,EACT,OAAQ,EACR,KAAM,MACR,CACF,CAOO,SAASC,GAAaF,EAA0C,CACrE,OAAOD,GAAWC,EAAY,CAAC,CAAC,CAClC,CAQO,SAASG,GAAoBH,EAA2BI,EAA6B,CAC1F,OAAOL,GACLC,GACCA,EAAW,SAAW,CAAC,GAAG,OAAQK,GAAMA,EAAE,OAASD,CAAI,CAC1D,CACF,CAWO,SAASE,GACdN,EACAO,EACAC,EACAC,EACAC,EACe,CACXA,IACFV,EAAaG,GAAoBH,EAAYO,CAAK,GAGpD,IAAMI,EAAwB,CAAC,EAC/B,OAAIX,EAAW,SACbW,EAAY,KAAK,GAAGX,EAAW,OAAO,EAExCW,EAAY,KAAK,CAAE,KAAMJ,EAAO,SAAUC,EAAI,MAAOC,GAAS,EAAG,CAAC,EAE3DV,GAAWC,EAAYW,CAAW,CAC3C,CAQO,SAASC,GAASZ,EAA2BO,EAA8B,CAChF,GAAIP,EAAW,QAAQ,SAASO,CAAK,EACnC,OAAOP,EAET,IAAMa,EAAY,CAAC,EACnB,OAAIb,EAAW,QACba,EAAU,KAAK,GAAGb,EAAW,MAAM,EAErCa,EAAU,KAAKN,CAAK,EACb,CACL,GAAGP,EACH,OAAQa,EACR,KAAM,MACR,CACF,CAQO,SAASC,GAAad,EAA2Be,EAA8B,CACpF,GAAI,CAACf,EAAW,QACd,OAAOA,EAET,IAAMgB,EAAa,CAAC,GAAGhB,EAAW,OAAO,EACzC,OAAAgB,EAAW,OAAOD,EAAO,CAAC,EACnB,CACL,GAAGf,EACH,QAASgB,EACT,KAAM,MACR,CACF,CAQO,SAASC,GAAmBjB,EAA2BO,EAA8B,CAC1F,OAAOW,GAAalB,EAAYO,EAAO,EAAE,CAC3C,CAQO,SAASY,GAAenB,EAA2BO,EAA8B,CACtF,OAAOW,GAAalB,EAAYO,EAAO,CAAC,CAC1C,CAQO,SAASa,GAAkBpB,EAA2BO,EAA8B,CACzF,OAAOW,GAAalB,EAAYO,EAAO,CAAC,CAC1C,CAaA,SAASW,GAAalB,EAA2BO,EAAec,EAA8B,CAC5F,IAAMC,EAAY,IAAI,KACtBA,EAAU,QAAQA,EAAU,QAAQ,EAAID,CAAK,EAC7CC,EAAU,SAAS,EAAG,EAAG,EAAG,CAAC,EAE7B,IAAMC,EAAU,IAAI,KAAKD,EAAU,QAAQ,CAAC,EAC5C,OAAAC,EAAQ,QAAQA,EAAQ,QAAQ,EAAI,CAAC,EACrCA,EAAQ,QAAQA,EAAQ,QAAQ,EAAI,CAAC,EAE9BC,GAAqBxB,EAAYO,EAAOe,EAAWC,CAAO,CACnE,CAQO,SAASE,GAAmBzB,EAA2BO,EAA8B,CAC1F,OAAOmB,GAAe1B,EAAYO,EAAO,EAAE,CAC7C,CAQO,SAASoB,GAAmB3B,EAA2BO,EAA8B,CAC1F,OAAOmB,GAAe1B,EAAYO,EAAO,CAAC,CAC5C,CAQO,SAASqB,GAAmB5B,EAA2BO,EAA8B,CAC1F,OAAOmB,GAAe1B,EAAYO,EAAO,CAAC,CAC5C,CAaA,SAASmB,GAAe1B,EAA2BO,EAAec,EAA8B,CAC9F,IAAMC,EAAY,IAAI,KACtBA,EAAU,SAASA,EAAU,SAAS,EAAID,CAAK,EAC/CC,EAAU,QAAQ,CAAC,EACnBA,EAAU,SAAS,EAAG,EAAG,EAAG,CAAC,EAE7B,IAAMC,EAAU,IAAI,KAAKD,EAAU,QAAQ,CAAC,EAC5C,OAAAC,EAAQ,SAASA,EAAQ,SAAS,EAAI,CAAC,EACvCA,EAAQ,QAAQ,CAAC,EACjBA,EAAQ,SAAS,EAAG,EAAG,EAAG,CAAC,EAC3BA,EAAQ,QAAQA,EAAQ,QAAQ,EAAI,CAAC,EAE9BC,GAAqBxB,EAAYO,EAAOe,EAAWC,CAAO,CACnE,CAQO,SAASM,GAAoB7B,EAA2BO,EAA8B,CAC3F,IAAMe,EAAY,IAAI,KACtB,OAAAA,EAAU,SAAS,CAAC,EACpBA,EAAU,QAAQ,CAAC,EACnBA,EAAU,SAAS,EAAG,EAAG,EAAG,CAAC,EAItBE,GAAqBxB,EAAYO,EAAOe,EAF/B,IAAI,IAE6C,CACnE,CAUO,SAASE,GAAqBxB,EAA2BO,EAAeuB,EAAUC,EAAyB,CAChH,OAAA/B,EAAaG,GAAoBH,EAAYO,CAAK,EAClDP,EAAagC,GAAkBhC,EAAYO,EAAOV,EAAS,uBAAwBiC,CAAE,EACrF9B,EAAagC,GAAkBhC,EAAYO,EAAOV,EAAS,oBAAqBkC,CAAE,EAC3E/B,CACT,CAUA,SAASgC,GAAkBhC,EAA2BO,EAAeC,EAAcC,EAA4B,CAC7G,OAAOH,GAAUN,EAAYO,EAAOC,EAAIC,EAAM,YAAY,CAAC,CAC7D,CASO,SAASwB,GAAiBjC,EAA2BO,EAAeE,EAAQ,GAAqB,CACtG,OAAOH,GAAUN,EAAYO,EAAOV,EAAS,QAASY,EAAM,SAAS,CAAC,CACxE,CAQO,SAASyB,GAAUlC,EAA2BmC,EAA+B,CAClF,OAAInC,EAAW,SAAWmC,EACjBnC,EAEF,CACL,GAAGA,EACH,OAAAmC,EACA,KAAM,MACR,CACF,CAQO,SAASC,GAAQpC,EAA2BqC,EAA6B,CAC9E,IAAMC,EAAQtC,EAAW,OAASuC,GAC5BC,GAAaH,EAAO,GAAKC,EAC/B,OAAOJ,GAAUlC,EAAYwC,CAAS,CACxC,CAUO,SAASC,GAAQzC,EAA2B0C,EAAcC,EAA+B,CAC9F,OAAID,IAASE,GAAa5C,CAAU,GAAK2C,IAAS,QAAaA,IAASE,GAAiB7C,CAAU,EAC1FA,EAEF,CACL,GAAGA,EACH,UAAW,CACT,CACE,KAAM0C,EACN,WAAY,CAAC,CAACC,CAChB,CACF,EACA,KAAM,MACR,CACF,CAUO,SAASG,GAAW9C,EAA2B+C,EAA4B,CAChF,IAAIJ,EAAO,GACX,OAAIC,GAAa5C,CAAU,IAAM+C,IAC/BJ,EAAO,CAACE,GAAiB7C,CAAU,GAE9ByC,GAAQzC,EAAY+C,EAAKJ,CAAI,CACtC,CAEO,SAASC,GAAa5C,EAA+C,CAC1E,IAAMgD,EAAYhD,EAAW,UAC7B,GAAI,CAACgD,GAAaA,EAAU,SAAW,EACrC,OAEF,IAAMzC,EAAQyC,EAAU,CAAC,EAAE,KAC3B,OAAOzC,EAAM,WAAW,GAAG,EAAIA,EAAM,OAAO,CAAC,EAAIA,CACnD,CAEO,SAASsC,GAAiB7C,EAAoC,CACnE,IAAMgD,EAAYhD,EAAW,UAC7B,MAAI,CAACgD,GAAaA,EAAU,SAAW,EAC9B,GAEF,CAAC,CAACA,EAAU,CAAC,EAAE,UACxB,CAOO,SAASC,GAAmBC,EAAsD,CACvF,OAAOtD,GAAuBsD,EAAY,IAAc,CAC1D,CAOO,SAASC,GAAY3C,EAAsB,CAChD,OAAOV,GAAcU,CAAE,GAAK,EAC9B,CAOO,SAAS4C,GAAqBL,EAAqB,CACxD,IAAIM,EAAMN,EAQV,OALIM,EAAI,SAAS,GAAG,IAClBA,EAAMA,EAAI,MAAM,GAAG,EAAE,IAAI,GAIvBA,IAAQ,KACH,KAILA,IAAQ,YACH,cAITA,EAAMA,EAAI,QAAQ,MAAO,EAAE,EAG3BA,EAAMA,EAAI,QAAQ,WAAY,KAAK,EAGnCA,EAAMA,EAAI,QAAQ,QAAS,GAAG,EAG9BA,EAAMA,EAAI,QAAQ,OAAQ,GAAG,EAG7BA,EAAMA,EAAI,KAAK,EAGRA,EAAI,MAAM,IAAI,EAAE,IAAIC,EAAU,EAAE,KAAK,GAAG,EACjD,CAQO,SAASC,GAAYC,EAAoBjD,EAAoE,CAClH,IAAMwC,EAAMxC,EAAM,KAClB,OAAIwC,IAAQ,KACHS,EAAS,GAGdT,IAAQ,iBACHS,EAAS,MAAM,UAGpBT,IAAQ,eACHU,GAAeD,EAAS,MAAM,WAAW,EAI9CjD,EAAM,mBAAqB,GAAGiD,EAAS,YAAY,IAAIjD,EAAM,IAAI,KAAOA,EAAM,kBAAkB,KAC3FmD,GAAoBF,EAAUjD,EAAM,iBAAiB,EAI1DA,EAAM,cAAgBA,EAAM,aAAa,SAAW,GAAKA,EAAM,OAASA,EAAM,aAAa,CAAC,EAAE,KACzFoD,GAA2BH,EAAUjD,EAAM,aAAa,CAAC,CAAC,EAI5D,IACT,CAQA,SAASmD,GAAoBF,EAAoBI,EAA0D,CACzG,IAAMC,EAAOD,EAAkB,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,WAAW,MAAO,EAAE,GAAK,GAC3E,CAACnD,EAAOqD,CAAY,EAAIC,GAAgB,CAAE,KAAMP,EAAS,aAAc,MAAOA,CAAS,EAAGK,CAAI,EACpG,OAAKpD,EAKHuD,GAAA,cAACC,GAAA,CACC,SAAUL,EACV,aAAcE,EACd,MAAOrD,EACP,SAAU,IACV,oBAAqB,GACrB,KAAM,GACR,EAXO,IAaX,CAQA,SAASkD,GAA2BH,EAAoBN,EAAkD,CACxG,IAAMzC,EAAQyD,GAAkBhB,EAAY,WAAsB,CAAC,CAAE,KAAMM,EAAS,aAAc,MAAOA,CAAS,CAAC,CAAC,EACpH,MAAI,CAAC/C,GAASA,EAAM,SAAW,EACtB,KAIPuD,GAAA,cAAAA,GAAA,cACGvD,EAAM,IAAI,CAAC0D,EAAGpD,IACbiD,GAAA,cAACC,GAAA,CACC,IAAK,GAAGlD,CAAK,IAAIN,EAAM,MAAM,GAC7B,aAAc0D,EAAE,KAChB,MAAOA,EAAE,MACT,SAAU,IACV,oBAAqB,GACrB,KAAM,GACR,CACD,CACH,CAEJ,CD9jBO,SAASC,GAAkBC,EAAmD,CACnF,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAS,CACjC,OAAQ,KAAK,MAAMC,GAAUJ,EAAM,MAAM,CAAC,CAC5C,CAAC,EAEKK,EAAeC,GAA0B,IAAI,EAC7CC,EAAcD,GAA0B,IAAI,EAElDE,GAAU,IAAM,CACdN,EAAS,CAAE,OAAQF,EAAM,MAAO,CAAC,CACnC,EAAG,CAACA,EAAM,MAAM,CAAC,EAOjB,SAASS,EAAuBC,EAA8B,CACxDA,EAAE,MAAQ,SACZC,EAAW,CAEf,CAMA,SAASC,GAAmC,CAC1CD,EAAW,CACb,CAOA,SAASE,EAAsBH,EAA8B,CACvDA,EAAE,MAAQ,SACZI,EAAc,CAElB,CAMA,SAASC,GAAkC,CACzCD,EAAc,CAChB,CAMA,SAASH,GAAmB,CAC1B,IAAMK,EAAef,EAAM,OAAO,QAAU,CAAC,EACvCgB,EAAMZ,EAAa,SAAS,MAClC,GAAIY,EAAK,CACP,IAAMC,EAAY,CAAC,GAAGF,EAAcC,CAAG,EACvCf,EAAS,CACP,OAAQ,CACN,GAAGD,EAAM,OACT,OAAQiB,CACV,CACF,CAAC,CACH,CACF,CAMA,SAASJ,GAAsB,CAC7B,IAAME,EAAef,EAAM,OAAO,QAAU,CAAC,EACvCgB,EAAMV,EAAY,SAAS,MACjC,GAAIU,EAAK,CACP,IAAMC,EAAY,CAAC,GAAGF,CAAY,EAClCE,EAAU,OAAOA,EAAU,QAAQD,CAAG,EAAG,CAAC,EAC1Cf,EAAS,CACP,OAAQ,CACN,GAAGD,EAAM,OACT,OAAQiB,CACV,CACF,CAAC,CACH,CACF,CAMA,SAASC,GAAiB,CACxB,IAAMC,EAAgBnB,EAAM,OAAO,QAAU,CAAC,EACxCoB,EAAQd,EAAY,SAAS,MACnC,GAAI,CAACc,EACH,OAGF,IAAMH,EAAY,CAAC,GAAGE,CAAa,EAC7BE,EAAQJ,EAAU,QAAQG,CAAK,EACjCC,GAAS,IAIbC,EAAWL,EAAWI,EAAOA,EAAQ,CAAC,EACtCpB,EAAS,CAAE,OAAQ,CAAE,GAAGD,EAAM,OAAQ,OAAQiB,CAAU,CAAE,CAAC,EAC7D,CAMA,SAASM,GAAmB,CAC1B,IAAMJ,EAAgBnB,EAAM,OAAO,QAAU,CAAC,EACxCoB,EAAQd,EAAY,SAAS,MACnC,GAAI,CAACc,EACH,OAGF,IAAMH,EAAY,CAAC,GAAGE,CAAa,EAC7BE,EAAQJ,EAAU,QAAQG,CAAK,EACjCC,GAASJ,EAAU,OAAS,IAIhCK,EAAWL,EAAWI,EAAOA,EAAQ,CAAC,EACtCpB,EAAS,CAAE,OAAQ,CAAE,GAAGD,EAAM,OAAQ,OAAQiB,CAAU,CAAE,CAAC,EAC7D,CAQA,SAASK,EAAWE,EAAkBC,EAAWC,EAAiB,CAChE,IAAMC,EAAOH,EAAOC,CAAC,EACrBD,EAAOC,CAAC,EAAID,EAAOE,CAAC,EACpBF,EAAOE,CAAC,EAAIC,CACd,CAEA,GAAI,CAAC5B,EAAM,QACT,OAAO,KAGT,IAAM6B,EAAe7B,EAAM,OAAO,aAC5B8B,EAAUC,GAAa,MAAMF,CAAY,EAEzCG,EAAW/B,EAAM,OAAO,QAAU,CAAC,EACnCgC,EAAYC,GAAcJ,CAAO,EACpC,OAAQT,GAAU,CAACW,EAAS,SAASX,CAAK,CAAC,EAC3C,KAAK,CAACc,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,EAEpC,OACEC,EAAA,cAACC,GAAA,CAAM,MAAM,SAAS,iBAAkB,CAAE,aAAc,OAAQ,EAAG,OAAQtC,EAAM,QAAS,QAASA,EAAM,UACvGqC,EAAA,cAAC,WACCA,EAAA,cAAC,SAAM,MAAO,CAAE,OAAQ,MAAO,GAC7BA,EAAA,cAAC,aACCA,EAAA,cAAC,UACCA,EAAA,cAAC,MAAG,QAAS,EAAG,MAAM,UAAS,WAE/B,EACAA,EAAA,cAAC,MAAG,QAAS,EAAG,MAAM,UAAS,UAE/B,CACF,CACF,EACAA,EAAA,cAAC,aACCA,EAAA,cAAC,UACCA,EAAA,cAAC,MAAG,QAAS,EAAG,MAAM,UACpBA,EAAA,cAAC,UACC,IAAKhC,EACL,KAAM,GACN,SAAU,EACV,MAAO,CAAE,MAAO,OAAQ,EACxB,UAAYK,GAAMD,EAAuBC,CAAC,EAC1C,cAAe,IAAME,EAA2B,EAChD,cAAY,aAEXqB,EAAU,IAAKhB,GACdoB,EAAA,cAAC,UAAO,IAAKpB,EAAK,MAAOA,GACtBsB,GAAqBtB,CAAG,CAC3B,CACD,CACH,CACF,EACAoB,EAAA,cAAC,MAAG,QAAS,EAAG,MAAM,UACpBA,EAAA,cAAC,UACC,IAAK9B,EACL,KAAM,GACN,SAAU,EACV,MAAO,CAAE,MAAO,OAAQ,EACxB,UAAYG,GAAMG,EAAsBH,CAAC,EACzC,cAAe,IAAMK,EAA0B,EAC/C,cAAY,YAEXiB,EAAS,IAAKf,GACboB,EAAA,cAAC,UAAO,IAAKpB,EAAK,MAAOA,GACtBsB,GAAqBtB,CAAG,CAC3B,CACD,CACH,CACF,CACF,CACF,EACAoB,EAAA,cAAC,aACCA,EAAA,cAAC,UACCA,EAAA,cAAC,MAAG,MAAM,UACRA,EAAA,cAACG,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAS7B,GAAY,KAEvD,CACF,EACA0B,EAAA,cAAC,MAAG,MAAM,UACRA,EAAA,cAACG,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAS1B,GAAe,QAE1D,CACF,EACAuB,EAAA,cAAC,MAAG,MAAM,UACRA,EAAA,cAACG,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAASrB,GAAU,IAErD,CACF,EACAkB,EAAA,cAAC,MAAG,MAAM,UACRA,EAAA,cAACG,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAShB,GAAY,MAEvD,CACF,CACF,CACF,CACF,CACF,EACAa,EAAA,cAACG,GAAA,CAAO,QAAS,IAAMxC,EAAM,KAAKC,EAAM,MAAM,GAAG,IAAE,CACrD,CAEJ,CAQA,SAASiC,GAAcO,EAAkC,CACvD,IAAMC,EAAS,CAAC,EACVC,EAAO,IAAI,IACXC,EAAQ,IAAI,IAGlB,QAAW3B,KAAO,OAAO,KAAKwB,EAAW,UAAU,EACjDC,EAAO,KAAKzB,CAAG,EACf0B,EAAK,IAAI1B,EAAI,YAAY,CAAC,EAC1B2B,EAAM,IAAIL,GAAqBtB,CAAG,CAAC,EAIrC,GAAIwB,EAAW,aACb,QAAWI,KAAQ,OAAO,KAAKJ,EAAW,YAAY,EAAG,CACvD,IAAMK,EAAOP,GAAqBM,CAAI,EAClC,CAACF,EAAK,IAAIE,CAAI,GAAK,CAACD,EAAM,IAAIE,CAAI,IACpCJ,EAAO,KAAKG,CAAI,EAChBF,EAAK,IAAIE,CAAI,EACbD,EAAM,IAAIL,GAAqBM,CAAI,CAAC,EAExC,CAGF,OAAOH,CACT,CEvRA,OAAS,UAAAK,GAAQ,SAAAC,GAAO,SAAAC,GAAO,gBAAAC,OAAoB,gBACnD,OAAiB,gBAAAC,GAAuC,aAAAC,OAAiB,gBAEzE,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCHnD,OAEE,kBAAAC,GACA,6BAAAC,GACA,gBAAAC,GACA,YAAAC,GACA,uBAAAC,OACK,gBACP,OAAOC,OAAW,QAQX,SAASC,GAAyBC,EAAmD,CAC1F,GAAM,CAAE,aAAAC,EAAc,OAAAC,CAAO,EAAIF,EAE3BG,EAAcC,GAAa,MAAMH,CAAY,EAAE,eAAeC,EAAO,IAAI,EAC/E,GAAIC,EAAa,CACf,GACEA,EAAY,OAAS,cACpBD,EAAO,WAAaG,GAAS,QAAUH,EAAO,WAAaG,GAAS,YAErE,OAAOC,GAAA,cAACC,GAAA,CAAa,MAAO,CAAE,UAAWL,EAAO,KAAM,EAAG,EAG3D,IAAMM,EAAqBC,GAA0BR,EAAcE,CAAW,EAC9E,GAAID,EAAO,OAAS,gBAAkBM,EAAmB,OAASE,GAAoB,SACpF,OAAOJ,GAAA,cAAAA,GAAA,cAAGK,GAAeT,EAAO,KAAK,CAAE,CAE3C,CAEA,OAAOI,GAAA,cAAAA,GAAA,cAAGJ,EAAO,KAAM,CACzB,CCnCA,OAAS,YAAAU,GAAU,aAAAC,OAAiB,gBACpC,OAAS,6BAAAC,GAA2B,uBAAAC,OAA2B,gBAE/D,OAAOC,OAAW,QAaX,SAASC,GAAuBC,EAAwD,CAC7F,IAAMC,EAAUC,GAA0BF,EAAM,aAAcA,EAAM,WAAW,EACzEG,EAAO,eAEb,OAAQF,EAAQ,KAAM,CACpB,KAAKG,GAAoB,UACvB,OACEC,GAAA,cAACC,GAAA,CACC,KAAMH,EACN,aAAcH,EAAM,aAAe,CAAE,UAAWA,EAAM,YAAa,EAAI,OACvE,YAAaA,EAAM,YAAY,OAC/B,UAAWA,EAAM,UACjB,SAAWO,GAAwC,CAC7CA,EACFP,EAAM,SAASO,EAAa,SAAmB,EAE/CP,EAAM,SAAS,EAAE,CAErB,EACF,EAGJ,KAAKI,GAAoB,QACvB,OACEC,GAAA,cAACG,GAAA,CACC,KAAML,EACN,iBAAgBH,EAAM,UACtB,cAAaG,EACb,eAAgBH,EAAM,eAAiB,OACvC,UAAWA,EAAM,UACjB,SAAWS,GAAMT,EAAM,SAASS,EAAE,cAAc,QAAQ,SAAS,CAAC,EACpE,EAGJ,KAAKL,GAAoB,KACvB,OACEC,GAAA,cAACK,GAAA,CACC,KAAK,OACL,KAAMP,EACN,iBAAgBH,EAAM,UACtB,cAAaG,EACb,aAAcH,EAAM,aACpB,UAAWA,EAAM,UACjB,SAAWS,GAAMT,EAAM,SAASS,EAAE,cAAc,KAAK,EACvD,EAGJ,KAAKL,GAAoB,SACvB,OACEC,GAAA,cAACM,GAAA,CACC,KAAMR,EACN,aAAcH,EAAM,aACpB,UAAWA,EAAM,UACjB,SAAUA,EAAM,SAClB,EAGJ,KAAKI,GAAoB,OACvB,OACEC,GAAA,cAACK,GAAA,CACC,KAAK,SACL,KAAMP,EACN,iBAAgBH,EAAM,UACtB,cAAaG,EACb,aAAcH,EAAM,aACpB,UAAWA,EAAM,UACjB,SAAWS,GAAMT,EAAM,SAASS,EAAE,cAAc,KAAK,EACvD,EAGJ,KAAKL,GAAoB,SACvB,OACEC,GAAA,cAACO,GAAA,CACC,KAAMT,EACN,aAAcU,GAAiBb,EAAM,YAAY,EACjD,UAAWA,EAAM,UACjB,SAAWc,GAAsC,CAC3CA,EACFd,EAAM,SAAS,GAAGc,EAAY,KAAK,EAAE,EAErCd,EAAM,SAAS,EAAE,CAErB,EACF,EAGJ,QACE,OACEK,GAAA,cAACK,GAAA,CACC,KAAMP,EACN,iBAAgBH,EAAM,UACtB,cAAaG,EACb,aAAcH,EAAM,aACpB,UAAWA,EAAM,UACjB,SAAWS,GAAMT,EAAM,SAASS,EAAE,cAAc,KAAK,EACrD,YAAY,eACd,CAEN,CACF,CAEA,SAASI,GAAiBE,EAAiD,CACzE,GAAIA,EAAO,CACT,GAAM,CAACC,EAAaC,EAAcC,CAAU,EAAIH,EAAM,MAAM,GAAG,EAC/D,GAAIC,EACF,MAAO,CACL,MAAO,WAAWA,CAAW,EAC7B,OAAQC,EACR,KAAMC,CACR,CAEJ,CAEF,CF3GO,SAASC,GAAmBC,EAAoD,CACrF,GAAM,CAACC,EAAQC,CAAS,EAAIC,GAAwB,KAAK,MAAMC,GAAUJ,EAAM,MAAM,CAAC,CAAkB,EAClG,CAACK,EAAcC,CAAe,EAAIH,GAAiB,EAAE,EAErDI,EAAYC,GAAsBP,CAAM,EAC9CM,EAAU,QAAUN,EAEpBQ,GAAU,IAAM,CACdP,EAAU,KAAK,MAAME,GAAUJ,EAAM,MAAM,CAAC,CAAkB,CAChE,EAAG,CAACA,EAAM,MAAM,CAAC,EAEjB,SAASU,EAAYC,EAAsB,CACzCT,EAAUU,GAAUL,EAAU,QAASI,EAAO,KAAMA,EAAO,SAAUA,EAAO,KAAK,CAAC,CACpF,CAEA,GAAI,CAACX,EAAM,QACT,OAAO,KAGT,IAAMa,EAAeb,EAAM,OAAO,aAC5Bc,EAAgBC,GAAa,MAAMF,CAAY,EAAE,cAAoD,CAAC,EACtGG,EAAUf,EAAO,SAAW,CAAC,EAEnC,OACEgB,EAAA,cAACC,GAAA,CACC,MAAM,UACN,iBAAkB,CAAE,aAAc,OAAQ,EAC1C,KAAM,IACN,OAAQlB,EAAM,QACd,QAASA,EAAM,UAEfiB,EAAA,cAAC,WACCA,EAAA,cAAC,aACCA,EAAA,cAAC,gBACCA,EAAA,cAAC,OAAI,MAAO,CAAE,MAAO,GAAI,EAAG,EAC5BA,EAAA,cAAC,OAAI,MAAO,CAAE,MAAO,GAAI,EAAG,EAC5BA,EAAA,cAAC,OAAI,MAAO,CAAE,MAAO,GAAI,EAAG,EAC5BA,EAAA,cAAC,OAAI,MAAO,CAAE,MAAO,GAAI,EAAG,CAC9B,EACAA,EAAA,cAAC,aACCA,EAAA,cAAC,UACCA,EAAA,cAAC,UAAG,OAAK,EACTA,EAAA,cAAC,UAAG,WAAS,EACbA,EAAA,cAAC,UAAG,OAAK,EACTA,EAAA,cAAC,UAAG,SAAO,CACb,CACF,EACAA,EAAA,cAAC,aACED,EAAQ,IAAI,CAACL,EAAgBQ,IACxBA,IAAUd,EAEVY,EAAA,cAACG,GAAA,CACC,IAAK,UAAUT,EAAO,IAAI,IAAIA,EAAO,QAAQ,IAAIA,EAAO,KAAK,SAC7D,aAAcE,EACd,aAAcC,EACd,aAAcH,EACd,OAAO,OACP,KAAOU,GAAsB,CAC3B,IAAMC,EAAa,CAAC,GAAGN,CAAO,EAC9BM,EAAWH,CAAK,EAAIE,EACpBnB,EAAUqB,GAAWhB,EAAU,QAASe,CAAU,CAAC,EACnDhB,EAAgB,EAAE,CACpB,EACA,SAAU,IAAMA,EAAgB,EAAE,EACpC,EAIAW,EAAA,cAACO,GAAA,CACC,IAAK,UAAUb,EAAO,IAAI,IAAIA,EAAO,QAAQ,IAAIA,EAAO,KAAK,WAC7D,aAAcE,EACd,aAAcC,EACd,OAAQH,EACR,OAAQ,IAAML,EAAgBa,CAAK,EACnC,SAAU,IAAMjB,EAAUuB,GAAalB,EAAU,QAASY,CAAK,CAAC,EAClE,CAGL,EACDF,EAAA,cAACG,GAAA,CAAe,aAAcP,EAAc,aAAcC,EAAc,OAAO,MAAM,KAAMJ,EAAa,CAC1G,CACF,CACF,EACAO,EAAA,cAACS,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBT,EAAA,cAACU,GAAA,CAAO,QAAS,IAAM3B,EAAM,KAAKO,EAAU,OAAO,GAAG,IAAE,CAC1D,CACF,CAEJ,CAUA,SAASiB,GAAiBxB,EAAkD,CAC1E,GAAM,CAAE,OAAAW,CAAO,EAAIX,EACnB,OACEiB,EAAA,cAAC,UACCA,EAAA,cAAC,UAAIW,GAAqBjB,EAAO,IAAI,CAAE,EACvCM,EAAA,cAAC,UAAIY,GAAYlB,EAAO,QAAQ,CAAE,EAClCM,EAAA,cAAC,UACCA,EAAA,cAACa,GAAA,CAAyB,aAAc9B,EAAM,aAAc,OAAQW,EAAQ,CAC9E,EACAM,EAAA,cAAC,UACCA,EAAA,cAACU,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAS3B,EAAM,QAAQ,MAEzD,EACAiB,EAAA,cAACU,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAS3B,EAAM,UAAU,QAE3D,CACF,CACF,CAEJ,CAWA,SAASoB,GAAepB,EAAyC,CAC/D,GAAM,CAAC+B,EAAOC,CAAQ,EAAI7B,GAAiBH,EAAM,cAAiB,CAAC,CAAY,EACzEiC,EAAWzB,GAAeuB,CAAK,EACrCE,EAAS,QAAUF,EAEnB,SAASG,EAAcC,EAAuB,CAC5CH,EAAS,CAAE,GAAGC,EAAS,QAAS,KAAME,CAAQ,CAAC,CACjD,CAEA,SAASC,EAAkBC,EAA6B,CACtDL,EAAS,CAAE,GAAGC,EAAS,QAAS,SAAUI,CAAY,CAAC,CACzD,CAEA,SAASC,EAAeC,EAA8B,CACpDP,EAAS,CAAE,GAAGC,EAAS,QAAS,MAAOM,CAAe,CAAC,CACzD,CAEA,IAAMC,EAAcxC,EAAM,aAAa+B,EAAM,IAAI,EAC3CU,EAAYD,GAAeE,GAAmBF,CAAW,EAE/D,OACEvB,EAAA,cAAC,UACCA,EAAA,cAAC,UACCA,EAAA,cAAC0B,GAAA,CACC,cAAY,eACZ,aAAcV,EAAS,QAAQ,KAC/B,SAAWW,GAAMV,EAAcU,EAAE,cAAc,KAAK,EACpD,KAAM,CACJ,GACA,GAAG,OAAO,KAAK5C,EAAM,YAAY,EAAE,IAAK6C,IAAW,CAAE,MAAOA,EAAO,MAAOjB,GAAqBiB,CAAK,CAAE,EAAE,CAC1G,EACF,CACF,EACA5B,EAAA,cAAC,UACEwB,GACCxB,EAAA,cAAC0B,GAAA,CACC,cAAY,mBACZ,aAAcZ,EAAM,SACpB,SAAWa,GAAMR,EAAkBQ,EAAE,cAAc,KAAiB,EACpE,KAAM,CAAC,GAAI,GAAGH,EAAU,IAAKK,IAAQ,CAAE,MAAOA,EAAI,MAAOjB,GAAYiB,CAAE,CAAE,EAAE,CAAC,EAC9E,CAEJ,EACA7B,EAAA,cAAC,UACEuB,GAAeT,EAAM,UACpBd,EAAA,cAAC8B,GAAA,CACC,aAAc/C,EAAM,aACpB,YAAawC,EACb,aAAcT,EAAM,MACpB,SAAUO,EACZ,CAEJ,EACArB,EAAA,cAAC,UACEc,EAAM,MAAQA,EAAM,UAAYA,EAAM,OACrCd,EAAA,cAACU,GAAA,CACC,QAAO,GACP,QAAQ,UACR,QAAS,IAAM,CACb3B,EAAM,KAAKiC,EAAS,OAAO,EAC3BD,EAAS,CAAC,CAAW,CACvB,GAEChC,EAAM,MACT,EAEDA,EAAM,UACLiB,EAAA,cAACU,GAAA,CAAO,QAAO,GAAC,QAAQ,UAAU,QAAS3B,EAAM,UAAU,QAE3D,CAEJ,CACF,CAEJ,CGhOA,OAAS,UAAAgD,GAAQ,QAAAC,GAAM,SAAAC,OAAa,gBAGpC,OAAOC,IAAS,YAAAC,OAAgB,QAezB,SAASC,GAAwBC,EAAyD,CAC/F,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAiBH,EAAM,cAAgB,EAAE,EAEnE,GAAI,CAACA,EAAM,SAAW,CAACA,EAAM,aAAe,CAACA,EAAM,OACjD,OAAO,KAGT,SAASI,GAAa,CACpBJ,EAAM,KAAK,CAAE,GAAIA,EAAM,OAAmB,MAAAC,CAAM,CAAC,CACnD,CAEA,OACEI,GAAA,cAACC,GAAA,CAAM,MAAON,EAAM,MAAO,KAAK,KAAK,OAAQA,EAAM,QAAS,QAASA,EAAM,UACzEK,GAAA,cAACE,EAAA,CAAK,SAAUH,GACdC,GAAA,cAACG,GAAA,KACCH,GAAA,cAACG,GAAK,IAAL,CAAS,KAAM,IACdH,GAAA,cAACI,GAAA,CACC,aAAcT,EAAM,aACpB,YAAaA,EAAM,YACnB,aAAcC,EACd,UAAW,GACX,SAAUC,EACZ,CACF,EACAG,GAAA,cAACG,GAAK,IAAL,CAAS,KAAM,GACdH,GAAA,cAACK,GAAA,CAAO,QAASN,EAAM,UAAS,IAAC,IAEjC,CACF,CACF,CACF,CACF,CAEJ,CCnDA,OAAS,QAAAO,MAAY,gBACrB,OAAiB,YAAAC,OAA+B,gBAkBhD,OAAOC,MAAW,QAsBX,SAASC,GAAgBC,EAAiD,CAC/E,GAAI,CAACA,EAAM,aACT,OAAO,KAGT,SAASC,EAAOC,EAA8BC,EAAqB,CACjEC,EAASC,GAAQL,EAAM,OAAQE,EAAY,KAAgBC,CAAI,CAAC,CAClE,CAEA,SAASG,EAAQJ,EAAoC,CACnDE,EAASG,GAAoBP,EAAM,OAAQE,EAAY,IAAc,CAAC,CACxE,CAEA,SAASM,EAASN,EAA8BO,EAA0B,CACxET,EAAM,SAASE,EAAa,CAAE,KAAMA,EAAY,KAAgB,SAAAO,EAAU,MAAO,EAAG,CAAC,CACvF,CAEA,SAASL,EAASM,EAAiC,CACjDV,EAAM,SAASU,CAAU,CAC3B,CAGA,OAAIV,EAAM,aAAa,SAAW,EAE9BW,EAAA,cAACC,GAAA,CACC,OAAQZ,EAAM,OACd,YAAaA,EAAM,aAAa,CAAC,EACjC,OAAQC,EACR,SAAUO,EACV,SAAUJ,EACV,QAASE,EACX,EAMFK,EAAA,cAACE,EAAK,SAAL,KACEb,EAAM,aAAa,IAAKE,GACvBS,EAAA,cAACE,EAAK,KAAL,CAAU,IAAKX,EAAY,MAAOY,GAAqBZ,EAAY,IAAc,CAAE,CACrF,CACH,CAEJ,CAWA,SAASU,GAAuBZ,EAA6C,CAC3E,OAAQA,EAAM,YAAY,KAAM,CAC9B,IAAK,OACH,OAAOW,EAAA,cAACI,GAAA,CAAmB,GAAGf,EAAO,EACvC,IAAK,SACL,IAAK,WACH,OAAOW,EAAA,cAACK,GAAA,CAAsB,GAAGhB,EAAO,EAC1C,IAAK,YACH,OAAOW,EAAA,cAACM,GAAA,CAAwB,GAAGjB,EAAO,EAC5C,IAAK,SACL,IAAK,QACL,IAAK,MACH,OAAOW,EAAA,cAACO,GAAA,CAAmB,GAAGlB,EAAO,EACvC,QACE,OAAOW,EAAA,cAAAA,EAAA,cAAE,8BAA4BX,EAAM,YAAY,IAAK,CAChE,CACF,CAEA,SAASe,GAAkBf,EAA6C,CACtE,GAAM,CAAE,YAAAE,CAAY,EAAIF,EAClBmB,EAAOjB,EAAY,KACzB,OACES,EAAA,cAACE,EAAK,SAAL,KACCF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACS,GAAA,CAAkB,KAAM,GAAI,EAAI,QAAS,IAAMpB,EAAM,OAAOE,EAAa,EAAK,GAAG,uBAEnG,EACAS,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACU,GAAA,CAAmB,KAAM,GAAI,EAAI,QAAS,IAAMrB,EAAM,OAAOE,EAAa,EAAI,GAAG,uBAEnG,EACAS,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACW,GAAA,CAAU,KAAM,GAAI,EAAI,QAAS,IAAMtB,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,WAEvG,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACa,GAAA,CAAa,KAAM,GAAI,EAAI,QAAS,IAAMxB,EAAM,SAASE,EAAaqB,GAAS,UAAU,GAAG,mBAE9G,EACAZ,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACc,GAAA,CAAc,KAAM,GAAI,EAAI,QAAS,IAAMzB,EAAM,SAASE,EAAaqB,GAAS,WAAW,GAAG,WAEhH,EACAZ,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACe,GAAA,CAAgB,KAAM,GAAI,EACjC,QAAS,IAAM1B,EAAM,SAASE,EAAaqB,GAAS,YAAY,GACjE,UAED,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACgB,GAAA,CAAoB,KAAM,GAAI,EAAI,QAAS,IAAM3B,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,YAEjH,EACAZ,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAAS6B,GAAkB7B,EAAM,OAAQmB,CAAI,CAAC,GACpE,UAED,EACAR,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAAI,QAAS,IAAM5B,EAAM,SAAS8B,GAAe9B,EAAM,OAAQmB,CAAI,CAAC,GAAG,OAEhH,EACAR,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAAS+B,GAAmB/B,EAAM,OAAQmB,CAAI,CAAC,GACrE,WAED,EACAR,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAASgC,GAAmBhC,EAAM,OAAQmB,CAAI,CAAC,GACrE,YAED,EACAR,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAASiC,GAAmBjC,EAAM,OAAQmB,CAAI,CAAC,GACrE,YAED,EACAR,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAASkC,GAAmBlC,EAAM,OAAQmB,CAAI,CAAC,GACrE,YAED,EACAR,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACiB,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAM5B,EAAM,SAASmC,GAAoBnC,EAAM,OAAQmB,CAAI,CAAC,GACtE,cAED,EACAR,EAAA,cAACyB,GAAA,CAAiB,GAAGpC,EAAO,CAC9B,CAEJ,CAEA,SAASgB,GAAqBhB,EAA6C,CACzE,GAAM,CAAE,YAAAE,CAAY,EAAIF,EACxB,OACEW,EAAA,cAACE,EAAK,SAAL,KACCF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACS,GAAA,CAAkB,KAAM,GAAI,EAAI,QAAS,IAAMpB,EAAM,OAAOE,EAAa,EAAK,GAAG,0BAEnG,EACAS,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACU,GAAA,CAAmB,KAAM,GAAI,EAAI,QAAS,IAAMrB,EAAM,OAAOE,EAAa,EAAI,GAAG,0BAEnG,EACAS,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACW,GAAA,CAAU,KAAM,GAAI,EAAI,QAAS,IAAMtB,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,WAEvG,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACa,GAAA,CAAa,KAAM,GAAI,EAAI,QAAS,IAAMxB,EAAM,SAASE,EAAaqB,GAAS,UAAU,GAAG,mBAE9G,EACAZ,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAACe,GAAA,CAAgB,KAAM,GAAI,EACjC,QAAS,IAAM1B,EAAM,SAASE,EAAaqB,GAAS,YAAY,GACjE,iBAED,EACAZ,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAAC0B,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAMrC,EAAM,SAASE,EAAaqB,GAAS,sBAAsB,GAC3E,6BAED,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACc,GAAA,CAAc,KAAM,GAAI,EAAI,QAAS,IAAMzB,EAAM,SAASE,EAAaqB,GAAS,SAAS,GAAG,cAE9G,EACAZ,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAAC0B,GAAA,CAAa,KAAM,GAAI,EAC9B,QAAS,IAAMrC,EAAM,SAASE,EAAaqB,GAAS,mBAAmB,GACxE,0BAED,EACAZ,EAAA,cAACyB,GAAA,CAAiB,GAAGpC,EAAO,CAC9B,CAEJ,CAEA,SAASiB,GAAuBjB,EAA6C,CAC3E,GAAM,CAAE,YAAAE,CAAY,EAAIF,EACxB,OACEW,EAAA,cAACE,EAAK,SAAL,KACCF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACW,GAAA,CAAU,KAAM,GAAI,EAAI,QAAS,IAAMtB,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,WAEvG,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACa,GAAA,CAAa,KAAM,GAAI,EAAI,QAAS,IAAMxB,EAAM,SAASE,EAAaqB,GAAS,GAAG,GAAG,mBAEvG,EACAZ,EAAA,cAACyB,GAAA,CAAiB,GAAGpC,EAAO,CAC9B,CAEJ,CAEA,SAASkB,GAAkBlB,EAA6C,CACtE,GAAM,CAAE,YAAAE,CAAY,EAAIF,EACxB,OACEW,EAAA,cAACE,EAAK,SAAL,KACCF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACS,GAAA,CAAkB,KAAM,GAAI,EAAI,QAAS,IAAMpB,EAAM,OAAOE,EAAa,EAAK,GAAG,aAEnG,EACAS,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACU,GAAA,CAAmB,KAAM,GAAI,EAAI,QAAS,IAAMrB,EAAM,OAAOE,EAAa,EAAI,GAAG,aAEnG,EACAS,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACW,GAAA,CAAU,KAAM,GAAI,EAAI,QAAS,IAAMtB,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,WAEvG,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACa,GAAA,CAAa,KAAM,GAAI,EAAI,QAAS,IAAMxB,EAAM,SAASE,EAAaqB,GAAS,GAAG,GAAG,mBAEvG,EACAZ,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAAC2B,GAAA,CAAW,KAAM,GAAI,EAAI,QAAS,IAAMtC,EAAM,SAASE,EAAaqB,GAAS,QAAQ,GAAG,aAE1G,EACAZ,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAAC4B,GAAA,CAAc,KAAM,GAAI,EAAI,QAAS,IAAMvC,EAAM,SAASE,EAAaqB,GAAS,MAAM,GAAG,qBAE3G,EACAZ,EAAA,cAACyB,GAAA,CAAiB,GAAGpC,EAAO,CAC9B,CAEJ,CAEA,SAASoC,GAAgBpC,EAA6C,CACpE,GAAM,CAAE,YAAAE,CAAY,EAAIF,EAClBmB,EAAOjB,EAAY,KACzB,OACES,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAAC6B,GAAA,CAAW,KAAM,GAAI,EAAI,QAAS,IAAMxC,EAAM,SAASyC,GAAiBzC,EAAM,OAAQmB,CAAI,CAAC,GAAG,SAEhH,EACAR,EAAA,cAACE,EAAK,KAAL,CACC,KAAMF,EAAA,cAAC+B,GAAA,CAAc,KAAM,GAAI,EAC/B,QAAS,IAAM1C,EAAM,SAASyC,GAAiBzC,EAAM,OAAQmB,EAAM,EAAK,CAAC,GAC1E,aAED,EACAR,EAAA,cAACE,EAAK,QAAL,IAAa,EACdF,EAAA,cAACE,EAAK,KAAL,CAAU,KAAMF,EAAA,cAACgC,GAAA,CAAM,KAAM,GAAI,EAAI,QAAS,IAAM3C,EAAM,QAAQE,CAAW,GAAG,eAEjF,CACF,CAEJ,CC5SA,OAAS,6BAAA0C,GAA2B,gBAAAC,OAAmC,gBAyChE,SAASC,GAAoBC,EAA6C,CAC/E,IAAMC,EAAeD,EAAO,aACtBE,EAAS,CAAC,EAEhB,QAAWC,KAAQH,EAAO,QAAU,CAAC,KAAM,cAAc,EACvDE,EAAO,KAAKE,GAAmBH,EAAcE,CAAI,CAAC,EAEpD,OAAOD,CACT,CASA,SAASE,GAAmBH,EAAsBE,EAAkC,CAClF,GAAIA,IAAS,eACX,MAAO,CACL,KAAM,eACN,aAAc,CACZ,CACE,aAAc,kBACd,KAAM,CAAC,UAA0B,EACjC,KAAM,eACN,KAAM,eACN,KAAM,OACN,WAAY,2BACd,CACF,CACF,EAGF,GAAIA,IAAS,iBACX,MAAO,CACL,KAAM,iBACN,aAAc,CACZ,CACE,aAAc,kBACd,KAAM,CAAC,UAA0B,EACjC,KAAM,aACN,KAAM,aACN,KAAM,QACN,WAAY,yBACd,CACF,CACF,EAGF,IAAME,EAAaP,GAAa,MAAMG,CAAY,EAC5CK,EAAwDD,EAAW,WAAWF,CAAI,EAClFI,EAAgDF,EAAW,eAAeF,EAAK,YAAY,CAAC,EAKlG,GAAIG,GAA0BC,EAC5B,MAAO,CAAE,KAAAJ,EAAM,kBAAmBG,EAAwB,aAAc,CAACC,CAAgB,CAAE,EAO7F,GAAID,EAAwB,CAC1B,IAAIE,EACJ,GAAIH,EAAW,aAAc,CAC3B,IAAMI,EAAO,GAAGR,CAAY,IAAIE,EAAK,WAAW,MAAO,EAAE,CAAC,GAC1DK,EAAe,OAAO,OAAOH,EAAW,YAAY,EAAE,OAAQK,GAAMA,EAAE,YAAY,SAASD,CAAI,CAAC,EAC5FD,EAAa,SAAW,IAC1BA,EAAe,OAEnB,CACA,MAAO,CAAE,KAAAL,EAAM,kBAAmBG,EAAwB,aAAAE,CAAa,CACzE,CAQA,GAAID,EAAkB,CACpB,IAAMI,EAAUd,GAA0BI,EAAcM,CAAgB,EACxE,MAAO,CAAE,KAAAJ,EAAM,kBAAmBQ,EAAQ,qBAAqB,CAAC,EAAG,aAAc,CAACJ,CAAgB,CAAE,CACtG,CAKA,MAAO,CAAE,KAAAJ,CAAK,CAChB,CTxFO,IAAMS,GAAN,cAAgC,KAAM,CAG3C,YAAYC,EAA2B,CACrC,MAAM,QAAQ,EACd,KAAK,WAAaA,CACpB,CACF,EAEaC,GAAN,cAA8B,KAAM,CAGzC,YAAYC,EAAkB,CAC5B,MAAM,MAAM,EACZ,KAAK,SAAWA,CAClB,CACF,EAEaC,GAAN,cAA+B,KAAM,CAI1C,YAAYC,EAAoBC,EAAgC,CAC9D,MAAM,OAAO,EACb,KAAK,SAAWD,EAChB,KAAK,aAAeC,CACtB,CACF,EAgCMC,GAAYC,GAAcC,IAAW,CACzC,KAAM,CACJ,SAAU,OACV,SAAU,OACV,UAAW,OACX,aAAc,MAChB,EAEA,MAAO,CACL,OAAQ,SACV,EAEA,GAAI,CACF,UAAW,CACT,gBAAiBA,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,CAC5F,CACF,EAEA,GAAI,CACF,QAAS,cACX,EAEA,QAAS,CACP,MAAO,OACP,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAEhD,UAAW,CACT,gBAAiBA,EAAM,cAAgB,OAASA,EAAM,OAAO,KAAK,CAAC,EAAIA,EAAM,OAAO,KAAK,CAAC,CAC5F,CACF,EAEA,KAAM,CACJ,MAAO,GACP,OAAQ,GACR,aAAc,EAChB,CACF,EAAE,EASK,SAASC,GAAcC,EAAwC,CACpE,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxBM,EAAUC,EAAW,EACrB,CAACC,EAAcC,CAAe,EAAIC,GAAkB,EAAK,EACzD,CAACC,EAASC,CAAU,EAAIF,GAAuC,EAC/D,CAAE,OAAAG,EAAQ,OAAAC,CAAO,EAAIV,EAErB,CAACW,EAAOC,CAAQ,EAAIN,GAA6B,CACrD,SAAU,CAAC,EACX,mBAAoB,GACpB,oBAAqB,GACrB,oBAAqB,GACrB,oBAAqB,EACvB,CAAC,EAEKO,EAAWC,GAA2BH,CAAK,EACjDE,EAAS,QAAUF,EAEnB,IAAMI,EAAYN,EAAO,OAAS,WAE5BO,EAAcC,GACjBC,GAA0B,CACzBV,EAAW,MAAS,EAEpBN,EACG,OACCO,EAAO,aACPU,GAAkB,CAAE,GAAGV,EAAQ,MAAOM,EAAW,OAAQ,MAAU,CAAC,EACpEG,CACF,EACC,KAAM1B,GAAa,CAClBoB,EAAS,CAAE,GAAGC,EAAS,QAAS,eAAgBrB,CAAS,CAAC,EACtDkB,GACFA,EAAO,IAAInB,GAAgBC,CAAQ,CAAC,CAExC,CAAC,EACA,MAAO4B,GAAW,CACjBR,EAAS,CAAE,GAAGC,EAAS,QAAS,eAAgB,MAAU,CAAC,EAC3DL,EAAWY,CAAM,CACnB,CAAC,CACL,EACA,CAAClB,EAASO,EAAQM,EAAWL,CAAM,CACrC,EAEMW,EAAiBJ,GAAY,IAAM,CACvCL,EAAS,CAAE,GAAGC,EAAS,QAAS,eAAgB,MAAU,CAAC,EAC3DG,EAAY,CAAE,MAAO,QAAS,CAAC,CACjC,EAAG,CAACA,CAAW,CAAC,EAEhBM,GAAU,IAAM,CACdN,EAAY,CACd,EAAG,CAACA,CAAW,CAAC,EAEhB,SAASO,EAA0BC,EAAsBC,EAAkB,CACzED,EAAE,gBAAgB,EAGlB,IAAME,GADKF,EAAE,OACM,QACbG,GAAc,CAAE,GAAGd,EAAS,QAAQ,QAAS,EAC/Ca,GACFC,GAAYF,CAAE,EAAI,GAElB,OAAOE,GAAYF,CAAE,EAEvBb,EAAS,CAAE,GAAGC,EAAS,QAAS,SAAUc,EAAY,CAAC,CACzD,CAEA,SAASC,EAAuBJ,EAA4B,CAC1DA,EAAE,gBAAgB,EAGlB,IAAME,EADKF,EAAE,OACM,QACbG,GAAc,CAAC,EACfE,GAAiBhB,EAAS,QAAQ,eACpCa,GAAWG,IAAgB,OAC7BA,GAAe,MAAM,QAASC,IAAU,CAClCA,GAAM,UAAU,KAClBH,GAAYG,GAAM,SAAS,EAAE,EAAI,GAErC,CAAC,EAEHlB,EAAS,CAAE,GAAGC,EAAS,QAAS,SAAUc,EAAY,CAAC,CACzD,CAEA,SAASI,GAAyB,CAChC,IAAMpB,EAAQE,EAAS,QACvB,GAAI,CAACF,EAAM,gBAAgB,OAASA,EAAM,eAAe,MAAM,SAAW,EACxE,MAAO,GAET,QAAWa,KAAKb,EAAM,eAAe,MACnC,GAAIa,EAAE,UAAU,IAAM,CAACb,EAAM,SAASa,EAAE,SAAS,EAAE,EACjD,MAAO,GAGX,MAAO,EACT,CAMA,SAASQ,EAAiBC,EAAgC,CACpDjC,EAAM,UACRA,EAAM,SAAS,IAAIX,GAAkB4C,CAAS,CAAC,CAEnD,CAOA,SAASC,EAAeV,EAAqB9B,EAA0B,CAMrE,GALIyC,GAAeX,EAAE,MAAiB,GAKlCA,EAAE,SAAW,EAEf,OAGFY,EAAUZ,CAAC,EAEX,IAAMa,EAAQb,EAAE,SAAW,GAAKA,EAAE,SAAWA,EAAE,QAE3C,CAACa,GAASrC,EAAM,SAClBA,EAAM,QAAQ,IAAIP,GAAiBC,EAAU8B,CAAC,CAAC,EAG7Ca,GAASrC,EAAM,YACjBA,EAAM,WAAW,IAAIP,GAAiBC,EAAU8B,CAAC,CAAC,CAEtD,CAEA,SAASc,GAA0B,CACjC,MAAO,CAAC,EAAEtC,EAAM,UAAYA,EAAM,aAAeA,EAAM,0BACzD,CAWA,GATAsB,GAAU,IAAM,CACdjB,EAAgB,EAAK,EACrBH,EACG,cAAcF,EAAM,OAAO,YAA4B,EACvD,KAAK,IAAMK,EAAgB,EAAI,CAAC,EAChC,MAAM,QAAQ,GAAG,CACtB,EAAG,CAACH,EAASF,EAAM,OAAO,YAAY,CAAC,EAGnC,EADeI,GAAgBmC,GAAa,MAAMvC,EAAM,OAAO,YAAY,GAE7E,OACEwC,EAAA,cAACC,GAAA,CAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,GAC7CD,EAAA,cAACE,GAAA,IAAO,CACV,EAIJ,IAAMC,GAAiB3C,EAAM,kBACvB4C,GAASC,GAAoBpC,CAAM,EACnCqC,GAAerC,EAAO,aACtBsC,EAAapC,EAAM,eAEnBqC,EADUD,GAAY,OACD,IAAKvB,GAAMA,EAAE,QAAQ,EAE1CyB,EAAgB,SAChBC,GAAc,OACdC,GAAW,GACXC,GAAW,OAAO,WAAa,IAErC,OACEZ,EAAA,cAAC,OAAI,UAAWvC,EAAQ,KAAM,cAAY,kBACvC,CAACD,EAAM,aACNwC,EAAA,cAACa,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBb,EAAA,cAACa,GAAA,CAAM,QAAS,GACdb,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACe,GAAA,CAAY,KAAMJ,GAAU,EACvC,QAAS,IAAMvC,EAAS,CAAE,GAAGC,EAAS,QAAS,mBAAoB,EAAK,CAAC,GAC1E,QAED,EACA2B,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACgB,GAAA,CAAW,KAAML,GAAU,EACtC,QAAS,IAAMvC,EAAS,CAAE,GAAGC,EAAS,QAAS,oBAAqB,EAAK,CAAC,GAC3E,SAED,EACCb,EAAM,OACLwC,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACiB,GAAA,CAAa,KAAMN,GAAU,EACxC,QAASnD,EAAM,OAChB,QAED,EAED,CAACoD,IAAYd,EAAe,GAC3BE,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACkB,GAAA,CAAgB,KAAMP,GAAU,EAC3C,QACEnD,EAAM,SAAWA,EAAM,SAAW,IAAMY,EAAS,CAAE,GAAGC,EAAS,QAAS,oBAAqB,EAAK,CAAC,GAEtG,WAED,EAED,CAACuC,IAAYpD,EAAM,UAClBwC,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACmB,GAAA,CAAU,KAAMR,GAAU,EACrC,QAAS,IAAOnD,EAAM,SAAoC,OAAO,KAAKW,EAAM,QAAQ,CAAC,GACtF,WAED,EAED,CAACyC,IAAYpD,EAAM,QAClBwC,EAAA,cAACc,GAAA,CACC,QAAO,GACP,QAASL,EACT,MAAOC,GACP,SAAUV,EAAA,cAACoB,GAAA,CAAgB,KAAMT,GAAU,EAC3C,QAAS,IAAOnD,EAAM,OAAkC,OAAO,KAAKW,EAAM,QAAQ,CAAC,GACpF,SAED,CAEJ,EACA6B,EAAA,cAACa,GAAA,CAAM,QAAS,GACbN,GACCP,EAAA,cAACqB,GAAA,CAAK,KAAK,KAAK,MAAM,UACnBC,GAASrD,EAAQsC,EAAW,KAAe,EAAE,IAAEgB,GAAOtD,EAAQsC,EAAW,KAAe,EAAE,MAAI,IAC9F,GAAGhC,IAAc,WAAa,IAAM,EAAE,GAAGgC,EAAW,OAAO,eAAe,CAAC,EAC9E,EAEFP,EAAA,cAACwB,GAAA,CAAW,MAAM,UAAU,QAAS3C,GACnCmB,EAAA,cAACyB,GAAA,CAAY,KAAK,WAAW,CAC/B,CACF,CACF,EAEFzB,EAAA,cAAC0B,GAAA,CAAM,UAAWjE,EAAQ,OACxBuC,EAAA,cAAC,aACCA,EAAA,cAAC,UACEG,IACCH,EAAA,cAAC,UACCA,EAAA,cAAC,SACC,KAAK,WACL,MAAM,UACN,aAAW,eACX,cAAY,eACZ,QAAST,EAAc,EACvB,SAAWP,GAAMI,EAAuBJ,CAAC,EAC3C,CACF,EAEDoB,GAAO,IAAKuB,GACX3B,EAAA,cAAC,MAAG,IAAK2B,EAAM,MACb3B,EAAA,cAAC4B,GAAA,CAAK,OAAO,KAAK,MAAO,IAAK,SAAS,cACrC5B,EAAA,cAAC4B,GAAK,OAAL,KACC5B,EAAA,cAAC6B,GAAA,CAAe,UAAWpE,EAAQ,SACjCuC,EAAA,cAACa,GAAA,CAAM,SAAS,QAAQ,OAAM,IAC5Bb,EAAA,cAACqB,GAAA,CAAK,OAAQ,IAAK,KAAK,MACrBS,GAAqBH,EAAM,IAAI,CAClC,EACA3B,EAAA,cAACC,GAAA,CAAO,UAAWxC,EAAQ,MACzBuC,EAAA,cAAC+B,GAAA,CAA0B,KAAM,GAAI,OAAQ,IAAK,CACpD,CACF,CACF,CACF,EACA/B,EAAA,cAACgC,GAAA,CACC,OAAQxE,EAAM,OACd,aAAcmE,EAAM,aACpB,SAAU,CAACM,EAAaC,IAAW,CACjC9D,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,GACrB,wBAAyB4D,EACzB,mBAAoBC,CACtB,CAAC,CACH,EACA,SAAWC,GAAW,CACpB3C,EAAiB2C,CAAM,CACzB,EACF,CACF,CACF,CACD,CACH,EACC,CAAC3E,EAAM,aACNwC,EAAA,cAAC,UACEG,IAAkBH,EAAA,cAAC,SAAG,EACtBI,GAAO,IAAKuB,GACX3B,EAAA,cAAC,MAAG,IAAK2B,EAAM,MACZA,EAAM,cACL3B,EAAA,cAACoC,GAAA,CACC,aAAc9B,GACd,aAAcqB,EAAM,aACpB,QAASnE,EAAM,OAAO,QACxB,CAEJ,CACD,CACH,CAEJ,EACAwC,EAAA,cAAC,aACEQ,GAAW,IACTtD,GACCA,GACE8C,EAAA,cAAC,MACC,IAAK9C,EAAS,GACd,UAAWO,EAAQ,GACnB,cAAY,qBACZ,QAAUuB,GAAMU,EAAeV,EAAG9B,CAAQ,EAC1C,WAAa8B,GAAMU,EAAeV,EAAG9B,CAAQ,GAE5CiD,IACCH,EAAA,cAAC,UACCA,EAAA,cAAC,SACC,KAAK,WACL,MAAM,UACN,cAAY,eACZ,aAAY,gBAAgB9C,EAAS,EAAE,GACvC,QAAS,CAAC,CAACiB,EAAM,SAASjB,EAAS,EAAY,EAC/C,SAAW8B,GAAMD,EAA0BC,EAAG9B,EAAS,EAAY,EACrE,CACF,EAEDkD,GAAO,IAAKuB,GACX3B,EAAA,cAAC,MAAG,IAAK2B,EAAM,MAAOU,GAAYnF,EAAUyE,CAAK,CAAE,CACpD,CACH,CAEN,CACF,CACF,EACCnB,GAAW,SAAW,GACrBR,EAAA,cAACsC,GAAA,KACCtC,EAAA,cAACC,GAAA,CAAO,MAAO,CAAE,OAAQ,GAAI,GAC3BD,EAAA,cAACqB,GAAA,CAAK,KAAK,KAAK,MAAM,UAAS,YAE/B,CACF,CACF,EAEDd,GAAY,QAAU,QAAaA,EAAW,MAAQ,GACrDP,EAAA,cAACC,GAAA,CAAO,EAAE,KAAK,EAAE,MACfD,EAAA,cAACuC,GAAA,CACC,MAAOC,GAAQvE,CAAM,EACrB,MAAOwE,GAAcxE,EAAQsC,EAAW,KAAK,EAC7C,SAAWmC,GAAYlD,EAAiBmD,GAAQ1E,EAAQyE,CAAO,CAAC,EAChE,gBAAkBE,GAAY,CAC5B,OAAQA,EAAS,CACf,IAAK,WACH,MAAO,CAAE,aAAc,eAAgB,EACzC,IAAK,OACH,MAAO,CAAE,aAAc,WAAY,EACrC,QACE,MAAO,CAAC,CACZ,CACF,EACF,CACF,EAED7E,GACCiC,EAAA,cAAC,OAAI,cAAY,gBACfA,EAAA,cAAC,OAAI,MAAO,CAAE,UAAW,MAAO,GAAI,KAAK,UAAUjC,EAAS,OAAW,CAAC,CAAE,CAC5E,EAEFiC,EAAA,cAAC6C,GAAA,CACC,OAAQrF,EAAM,OACd,QAASa,EAAS,QAAQ,mBAC1B,KAAO8D,GAAW,CAChB3C,EAAiB2C,CAAM,EACvB/D,EAAS,CACP,GAAGC,EAAS,QACZ,mBAAoB,EACtB,CAAC,CACH,EACA,SAAU,IAAM,CACdD,EAAS,CACP,GAAGC,EAAS,QACZ,mBAAoB,EACtB,CAAC,CACH,EACF,EACA2B,EAAA,cAAC8C,GAAA,CACC,OAAQtF,EAAM,OACd,QAASa,EAAS,QAAQ,oBAC1B,KAAO8D,GAAW,CAChB3C,EAAiB2C,CAAM,EACvB/D,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,EACvB,CAAC,CACH,EACA,SAAU,IAAM,CACdD,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,EACvB,CAAC,CACH,EACF,EACA2B,EAAA,cAAC+C,GAAA,CACC,QAAS1E,EAAS,QAAQ,oBAC1B,UAAWb,EAAM,YACjB,wBAAyBA,EAAM,0BAC/B,SAAU,IAAM,CACdY,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,EACvB,CAAC,CACH,EACF,EACA2B,EAAA,cAACgD,GAAA,CACC,IAAK7E,EAAM,yBAAyB,KACpC,QAASE,EAAS,QAAQ,oBAC1B,MAAOF,EAAM,yBAAyB,KAAO2D,GAAqB3D,EAAM,wBAAwB,IAAI,EAAI,GACxG,aAAcmC,GACd,YAAanC,EAAM,wBACnB,OAAQA,EAAM,mBACd,aAAa,GACb,KAAO+D,GAAW,CAChB1C,EAAiByD,GAAUzF,EAAM,OAAQ0E,EAAO,KAAMA,EAAO,SAAUA,EAAO,KAAK,CAAC,EACpF9D,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,EACvB,CAAC,CACH,EACA,SAAU,IAAM,CACdD,EAAS,CACP,GAAGC,EAAS,QACZ,oBAAqB,EACvB,CAAC,CACH,EACF,CACF,CAEJ,CAEO,IAAM6E,GAAwBlD,EAAM,KAAKzC,EAAa,EAQ7D,SAAS6E,GAAkB5E,EAA4C,CACrE,IAAM2F,GAAW3F,EAAM,SAAW,CAAC,GAAG,OAAQ4F,GAAM5F,EAAM,aAAa,KAAM6F,GAAMA,EAAE,OAASD,EAAE,IAAI,CAAC,EACrG,OAAID,EAAQ,SAAW,EACdnD,EAAA,cAAC,YAAK,YAAU,EAIvBA,EAAA,cAAAA,EAAA,cACGmD,EAAQ,IAAKjB,GACZlC,EAAA,cAAC,OAAI,IAAK,UAAUkC,EAAO,IAAI,IAAIA,EAAO,QAAQ,IAAIA,EAAO,KAAK,IAC/DoB,GAAYpB,EAAO,QAAQ,EAAE,OAE9BlC,EAAA,cAACuD,GAAA,CAAyB,aAAc/F,EAAM,aAAc,OAAQ0E,EAAQ,CAC9E,CACD,CACH,CAEJ,CAEA,SAASM,GAAQvE,EAA+B,CAC9C,OAAO,KAAK,OAAOA,EAAO,QAAU,IAAMA,EAAO,OAASuF,GAAqB,EAAI,CACrF,CAEA,SAASf,GAAcxE,EAAuBwF,EAAuB,CACnE,IAAMC,EAAWzF,EAAO,OAASuF,GACjC,OAAO,KAAK,KAAKC,EAAQC,CAAQ,CACnC,CAEA,SAASpC,GAASrD,EAAuBwF,EAAuB,CAC9D,OAAO,KAAK,IAAIA,GAAQxF,EAAO,QAAU,GAAK,CAAC,CACjD,CAEA,SAASsD,GAAOtD,EAAuBwF,EAAuB,CAC5D,OAAO,KAAK,IAAIA,IAASxF,EAAO,QAAU,GAAK,IAAMA,EAAO,OAASuF,GAAqB,CAC5F,CFhmBO,SAASG,GAAcC,EAAwC,CACpE,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAAQC,CAAS,EAAIC,GAAiD,EACvE,CAACC,EAASC,CAAU,EAAIF,GAAuC,EAC/D,CAAE,MAAAG,EAAO,OAAAC,CAAO,EAAIT,EACpB,CAACU,EAAUC,CAAW,EAAIN,GAA0C,EACpE,CAACO,EAAUC,CAAW,EAAIR,GAAoC,CAAC,CAAC,EAEhES,EAAcC,GAA4B,EAChDD,EAAY,QAAUJ,EAEtB,IAAMM,EAAcD,GAAkC,CAAC,CAAC,EACxDC,EAAY,QAAUJ,EAEtBK,GAAU,IAAM,CACdV,EAAW,MAAS,EACpBN,EACG,QAAQO,CAAK,EACb,KAAKG,CAAW,EAChB,MAAOO,GAAQX,EAAWY,GAA0BD,CAAG,CAAC,CAAC,CAC9D,EAAG,CAACjB,EAASO,CAAK,CAAC,EAEnB,SAASY,EAA0BC,EAAsBC,EAAkB,CACzED,EAAE,gBAAgB,EAGlB,IAAME,GADKF,EAAE,OACM,QACbG,GAAc,CAAE,GAAGR,EAAY,OAAQ,EACzCO,GACFC,GAAYF,CAAE,EAAI,GAElB,OAAOE,GAAYF,CAAE,EAEvBT,EAAYW,EAAW,CACzB,CAEA,SAASC,EAAuBJ,EAA4B,CAC1DA,EAAE,gBAAgB,EAGlB,IAAME,GADKF,EAAE,OACM,QACbG,GAAc,CAAC,EACfE,GAAYZ,EAAY,SAAS,KAAK,aACxCS,IAAWG,IACbA,GAAU,QAASC,GAAa,CAC1BA,EAAS,KACXH,GAAYG,EAAS,EAAE,EAAI,GAE/B,CAAC,EAEHd,EAAYW,EAAW,CACzB,CAEA,SAASI,GAAyB,CAChC,IAAMF,EAAYZ,EAAY,SAAS,KAAK,aAC5C,GAAI,CAACY,GAAaA,EAAU,SAAW,EACrC,MAAO,GAET,QAAWC,KAAYD,EACrB,GAAIC,EAAS,IAAM,CAACX,EAAY,QAAQW,EAAS,EAAE,EACjD,MAAO,GAGX,MAAO,EACT,CAEA,SAASE,EAAeR,EAAqBM,EAA0B,CACjEG,GAAeT,EAAE,MAAiB,IAKtCU,EAAUV,CAAC,EAEPA,EAAE,SAAW,GAAKrB,EAAM,SAC1BA,EAAM,QAAQ,IAAIgC,GAAiBL,EAAUN,CAAC,CAAC,EAG7CA,EAAE,SAAW,GAAKrB,EAAM,YAC1BA,EAAM,WAAW,IAAIgC,GAAiBL,EAAUN,CAAC,CAAC,EAEtD,CAcA,GAZAJ,GAAU,IAAM,CACdhB,EACG,cAAcD,EAAM,YAAY,EAChC,KAAMiC,GAAc,CAGnB7B,EAAU,CAAE,GAAG6B,CAAU,CAAC,CAC5B,CAAC,EACA,MAAM,QAAQ,GAAG,CACtB,EAAG,CAAChC,EAASD,EAAM,YAAY,CAAC,EAG5B,CADeG,GAAQ,MAAMH,EAAM,YAAY,EAEjD,OAAOkC,GAAA,cAACC,GAAA,IAAO,EAGjB,IAAMC,EAAiBpC,EAAM,kBAE7B,OACEkC,GAAA,cAAC,OAAI,cAAgBb,GAAMU,EAAUV,CAAC,EAAG,cAAY,kBACnDa,GAAA,cAACG,GAAA,KACCH,GAAA,cAAC,aACCA,GAAA,cAAC,UACEE,GACCF,GAAA,cAAC,UACCA,GAAA,cAAC,SACC,KAAK,WACL,MAAM,UACN,aAAW,eACX,cAAY,eACZ,QAASN,EAAc,EACvB,SAAWP,GAAMI,EAAuBJ,CAAC,EAC3C,CACF,EAEDZ,EAAO,IAAK6B,GACXJ,GAAA,cAAC,MAAG,IAAKI,EAAM,MAAOA,EAAM,IAAK,CAClC,CACH,CACF,EACAJ,GAAA,cAAC,aACExB,GAAU,KAAK,aAAa,IAC1BiB,GACCA,GACEO,GAAA,cAAC,MACC,IAAKP,EAAS,GACd,cAAY,qBACZ,QAAUN,GAAMQ,EAAeR,EAAGM,CAAQ,EAC1C,WAAaN,GAAMQ,EAAeR,EAAGM,CAAQ,GAE5CS,GACCF,GAAA,cAAC,UACCA,GAAA,cAAC,SACC,KAAK,WACL,MAAM,UACN,cAAY,eACZ,aAAY,gBAAgBP,EAAS,EAAE,GACvC,QAAS,CAAC,CAACf,EAASe,EAAS,EAAY,EACzC,SAAWN,GAAMD,EAA0BC,EAAGM,EAAS,EAAY,EACrE,CACF,EAEDlB,EAAO,IAAK6B,GAETJ,GAAA,cAAC,MAAG,IAAKI,EAAM,MACbJ,GAAA,cAACK,GAAA,CAAgB,aAAcD,EAAM,aAAc,KAAMA,EAAM,SAAU,SAAUX,EAAU,CAC/F,CAEH,CACH,CAEN,CACF,CACF,EACCjB,GAAU,KAAK,aAAa,SAAW,GAAKwB,GAAA,cAAC,OAAI,cAAY,gBAAe,YAAU,EACtF5B,GACC4B,GAAA,cAAC,OAAI,cAAY,gBACfA,GAAA,cAAC,OAAI,MAAO,CAAE,UAAW,MAAO,GAAI,KAAK,UAAU5B,EAAS,OAAW,CAAC,CAAE,CAC5E,EAEDN,EAAM,QACLkC,GAAA,cAACM,GAAA,CAAO,QAAS,IAAOxC,EAAM,OAAkC,OAAO,KAAKgB,EAAY,OAAO,CAAC,GAAG,SAEnG,CAEJ,CAEJ,CAEO,IAAMyB,GAAwBP,GAAM,KAAKnC,EAAa,EYhN7D,OAAO2C,OAAW,QAOX,SAASC,GAAKC,EAA+B,CAClD,OACEF,GAAA,cAAC,OAAI,MAAM,6BAA6B,QAAQ,cAAc,MAAO,CAAE,MAAOE,EAAM,KAAM,OAAQA,EAAM,IAAK,GAC3GF,GAAA,cAAC,aAAM,cAAY,EACnBA,GAAA,cAAC,QAAK,KAAME,EAAM,MAAQ,UAAW,EAAE,iEAAiE,EACxGF,GAAA,cAAC,QACC,KAAME,EAAM,MAAQ,UACpB,EAAE,mJACJ,EACAF,GAAA,cAAC,QACC,KAAME,EAAM,MAAQ,UACpB,EAAE,6FACJ,EACAF,GAAA,cAAC,QACC,KAAME,EAAM,MAAQ,UACpB,EAAE,0EACJ,EACAF,GAAA,cAAC,QAAK,KAAME,EAAM,MAAQ,UAAW,EAAE,2DAA2D,CACpG,CAEJ,CC3BA,OAAS,SAAAC,OAAa,gBAGtB,OAAOC,OAAW,QAOX,SAASC,GAAsBC,EAAuD,CAC3F,IAAMC,EAASD,EAAM,SAAS,OAASA,EAAM,OAC7C,MAAI,CAACC,GAAUA,EAAO,SAAW,EACxB,KAGPH,GAAA,cAACI,GAAA,CAAM,KAAMJ,GAAA,cAACK,GAAA,CAAgB,KAAM,GAAI,EAAI,MAAM,OAC/CF,EAAO,IAAKG,GACXN,GAAA,cAAC,OAAI,cAAY,mBAAmB,IAAKM,EAAM,SAAS,MACrDA,EAAM,SAAS,IAClB,CACD,CACH,CAEJ,CCxBA,OAAS,mBAAAC,OAAuD,gBAEhE,OAAOC,IAAS,eAAAC,OAAmB,QAO5B,SAASC,GAAgBC,EAA0C,CACxE,IAAMC,EAAwBC,GAAY,CAACC,EAAwBC,EAA4BC,IAAe,CAC5G,IAAMC,EAAM,GAAGF,CAAY,IAAIC,CAAE,GAC3BE,EAAS,IACf,OAAO,QAAQ,WAAW,CACxBJ,EAAQ,YAAY,UAAWE,CAAE,EACjCF,EAAQ,OAAO,gBAAiB,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EACxDJ,EAAQ,OAAO,SAAU,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EACjDJ,EAAQ,OAAO,gBAAiB,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EACxDJ,EAAQ,OAAO,mBAAoB,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EAC3DJ,EAAQ,OAAO,QAAS,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EAChDJ,EAAQ,OAAO,iBAAkB,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EACzDJ,EAAQ,OAAO,OAAQ,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,CACjD,CAAC,CACH,EAAG,CAAC,CAAC,EAEL,OACEC,GAAA,cAACC,GAAA,CACC,MAAOT,EAAM,QACb,sBAAuBC,EACvB,oBAAqB,CAACS,EAAmBC,EAAyBC,KAAkB,CAClF,aAAc,gBACd,OAAQ,YACR,QAASC,GAAgBH,CAAQ,EACjC,OAAQG,GAAgBF,CAAM,EAC9B,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,QAAS,CAAC,CAAE,cAAeC,CAAK,CAAC,CACnC,GACA,YAAa,CAACF,EAAmBI,EAA2BC,KAAyB,CACnF,aAAc,QACd,OAAQ,YACR,QAASF,GAAgBH,CAAQ,EACjC,SAAUG,GAAgBC,CAAQ,EAClC,OAAQ,IAAI,KAAK,EAAE,YAAY,EAC/B,QAAAC,CACF,GACF,CAEJ,CC/CA,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,gBAAAC,GAAc,gBAAAC,GAAc,SAAAC,GAAO,aAAAC,OAAiB,gBAC7E,OAAS,sBAAAC,OAAoE,gBAE7E,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAYnD,IAAMC,GAAYC,GAAcC,IAAW,CACzC,QAAS,CACP,SAAU,WACV,OAAQ,gBACR,QAAS,oBACT,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,aAAcA,EAAM,OAAO,GAC3B,WAAY,UACd,EAEA,SAAU,CACR,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,EAC7C,EAEA,QAAS,CACP,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,WAAY,aAAaA,EAAM,OAAO,KAAK,CAAC,CAAC,EAC/C,EAEA,cAAe,CACb,SAAU,WACV,MAAO,EACP,OAAQ,EACR,SAAUA,EAAM,UAAU,GAE1B,MAAO,CACL,WAAY,CACd,CACF,CACF,EAAE,EAOK,SAASC,GAAsBC,EAAuD,CAC3F,IAAMC,EAAUC,EAAW,EACrBC,EAAeC,EAAYJ,EAAM,KAAK,EACtC,CAACK,EAAQC,CAAS,EAAIC,GAAiD,MAAS,EAChF,CAACC,EAAaC,CAAc,EAAIF,GAAiB,EACjD,CAACG,EAAUC,CAAW,EAAIJ,GAAiB,EAC3C,CAACK,EAAOC,CAAQ,EAAIN,GAAyB,EAEnD,SAASO,GAAgC,CACvCH,EAAY,MAAS,CACvB,CAEA,SAASI,GAA4B,CACnCN,EAAe,MAAS,CAC1B,CAEA,IAAMO,EAAWC,GAAuB,EAiBxC,GAhBAD,EAAS,QAAUJ,EAEnBM,GAAU,IAAM,CACdjB,EAAQ,cAAc,gBAAgB,EAAE,KAAKK,CAAS,EAAE,MAAM,QAAQ,GAAG,CAC3E,EAAG,CAACL,CAAO,CAAC,EAEZiB,GAAU,KACRL,EAASM,GAAyBhB,GAAgB,CAAE,aAAc,gBAAiB,CAAC,CAAC,EACrF,SAAS,iBAAiB,YAAaW,CAAuB,EAC9D,SAAS,iBAAiB,QAASC,CAAmB,EAC/C,IAAM,CACX,SAAS,oBAAoB,YAAaD,CAAuB,EACjE,SAAS,oBAAoB,QAASC,CAAmB,CAC3D,GACC,CAACZ,CAAY,CAAC,EAEb,CAACE,GAAU,CAACO,EACd,OAAO,KAGT,SAASQ,EAAeC,EAAkBC,EAAqB,CAC7DT,EAAS,CACP,GAAGG,EAAS,QACZ,CAACK,CAAQ,EAAGC,CACd,CAAmB,CACrB,CAEA,OACEC,EAAA,cAAC,WACCA,EAAA,cAACC,EAAA,CAAK,OAAO,qBAAqB,SAAU,IAAMxB,EAAM,SAASY,CAAK,GACpEW,EAAA,cAACE,GAAA,CACC,MAAM,aACN,aAAcb,EAAM,MACpB,SAAWc,GAAMN,EAAe,QAASM,EAAE,cAAc,KAAK,EAChE,EACAH,EAAA,cAACI,GAAA,CACC,QAASf,EAAM,QAAU,CAAC,EAC1B,YAAaJ,EACb,eAAgBC,EAChB,SAAUC,EACV,YAAaC,EACb,SAAWiB,GAAMR,EAAe,SAAUQ,CAAC,EAC7C,EACAL,EAAA,cAACM,GAAA,CAAO,KAAK,UAAS,MAAI,CAC5B,CACF,CAEJ,CAWA,SAASF,GAAmB3B,EAA6C,CACvE,GAAM,CAAE,QAAA8B,CAAQ,EAAIlC,GAAU,EACxBmC,EAAad,GAA+B,EAClDc,EAAW,QAAU/B,EAAM,QAE3B,SAASgC,EAAaC,EAA2C,CAC/DjC,EAAM,SACH+B,EAAW,QAA6B,IAAKG,GAAOA,EAAE,KAAOD,EAAc,GAAKA,EAAgBC,CAAE,CACrG,CACF,CAEA,SAASC,EAAUC,EAAyC,CAC1DpC,EAAM,SAAS,CAAC,GAAI+B,EAAW,QAA8BK,CAAW,CAAC,EACzEpC,EAAM,eAAeoC,EAAY,EAAE,CACrC,CAEA,SAASC,EAAaC,EAA2C,CAC/DtC,EAAM,SAAU+B,EAAW,QAA6B,OAAQG,GAAMA,IAAMI,CAAa,CAAC,CAC5F,CAEA,OACEf,EAAA,cAAC,OAAI,UAAWO,EAAQ,SACrB9B,EAAM,QAAQ,IAAKuC,GAClBhB,EAAA,cAAC,OAAI,IAAKgB,EAAO,IACfhB,EAAA,cAACiB,GAAA,CACC,OAAQD,EACR,YAAavC,EAAM,YACnB,eAAgBA,EAAM,eACtB,SAAUA,EAAM,SAChB,YAAaA,EAAM,YACnB,SAAUgC,EACV,SAAU,IAAMK,EAAaE,CAAM,EACrC,CACF,CACD,EACDhB,EAAA,cAAC,OAAI,UAAWO,EAAQ,eACtBP,EAAA,cAACkB,GAAA,CACC,KAAK,IACL,QAAUf,GAAwB,CAChCgB,EAAUhB,CAAC,EACXS,EAAU,CAAE,GAAIQ,GAAW,CAAE,CAAC,CAChC,GACD,YAED,CACF,CACF,CAEJ,CAYA,SAASH,GAAcxC,EAAwC,CAC7D,GAAM,CAAE,QAAA8B,EAAS,GAAAc,CAAG,EAAIhD,GAAU,EAC5B,CAAE,OAAA2C,CAAO,EAAIvC,EACb6C,EAAaC,GAAqBP,CAAM,EACxCQ,EAAU/C,EAAM,cAAgBA,EAAM,OAAO,GAC7CgD,EAAWhD,EAAM,WAAaA,EAAM,OAAO,GAEjD,SAASiD,EAAQvB,EAA+B,CAC9CA,EAAE,gBAAgB,EAClB1B,EAAM,eAAeA,EAAM,OAAO,EAAE,CACtC,CAEA,SAASkD,EAAQxB,EAA+B,CAC9CgB,EAAUhB,CAAC,EACX1B,EAAM,YAAYA,EAAM,OAAO,EAAE,CACnC,CAEA,IAAMmD,EAAYP,EAAGd,EAAQ,QAAS,CACpC,CAACA,EAAQ,OAAO,EAAGiB,EACnB,CAACjB,EAAQ,QAAQ,EAAGkB,GAAY,CAACD,CACnC,CAAC,EAED,OACExB,EAAA,cAAC,OAAI,cAAagB,EAAO,GAAI,UAAWY,EAAW,QAASF,EAAS,YAAaC,GAC/EH,EACCxB,EAAA,cAAC6B,GAAA,CACC,OAAQb,EACR,WAAYM,EACZ,SAAU7C,EAAM,SAChB,YAAaA,EAAM,YACnB,eAAgBA,EAAM,eACtB,SAAUA,EAAM,SAChB,YAAaA,EAAM,YACnB,SAAUA,EAAM,SAClB,EAEAuB,EAAA,cAAC8B,GAAA,CAAc,OAAQd,EAAQ,WAAYM,EAAY,EAEzDtB,EAAA,cAAC,OAAI,UAAWO,EAAQ,eACtBP,EAAA,cAACkB,GAAA,CACC,KAAK,IACL,QAAUf,GAAwB,CAChCA,EAAE,eAAe,EACjB1B,EAAM,SAAS,CACjB,GACD,QAED,CACF,CACF,CAEJ,CAEA,IAAMsD,GAAoC,CACxC,KAAM,kCACN,IAAK,EACL,IAAK,IACL,KAAM,CAAC,CAAE,KAAM,UAAW,EAAG,CAAE,KAAM,QAAS,EAAG,CAAE,KAAM,OAAQ,EAAG,CAAE,KAAM,QAAS,CAAC,CACxF,EAOA,SAASD,GAAcrD,EAAwC,CAC7D,GAAM,CAAE,OAAAuC,EAAQ,WAAAM,CAAW,EAAI7C,EACzB,CAACuD,EAAeC,CAAY,EAAIC,GAAgBlB,CAAM,EAC5D,OACEhB,EAAA,cAAC,WACCA,EAAA,cAAC,WACEgB,EAAO,OAAS,WAAW,IAAEM,GAAc,IAAIA,CAAU,GAC5D,EACCN,EAAO,qBACNhB,EAAA,cAAC,WACCA,EAAA,cAACmC,GAAA,CAAiB,MAAO,CAAE,UAAWnB,EAAO,mBAAoB,EAAG,CACtE,EAEDgB,GACChC,EAAA,cAAC,WACCA,EAAA,cAACoC,GAAA,CAAwB,SAAUL,GAAgB,aAAcE,EAAc,MAAOD,EAAe,CACvG,CAEJ,CAEJ,CAaA,SAASH,GAAapD,EAAuC,CAC3D,GAAM,CAAE,OAAAuC,CAAO,EAAIvC,EACb,CAAC6C,EAAYe,CAAa,EAAIrD,GAA6BP,EAAM,UAAU,EAEjF,SAASoB,EAAeC,EAAkBT,EAAkB,CAC1DZ,EAAM,SAAS,CACb,GAAGuC,EACH,CAAClB,CAAQ,EAAGT,CACd,CAAyB,CAC3B,CAEA,OACEW,EAAA,cAACsC,GAAA,CAAM,QAAQ,MACbtC,EAAA,cAACE,GAAA,CACC,KAAM,eAAec,EAAO,EAAE,GAC9B,MAAM,QACN,aAAcA,EAAO,MACrB,SAAWb,GAAMN,EAAe,QAASM,EAAE,cAAc,KAAK,EAChE,EACAH,EAAA,cAACE,GAAA,CACC,KAAM,qBAAqBc,EAAO,EAAE,GACpC,MAAM,cACN,aAAcA,EAAO,YACrB,SAAWb,GAAMN,EAAe,cAAeM,EAAE,cAAc,KAAK,EACtE,EACAH,EAAA,cAACuC,GAAA,CACC,MAAM,iBACN,YAAY,0CACZ,KAAM,cAAcvB,EAAO,EAAE,GAC7B,aAAcM,EACd,SAAWnB,GAAMkC,EAAclC,EAAE,cAAc,KAAK,EACpD,KAAM,CAAC,GAAI,cAAe,MAAO,gBAAiB,MAAM,EAC1D,EACCa,EAAO,QAAUA,EAAO,OAAO,OAAS,GACvChB,EAAA,cAACI,GAAA,CACC,QAASY,EAAO,OAChB,YAAavC,EAAM,YACnB,eAAgBA,EAAM,eACtB,SAAUA,EAAM,SAChB,YAAaA,EAAM,YACnB,SAAW4B,GAAMR,EAAe,SAAUQ,CAAC,EAC7C,GAEA,IAAM,CACN,OAAQiB,EAAY,CAClB,IAAK,cACH,OACEtB,EAAA,cAACwC,GAAA,CACC,MAAM,cACN,YAAY,8DACZ,aAAa,WACb,OAAQxB,EACR,SAAUvC,EAAM,SAClB,EAEJ,IAAK,MACH,OACEuB,EAAA,cAACwC,GAAA,CACC,MAAM,MACN,YAAY,qDACZ,aAAa,qBACb,OAAQxB,EACR,SAAUvC,EAAM,SAClB,EAEJ,IAAK,gBACH,OACEuB,EAAA,cAACwC,GAAA,CACC,MAAM,gBACN,YAAY,wDACZ,aAAa,gBACb,OAAQxB,EACR,SAAUvC,EAAM,SAClB,EAEJ,IAAK,OACH,OACEuB,EAAA,cAACwC,GAAA,CACC,MAAM,OACN,YAAY,gDACZ,aAAa,qBACb,OAAQxB,EACR,SAAUvC,EAAM,SAClB,EAEJ,QACE,OAAO,IACX,CACF,GAAG,EACHuB,EAAA,cAACyC,GAAA,CAAY,MAAM,SAAS,YAAY,sCACtCzC,EAAA,cAAC0C,GAAA,CAAkB,KAAM,UAAY1B,EAAO,GAAI,OAAQA,EAAQ,SAAUvC,EAAM,SAAU,CAC5F,CACF,CAEJ,CAUA,SAAS+D,GAA0B/D,EAAoD,CACrF,GAAM,CAAE,GAAAkE,EAAI,oBAAAC,CAAoB,EAAInE,EAAM,OACpCoE,EAAYD,GAAqB,WAAWnE,EAAM,aAAe,GAAG,EACtE,CAAE,UAAWmE,CAAoB,EACjC,OACJ,OACE5C,EAAA,cAAC8C,GAAA,CACC,KAAMH,EACN,aAAclE,EAAM,aACpB,aAAcoE,EACd,YAAa,GACb,SAAW9C,GAAa,CAClBA,EACFtB,EAAM,SAAS,CAAE,GAAGA,EAAM,OAAQ,oBAAqBsE,GAAmBhD,CAAQ,CAAE,CAAC,EAErFtB,EAAM,SAAS,CAAE,GAAGA,EAAM,OAAQ,oBAAqB,MAAU,CAAC,CAEtE,EACF,CAEJ,CAQA,SAASiE,GAAkBjE,EAA4C,CACrE,IAAMY,EAAQZ,EAAM,OACduE,EAAM,SACN,CAAChB,EAAeC,CAAY,EAAIC,GAAgB7C,CAAK,EAC3D,OACEW,EAAA,cAACiD,GAAA,CACC,SAAUlB,GACV,KAAK,YACL,aAAcC,EACd,oBAAqBC,EACrB,SAAU,CAAClC,EAAemD,IAAsB,CAC9CzE,EAAM,SAAS0E,GAAiB9D,EAAO2D,EAAKE,GAAYF,EAAKjB,GAAgBhC,CAAQ,CAAC,CACxF,EACF,CAEJ,CAEA,SAASwB,GAAqBP,EAAkD,CAC9E,GAAIA,EAAO,qBAAqB,WAAW,UAAU,EACnD,MAAO,cAGT,GAAIA,EAAO,qBAAqB,WAAW,gBAAgB,EACzD,MAAO,gBAGT,GAAIA,EAAO,qBAAqB,WAAW,qBAAqB,EAC9D,MAAO,MAIX,CAEA,SAASkB,GAAgBlB,EAAmD,CAC1E,OAAOoC,GAAgB,CAAE,KAAM,uBAAwB,MAAOpC,CAAO,EAAG,QAAQ,CAClF,CAEA,IAAIqC,GAAS,EAUb,SAASjC,GAAWkC,EAA2B,CAC7C,GAAIA,EAAU,CACZ,GAAIA,EAAS,WAAW,KAAK,EAAG,CAC9B,IAAMC,EAAc,SAASD,EAAS,UAAU,CAAC,EAAG,EAAE,EACjD,MAAMC,CAAW,IACpBF,GAAS,KAAK,IAAIA,GAAQE,EAAc,CAAC,EAE7C,CACA,OAAOD,CACT,CACA,MAAO,MAAQD,IACjB,CAEA,SAASzD,GAAyB4D,EAAgD,CAChF,MAAO,CACL,GAAGA,EACH,OAAQC,GAA+BD,EAAe,MAAM,CAC9D,CACF,CAEA,SAASC,GACPC,EACoC,CACpC,GAAKA,EAGL,OAAOA,EAAQ,IAAK1C,IAAY,CAC9B,GAAGA,EACH,GAAII,GAAWJ,EAAO,EAAE,EACxB,OAAQyC,GAA+BzC,EAAO,MAAM,CACtD,EAAE,CACJ,CC9eA,OAAS,UAAA2C,GAAQ,UAAAC,GAAQ,gBAAAC,GAAc,gBAAAC,GAAc,YAAAC,GAAU,aAAAC,GAAW,SAAAC,OAAa,gBACvF,OAAS,gBAAAC,GAA0C,cAAcC,OAAsB,gBASvF,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCVnD,OACE,UAAAC,GACA,UAAAC,GACA,YAAAC,GACA,SAAAC,GACA,gBAAAC,GACA,SAAAC,GACA,SAAAC,GACA,WAAAC,GACA,YAAAC,GACA,aAAAC,GACA,SAAAC,OACK,gBACP,OACE,cAAAC,GACA,mBAAAC,GACA,gBAAAC,GACA,2BAAAC,GACA,sBAAAC,GACA,yBAAAC,GACA,gBAAAC,GAIA,aAAAC,GAEA,qBAAAC,OACK,gBAWP,OAAOC,GAAsB,aAAAC,GAAW,YAAAC,OAAgB,QCpCjD,IAAKC,QACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,SAAW,WACXA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,KAAO,OACPA,EAAA,SAAW,WACXA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,KAAO,OACPA,EAAA,IAAM,MACNA,EAAA,OAAS,SACTA,EAAA,WAAa,cACbA,EAAA,WAAa,aACbA,EAAA,UAAY,YACZA,EAAA,SAAW,WAjBDA,QAAA,IAoBL,SAASC,GAAiBC,EAAkC,CACjE,OAAOA,EAAK,OAAS,UAAYA,EAAK,OAAS,aACjD,CDkCO,SAASC,GAAkBC,EAAmD,CACnF,IAAMC,EAAUC,EAAW,EACrBC,EAASF,EAAQ,WAAW,EAC5B,CAACG,EAAQC,CAAS,EAAIC,GAAiD,EACvEC,EAAgBC,EAAYR,EAAM,aAAa,EAC/C,CAACS,EAAUC,CAAW,EAAIJ,GAA4C,EACtE,CAACK,EAASC,CAAU,EAAIN,GAA0D,CAAC,CAAC,EACpF,CAACO,EAAYC,CAAa,EAAIR,GAAS,CAAC,EAExCS,EAAgBC,GAAiBT,GAAe,MAAQ,CAAC,CAAC,EAC1DU,EAAW,IAAYH,EAAeI,GAAaA,GAAWH,EAAgBG,EAAUA,EAAU,CAAE,EACpGC,EAAW,IAAYL,EAAeI,GAAaA,GAAW,EAAIA,EAAUA,EAAU,CAAE,EAE9FE,GAAU,IAAM,CACdnB,EACG,cAAc,eAAe,EAC7B,KAAK,IAAMA,EAAQ,cAAc,uBAAuB,CAAC,EACzD,KAAKI,CAAS,EACd,MAAM,QAAQ,GAAG,CACtB,EAAG,CAACJ,CAAO,CAAC,EAEZmB,GAAU,IAAM,CACdV,EAAYH,EAAgBc,GAAqBd,CAAa,EAAI,MAAS,CAC7E,EAAG,CAACA,CAAa,CAAC,EAElB,SAASe,EAASC,EAAqD,CACrE,IAAMC,EAAqC,CACzC,aAAc,wBACd,KAAMD,CACR,EACAb,EAAYc,CAAW,EACvBZ,EAAWa,GAAwBD,CAAW,CAAC,CACjD,CAEA,MAAI,CAACpB,GAAU,CAACG,EACP,KAIPmB,EAAA,cAACC,EAAA,CACC,OAAO,qBACP,SAAU,IAAM,CACV3B,EAAM,UAAYS,GACpBT,EAAM,SAAS,CACb,GAAGS,EACH,cAAemB,GAAmBrB,CAAa,EAC/C,QAASP,EAAM,QACf,OAAQ6B,GAAgB1B,CAAyB,EACjD,SAAU,IAAI,KAAK,EAAE,YAAY,EACjC,OAAQ,WACV,CAAC,CAEL,GAECI,EAAc,OAASmB,EAAA,cAACI,GAAA,KAAOvB,EAAc,KAAM,EAEnDA,EAAc,MACbmB,EAAA,cAACK,GAAA,CACC,MAAOxB,EAAc,KACrB,QAASI,EACT,SAAUW,EACV,YAAaP,EAAgB,EAC7B,WAAYF,EACd,EAEFa,EAAA,cAACM,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBN,EAAA,cAACO,GAAA,CACC,WAAYpB,EACZ,cAAeE,EACf,SAAUE,EACV,SAAUE,EACV,iBAAkBnB,EAAM,iBAC1B,CACF,CACF,CAEJ,CAUA,SAAS+B,GAA2B/B,EAAqD,CACvF,GAAM,CAACkC,EAAeC,CAAgB,EAAI7B,GACxC8B,GAA0BpC,EAAM,KAAK,CACvC,EAEA,SAASqC,EAAgBC,EAAoBC,EAAkD,CAC7F,IAAMC,EAAaN,EAAc,KAAMO,GAAMA,EAAE,KAAOH,CAAU,EAC5Df,EACAiB,EACFjB,EAAmBW,EAAc,IAAKO,GAAOA,EAAE,KAAOH,EAAaC,EAAkBE,CAAE,EAEvFlB,EAAmB,CAAC,GAAGW,EAAeK,CAAe,EAEvDJ,EAAiBZ,CAAgB,EACjCvB,EAAM,SAASuB,CAAgB,CACjC,CAEA,IAAMmB,EAAe1C,EAAM,MAAM,IAAI,CAAC2C,EAAMC,IACtC5C,EAAM,YAEN0B,EAAA,cAACmB,GAAQ,KAAR,CAAa,MAAOF,EAAK,KAAM,IAAKA,EAAK,QACxCjB,EAAA,cAACoB,GAAA,CACC,IAAK,GAAGH,EAAK,MAAM,IAAIC,CAAK,GAC5B,KAAMD,EACN,MAAOC,EACP,QAAS5C,EAAM,QACf,cAAekC,EACf,gBAAiBG,EACnB,CACF,EAIFX,EAAA,cAACoB,GAAA,CACC,IAAK,GAAGH,EAAK,MAAM,IAAIC,CAAK,GAC5B,KAAMD,EACN,MAAOC,EACP,QAAS5C,EAAM,QACf,cAAekC,EACf,gBAAiBG,EACnB,CAEH,EAED,OAAIrC,EAAM,YAEN0B,EAAA,cAACmB,GAAA,CAAQ,OAAQ7C,EAAM,YAAc,EAAG,qBAAsB,IAC3D0C,CACH,EAGGhB,EAAA,cAACqB,GAAA,KAAOL,CAAa,CAC9B,CAUA,SAASI,GAA8B9C,EAA+D,CACpG,OAAKgD,GAAkBhD,EAAM,KAAMA,EAAM,OAAO,EAG5CA,EAAM,KAAK,iBACN0B,EAAA,cAAC,KAAE,IAAK1B,EAAM,KAAK,QAASA,EAAM,KAAK,IAAK,EAEjDA,EAAM,KAAK,eAEX0B,EAAA,cAACuB,GAAA,CACC,IAAKjD,EAAM,KAAK,OAChB,KAAMA,EAAM,KACZ,QAASA,EAAM,QACf,cAAeA,EAAM,cACrB,SAAWuC,GAAoBvC,EAAM,gBAAgBuC,EAAgB,GAAcA,CAAe,EACpG,EAIFb,EAAA,cAACwB,GAAA,CAAY,IAAKlD,EAAM,KAAK,OAAQ,QAASA,EAAM,KAAK,OAAQ,MAAOA,EAAM,KAAK,MAAQ,IACzF0B,EAAA,cAACuB,GAAA,CACC,KAAMjD,EAAM,KACZ,QAASA,EAAM,QACf,cAAeA,EAAM,cACrB,SAAWuC,GAAoBvC,EAAM,gBAAgBuC,EAAgB,GAAcA,CAAe,EACpG,CACF,EAxBO,IA0BX,CASO,SAASU,GAA2BjD,EAAqD,CAC9F,IAAM2C,EAAO3C,EAAM,KACnB,SAASmD,EAAa5B,EAA+C6B,EAAuB,CAC1F,IAAMR,EAAQQ,GAAU,EAClBC,EAAYrD,EAAM,cAAc,OAAQyC,GAAMA,EAAE,SAAWE,EAAK,MAAM,EAC5E3C,EAAM,SAAS,CACb,GAAIsD,GAAcD,EAAWT,CAAK,EAClC,OAAQD,EAAK,OACb,KAAMA,EAAK,KACX,KAAMpB,CACR,CAAC,CACH,CACA,OAAIoB,EAAK,eAELjB,EAAA,cAAC6B,GAAA,CACC,IAAKvD,EAAM,KAAK,OAChB,KAAM2C,EAAK,MAAQ,GACnB,KAAMA,GAAQ,CAAC,EACf,QAAS3C,EAAM,QACf,SAAUmD,EACZ,EAIFzB,EAAA,cAAC8B,GAAA,CAAe,KAAMxD,EAAM,KAAM,IAAKA,EAAM,KAAK,QAC/C,CAAC,CAAE,MAAA4C,CAAM,IAAyBlB,EAAA,cAAC+B,GAAA,CAAuB,GAAGzD,EAAO,MAAO4C,EAAO,CACrF,CAEJ,CAUO,SAASa,GAAsBzD,EAAuD,CAC3F,IAAM2C,EAAO3C,EAAM,KACb4C,EAAQ5C,EAAM,MAEpB,SAAS0D,EAAeC,EAAoDC,EAA8B,CACxG,IAAMR,EAASQ,GAAiB,EAC1BP,EAAYrD,EAAM,eAAe,OAAQyC,GAAMA,EAAE,SAAWE,EAAK,MAAM,GAAK,CAAC,EACnF3C,EAAM,SAAS,CACb,GAAIqD,EAAU,CAAC,EAAE,GACjB,OAAQV,EAAK,OACb,KAAMA,EAAK,KACX,OAAQkB,GAAkBR,EAAU,CAAC,GAAG,QAAU,CAAC,EAAGD,EAAQO,CAAiB,CACjF,CAAC,CACH,CAEA,IAAMG,EAAOnB,EAAK,KAClB,GAAI,CAACmB,EACH,OAAO,KAGT,IAAMC,EAAOpB,EAAK,OAClB,GAAI,CAACoB,EACH,OAAO,KAGT,IAAMC,EAAUrB,EAAK,SAAWA,EAAK,QAAQ,OAAS,EAAIA,EAAK,QAAQ,CAAC,EAAI,OAE5E,OAAQmB,EAAM,CACZ,cACE,OACEpC,EAAA,cAACuC,GAAA,CAAoB,IAAKjE,EAAM,KAAK,OAAQ,MAAOA,EAAM,KAAK,KAAM,QAASA,EAAM,KAAK,QACvF0B,EAAA,cAACwC,GAAA,CACC,GAAIlE,EAAM,KAAK,OACf,KAAMA,EAAM,KAAK,OACjB,eAAgBgE,GAAS,aACzB,SAAWG,GAAMT,EAAe,CAAE,aAAcS,EAAE,cAAc,OAAQ,EAAGvB,CAAK,EAClF,CACF,EAEJ,cACE,OACElB,EAAA,cAAC0C,GAAA,CACC,KAAK,SACL,KAAK,MACL,GAAIL,EACJ,KAAMA,EACN,aAAcC,GAAS,aACvB,SAAWG,GAAMT,EAAe,CAAE,aAAcS,EAAE,cAAc,aAAc,EAAGvB,CAAK,EACxF,EAEJ,cACE,OACElB,EAAA,cAAC0C,GAAA,CACC,KAAK,SACL,KAAM,EACN,GAAIL,EACJ,KAAMA,EACN,aAAcC,GAAS,aACvB,SAAWG,GAAMT,EAAe,CAAE,aAAcS,EAAE,cAAc,aAAc,EAAGvB,CAAK,EACxF,EAEJ,WACE,OACElB,EAAA,cAAC0C,GAAA,CACC,KAAK,OACL,GAAIL,EACJ,KAAMA,EACN,aAAcC,GAAS,UACvB,SAAWG,GAAMT,EAAe,CAAE,UAAWS,EAAE,cAAc,KAAM,EAAGvB,CAAK,EAC7E,EAEJ,eACE,OACElB,EAAA,cAAC2C,GAAA,CACC,KAAMN,EACN,aAAcC,GAAS,cACvB,SAAWM,GAAqBZ,EAAe,CAAE,cAAeY,CAAS,EAAG1B,CAAK,EACnF,EAEJ,WACE,OACElB,EAAA,cAAC0C,GAAA,CACC,KAAK,OACL,GAAIL,EACJ,KAAMA,EACN,aAAcC,GAAS,UACvB,SAAWG,GAAMT,EAAe,CAAE,UAAWS,EAAE,cAAc,KAAM,EAAGvB,CAAK,EAC7E,EAEJ,aACA,UACE,OACElB,EAAA,cAAC0C,GAAA,CACC,GAAIL,EACJ,KAAMA,EACN,aAAcC,GAAS,YACvB,SAAWG,GAAMT,EAAe,CAAE,YAAaS,EAAE,cAAc,KAAM,EAAGvB,CAAK,EAC/E,EAEJ,WACE,OACElB,EAAA,cAAC6C,GAAA,CACC,GAAIR,EACJ,KAAMA,EACN,aAAcC,GAAS,YACvB,SAAWG,GAAMT,EAAe,CAAE,YAAaS,EAAE,cAAc,KAAM,EAAGvB,CAAK,EAC/E,EAEJ,iBACE,OACElB,EAAA,cAAC8C,GAAA,CACC,KAAMT,EACN,aAAcC,GAAS,gBACvB,SAAWM,GAAaZ,EAAe,CAAE,gBAAiBY,CAAS,EAAG1B,CAAK,EAC7E,EAEJ,gBACE,OACElB,EAAA,cAAC+C,GAAA,CACC,KAAMV,EACN,YAAaW,GAAe/B,CAAI,EAChC,aAAcqB,GAAS,eACvB,SAAWM,GAAaZ,EAAe,CAAE,eAAgBY,CAAS,EAAG1B,CAAK,EAC5E,EAEJ,eACE,OACElB,EAAA,cAACiD,GAAA,CACC,KAAMZ,EACN,aAAcC,GAAS,cACvB,SAAWM,GAAaZ,EAAe,CAAE,cAAeY,CAAS,EAAG1B,CAAK,EACzE,aAAY,GACd,EAEJ,aACA,kBACE,OAAIgC,GAAiBjC,CAAI,EAErBjB,EAAA,cAACmD,GAAA,CACC,KAAMd,EACN,KAAMpB,EACN,QAASqB,EACT,eAAiBG,GAAMT,EAAeS,EAAGvB,CAAK,EAChD,EAIAlB,EAAA,cAACoD,GAAA,CACC,KAAMf,EACN,KAAMpB,EACN,QAASqB,EACT,eAAiBG,GAAMT,EAAeS,EAAGvB,CAAK,EAChD,EAGN,QACE,OAAO,IACX,CACF,CASA,SAASiC,GAAiC7E,EAAmD,CAC3F,GAAM,CAAE,KAAA+D,EAAM,KAAApB,EAAM,QAAAqB,CAAQ,EAAIhE,EAC1B+E,EAAeC,GAAsB,CAAE,KAAM,2BAA4B,MAAOhB,CAAQ,EAAG,OAAO,EAIlGiB,EAAO,CAAC,EAAE,EAChB,GAAItC,EAAK,aACP,QAAWuC,KAAUvC,EAAK,aAAc,CACtC,IAAMwC,EAAcH,GAClB,CAAE,KAAM,gCAAiC,MAAOE,CAAO,EACvD,OACF,EACAD,EAAK,KAAKG,GAAmBD,CAAW,CAAW,CACrD,CAGF,OACEzD,EAAA,cAAC2D,GAAA,CACC,GAAItB,EACJ,KAAMA,EACN,SAAWI,GAAsC,CAC/C,IAAMvB,EAAQuB,EAAE,cAAc,cAC9B,GAAIvB,IAAU,EAAG,CACf5C,EAAM,eAAe,CAAC,CAAC,EACvB,MACF,CACA,IAAMkF,EAAUvC,EAAK,aAAiDC,EAAQ,CAAC,EACzEuC,EAAcH,GAClB,CAAE,KAAM,gCAAiC,MAAOE,CAAO,EACvD,OACF,EACMI,EAAe,QAAUC,GAAWJ,EAAY,IAAI,EAC1DnF,EAAM,eAAe,CAAE,CAACsF,CAAY,EAAGH,EAAY,KAAM,CAAC,CAC5D,EACA,aAAcC,GAAmBL,CAAY,EAC7C,KAAME,EACR,CAEJ,CAEA,SAASG,GAAmBI,EAAwD,CAClF,GAAKA,EAGL,OAAIA,EAAW,OAAS,kBACfA,EAAW,MAAM,OAAO,CAAC,EAAE,QAEhCA,EAAW,OAAS,SACfA,EAAW,MAAM,QAEnBA,EAAW,MAAM,SAAS,CACnC,CAEA,SAASV,GAA8B9E,EAAmD,CACxF,GAAM,CAAE,KAAA+D,EAAM,KAAApB,EAAM,QAAAqB,EAAS,eAAAN,CAAe,EAAI1D,EAC1CyF,EAAyBC,GAAa,MAAM,8BAAiC,WAAW,UAAU,EAClGX,EAAeC,GAAsB,CAAE,KAAM,2BAA4B,MAAOhB,CAAQ,EAAG,OAAO,EAIlG2B,EAAkC,CAAC,EACrCC,EACJ,GAAIjD,EAAK,aACP,QAAS,EAAI,EAAG,EAAIA,EAAK,aAAa,OAAQ,IAAK,CACjD,IAAMuC,EAASvC,EAAK,aAAa,CAAC,EAC5BkD,EAAa,GAAG9B,CAAI,WAAW,CAAC,GAChCoB,EAAcH,GAClB,CAAE,KAAM,gCAAiC,MAAOE,CAAO,EACvD,OACF,EAEIH,GAAgBe,GAAUX,CAAW,IAAMW,GAAUf,CAAY,IACnEa,EAAeC,GAEjBF,EAAQ,KAAK,CAACE,EAAYV,CAAW,CAAC,CACxC,CAGF,OACEzD,EAAA,cAACqE,GAAM,MAAN,CACC,KAAMhC,EACN,aAAc6B,EACd,SAAWtB,GAAa,CACtB,IAAMY,EAASS,EAAQ,KAAMT,GAAWA,EAAO,CAAC,IAAMZ,CAAQ,EAC9D,GAAIY,EAAQ,CACV,IAAMC,EAAcD,EAAO,CAAC,EACtBI,EAAe,QAAUC,GAAWJ,EAAY,IAAI,EAC1DzB,EAAe,CAAE,CAAC4B,CAAY,EAAGH,EAAY,KAAM,CAAC,CACtD,CACF,GAECQ,EAAQ,IAAI,CAAC,CAACE,EAAYV,CAAW,IACpCzD,EAAA,cAACqE,GAAA,CACC,IAAKF,EACL,GAAIA,EACJ,MAAOA,EACP,MACEnE,EAAA,cAACsE,GAAA,CACC,SAAUP,EACV,aAAcN,EAAY,KAC1B,MAAOA,EAAY,MACrB,EAEJ,CACD,CACH,CAEJ,CAUA,SAASlD,GAAYjC,EAAsC,CACzD,OAAIA,EAAM,aAAe,GAAKA,EAAM,eAAiB,EAC5C0B,EAAA,cAACuE,GAAA,CAAO,KAAK,UAAUjG,EAAM,kBAAoB,IAAK,EACpDA,EAAM,YAAcA,EAAM,cAEjC0B,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACuE,GAAA,CAAO,QAASjG,EAAM,UAAU,MAAI,EACrC0B,EAAA,cAACuE,GAAA,CAAO,QAASjG,EAAM,SAAU,KAAK,UACnCA,EAAM,kBAAoB,IAC7B,CACF,EAEOA,EAAM,aAAe,EAE5B0B,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACuE,GAAA,CAAO,QAASjG,EAAM,UAAU,MAAI,CACvC,EAIA0B,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACuE,GAAA,CAAO,QAASjG,EAAM,UAAU,MAAI,EACrC0B,EAAA,cAACuE,GAAA,CAAO,QAASjG,EAAM,UAAU,MAAI,CACvC,CAGN,CAEA,SAASqB,GAAqBd,EAAqD,CAOjF,MANwC,CACtC,aAAc,wBACd,cAAeqB,GAAmBrB,CAAa,EAC/C,KAAM6B,GAA0B7B,EAAc,IAAI,CACpD,CAGF,CAEA,SAAS6B,GAA0B8D,EAAqE,CACtG,OAAOA,GAAO,IAAIC,EAAwB,GAAK,CAAC,CAClD,CAEA,SAASA,GAAyBxD,EAAoD,CACpF,MAAO,CACL,GAAIyD,GAAW,EACf,OAAQzD,EAAK,OACb,KAAMA,EAAK,KACX,KAAMP,GAA0BO,EAAK,IAAI,EACzC,OAAQA,EAAK,SAAS,IAAI0D,EAA0B,GAAK,CAAC,CAC5D,CACF,CAEA,IAAIC,GAAS,EACb,SAASF,IAAqB,CAC5B,MAAO,MAAQE,IACjB,CAEA,SAASD,GAA2BE,EAAmE,CAGrG,MAAO,CAAE,GAAGA,CAAO,CACrB,CAEA,SAAS3B,GAAiBjC,EAAkC,CAC1D,MAAO,CAAC,CAACA,EAAK,WAAW,KACtBwB,GACCA,EAAE,MAAQ,qEACVA,EAAE,sBAAsB,SAAS,CAAC,GAAG,OAAS,WAClD,CACF,CAEO,SAASnB,GACdL,EACAhC,EACS,CACT,GAAI,CAACgC,EAAK,WACR,MAAO,GAGT,IAAM6D,EAAiB7D,EAAK,gBAAkB,MAE9C,QAAW8D,KAAc9D,EAAK,WAAY,CACxC,IAAM+D,EAAe1B,GACnB,CACE,KAAM,kCACN,MAAOrE,EAAQ8F,EAAW,QAAkB,CAC9C,EACA,UACF,EAEME,EAAiB3B,GACrB,CACE,KAAM,8BACN,MAAOyB,CACT,EACA,WACF,EAEIG,EAEE,CAAE,SAAAC,CAAS,EAAIJ,EAGrB,GAAII,IAAa,SAGfD,EAAQ,CAAC,CAACF,IAAiBC,EAAe,cACjCD,IAAiB,OAC1BE,EAAQ,OACH,CAGL,IAAME,EAAmBD,IAAa,KAAOA,IAAa,KAAOA,GAAU,QAAQ,IAAK,GAAG,EAAIA,EACzF,CAAC,CAAE,MAAAE,CAAM,CAAC,EAAIC,GAAkB,iBAAiBF,CAAgB,mBAAoB,CAACJ,CAAY,EAAG,CACzG,aAAAA,EACA,eAAAC,CACF,CAAC,EACDC,EAAQG,CACV,CAEA,GAAIP,IAAmB,OAASI,EAC9B,MAAO,GAET,GAAIJ,IAAmB,OAAS,CAACI,EAC/B,MAAO,EAEX,CACA,OAAIJ,IAAmB,KAKzB,CAEA,SAASxF,GAAiBkF,EAAoC,CAK5D,OAJcA,EAAM,OAAQvD,GACRsE,GAAatE,EAAM,mEAAmE,GACtF,sBAAsB,SAAS,CAAC,GAAG,OAAS,MAC/D,EACY,OAAS,EAAIuD,EAAM,OAAS,CAC3C,CAEA,SAASxB,GAAe/B,EAAmC,CACzD,GAAIA,EAAK,mBACP,MAAO,CAAC,EAEV,IAAMuE,EAAavE,EAAK,WAAW,OAChCwB,GAAMA,EAAE,MAAQ,yEACnB,EACA,MAAI,CAAC+C,GAAcA,EAAW,SAAW,EAChC,CAAC,EAEMA,EAAW,IAAK/C,GAAMA,EAAE,sBAAsB,SAAS,CAAC,GAAG,IAAI,CAEjF,CASA,SAASZ,GAAgBvD,EAAiD,CACxE,GAAM,CAACoD,EAAQ+D,CAAS,EAAI7G,GAAS,CAAC,EAChCqC,EAAO3C,EAAM,KACnB,OACE0B,EAAA,cAAAA,EAAA,cACG,CAAC,GAAG,MAAM0B,CAAM,CAAC,EAAE,IAAI,CAACgE,EAAGC,IAExB3F,EAAA,cAAC,OAAI,IAAK2F,GACR3F,EAAA,cAAC,UAAI1B,EAAM,IAAK,EAChB0B,EAAA,cAACK,GAAA,CACC,MAAOY,EAAK,MAAQ,CAAC,EACrB,QAAS3C,EAAM,QACf,SAAWS,GAAaT,EAAM,SAASS,EAAU4G,CAAC,EACpD,CACF,CAEH,EACArH,EAAM,KAAK,SAAW0B,EAAA,cAAC4F,GAAA,CAAO,QAAS,IAAMH,EAAWI,GAAMA,EAAI,CAAC,GAAG,WAAS,CAClF,CAEJ,CAOA,SAAS/D,GAAexD,EAAyC,CAC/D,GAAM,CAACoD,EAAQ+D,CAAS,EAAI7G,GAAS,CAAC,EAEtC,OACEoB,EAAA,cAAAA,EAAA,cACG,CAAC,GAAG,MAAM0B,CAAM,CAAC,EAAE,IAAI,CAACgE,EAAGC,IACnB3F,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK,GAAG1B,EAAM,KAAK,MAAM,IAAIqH,CAAC,IAAKrH,EAAM,SAAS,CAAE,MAAOqH,CAAE,CAAC,CAAE,CACxF,EACArH,EAAM,MAAM,SAAW0B,EAAA,cAAC4F,GAAA,CAAO,QAAS,IAAMH,EAAWI,GAAMA,EAAI,CAAC,GAAG,UAAQ,CAClF,CAEJ,CAEA,SAAS1D,GACPlD,EACAiC,EACAe,EACmC,CACnC,GAAIf,EAAQjC,EAAQ,OAClB,OAAAA,EAAQiC,CAAK,EAAIe,EACVhD,EAEP,QAAS0G,EAAI1G,EAAQ,OAAQ0G,EAAIzE,EAAOyE,IACtC1G,EAAQ,KAAK,CAAC,CAAC,EAEjB,OAAAA,EAAQ,KAAKgD,CAAiB,EACvBhD,CAEX,CAEA,SAAS2C,GAAcD,EAAwCT,EAAuB,CACpF,OAAIS,EAAU,SAAW,GAAKA,EAAU,OAAST,EAAQ,EAChDwD,GAAW,EAEb/C,EAAUT,CAAK,EAAE,EAC1B,CDnwBA,IAAM4E,GAAYC,GAAcC,IAAW,CACzC,QAAS,CACP,SAAU,WACV,OAAQ,gBACR,QAAS,oBACT,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,aAAcA,EAAM,OAAO,GAC3B,WAAY,UACd,EAEA,SAAU,CACR,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,EAC7C,EAEA,QAAS,CACP,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,WAAY,aAAaA,EAAM,OAAO,KAAK,CAAC,CAAC,EAC/C,EAEA,aAAc,CACZ,SAAU,GACZ,EAEA,WAAY,CACV,SAAU,WACV,MAAO,EACP,IAAK,EACL,QAAS,EACT,MAAOA,EAAM,OAAO,KAAK,CAAC,EAC1B,SAAUA,EAAM,UAAU,EAC5B,EAEA,cAAe,CACb,SAAU,WACV,MAAO,EACP,OAAQ,EACR,SAAUA,EAAM,UAAU,GAE1B,MAAO,CACL,WAAY,CACd,CACF,EAEA,YAAa,CACX,MAAO,IACP,aAAc,CAChB,EAEA,WAAY,CACV,MAAO,GACT,CACF,EAAE,EAOK,SAASC,GAAqBC,EAAsD,CACzF,IAAMC,EAAUC,EAAW,EACrBC,EAAeC,EAAYJ,EAAM,aAAa,EAC9C,CAACK,EAAQC,CAAS,EAAIC,GAAiD,EACvE,CAACC,EAAOC,CAAQ,EAAIF,GAAwB,EAC5C,CAACG,EAAaC,CAAc,EAAIJ,GAAiB,EACjD,CAACK,EAAUC,CAAW,EAAIN,GAAiB,EAEjD,SAASO,GAAgC,CACvCD,EAAY,MAAS,CACvB,CAEA,SAASE,GAA4B,CACnCJ,EAAe,MAAS,CAC1B,CAgBA,OAdAK,GAAU,IAAM,CACdf,EAAQ,cAAc,eAAe,EAAE,KAAKK,CAAS,EAAE,MAAM,QAAQ,GAAG,CAC1E,EAAG,CAACL,CAAO,CAAC,EAEZe,GAAU,KACRP,EAASQ,GAAwBd,GAAgB,CAAE,aAAc,eAAgB,CAAC,CAAC,EACnF,SAAS,iBAAiB,YAAaW,CAAuB,EAC9D,SAAS,iBAAiB,QAASC,CAAmB,EAC/C,IAAM,CACX,SAAS,oBAAoB,YAAaD,CAAuB,EACjE,SAAS,oBAAoB,QAASC,CAAmB,CAC3D,GACC,CAACZ,CAAY,CAAC,EAEb,CAACE,GAAU,CAACG,EACP,KAIPU,EAAA,cAAC,WACCA,EAAA,cAACC,EAAA,CAAK,OAAO,qBAAqB,SAAU,IAAMnB,EAAM,SAASQ,CAAK,GACpEU,EAAA,cAACE,GAAA,CACC,KAAMZ,EACN,YAAaE,EACb,eAAgBC,EAChB,SAAUC,EACV,YAAaC,EACb,SAAUJ,EACZ,EACAS,EAAA,cAACG,GAAA,CAAO,KAAK,UAAS,MAAI,CAC5B,CACF,CAEJ,CAaA,SAASD,GAAyDpB,EAAyC,CACzG,GAAM,CAAE,QAAAsB,EAAS,GAAAC,CAAG,EAAI3B,GAAU,EAC5B4B,EAAWxB,EAAM,KACjByB,EAAOzB,EAAM,KACb0B,EAAaC,GAAe3B,EAAM,IAAI,EACtC4B,EAAcF,GAAcD,EAAK,eACjCI,EAASJ,EAAK,QAAU,aACxBK,EAAU9B,EAAM,cAAgBA,EAAM,KAAK,GAC3C+B,EAAW/B,EAAM,WAAaA,EAAM,KAAK,GAEzCgC,EAAUC,GAAU,EAC1BD,EAAQ,QAAUhC,EAAM,KAExB,SAASkC,EAAQC,EAA+B,CAC9CC,EAAUD,CAAC,EACXnC,EAAM,eAAeA,EAAM,KAAK,EAAE,CACpC,CAEA,SAASqC,EAAQF,EAA+B,CAC9CC,EAAUD,CAAC,EACXnC,EAAM,YAAYA,EAAM,KAAK,EAAE,CACjC,CAEA,SAASsC,EAAWC,EAAsC,CACxD,IAAMC,EAAOR,EAAQ,QACrBhC,EAAM,SAAS,CACb,GAAGwC,EACH,KAAMA,EAAK,MAAM,IAAKC,GAAOA,EAAE,KAAOF,EAAY,GAAKA,EAAcE,CAAE,CACzE,CAAM,CACR,CAEA,SAASC,EAAQC,EAAoC,CACnD3C,EAAM,SAAS,CACb,GAAGA,EAAM,KACT,KAAM,CAAC,GAAIA,EAAM,KAAK,MAAQ,CAAC,EAAI2C,CAAS,CAC9C,CAAC,CACH,CAEA,SAASC,EAAWC,EAAsC,CACxD7C,EAAM,SAAS,CACb,GAAGA,EAAM,KACT,KAAMA,EAAM,KAAK,MAAM,OAAQyC,GAAMA,IAAMI,CAAW,CACxD,CAAC,CACH,CAEA,SAASC,EAAeC,EAAkBvC,EAAkB,CAC1DR,EAAM,SAAS,CACb,GAAGgC,EAAQ,QACX,CAACe,CAAQ,EAAGvC,CACd,CAAM,CACR,CAEA,SAASwC,EAAiBvB,EAA+B,CACvDzB,EAAM,SAAS,CACb,GAAGA,EAAM,KACT,KAAMA,EAAM,KAAK,MAAM,IAAKyC,GAAOA,IAAMhB,EAAO,CAAE,GAAGgB,EAAG,QAAS,CAACA,EAAE,OAAQ,EAAIA,CAAE,CACpF,CAAC,CACH,CAEA,IAAMQ,EAAY1B,EAAGD,EAAQ,QAAS,CACpC,CAACA,EAAQ,OAAO,EAAGQ,EACnB,CAACR,EAAQ,QAAQ,EAAGS,GAAY,CAACD,CACnC,CAAC,EAED,OACEZ,EAAA,cAAC,OAAI,cAAaO,EAAK,OAAQ,UAAWwB,EAAW,QAASf,EAAS,YAAaG,GAClFnB,EAAA,cAAC,OAAI,UAAWI,EAAQ,cACrBQ,EACCZ,EAAA,cAAAA,EAAA,cACGQ,GACCR,EAAA,cAACgC,GAAA,CACC,KAAK,KACL,aAAc1B,EAAS,MACvB,SAAWW,GAAMW,EAAe,QAASX,EAAE,cAAc,KAAK,EAChE,EAED,CAACT,GACAR,EAAA,cAACiC,GAAA,CACC,SAAQ,GACR,QAAS,EACT,aAAc1B,EAAK,KACnB,SAAWU,GAAMW,EAAe,OAAQX,EAAE,cAAc,KAAK,EAC/D,EAEDV,EAAK,OAAS,aACbP,EAAA,cAACkC,GAAA,CAAkB,KAAM3B,EAAM,SAAW4B,GAAeP,EAAe,YAAaO,CAAU,EAAG,EAEnGC,GAAiB7B,CAAI,GACpBP,EAAA,cAACqC,GAAA,CACC,QAAS9B,EAAK,aACd,SAAW4B,GAAeP,EAAe,eAAgBO,CAAU,EACrE,CAEJ,EAEAnC,EAAA,cAAAA,EAAA,cACGM,EAAS,OAASN,EAAA,cAACsC,GAAA,KAAOhC,EAAS,KAAM,EACzCC,EAAK,MAAQP,EAAA,cAAC,WAAKO,EAAK,IAAK,EAC7B,CAACG,GAAeV,EAAA,cAACuC,GAAA,CAAsB,KAAMhC,EAAM,MAAO,EAAG,QAAS,CAAC,EAAG,SAAU,IAAG,GAAc,CACxG,CAEJ,EACCA,EAAK,MAAM,IAAKgB,GACfvB,EAAA,cAAC,OAAI,IAAKuB,EAAE,IACVvB,EAAA,cAACE,GAAA,CACC,KAAMqB,EACN,YAAazC,EAAM,YACnB,eAAgBA,EAAM,eACtB,SAAUA,EAAM,SAChB,YAAaA,EAAM,YACnB,SAAUsC,EACV,SAAU,IAAMM,EAAWH,CAAC,EAC5B,aAAcO,EAChB,CACF,CACD,EACA,CAACpB,GACAV,EAAA,cAAC,OAAI,UAAWI,EAAQ,YACrBQ,EACCZ,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgC,GAAA,CACC,KAAK,KACL,UAAW5B,EAAQ,YACnB,aAAcG,EAAK,OACnB,SAAWU,GAAMW,EAAe,SAAUX,EAAE,cAAc,KAAK,EACjE,EACC,CAACP,GACAV,EAAA,cAACwC,GAAA,CACC,KAAK,KACL,UAAWpC,EAAQ,WACnB,aAAcG,EAAK,KACnB,SAAWU,GAAMW,EAAe,OAAQX,EAAE,cAAc,KAAK,EAC7D,KAAM,CACJ,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,WAAY,MAAO,WAAY,EACxC,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,MAAO,MAAO,KAAM,EAC7B,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,YAAa,MAAO,WAAY,EACzC,CAAE,MAAO,WAAY,MAAO,UAAW,CACzC,EACF,CAEJ,EAEAjB,EAAA,cAAC,WAAKW,CAAO,CAEjB,EAEFX,EAAA,cAAC,OAAI,UAAWI,EAAQ,eACrBM,GACCV,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAAwB,CAChCA,EAAE,eAAe,EACjBO,EAAQ,CACN,GAAIkB,GAAW,EACf,OAAQC,GAAe,GAAG,EAC1B,KAAM,SACN,KAAM,UACR,CAAsB,CACxB,GACD,UAED,EACA3C,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAAwB,CAChCA,EAAE,eAAe,EACjBO,EAAQ,CACN,GAAIkB,GAAW,EACf,OAAQC,GAAe,GAAG,EAC1B,KAAM,QACN,KAAM,OACR,CAAsB,CACxB,GACD,WAED,CACF,EAEDnC,GACCR,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAAwB,CAChCA,EAAE,eAAe,EACjBO,EAAQoB,GAAW,CAAC,CACtB,GACD,UAED,EAEDhC,GAAW,CAACJ,GACXR,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAAwB,CAChCA,EAAE,eAAe,EACbnC,EAAM,cACRA,EAAM,aAAayB,CAAI,CAE3B,GAECA,EAAK,QAAU,oBAAsB,iBACxC,EACAP,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAAwB,CAChCA,EAAE,eAAe,EACbnC,EAAM,UACRA,EAAM,SAAS,CAEnB,GACD,QAED,CACF,CAEJ,CACF,CAEJ,CAOA,SAASuD,GAAcvD,EAAwC,CAC7D,IAAM+C,EAAWgB,GAAa,MAAM,8BAAiC,WAAW,UAAU,EACpFC,EAAUhE,EAAM,SAAW,CAAC,EAClC,OACEkB,EAAA,cAAC,WACE8C,EAAQ,IAAKC,GAA0C,CACtD,GAAM,CAACC,EAAeC,CAAY,EAAIC,GACpC,CAAE,KAAM,gCAAiC,MAAOH,CAAO,EACvD,OACF,EACA,OACE/C,EAAA,cAAC,OACC,IAAK+C,EAAO,GACZ,MAAO,CACL,QAAS,OACT,cAAe,MACf,eAAgB,gBAChB,WAAY,SACZ,MAAO,KACT,GAEA/C,EAAA,cAAC,WACCA,EAAA,cAACmD,GAAA,CACC,IAAKJ,EAAO,GACZ,KAAK,WACL,SAAUlB,EACV,oBAAqBoB,EACrB,aAAcD,EACd,SAAU,CAACI,EAAeC,IAAsB,CAC9C,IAAMlB,EAAa,CAAC,GAAGW,CAAO,EACxBQ,EAAQnB,EAAW,UAAWoB,GAAMA,EAAE,KAAOR,EAAO,EAAE,EAC5DZ,EAAWmB,CAAK,EAAI,CAAE,GAAIP,EAAO,GAAI,CAACM,CAAkB,EAAGD,CAAS,EACpEtE,EAAM,SAASqD,CAAU,CAC3B,EACF,CACF,EACAnC,EAAA,cAAC,WACCA,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAA4B,CACpCC,EAAUD,CAAC,EACXnC,EAAM,SAASgE,EAAQ,OAAQS,GAAMA,EAAE,KAAOR,EAAO,EAAE,CAAC,CAC1D,GACD,QAED,CACF,CACF,CAEJ,CAAC,EACD/C,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAA4B,CACpCC,EAAUD,CAAC,EACXnC,EAAM,SAAS,CACb,GAAGgE,EACH,CACE,GAAIJ,GAAW,CACjB,CACF,CAAC,CACH,GACD,YAED,CACF,CAEJ,CAOA,SAASR,GAAkBpD,EAAwC,CACjE,IAAM0E,EAAa1E,EAAM,KAAK,WAAa,CAAC,EACtC2E,EACJD,EAAW,OAAQvC,GAAMA,EAAE,MAAQ,yEAAyE,GAAK,CAAC,EACpH,OACEjB,EAAA,cAAAA,EAAA,cACGyD,EAAkB,IAAKC,GAEpB1D,EAAA,cAAC,OAAI,IAAK0D,EAAU,IAClB1D,EAAA,cAAC,OACC,MAAO,CACL,QAAS,OACT,cAAe,MACf,eAAgB,gBAChB,WAAY,SACZ,MAAO,KACT,GAEAA,EAAA,cAAC,WACCA,EAAA,cAACgC,GAAA,CACC,IAAK0B,EAAU,GACf,KAAK,WACL,MAAOA,EAAU,sBAAsB,SAAS,CAAC,EAAE,MAAQ,GAC3D,SAAWzC,GAAW,CACpBA,EAAE,eAAe,EACjB,IAAM0C,EAAgB,CAAC,GAAGH,CAAU,EAC9BF,EAAQK,EAAc,UAAWJ,GAAMA,EAAE,KAAOG,EAAU,EAAE,EAC5DE,EAASD,EAAcL,CAAK,EAAE,sBAAsB,SAAS,CAAC,GAAM,CAAC,EAC3EM,EAAO,QAAU3C,EAAE,OAAO,MAC1B2C,EAAO,KAAO3C,EAAE,OAAO,MAEvBnC,EAAM,SAAS6E,CAAa,CAC9B,EACF,CACF,CACF,EACA3D,EAAA,cAAC,WACCA,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAA4B,CACpCC,EAAUD,CAAC,EACXnC,EAAM,SAAS0E,EAAW,OAAQK,GAAMA,EAAE,KAAOH,EAAU,EAAE,CAAC,CAChE,GACD,QAED,CACF,CACF,CAEH,EACD1D,EAAA,cAACyC,GAAA,CACC,KAAK,IACL,QAAUxB,GAA4B,CACpCC,EAAUD,CAAC,EACXnC,EAAM,SAAS,CACb,GAAG0E,EACH,CACE,GAAId,GAAW,EACf,IAAK,0EACL,qBAAsB,CACpB,OAAQ,CACN,CACE,OAAQ,iCACR,QAAS,GACT,KAAM,EACR,CACF,CACF,CACF,CACF,CAAC,CACH,GACD,cAED,CACF,CAEJ,CAEA,IAAIoB,GAAa,EACbC,GAAS,EAQb,SAASpB,GAAeqB,EAAwB,CAC9C,OAAOA,EAASF,IAClB,CASA,SAASpB,IAAqB,CAC5B,MAAO,MAAQqB,IACjB,CAEA,SAAShE,GAAwBkE,EAA6C,CAC5E,MAAO,CACL,GAAGA,EACH,GAAIA,EAAc,IAAMvB,GAAW,EACnC,KAAMwB,GAA4BD,EAAc,IAAI,CACtD,CACF,CAEA,SAASC,GAA4BC,EAAyE,CAC5G,GAAKA,EAGL,OAAAA,EAAM,QAAS5D,GAAS,CAClBA,EAAK,IAAI,MAAM,UAAU,IAC3BwD,GAAS,KAAK,IAAIA,GAAQ,SAASxD,EAAK,GAAG,UAAU,CAAC,EAAG,EAAE,EAAI,CAAC,GAE9DA,EAAK,QAAQ,MAAM,QAAQ,IAC7BuD,GAAa,KAAK,IAAIA,GAAY,SAASvD,EAAK,OAAO,UAAU,CAAC,EAAG,EAAE,EAAI,CAAC,EAEhF,CAAC,EACM4D,EAAM,IAAK5D,IAAU,CAC1B,GAAGA,EACH,GAAIA,EAAK,IAAMmC,GAAW,EAC1B,KAAMwB,GAA4B3D,EAAK,IAAI,EAC3C,aAAc6D,GAA8B7D,EAAK,YAAY,CAC/D,EAAE,CACJ,CAEA,SAAS6D,GACPtB,EAC6C,CAC7C,GAAKA,EAGL,OAAOA,EAAQ,IAAKC,IAAY,CAC9B,GAAGA,EACH,GAAIA,EAAO,IAAML,GAAW,CAC9B,EAAE,CACJ,CAEA,SAASE,IAAgC,CACvC,MAAO,CACL,GAAIF,GAAW,EACf,OAAQC,GAAe,GAAG,EAC1B,KAAM,QACN,KAAM,WACN,UAAW,CACT,CACE,IAAK,oEACL,qBAAsB,CACpB,OAAQ,CACN,CACE,OAAQ,iDACR,KAAM,MACR,CACF,CACF,CACF,CACF,CACF,CACF,CGpmBA,OAAS,cAAA0B,GAAY,UAAAC,GAAQ,gBAAAC,GAAc,WAAAC,GAAS,SAAAC,GAAO,gBAAAC,GAAc,SAAAC,GAAO,QAAAC,GAAM,aAAAC,OAAiB,gBACvG,OAAS,eAAAC,GAAa,mBAAAC,OAAuB,gBAG7C,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QAM3C,IAAMC,GAAYC,GAAcC,IAAW,CACzC,QAAS,CACP,SAAU,WACV,OAAQ,gBACR,QAAS,oBACT,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,aAAcA,EAAM,OAAO,GAC3B,WAAY,UACd,CACF,EAAE,EAGIC,GAAkB,CAAC,SAAU,MAAO,iBAAkB,UAAW,YAAa,UAAU,EAcxFC,GAA0C,CAC9C,WAAY,CAAE,aAAc,uBAAwB,EACpD,SAAU,IAAM,CAEhB,CACF,EAEO,SAASC,GAAqBC,EAA+C,CAClFA,EAAQ,OAAO,OAAOF,GAAcE,CAAK,EACzC,IAAMC,EAAoBD,EAAM,WAE1B,CAACE,EAAgBC,CAAiB,EAAIC,GAA0B,CAAC,CAAC,EAClE,CAACC,EAASC,CAAU,EAAIF,GAAS,CAAC,EAClC,CAACG,EAAYC,CAAa,EAAIJ,GAAS,CAAC,EAE9C,OAAAK,GAAU,IAAM,CACd,IAAMC,EAAaC,GAA4BV,EAAmBO,CAAa,EAC/EL,EAAkBS,GAAwBF,EAAW,mBAAqB,CAAC,EAAGJ,CAAU,CAAC,CAC3F,EAAG,CAACL,CAAiB,CAAC,EAGpBY,EAAA,cAACC,EAAA,CAAK,OAAO,yBAAyB,SAAUC,GAC9CF,EAAA,cAACG,GAAA,KACEd,EAAe,IAAKe,GACnBJ,EAAA,cAACK,GAAA,CACC,KAAMC,GAAclB,EAAkB,qBAAqB,IAAI,EAC/D,SAAUmB,EACV,MAAOC,EACP,SAAUC,EACV,cAAeC,EACf,IAAK,SAASN,EAAc,EAAE,GAC9B,cAAeA,EACjB,CACD,CACH,EACAJ,EAAA,cAACW,GAAA,CACC,MAAM,YACN,KAAK,KACL,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACXE,EAAS,CAAE,GAAI,YAAYtB,CAAO,GAAI,QAAS,CAAC,EAA+B,UAAW,CAAC,CAAE,CAAC,EAC9FC,EAAYsB,GAAOA,EAAK,CAAC,CAC3B,GAEAf,EAAA,cAACgB,GAAA,IAAe,CAClB,EAEAhB,EAAA,cAACiB,GAAA,CAAM,SAAS,SACdjB,EAAA,cAACkB,GAAA,CAAO,KAAK,UAAS,MAAI,CAC5B,CACF,EAOF,SAAShB,GAAyB,CAChC,IAAMiB,EAAoB9B,EACvB,QAAS+B,GAAUA,EAAM,SAAS,EAClC,OAAQC,GAAa,CAACC,GAAgBD,CAAQ,CAAC,EAClDlC,EAAM,SAAS,CAAE,GAAGC,EAAmB,kBAAA+B,CAAkB,CAAC,CAC5D,CAMA,SAASL,EAASS,EAAiC,CACjDjC,EAAmBkC,GAAkB,CAAC,GAAGA,EAAeD,CAAU,CAAC,CACrE,CAEA,SAASb,EAAYe,EAAmC,CACtDnC,EAAmBkC,GAAkBA,EAAc,OAAQJ,GAAUA,EAAM,KAAOK,EAAa,EAAE,CAAC,CACpG,CAOA,SAASlB,EAAef,EAAiBkC,EAA+D,CACtGpC,EAAmBqC,GAAW,CAC5BA,EAAS,CAAC,GAAGA,CAAM,EACnB,IAAMC,EAAeD,EAAO,KAAM,GAAM,EAAE,KAAOnC,CAAO,EAElDqC,EAAQD,GAAc,UAAU,UAAWP,GAAaA,EAAS,KAAOK,EAAgB,EAAE,EAChG,OAAIG,IAAU,QAAaD,GAAc,UAAUC,CAAK,IACtDD,EAAa,UAAUC,CAAK,EAAIH,GAE3BC,CACT,CAAC,CACH,CAEA,SAASnB,EAAYhB,EAAiBsC,EAA6D,CAC7FA,EAAc,KAAO,SACvBA,EAAc,GAAK,MAAMpC,CAAU,GACnCC,EAAeoB,GAAOA,EAAK,CAAC,GAE9BzB,EAAmBqC,GAAW,CAC5BA,EAAS,CAAC,GAAGA,CAAM,EACnB,IAAMI,EAAoBJ,EAAO,UAAWK,GAAMA,EAAE,KAAOxC,CAAO,EAElE,GAAIuC,IAAsB,GAAI,CAC5B,IAAMH,EAAe,CAAE,GAAGD,EAAOI,CAAiB,CAAE,EACpDD,EAAgB,CAAE,GAAGA,EAAe,GAAGF,EAAa,OAAQ,EAC5DA,EAAa,UAAY,CAAC,GAAGA,EAAa,UAAWE,CAAa,EAClEH,EAAOI,CAAiB,EAAIH,CAC9B,CAEA,OAAOD,CACT,CAAC,CACH,CAEA,SAASlB,EAAejB,EAAiByC,EAA+D,CACtG3C,EAAmBqC,GAAW,CAC5BA,EAAS,CAAC,GAAGA,CAAM,EACnB,IAAMC,EAAeD,EAAO,KAAMK,GAAMA,EAAE,KAAOxC,CAAO,EACxD,OAAIoC,IACFA,EAAa,UAAYA,EAAa,UAAU,OAAQP,GAAaA,EAAS,KAAOY,EAAgB,EAAE,GAElGN,CACT,CAAC,CACH,CACF,CAeO,SAAStB,GAA0BlB,EAAoD,CAC5F,GAAM,CAAE,cAAAiB,EAAe,KAAA8B,CAAK,EAAI/C,EAC1B,CAAE,QAAAgD,CAAQ,EAAItD,GAAU,EAC9B,OACEmB,EAAA,cAACoC,GAAA,CAAU,cAAahC,EAAc,GAAI,UAAW+B,EAAQ,SAC3DnC,EAAA,cAACG,GAAA,CAAM,QAAS,MACdH,EAAA,cAACiB,GAAA,CAAM,SAAS,SACdjB,EAAA,cAACW,GAAA,CACC,MAAM,eACN,cAAa,uBAAuBP,EAAc,EAAE,GACpD,IAAK,uBAAuBA,EAAc,EAAE,GAC5C,KAAK,KACL,QAAUQ,GAAwB,CAChCC,EAAUD,CAAC,EACXzB,EAAM,cAAciB,CAAa,CACnC,GAEAJ,EAAA,cAACqC,GAAA,IAAgB,CACnB,CACF,EACArC,EAAA,cAACsC,GAAA,CAA2B,cAAelC,EAAe,SAAUjB,EAAM,SAAU,EACpFa,EAAA,cAACuC,GAAA,IAAQ,EACRnC,EAAc,UAAU,IAAKiB,GAC5BrB,EAAA,cAACG,GAAA,CAAM,IAAK,YAAYkB,EAAS,EAAE,GAAI,QAAS,MAC9CrB,EAAA,cAACiB,GAAA,KACCjB,EAAA,cAACwC,GAAA,CACC,IAAK,aAAanB,EAAS,EAAE,GAC7B,cAAa,aAAaA,EAAS,EAAE,GACrC,aAAcA,EAAS,UACvB,MAAO,cACP,KAAM,KACN,SAAWT,GAAM,CACfC,EAAUD,CAAC,EACXzB,EAAM,SAASiB,EAAc,GAAI,CAAE,GAAGiB,EAAU,UAAWT,EAAE,cAAc,MAAM,KAAK,CAAE,CAAC,CAC3F,EACF,EACAZ,EAAA,cAACW,GAAA,CACC,MAAM,kBACN,KAAK,KACL,IAAK,mBAAmBU,EAAS,EAAE,GACnC,cAAa,mBAAmBA,EAAS,EAAE,GAC3C,QAAUT,GAAwB,CAChCC,EAAUD,CAAC,EACXzB,EAAM,SAASiB,EAAc,GAAIiB,CAAQ,CAC3C,GAEArB,EAAA,cAACqC,GAAA,IAAgB,CACnB,CACF,EAEArC,EAAA,cAACyC,GAAA,CACC,SAAWC,GAAU,CACnBvD,EAAM,SAASiB,EAAc,GAAI,CAAE,GAAGiB,EAAU,MAAAqB,CAAM,CAAC,CACzD,EACA,IAAK,SAASrB,EAAS,EAAE,GACzB,KAAM,SAASA,EAAS,EAAE,GAC1B,aAAcA,EAAS,MACzB,CACF,CACD,EACDrB,EAAA,cAACW,GAAA,CACC,MAAM,eACN,KAAK,KACL,QAAUC,GAAwB,CAChCC,EAAUD,CAAC,EACXzB,EAAM,MAAMiB,EAAc,GAAI,CAC5B,MAAO,CACL,IAAK,CAAE,KAAA8B,CAAK,EACZ,KAAM,CAAE,KAAAA,CAAK,CACf,CACF,CAAC,CACH,GAEAlC,EAAA,cAACgB,GAAA,IAAe,CAClB,CACF,CACF,CAEJ,CAYA,SAASsB,GAA2BnD,EAAqD,CACvF,GAAM,CAAE,cAAAiB,EAAe,SAAAuC,CAAS,EAAIxD,EAG/BiB,EAAc,QAAQ,MACzBA,EAAc,QAAQ,IAAM,CAAC,GAE/B,QAAWwC,IAAO,CAAC,MAAO,MAAM,EACzBxC,EAAc,QAAQ,IAAIwC,CAAG,GAAG,OACnCxC,EAAc,QAAQ,IAAIwC,CAAG,EAAI,CAC/B,GAAGxC,EAAc,QAAQ,IAAIwC,CAAG,EAChC,KAAM,QACN,OAAQ,2BACV,GAIJ,OACE5C,EAAA,cAACG,GAAA,CAAM,MAAO,CAAE,SAAU,KAAM,GAC9BH,EAAA,cAACiB,GAAA,KACCjB,EAAA,cAAC6C,GAAA,CACC,KAAM,CAAC,GAAI,OAAQ,QAAQ,EAC3B,MAAM,UACN,aAAczC,EAAc,QAAQ,QAAU,GAC9C,SAAWQ,GAAM,CACf,QAAWS,KAAYjB,EAAc,UAAW,CAC9C,IAAI0C,EAAgClC,EAAE,cAAc,MAChDkC,IAAc,KAChBA,EAAY,QAEdH,EAASvC,EAAc,GAAI,CACzB,GAAGiB,EACH,OAAQyB,CACV,CAAC,CACH,CACF,EACF,CACF,EACA9C,EAAA,cAACiB,GAAA,CAAM,QAAS,MACdjB,EAAA,cAAC+C,GAAA,CAAK,UAAU,QAAQ,QAAS,WAAW3C,EAAc,EAAE,IAAI,MAEhE,EACAJ,EAAA,cAAC,OAAI,GAAI,WAAWI,EAAc,EAAE,IAClCJ,EAAA,cAACyC,GAAA,CACC,IAAK,OAAOrC,EAAc,EAAE,GAC5B,KAAM,OAAOA,EAAc,EAAE,GAC7B,aAAcA,EAAc,QAAQ,IACpC,SAAW4C,GAAa,CACtB,QAAW3B,KAAYjB,EAAc,UACnCuC,EAASvC,EAAc,GAAI,CAAE,GAAGiB,EAAU,IAAK2B,CAAS,CAAC,CAE7D,EACF,CACF,CACF,EACAhD,EAAA,cAAC6C,GAAA,CACC,KAAM,CAAC,GAAI,cAAe,aAAc,WAAY,SAAU,gBAAgB,EAC9E,MAAM,aACN,aAAczC,EAAc,QAAQ,SAAS,MAAQ,GACrD,SAAWQ,GAAM,CACf,QAAWS,KAAYjB,EAAc,UAAW,CAC9C,IAAI6C,EAAmCrC,EAAE,cAAc,MACnDqC,IAAiB,IACnBA,EAAe,OACfN,EAASvC,EAAc,GAAI,CAAE,GAAGiB,EAAU,QAAS,MAAU,CAAC,GAE9DsB,EAASvC,EAAc,GAAI,CACzB,GAAGiB,EACH,QAAS,CACP,KAAM4B,EACN,OAAQ,CACN,CAAE,KAAMA,EAAc,OAAQ,8DAA+D,CAC/F,CACF,CACF,CAAC,CAEL,CACF,EACF,EACAjD,EAAA,cAAC6C,GAAA,CACC,KAAM,CAAC,GAAI,YAAa,WAAY,UAAU,EAC9C,MAAM,aACN,aAAczC,EAAc,QAAQ,SACpC,SAAWQ,GAAM,CACf,QAAWS,KAAYjB,EAAc,UAAW,CAC9C,IAAM8C,EAAkCtC,EAAE,cAAc,MACpDsC,IAAgB,GAClBP,EAASvC,EAAc,GAAI,CAAE,GAAGiB,EAAU,SAAU,MAAU,CAAC,EAE/DsB,EAASvC,EAAc,GAAI,CACzB,GAAGiB,EACH,SAAU6B,CACZ,CAAC,CAEL,CACF,EACF,CACF,CAEJ,CAQA,SAASpD,GACPD,EACAF,EACuB,CACvB,IAAMwD,EAAYtD,EAAW,mBAAqB,CAAC,EAE/CuD,EACF,KAAK,IACH,GAAGD,EAAU,IAAK9B,GAAa,CAC7B,IAAMgC,EAAc,SAAShC,EAAS,IAAI,UAAU,CAAC,GAAK,GAAI,EAAE,EAChE,OAAQ,MAAMgC,CAAW,EAAkB,OAAO,kBAArBA,CAC/B,CAAC,CACH,EAAI,EAEN,OAAK,OAAO,SAASD,CAAM,IACzBA,EAAS,GAIXvD,EAAa,CACX,GAAGA,EACH,kBAAmBsD,EAAU,IAAK9B,IAAc,CAC9C,GAAGA,EACH,GAAIA,EAAS,IAAM,MAAM+B,GAAQ,EACnC,EAAE,CACJ,EACAzD,EAAcyD,CAAM,EACbvD,CACT,CASA,SAASE,GACPoD,EACA1D,EACiB,CACjB,IAAID,EAAU,EACRmC,EAAwC,CAAC,EAC/C,QAAWN,KAAY8B,EAAW,CAChC,IAAMG,EAAWC,GAAiBlC,CAAQ,EACpCiC,KAAY3B,IAChBA,EAAO2B,CAAQ,EAAI,CACjB,GAAI,YAAY9D,GAAS,GACzB,QAAS,OAAO,YAAYR,GAAgB,IAAK,GAAM,CAAC,EAAGqC,EAAS,CAAC,CAAC,CAAC,CAAC,EACxE,UAAW,CAAC,CACd,GAEFM,EAAO2B,CAAQ,EAAE,UAAU,KAAKjC,CAAQ,CAC1C,CACA,OAAA5B,EAAWD,CAAO,EACX,OAAO,OAAOmC,CAAM,CAC7B,CAOA,SAAS4B,GAAiBlC,EAA0D,CAUlF,MATgB,CACd,UAAUA,EAAS,MAAM,GACzB,OAAOmC,GAAYnC,EAAS,GAAG,CAAC,GAChC,kBAAkBmC,GAAYnC,EAAS,cAAc,CAAC,GACtD,WAAWA,EAAS,SAAS,IAAI,GACjC,aAAaA,EAAS,WAAW,IAAKoC,GAAMA,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,GAC7D,YAAYpC,EAAS,QAAQ,EAC/B,EAEe,KAAK,GAAG,CACzB,CAEA,SAASf,GAAc4B,EAAuD,CAC5E,OAAOA,IAASwB,GAAgBxB,EAAM,2BAA2B,GAAKA,EAAK,KAC7E,CAEA,SAASZ,GAAgBD,EAA2D,CAClF,OAAOA,EAAS,OAAO,KAAK,QAAU,QAAaA,EAAS,OAAO,MAAM,QAAU,MACrF,CCtcA,OAAS,UAAAsC,GAAQ,QAAAC,GAAM,QAAAC,OAAY,gBACnC,OAAS,kBAAAC,GAAgB,sBAAAC,OAA0B,gBAGnD,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAYpC,SAASC,GAAoBC,EAAqD,CACvF,IAAMC,EAAUC,EAAW,EACrBC,EAAeC,EAAYJ,EAAM,KAAK,EACtC,CAACK,EAAgBC,CAAiB,EAAIC,GAAS,EAAK,EACpD,CAACC,EAAgBC,CAAiB,EAAIF,GAAiB,EAS7D,GAPAG,GAAU,IAAM,CACVP,GAAgB,CAACE,IACnBJ,EAAQ,aAAaU,EAAkBR,CAAY,CAAC,EAAE,KAAKM,CAAiB,EAAE,MAAM,QAAQ,GAAG,EAC/FH,EAAkB,EAAI,EAE1B,EAAG,CAACL,EAASE,EAAcE,CAAc,CAAC,EAEtC,CAACF,GAAgB,CAACK,EACpB,OAAO,KAGT,OACEI,GAAA,cAACC,GAAA,KACEV,EAAa,QAAQ,IAAI,CAACW,EAAQC,IAAU,CAC3C,IAAMC,EAAOF,EAAO,UAAYG,EAAgBH,EAAO,QAA2B,EAC5EI,EAAYF,GAAM,QAAQ,CAAC,GAAG,eAC9BG,EAAaH,GAAM,SAAS,CAAC,GAAG,eACtC,OACEJ,GAAA,cAACA,GAAM,SAAN,CAAe,IAAK,UAAUG,CAAK,IAClCH,GAAA,cAACC,GAAK,IAAL,CAAS,KAAM,EAAG,EAAE,MAClBG,GAAM,SAAW,YAAcJ,GAAA,cAACQ,GAAA,IAAa,EAAKR,GAAA,cAACS,GAAA,CAAW,MAAM,OAAO,CAC9E,EACAT,GAAA,cAACC,GAAK,IAAL,CAAS,KAAM,EAAG,EAAE,MACnBD,GAAA,cAACU,GAAA,CAAK,OAAQ,KAAMR,EAAO,KAAM,EAChCA,EAAO,aAAeF,GAAA,cAAC,WAAKE,EAAO,WAAY,EAChDF,GAAA,cAAC,WAAI,qBAEHA,GAAA,cAACW,GAAA,CAAa,MAAOP,GAAM,MAAM,OAAqB,EAAE,aAEvDQ,GAAeR,GAAM,MAAM,WAAW,CACzC,EACAJ,GAAA,cAAC,WAAI,WACKA,GAAA,cAACa,GAAA,CAAY,OAAQT,GAAM,QAAU,UAAW,CAC1D,CACF,EACAJ,GAAA,cAACC,GAAK,IAAL,CAAS,KAAM,EAAG,EAAE,MAClBK,GAAa,CAACC,GAAcP,GAAA,cAACc,GAAA,CAAO,QAAS,IAAM1B,EAAM,QAAQgB,EAAME,CAAS,GAAG,OAAK,EACxFA,GAAaC,GACZP,GAAA,cAACc,GAAA,CAAO,QAAS,IAAM1B,EAAM,OAAOgB,EAAME,EAAWC,CAAU,GAAG,MAAI,CAE1E,CACF,CAEJ,CAAC,CACH,EAGF,SAASR,EAAkBgB,EAA+B,CACxD,IAAMC,EAAe,CAAC,EACtB,GAAID,EAAQ,OACV,QAAWb,KAAUa,EAAQ,OACvBb,EAAO,UAAU,WACnBc,EAAa,KAAK,CAAE,QAAS,CAAE,OAAQ,MAAO,IAAKd,EAAO,SAAS,SAAU,CAAE,CAAC,EAKtF,MAAO,CACL,aAAc,SACd,KAAM,QACN,MAAOc,CACT,CACF,CAEA,SAASX,EAAoCY,EAAwC,CACnF,QAAWC,KAAStB,GAAgB,MAClC,GAAIsB,EAAM,UAAYD,EAAU,YAAcE,GAAmBD,EAAM,QAAQ,EAC7E,OAAOA,EAAM,QAInB,CACF,CC9FA,OAAS,gBAAAE,OAAoB,gBAE7B,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCF3C,OAAS,aAAAC,OAAiB,gBCMnB,SAASC,GAAKC,EAAoBC,EAA4B,CACnE,IAAMC,EAAOC,GAAUH,EAAUC,CAAO,EACxC,OAAOG,GAAeF,EAAMF,EAAUC,CAAO,CAC/C,CAoBA,SAASE,GAAUE,EAAgBC,EAAqC,CACtE,IAAMC,EAAIF,EAAK,OACTG,EAAIF,EAAI,OACRG,EAAMF,EAAIC,EAAI,EACdE,EAAO,EAAI,EAAID,EACfE,EAAUD,EAAO,EAAK,EACtBE,EAAqC,IAAI,MAAMF,CAAI,EAEzDE,EAASD,EAAS,CAAC,EAAI,CACrB,EAAG,EACH,EAAG,GACH,KAAM,OACN,MAAO,EACT,EAEA,QAASE,EAAI,EAAGA,EAAIJ,EAAKI,IAAK,CAC5B,QAASC,EAAI,CAACD,EAAGC,GAAKD,EAAGC,GAAK,EAAG,CAC/B,IAAMC,EAAUJ,EAASG,EACnBE,EAAQD,EAAU,EAClBE,EAASF,EAAU,EACnBG,EAAYN,EAASI,CAAK,EAC1BG,EAAaP,EAASK,CAAM,EAC9BG,EACAC,EAAI,EAEJP,IAAM,CAACD,GAAMC,IAAMD,GAAKM,EAAW,EAAID,EAAU,GACnDG,EAAIH,EAAU,EACdE,EAAOF,IAEPG,EAAIF,EAAW,EAAI,EACnBC,EAAOD,GAGTP,EAASK,CAAM,EAAI,OAEnB,IAAIK,EAAID,EAAIP,EACRS,EAAO,CACT,EAAAF,EACA,EAAAC,EACA,KAAME,GAAcJ,CAAI,EACxB,MAAO,EACT,EAKA,KAAOC,EAAId,GAAKe,EAAId,GAAKH,EAAKgB,CAAC,IAAMf,EAAIgB,CAAC,GACxCD,IACAC,IAcF,GAXID,EAAIE,EAAK,IACXA,EAAO,CACL,EAAAF,EACA,EAAAC,EACA,KAAMC,EACN,MAAO,EACT,GAGFX,EAASG,CAAO,EAAIQ,EAEhBF,GAAKd,GAAKe,GAAKd,EACjB,OAAOI,EAASG,CAAO,CAE3B,CACAH,EAASD,EAASE,EAAI,CAAC,EAAI,MAC7B,CAIF,CAEA,SAAST,GAAeqB,EAAqBpB,EAAgBC,EAAwB,CACnF,IAAMoB,EAAkB,CAAC,EACrBxB,EAA6BuB,EAMjC,IAJIvB,EAAK,QACPA,EAAOA,EAAK,MAGPA,GAAM,MAAQA,EAAK,KAAK,GAAK,GAAG,CACrC,IAAMmB,EAAInB,EAAK,EACToB,EAAIpB,EAAK,EAEfA,EAAOA,EAAK,KACZ,IAAMyB,EAAUzB,EAAK,EACf0B,EAAU1B,EAAK,EAEfF,EAAW,CACf,SAAU2B,EACV,MAAOtB,EAAK,MAAMsB,EAASN,CAAC,CAC9B,EAEMpB,EAAU,CACd,SAAU2B,EACV,MAAOtB,EAAI,MAAMsB,EAASN,CAAC,CAC7B,EAEIO,EAEA7B,EAAS,MAAM,SAAW,GAAKC,EAAQ,MAAM,OAAS,EACxD4B,EAAO,SACE7B,EAAS,MAAM,OAAS,GAAKC,EAAQ,MAAM,SAAW,EAC/D4B,EAAO,SAEPA,EAAO,SAGTH,EAAO,KAAK,CAAE,SAAA1B,EAAU,QAAAC,EAAS,KAAA4B,CAAK,CAAC,EAEnC3B,EAAK,QACPA,EAAOA,EAAK,KAEhB,CAEA,OAAOwB,CACT,CAEA,SAASF,GAAcD,EAA0B,CAC/C,OAAIA,GAAQ,CAACA,EAAK,OAASA,EAAK,KACvBA,EAAK,KAEPA,CACT,CD9IO,SAASO,GAAMC,EAA6B,CAEjD,IAAMC,EAAYD,EAAQ,MACvB,OAAQE,GAAU,CAAC,CAACA,EAAM,QAAQ,EAClC,IAAKA,IAAW,CACf,KAAMA,EAAM,UAAU,KACtB,MAAOC,GAAUD,EAAM,SAAU,EAAI,EAAE,MAAM,WAAW,CAC1D,EAAE,EACD,KAAK,CAACE,EAAGC,IAAOD,EAAE,KAAK,YAAuB,cAAcC,EAAE,KAAK,WAAqB,CAAC,EAGtFC,EAAoBL,EAAS,CAAC,EAAE,MAAM,IAAKM,IAAU,CACzD,GAAIN,EAAS,CAAC,EAAE,KAAK,UACrB,KAAMA,EAAS,CAAC,EAAE,KAClB,MAAOM,EACP,KAAM,CACR,EAAE,EAEF,OAAAC,GAAgBF,EAAOL,CAAQ,EAC/BQ,GAAaH,CAAK,EACXA,CACT,CAOA,SAASE,GAAgBF,EAAmBL,EAAmD,CAC7F,QAASS,EAAI,EAAGA,EAAIT,EAAS,OAAQS,IAAK,CACxC,IAAMC,EAAYC,GAAKX,EAASS,EAAI,CAAC,EAAE,MAAOT,EAASS,CAAC,EAAE,KAAK,EAE/D,QAAWG,KAAYF,EAAW,CAChC,IAAMG,EAAWD,EAAS,SAAS,SAC7BE,EAAWF,EAAS,SAAS,MAC7BG,EAAWH,EAAS,QAAQ,MAOlC,IALIA,EAAS,OAAS,UAAYA,EAAS,OAAS,WAElDP,EAAM,OAAOQ,EAAUC,EAAS,MAAM,EAGpCF,EAAS,OAAS,UAAYA,EAAS,OAAS,SAElD,QAASI,EAAI,EAAGA,EAAIJ,EAAS,QAAQ,MAAM,OAAQI,IACjDX,EAAM,OAAOQ,EAAWG,EAAG,EAAG,CAC5B,GAAIhB,EAASS,CAAC,EAAE,KAAK,UACrB,KAAMT,EAASS,CAAC,EAAE,KAClB,MAAOM,EAASC,CAAC,EACjB,KAAM,CACR,CAAC,CAGP,CACF,CACF,CAMA,SAASR,GAAaH,EAAyB,CAC7C,IAAIY,EAAQ,EACZ,KAAOA,EAAQZ,EAAM,QAAQ,CAC3B,IAAIa,EAAOD,EACX,KAAOC,EAAOb,EAAM,QAAUA,EAAMa,CAAI,EAAE,KAAOb,EAAMY,CAAK,EAAE,IAC5DZ,EAAMa,CAAI,EAAE,KAAO,GACnBA,IAEFb,EAAMY,CAAK,EAAE,KAAOC,EAAOD,EAC3BA,EAAQC,CACV,CACF,CD3EA,IAAMC,GAAYC,GAAcC,IAAW,CACzC,UAAW,CACT,UAAW,MACb,EAEA,KAAM,CACJ,OAAQ,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAC3C,eAAgB,WAChB,aAAcA,EAAM,OAAO,GAC3B,cAAe,EACf,SAAUA,EAAM,UAAU,GAC1B,MAAO,OAEP,OAAQ,CACN,QAAS,gBACT,cAAe,MACf,WAAY,QACd,CACF,EAEA,SAAU,CACR,UAAW,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,EAChD,EAEA,UAAW,CACT,UAAW,CACb,EAEA,OAAQ,CACN,WAAY,MACd,EAEA,SAAU,CACR,YAAa,eAAeA,EAAM,OAAO,KAAK,CAAC,CAAC,GAChD,WAAY,MACd,EAEA,WAAY,CACV,gBAAiBA,EAAM,OAAO,KAAK,CAAC,EACpC,OAAQ,EACR,MAAOA,EAAM,OAAO,KAAK,CAAC,EAC1B,WAAYA,EAAM,oBAClB,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,GAChD,UAAW,OACb,EAEA,KAAM,CACJ,WAAYA,EAAM,oBAClB,SAAUA,EAAM,UAAU,GAC1B,QAAS,GAAGA,EAAM,QAAQ,EAAE,IAAIA,EAAM,QAAQ,EAAE,EAClD,EAEA,IAAK,CACH,OAAQ,CACV,CACF,EAAE,EAQK,SAASC,GAAcC,EAA+C,CAC3E,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxBM,EAAUC,EAAW,EACrB,CAACC,EAAOC,CAAQ,EAAIC,GAA6BN,EAAM,OAAO,EAQpE,GANAO,GAAU,IAAM,CACV,CAACP,EAAM,SAAWA,EAAM,cAAgBA,EAAM,IAChDE,EAAQ,YAAYF,EAAM,aAAcA,EAAM,EAAE,EAAE,KAAKK,CAAQ,EAAE,MAAM,QAAQ,GAAG,CAEtF,EAAG,CAACH,EAASF,EAAM,QAASA,EAAM,aAAcA,EAAM,EAAE,CAAC,EAErD,CAACI,EACH,OAAOI,GAAA,cAAC,WAAI,YAAU,EAGxB,IAAMC,EAAWL,EAAM,QAAQ,CAAC,GAAG,SAEnC,GAAI,CAACK,EACH,OAAO,KAGT,IAAMC,EAAQC,GAAMP,CAAK,EAEzB,OACEI,GAAA,cAAC,OAAI,UAAWP,EAAQ,WACtBO,GAAA,cAAC,SAAM,UAAWP,EAAQ,MACxBO,GAAA,cAAC,aACEE,EAAM,IAAI,CAACE,EAAKC,IACfL,GAAA,cAAC,MAAG,IAAK,OAASK,EAAO,UAAWD,EAAI,KAAO,EAAIX,EAAQ,SAAWA,EAAQ,WAC3EW,EAAI,KAAO,GACVJ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAAC,MAAG,UAAWP,EAAQ,OAAQ,QAASW,EAAI,MAC1CJ,GAAA,cAACM,GAAA,CAAc,MAAOF,EAAI,KAAK,OAAQ,KAAM,GAAM,CACrD,EACAJ,GAAA,cAAC,MAAG,UAAWP,EAAQ,SAAU,QAASW,EAAI,MAC5CJ,GAAA,cAACO,GAAA,CAAY,GAAIC,GAAcP,EAAUG,EAAI,KAAK,SAAmB,GAClEK,GAAcL,EAAI,KAAK,WAAqB,CAC/C,CACF,CACF,EAEFJ,GAAA,cAAC,MAAG,UAAWP,EAAQ,YAAaY,EAAQ,CAAE,EAC9CL,GAAA,cAAC,MAAG,UAAWP,EAAQ,MACrBO,GAAA,cAAC,OAAI,UAAWP,EAAQ,KAAMW,EAAI,KAAM,CAC1C,CACF,CACD,CACH,CACF,CACF,CAEJ,CAEA,SAASI,GAAcP,EAAoBS,EAA2B,CACpE,MAAO,IAAIT,EAAS,YAAY,IAAIA,EAAS,EAAE,aAAaS,CAAS,EACvE,CAEO,SAASD,GAAcE,EAA6B,CACzD,IAAMC,EAAU,KAAK,OAAO,KAAK,IAAI,EAAI,KAAK,MAAMD,CAAW,GAAK,GAAI,EAElEE,EAAQ,KAAK,MAAMD,EAAU,OAAQ,EAC3C,GAAIC,EAAQ,EACV,OAAOC,GAAcD,EAAO,MAAM,EAGpC,IAAME,EAAS,KAAK,MAAMH,EAAU,MAAO,EAC3C,GAAIG,EAAS,EACX,OAAOD,GAAcC,EAAQ,OAAO,EAGtC,IAAMC,EAAO,KAAK,MAAMJ,EAAU,KAAK,EACvC,GAAII,EAAO,EACT,OAAOF,GAAcE,EAAM,KAAK,EAGlC,IAAMC,EAAQ,KAAK,MAAML,EAAU,IAAI,EACvC,GAAIK,EAAQ,EACV,OAAOH,GAAcG,EAAO,MAAM,EAGpC,IAAMC,EAAU,KAAK,MAAMN,EAAU,EAAE,EACvC,OAAIM,EAAU,EACLJ,GAAcI,EAAS,QAAQ,EAGjCJ,GAAcF,EAAS,QAAQ,CACxC,CAEA,SAASE,GAAcK,EAAeC,EAAsB,CAC1D,MAAO,GAAGD,CAAK,IAAIA,IAAU,EAAIC,EAAOA,EAAO,GAAG,MACpD,CGjKA,OAAS,gBAAAC,OAAoB,gBAC7B,OAAS,aAAAC,OAAiB,gBAE1B,OAAOC,OAAW,QAGlB,IAAMC,GAAYC,GAAcC,IAAW,CACzC,QAAS,CACP,MAAOA,EAAM,OAAO,IAAI,CAAC,EACzB,eAAgB,cAClB,EAEA,MAAO,CACL,MAAOA,EAAM,OAAO,MAAM,CAAC,CAC7B,CACF,EAAE,EAQK,SAASC,GAAaC,EAAuC,CAClE,IAAIC,EAAmBD,EAAM,SACzBE,EAAkBF,EAAM,QAExBA,EAAM,aACRC,EAAmB,CAAE,GAAGA,EAAkB,KAAM,MAAU,EAC1DC,EAAkB,CAAE,GAAGA,EAAiB,KAAM,MAAU,GAG1D,IAAMC,EAAWC,GAAUH,EAAkB,EAAI,EAAE,MAAM,WAAW,EAC9DI,EAAUD,GAAUF,EAAiB,EAAI,EAAE,MAAM,WAAW,EAC5DI,EAASC,GAAKJ,EAAUE,CAAO,EACrC,OACEG,GAAA,cAAC,OAAI,MAAO,CAAE,MAAO,MAAO,GACzBF,EAAO,IAAI,CAACG,EAAOC,IAClBF,GAAA,cAACG,GAAA,CAAW,IAAK,QAAUD,EAAO,MAAOD,EAAO,CACjD,CACH,CAEJ,CAEA,SAASE,GAAWX,EAAsC,CACxD,GAAM,CAAE,QAAAY,CAAQ,EAAIhB,GAAU,EAC9B,OACEY,GAAA,cAAAA,GAAA,cAAE,MAEAA,GAAA,cAAC,SAAG,EACHR,EAAM,MAAM,SAAS,MAAM,OAAS,GACnCQ,GAAA,cAAC,OAAI,UAAWI,EAAQ,SAAUZ,EAAM,MAAM,SAAS,MAAM,KAAK;AAAA,CAAI,CAAE,EAEzEA,EAAM,MAAM,QAAQ,MAAM,OAAS,GAClCQ,GAAA,cAAC,OAAI,UAAWI,EAAQ,OAAQZ,EAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,CAAI,CAAE,EACrE,MAEFQ,GAAA,cAAC,SAAG,CACN,CAEJ,CC5DA,OAAS,SAAAK,OAAa,gBACtB,OAAS,kBAAAC,GAAgB,wBAAAC,OAA4B,gBAErD,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAWpC,SAASC,GAAqBC,EAA+C,CAClF,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAAOC,CAAQ,EAAIC,GAA6BL,EAAM,OAAO,EAWpE,OATAM,GAAU,IAAM,CACV,CAACN,EAAM,SAAWA,EAAM,cAAgBA,EAAM,IAChDC,EACG,YAAYD,EAAM,aAA8BA,EAAM,EAAE,EACxD,KAAKI,CAAQ,EACb,MAAM,QAAQ,GAAG,CAExB,EAAG,CAACH,EAASD,EAAM,QAASA,EAAM,aAAcA,EAAM,EAAE,CAAC,EAEpDG,EAKHI,GAAA,cAACC,GAAA,CAAM,WAAU,GAAC,kBAAiB,IACjCD,GAAA,cAAC,aACCA,GAAA,cAAC,UACCA,GAAA,cAAC,UAAG,QAAM,EACVA,GAAA,cAAC,UAAG,MAAI,EACRA,GAAA,cAAC,UAAG,SAAO,CACb,CACF,EACAA,GAAA,cAAC,aAAOJ,EAAM,OAAO,IAAI,CAACM,EAAOC,IAAUH,GAAA,cAACI,GAAA,CAAW,IAAK,SAAWD,EAAO,MAAOD,EAAO,CAAE,CAAE,CAClG,EAbOF,GAAA,cAAC,WAAI,YAAU,CAe1B,CAMA,SAASI,GAAWX,EAAqC,CACvD,GAAM,CAAE,SAAAY,EAAU,SAAAC,CAAS,EAAIb,EAAM,MACrC,OAAIa,EAEAN,GAAA,cAAC,UACCA,GAAA,cAAC,UACCA,GAAA,cAACO,GAAA,CAAc,MAAOD,EAAS,MAAM,OAAQ,KAAM,GAAM,CAC3D,EACAN,GAAA,cAAC,UAAIQ,GAAeF,EAAS,MAAM,WAAW,CAAE,EAChDN,GAAA,cAAC,UACCA,GAAA,cAACS,GAAA,CAAY,GAAIC,GAAcJ,CAAQ,GAAIA,EAAS,MAAM,SAAU,CACtE,CACF,EAIAN,GAAA,cAAC,UACCA,GAAA,cAAC,MAAG,QAAS,GAAIW,GAAqBN,GAAU,OAAO,CAAE,CAC3D,CAGN,CAEA,SAASK,GAAcJ,EAA4B,CACjD,MAAO,IAAIA,EAAS,YAAY,IAAIA,EAAS,EAAE,aAAaA,EAAS,MAAM,SAAS,EACtF,CC1EA,OAAS,UAAAM,GAAQ,gBAAAC,GAAc,SAAAC,GAAO,QAAAC,OAAY,gBAClD,OAAS,sBAAAC,OAA0B,gBAEnC,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAQnD,IAAMC,GAAYC,GAAcC,IAAW,CACzC,UAAW,CACT,QAAS,OACT,UAAW,GACb,EAEA,KAAM,CACJ,SAAU,IACV,QAAS,GACT,YAAa,aAAaA,EAAM,OAAO,KAAK,CAAC,CAAC,EAChD,EAEA,UAAW,CACT,SAAU,IACV,QAAS,EACX,CACF,EAAE,EAOK,SAASC,GAAUC,EAA2C,CACnE,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxBM,EAAUC,EAAW,EACrBC,EAAWC,EAAYL,EAAM,QAAQ,EACrCM,EAAgBD,EAAYL,EAAM,aAAa,EAE/C,CAACO,EAAOC,CAAQ,EAAIC,GAAiB,EACrCC,EAAWC,GAAe,EAChCD,EAAS,QAAUH,EAEnB,GAAM,CAACK,EAAOC,CAAQ,EAAIJ,GAAeK,GAAc,CAAC,EAClD,CAACC,EAAMC,CAAO,EAAIP,GAAe,EACjC,CAACQ,EAAMC,CAAO,EAAIT,GAAe,EACjC,CAACU,EAAUC,CAAW,EAAIX,GAAgC,EAsBhE,GApBAY,GAAU,IAAM,CACVjB,GACFI,EAAS,CAAC,CAAC,EACXN,EACG,gBACC,OACA,IAAI,gBAAgB,CAClB,CAAC,UAAW,GAAK,IAAI,SAAS,CAAC,EAC/B,CAAC,WAAYoB,GAAmBlB,CAAQ,CAAC,EACzC,CAAC,QAAS,KAAOmB,GAASX,CAAK,CAAC,EAChC,CAAC,QAAS,KAAOY,GAAOZ,CAAK,CAAC,CAChC,CAAC,CACH,EACC,KAAKJ,CAAQ,EACb,MAAM,QAAQ,GAAG,GAEpBA,EAAS,MAAS,CAEtB,EAAG,CAACN,EAASE,EAAUQ,CAAK,CAAC,EAEzB,CAACR,GAAY,CAACG,GAAS,CAACD,EAC1B,OAAO,KAGT,IAAMmB,EAAQrB,EAAS,QAAQ,CAAC,EAEhC,OACEsB,EAAA,cAAC,OAAI,UAAWzB,EAAQ,UAAW,cAAY,aAC7CyB,EAAA,cAAC,OAAI,UAAWzB,EAAQ,MACrBwB,GAASC,EAAA,cAACC,GAAA,CAAe,MAAOF,EAAO,KAAK,KAAK,EACjDA,GACCC,EAAA,cAACE,GAAA,CAAK,KAAK,KAAK,OAAQ,KACtBF,EAAA,cAACG,GAAA,CAAa,MAAOJ,EAAO,CAC9B,EAEFC,EAAA,cAAC,SAAE,QAAM,EACRX,GAAQW,EAAA,cAAC,SAAGX,EAAK,mBAAmB,CAAE,EACtCE,GAAQS,EAAA,cAAC,SAAGI,GAAW,IAAI,KAAKb,EAAK,KAAe,CAAC,CAAE,CAC1D,EACAS,EAAA,cAAC,OAAI,UAAWzB,EAAQ,WACrB,CAACc,GACAW,EAAA,cAAC,WACCA,EAAA,cAAC,UAAG,aAAW,EACfA,EAAA,cAACK,GAAA,CAAc,MAAOxB,EAAO,cAAeM,EAAU,QAASG,EAAS,CAC1E,EAEDD,GAAQ,CAACE,GACRS,EAAA,cAAC,WACCA,EAAA,cAAC,UAAG,aAAW,EACfA,EAAA,cAACM,GAAA,KACEzB,EAAM,IAAK0B,GAAM,CAChB,IAAMC,EAAY,IAAI,KAAKD,EAAE,KAAe,EAC5C,OACEC,EAAU,QAAQ,EAAInB,EAAK,QAAQ,GACnCmB,EAAU,QAAQ,EAAInB,EAAK,QAAQ,EAAI,GAAK,KAAO,KACjDW,EAAA,cAAC,OAAI,IAAKO,EAAE,IACVP,EAAA,cAACS,GAAA,CAAO,QAAQ,UAAU,MAAO,CAAE,MAAO,GAAI,EAAG,QAAS,IAAMjB,EAAQe,CAAC,GACtEH,GAAWI,CAAS,CACvB,CACF,CAGN,CAAC,CACH,CACF,EAEDnB,GAAQE,GAAQ,CAACE,GAChBO,EAAA,cAACU,GAAA,CAAkB,cAAe9B,EAAe,iBAAkB,OAAQ,SAAUc,EAAa,EAEnGL,GAAQE,GAAQE,GACfO,EAAA,cAAC,WACCA,EAAA,cAAC,UAAG,iBAAe,EACnBA,EAAA,cAAC,SAAE,yCAAuC,CAC5C,CAEJ,CACF,CAEJ,CAEA,SAASH,GAASX,EAAqB,CACrC,OAAOyB,GAAkBzB,EAAM,QAAQ,CAAC,CAC1C,CAEA,SAASY,GAAOZ,EAAqB,CACnC,OAAOyB,GAAkBzB,EAAM,QAAQ,EAAI,GAAK,GAAK,GAAK,GAAK,GAAI,CACrE,CAEA,SAASyB,GAAkBC,EAAsB,CAC/C,OAAO,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,EAAGA,CAAI,CAAC,EAAE,YAAY,CAC1D,CAEA,SAASR,GAAWf,EAAoB,CACtC,OAAOA,EAAK,mBAAmB,CAAC,EAAG,CAAE,KAAM,UAAW,OAAQ,SAAU,CAAC,CAC3E,CC/IA,OAAS,mBAAAwB,OAAuD,gBAEhE,OAAOC,OAAW,QAOX,SAASC,GAAuBC,EAAiD,CACtF,OACEC,GAAA,cAACC,GAAA,CACC,MAAOF,EAAM,eACb,sBAAuB,MAAOG,EAAwBC,EAA4BC,IAAe,CAC/F,IAAMC,EAAM,GAAGF,CAAY,IAAIC,CAAE,GAC3BE,EAAS,IACf,OAAO,QAAQ,WAAW,CACxBJ,EAAQ,YAAY,iBAAkBE,CAAE,EACxCF,EAAQ,OAAO,gBAAiB,CAAE,WAAYG,EAAK,OAAAC,CAAO,CAAC,EAC3DJ,EAAQ,OAAO,mBAAoB,CAAE,WAAYG,EAAK,OAAAC,CAAO,CAAC,EAC9DJ,EAAQ,OAAO,QAAS,CAAE,WAAYG,EAAK,OAAAC,CAAO,CAAC,EACnDJ,EAAQ,OAAO,oBAAqB,CAAE,QAASG,EAAK,OAAAC,CAAO,CAAC,EAC5DJ,EAAQ,OAAO,OAAQ,CAAE,QAAS,eAAeG,CAAG,gBAAgBA,CAAG,kBAAkBA,CAAG,GAAI,OAAAC,CAAO,CAAC,CAC1G,CAAC,CACH,EACA,oBAAqB,CAACC,EAA0BC,EAAyBC,KAAkB,CACzF,aAAc,gBACd,OAAQ,YACR,QAAS,CAACC,GAAgBH,CAAQ,CAAC,EACnC,QAASA,EAAS,QAClB,OAAQG,GAAgBF,CAAM,EAC9B,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,QAAS,CAAC,CAAE,cAAeC,CAAK,CAAC,CACnC,GACA,YAAa,CAACF,EAA0BI,EAA2BC,KAAyB,CAC1F,aAAc,QACd,OAAQ,YACR,QAAS,CAACF,GAAgBH,CAAQ,CAAC,EACnC,QAASA,EAAS,QAClB,SAAUG,GAAgBC,CAAQ,EAClC,OAAQ,IAAI,KAAK,EAAE,YAAY,EAC/B,QAAAC,CACF,GACF,CAEJ,CC7CA,OAAsC,6BAAAC,OAAiC,gBAEvE,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCF3C,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,UAAAC,GAAQ,SAAAC,GAAO,SAAAC,GAAO,QAAAC,GAAM,aAAAC,GAAW,SAAAC,OAAa,gBAC7E,OAAsC,6BAAAC,OAAiC,gBAEvE,OAAOC,IAAS,YAAAC,OAAgB,QAWzB,SAASC,GAAeC,EAAyC,CACtE,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAASC,CAAU,EAAIC,GAAuC,EACrE,OACEC,GAAA,cAACC,EAAA,CACC,MAAO,CAAE,SAAU,GAAI,EACvB,SAAU,MAAOC,GAAqC,CACpD,GAAI,CACFR,EAAM,mBACJ,MAAMC,EAAQ,gBAAgB,CAC5B,MAAOD,EAAM,MACb,YAAaQ,EAAS,WACxB,CAAC,CACH,CACF,OAASC,EAAK,CACZL,EAAWM,GAA0BD,CAAG,CAAC,CAC3C,CACF,GAEAH,GAAA,cAACK,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GACpCL,GAAA,cAACM,GAAA,CAAK,KAAM,GAAI,EAChBN,GAAA,cAACO,GAAA,KAAM,gBAAc,CACvB,EACAP,GAAA,cAACQ,GAAA,CAAM,QAAQ,MACbR,GAAA,cAACS,GAAA,CACC,KAAK,cACL,MAAM,eACN,YAAY,aACZ,SAAU,GACV,UAAW,GACX,MAAOC,GAAkBb,EAAS,WAAW,EAC/C,EACAG,GAAA,cAACW,GAAA,CAAK,MAAM,SAAS,KAAK,MAAK,8CACe,IAC5CX,GAAA,cAACY,GAAA,CAAO,KAAK,mCAAkC,mBAAmB,EACjE,QACDZ,GAAA,cAACY,GAAA,CAAO,KAAK,iCAAgC,wBAA0B,EAAS,GAClF,CACF,EACAZ,GAAA,cAACa,GAAA,CAAM,SAAS,QAAQ,GAAG,KAAK,OAAM,IACpCb,GAAA,cAACc,GAAA,CAAO,KAAK,UAAS,gBAAc,CACtC,CACF,CAEJ,CC1DA,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,UAAAC,GAAQ,YAAAC,GAAU,WAAAC,GAAS,SAAAC,GAAO,iBAAAC,GAAe,SAAAC,GAAO,QAAAC,GAAM,aAAAC,OAAiB,gBACxG,OAAgE,6BAAAC,OAAiC,gBAEjG,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QCF3C,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCI5C,SAASC,GAAgBC,EAAaC,EAA2B,CACtE,IAAMC,EAAO,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC9CC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ,GACfA,EAAO,IAAMH,EACbG,EAAO,OAASF,GAAU,KAC1BC,EAAK,YAAYC,CAAM,CACzB,CDSO,SAASC,GAAaC,EAA8C,CACzE,IAAMC,EAAUC,EAAW,EACrB,CAAE,eAAAC,EAAgB,uBAAAC,CAAuB,EAAIJ,EAC7CK,EAAYC,GAAuB,IAAI,EACvC,CAACC,EAAcC,CAAe,EAAIC,GAAkB,OAAO,OAAW,GAAW,EACjF,CAACC,EAAaC,CAAc,EAAIF,GAAkB,EAAK,EACvD,CAACG,EAAgBC,CAAiB,EAAIJ,GAAkB,EAAK,EAsBnE,OApBAK,GAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,CACjCC,GAAgB,yCAA0C,IAAMP,EAAgB,EAAI,CAAC,EACrF,MACF,CAEKE,IACH,OAAO,SAAS,GAAG,WAAW,CAC5B,UAAWP,EACX,SAAUC,CACZ,CAAC,EACDO,EAAe,EAAI,GAGjBN,EAAU,SAAW,CAACO,IACxB,OAAO,SAAS,GAAG,aAAaP,EAAU,QAAS,CAAC,CAAC,EACrDQ,EAAkB,EAAI,EAE1B,EAAG,CAACZ,EAASE,EAAgBO,EAAaH,EAAcF,EAAWO,EAAgBR,CAAsB,CAAC,EAErGD,EAIEa,GAAA,cAAC,OAAI,IAAKX,EAAW,EAHnB,IAIX,CAEO,SAASY,GAAkBC,EAAkD,CAClF,GAAIA,EACF,OAAOA,EAGT,GAAI,OAAO,OAAW,IAAa,CACjC,IAAMC,EAAS,OAAO,SAAS,SAAW,KAAO,OAAO,SAAS,KAEjE,IAD0B,aAAiC,MAAM,GAAG,GAAK,CAAC,GACpD,SAASA,CAAM,EACnC,MAAO,sBAEX,CAGF,CE/DO,SAASC,GAAcC,EAAuB,CAC/C,OAAO,WAAe,KACxBC,GAAgB,kDAAoDD,CAAO,CAE/E,CAOO,SAASE,GAAaF,EAAkC,CAC7D,OAAO,IAAI,QAAQ,CAACG,EAASC,IAAW,CACtC,WAAW,MAAM,SAAY,CAC3B,GAAI,CACFD,EAAQ,MAAM,WAAW,QAAQH,EAAS,CAAE,OAAQ,QAAS,CAAC,CAAC,CACjE,OAASK,EAAK,CACZD,EAAOC,CAAG,CACZ,CACF,CAAC,CACH,CAAC,CACH,CHRO,SAASC,GAAYC,EAAsC,CAChE,IAAMC,EAAiBC,GAAkBF,EAAM,cAAc,EACvDG,EAAmBH,EAAM,iBACzBI,EAAUC,EAAW,EACrB,CAACC,EAASC,CAAU,EAAIC,GAA2B,EACnDC,EAASC,GAAuBJ,EAAS,MAAS,EAExD,OAAAK,GAAU,IAAM,CACVR,GACFS,GAAcT,CAAgB,CAElC,EAAG,CAACA,CAAgB,CAAC,EAGnBU,EAAA,cAACC,EAAA,CACC,MAAO,CAAE,SAAU,GAAI,EACvB,SAAU,MAAOC,GAAqC,CACpD,GAAI,CACF,IAAIC,EAAiB,GACjBb,IACFa,EAAiB,MAAMC,GAAad,CAAgB,GAEtDH,EAAM,mBACJ,MAAMI,EAAQ,aAAa,CACzB,UAAWJ,EAAM,UACjB,SAAUA,EAAM,SAChB,UAAWe,EAAS,UACpB,SAAUA,EAAS,SACnB,MAAOA,EAAS,MAChB,SAAUA,EAAS,SACnB,SAAUA,EAAS,WAAa,OAChC,iBAAAZ,EACA,eAAAa,CACF,CAAC,CACH,CACF,OAASE,EAAK,CACZX,EAAWY,GAA0BD,CAAG,CAAC,CAC3C,CACF,GAEAL,EAAA,cAACO,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GAAIpB,EAAM,QAAS,EACzDa,EAAA,cAACQ,GAAA,CAAsB,OAAQZ,EAAQ,EACtCR,GACCY,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACS,GAAA,CAAM,SAAS,SAAS,EAAE,KAAK,MAAO,CAAE,OAAQ,EAAG,GAClDT,EAAA,cAACU,GAAA,CACC,eAAgBtB,EAChB,uBAAwB,MAAOuB,GAAuC,CACpE,GAAI,CACFxB,EAAM,mBACJ,MAAMI,EAAQ,iBAAiB,CAC7B,eAAgBoB,EAAS,SACzB,iBAAkBA,EAAS,WAC3B,WAAY,EACd,CAAC,CACH,CACF,OAASN,EAAK,CACZX,EAAWY,GAA0BD,CAAG,CAAC,CAC3C,CACF,EACF,CACF,EACAL,EAAA,cAACY,GAAA,CAAQ,MAAM,KAAK,cAAc,SAAS,GAAG,KAAK,CACrD,EAEFZ,EAAA,cAACa,GAAA,CAAM,QAAQ,MACbb,EAAA,cAACc,GAAA,CACC,KAAK,YACL,KAAK,OACL,MAAM,aACN,YAAY,aACZ,SAAU,GACV,UAAW,GACX,MAAOC,GAAkBtB,EAAS,WAAW,EAC/C,EACAO,EAAA,cAACc,GAAA,CACC,KAAK,WACL,KAAK,OACL,MAAM,YACN,YAAY,YACZ,SAAU,GACV,MAAOC,GAAkBtB,EAAS,UAAU,EAC9C,EACAO,EAAA,cAACc,GAAA,CACC,KAAK,QACL,KAAK,QACL,MAAM,QACN,YAAY,kBACZ,SAAU,GACV,MAAOC,GAAkBtB,EAAS,OAAO,EAC3C,EACAO,EAAA,cAACgB,GAAA,CACC,KAAK,WACL,MAAM,WACN,aAAa,MACb,SAAU,GACV,MAAOD,GAAkBtB,EAAS,UAAU,EAC9C,EACAO,EAAA,cAACiB,GAAA,CAAK,MAAM,SAAS,KAAK,MAAK,8CACe,IAC5CjB,EAAA,cAACkB,GAAA,CAAO,KAAK,mCAAkC,mBAAmB,EACjE,QACDlB,EAAA,cAACkB,GAAA,CAAO,KAAK,iCAAgC,wBAA0B,EAAS,GAClF,EACAlB,EAAA,cAACiB,GAAA,CAAK,MAAM,SAAS,KAAK,MAAK,qDACsB,IACnDjB,EAAA,cAACkB,GAAA,CAAO,KAAK,uCAAsC,mBAAmB,EACrE,QACDlB,EAAA,cAACkB,GAAA,CAAO,KAAK,qCAAoC,wBAA0B,EAAS,SACtF,CACF,EACAlB,EAAA,cAACS,GAAA,CAAM,SAAS,QAAQ,GAAG,KAAK,OAAM,IACpCT,EAAA,cAACmB,GAAA,CAAS,KAAK,WAAW,MAAM,cAAc,KAAK,KAAK,EACxDnB,EAAA,cAACoB,GAAA,CAAO,KAAK,UAAS,gBAAc,CACtC,CACF,CAEJ,CFvHO,SAASC,GAAaC,EAAuC,CAClE,GAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,SAAAC,EAAU,eAAAC,EAAgB,iBAAAC,EAAkB,UAAAC,CAAU,EAAIN,EAC7EO,EAAUC,EAAW,EACrB,CAACC,EAAOC,CAAQ,EAAIC,GAA6B,MAAS,EAC1D,CAACC,EAASC,CAAU,EAAIF,GAA2B,EAEzDG,GAAU,IAAM,CACVb,IAAS,WAAaQ,GACxBF,EACG,gBAAgB,CAAE,MAAAE,EAAO,UAAWP,CAAoB,CAAC,EACzD,KAAMa,GAAaR,EAAQ,YAAYQ,EAAS,IAAc,CAAC,EAC/D,KAAK,IAAMT,EAAU,CAAC,EACtB,MAAOU,GAAQH,EAAWI,GAA0BD,CAAG,CAAC,CAAC,CAEhE,EAAG,CAACT,EAASN,EAAMC,EAAWO,EAAOH,CAAS,CAAC,EAE/C,SAASY,EAAmBH,EAA6C,CACnEA,EAAS,KACXR,EACG,YAAYQ,EAAS,IAAI,EACzB,KAAK,IAAMT,EAAU,CAAC,EACtB,MAAM,QAAQ,GAAG,EACXS,EAAS,OAClBL,EAASK,EAAS,KAAK,CAE3B,CAEA,OACEI,GAAA,cAACC,GAAA,CAAS,MAAO,KACdR,GAAWO,GAAA,cAAC,WAAK,KAAK,UAAUP,EAAS,KAAM,CAAC,CAAE,EAClD,CAACH,GACAU,GAAA,cAACE,GAAA,CACC,UAAWnB,EACX,SAAUC,EACV,eAAgBC,EAChB,iBAAkBC,EAClB,mBAAoBa,GAEnBlB,EAAM,QACT,EAEDS,GAASR,IAAS,WAAakB,GAAA,cAACG,GAAA,CAAe,MAAOb,EAAO,mBAAoBS,EAAoB,CACxG,CAEJ,CM9DA,OAAS,oBAAAK,OAAwB,yBACjC,OAAwD,wBAAAC,OAA4B,gBAEpF,OAAOC,IAAS,eAAAC,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QCHxD,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,UAAAC,GAAQ,YAAAC,GAAU,WAAAC,GAAS,SAAAC,GAAO,iBAAAC,GAAe,SAAAC,GAAO,aAAAC,OAAiB,gBAClG,OAKE,6BAAAC,OACK,gBAEP,OAAOC,GAAS,eAAAC,GAAa,YAAAC,OAAgB,QAgBtC,SAASC,GAAmBC,EAA6C,CAC9E,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAiB,EAE3C,OAAKF,EAGIG,EAAA,cAACC,GAAA,CAAa,MAAOJ,EAAQ,GAAGD,EAAO,EAFvCI,EAAA,cAACE,GAAA,CAAU,SAAUJ,EAAW,GAAGF,EAAO,CAIrD,CAWO,SAASM,GAAUN,EAAoC,CAC5D,GAAM,CAAE,SAAAE,EAAU,WAAAK,EAAY,mBAAAC,EAAoB,SAAAC,EAAU,iBAAAC,EAAkB,GAAGC,CAAiB,EAAIX,EAChGY,EAAUC,EAAW,EACrBC,EAAiB,CAACd,EAAM,mBAAqBe,GAAkBf,EAAM,cAAc,EAEnFgB,EAAiBC,GACrB,MAAOC,GAAsC,CAC3C,GAAI,CAACA,EAAW,aACd,MAAO,GAGT,IAAMC,EAAQ,KAAK,UAAU,CAC3B,GAAI,MAAMP,EAAQ,oBAAoBD,CAAgB,EACtD,OAAQO,EAAW,MACrB,CAAC,EACKE,EAAM,IAAI,IAAIF,EAAW,YAAY,EAC3C,OAAAE,EAAI,aAAa,IAAI,QAASD,CAAK,EACnC,OAAO,SAAS,OAAOC,EAAI,SAAS,CAAC,EAC9B,EACT,EACA,CAACR,EAASD,CAAgB,CAC5B,EAEMU,EAAeJ,GACnB,MAAOK,GAAqC,CAC1C,IAAMJ,EAAa,MAAMN,EAAQ,KAAK,cAAe,CAAE,MAAOU,EAAS,KAAM,CAAC,EACxE,MAAMN,EAAeE,CAAU,GACnChB,EAASoB,EAAS,KAAK,CAE3B,EACA,CAACV,EAASI,EAAgBd,CAAQ,CACpC,EAEMqB,EAAyBN,GAC7B,MAAOO,GAAuC,CAC5C,IAAMC,EAAe,MAAMb,EAAQ,iBAAiB,CAClD,GAAGD,EACH,iBAAkBa,EAAS,UAC7B,CAAuB,EACjB,MAAMR,EAAeS,CAAY,GACrCjB,EAAmBiB,CAAY,CAEnC,EACA,CAACb,EAASD,EAAkBK,EAAgBR,CAAkB,CAChE,EAEA,OACEJ,EAAA,cAACsB,EAAA,CAAK,MAAO,CAAE,SAAU,GAAI,EAAG,SAAUL,GACxCjB,EAAA,cAACuB,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GAAIlB,CAAS,EAClDK,GACCV,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACwB,GAAA,CAAM,SAAS,SAAS,EAAE,KAAK,MAAO,CAAE,OAAQ,EAAG,GAClDxB,EAAA,cAACyB,GAAA,CAAa,eAAgBf,EAAgB,uBAAwBS,EAAwB,CAChG,EACC,CAACb,GAAoBN,EAAA,cAAC0B,GAAA,CAAQ,MAAM,KAAK,cAAc,SAAS,GAAG,KAAK,CAC3E,EAED,CAACpB,GACAN,EAAA,cAAC2B,GAAA,CACC,KAAK,QACL,KAAK,QACL,MAAM,QACN,YAAY,kBACZ,SAAU,GACV,UAAW,GACb,EAEF3B,EAAA,cAACwB,GAAA,CAAM,SAAS,QAAQ,GAAG,KAAK,QAAS,EAAG,OAAM,IAChDxB,EAAA,cAAC,WACEG,GACCH,EAAA,cAAC4B,GAAA,CAAO,UAAU,SAAS,KAAK,SAAS,MAAM,SAAS,QAASzB,EAAY,KAAK,MAAK,UAEvF,CAEJ,EACC,CAACG,GAAoBN,EAAA,cAAC6B,GAAA,CAAO,KAAK,UAAS,MAAI,CAClD,CACF,CAEJ,CASO,SAAS5B,GAAaL,EAAuC,CAClE,GAAM,CAAE,iBAAAkC,EAAkB,mBAAA1B,EAAoB,SAAAC,EAAU,GAAGE,CAAiB,EAAIX,EAC1EY,EAAUC,EAAW,EACrB,CAACsB,EAASC,CAAU,EAAIjC,GAA2B,EACnDkC,EAASC,GAAuBH,EAAS,MAAS,EAElDd,EAAeJ,GAClBK,GAAqC,CACpCV,EACG,WAAW,CACV,GAAGD,EACH,SAAUW,EAAS,SACnB,SAAUA,EAAS,WAAa,IAClC,CAAC,EACA,KAAKd,CAAkB,EACvB,MAAO+B,GAAQH,EAAWI,GAA0BD,CAAG,CAAC,CAAC,CAC9D,EACA,CAAC3B,EAASD,EAAkBH,CAAkB,CAChD,EAEA,OACEJ,EAAA,cAACsB,EAAA,CAAK,MAAO,CAAE,SAAU,GAAI,EAAG,SAAUL,GACxCjB,EAAA,cAACuB,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GAAIlB,CAAS,EACnDL,EAAA,cAACqC,GAAA,CAAsB,OAAQJ,EAAQ,EACvCjC,EAAA,cAACsC,GAAA,CAAM,QAAQ,MACbtC,EAAA,cAACuC,GAAA,CACC,KAAK,WACL,MAAM,WACN,aAAa,MACb,SAAU,GACV,UAAW,GACX,MAAOC,GAAkBT,EAAS,UAAU,EAC9C,CACF,EACA/B,EAAA,cAACwB,GAAA,CAAM,SAAS,QAAQ,GAAG,KAAK,QAAS,EAAG,OAAM,IAC/CM,GACC9B,EAAA,cAAC4B,GAAA,CAAO,UAAU,SAAS,KAAK,SAAS,MAAM,SAAS,QAASE,EAAkB,KAAK,MAAK,iBAE7F,EAEF9B,EAAA,cAACyC,GAAA,CAAS,GAAG,WAAW,KAAK,WAAW,MAAM,cAAc,KAAK,KAAK,GAAI,CAAE,WAAY,CAAE,EAAG,EAC7FzC,EAAA,cAAC6B,GAAA,CAAO,KAAK,UAAS,SAAO,CAC/B,CACF,CAEJ,CCjLA,OAAS,UAAAa,GAAQ,UAAAC,GAAQ,SAAAC,GAAO,SAAAC,GAAO,QAAAC,GAAM,SAAAC,GAAO,kBAAAC,OAAsB,gBAC1E,OAAsC,6BAAAC,OAAiC,gBAEvE,OAAOC,IAAS,YAAAC,OAAgB,QAWzB,SAASC,GAAkBC,EAA4C,CAC5E,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAASC,CAAU,EAAIC,GAA2B,EACzD,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GACpCF,GAAA,cAACG,GAAA,CAAK,KAAM,GAAI,EAChBH,GAAA,cAACI,GAAA,CAAM,MAAO,GAAG,gBAAc,CACjC,EACAJ,GAAA,cAACK,GAAA,CAAsB,QAASR,EAAS,EACxCH,EAAM,YAAY,IAAKY,GACtBN,GAAA,cAACO,GAAA,CACC,IAAKD,EAAW,GAChB,QAAS,IAAM,CACbX,EACG,KAAK,eAAgB,CACpB,MAAOD,EAAM,MACb,QAASY,EAAW,EACtB,CAAC,EACA,KAAKZ,EAAM,kBAAkB,EAC7B,MAAOc,GAAQV,EAAWW,GAA0BD,CAAG,CAAC,CAAC,CAC9D,GAEAR,GAAA,cAACU,GAAA,KACCV,GAAA,cAACW,GAAA,CAAO,OAAO,KAAK,EACpBX,GAAA,cAAC,OAAI,MAAO,CAAE,KAAM,CAAE,GACpBA,GAAA,cAACY,GAAA,CAAK,KAAK,KAAK,OAAQ,KACrBN,EAAW,SAAS,OACvB,EACAN,GAAA,cAACY,GAAA,CAAK,MAAM,SAAS,KAAK,MACvBN,EAAW,SAAS,OACvB,CACF,CACF,CACF,CACD,CACH,CAEJ,CCpDA,OAAS,UAAAO,GAAQ,UAAAC,GAAQ,YAAAC,GAAU,SAAAC,GAAO,SAAAC,GAAO,SAAAC,OAAa,gBAE9D,OAAOC,OAAW,QAWX,SAASC,GAAgBC,EAA0C,CACxE,IAAMC,EAAUC,EAAW,EAC3B,OACEC,GAAA,cAACC,EAAA,CACC,MAAO,CAAE,SAAU,GAAI,EACvB,SAAWC,GAAqC,CAC9CJ,EACG,KAAK,aAAc,CAClB,MAAOD,EAAM,MACb,MAAO,OAAO,KAAKK,CAAQ,EAAE,KAAK,GAAG,CACvC,CAAC,EACA,KAAKL,EAAM,kBAAkB,EAC7B,MAAM,QAAQ,GAAG,CACtB,GAEAG,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GACpCJ,GAAA,cAACK,GAAA,CAAK,KAAM,GAAI,EAChBL,GAAA,cAACM,GAAA,KAAM,cAAY,CACrB,EACAN,GAAA,cAACG,GAAA,MACGN,EAAM,OAAS,UAAU,MAAM,GAAG,EAAE,IAAKU,GACzCP,GAAA,cAACQ,GAAA,CAAS,IAAKD,EAAW,GAAIA,EAAW,KAAMA,EAAW,MAAOA,EAAW,eAAc,GAAC,CAC5F,CACH,EACAP,GAAA,cAACS,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBT,GAAA,cAACU,GAAA,CAAO,KAAK,UAAS,WAAS,CACjC,CACF,CACF,CAEJ,CC5CA,OAAS,SAAAC,GAAO,UAAAC,GAAQ,UAAAC,GAAQ,SAAAC,GAAO,SAAAC,GAAO,aAAAC,GAAW,SAAAC,OAAa,gBACtE,OAAsC,wBAAAC,OAA4B,gBAElE,OAAOC,IAAS,YAAAC,OAAgB,QAUzB,SAASC,GAAQC,EAAkC,CACxD,IAAMC,EAAUC,EAAW,EACrB,CAACC,EAAcC,CAAe,EAAIC,GAA6B,MAAS,EAC9E,OACEC,GAAA,cAACC,EAAA,CACC,MAAO,CAAE,SAAU,GAAI,EACvB,SAAWC,GAAqC,CAC9CJ,EAAgB,MAAS,EACzBH,EACG,KAAK,kBAAmB,CACvB,MAAOD,EAAM,MACb,MAAOQ,EAAS,KAClB,CAAC,EACA,KAAKR,EAAM,kBAAkB,EAC7B,MAAOS,GAAQL,EAAgBM,GAAqBD,CAAG,CAAC,CAAC,CAC9D,GAEAH,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAO,GAAI,CAAE,cAAe,QAAS,GACpCN,GAAA,cAACO,GAAA,CAAK,KAAM,GAAI,EAChBP,GAAA,cAACQ,GAAA,KAAM,gBAAc,CACvB,EACCX,GACCG,GAAA,cAACS,GAAA,CAAM,KAAMT,GAAA,cAACU,GAAA,CAAgB,KAAM,GAAI,EAAI,MAAM,QAAQ,MAAM,OAC7Db,CACH,EAEFG,GAAA,cAACK,GAAA,KACCL,GAAA,cAACW,GAAA,CAAU,KAAK,QAAQ,MAAM,WAAW,SAAQ,GAAC,CACpD,EACAX,GAAA,cAACY,GAAA,CAAM,SAAS,QAAQ,GAAG,MACzBZ,GAAA,cAACa,GAAA,CAAO,KAAK,UAAS,aAAW,CACnC,CACF,CACF,CAEJ,CJbO,SAASC,GAAWC,EAAqC,CAC9D,GAAM,CACJ,MAAOC,EACP,aAAAC,EACA,UAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,OAAAC,EACA,GAAGC,CACL,EAAIP,EACEQ,EAAUC,EAAW,EACrB,CAACC,EAAOC,CAAQ,EAAIC,GAA6B,MAAS,EAC1D,CAACC,EAAaC,CAAwB,EAAIF,GAAkB,EAAK,EACjE,CAACG,EAAaC,CAAc,EAAIJ,GAA0C,MAAS,EAEnFK,EAAaC,GAChBC,GAAuB,CAClBb,EACFA,EAAOa,CAAI,EAEXX,EACG,YAAYW,CAAI,EAChB,KAAK,IAAM,CACNhB,GACFA,EAAU,CAEd,CAAC,EACA,MAAOiB,GAAQC,GAAiB,CAAE,MAAO,MAAO,QAASC,GAAqBF,CAAG,CAAE,CAAC,CAAC,CAE5F,EACA,CAACZ,EAASF,EAAQH,CAAS,CAC7B,EAEMoB,EAAqBL,GACxBM,GAAgD,CAC/CV,EAAyB,CAAC,CAACU,EAAS,WAAW,EAE3CA,EAAS,OACXb,EAASa,EAAS,KAAK,EAGrBA,EAAS,aACXR,EAAeQ,EAAS,WAAW,EAGjCA,EAAS,OACPtB,EACFc,EAAe,MAAS,EAExBC,EAAWO,EAAS,IAAc,EAGxC,EACA,CAACtB,EAAce,CAAU,CAC3B,EAEMQ,EAAsBP,GACzBM,GAAgD,CAC/CP,EAAWO,EAAS,IAAc,CACpC,EACA,CAACP,CAAU,CACb,EAEA,OAAAS,GAAU,IAAM,CAKVzB,GAAa,CAACS,GAChBF,EACG,IAAI,cAAgBP,CAAS,EAC7B,KAAKsB,CAAkB,EACvB,MAAOH,GAAQC,GAAiB,CAAE,MAAO,MAAO,QAASC,GAAqBF,CAAG,CAAE,CAAC,CAAC,CAE5F,EAAG,CAACZ,EAASP,EAAWS,EAAOa,CAAkB,CAAC,EAGhDI,GAAA,cAACC,GAAA,CAAS,MAAO,MACb,IACKlB,EAaMG,EACFc,GAAA,cAACE,GAAA,CAAQ,MAAOnB,EAAO,mBAAoBa,EAAoB,EAC7DR,EACFY,GAAA,cAACG,GAAA,CAAkB,MAAOpB,EAAO,YAAaK,EAAa,mBAAoBQ,EAAoB,EACjGvB,EAAM,YAAc,MACtB2B,GAAA,cAACI,GAAA,CAAe,MAAOrB,EAAO,mBAAoBa,EAAoB,EACpEvB,EAAM,aACR2B,GAAA,cAACK,GAAA,CAAgB,MAAOtB,EAAO,MAAOV,EAAM,MAAO,mBAAoByB,EAAqB,EAE5FE,GAAA,cAAC,WAAI,SAAO,EApBjBA,GAAA,cAACM,GAAA,CACC,iBAAkB7B,EAClB,WAAYC,EACZ,mBAAoBkB,EACpB,kBAAmBvB,EAAM,kBACzB,iBAAkBA,EAAM,iBACvB,GAAGO,GAEHP,EAAM,QACT,GAaH,CACL,CAEJ",
|
|
6
|
-
"names": ["formatAddress", "React", "AddressDisplay", "props", "address", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "getLine", "address", "index", "setLine", "str", "line", "AddressInput", "props", "value", "setValue", "valueRef", "setValueWrapper", "newValue", "setUse", "use", "setType", "type", "setLine1", "line1", "setLine2", "line2", "setCity", "city", "setState", "state", "setPostalCode", "postalCode", "e", "TextInput", "createReference", "React", "useRef", "useState", "showNotification", "React", "createContext", "useContext", "useEffect", "useMemo", "useState", "reactContext", "MedplumProvider", "props", "medplum", "navigate", "defaultNavigate", "state", "setState", "eventListener", "medplumContext", "useMedplumContext", "useMedplum", "useMedplumNavigate", "useMedplumProfile", "path", "AnnotationInput", "props", "author", "useMedplumProfile", "value", "setValue", "useState", "valueRef", "useRef", "setText", "text", "newValue", "createReference", "React", "TextInput", "e", "MantineAppShell", "useMantineTheme", "React", "Suspense", "useState", "Alert", "normalizeErrorString", "defaultAttributes", "createReactComponent", "iconName", "iconNamePascal", "iconNode", "Component", "forwardRef", "_a", "ref", "_b", "color", "size", "stroke", "children", "rest", "__objRest", "createElement", "__spreadValues", "__spreadProps", "defaultAttributes", "tag", "attrs", "PropTypes", "IconAdjustmentsHorizontal", "createReactComponent", "IconAlertCircle", "createReactComponent", "IconBleachOff", "createReactComponent", "IconBleach", "createReactComponent", "IconBoxMultiple", "createReactComponent", "IconBracketsContain", "createReactComponent", "IconBucketOff", "createReactComponent", "IconBucket", "createReactComponent", "IconCalendar", "createReactComponent", "IconCheck", "createReactComponent", "IconCheckbox", "createReactComponent", "IconChevronDown", "createReactComponent", "IconCircleMinus", "createReactComponent", "IconCirclePlus", "createReactComponent", "IconCloudUpload", "createReactComponent", "IconColumns", "createReactComponent", "IconCopy", "createReactComponent", "IconCurrencyDollar", "createReactComponent", "IconDots", "createReactComponent", "IconEdit", "createReactComponent", "IconEqualNot", "createReactComponent", "IconEqual", "createReactComponent", "IconFileAlert", "createReactComponent", "IconFilePlus", "createReactComponent", "IconFilter", "createReactComponent", "IconListDetails", "createReactComponent", "IconLogout", "createReactComponent", "IconMathGreater", "createReactComponent", "IconMathLower", "createReactComponent", "IconMessage", "createReactComponent", "IconPin", "createReactComponent", "IconPinnedOff", "createReactComponent", "IconPlus", "createReactComponent", "IconRefresh", "createReactComponent", "IconSearch", "createReactComponent", "IconSettings", "createReactComponent", "IconSortAscending", "createReactComponent", "IconSortDescending", "createReactComponent", "IconSquare", "createReactComponent", "IconSwitchHorizontal", "createReactComponent", "IconTableExport", "createReactComponent", "IconTrash", "createReactComponent", "IconX", "createReactComponent", "React", "ErrorBoundary", "props", "error", "errorInfo", "Alert", "IconAlertCircle", "normalizeErrorString", "Center", "Loader", "React", "Loading", "Avatar", "createStyles", "Group", "MantineHeader", "Menu", "Stack", "Text", "UnstyledButton", "formatHumanName", "getReferenceString", "React", "useState", "formatHumanName", "React", "HumanNameDisplay", "props", "name", "Avatar", "getDisplayString", "getImageSrc", "React", "Anchor", "isReference", "isResource", "React", "killEvent", "isCheckboxCell", "el", "isCheckboxElement", "children", "MedplumLink", "props", "navigate", "useMedplumNavigate", "to", "suffix", "label", "onClick", "children", "rest", "href", "getHref", "React", "Anchor", "e", "killEvent", "getStringHref", "isResource", "getResourceHref", "isReference", "getReferenceHref", "deepEquals", "isReference", "isResource", "normalizeOperationOutcome", "useCallback", "useEffect", "useState", "useResource", "value", "setOutcome", "medplum", "useMedplum", "resource", "setResource", "useState", "getInitialResource", "setResourceIfChanged", "useCallback", "r", "deepEquals", "useEffect", "subscribed", "isReference", "err", "normalizeOperationOutcome", "isResource", "ResourceAvatar", "props", "resource", "useResource", "text", "getDisplayString", "imageUrl", "getImageSrc", "radius", "avatarProps", "React", "MedplumLink", "Avatar", "createStyles", "Group", "Text", "formatHumanName", "getDisplayString", "getReferenceString", "isUUID", "React", "forwardRef", "useCallback", "Loader", "MultiSelect", "React", "useCallback", "useEffect", "useRef", "useState", "showNotification", "normalizeErrorString", "AsyncAutocomplete", "props", "defaultValue", "toKey", "toOption", "loadOptions", "onChange", "onCreate", "creatable", "rest", "defaultItems", "toDefaultItems", "inputRef", "useRef", "lastValue", "setLastValue", "useState", "timer", "setTimer", "abortController", "setAbortController", "autoSubmit", "setAutoSubmit", "selected", "setSelected", "options", "setOptions", "lastValueRef", "timerRef", "abortControllerRef", "autoSubmitRef", "optionsRef", "handleTimer", "useCallback", "value", "newAbortController", "newValues", "err", "showNotification", "normalizeErrorString", "handleSearchChange", "newTimer", "handleChange", "values", "result", "newSelected", "option", "item", "handleKeyDown", "e", "killEvent", "handleCreate", "input", "handleFilter", "_value", "useEffect", "React", "MultiSelect", "Loader", "useStyles", "createStyles", "toKey", "resource", "toOption", "getDisplayString", "HeaderSearchInput", "props", "classes", "navigate", "useMedplumNavigate", "medplum", "useMedplum", "loadData", "useCallback", "input", "signal", "query", "buildGraphQLQuery", "options", "response", "getResourcesFromResponse", "handleSelect", "item", "getReferenceString", "React", "AsyncAutocomplete", "IconSearch", "ItemComponent", "forwardRef", "others", "ref", "helpText", "Group", "ResourceAvatar", "Text", "escaped", "isUUID", "resources", "sortByRelevance", "dedupeResources", "ids", "result", "a", "b", "getResourceScore", "bestScore", "identifier", "getStringScore", "name", "formatHumanName", "str", "index", "useStyles", "createStyles", "theme", "Header", "props", "context", "useMedplumContext", "medplum", "profile", "navigate", "logins", "classes", "cx", "userMenuOpened", "setUserMenuOpened", "useState", "React", "MantineHeader", "Group", "UnstyledButton", "HeaderSearchInput", "Menu", "o", "ResourceAvatar", "Text", "formatHumanName", "IconChevronDown", "Stack", "HumanNameDisplay", "login", "getReferenceString", "Avatar", "IconSwitchHorizontal", "IconSettings", "IconLogout", "Button", "createStyles", "MantineNavbar", "ScrollArea", "Space", "Text", "React", "useState", "Button", "Group", "Modal", "NativeSelect", "Stack", "TextInput", "showNotification", "deepClone", "normalizeErrorString", "React", "React", "parseForm", "form", "result", "element", "parseInputElement", "parseSelectElement", "el", "Form", "props", "React", "e", "formData", "parseForm", "BookmarkDialog", "props", "medplum", "useMedplum", "config", "submitHandler", "formData", "menuname", "name", "target", "newConfig", "deepClone", "title", "res", "showNotification", "err", "normalizeErrorString", "React", "Modal", "Form", "Stack", "SelectMenu", "TextInput", "Group", "Button", "userConfigToMenu", "menu", "menus", "NativeSelect", "React", "useState", "React", "useCallback", "toKey", "element", "getDisplay", "item", "toOption", "createValue", "input", "ValueSetAutocomplete", "props", "medplum", "useMedplum", "elementDefinition", "creatable", "clearable", "rest", "loadValues", "useCallback", "signal", "system", "valueSetElements", "newData", "valueSetElement", "React", "AsyncAutocomplete", "query", "CodeInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newCode", "valueSetElementToCode", "React", "ValueSetAutocomplete", "codeToValueSetElement", "code", "element", "useStyles", "createStyles", "theme", "Navbar", "props", "classes", "navigate", "useMedplumNavigate", "activeLink", "getActiveLink", "bookmarkDialogVisible", "setBookmarkDialogVisible", "useState", "onLinkClick", "e", "to", "navigateResourceType", "resourceType", "React", "MantineNavbar", "ScrollArea", "CodeInput", "newValue", "menu", "Text", "link", "NavbarLink", "NavLinkIcon", "Button", "IconPlus", "BookmarkDialog", "cx", "MedplumLink", "Space", "currentPathname", "currentSearchParams", "menus", "bestLink", "bestScore", "score", "getLinkScore", "linkHref", "linkUrl", "ignoredParams", "key", "value", "count", "AppShell", "props", "theme", "useMantineTheme", "navbarOpen", "setNavbarOpen", "useState", "medplum", "useMedplum", "profile", "useMedplumProfile", "setNavbarOpenWrapper", "open", "closeNavbar", "toggleNavbar", "React", "Loading", "MantineAppShell", "Header", "Navbar", "ErrorBoundary", "Suspense", "React", "Anchor", "React", "AttachmentDisplay", "props", "value", "contentType", "url", "title", "AttachmentArrayDisplay", "props", "React", "v", "index", "AttachmentDisplay", "ActionIcon", "React", "useRef", "useState", "React", "useRef", "AttachmentButton", "props", "medplum", "useMedplum", "fileInputRef", "useRef", "onClick", "e", "killEvent", "onFileChange", "files", "processFile", "file", "filename", "contentType", "binary", "outcome", "React", "AttachmentArrayInput", "props", "values", "setValues", "useState", "valuesRef", "useRef", "setValuesWrapper", "newValues", "React", "v", "index", "AttachmentDisplay", "ActionIcon", "e", "killEvent", "copy", "IconCircleMinus", "AttachmentButton", "attachment", "IconCloudUpload", "Button", "React", "useState", "AttachmentInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "AttachmentDisplay", "Button", "e", "killEvent", "AttachmentButton", "getPropertyDisplayName", "globalSchema", "React", "DEFAULT_IGNORED_PROPERTIES", "createStyles", "React", "useStyles", "theme", "DescriptionList", "props", "children", "compact", "classes", "cx", "DescriptionListEntry", "formatDateTime", "formatPeriod", "formatTiming", "getElementDefinitionTypeName", "getTypedPropertyValue", "PropertyType", "React", "formatCodeableConcept", "React", "CodeableConceptDisplay", "props", "formatCoding", "React", "CodingDisplay", "props", "React", "React", "ContactPointDisplay", "props", "contactPoint", "builder", "ContactDetailDisplay", "props", "contactDetail", "React", "telecom", "ContactPointDisplay", "React", "IdentifierDisplay", "props", "formatMoney", "React", "MoneyDisplay", "props", "formatQuantity", "React", "QuantityDisplay", "props", "formatRange", "React", "RangeDisplay", "props", "React", "RatioDisplay", "props", "value", "React", "QuantityDisplay", "stringify", "React", "ReferenceDisplay", "props", "displayString", "stringify", "React", "MedplumLink", "React", "ResourceArrayDisplay", "props", "property", "values", "propertyType", "React", "v", "index", "ResourcePropertyDisplay", "ActionIcon", "Box", "CopyButton", "Tooltip", "ResourcePropertyDisplay", "props", "property", "propertyType", "value", "React", "Box", "CopyButton", "copied", "copy", "Tooltip", "ActionIcon", "IconCheck", "IconCopy", "PropertyType", "AttachmentArrayDisplay", "ResourceArrayDisplay", "ReferenceDisplay", "formatDateTime", "AddressDisplay", "AttachmentDisplay", "CodeableConceptDisplay", "CodingDisplay", "ContactDetailDisplay", "ContactPointDisplay", "HumanNameDisplay", "IdentifierDisplay", "MoneyDisplay", "formatPeriod", "QuantityDisplay", "RangeDisplay", "RatioDisplay", "formatTiming", "BackboneElementDisplay", "getElementDefinitionTypeName", "getValueAndType", "context", "path", "typedResult", "getTypedPropertyValue", "e", "BackboneElementDisplay", "props", "typedValue", "value", "typeName", "typeSchema", "globalSchema", "React", "DescriptionList", "entry", "key", "DEFAULT_IGNORED_PROPERTIES", "property", "propertyValue", "propertyType", "getValueAndType", "DescriptionListEntry", "getPropertyDisplayName", "ResourcePropertyDisplay", "Stack", "getPropertyDisplayName", "globalSchema", "React", "useState", "Group", "Input", "React", "CheckboxFormSection", "props", "Input", "React", "getErrorsForInput", "outcome", "expression", "issue", "isExpressionMatch", "getIssuesForExpression", "expr1", "expr2", "dot1", "dot2", "FormSection", "props", "React", "Input", "getErrorsForInput", "Button", "Group", "Stack", "TextInput", "capitalize", "deepClone", "React", "useEffect", "useState", "ResourceForm", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "value", "setValue", "useEffect", "deepClone", "React", "e", "Stack", "FormSection", "TextInput", "BackboneElementInput", "Group", "Button", "setPropertyValue", "obj", "key", "propName", "elementDefinition", "types", "type", "compoundKey", "capitalize", "Checkbox", "Group", "NativeSelect", "Textarea", "TextInput", "capitalize", "getElementDefinitionTypeName", "PropertyType", "React", "useState", "React", "useState", "CodeableConceptInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newConcept", "valueSetElementToCodeableConcept", "React", "ValueSetAutocomplete", "codeableConceptToValueSetElement", "concept", "c", "elements", "e", "React", "useState", "CodingInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newConcept", "valueSetElementToCoding", "React", "ValueSetAutocomplete", "codingToValueSetElement", "coding", "element", "Group", "TextInput", "React", "useRef", "useState", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "ContactPointInput", "props", "contactPoint", "setContactPoint", "ref", "setContactPointWrapper", "newValue", "setSystem", "system", "setUse", "use", "setValue", "value", "e", "ContactDetailInput", "props", "contactPoint", "setContactDetail", "useState", "ref", "useRef", "setContactDetailWrapper", "newValue", "setName", "name", "setTelecom", "telecom", "React", "Group", "TextInput", "e", "ContactPointInput", "TextInput", "isValidDate", "React", "DateTimeInput", "props", "React", "TextInput", "getInputType", "convertIsoToLocal", "getErrorsForInput", "e", "newValue", "convertLocalToIso", "isoString", "date", "isValidDate", "localString", "JsonInput", "stringify", "React", "ExtensionInput", "props", "newValue", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "HumanNameInput", "props", "value", "setValue", "valueRef", "setValueWrapper", "newValue", "setUse", "use", "setPrefix", "prefix", "setGiven", "given", "setFamily", "family", "setSuffix", "suffix", "e", "Group", "TextInput", "React", "useState", "IdentifierInput", "props", "value", "setValue", "setValueWrapper", "newValue", "e", "NativeSelect", "TextInput", "React", "useCallback", "useState", "data", "MoneyInput", "props", "onChange", "value", "setValue", "setValueWrapper", "newValue", "handleCurrencyChange", "e", "handleValueChange", "select", "NativeSelect", "TextInput", "IconCurrencyDollar", "Group", "React", "useState", "PeriodInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "DateTimeInput", "Group", "NativeSelect", "TextInput", "React", "useState", "QuantityInput", "props", "value", "setValue", "setValueWrapper", "newValue", "e", "tryParseNumber", "str", "Group", "React", "useState", "RangeInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "QuantityInput", "v", "Group", "React", "useState", "RatioInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "QuantityInput", "v", "Group", "NativeSelect", "TextInput", "createReference", "React", "useRef", "useState", "Group", "Text", "getDisplayString", "getReferenceString", "React", "forwardRef", "useCallback", "useState", "SEARCH_CODES", "NAME_RESOURCE_TYPES", "toOption", "resource", "getReferenceString", "getDisplayString", "ResourceInput", "props", "medplum", "useMedplum", "resourceType", "outcome", "setOutcome", "useState", "defaultValue", "useResource", "onChange", "loadValues", "useCallback", "input", "signal", "searchCode", "getSearchParamForResourceType", "searchParams", "handleChange", "newResources", "React", "AsyncAutocomplete", "ItemComponent", "forwardRef", "label", "others", "ref", "Group", "ResourceAvatar", "Text", "ReferenceInput", "props", "targetTypes", "getTargetTypes", "initialResourceType", "getInitialResourceType", "value", "setValue", "useState", "resourceType", "setResourceType", "valueRef", "useRef", "resourceTypeRef", "setValueHelper", "newValue", "React", "Group", "NativeSelect", "e", "TextInput", "ResourceInput", "item", "createReference", "defaultValue", "defaultValueResourceType", "ActionIcon", "React", "useRef", "useState", "ResourceArrayInput", "props", "values", "setValues", "useState", "valuesRef", "useRef", "setValuesWrapper", "newValues", "React", "v", "index", "ResourcePropertyInput", "newValue", "copy", "ActionIcon", "e", "killEvent", "IconCircleMinus", "IconCirclePlus", "Button", "Chip", "Group", "Modal", "NativeSelect", "Stack", "Switch", "TextInput", "formatTiming", "React", "useRef", "useState", "daysOfWeek", "TimingInput", "props", "value", "setValue", "useState", "open", "setOpen", "valueRef", "useRef", "React", "Group", "formatTiming", "Button", "TimingEditorDialog", "newValue", "defaultValue", "setStart", "newStart", "setRepeat", "repeat", "setPeriod", "newPeriod", "setPeriodUnit", "newPeriodUnit", "setDaysOfWeek", "newDaysOfWeek", "Modal", "Stack", "FormSection", "DateTimeInput", "Switch", "e", "TextInput", "NativeSelect", "Chip", "day", "ResourcePropertyInput", "props", "property", "propertyType", "name", "value", "PropertyType", "React", "AttachmentArrayInput", "ResourceArrayInput", "propertyTypes", "ElementDefinitionInputSelector", "ElementDefinitionTypeInput", "initialPropertyType", "t", "selectedType", "setSelectedType", "useState", "Group", "NativeSelect", "e", "type", "newValue", "capitalize", "required", "TextInput", "getErrorsForInput", "DateTimeInput", "CodeInput", "Checkbox", "Textarea", "AddressInput", "AnnotationInput", "AttachmentInput", "CodeableConceptInput", "CodingInput", "ContactDetailInput", "ContactPointInput", "ExtensionInput", "HumanNameInput", "IdentifierInput", "MoneyInput", "PeriodInput", "QuantityInput", "RangeInput", "RatioInput", "ReferenceInput", "getTargetTypes", "TimingInput", "BackboneElementInput", "getElementDefinitionTypeName", "p", "BackboneElementInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "typeName", "typeSchema", "globalSchema", "React", "typedValue", "Stack", "entry", "key", "DEFAULT_IGNORED_PROPERTIES", "property", "propertyValue", "propertyType", "getValueAndType", "required", "CheckboxFormSection", "getPropertyDisplayName", "ResourcePropertyInput", "propName", "setPropertyValue", "FormSection", "Button", "createStyles", "Group", "React", "useMemo", "useState", "useStyles", "theme", "getMonthString", "date", "CalendarInput", "props", "classes", "onChangeMonth", "onClick", "month", "setMonth", "getStartMonth", "moveMonth", "delta", "currMonth", "newMonth", "grid", "buildGrid", "week", "weekIndex", "day", "dayIndex", "result", "startDate", "slots", "d", "row", "i", "isDayAvailable", "slot", "slotStart", "MantineContainer", "createStyles", "React", "useStyles", "Container", "props", "children", "others", "classes", "React", "ActionIcon", "Center", "createStyles", "Group", "Loader", "Menu", "ScrollArea", "TextInput", "showNotification", "updateNotification", "getReferenceString", "normalizeErrorString", "React", "useCallback", "useEffect", "useRef", "useState", "createStyles", "Group", "List", "Stack", "Text", "Title", "capitalize", "formatCodeableConcept", "formatDateTime", "formatObservationValue", "isReference", "React", "useEffect", "useState", "Blockquote", "createStyles", "Stack", "React", "useStyles", "theme", "NoteDisplay", "value", "classes", "note", "Group", "React", "Text", "getDisplayString", "isOk", "normalizeErrorString", "React", "useState", "ResourceName", "props", "value", "link", "rest", "outcome", "setOutcome", "useState", "resource", "useResource", "text", "isOk", "normalizeErrorString", "getDisplayString", "React", "MedplumLink", "Text", "ResourceBadge", "props", "React", "Group", "ResourceAvatar", "ResourceName", "Badge", "React", "statusToColor", "StatusBadge", "props", "useStyles", "createStyles", "theme", "DiagnosticReportDisplay", "props", "medplum", "useMedplum", "diagnosticReport", "useResource", "specimens", "setSpecimens", "useState", "useEffect", "ref", "outcomes", "outcome", "specimenNotes", "spec", "pf", "React", "Stack", "Title", "DiagnosticReportHeader", "SpecimenInfo", "ObservationTable", "NoteDisplay", "value", "Group", "Text", "ResourceBadge", "interpreter", "performer", "formatDateTime", "capitalize", "List", "specimen", "classes", "observation", "ObservationRow", "isReference", "cx", "displayNotes", "critical", "isCritical", "MedplumLink", "CodeableConceptDisplay", "ObservationValueDisplay", "ReferenceRangeDisplay", "concept", "formatCodeableConcept", "ReferenceDisplay", "StatusBadge", "obs", "formatObservationValue", "range", "RangeDisplay", "code", "createStyles", "Paper", "useComponentDefaultProps", "React", "useStyles", "theme", "width", "fill", "defaultProps", "Panel", "props", "className", "children", "unstyled", "others", "classes", "cx", "createStyles", "getPropertyDisplayName", "stringify", "toTypedValue", "React", "useEffect", "useState", "useStyles", "createStyles", "theme", "ResourceDiffTable", "props", "classes", "medplum", "useMedplum", "schema", "setSchema", "useState", "useEffect", "typeSchema", "React", "entry", "key", "property", "originalPropertyValue", "originalPropertyType", "getValueAndType", "toTypedValue", "revisedPropertyValue", "revisedPropertyType", "isEmpty", "stringify", "getPropertyDisplayName", "ResourcePropertyDisplay", "value", "React", "useEffect", "useState", "ResourceTable", "props", "medplum", "useMedplum", "value", "useResource", "schema", "setSchema", "useState", "useEffect", "React", "BackboneElementDisplay", "ActionIcon", "Group", "Menu", "Text", "formatDateTime", "getReferenceString", "React", "Timeline", "props", "React", "Container", "TimelineItem", "resource", "profile", "padding", "popupMenuItems", "others", "author", "dateTime", "Panel", "Group", "ResourceAvatar", "Text", "ResourceName", "MedplumLink", "formatDateTime", "Menu", "ActionIcon", "getReferenceString", "IconDots", "ErrorBoundary", "sortByDateAndPriority", "resources", "timelineResource", "a", "b", "priority1", "getPriorityScore", "priority2", "getTime", "resource", "isSameResourceType", "priority", "dateTime", "useStyles", "createStyles", "theme", "ResourceTimeline", "props", "medplum", "useMedplum", "navigate", "useMedplumNavigate", "sender", "inputRef", "useRef", "resource", "useResource", "history", "setHistory", "useState", "items", "setItems", "loadTimelineResources", "itemsRef", "sortAndSetItems", "useCallback", "newItmes", "sortByDateAndPriority", "handleBatchResponse", "batchResponse", "newItems", "settledResult", "bundle", "entry", "addResource", "loadTimeline", "resourceType", "id", "useEffect", "createComment", "contentString", "result", "createMedia", "attachment", "updateNotification", "React", "IconCheck", "reason", "normalizeErrorString", "IconFileAlert", "setPriority", "communication", "priority", "onPin", "onUnpin", "onDetails", "timelineItem", "onEdit", "onDelete", "onVersionDetails", "version", "onUploadStart", "showNotification", "onUploadProgress", "e", "getProgressMessage", "Timeline", "Panel", "Form", "formData", "input", "Group", "ResourceAvatar", "TextInput", "ActionIcon", "IconMessage", "AttachmentButton", "IconCloudUpload", "item", "key", "HistoryTimelineItem", "AuditEventTimelineItem", "CommunicationTimelineItem", "DiagnosticReportTimelineItem", "MediaTimelineItem", "TimelineItem", "ResourceTable", "Center", "Loader", "TimelineItemPopupMenu", "Menu", "IconPin", "getReferenceString", "IconPinnedOff", "IconListDetails", "IconEdit", "IconTrash", "previous", "getPrevious", "ResourceDiffTable", "entries", "index", "classes", "className", "contentType", "padding", "AttachmentDisplay", "ScrollArea", "DiagnosticReportDisplay", "percent", "formatFileSize", "bytes", "DefaultResourceTimeline", "props", "React", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "_count", "React", "Document", "props", "children", "others", "React", "Container", "Panel", "createReference", "React", "EncounterTimeline", "props", "React", "ResourceTimeline", "medplum", "_resourceType", "id", "resource", "sender", "text", "createReference", "operator", "content", "Button", "Loader", "Table", "normalizeOperationOutcome", "React", "useEffect", "useRef", "useState", "evalFhirPath", "React", "FhirPathDisplay", "props", "value", "evalFhirPath", "err", "React", "ResourcePropertyDisplay", "ActionIcon", "Button", "Center", "createStyles", "Group", "Loader", "Menu", "Pagination", "Table", "Text", "UnstyledButton", "DEFAULT_SEARCH_COUNT", "formatSearchQuery", "globalSchema", "React", "useCallback", "useEffect", "useRef", "useState", "Box", "Button", "Modal", "Text", "React", "SearchExportDialog", "props", "ExportButton", "Button", "Modal", "globalSchema", "stringify", "React", "useEffect", "useRef", "useState", "capitalize", "DEFAULT_SEARCH_COUNT", "evalFhirPathTyped", "formatDateTime", "Operator", "React", "searchParamToOperators", "Operator", "operatorNames", "setFilters", "definition", "filters", "clearFilters", "clearFiltersOnField", "code", "f", "addFilter", "field", "op", "value", "opt_clear", "nextFilters", "addField", "newFields", "deleteFilter", "index", "newFilters", "addYesterdayFilter", "addDayFilter", "addTodayFilter", "addTomorrowFilter", "delta", "startTime", "endTime", "addDateFilterBetween", "addLastMonthFilter", "addMonthFilter", "addThisMonthFilter", "addNextMonthFilter", "addYearToDateFilter", "d1", "d2", "addDateFilterImpl", "addMissingFilter", "setOffset", "offset", "setPage", "page", "count", "DEFAULT_SEARCH_COUNT", "newOffset", "setSort", "sort", "desc", "getSortField", "isSortDescending", "toggleSort", "key", "sortRules", "getSearchOperators", "searchParam", "getOpString", "buildFieldNameString", "tmp", "capitalize", "renderValue", "resource", "formatDateTime", "renderPropertyValue", "renderSearchParameterValue", "elementDefinition", "path", "propertyType", "getValueAndType", "React", "ResourcePropertyDisplay", "evalFhirPathTyped", "v", "SearchFieldEditor", "props", "state", "setState", "useState", "stringify", "availableRef", "useRef", "selectedRef", "useEffect", "handleAvailableKeyDown", "e", "onAddField", "handleAvailableDoubleClick", "handleSelectedKeyDown", "onRemoveField", "handleSelectedDoubleClick", "currentField", "key", "newFields", "onMoveUp", "currentFields", "field", "index", "swapFields", "onMoveDown", "fields", "i", "j", "temp", "resourceType", "typeDef", "globalSchema", "selected", "available", "getFieldsList", "a", "b", "React", "Modal", "buildFieldNameString", "Button", "typeSchema", "result", "keys", "names", "code", "name", "Button", "Group", "Modal", "NativeSelect", "globalSchema", "stringify", "React", "useEffect", "useRef", "useState", "formatDateTime", "getSearchParameterDetails", "globalSchema", "Operator", "SearchParameterType", "React", "SearchFilterValueDisplay", "props", "resourceType", "filter", "searchParam", "globalSchema", "Operator", "React", "ResourceName", "searchParamDetails", "getSearchParameterDetails", "SearchParameterType", "formatDateTime", "Checkbox", "TextInput", "getSearchParameterDetails", "SearchParameterType", "React", "SearchFilterValueInput", "props", "details", "getSearchParameterDetails", "name", "SearchParameterType", "React", "ReferenceInput", "newReference", "Checkbox", "e", "TextInput", "DateTimeInput", "QuantityInput", "tryParseQuantity", "newQuantity", "value", "valueString", "systemString", "unitString", "SearchFilterEditor", "props", "search", "setSearch", "useState", "stringify", "editingIndex", "setEditingIndex", "searchRef", "useRef", "useEffect", "onAddFilter", "filter", "addFilter", "resourceType", "searchParams", "globalSchema", "filters", "React", "Modal", "index", "FilterRowInput", "newFilter", "newFilters", "setFilters", "FilterRowDisplay", "deleteFilter", "Group", "Button", "buildFieldNameString", "getOpString", "SearchFilterValueDisplay", "value", "setValue", "valueRef", "setFilterCode", "newCode", "setFilterOperator", "newOperator", "setFilterValue", "newFilterValue", "searchParam", "operators", "getSearchOperators", "NativeSelect", "e", "param", "op", "SearchFilterValueInput", "Button", "Grid", "Modal", "React", "useState", "SearchFilterValueDialog", "props", "value", "setValue", "useState", "onOk", "React", "Modal", "Form", "Grid", "SearchFilterValueInput", "Button", "Menu", "Operator", "React", "SearchPopupMenu", "props", "onSort", "searchParam", "desc", "onChange", "setSort", "onClear", "clearFiltersOnField", "onPrompt", "operator", "definition", "React", "SearchParameterSubMenu", "Menu", "buildFieldNameString", "DateFilterSubMenu", "NumericFilterSubMenu", "ReferenceFilterSubMenu", "TextFilterSubMenu", "code", "IconSortAscending", "IconSortDescending", "IconEqual", "Operator", "IconEqualNot", "IconMathLower", "IconMathGreater", "IconBracketsContain", "IconCalendar", "addTomorrowFilter", "addTodayFilter", "addYesterdayFilter", "addNextMonthFilter", "addThisMonthFilter", "addLastMonthFilter", "addYearToDateFilter", "CommonMenuItems", "IconSettings", "IconBucket", "IconBucketOff", "IconBleach", "addMissingFilter", "IconBleachOff", "IconX", "getSearchParameterDetails", "globalSchema", "getFieldDefinitions", "search", "resourceType", "fields", "name", "getFieldDefinition", "typeSchema", "exactElementDefinition", "exactSearchParam", "searchParams", "path", "p", "details", "SearchChangeEvent", "definition", "SearchLoadEvent", "response", "SearchClickEvent", "resource", "browserEvent", "useStyles", "createStyles", "theme", "SearchControl", "props", "classes", "medplum", "useMedplum", "schemaLoaded", "setSchemaLoaded", "useState", "outcome", "setOutcome", "search", "onLoad", "state", "setState", "stateRef", "useRef", "totalType", "loadResults", "useCallback", "options", "formatSearchQuery", "reason", "refreshResults", "useEffect", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "searchResponse", "entry", "isAllSelected", "emitSearchChange", "newSearch", "handleRowClick", "isCheckboxCell", "killEvent", "isAux", "isExportPassed", "globalSchema", "React", "Center", "Loader", "checkboxColumn", "fields", "getFieldDefinitions", "resourceType", "lastResult", "resources", "buttonVariant", "buttonColor", "iconSize", "isMobile", "Group", "Button", "IconColumns", "IconFilter", "IconFilePlus", "IconTableExport", "IconTrash", "IconBoxMultiple", "Text", "getStart", "getEnd", "ActionIcon", "IconRefresh", "Table", "field", "Menu", "UnstyledButton", "buildFieldNameString", "IconAdjustmentsHorizontal", "SearchPopupMenu", "searchParam", "filter", "result", "FilterDescription", "renderValue", "Container", "Pagination", "getPage", "getTotalPages", "newPage", "setPage", "control", "SearchFieldEditor", "SearchFilterEditor", "SearchExportDialog", "SearchFilterValueDialog", "addFilter", "MemoizedSearchControl", "filters", "f", "p", "getOpString", "SearchFilterValueDisplay", "DEFAULT_SEARCH_COUNT", "total", "pageSize", "FhirPathTable", "props", "medplum", "useMedplum", "schema", "setSchema", "useState", "outcome", "setOutcome", "query", "fields", "response", "setResponse", "selected", "setSelected", "responseRef", "useRef", "selectedRef", "useEffect", "err", "normalizeOperationOutcome", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "resources", "resource", "isAllSelected", "handleRowClick", "isCheckboxCell", "killEvent", "SearchClickEvent", "newSchema", "React", "Loader", "checkboxColumn", "Table", "field", "FhirPathDisplay", "Button", "MemoizedFhirPathTable", "React", "Logo", "props", "Alert", "React", "OperationOutcomeAlert", "props", "issues", "Alert", "IconAlertCircle", "issue", "createReference", "React", "useCallback", "PatientTimeline", "props", "loadTimelineResources", "useCallback", "medplum", "resourceType", "id", "ref", "_count", "React", "ResourceTimeline", "resource", "sender", "text", "createReference", "operator", "content", "Anchor", "Button", "createStyles", "NativeSelect", "Stack", "TextInput", "getReferenceString", "React", "useEffect", "useRef", "useState", "useStyles", "createStyles", "theme", "PlanDefinitionBuilder", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "value", "setValue", "handleDocumentMouseOver", "handleDocumentClick", "valueRef", "useRef", "useEffect", "ensurePlanDefinitionKeys", "changeProperty", "property", "newValue", "React", "Form", "TextInput", "e", "ActionArrayBuilder", "x", "Button", "classes", "actionsRef", "changeAction", "changedAction", "i", "addAction", "addedAction", "removeAction", "removedAction", "action", "ActionBuilder", "Anchor", "killEvent", "generateId", "cx", "actionType", "getInitialActionType", "editing", "hovering", "onClick", "onHover", "className", "ActionEditor", "ActionDisplay", "timingProperty", "propertyValue", "propertyType", "getActionTiming", "ReferenceDisplay", "ResourcePropertyDisplay", "setActionType", "Stack", "NativeSelect", "ActionResourceTypeBuilder", "FormSection", "ActionTimingInput", "id", "definitionCanonical", "reference", "ResourceInput", "getReferenceString", "key", "ResourcePropertyInput", "propName", "setPropertyValue", "getValueAndType", "nextId", "existing", "existingNum", "planDefinition", "ensurePlanDefinitionActionKeys", "actions", "Anchor", "Button", "createStyles", "NativeSelect", "Textarea", "TextInput", "Title", "globalSchema", "isResourceType", "React", "useEffect", "useRef", "useState", "Anchor", "Button", "Checkbox", "Group", "NativeSelect", "Radio", "Stack", "Stepper", "Textarea", "TextInput", "Title", "capitalize", "createReference", "getExtension", "getQuestionnaireAnswers", "getReferenceString", "getTypedPropertyValue", "globalSchema", "stringify", "evalFhirPathTyped", "React", "useEffect", "useState", "QuestionnaireItemType", "isChoiceQuestion", "item", "QuestionnaireForm", "props", "medplum", "useMedplum", "source", "schema", "setSchema", "useState", "questionnaire", "useResource", "response", "setResponse", "answers", "setAnswers", "activePage", "setActivePage", "numberOfPages", "getNumberOfPages", "nextStep", "current", "prevStep", "useEffect", "buildInitialResponse", "setItems", "newResponseItems", "newResponse", "getQuestionnaireAnswers", "React", "Form", "getReferenceString", "createReference", "Title", "QuestionnaireFormItemArray", "Group", "ButtonGroup", "responseItems", "setResponseItems", "buildInitialResponseItems", "setResponseItem", "responseId", "newResponseItem", "itemExists", "r", "questionForm", "item", "index", "Stepper", "QuestionnaireFormArrayContent", "Stack", "isQuestionEnabled", "QuestionnaireRepeatWrapper", "FormSection", "onChangeItem", "number", "responses", "getResponseId", "RepeatableGroup", "RepeatableItem", "QuestionnaireFormItem", "onChangeAnswer", "newResponseAnswer", "repeatedIndex", "updateAnswerArray", "type", "name", "initial", "CheckboxFormSection", "Checkbox", "e", "TextInput", "DateTimeInput", "newValue", "Textarea", "AttachmentInput", "ReferenceInput", "addTargetTypes", "QuantityInput", "isDropDownChoice", "QuestionnaireChoiceDropDownInput", "QuestionnaireChoiceRadioInput", "initialValue", "getTypedPropertyValue", "data", "option", "optionValue", "typedValueToString", "NativeSelect", "propertyName", "capitalize", "typedValue", "valueElementDefinition", "globalSchema", "options", "defaultValue", "optionName", "stringify", "Radio", "ResourcePropertyDisplay", "Button", "items", "buildInitialResponseItem", "generateId", "buildInitialResponseAnswer", "nextId", "answer", "enableBehavior", "enableWhen", "actualAnswer", "expectedAnswer", "match", "operator", "fhirPathOperator", "value", "evalFhirPathTyped", "getExtension", "extensions", "setNumber", "_", "i", "Anchor", "n", "useStyles", "createStyles", "theme", "QuestionnaireBuilder", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "value", "setValue", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "handleDocumentMouseOver", "handleDocumentClick", "useEffect", "ensureQuestionnaireKeys", "React", "Form", "ItemBuilder", "Button", "classes", "cx", "resource", "item", "isResource", "isResourceType", "isContainer", "linkId", "editing", "hovering", "itemRef", "useRef", "onClick", "e", "killEvent", "onHover", "changeItem", "changedItem", "curr", "i", "addItem", "addedItem", "removeItem", "removedItem", "changeProperty", "property", "toggleRepeatable", "className", "TextInput", "Textarea", "ReferenceProfiles", "newOptions", "isChoiceQuestion", "AnswerBuilder", "Title", "QuestionnaireFormItem", "NativeSelect", "Anchor", "generateId", "generateLinkId", "createPage", "globalSchema", "options", "option", "propertyValue", "propertyType", "getValueAndType", "ResourcePropertyInput", "newValue", "propName", "index", "o", "references", "referenceProfiles", "reference", "newReferences", "coding", "r", "nextLinkId", "nextId", "prefix", "questionnaire", "ensureQuestionnaireItemKeys", "items", "ensureQuestionnaireOptionKeys", "ActionIcon", "Button", "createStyles", "Divider", "Group", "NativeSelect", "Stack", "Text", "TextInput", "formatRange", "getCodeBySystem", "React", "useEffect", "useState", "useStyles", "createStyles", "theme", "intervalFilters", "defaultProps", "ReferenceRangeEditor", "props", "defaultDefinition", "intervalGroups", "setIntervalGroups", "useState", "groupId", "setGroupId", "intervalId", "setIntervalId", "useEffect", "definition", "ensureQualifiedIntervalKeys", "groupQualifiedIntervals", "React", "Form", "submitDefinition", "Stack", "intervalGroup", "ReferenceRangeGroupEditor", "getUnitString", "changeInterval", "addInterval", "removeInterval", "removeGroup", "ActionIcon", "e", "killEvent", "addGroup", "id", "IconCirclePlus", "Group", "Button", "qualifiedInterval", "group", "interval", "isEmptyInterval", "addedGroup", "currentGroups", "removedGroup", "changedInterval", "groups", "currentGroup", "index", "addedInterval", "currentGroupIndex", "g", "removedInterval", "unit", "classes", "Container", "IconCircleMinus", "ReferenceRangeGroupFilters", "Divider", "TextInput", "RangeInput", "range", "onChange", "key", "NativeSelect", "newGender", "Text", "ageRange", "newEndocrine", "newCategory", "intervals", "nextId", "existingNum", "groupKey", "generateGroupKey", "formatRange", "c", "getCodeBySystem", "Button", "Grid", "Text", "formatDateTime", "getReferenceString", "React", "useEffect", "useState", "RequestGroupDisplay", "props", "medplum", "useMedplum", "requestGroup", "useResource", "startedLoading", "setStartedLoading", "useState", "responseBundle", "setResponseBundle", "useEffect", "buildBatchRequest", "React", "Grid", "action", "index", "task", "findBundleEntry", "taskInput", "taskOutput", "IconCheckbox", "IconSquare", "Text", "ResourceName", "formatDateTime", "StatusBadge", "Button", "request", "batchEntries", "reference", "entry", "getReferenceString", "createStyles", "React", "useEffect", "useState", "stringify", "diff", "original", "revised", "path", "buildPath", "buildRevisions", "orig", "rev", "N", "M", "MAX", "size", "middle", "diagonal", "d", "k", "kmiddle", "kplus", "kminus", "kplusNode", "kminusNode", "prev", "i", "j", "node", "previousSnake", "startNode", "deltas", "ianchor", "janchor", "type", "blame", "history", "versions", "entry", "stringify", "a", "b", "table", "line", "compareVersions", "combineSpans", "i", "revisions", "diff", "revision", "position", "oldLines", "newLines", "k", "start", "curr", "useStyles", "createStyles", "theme", "ResourceBlame", "props", "classes", "medplum", "useMedplum", "value", "setValue", "useState", "useEffect", "React", "resource", "table", "blame", "row", "index", "ResourceBadge", "MedplumLink", "getVersionUrl", "getTimeString", "versionId", "lastUpdated", "seconds", "years", "pluralizeTime", "months", "days", "hours", "minutes", "count", "noun", "createStyles", "stringify", "React", "useStyles", "createStyles", "theme", "ResourceDiff", "props", "originalResource", "revisedResource", "original", "stringify", "revised", "deltas", "diff", "React", "delta", "index", "ChangeDiff", "classes", "Table", "formatDateTime", "normalizeErrorString", "React", "useEffect", "useState", "ResourceHistoryTable", "props", "medplum", "useMedplum", "value", "setValue", "useState", "useEffect", "React", "Table", "entry", "index", "HistoryRow", "response", "resource", "ResourceBadge", "formatDateTime", "MedplumLink", "getVersionUrl", "normalizeErrorString", "Button", "createStyles", "Stack", "Text", "getReferenceString", "React", "useEffect", "useRef", "useState", "useStyles", "createStyles", "theme", "Scheduler", "props", "classes", "medplum", "useMedplum", "schedule", "useResource", "questionnaire", "slots", "setSlots", "useState", "slotsRef", "useRef", "month", "setMonth", "getStartMonth", "date", "setDate", "slot", "setSlot", "response", "setResponse", "useEffect", "getReferenceString", "getStart", "getEnd", "actor", "React", "ResourceAvatar", "Text", "ResourceName", "formatTime", "CalendarInput", "Stack", "s", "slotStart", "Button", "QuestionnaireForm", "formatSlotInstant", "time", "createReference", "React", "ServiceRequestTimeline", "props", "React", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "_count", "resource", "sender", "text", "createReference", "operator", "content", "normalizeOperationOutcome", "React", "useEffect", "useState", "Anchor", "Button", "Center", "Group", "Stack", "Text", "TextInput", "Title", "normalizeOperationOutcome", "React", "useState", "NewProjectForm", "props", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "React", "Form", "formData", "err", "normalizeOperationOutcome", "Center", "Logo", "Title", "Stack", "TextInput", "getErrorsForInput", "Text", "Anchor", "Group", "Button", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "Text", "TextInput", "normalizeOperationOutcome", "React", "useEffect", "useState", "React", "useEffect", "useRef", "useState", "createScriptTag", "src", "onload", "head", "script", "GoogleButton", "props", "medplum", "useMedplum", "googleClientId", "handleGoogleCredential", "parentRef", "useRef", "scriptLoaded", "setScriptLoaded", "useState", "initialized", "setInitialized", "buttonRendered", "setButtonRendered", "useEffect", "createScriptTag", "React", "getGoogleClientId", "clientId", "origin", "initRecaptcha", "siteKey", "createScriptTag", "getRecaptcha", "resolve", "reject", "err", "NewUserForm", "props", "googleClientId", "getGoogleClientId", "recaptchaSiteKey", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "issues", "getIssuesForExpression", "useEffect", "initRecaptcha", "React", "Form", "formData", "recaptchaToken", "getRecaptcha", "err", "normalizeOperationOutcome", "Center", "OperationOutcomeAlert", "Group", "GoogleButton", "response", "Divider", "Stack", "TextInput", "getErrorsForInput", "PasswordInput", "Text", "Anchor", "Checkbox", "Button", "RegisterForm", "props", "type", "projectId", "clientId", "googleClientId", "recaptchaSiteKey", "onSuccess", "medplum", "useMedplum", "login", "setLogin", "useState", "outcome", "setOutcome", "useEffect", "response", "err", "normalizeOperationOutcome", "handleAuthResponse", "React", "Document", "NewUserForm", "NewProjectForm", "showNotification", "normalizeErrorString", "React", "useCallback", "useEffect", "useState", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "TextInput", "normalizeOperationOutcome", "React", "useCallback", "useState", "AuthenticationForm", "props", "email", "setEmail", "useState", "React", "PasswordForm", "EmailForm", "onRegister", "handleAuthResponse", "children", "disableEmailAuth", "baseLoginRequest", "medplum", "useMedplum", "googleClientId", "getGoogleClientId", "isExternalAuth", "useCallback", "authMethod", "state", "url", "handleSubmit", "formData", "handleGoogleCredential", "response", "authResponse", "Form", "Center", "Group", "GoogleButton", "Divider", "TextInput", "Anchor", "Button", "onForgotPassword", "outcome", "setOutcome", "issues", "getIssuesForExpression", "err", "normalizeOperationOutcome", "OperationOutcomeAlert", "Stack", "PasswordInput", "getErrorsForInput", "Checkbox", "Avatar", "Center", "Group", "Stack", "Text", "Title", "UnstyledButton", "normalizeOperationOutcome", "React", "useState", "ChooseProfileForm", "props", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "React", "Stack", "Center", "Logo", "Title", "OperationOutcomeAlert", "membership", "UnstyledButton", "err", "normalizeOperationOutcome", "Group", "Avatar", "Text", "Button", "Center", "Checkbox", "Group", "Stack", "Title", "React", "ChooseScopeForm", "props", "medplum", "useMedplum", "React", "Form", "formData", "Stack", "Center", "Logo", "Title", "scopeName", "Checkbox", "Group", "Button", "Alert", "Button", "Center", "Group", "Stack", "TextInput", "Title", "normalizeErrorString", "React", "useState", "MfaForm", "props", "medplum", "useMedplum", "errorMessage", "setErrorMessage", "useState", "React", "Form", "formData", "err", "normalizeErrorString", "Stack", "Center", "Logo", "Title", "Alert", "IconAlertCircle", "TextInput", "Group", "Button", "SignInForm", "props", "loginCode", "chooseScopes", "onSuccess", "onForgotPassword", "onRegister", "onCode", "baseLoginRequest", "medplum", "useMedplum", "login", "setLogin", "useState", "mfaRequired", "setAuthenticatorRequired", "memberships", "setMemberships", "handleCode", "useCallback", "code", "err", "showNotification", "normalizeErrorString", "handleAuthResponse", "response", "handleScopeResponse", "useEffect", "React", "Document", "MfaForm", "ChooseProfileForm", "NewProjectForm", "ChooseScopeForm", "AuthenticationForm"]
|
|
3
|
+
"sources": ["../../src/AddressDisplay/AddressDisplay.tsx", "../../src/AddressInput/AddressInput.tsx", "../../src/AnnotationInput/AnnotationInput.tsx", "../../src/MedplumProvider/MedplumProvider.tsx", "../../src/AppShell/AppShell.tsx", "../../src/ErrorBoundary/ErrorBoundary.tsx", "../../../../node_modules/@tabler/icons-react/src/defaultAttributes.js", "../../../../node_modules/@tabler/icons-react/src/createReactComponent.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAdjustmentsHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAlertCircle.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleachOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleach.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBoxMultiple.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBracketsContain.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucketOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucket.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCalendar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheck.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheckbox.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconChevronDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCircleMinus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCirclePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCloudUpload.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconColumns.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCopy.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCurrencyDollar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconDots.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEdit.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqualNot.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqual.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFileAlert.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilter.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconListDetails.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconLogout.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathGreater.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathLower.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMessage.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPin.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPinnedOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconRefresh.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSearch.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSettings.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortAscending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortDescending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSwitchHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTableExport.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTrash.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconX.js", "../../src/Loading/Loading.tsx", "../../src/AppShell/Header.tsx", "../../src/HumanNameDisplay/HumanNameDisplay.tsx", "../../src/ResourceAvatar/ResourceAvatar.tsx", "../../src/MedplumLink/MedplumLink.tsx", "../../src/utils/dom.ts", "../../src/useResource/useResource.ts", "../../src/AppShell/HeaderSearchInput.tsx", "../../src/AsyncAutocomplete/AsyncAutocomplete.tsx", "../../src/AppShell/Navbar.tsx", "../../src/BookmarkDialog/BookmarkDialog.tsx", "../../src/Form/Form.tsx", "../../src/Form/FormUtils.ts", "../../src/CodeInput/CodeInput.tsx", "../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx", "../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx", "../../src/AttachmentDisplay/AttachmentDisplay.tsx", "../../src/AttachmentArrayInput/AttachmentArrayInput.tsx", "../../src/AttachmentButton/AttachmentButton.tsx", "../../src/AttachmentInput/AttachmentInput.tsx", "../../src/BackboneElementDisplay/BackboneElementDisplay.tsx", "../../src/constants.ts", "../../src/DescriptionList/DescriptionList.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx", "../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx", "../../src/CodingDisplay/CodingDisplay.tsx", "../../src/ContactDetailDisplay/ContactDetailDisplay.tsx", "../../src/ContactPointDisplay/ContactPointDisplay.tsx", "../../src/IdentifierDisplay/IdentifierDisplay.tsx", "../../src/MoneyDisplay/MoneyDisplay.tsx", "../../src/QuantityDisplay/QuantityDisplay.tsx", "../../src/RangeDisplay/RangeDisplay.tsx", "../../src/RatioDisplay/RatioDisplay.tsx", "../../src/ReferenceDisplay/ReferenceDisplay.tsx", "../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx", "../../src/BackboneElementInput/BackboneElementInput.tsx", "../../src/CheckboxFormSection/CheckboxFormSection.tsx", "../../src/FormSection/FormSection.tsx", "../../src/utils/outcomes.ts", "../../src/ResourceForm/ResourceForm.tsx", "../../src/ResourcePropertyInput/ResourcePropertyInput.tsx", "../../src/CodeableConceptInput/CodeableConceptInput.tsx", "../../src/CodingInput/CodingInput.tsx", "../../src/ContactDetailInput/ContactDetailInput.tsx", "../../src/ContactPointInput/ContactPointInput.tsx", "../../src/DateTimeInput/DateTimeInput.tsx", "../../src/ExtensionInput/ExtensionInput.tsx", "../../src/HumanNameInput/HumanNameInput.tsx", "../../src/IdentifierInput/IdentifierInput.tsx", "../../src/MoneyInput/MoneyInput.tsx", "../../src/PeriodInput/PeriodInput.tsx", "../../src/QuantityInput/QuantityInput.tsx", "../../src/RangeInput/RangeInput.tsx", "../../src/RatioInput/RatioInput.tsx", "../../src/ReferenceInput/ReferenceInput.tsx", "../../src/ResourceInput/ResourceInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.tsx", "../../src/TimingInput/TimingInput.tsx", "../../src/CalendarInput/CalendarInput.tsx", "../../src/Container/Container.tsx", "../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx", "../../src/ResourceTimeline/ResourceTimeline.tsx", "../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx", "../../src/NoteDisplay/NoteDisplay.tsx", "../../src/ResourceBadge/ResourceBadge.tsx", "../../src/ResourceName/ResourceName.tsx", "../../src/StatusBadge/StatusBadge.tsx", "../../src/Panel/Panel.tsx", "../../src/ResourceDiffTable/ResourceDiffTable.tsx", "../../src/ResourceTable/ResourceTable.tsx", "../../src/Timeline/Timeline.tsx", "../../src/utils/date.ts", "../../src/Document/Document.tsx", "../../src/EncounterTimeline/EncounterTimeline.tsx", "../../src/FhirPathTable/FhirPathTable.tsx", "../../src/FhirPathDisplay/FhirPathDisplay.tsx", "../../src/SearchControl/SearchControl.tsx", "../../src/SearchExportDialog/SearchExportDialog.tsx", "../../src/SearchFieldEditor/SearchFieldEditor.tsx", "../../src/SearchControl/SearchUtils.tsx", "../../src/SearchFilterEditor/SearchFilterEditor.tsx", "../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx", "../../src/SearchFilterValueInput/SearchFilterValueInput.tsx", "../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx", "../../src/SearchPopupMenu/SearchPopupMenu.tsx", "../../src/SearchControl/SearchControlField.ts", "../../src/Logo/Logo.tsx", "../../src/OperationOutcomeAlert/OperationOutcomeAlert.tsx", "../../src/PatientTimeline/PatientTimeline.tsx", "../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx", "../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx", "../../src/utils/questionnaire.ts", "../../src/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem.tsx", "../../src/QuestionnaireForm/QuestionnaireForm.tsx", "../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx", "../../src/RequestGroupDisplay/RequestGroupDisplay.tsx", "../../src/ResourceBlame/ResourceBlame.tsx", "../../src/utils/blame.ts", "../../src/utils/diff.ts", "../../src/ResourceDiff/ResourceDiff.tsx", "../../src/ResourceHistoryTable/ResourceHistoryTable.tsx", "../../src/Scheduler/Scheduler.tsx", "../../src/ServiceRequestTimeline/ServiceRequestTimeline.tsx", "../../src/auth/RegisterForm.tsx", "../../src/auth/NewProjectForm.tsx", "../../src/auth/NewUserForm.tsx", "../../src/GoogleButton/GoogleButton.tsx", "../../src/utils/script.ts", "../../src/utils/recaptcha.ts", "../../src/auth/SignInForm.tsx", "../../src/auth/AuthenticationForm.tsx", "../../src/auth/ChooseProfileForm.tsx", "../../src/auth/ChooseScopeForm.tsx", "../../src/auth/MfaForm.tsx"],
|
|
4
|
+
"sourcesContent": ["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nfunction getLine(address: Address, index: number): string {\n return address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { useMedplumProfile } from '../MedplumProvider/MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport type MepdlumNavigateFunction = (path: string) => void;\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n navigate?: MepdlumNavigateFunction;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n navigate: MepdlumNavigateFunction;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n * @param props The MedplumProvider React props.\n * @returns The MedplumProvider React node.\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n const navigate = props.navigate ?? defaultNavigate;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListener('change', eventListener);\n }, [medplum, state]);\n\n useEffect(() => {\n function eventListener(): void {\n showNotification({ color: 'red', message: 'No connection to server', autoClose: false });\n }\n medplum.addEventListener('offline', eventListener);\n return () => medplum.removeEventListener('offline', eventListener);\n }, [medplum]);\n\n const medplumContext = useMemo(\n () => ({\n ...state,\n medplum,\n navigate,\n }),\n [state, medplum, navigate]\n );\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n * @returns The MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n * @returns The MedplumClient instance.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the Medplum navigate function.\n * @returns The Medplum navigate function.\n */\nexport function useMedplumNavigate(): MepdlumNavigateFunction {\n return useMedplumContext().navigate;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n\n/**\n * The default \"navigate\" function which simply uses window.location.href.\n * @param path The path to navigate to.\n */\nfunction defaultNavigate(path: string): void {\n window.location.assign(path);\n}\n", "import { AppShell as MantineAppShell, useMantineTheme } from '@mantine/core';\nimport React, { Suspense, useState } from 'react';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Loading } from '../Loading/Loading';\nimport { useMedplum, useMedplumProfile } from '../MedplumProvider/MedplumProvider';\nimport { Header } from './Header';\nimport { Navbar, NavbarMenu } from './Navbar';\n\nexport interface AppShellProps {\n logo: React.ReactNode;\n pathname?: string;\n searchParams?: URLSearchParams;\n version?: string;\n menus?: NavbarMenu[];\n children: React.ReactNode;\n displayAddBookmark?: boolean;\n}\n\nexport function AppShell(props: AppShellProps): JSX.Element {\n const theme = useMantineTheme();\n const [navbarOpen, setNavbarOpen] = useState(localStorage['navbarOpen'] === 'true');\n const medplum = useMedplum();\n const profile = useMedplumProfile();\n\n function setNavbarOpenWrapper(open: boolean): void {\n localStorage['navbarOpen'] = open.toString();\n setNavbarOpen(open);\n }\n\n function closeNavbar(): void {\n setNavbarOpenWrapper(false);\n }\n\n function toggleNavbar(): void {\n setNavbarOpenWrapper(!navbarOpen);\n }\n\n if (medplum.isLoading()) {\n return <Loading />;\n }\n\n return (\n <MantineAppShell\n styles={{\n main: {\n background: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0],\n },\n }}\n padding={0}\n fixed={true}\n header={\n profile && (\n <Header\n pathname={props.pathname}\n searchParams={props.searchParams}\n logo={props.logo}\n version={props.version}\n navbarToggle={toggleNavbar}\n />\n )\n }\n navbar={\n profile && navbarOpen ? (\n <Navbar\n pathname={props.pathname}\n searchParams={props.searchParams}\n menus={props.menus}\n closeNavbar={closeNavbar}\n displayAddBookmark={props.displayAddBookmark}\n />\n ) : undefined\n }\n >\n <ErrorBoundary key={`${props.pathname}?${props.searchParams?.toString()}`}>\n <Suspense fallback={<Loading />}>{props.children}</Suspense>\n </ErrorBoundary>\n </MantineAppShell>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { forwardRef, createElement } from 'react';\nimport PropTypes from 'prop-types';\nimport defaultAttributes from './defaultAttributes';\n\nexport default (iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = 'currentColor', size = 24, stroke = 2, children, ...rest }, ref) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: stroke,\n className: `tabler-icon tabler-icon-${iconName}`,\n ...rest,\n },\n [...iconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...(children || [])],\n ),\n );\n\n Component.propTypes = {\n color: PropTypes.string,\n size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n stroke: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'adjustments-horizontal',\n 'IconAdjustmentsHorizontal',\n [\n ['path', { d: 'M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-0' }],\n ['path', { d: 'M4 6l8 0', key: 'svg-1' }],\n ['path', { d: 'M16 6l4 0', key: 'svg-2' }],\n ['path', { d: 'M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-3' }],\n ['path', { d: 'M4 12l2 0', key: 'svg-4' }],\n ['path', { d: 'M10 12l10 0', key: 'svg-5' }],\n ['path', { d: 'M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-6' }],\n ['path', { d: 'M4 18l11 0', key: 'svg-7' }],\n ['path', { d: 'M19 18l1 0', key: 'svg-8' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('alert-circle', 'IconAlertCircle', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M12 8v4', key: 'svg-1' }],\n ['path', { d: 'M12 16h.01', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach-off', 'IconBleachOff', [\n [\n 'path',\n {\n d: 'M5 19h14m1.986 -1.977a2 2 0 0 0 -.146 -.773l-7.1 -12.25a2 2 0 0 0 -3.5 0l-.815 1.405m-1.488 2.568l-4.797 8.277a2 2 0 0 0 1.75 2.75',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach', 'IconBleach', [\n [\n 'path',\n {\n d: 'M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('box-multiple', 'IconBoxMultiple', [\n [\n 'path',\n {\n d: 'M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('brackets-contain', 'IconBracketsContain', [\n ['path', { d: 'M7 4h-4v16h4', key: 'svg-0' }],\n ['path', { d: 'M17 4h4v16h-4', key: 'svg-1' }],\n ['path', { d: 'M8 16h.01', key: 'svg-2' }],\n ['path', { d: 'M12 16h.01', key: 'svg-3' }],\n ['path', { d: 'M16 16h.01', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket-off', 'IconBucketOff', [\n [\n 'path',\n {\n d: 'M5.029 5.036c-.655 .58 -1.029 1.25 -1.029 1.964c0 2.033 3.033 3.712 6.96 3.967m3.788 -.21c3.064 -.559 5.252 -2.029 5.252 -3.757c0 -2.21 -3.582 -4 -8 -4c-1.605 0 -3.1 .236 -4.352 .643',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.1 -.3 .252 -.812 .457 -1.535m.862 -3.146c.262 -.975 .735 -2.76 1.418 -5.354a7.45 7.45 0 0 0 .263 -1.965',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket', 'IconBucket', [\n ['path', { d: 'M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('calendar', 'IconCalendar', [\n [\n 'path',\n {\n d: 'M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M16 3v4', key: 'svg-1' }],\n ['path', { d: 'M8 3v4', key: 'svg-2' }],\n ['path', { d: 'M4 11h16', key: 'svg-3' }],\n ['path', { d: 'M11 15h1', key: 'svg-4' }],\n ['path', { d: 'M12 15v3', key: 'svg-5' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('check', 'IconCheck', [\n ['path', { d: 'M5 12l5 5l10 -10', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('checkbox', 'IconCheckbox', [\n ['path', { d: 'M9 11l3 3l8 -8', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('chevron-down', 'IconChevronDown', [\n ['path', { d: 'M6 9l6 6l6 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-minus', 'IconCircleMinus', [\n ['path', { d: 'M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12l6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-plus', 'IconCirclePlus', [\n ['path', { d: 'M20.987 12.497a9 9 0 1 0 -8.467 8.489', key: 'svg-0' }],\n ['path', { d: 'M16 19h6', key: 'svg-1' }],\n ['path', { d: 'M19 16v6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('cloud-upload', 'IconCloudUpload', [\n [\n 'path',\n {\n d: 'M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l3 -3l3 3', key: 'svg-1' }],\n ['path', { d: 'M12 12l0 9', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('columns', 'IconColumns', [\n ['path', { d: 'M4 6l5.5 0', key: 'svg-0' }],\n ['path', { d: 'M4 10l5.5 0', key: 'svg-1' }],\n ['path', { d: 'M4 14l5.5 0', key: 'svg-2' }],\n ['path', { d: 'M4 18l5.5 0', key: 'svg-3' }],\n ['path', { d: 'M14.5 6l5.5 0', key: 'svg-4' }],\n ['path', { d: 'M14.5 10l5.5 0', key: 'svg-5' }],\n ['path', { d: 'M14.5 14l5.5 0', key: 'svg-6' }],\n ['path', { d: 'M14.5 18l5.5 0', key: 'svg-7' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('copy', 'IconCopy', [\n [\n 'path',\n {\n d: 'M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('currency-dollar', 'IconCurrencyDollar', [\n [\n 'path',\n {\n d: 'M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M12 3v3m0 12v3', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('dots', 'IconDots', [\n ['path', { d: 'M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-0' }],\n ['path', { d: 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-1' }],\n ['path', { d: 'M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('edit', 'IconEdit', [\n [\n 'path',\n {\n d: 'M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M16 5l3 3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal-not', 'IconEqualNot', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n ['path', { d: 'M5 19l14 -14', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal', 'IconEqual', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-alert', 'IconFileAlert', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 17l.01 0', key: 'svg-2' }],\n ['path', { d: 'M12 11l0 3', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-plus', 'IconFilePlus', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 11l0 6', key: 'svg-2' }],\n ['path', { d: 'M9 14l6 0', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('filter', 'IconFilter', [\n [\n 'path',\n {\n d: 'M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('list-details', 'IconListDetails', [\n ['path', { d: 'M13 5h8', key: 'svg-0' }],\n ['path', { d: 'M13 9h5', key: 'svg-1' }],\n ['path', { d: 'M13 15h8', key: 'svg-2' }],\n ['path', { d: 'M13 19h5', key: 'svg-3' }],\n [\n 'path',\n {\n d: 'M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-4',\n },\n ],\n [\n 'path',\n {\n d: 'M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-5',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('logout', 'IconLogout', [\n [\n 'path',\n {\n d: 'M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12h12l-3 -3', key: 'svg-1' }],\n ['path', { d: 'M18 15l3 -3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-greater', 'IconMathGreater', [\n ['path', { d: 'M5 18l14 -6l-14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-lower', 'IconMathLower', [\n ['path', { d: 'M19 18l-14 -6l14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('message', 'IconMessage', [\n ['path', { d: 'M8 9h8', key: 'svg-0' }],\n ['path', { d: 'M8 13h6', key: 'svg-1' }],\n [\n 'path',\n {\n d: 'M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pin', 'IconPin', [\n [\n 'path',\n {\n d: 'M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-1' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pinned-off', 'IconPinnedOff', [\n ['path', { d: 'M3 3l18 18', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-2' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('plus', 'IconPlus', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M5 12l14 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('refresh', 'IconRefresh', [\n ['path', { d: 'M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4', key: 'svg-0' }],\n ['path', { d: 'M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('search', 'IconSearch', [\n ['path', { d: 'M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0', key: 'svg-0' }],\n ['path', { d: 'M21 21l-6 -6', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('settings', 'IconSettings', [\n [\n 'path',\n {\n d: 'M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-ascending', 'IconSortAscending', [\n ['path', { d: 'M4 6l7 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l9 0', key: 'svg-2' }],\n ['path', { d: 'M15 9l3 -3l3 3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-descending', 'IconSortDescending', [\n ['path', { d: 'M4 6l9 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l7 0', key: 'svg-2' }],\n ['path', { d: 'M15 15l3 3l3 -3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('square', 'IconSquare', [\n [\n 'path',\n {\n d: 'M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'switch-horizontal',\n 'IconSwitchHorizontal',\n [\n ['path', { d: 'M16 3l4 4l-4 4', key: 'svg-0' }],\n ['path', { d: 'M10 7l10 0', key: 'svg-1' }],\n ['path', { d: 'M8 13l-4 4l4 4', key: 'svg-2' }],\n ['path', { d: 'M4 17l9 0', key: 'svg-3' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('table-export', 'IconTableExport', [\n [\n 'path',\n {\n d: 'M12.5 21h-7.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v7.5',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 10h18', key: 'svg-1' }],\n ['path', { d: 'M10 3v18', key: 'svg-2' }],\n ['path', { d: 'M16 19h6', key: 'svg-3' }],\n ['path', { d: 'M19 16l3 3l-3 3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('trash', 'IconTrash', [\n ['path', { d: 'M4 7l16 0', key: 'svg-0' }],\n ['path', { d: 'M10 11l0 6', key: 'svg-1' }],\n ['path', { d: 'M14 11l0 6', key: 'svg-2' }],\n [\n 'path',\n { d: 'M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12', key: 'svg-3' },\n ],\n ['path', { d: 'M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('x', 'IconX', [\n ['path', { d: 'M18 6l-12 12', key: 'svg-0' }],\n ['path', { d: 'M6 6l12 12', key: 'svg-1' }],\n]);\n", "import { Center, Loader } from '@mantine/core';\nimport React from 'react';\n\nexport function Loading(): JSX.Element {\n return (\n <Center style={{ width: '100%', height: '100vh' }}>\n <Loader />\n </Center>\n );\n}\n", "import { Avatar, createStyles, Group, Header as MantineHeader, Menu, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { formatHumanName, getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { IconChevronDown, IconLogout, IconSettings, IconSwitchHorizontal } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { useMedplumContext } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { HeaderSearchInput } from './HeaderSearchInput';\n\nconst useStyles = createStyles((theme) => ({\n logoButton: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n user: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n userName: {\n fontWeight: 500,\n lineHeight: 1,\n marginRight: 3,\n\n [theme.fn.smallerThan('xs')]: {\n display: 'none',\n },\n },\n\n userActive: {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n}));\n\ninterface HeaderProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n logo: React.ReactNode;\n version?: string;\n navbarToggle: () => void;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const context = useMedplumContext();\n const { medplum, profile, navigate } = context;\n const logins = medplum.getLogins();\n const { classes, cx } = useStyles();\n const [userMenuOpened, setUserMenuOpened] = useState(false);\n\n return (\n <MantineHeader height={60} p={8} style={{ zIndex: 101 }}>\n <Group position=\"apart\">\n <Group spacing=\"xs\">\n <UnstyledButton className={classes.logoButton} onClick={props.navbarToggle}>\n {props.logo}\n </UnstyledButton>\n <HeaderSearchInput pathname={props.pathname} searchParams={props.searchParams} />\n </Group>\n\n <Menu\n width={260}\n shadow=\"xl\"\n position=\"bottom-end\"\n transitionProps={{ transition: 'pop-top-right' }}\n opened={userMenuOpened}\n onClose={() => setUserMenuOpened(false)}\n >\n <Menu.Target>\n <UnstyledButton\n className={cx(classes.user, { [classes.userActive]: userMenuOpened })}\n onClick={() => setUserMenuOpened((o) => !o)}\n >\n <Group spacing={7}>\n <ResourceAvatar value={profile} radius=\"xl\" size={24} />\n <Text size=\"sm\" className={classes.userName}>\n {formatHumanName(profile?.name?.[0] as HumanName)}\n </Text>\n <IconChevronDown size={12} stroke={1.5} />\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <Menu.Dropdown>\n <Stack align=\"center\" p=\"xl\">\n <ResourceAvatar size=\"xl\" radius={100} value={context.profile} />\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n <Text color=\"dimmed\" size=\"xs\">\n {medplum.getActiveLogin()?.project.display}\n </Text>\n </Stack>\n {logins.length > 1 && <Menu.Divider />}\n {logins.map(\n (login) =>\n login.profile.reference !== getReferenceString(context.profile as ProfileResource) && (\n <Menu.Item\n key={login.profile.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => window.location.reload())\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {login.profile.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {login.project.display}\n </Text>\n </div>\n </Group>\n </Menu.Item>\n )\n )}\n <Menu.Divider />\n <Menu.Item icon={<IconSwitchHorizontal size={14} stroke={1.5} />} onClick={() => navigate('/signin')}>\n Add another account\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} stroke={1.5} />}\n onClick={() => navigate(`/${getReferenceString(profile as ProfileResource)}`)}\n >\n Account settings\n </Menu.Item>\n <Menu.Item\n icon={<IconLogout size={14} stroke={1.5} />}\n onClick={async () => {\n await medplum.signOut();\n navigate('/signin');\n }}\n >\n Sign out\n </Menu.Item>\n <Text size=\"xs\" color=\"dimmed\" align=\"center\">\n {props.version}\n </Text>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </MantineHeader>\n );\n}\n", "import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n", "import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n", "import { Anchor, TextProps } from '@mantine/core';\nimport { isReference, isResource } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: React.MouseEventHandler;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n if (onClick) {\n onClick(e);\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if (isResource(to)) {\n return getResourceHref(to);\n } else if (isReference(to)) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n", "/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n", "import { deepEquals, isReference, isResource, MedplumClient, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @param setOutcome Optional callback to set the OperationOutcome.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(\n value: Reference<T> | T | undefined,\n setOutcome?: (outcome: OperationOutcome) => void\n): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n const setResourceIfChanged = useCallback(\n (r: T | undefined) => {\n if (!deepEquals(r, resource)) {\n setResource(r);\n }\n },\n [resource, setResource]\n );\n\n useEffect(() => {\n setResourceIfChanged(getInitialResource(medplum, value));\n }, [medplum, value, setResourceIfChanged]);\n\n useEffect(() => {\n let subscribed = true;\n\n if (isReference(value)) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResourceIfChanged(r);\n }\n })\n .catch((err) => {\n if (subscribed) {\n setResourceIfChanged(undefined);\n if (setOutcome) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }\n });\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value, setResourceIfChanged, setOutcome]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (value) {\n if (isResource(value)) {\n return value;\n }\n\n if (isReference(value)) {\n return medplum.getCachedReference(value as Reference<T>);\n }\n }\n\n return undefined;\n}\n", "import { createStyles, Group, Text } from '@mantine/core';\nimport { formatHumanName, getDisplayString, getReferenceString, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport { IconSearch } from '@tabler/icons-react';\nimport React, { forwardRef, useCallback } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum, useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nconst useStyles = createStyles(() => {\n return {\n searchInput: {\n input: {\n width: 220,\n transition: 'width 0.2s',\n },\n 'input:focus': {\n width: 400,\n },\n '@media (max-width: 800px)': {\n input: {\n width: 150,\n },\n 'input:focus': {\n width: 150,\n },\n },\n },\n };\n});\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nfunction toKey(resource: HeaderSearchTypes): string {\n return resource.id as string;\n}\n\nfunction toOption(resource: HeaderSearchTypes): AsyncAutocompleteOption<HeaderSearchTypes> {\n return {\n value: resource.id as string,\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport interface HeaderSearchInputProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const medplum = useMedplum();\n\n const loadData = useCallback(\n async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n const query = buildGraphQLQuery(input);\n const options = { signal };\n const response = (await medplum.graphql(query, undefined, undefined, options)) as SearchGraphQLResponse;\n return getResourcesFromResponse(response, input);\n },\n [medplum]\n );\n\n const handleSelect = useCallback(\n (item: HeaderSearchTypes[]): void => {\n if (item.length > 0) {\n navigate(`/${getReferenceString(item[0])}`);\n }\n },\n [navigate]\n );\n\n return (\n <AsyncAutocomplete\n key={`${props.pathname}?${props.searchParams}`}\n size=\"sm\"\n radius=\"md\"\n className={classes.searchInput}\n icon={<IconSearch size={16} />}\n placeholder=\"Search\"\n itemComponent={ItemComponent}\n toKey={toKey}\n toOption={toOption}\n onChange={handleSelect}\n loadOptions={loadData}\n maxSelectedValues={0}\n clearSearchOnChange\n clearable={false}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(\n ({ resource, ...others }: AsyncAutocompleteOption<HeaderSearchTypes>, ref) => {\n let helpText: string | undefined = undefined;\n\n if (resource.resourceType === 'Patient') {\n helpText = resource.birthDate;\n } else if (resource.resourceType === 'ServiceRequest') {\n helpText = resource.subject?.display;\n }\n\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{getDisplayString(resource)}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {helpText}\n </Text>\n </div>\n </Group>\n </div>\n );\n }\n);\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response The response from a search query.\n * @param query The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources The candidate resources.\n * @param query The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource The candidate resource.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str The candidate display string.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n", "import { Loader, MultiSelect, MultiSelectProps, SelectItem } from '@mantine/core';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { killEvent } from '../utils/dom';\n\nexport interface AsyncAutocompleteOption<T> extends SelectItem {\n resource: T;\n}\n\nexport interface AsyncAutocompleteProps<T>\n extends Omit<MultiSelectProps, 'data' | 'defaultValue' | 'loadOptions' | 'onChange' | 'onCreate' | 'searchable'> {\n defaultValue?: T | T[];\n toKey: (item: T) => string;\n toOption: (item: T) => AsyncAutocompleteOption<T>;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n onChange: (item: T[]) => void;\n onCreate?: (input: string) => T;\n creatable?: boolean;\n}\n\nexport function AsyncAutocomplete<T>(props: AsyncAutocompleteProps<T>): JSX.Element {\n const { defaultValue, toKey, toOption, loadOptions, onChange, onCreate, creatable, ...rest } = props;\n const defaultItems = toDefaultItems(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const [lastValue, setLastValue] = useState<string | undefined>(undefined);\n const [timer, setTimer] = useState<number>();\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n const [selected, setSelected] = useState<AsyncAutocompleteOption<T>[]>(defaultItems.map(toOption));\n const [options, setOptions] = useState<AsyncAutocompleteOption<T>[]>([]);\n\n const lastValueRef = useRef<string>();\n lastValueRef.current = lastValue;\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n const optionsRef = useRef<AsyncAutocompleteOption<T>[]>();\n optionsRef.current = options;\n\n const handleTimer = useCallback((): void => {\n setTimer(undefined);\n\n const value = inputRef.current?.value.trim() || '';\n if (value === lastValueRef.current) {\n // Nothing has changed, move on\n return;\n }\n\n setLastValue(value);\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n loadOptions(value, newAbortController.signal)\n .then((newValues: T[]) => {\n if (!newAbortController.signal.aborted) {\n setOptions(newValues.map(toOption));\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n if (newValues.length > 0) {\n onChange(newValues.slice(0, 1));\n }\n setAutoSubmit(false);\n }\n }\n })\n .catch((err) => {\n if (!(newAbortController.signal.aborted || err.message.includes('aborted'))) {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n }\n });\n }, [loadOptions, onChange, toOption]);\n\n const handleSearchChange = useCallback((): void => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }, [handleTimer]);\n\n const handleChange = useCallback(\n (values: string[]): void => {\n const result: T[] = [];\n const newSelected: AsyncAutocompleteOption<T>[] = [];\n for (const value of values) {\n let option = optionsRef.current?.find((option) => option.value === value);\n let item = option?.resource;\n if (!item && creatable !== false && onCreate) {\n item = onCreate(value);\n option = toOption(item);\n }\n\n if (item) {\n result.push(item);\n }\n\n if (option) {\n newSelected.push(option);\n }\n }\n onChange(result);\n setSelected(newSelected);\n },\n [creatable, onChange, onCreate, toOption]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent): void => {\n if (e.key === 'Enter') {\n if (!timerRef.current && !abortControllerRef.current) {\n killEvent(e);\n if (optionsRef.current && optionsRef.current.length > 0) {\n setOptions(optionsRef.current.slice(0, 1));\n handleChange([optionsRef.current[0].value]);\n }\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n },\n [handleChange]\n );\n\n const handleCreate = useCallback(\n (input: string): AsyncAutocompleteOption<T> => {\n const option = toOption((onCreate as (input: string) => T)(input));\n setOptions([...(optionsRef.current as AsyncAutocompleteOption<T>[]), option]);\n return option;\n },\n [onCreate, setOptions, toOption]\n );\n\n const handleFilter = useCallback((_value: string, selected: boolean) => !selected, []);\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return (\n <MultiSelect\n {...rest}\n ref={inputRef}\n defaultValue={defaultItems.map(toKey)}\n searchable\n onKeyDown={handleKeyDown}\n onSearchChange={handleSearchChange}\n data={[...selected, ...options]}\n onFocus={handleTimer}\n onChange={handleChange}\n onCreate={handleCreate}\n rightSectionWidth={40}\n rightSection={abortController ? <Loader size={16} /> : null}\n filter={handleFilter}\n creatable\n />\n );\n}\n\nfunction toDefaultItems<T>(defaultValue: T | T[] | undefined): T[] {\n if (!defaultValue) {\n return [];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue;\n }\n return [defaultValue];\n}\n", "import { Button, createStyles, Navbar as MantineNavbar, ScrollArea, Space, Text } from '@mantine/core';\nimport { IconPlus } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { BookmarkDialog } from '../BookmarkDialog/BookmarkDialog';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\n\nconst useStyles = createStyles((theme) => {\n return {\n menuTitle: {\n margin: '20px 0 4px 6px',\n fontSize: '9px',\n fontWeight: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '2px',\n },\n\n link: {\n ...theme.fn.focusStyles(),\n display: 'flex',\n alignItems: 'center',\n textDecoration: 'none',\n fontSize: theme.fontSizes.sm,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[7],\n padding: `8px 12px`,\n borderRadius: theme.radius.sm,\n fontWeight: 500,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n textDecoration: 'none',\n\n [`& svg`]: {\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n },\n },\n\n '& svg': {\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n marginRight: theme.spacing.sm,\n strokeWidth: 1.5,\n width: 18,\n height: 18,\n },\n },\n\n linkActive: {\n '&, &:hover': {\n backgroundColor: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).background,\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n [`& svg`]: {\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n },\n },\n },\n };\n});\n\nexport interface NavbarLink {\n icon?: JSX.Element;\n label?: string;\n href: string;\n}\n\nexport interface NavbarMenu {\n title?: string;\n links?: NavbarLink[];\n}\n\nexport interface NavbarProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n menus?: NavbarMenu[];\n closeNavbar: () => void;\n displayAddBookmark?: boolean;\n}\n\nexport function Navbar(props: NavbarProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const activeLink = getActiveLink(props.pathname, props.searchParams, props.menus);\n const [bookmarkDialogVisible, setBookmarkDialogVisible] = useState(false);\n\n function onLinkClick(e: React.SyntheticEvent, to: string): void {\n e.stopPropagation();\n e.preventDefault();\n navigate(to);\n if (window.innerWidth < 768) {\n props.closeNavbar();\n }\n }\n\n function navigateResourceType(resourceType: string | undefined): void {\n if (resourceType) {\n navigate(`/${resourceType}`);\n }\n }\n\n return (\n <>\n <MantineNavbar width={{ sm: 250 }} p=\"xs\">\n <ScrollArea>\n <MantineNavbar.Section mb=\"sm\">\n <CodeInput\n key={window.location.pathname}\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n property={{\n binding: {\n valueSet: 'https://medplum.com/fhir/ValueSet/resource-types',\n },\n }}\n onChange={(newValue) => navigateResourceType(newValue)}\n creatable={false}\n maxSelectedValues={0}\n clearSearchOnChange={true}\n clearable={false}\n />\n </MantineNavbar.Section>\n <MantineNavbar.Section grow>\n {props.menus?.map((menu) => (\n <React.Fragment key={`menu-${menu.title}`}>\n <Text className={classes.menuTitle}>{menu.title}</Text>\n {menu.links?.map((link) => (\n <NavbarLink\n key={link.href}\n to={link.href}\n active={link.href === activeLink?.href}\n onClick={(e) => onLinkClick(e, link.href)}\n >\n <NavLinkIcon to={link.href} icon={link.icon} />\n <span>{link.label}</span>\n </NavbarLink>\n ))}\n </React.Fragment>\n ))}\n {props.displayAddBookmark && (\n <Button\n variant=\"subtle\"\n size=\"xs\"\n mt=\"xl\"\n leftIcon={<IconPlus size=\"0.75rem\" />}\n onClick={() => setBookmarkDialogVisible(true)}\n >\n Add Bookmark\n </Button>\n )}\n </MantineNavbar.Section>\n </ScrollArea>\n </MantineNavbar>\n {props.pathname && props.searchParams && (\n <BookmarkDialog\n pathname={props.pathname}\n searchParams={props.searchParams}\n visible={bookmarkDialogVisible}\n onOk={() => setBookmarkDialogVisible(false)}\n onCancel={() => setBookmarkDialogVisible(false)}\n />\n )}\n </>\n );\n}\n\ninterface NavbarLinkProps {\n to: string;\n active: boolean;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}\n\nfunction NavbarLink(props: NavbarLinkProps): JSX.Element {\n const { classes, cx } = useStyles();\n return (\n <MedplumLink\n onClick={props.onClick}\n to={props.to}\n className={cx(classes.link, { [classes.linkActive]: props.active })}\n >\n {props.children}\n </MedplumLink>\n );\n}\n\ninterface NavLinkIconProps {\n to: string;\n icon?: JSX.Element;\n}\n\nfunction NavLinkIcon(props: NavLinkIconProps): JSX.Element {\n if (props.icon) {\n return props.icon;\n }\n return <Space w={30} />;\n}\n\n/**\n * Returns the best \"active\" link for the menu.\n * In most cases, the navbar links are simple, and an exact match can determine which link is active.\n * However, we ignore some search parameters to support pagination.\n * But we cannot ignore all search parameters, to support separate links based on search filters.\n * So in the end, we use a simple scoring system based on the number of matching query search params.\n * @param currentPathname The web browser current pathname.\n * @param currentSearchParams The web browser current search parameters.\n * @param menus Collection of navbar menus and links.\n * @returns The active link if one is found.\n */\nfunction getActiveLink(\n currentPathname: string | undefined,\n currentSearchParams: URLSearchParams | undefined,\n menus: NavbarMenu[] | undefined\n): NavbarLink | undefined {\n if (!currentPathname || !currentSearchParams || !menus) {\n return undefined;\n }\n\n let bestLink = undefined;\n let bestScore = 0;\n\n for (const menu of menus) {\n if (menu.links) {\n for (const link of menu.links) {\n const score = getLinkScore(currentPathname, currentSearchParams, link.href);\n if (score > bestScore) {\n bestScore = score;\n bestLink = link;\n }\n }\n }\n }\n\n return bestLink;\n}\n\n/**\n * Calculates a score for a link.\n * Zero means \"does not match at all\".\n * One means \"matches the pathname only\".\n * Additional increases for each matching search parameter.\n * Ignores pagination parameters \"_count\" and \"_offset\".\n * @param currentPathname The web browser current pathname.\n * @param currentSearchParams The web browser current search parameters.\n * @param linkHref A candidate link href.\n * @returns The link score.\n */\nfunction getLinkScore(currentPathname: string, currentSearchParams: URLSearchParams, linkHref: string): number {\n const linkUrl = new URL(linkHref, 'https://example.com');\n if (currentPathname !== linkUrl.pathname) {\n return 0;\n }\n const ignoredParams = ['_count', '_offset'];\n for (const [key, value] of linkUrl.searchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (currentSearchParams.get(key) !== value) {\n return 0;\n }\n }\n let count = 1;\n for (const [key, value] of currentSearchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (linkUrl.searchParams.get(key) === value) {\n count++;\n }\n }\n return count;\n}\n", "import { Button, Group, Modal, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { deepClone, normalizeErrorString } from '@medplum/core';\nimport { UserConfiguration } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\ninterface BookmarkDialogProps {\n pathname: string;\n searchParams: URLSearchParams;\n visible: boolean;\n onOk: () => void;\n onCancel: () => void;\n defaultValue?: string;\n}\nexport function BookmarkDialog(props: BookmarkDialogProps): JSX.Element | null {\n const medplum = useMedplum();\n const config = medplum.getUserConfiguration() as UserConfiguration;\n\n function submitHandler(formData: Record<string, string>): void {\n const { menuname, bookmarkname: name } = formData;\n const target = `${props.pathname}?${props.searchParams.toString()}`;\n const newConfig = deepClone(config) as UserConfiguration;\n const menu = newConfig.menu?.find(({ title }) => title === menuname);\n\n menu?.link?.push({ name, target });\n medplum\n .updateResource(newConfig)\n .then((res) => {\n // refresh current config menu\n config.menu = res.menu;\n medplum.dispatchEvent({ type: 'change' });\n showNotification({ color: 'green', message: 'Success' });\n props.onOk();\n })\n .catch((err: any) => {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n });\n }\n\n return (\n <Modal\n title=\"Add Bookmark\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <Form onSubmit={submitHandler}>\n <Stack>\n <SelectMenu config={config}></SelectMenu>\n <TextInput label=\"Bookmark Name\" type=\"text\" name=\"bookmarkname\" placeholder=\"bookmark name\" withAsterisk />\n <Group position=\"right\">\n <Button mt=\"sm\" type=\"submit\">\n OK\n </Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n );\n}\n\ninterface SelectMenuProps {\n config: UserConfiguration | undefined;\n}\n\nfunction SelectMenu(props: SelectMenuProps): JSX.Element {\n function userConfigToMenu(config: UserConfiguration | undefined): string[] {\n return config?.menu?.map((menu) => menu.title) as [];\n }\n const menus = userConfigToMenu(props.config);\n\n return (\n <NativeSelect\n name=\"menuname\"\n defaultValue={menus[0]}\n label=\"Select Menu Option\"\n placeholder=\"Menu\"\n data={menus}\n withAsterisk\n />\n );\n}\n", "import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n", "/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n * @returns Form values in key value pairs.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param result The result builder.\n * @param el The input element.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n", "import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n creatable?: boolean;\n maxSelectedValues?: number;\n clearSearchOnChange?: boolean;\n clearable?: boolean;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [value, setValue] = useState<string | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (props.onChange) {\n props.onChange(newCode);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={codeToValueSetElement(value)}\n onChange={handleChange}\n creatable={props.creatable}\n maxSelectedValues={props.maxSelectedValues ?? 1}\n clearSearchOnChange={props.clearSearchOnChange}\n clearable={props.clearable}\n />\n );\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n", "import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n elementDefinition: ElementDefinition;\n creatable?: boolean;\n clearable?: boolean;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n if (typeof element.code === 'string') {\n return element.code;\n }\n return JSON.stringify(element);\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n if (typeof item.display === 'string') {\n return item.display;\n }\n return toKey(item);\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: toKey(element),\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\n/**\n * A low-level component to autocomplete based on a FHIR Valueset.\n * This is the base component for CodeableConceptInput, CodingInput, and CodeInput.\n * @param props The ValueSetAutocomplete React props.\n * @returns The ValueSetAutocomplete React node.\n */\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { elementDefinition, creatable, clearable, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n if (!elementDefinition.binding) {\n return [];\n }\n const system = elementDefinition.binding.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input, { signal });\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, elementDefinition]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable={creatable ?? true}\n clearable={clearable ?? true}\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n onCreate={createValue}\n getCreateLabel={creatable === false ? undefined : (query: any) => `+ Create ${query}`}\n />\n );\n}\n", "import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values?.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n", "import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons-react';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n children(props: { onClick(e: React.MouseEvent): void }): React.ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: React.MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n * @param file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n", "import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n", "import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n const property = entry[1];\n if (!property.path) {\n property.path = typeName + '.' + key;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n", "export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n", "import { createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n display: 'grid',\n gridTemplateColumns: '30% 70%',\n margin: 0,\n\n '& > dt, & > dd': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n margin: 0,\n },\n },\n\n compact: {\n gridTemplateColumns: '20% 80%',\n\n '& > dt, & > dd': {\n padding: `0 ${theme.spacing.xs} ${theme.spacing.xs} 0`,\n border: 0,\n },\n },\n}));\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n const { classes, cx } = useStyles();\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n", "import {\n formatDateTime,\n formatPeriod,\n formatTiming,\n getElementDefinitionTypeName,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\nimport { ActionIcon, Box, CopyButton, Tooltip } from '@mantine/core';\nimport { IconCheck, IconCopy } from '@tabler/icons-react';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information.\n * @param props The ResourcePropertyDisplay React props.\n * @returns The ResourcePropertyDisplay React node.\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n const isIdProperty = property?.path?.endsWith('.id');\n if (isIdProperty) {\n return (\n <Box component=\"div\" sx={{ display: 'flex', gap: 3, alignItems: 'center' }}>\n {value}\n <CopyButton value={value} timeout={2000}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? 'Copied' : 'Copy'} withArrow position=\"right\">\n <ActionIcon color={copied ? 'teal' : 'gray'} onClick={copy}>\n {copied ? <IconCheck size=\"1rem\" /> : <IconCopy size=\"1rem\" />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n </Box>\n );\n }\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.string:\n return <div style={{ whiteSpace: 'pre-wrap' }}>{value}</div>;\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: getElementDefinitionTypeName(property), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n", "import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n", "import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n", "import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom) => (\n <ContactPointDisplay key={`telecom-${contactDetail.name}-${telecom.value}`} value={telecom} />\n ))}\n </>\n );\n}\n", "import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n", "import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n", "import { formatMoney } from '@medplum/core';\nimport { Money } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface MoneyDisplayProps {\n value?: Money;\n}\n\nexport function MoneyDisplay(props: MoneyDisplayProps): JSX.Element | null {\n return <>{formatMoney(props.value)}</>;\n}\n", "import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n", "import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n", "import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n / \n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n", "import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n", "import { Stack } from '@mantine/core';\nimport { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <Stack>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n const required = property.min !== undefined && property.min > 0;\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n withAsterisk={required}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n", "import { Group, Input } from '@mantine/core';\nimport React from 'react';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n withAsterisk?: boolean;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <Group noWrap>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n withAsterisk={props.withAsterisk}\n >\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n", "import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n withAsterisk?: boolean;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n withAsterisk={props.withAsterisk}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n", "import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n", "import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { capitalize, deepClone, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(deepClone(defaultValue));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={props.outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={props.outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n", "import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { capitalize, getElementDefinitionTypeName, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { MoneyInput } from '../MoneyInput/MoneyInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </Group>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n const required = property.min !== undefined && property.min > 0;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={value} onChange={props.onChange} outcome={props.outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Money:\n return <MoneyInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Duration:\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n case PropertyType.Timing:\n return <TimingInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementInput\n typeName={propertyType}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n default:\n return (\n <BackboneElementInput\n typeName={getElementDefinitionTypeName(property)}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n", "import { CodeableConcept, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const [value, setValue] = useState<CodeableConcept | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newConcept = valueSetElementToCodeableConcept(newValues);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codeableConceptToValueSetElement(value)}\n maxSelectedValues={1}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains[] | undefined {\n return concept.coding?.map((c) => ({\n system: c.system,\n code: c.code,\n display: c.display,\n }));\n}\n\nfunction valueSetElementToCodeableConcept(elements: ValueSetExpansionContains[]): CodeableConcept | undefined {\n if (elements.length === 0) {\n return undefined;\n }\n return {\n coding: elements.map((e) => ({\n system: e.system,\n code: e.code,\n display: e.display,\n })),\n };\n}\n", "import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n maxSelectedValues={1}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n onChange={(e) => setValue(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { isValidDate } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n autoFocus?: boolean;\n required?: boolean;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name}\n placeholder={props.placeholder}\n required={props.required}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n autoFocus={props.autoFocus}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @returns The input type for the current environment.\n */\nfunction getInputType(): string {\n return process.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n", "import { JsonInput } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-input\"\n defaultValue={stringify(props.defaultValue)}\n deserialize={JSON.parse}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n setValueWrapper({ ...valueRef.current, use: use || undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family || undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n defaultValue={value?.use}\n name={props.name + '-use'}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n />\n <TextInput\n placeholder=\"Prefix\"\n name={props.name + '-prefix'}\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Given\"\n name={props.name + '-given'}\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n />\n <TextInput\n name={props.name + '-family'}\n placeholder=\"Family\"\n defaultValue={value?.family}\n onChange={(e) => setFamily(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Suffix\"\n name={props.name + '-suffix'}\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n />\n </Group>\n );\n}\n", "import { NativeSelect, TextInput } from '@mantine/core';\nimport { Money } from '@medplum/fhirtypes';\nimport { IconCurrencyDollar } from '@tabler/icons-react';\nimport React, { useCallback, useState } from 'react';\n\n/*\n * Based on: https://github.com/mantinedev/ui.mantine.dev/blob/master/components/CurrencyInput/CurrencyInput.tsx\n */\n\n/**\n * List of currencies.\n *\n * Full list of currencies:\n * https://www.hl7.org/fhir/valueset-currencies.html\n *\n * Latest browsers can report list of supported currencies, but it's not widely supported:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/supportedValuesOf\n *\n * Using a short list for simplicity for now.\n */\nconst data = ['USD', 'EUR', 'CAD', 'GBP', 'AUD'];\n\nexport interface MoneyInputProps {\n name: string;\n label?: string;\n placeholder?: string;\n defaultValue?: Money;\n onChange?: (value: Money) => void;\n}\n\nexport function MoneyInput(props: MoneyInputProps): JSX.Element {\n const { onChange } = props;\n const [value, setValue] = useState(props.defaultValue);\n\n const setValueWrapper = useCallback(\n (newValue: Money): void => {\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const handleCurrencyChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n setValueWrapper({\n ...value,\n currency: e.currentTarget.value,\n });\n },\n [value, setValueWrapper]\n );\n\n const handleValueChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setValueWrapper({\n ...value,\n value: e.currentTarget.valueAsNumber,\n });\n },\n [value, setValueWrapper]\n );\n\n const select = (\n <NativeSelect\n defaultValue={value?.currency}\n data={data}\n styles={{\n input: {\n fontWeight: 500,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n width: 92,\n },\n }}\n onChange={handleCurrencyChange}\n />\n );\n\n return (\n <TextInput\n type=\"number\"\n label={props.label}\n placeholder={props.placeholder ?? 'Value'}\n defaultValue={value?.value?.toString() ?? 'USD'}\n icon={<IconCurrencyDollar size={14} />}\n rightSection={select}\n rightSectionWidth={92}\n onChange={handleValueChange}\n />\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React, { useState, WheelEvent } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n autoFocus?: boolean;\n onChange?: (value: Quantity) => void;\n disableWheel?: boolean;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name + '-value'}\n type=\"number\"\n placeholder=\"Value\"\n defaultValue={value?.value}\n autoFocus={props.autoFocus}\n step=\"any\"\n onWheel={(e: WheelEvent<HTMLInputElement>) => {\n if (props.disableWheel) {\n e.currentTarget.blur();\n }\n }}\n onChange={(e) => {\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n });\n }}\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n", "import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n autoFocus?: boolean;\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = getTargetTypes(props.targetTypes);\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getTargetTypes(targetTypes: string[] | undefined): string[] | undefined {\n if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {\n return undefined;\n }\n return targetTypes;\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n", "import { Group, Text } from '@mantine/core';\nimport { getDisplayString, getReferenceString } from '@medplum/core';\nimport { OperationOutcome, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { forwardRef, useCallback, useState } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Search parameter overrides for specific resource types.\n * Use this to specify the search parameter to use for a given resource type.\n * Otherwise it will fallback to \"name\" if the resource type is in NAME_RESOURCE_TYPES.\n * Otherwise it will fallback to \"_id\".\n */\nconst SEARCH_CODES: Record<string, string> = {\n Observation: 'code',\n User: 'email:contains',\n};\n\n/**\n * Resource types that should use the \"name\" search parameter.\n * This is the full list of resource types that have a \"name\" search parameter.\n * Otherwise it will fallback to \"_id\".\n */\nconst NAME_RESOURCE_TYPES = [\n 'AccessPolicy',\n 'Account',\n 'ActivityDefinition',\n 'Bot',\n 'CapabilityStatement',\n 'ClientApplication',\n 'CodeSystem',\n 'CompartmentDefinition',\n 'ConceptMap',\n 'EffectEvidenceSynthesis',\n 'Endpoint',\n 'EventDefinition',\n 'Evidence',\n 'EvidenceVariable',\n 'ExampleScenario',\n 'GraphDefinition',\n 'HealthcareService',\n 'ImplementationGuide',\n 'InsurancePlan',\n 'Library',\n 'Location',\n 'Measure',\n 'MedicinalProduct',\n 'MessageDefinition',\n 'NamingSystem',\n 'OperationDefinition',\n 'Organization',\n 'Patient',\n 'Person',\n 'PlanDefinition',\n 'Practitioner',\n 'Project',\n 'Questionnaire',\n 'RelatedPerson',\n 'ResearchDefinition',\n 'ResearchElementDefinition',\n 'RiskEvidenceSynthesis',\n 'SearchParameter',\n 'StructureDefinition',\n 'StructureMap',\n 'TerminologyCapabilities',\n 'TestScript',\n 'UserConfiguration',\n 'ValueSet',\n];\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: T['resourceType'];\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nfunction toOption<T extends Resource>(resource: T): AsyncAutocompleteOption<T> {\n return {\n value: getReferenceString(resource),\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element | null {\n const medplum = useMedplum();\n const resourceType = props.resourceType;\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const defaultValue = useResource(props.defaultValue, setOutcome);\n const onChange = props.onChange;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<T[]> => {\n const searchCode = getSearchParamForResourceType(resourceType);\n const searchParams = new URLSearchParams({\n [searchCode]: input,\n _count: '10',\n });\n\n const resources = await medplum.searchResources(resourceType, searchParams, { signal });\n return resources as unknown as T[];\n },\n [medplum, resourceType]\n );\n\n const handleChange = useCallback(\n (newResources: T[]) => {\n if (onChange) {\n onChange(newResources[0]);\n }\n },\n [onChange]\n );\n\n if (props.defaultValue && !outcome && !defaultValue) {\n // If a default value was specified, but the default resource is not loaded yet,\n // then return null to avoid rendering the input until the default resource is loaded.\n // The Mantine <MultiSelect> component does not reliably handle changes to defaultValue.\n return null;\n }\n\n return (\n <AsyncAutocomplete<T>\n name={props.name}\n itemComponent={ItemComponent}\n defaultValue={defaultValue}\n placeholder={props.placeholder}\n maxSelectedValues={1}\n toKey={getReferenceString}\n toOption={toOption}\n loadOptions={loadValues}\n onChange={handleChange}\n clearable\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ label, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{label}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n\n/**\n * Returns the search parameter to use for the given resource type.\n * If the resource type is in SEARCH_CODES, then that value is used.\n * Otherwise, if the resource type is in NAME_RESOURCE_TYPES, then \"name\" is used.\n * Otherwise, \"_id\" is used.\n * @param resourceType The FHIR resource type.\n * @returns The search parameter to use for the autocomplete input.\n */\nfunction getSearchParamForResourceType(resourceType: string): string {\n return SEARCH_CODES[resourceType] ?? (NAME_RESOURCE_TYPES.includes(resourceType) ? 'name' : '_id');\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { Button, Chip, Group, Modal, NativeSelect, Stack, Switch, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\ntype PeriodUnit = 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing | undefined>(props.defaultValue);\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nconst defaultValue: Timing = {\n repeat: {\n period: 1,\n periodUnit: 'd',\n },\n};\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || defaultValue);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat | undefined): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: PeriodUnit | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDaysOfWeek(newDaysOfWeek: DayOfWeek[] | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <Stack>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <Switch\n label=\"Repeat\"\n checked={!!value.repeat}\n onChange={(e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined)}\n />\n {value.repeat && (\n <>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value.repeat.period || 1}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value, 10) || 1)}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value.repeat.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as PeriodUnit | undefined)}\n data={[\n { label: 'second', value: 's' },\n { label: 'minute', value: 'min' },\n { label: 'hour', value: 'h' },\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n {value.repeat.periodUnit === 'wk' && (\n <FormSection title=\"Repeat on\">\n <Chip.Group multiple onChange={setDaysOfWeek as (v: string[] | undefined) => void}>\n <Group position=\"apart\" mt=\"md\" spacing=\"xs\">\n {daysOfWeek.map((day) => (\n <Chip key={day} value={day} size=\"xs\" radius=\"xl\">\n {day.charAt(0).toUpperCase()}\n </Chip>\n ))}\n </Group>\n </Chip.Group>\n </FormSection>\n )}\n </>\n )}\n <Group position=\"right\">\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n", "import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport React, { useMemo, useState } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n <\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n >\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "import { Container as MantineContainer, ContainerProps, createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles(() => ({\n root: {\n '@media (max-width: 800px)': {\n paddingLeft: 4,\n paddingRight: 4,\n },\n },\n}));\n\nexport function Container(props: ContainerProps): JSX.Element {\n const { children, ...others } = props;\n const { classes } = useStyles();\n\n return (\n <MantineContainer className={classes.root} {...others}>\n {children}\n </MantineContainer>\n );\n}\n", "import { MedplumClient } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory(resourceType, id),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n />\n );\n}\n", "import { ActionIcon, Center, createStyles, Group, Loader, Menu, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, MedplumClient, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { useMedplum, useMedplumNavigate } from '../MedplumProvider/MedplumProvider';\nimport { Panel } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { useResource } from '../useResource/useResource';\nimport { sortByDateAndPriority } from '../utils/date';\n\nconst useStyles = createStyles((theme) => ({\n pinnedComment: {\n backgroundColor: theme.colors.blue[0],\n },\n}));\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n loadTimelineResources: (\n medplum: MedplumClient,\n resourceType: ResourceType,\n id: string\n ) => Promise<PromiseSettledResult<Bundle>[]>;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const medplum = useMedplum();\n const navigate = useMedplumNavigate();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const loadTimelineResources = props.loadTimelineResources;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n /**\n * Sorts and sets the items.\n *\n * Sorting is primarily a function of meta.lastUpdated, but there are special cases.\n * When displaying connected resources, for example a Communication in the context of an Encounter,\n * the Communication.sent time is used rather than Communication.meta.lastUpdated.\n *\n * Other examples of special cases:\n * - DiagnosticReport.issued\n * - Media.issued\n * - Observation.issued\n * - DocumentReference.date\n *\n * See \"sortByDateAndPriority()\" for more details.\n */\n const sortAndSetItems = useCallback(\n (newItmes: Resource[]): void => {\n sortByDateAndPriority(newItmes, resource);\n newItmes.reverse();\n setItems(newItmes);\n },\n [resource]\n );\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n const handleBatchResponse = useCallback(\n (batchResponse: PromiseSettledResult<Bundle>[]): void => {\n const newItems = [];\n\n for (const settledResult of batchResponse) {\n if (settledResult.status !== 'fulfilled') {\n // User may not have access to all resource types\n continue;\n }\n\n const bundle = settledResult.value;\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortAndSetItems(newItems);\n },\n [sortAndSetItems]\n );\n\n /**\n * Adds an array of resources to the timeline.\n * @param resource Resource to add.\n */\n const addResource = useCallback(\n (resource: Resource): void => sortAndSetItems([...itemsRef.current, resource]),\n [sortAndSetItems]\n );\n\n /**\n * Loads the timeline.\n */\n const loadTimeline = useCallback(() => {\n let resourceType: ResourceType;\n let id: string;\n if ('resourceType' in props.value) {\n resourceType = props.value.resourceType;\n id = props.value.id as string;\n } else {\n [resourceType, id] = props.value.reference?.split('/') as [ResourceType, string];\n }\n loadTimelineResources(medplum, resourceType, id).then(handleBatchResponse).catch(console.log);\n }, [medplum, props.value, loadTimelineResources, handleBatchResponse]);\n\n useEffect(() => loadTimeline(), [loadTimeline]);\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => addResource(result))\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResource(result))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Panel>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group spacing=\"xs\" noWrap style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Panel>\n )}\n {items.map((item) => {\n if (!item) {\n // TODO: Handle null history items for deleted versions.\n return null;\n }\n const key = `${item.resourceType}/${item.id}/${item.meta?.versionId}`;\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem key={key} history={history as Bundle} resource={item} onDetails={onVersionDetails} />\n );\n }\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n icon={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n icon={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n icon={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n icon={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n icon={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues forceUseInput />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const { classes } = useStyles();\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n dateTime={props.resource.sent}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n", "import { createStyles, Group, List, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatCodeableConcept, formatDateTime, formatObservationValue, isReference } from '@medplum/core';\nimport {\n Annotation,\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n Specimen,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NoteDisplay } from '../NoteDisplay/NoteDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n borderCollapse: 'collapse',\n\n '& td, & th': {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n padding: 4,\n },\n },\n\n criticalRow: {\n background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],\n border: `0.1px solid ${theme.colors.red[5]}`,\n color: theme.colors.red[5],\n fontWeight: 500,\n\n '& td': {\n border: `0.1px solid ${theme.colors.red[5]}`,\n },\n },\n\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n hideObservationNotes?: boolean;\n hideSpecimenInfo?: boolean;\n}\n\nDiagnosticReportDisplay.defaultProps = {\n hideObservationNotes: false,\n hideSpecimenInfo: false,\n} as DiagnosticReportDisplayProps;\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const diagnosticReport = useResource(props.value);\n const [specimens, setSpecimens] = useState<Specimen[]>();\n\n useEffect(() => {\n if (diagnosticReport?.specimen) {\n Promise.allSettled(diagnosticReport.specimen.map((ref) => medplum.readReference(ref)))\n .then((outcomes) =>\n outcomes\n .filter((outcome) => outcome.status === 'fulfilled')\n .map((outcome) => (outcome as PromiseFulfilledResult<Specimen>).value)\n )\n .then(setSpecimens)\n .catch(console.error);\n }\n }, [medplum, diagnosticReport]);\n\n if (!diagnosticReport) {\n return null;\n }\n\n const specimenNotes: Annotation[] = specimens?.flatMap((spec) => spec.note || []) || [];\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n specimenNotes.push({ text: window.atob(pf.data) });\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <DiagnosticReportHeader value={diagnosticReport} />\n {!props.hideSpecimenInfo && SpecimenInfo(specimens)}\n {diagnosticReport.result && (\n <ObservationTable hideObservationNotes={props.hideObservationNotes} value={diagnosticReport.result} />\n )}\n {specimenNotes.length > 0 && <NoteDisplay value={specimenNotes} />}\n </Stack>\n );\n}\n\ninterface DiagnosticReportHeaderProps {\n value: DiagnosticReport;\n}\n\nfunction DiagnosticReportHeader({ value }: DiagnosticReportHeaderProps): JSX.Element {\n return (\n <Group mt=\"md\" spacing={30}>\n {value.subject && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Subject\n </Text>\n <Text>\n <ResourceBadge value={value.subject} link={true} />\n </Text>\n </div>\n )}\n {value.resultsInterpreter?.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Interpreter\n </Text>\n <Text>\n <ResourceBadge value={interpreter} link={true} />\n </Text>\n </div>\n ))}\n {value.performer?.map((performer) => (\n <div key={performer.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Performer\n </Text>\n <Text>\n <ResourceBadge value={performer} link={true} />\n </Text>\n </div>\n ))}\n {value.issued && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(value.issued)}</Text>\n </div>\n )}\n {value.status && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(value.status)}</Text>\n </div>\n )}\n </Group>\n );\n}\n\nfunction SpecimenInfo(specimens: Specimen[] | undefined): JSX.Element {\n return (\n <Stack spacing={'xs'}>\n <Title order={2} size=\"h6\">\n Specimens\n </Title>\n\n <List type=\"ordered\">\n {specimens?.map((specimen) => (\n <List.Item ml={'sm'} key={`specimen-${specimen.id}`}>\n <Group spacing={20}>\n <Group spacing={5}>\n <Text fw={500}>Collected:</Text> {formatDateTime(specimen.collection?.collectedDateTime)}\n </Group>\n <Group spacing={5}>\n <Text fw={500}>Received:</Text> {formatDateTime(specimen.receivedTime)}\n </Group>\n </Group>\n </List.Item>\n ))}\n </List>\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n hideObservationNotes?: boolean;\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n const { classes } = useStyles();\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n <th>Category</th>\n <th>Performer</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <ObservationRowGroup value={props.value} hideObservationNotes={props.hideObservationNotes} />\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowGroupProps {\n value?: Observation[] | Reference<Observation>[];\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRowGroup(props: ObservationRowGroupProps): JSX.Element {\n return (\n <>\n {props.value?.map((observation) => (\n <ObservationRow\n key={`obs-${isReference(observation) ? observation.reference : observation.id}`}\n hideObservationNotes={props.hideObservationNotes}\n value={observation}\n />\n ))}\n </>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const { classes, cx } = useStyles();\n const observation = useResource(props.value);\n\n if (!observation) {\n return null;\n }\n\n const displayNotes = !props.hideObservationNotes && observation.note;\n\n const critical = isCritical(observation);\n\n return (\n <>\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td rowSpan={displayNotes ? 2 : 1}>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n <td>\n {observation.category && observation.category.length > 0 && (\n <>\n {observation.category.map((concept) => (\n <div key={`category-${formatCodeableConcept(concept)}`}>\n <CodeableConceptDisplay value={concept} />\n </div>\n ))}\n </>\n )}\n </td>\n <td>\n {observation.performer?.map((performer) => <ReferenceDisplay key={performer.reference} value={performer} />)}\n </td>\n <td>{observation.status && <StatusBadge status={observation.status} />}</td>\n </tr>\n {observation.hasMember && (\n <ObservationRowGroup\n value={observation.hasMember as Reference<Observation>[]}\n hideObservationNotes={props.hideObservationNotes}\n />\n )}\n {displayNotes && (\n <tr>\n <td colSpan={6}>\n <NoteDisplay value={observation.note} />\n </td>\n </tr>\n )}\n </>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n", "import { Blockquote, createStyles, Stack } from '@mantine/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface NoteDisplayProps {\n value?: Annotation[];\n}\n\nexport function NoteDisplay({ value }: NoteDisplayProps): JSX.Element | null {\n const { classes } = useStyles();\n if (!value) {\n return null;\n }\n\n return (\n <Stack justify=\"flex-start\" spacing=\"xs\">\n {value.map(\n (note) =>\n note.text && (\n <Blockquote\n key={`note-${note.text}`}\n classNames={{ cite: classes.noteCite, body: classes.noteBody, root: classes.noteRoot }}\n cite={note.authorReference?.display || note.authorString}\n icon={null}\n >\n {note.text}\n </Blockquote>\n )\n )}\n </Stack>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group spacing=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n", "import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const resource = useResource(value, setOutcome);\n let text: string;\n\n if (outcome && !isOk(outcome)) {\n text = `[${normalizeErrorString(outcome)}]`;\n } else if (resource) {\n text = getDisplayString(resource);\n } else {\n return null;\n }\n\n return link ? (\n <MedplumLink to={value} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n", "import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n corrected: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n", "import { createStyles, Paper, PaperProps, useComponentDefaultProps } from '@mantine/core';\nimport React from 'react';\n\nexport interface PanelStylesParams {\n width?: number;\n fill?: boolean;\n}\n\nconst useStyles = createStyles((theme, { width, fill }: PanelStylesParams) => ({\n paper: {\n maxWidth: width,\n margin: `${theme.spacing.xl} auto`,\n padding: fill ? 0 : theme.spacing.md,\n '@media (max-width: 800px)': {\n padding: fill ? 0 : 8,\n },\n '& img': {\n width: '100%',\n maxWidth: '100%',\n },\n '& video': {\n width: '100%',\n maxWidth: '100%',\n },\n },\n}));\n\nexport interface PanelProps extends PaperProps {\n width?: number;\n fill?: boolean;\n}\n\nconst defaultProps: Partial<PanelProps> = {\n shadow: 'xs',\n radius: 'md',\n withBorder: true,\n};\n\nexport function Panel(props: PanelProps): JSX.Element {\n const { className, children, width, fill, unstyled, ...others } = useComponentDefaultProps(\n 'Panel',\n defaultProps,\n props\n );\n const { classes, cx } = useStyles({ width, fill }, { name: 'Panel', unstyled });\n\n return (\n <Paper className={cx(classes.paper, className)} {...others}>\n {children}\n </Paper>\n );\n}\n", "import { createStyles } from '@mantine/core';\nimport { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n borderCollapse: 'collapse',\n width: '100%',\n\n '& tr': {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n '& th, & td': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n verticalAlign: 'top',\n },\n },\n\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema).catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className={classes.root}>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className={classes.removed}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className={classes.added}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n", "import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceTableProps {\n /**\n * The input value either as a resource or a reference.\n */\n value: Resource | Reference;\n\n /**\n * Optional flag to ignore missing values.\n * By default, missing values are displayed as empty strings.\n */\n ignoreMissingValues?: boolean;\n\n /**\n * Optional flag to force use the input value.\n * This is useful when you want to display a specific version of the resource,\n * and not use the latest version.\n */\n forceUseInput?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{\n type: value.resourceType,\n value: props.forceUseInput ? props.value : value,\n }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n", "import { ActionIcon, Group, Menu, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons-react';\nimport React from 'react';\nimport { Container } from '../Container/Container';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { Panel, PanelProps } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps extends PanelProps {\n resource: Resource;\n profile?: Reference;\n dateTime?: string;\n padding?: boolean;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const { resource, profile, padding, popupMenuItems, ...others } = props;\n const author = profile ?? resource.meta?.author;\n const dateTime = props.dateTime ?? resource.meta?.lastUpdated;\n\n return (\n <Panel data-testid=\"timeline-item\" fill={true} {...others}>\n <Group position=\"apart\" spacing={8} mx=\"xs\" my=\"sm\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName color=\"dark\" weight={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {formatDateTime(dateTime)}\n </MedplumLink>\n <Text component=\"span\" color=\"dimmed\" mx={8}>\n ·\n </Text>\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {padding && <div style={{ padding: '0 16px 16px 16px' }}>{props.children}</div>}\n {!padding && <>{props.children}</>}\n </ErrorBoundary>\n </Panel>\n );\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n * @param timelineResource Optional primary resource of a timeline view. If specified, the primary resource will be sorted by meta.lastUpdated descending.\n */\nexport function sortByDateAndPriority(resources: Resource[], timelineResource?: Resource): void {\n resources.sort((a: Resource, b: Resource): number => {\n const priority1 = getPriorityScore(a, timelineResource);\n const priority2 = getPriorityScore(b, timelineResource);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a, timelineResource) - getTime(b, timelineResource);\n });\n}\n\nfunction getPriorityScore(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use priority if not the primary resource of a timeline view.\n\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] ?? 0;\n }\n }\n return 0;\n}\n\nfunction getTime(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use special case timestamps if not the primary resource of a timeline view.\n\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n\nfunction isSameResourceType(a: Resource, b: Resource | undefined): boolean {\n return !!b && a.resourceType === b.resourceType && a.id === b.id;\n}\n", "import React from 'react';\nimport { Container } from '../Container/Container';\nimport { Panel, PanelProps } from '../Panel/Panel';\n\nexport function Document(props: PanelProps): JSX.Element {\n const { children, ...others } = props;\n return (\n <Container>\n <Panel {...others}>{children}</Panel>\n </Container>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n loadTimelineResources={async (medplum: MedplumClient, _resourceType: ResourceType, id: string) => {\n return Promise.allSettled([\n medplum.readHistory('Encounter', id),\n medplum.search('Communication', 'encounter=Encounter/' + id),\n medplum.search('Media', 'encounter=Encounter/' + id),\n ]);\n }}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, normalizeOperationOutcome, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface FhirPathTableField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: FhirPathTableField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n * @param props FhirPathTable React props.\n * @returns FhirPathTable React node.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .graphql(query)\n .then(setResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data.ResourceList.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data.ResourceList.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n", "import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n", "import {\n ActionIcon,\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconRefresh,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n * @param props The SearchControl React props.\n * @returns The SearchControl React node.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n const totalType = search.total ?? 'accurate';\n\n const loadResults = useCallback(\n (options?: RequestInit) => {\n setOutcome(undefined);\n\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: totalType, fields: undefined }),\n options\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n },\n [medplum, search, totalType, onLoad]\n );\n\n const refreshResults = useCallback(() => {\n setState({ ...stateRef.current, searchResponse: undefined });\n loadResults({ cache: 'reload' });\n }, [loadResults]);\n\n useEffect(() => {\n loadResults();\n }, [loadResults]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n const isAux = e.button === 1 || e.ctrlKey || e.metaKey;\n\n if (!isAux && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (isAux && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport ?? props.onExportCsv ?? props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema.types[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n <Group spacing={2}>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {`${totalType === 'estimate' ? '~' : ''}${lastResult.total?.toLocaleString()}`}\n </Text>\n )}\n <ActionIcon title=\"Refresh\" onClick={refreshResults}>\n <IconRefresh size=\"1.125rem\" />\n </ActionIcon>\n </Group>\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={state.filterDialogSearchParam?.code ? buildFieldNameString(state.filterDialogSearchParam.code) : ''}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue=\"\"\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter) => (\n <div key={`filter-${filter.code}-${filter.operator}-${filter.value}`}>\n {getOpString(filter.operator)}\n \n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset ?? 0) / (search.count ?? DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count ?? DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n", "import { Box, Button, Modal, Text } from '@mantine/core';\nimport React from 'react';\n\ninterface SearchExportDialogProps {\n visible: boolean;\n exportCsv?: () => void;\n exportTransactionBundle?: () => void;\n onCancel: () => void;\n}\n\nexport function SearchExportDialog(props: SearchExportDialogProps): JSX.Element | null {\n return (\n <Modal title=\"Export\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <Box display=\"flex\" sx={{ justifyContent: 'space-between' }}>\n {props.exportCsv && <ExportButton text=\"CSV\" exportLogic={props.exportCsv} onCancel={props.onCancel} />}\n {props.exportTransactionBundle && (\n <ExportButton\n text=\"Transaction Bundle\"\n exportLogic={props.exportTransactionBundle}\n onCancel={props.onCancel}\n />\n )}\n </Box>\n <Text sx={{ marginTop: '10px', marginLeft: '2px' }}>Limited to 1000 records</Text>\n </Modal>\n );\n}\n\ninterface ExportButtonProps {\n text: string;\n exportLogic: () => void;\n onCancel: () => void;\n}\n\nexport function ExportButton(props: ExportButtonProps): JSX.Element {\n return (\n <Button\n onClick={() => {\n props.exportLogic();\n props.onCancel();\n }}\n >\n {`Export as ${props.text}`}\n </Button>\n );\n}\n", "import { Button, Modal } from '@mantine/core';\nimport { globalSchema, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\ninterface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const availableRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleAvailableKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onAddField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleAvailableDoubleClick(): void {\n onAddField();\n }\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleSelectedKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onRemoveField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleSelectedDoubleClick(): void {\n onRemoveField();\n }\n\n /**\n * Handles a click on the \"Add\" button.\n * Moves the \"available\" selection into the \"selected\" list.\n */\n function onAddField(): void {\n const currentField = state.search.fields ?? [];\n const key = availableRef.current?.value;\n if (key) {\n const newFields = [...currentField, key];\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Remove\" button.\n * Moves the \"selected\" selection into the \"available\" list.\n */\n function onRemoveField(): void {\n const currentField = state.search.fields ?? [];\n const key = selectedRef.current?.value;\n if (key) {\n const newFields = [...currentField];\n newFields.splice(newFields.indexOf(key), 1);\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Up\" button.\n * Moves the selection up one position in the list.\n */\n function onMoveUp(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index <= 0) {\n return;\n }\n\n swapFields(newFields, index, index - 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Handles a click on the \"Down\" button.\n * Moves the selection down one position in the list.\n */\n function onMoveDown(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index >= newFields.length - 1) {\n return;\n }\n\n swapFields(newFields, index, index + 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Swaps two fields in the search.\n * @param fields The array of fields.\n * @param i The index of the first field.\n * @param j The index of the second field.\n */\n function swapFields(fields: string[], i: number, j: number): void {\n const temp = fields[i];\n fields[i] = fields[j];\n fields[j] = temp;\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const typeDef = globalSchema.types[resourceType];\n\n const selected = state.search.fields ?? [];\n const available = getFieldsList(typeDef)\n .filter((field) => !selected.includes(field))\n .sort((a, b) => a.localeCompare(b));\n\n return (\n <Modal title=\"Fields\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <div>\n <table style={{ margin: 'auto' }}>\n <thead>\n <tr>\n <th colSpan={2} align=\"center\">\n Available\n </th>\n <th colSpan={2} align=\"center\">\n Selected\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colSpan={2} align=\"center\">\n <select\n ref={availableRef}\n size={15}\n tabIndex={1}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleAvailableKeyDown(e)}\n onDoubleClick={() => handleAvailableDoubleClick()}\n data-testid=\"available\"\n >\n {available.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n <td colSpan={2} align=\"center\">\n <select\n ref={selectedRef}\n size={15}\n tabIndex={4}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleSelectedKeyDown(e)}\n onDoubleClick={() => handleSelectedDoubleClick()}\n data-testid=\"selected\"\n >\n {selected.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema The type definition.\n * @returns A list of fields/columns available for a resource type.\n */\nfunction getFieldsList(typeSchema: TypeSchema): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.properties)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (typeSchema.searchParams) {\n for (const code of Object.keys(typeSchema.searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(buildFieldNameString(code));\n }\n }\n }\n\n return result;\n}\n", "import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n identifier: 'identifier',\n iterate: 'iterate',\n};\n\n/**\n * Sets the array of filters.\n * @param definition The original search request.\n * @param filters The new filters.\n * @returns The updated search request.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n * @param definition The original search request.\n * @returns The updated search request.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n * @param definition The original search request.\n * @param code The field key name to clear filters.\n * @returns The updated search request.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters ?? []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n * @param definition The original search request.\n * @param field The field key name.\n * @param op The operation key name.\n * @param value The filter value.\n * @param opt_clear Optional flag to clear filters on the field.\n * @returns The updated search request.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value ?? '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields?.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n * @param definition The original search request.\n * @param index The filter index.\n * @returns The updated search request.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n * @param definition The original search request.\n * @param field The field key name.\n * @param delta The number of days from this day.\n * @returns The updated search request.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n * @param definition The original search request.\n * @param field The field key name.\n * @param delta The number of months from this month.\n * @returns The updated search request.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n * @param definition The original search request.\n * @param field The field key name.\n * @returns The updated search request.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n * @param definition The original search request.\n * @param field The field key name.\n * @param d1 The start date.\n * @param d2 The end date.\n * @returns The updated search request.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n * @param definition The original search request.\n * @param field The field key name.\n * @param op The date/time operation.\n * @param value The date.\n * @returns The updated search request.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n * @param definition The original search request.\n * @param field The field key name.\n * @param value Optional boolean value. Default is true.\n * @returns The updated search request.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n * @param definition The original search request.\n * @param offset The offset number.\n * @returns The updated search request.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @returns The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n * @param definition The original search request.\n * @param sort The sort key.\n * @param desc Optional descending flag. Default is false.\n * @returns The updated search request.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n * @param definition The original search request.\n * @param key The field key name.\n * @returns The updated search request.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n * @param op The operation code.\n * @returns A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param field The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0]);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') ?? '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(resource: Resource, searchParam: SearchParameter): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n return (\n <>\n {value.map((v, index) => (\n <ResourcePropertyDisplay\n key={`${index}-${value.length}`}\n propertyType={v.type as PropertyType}\n value={v.value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n ))}\n </>\n );\n}\n", "import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, globalSchema, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = (globalSchema.types[resourceType].searchParams as Record<string, SearchParameter>) ?? {};\n const filters = search.filters || [];\n\n return (\n <Modal\n title=\"Filters\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n size={900}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={[\n '',\n ...Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })),\n ]}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && value.value && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n", "import {\n Filter,\n formatDateTime,\n getSearchParameterDetails,\n globalSchema,\n Operator,\n SearchParameterType,\n} from '@medplum/core';\nimport React from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType].searchParams?.[filter.code];\n if (searchParam) {\n if (\n searchParam.type === 'reference' &&\n (filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)\n ) {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n", "import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={props.defaultValue ? { reference: props.defaultValue } : undefined}\n targetTypes={props.searchParam.target}\n autoFocus={props.autoFocus}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return (\n <DateTimeInput\n name={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={props.onChange}\n />\n );\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n autoFocus={props.autoFocus}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n", "import { Button, Grid, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <Form onSubmit={onOk}>\n <Grid>\n <Grid.Col span={10}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Grid.Col>\n <Grid.Col span={2}>\n <Button onClick={onOk} fullWidth>\n OK\n </Button>\n </Grid.Col>\n </Grid>\n </Form>\n </Modal>\n );\n}\n", "import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons-react';\nimport React from 'react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>\n Before...\n </Menu.Item>\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item icon={<IconBracketsContain size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item icon={<IconCalendar size={14} />} onClick={() => props.onChange(addTodayFilter(props.search, code))}>\n Today\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>\n Less than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item icon={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item icon={<IconBleach size={14} />} onClick={() => props.onChange(addMissingFilter(props.search, code))}>\n Missing\n </Menu.Item>\n <Menu.Item\n icon={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n", "import { getSearchParameterDetails, globalSchema, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = globalSchema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinitions?.[0], searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n", "import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill ?? '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill ?? '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill ?? '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill ?? '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill ?? '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React from 'react';\n\nexport interface OperationOutcomeAlertProps {\n outcome?: OperationOutcome;\n issues?: OperationOutcomeIssue[];\n}\n\nexport function OperationOutcomeAlert(props: OperationOutcomeAlertProps): JSX.Element | null {\n const issues = props.outcome?.issue || props.issues;\n if (!issues || issues.length === 0) {\n return null;\n }\n return (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n const loadTimelineResources = useCallback((medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('Patient', id),\n medplum.search('Communication', { subject: ref, _count }),\n medplum.search('Device', { patient: ref, _count }),\n medplum.search('DeviceRequest', { patient: ref, _count }),\n medplum.search('DiagnosticReport', { subject: ref, _count }),\n medplum.search('Media', { subject: ref, _count }),\n medplum.search('ServiceRequest', { subject: ref, _count }),\n medplum.search('Task', { subject: ref, _count }),\n ]);\n }, []);\n\n return (\n <ResourceTimeline\n value={props.patient}\n loadTimelineResources={loadTimelineResources}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </Anchor>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @param existing Optional existing id which will update nextId.\n * @returns A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3), 10);\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n", "import { Anchor, Button, createStyles, NativeSelect, Textarea, TextInput, Title } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition, isResource as isResourceType } from '@medplum/core';\nimport {\n Coding,\n Extension,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\nimport { isChoiceQuestion, QuestionnaireItemType } from '../utils/questionnaire';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 4,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n onRepeatable?: (item: QuestionnaireItem) => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = isResourceType(props.item);\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n function toggleRepeatable(item: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.map((i) => (i === item ? { ...i, repeats: !i.repeats } : i)),\n });\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onChange={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {item.type === 'reference' && (\n <ReferenceProfiles item={item} onChange={(newOptions) => changeProperty('extension', newOptions)} />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} index={0} answers={{}} onChange={() => undefined} />}\n </>\n )}\n </div>\n {item.item?.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n onRepeatable={toggleRepeatable}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onChange={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem(createPage());\n }}\n >\n Add Page\n </Anchor>\n )}\n {editing && !isResource && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRepeatable) {\n props.onRepeatable(item);\n }\n }}\n >\n {item.repeats ? 'Remove Repeatable' : 'Make Repeatable'}\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n </>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </Anchor>\n </div>\n );\n}\n\ninterface ReferenceTypeProps {\n item: QuestionnaireItem;\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction ReferenceProfiles(props: ReferenceTypeProps): JSX.Element {\n const references = props.item.extension ?? [];\n const referenceProfiles =\n references.filter((e) => e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource') ?? [];\n return (\n <>\n {referenceProfiles.map((reference: Extension) => {\n return (\n <div key={reference.id}>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <TextInput\n key={reference.id}\n name=\"value[x]\"\n value={reference.valueCodeableConcept?.coding?.[0].code ?? ''}\n onChange={(e: any) => {\n e.preventDefault();\n const newReferences = [...references];\n const index = newReferences.findIndex((o) => o.id === reference.id);\n const coding = newReferences[index].valueCodeableConcept?.coding?.[0] ?? ([] as Coding);\n coding.display = e.target.value;\n coding.code = e.target.value;\n\n props.onChange(newReferences);\n }}\n />\n </div>\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(references.filter((r) => r.id !== reference.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...references,\n {\n id: generateId(),\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/fhir-types',\n display: '',\n code: '',\n },\n ],\n },\n },\n ]);\n }}\n >\n Add Resource\n </Anchor>\n </>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @param prefix The link ID prefix string.\n * @returns A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @returns A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n\nfunction createPage(): QuestionnaireItem {\n return {\n id: generateId(),\n linkId: generateLinkId('s'),\n type: 'group',\n text: `New Page`,\n extension: [\n {\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/questionnaire-item-control',\n code: 'page',\n },\n ],\n },\n } as Extension,\n ],\n } as QuestionnaireItem;\n}\n", "import { TypedValue, evalFhirPathTyped, getTypedPropertyValue } from '@medplum/core';\nimport { QuestionnaireItem, QuestionnaireItemEnableWhen, QuestionnaireResponseItemAnswer } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer[]>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n\n const enableBehavior = item.enableBehavior ?? 'any';\n\n for (const enableWhen of item.enableWhen) {\n if (\n enableWhen.operator === 'exists' &&\n !enableWhen.answerBoolean &&\n !answers[enableWhen.question as string]?.length\n ) {\n if (enableBehavior === 'any') {\n return true;\n } else {\n continue;\n }\n }\n const { anyMatch, allMatch } = checkAnswers(enableWhen, answers, enableBehavior);\n\n if (enableBehavior === 'any' && anyMatch) {\n return true;\n }\n if (enableBehavior === 'all' && !allMatch) {\n return false;\n }\n }\n\n return enableBehavior !== 'any';\n}\n\nfunction evaluateMatch(actualAnswer: TypedValue | undefined, expectedAnswer: TypedValue, operator?: string): boolean {\n // We handle exists separately since its so different in terms of comparisons than the other mathematical operators\n if (operator === 'exists') {\n // if actualAnswer is not undefined, then exists: true passes\n // if actualAnswer is undefined, then exists: false passes\n return !!actualAnswer === expectedAnswer.value;\n } else if (!actualAnswer) {\n return false;\n } else {\n // `=` and `!=` should be treated as the FHIRPath `~` and `!~`\n // All other operators should be unmodified\n const fhirPathOperator = operator === '=' || operator === '!=' ? operator?.replace('=', '~') : operator;\n const [{ value }] = evalFhirPathTyped(`%actualAnswer ${fhirPathOperator} %expectedAnswer`, [actualAnswer], {\n actualAnswer,\n expectedAnswer,\n });\n return value;\n }\n}\n\nfunction checkAnswers(\n enableWhen: QuestionnaireItemEnableWhen,\n answers: Record<string, QuestionnaireResponseItemAnswer[]>,\n enableBehavior: 'any' | 'all'\n): { anyMatch: boolean; allMatch: boolean } {\n const actualAnswers = answers[enableWhen.question as string] || [];\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n ) as TypedValue;\n\n let anyMatch = false;\n let allMatch = true;\n\n for (const actualAnswerValue of actualAnswers) {\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: actualAnswerValue,\n },\n 'value[x]'\n ) as TypedValue | undefined; // possibly undefined when question unanswered\n const { operator } = enableWhen;\n const match = evaluateMatch(actualAnswer, expectedAnswer, operator);\n if (match) {\n anyMatch = true;\n } else {\n allMatch = false;\n }\n\n if (enableBehavior === 'any' && anyMatch) {\n break;\n }\n }\n\n return { anyMatch, allMatch };\n}\n", "import { Checkbox, MultiSelect, NativeSelect, Radio, TextInput, Textarea } from '@mantine/core';\nimport { PropertyType, TypedValue, capitalize, getTypedPropertyValue, globalSchema, stringify } from '@medplum/core';\nimport {\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent } from 'react';\nimport { CheckboxFormSection } from '../../CheckboxFormSection/CheckboxFormSection';\nimport { QuestionnaireItemType } from '../../utils/questionnaire';\nimport { ReferenceInput } from '../../ReferenceInput/ReferenceInput';\nimport { AttachmentInput } from '../../AttachmentInput/AttachmentInput';\nimport { QuantityInput } from '../../QuantityInput/QuantityInput';\nimport { ResourcePropertyDisplay } from '../../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { DateTimeInput } from '../../DateTimeInput/DateTimeInput';\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n index: number;\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n responseItems?: QuestionnaireResponseItem[];\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n const index = props.index;\n\n function onChangeAnswer(\n newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[],\n repeatedIndex?: number\n ): void {\n const number = repeatedIndex ?? 0;\n const responses = props.responseItems?.filter((r) => r.linkId === item.linkId) ?? [];\n\n let updatedAnswers: QuestionnaireResponseItemAnswer[];\n if (Array.isArray(newResponseAnswer)) {\n // It's a multi-select case, so use the array directly.\n updatedAnswers = newResponseAnswer;\n } else {\n // It's a single answer case.\n updatedAnswers = updateAnswerArray(responses[0]?.answer ?? [], number, newResponseAnswer);\n }\n props.onChange({\n id: responses[0].id,\n linkId: item.linkId,\n text: item.text,\n answer: updatedAnswers,\n });\n }\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n switch (type) {\n case QuestionnaireItemType.boolean:\n return (\n <CheckboxFormSection key={props.item.linkId} title={props.item.text} htmlFor={props.item.linkId}>\n <Checkbox\n id={props.item.linkId}\n name={props.item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }, index)}\n />\n </CheckboxFormSection>\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber }, index)}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber }, index)}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue }, index)}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value }, index)}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue }, index)}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n targetTypes={addTargetTypes(item)}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue }, index)}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue }, index)}\n disableWheel\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput\n name={name}\n item={item}\n initial={initial}\n answers={props.answers}\n onChangeAnswer={(e) => onChangeAnswer(e, index)}\n />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput\n name={name}\n item={item}\n initial={initial}\n answers={props.answers}\n onChangeAnswer={(e) => onChangeAnswer(e, index)}\n />\n );\n }\n default:\n return null;\n }\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[]) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n if (item.repeats) {\n const { propertyName, data } = formatSelectData(props.item);\n return (\n <MultiSelect\n data={data}\n placeholder=\"Select items\"\n searchable\n defaultValue={[typedValueToString(initialValue) ?? '']}\n onChange={(selected) => {\n const values = selected.map((o) => {\n const option = item.answerOption?.find(\n (option) => option[propertyName as keyof QuestionnaireItemAnswerOption] === o\n );\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n return { [propertyName]: optionValue.value };\n });\n props.onChangeAnswer(values as QuestionnaireResponseItemAnswer[]);\n }}\n />\n );\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction updateAnswerArray(\n answers: QuestionnaireResponseItemAnswer[],\n index: number,\n newResponseAnswer: QuestionnaireResponseItemAnswer\n): QuestionnaireResponseItemAnswer[] {\n if (index < answers.length) {\n answers[index] = newResponseAnswer;\n return answers;\n } else {\n for (let i = answers.length; i < index; i++) {\n answers.push({});\n }\n answers.push(newResponseAnswer);\n return answers;\n }\n}\n\nfunction addTargetTypes(item: QuestionnaireItem): string[] {\n if (item.type !== QuestionnaireItemType.reference) {\n return [];\n }\n const extensions = item.extension?.filter(\n (e) => e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource'\n );\n if (!extensions || extensions.length === 0) {\n return [];\n }\n const targets = extensions.map((e) => e.valueCodeableConcept?.coding?.[0]?.code) as string[];\n return targets;\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\ninterface MultiSelect {\n value: any;\n label: any;\n}\n\ninterface FormattedData {\n propertyName: string;\n data: MultiSelect[];\n}\n\nfunction formatSelectData(item: QuestionnaireItem): FormattedData {\n if (item.answerOption?.length === 0) {\n return { propertyName: '', data: [] };\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[0];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n\n const data = (item.answerOption ?? []).map((a) => ({\n value: a[propertyName as keyof QuestionnaireItemAnswerOption],\n label:\n propertyName === 'valueCoding' ? a.valueCoding?.display : a[propertyName as keyof QuestionnaireItemAnswerOption],\n }));\n return { propertyName, data };\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n", "import { Anchor, Button, Group, Stack, Stepper, Title } from '@mantine/core';\nimport {\n createReference,\n getAllQuestionnaireAnswers,\n getExtension,\n getReferenceString,\n IndexedStructureDefinition,\n ProfileResource,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType, isQuestionEnabled } from '../utils/questionnaire';\nimport { QuestionnaireFormItem } from './QuestionnaireFormItem/QuestionnaireFormItem';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer[]>>({});\n const [activePage, setActivePage] = useState(0);\n\n const numberOfPages = getNumberOfPages(questionnaire?.item ?? []);\n const nextStep = (): void => setActivePage((current) => (current >= numberOfPages ? current : current + 1));\n const prevStep = (): void => setActivePage((current) => (current <= 0 ? current : current - 1));\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getAllQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n status: 'completed',\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n\n {questionnaire.item && (\n <QuestionnaireFormItemArray\n items={questionnaire.item ?? []}\n answers={answers}\n onChange={setItems}\n renderPages={numberOfPages > 1}\n activePage={activePage}\n />\n )}\n <Group position=\"right\" mt=\"xl\">\n <ButtonGroup\n activePage={activePage}\n numberOfPages={numberOfPages}\n nextStep={nextStep}\n prevStep={prevStep}\n submitButtonText={props.submitButtonText}\n />\n </Group>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n renderPages?: boolean;\n activePage?: number;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(responseId: string, newResponseItem: QuestionnaireResponseItem): void {\n const itemExists = responseItems.some((r) => r.id === responseId);\n let newResponseItems;\n if (itemExists) {\n newResponseItems = responseItems.map((r) => (r.id === responseId ? newResponseItem : r));\n } else {\n newResponseItems = [...responseItems, newResponseItem];\n }\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n const questionForm = props.items.map((item, index) => {\n if (props.renderPages) {\n return (\n <Stepper.Step label={item.text} key={item.linkId}>\n <QuestionnaireFormArrayContent\n key={`${item.linkId}-${index}`}\n item={item}\n index={index}\n answers={props.answers}\n responseItems={responseItems}\n setResponseItem={setResponseItem}\n />\n </Stepper.Step>\n );\n }\n return (\n <QuestionnaireFormArrayContent\n key={`${item.linkId}-${index}`}\n item={item}\n index={index}\n answers={props.answers}\n responseItems={responseItems}\n setResponseItem={setResponseItem}\n />\n );\n });\n\n if (props.renderPages) {\n return (\n <Stepper active={props.activePage ?? 0} allowNextStepsSelect={false} p={6}>\n {questionForm}\n </Stepper>\n );\n }\n return <Stack>{questionForm}</Stack>;\n}\n\ninterface QuestionnaireFormArrayContentProps {\n item: QuestionnaireItem;\n index: number;\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n responseItems: QuestionnaireResponseItem[];\n setResponseItem: (responseId: string, newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nfunction QuestionnaireFormArrayContent(props: QuestionnaireFormArrayContentProps): JSX.Element | null {\n if (!isQuestionEnabled(props.item, props.answers)) {\n return null;\n }\n if (props.item.type === QuestionnaireItemType.display) {\n return <p key={props.item.linkId}>{props.item.text}</p>;\n }\n if (props.item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireRepeatWrapper\n key={props.item.linkId}\n item={props.item}\n answers={props.answers}\n responseItems={props.responseItems}\n onChange={(newResponseItem) => props.setResponseItem(newResponseItem.id as string, newResponseItem)}\n />\n );\n }\n return (\n <FormSection key={props.item.linkId} htmlFor={props.item.linkId} title={props.item.text ?? ''}>\n <QuestionnaireRepeatWrapper\n item={props.item}\n answers={props.answers}\n responseItems={props.responseItems}\n onChange={(newResponseItem) => props.setResponseItem(newResponseItem.id as string, newResponseItem)}\n />\n </FormSection>\n );\n}\n\nexport interface QuestionnaireRepeatWrapperProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n responseItems: QuestionnaireResponseItem[];\n onChange: (newResponseItem: QuestionnaireResponseItem, index?: number) => void;\n}\n\nexport function QuestionnaireRepeatWrapper(props: QuestionnaireRepeatWrapperProps): JSX.Element {\n const item = props.item;\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[], number?: number): void {\n const index = number ?? 0;\n const responses = props.responseItems.filter((r) => r.linkId === item.linkId);\n props.onChange({\n id: getResponseId(responses, index),\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <RepeatableGroup\n key={props.item.linkId}\n text={item.text ?? ''}\n item={item ?? []}\n answers={props.answers}\n onChange={onChangeItem}\n />\n );\n }\n return (\n <RepeatableItem item={props.item} key={props.item.linkId}>\n {({ index }: { index: number }) => <QuestionnaireFormItem {...props} index={index} />}\n </RepeatableItem>\n );\n}\n\ninterface ButtonGroupProps {\n activePage: number;\n numberOfPages: number;\n submitButtonText?: string;\n nextStep: () => void;\n prevStep: () => void;\n}\n\nfunction ButtonGroup(props: ButtonGroupProps): JSX.Element {\n if (props.activePage === 0 && props.numberOfPages <= 0) {\n return <Button type=\"submit\">{props.submitButtonText ?? 'OK'}</Button>;\n } else if (props.activePage >= props.numberOfPages) {\n return (\n <>\n <Button onClick={props.prevStep}>Back</Button>\n <Button onClick={props.nextStep} type=\"submit\">\n {props.submitButtonText ?? 'OK'}\n </Button>\n </>\n );\n } else if (props.activePage === 0) {\n return (\n <>\n <Button onClick={props.nextStep}>Next</Button>\n </>\n );\n } else {\n return (\n <>\n <Button onClick={props.prevStep}>Back</Button>\n <Button onClick={props.nextStep}>Next</Button>\n </>\n );\n }\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n id: generateId(),\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nlet nextId = 1;\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction getNumberOfPages(items: QuestionnaireItem[]): number {\n const pages = items.filter((item) => {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl');\n return extension?.valueCodeableConcept?.coding?.[0]?.code === 'page';\n });\n return pages.length > 0 ? items.length : 0;\n}\n\ninterface RepeatableGroupProps {\n item: QuestionnaireItem;\n text: string;\n answers: Record<string, QuestionnaireResponseItemAnswer[]>;\n onChange: (newResponseItem: QuestionnaireResponseItem[], index?: number) => void;\n}\n\nfunction RepeatableGroup(props: RepeatableGroupProps): JSX.Element | null {\n const [number, setNumber] = useState(1);\n\n const item = props.item;\n return (\n <>\n {[...Array(number)].map((_, i) => {\n return (\n <div key={i}>\n <h3>{props.text}</h3>\n <QuestionnaireFormItemArray\n items={item.item ?? []}\n answers={props.answers}\n onChange={(response) => props.onChange(response, i)}\n />\n </div>\n );\n })}\n {props.item.repeats && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Group</Anchor>}\n </>\n );\n}\n\ninterface RepeatableItemProps {\n item: QuestionnaireItem;\n children: (props: { index: number }) => JSX.Element;\n}\n\nfunction RepeatableItem(props: RepeatableItemProps): JSX.Element {\n const [number, setNumber] = useState(1);\n const showAddButton =\n props.item?.repeats &&\n props.item.type !== QuestionnaireItemType.choice &&\n props.item.type !== QuestionnaireItemType.openChoice;\n return (\n <>\n {[...Array(number)].map((_, i) => {\n return <React.Fragment key={`${props.item.linkId}-${i}`}>{props.children({ index: i })}</React.Fragment>;\n })}\n {showAddButton && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Item</Anchor>}\n </>\n );\n}\n\nfunction getResponseId(responses: QuestionnaireResponseItem[], index: number): string {\n if (responses.length === 0 || responses.length < index + 1) {\n return generateId();\n }\n return responses[index].id as string;\n}\n", "import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo', 'category'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return undefined;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId The reference range group ID.\n * @param changedInterval The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n <NativeSelect\n data={['', 'reference', 'critical', 'absolute']}\n label=\"Category: \"\n defaultValue={intervalGroup.filters.category}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n const newCategory: string | undefined = e.currentTarget.value;\n if (newCategory === '') {\n onChange(intervalGroup.id, { ...interval, category: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n category: newCategory as 'reference' | 'critical' | 'absolute',\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '', 10);\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals Array of reference range intervals.\n * @param setGroupId Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n `category=${interval.category}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n", "import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n", "import { createStyles } from '@mantine/core';\nimport { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n overflowX: 'auto',\n },\n\n root: {\n border: `0.1px solid ${theme.colors.gray[3]}`,\n borderCollapse: 'collapse',\n borderRadius: theme.radius.sm,\n borderSpacing: 0,\n fontSize: theme.fontSizes.xs,\n width: '100%',\n\n '& td': {\n padding: '2px 4px 0 4px',\n verticalAlign: 'top',\n whiteSpace: 'nowrap',\n },\n },\n\n startRow: {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n normalRow: {\n borderTop: 0,\n },\n\n author: {\n lineHeight: '10px',\n },\n\n dateTime: {\n borderRight: `0.1px solid ${theme.colors.gray[3]}`,\n lineHeight: '20px',\n },\n\n lineNumber: {\n backgroundColor: theme.colors.gray[1],\n border: 0,\n color: theme.colors.gray[5],\n fontFamily: theme.fontFamilyMonospace,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n textAlign: 'right',\n },\n\n line: {\n fontFamily: theme.fontFamilyMonospace,\n fontSize: theme.fontSizes.sm,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n },\n\n pre: {\n margin: 0,\n },\n}));\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n\n if (!resource) {\n return null;\n }\n\n const table = blame(value);\n\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n", "import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n", "/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path?.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n", "import { createStyles } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from '../utils/diff';\n\nconst useStyles = createStyles((theme) => ({\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n const { classes } = useStyles();\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n", "import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withBorder withColumnBorders>\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>{value.entry?.map((entry, index) => <HistoryRow key={'entry-' + index} entry={entry} />)}</tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <tr>\n <td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </td>\n <td>{formatDateTime(resource.meta?.lastUpdated)}</td>\n <td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n } else {\n return (\n <tr>\n <td colSpan={3}>{normalizeErrorString(response?.outcome)}</td>\n </tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n", "import { Button, createStyles, Stack, Text } from '@mantine/core';\nimport { getReferenceString } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { CalendarInput, getStartMonth } from '../CalendarInput/CalendarInput';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n display: 'flex',\n minHeight: 400,\n },\n\n info: {\n minWidth: 300,\n padding: 20,\n borderRight: `1px solid ${theme.colors.gray[3]}`,\n },\n\n selection: {\n minWidth: 300,\n padding: 20,\n },\n}));\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n useEffect(() => {\n if (schedule) {\n setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" weight={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n return new Date(Math.max(Date.now(), time)).toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, ResourceType, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('ServiceRequest', id),\n medplum.search('Communication', { 'based-on': ref, _count }),\n medplum.search('DiagnosticReport', { 'based-on': ref, _count }),\n medplum.search('Media', { 'based-on': ref, _count }),\n medplum.search('DocumentReference', { related: ref, _count }),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: React.ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, clientId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n clientId={clientId}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms of Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, Text, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: React.ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => {\n if (recaptchaSiteKey) {\n initRecaptcha(recaptchaSiteKey);\n }\n }, [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n let recaptchaToken = '';\n if (recaptchaSiteKey) {\n recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n }\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n clientId: props.clientId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{props.children}</Center>\n <OperationOutcomeAlert issues={issues} />\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms of Service</Anchor>.\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <Anchor href=\"https://policies.google.com/privacy\">Privacy Policy</Anchor>\n {' and '}\n <Anchor href=\"https://policies.google.com/terms\">Terms of Service</Anchor> apply.\n </Text>\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n", "import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n if (typeof window !== 'undefined') {\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n }\n\n return undefined;\n}\n", "/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n * @param onload Optional callback for the onload event.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload ?? null;\n head.appendChild(script);\n}\n", "import { createScriptTag } from './script';\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { BaseLoginRequest, LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { MfaForm } from './MfaForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly login?: string;\n readonly chooseScopes?: boolean;\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\n/**\n * The SignInForm component allows users to sign in to Medplum.\n *\n * \"Signing in\" is a multi-step process:\n * 1) Authentication - identify the user\n * 2) MFA - If MFA is enabled, prompt for MFA code\n * 3) Choose profile - If the user has multiple profiles, prompt to choose one\n * 4) Choose scope - If the user has multiple scopes, prompt to choose one\n * 5) Success - Return to the caller with either a code or a redirect\n * @param props The SignInForm React props.\n * @returns The SignInForm React node.\n */\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const {\n login: loginCode,\n chooseScopes,\n onSuccess,\n onForgotPassword,\n onRegister,\n onCode,\n ...baseLoginRequest\n } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [mfaRequired, setAuthenticatorRequired] = useState<boolean>(false);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n const handleCode = useCallback(\n (code: string): void => {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n },\n [medplum, onCode, onSuccess]\n );\n\n const handleAuthResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n setAuthenticatorRequired(!!response.mfaRequired);\n\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n },\n [chooseScopes, handleCode]\n );\n\n const handleScopeResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n handleCode(response.code as string);\n },\n [handleCode]\n );\n\n useEffect(() => {\n // Beware the race condition here\n // The `useMedplum` hook will return a new instance of the MedplumClient on login\n // We do not want to request the login status again in that case\n // Only request login status once\n if (loginCode && !login) {\n medplum\n .get('auth/login/' + loginCode)\n .then(handleAuthResponse)\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n }, [medplum, loginCode, login, handleAuthResponse]);\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n disableGoogleAuth={props.disableGoogleAuth}\n disableEmailAuth={props.disableEmailAuth}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (mfaRequired) {\n return <MfaForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n normalizeOperationOutcome,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, disableEmailAuth, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n {!disableEmailAuth && <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />}\n </>\n )}\n {!disableEmailAuth && (\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n )}\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n <div>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n </div>\n {!disableEmailAuth && <Button type=\"submit\">Next</Button>}\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack spacing=\"xl\">\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n", "import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title order={3}>Choose profile</Title>\n </Center>\n <OperationOutcomeAlert outcome={outcome} />\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n", "import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope ?? 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n", "import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["formatAddress", "React", "AddressDisplay", "props", "address", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "getLine", "address", "index", "setLine", "str", "line", "AddressInput", "props", "value", "setValue", "valueRef", "setValueWrapper", "newValue", "setUse", "use", "setType", "type", "setLine1", "line1", "setLine2", "line2", "setCity", "city", "setState", "state", "setPostalCode", "postalCode", "e", "TextInput", "createReference", "React", "useRef", "useState", "showNotification", "React", "createContext", "useContext", "useEffect", "useMemo", "useState", "reactContext", "MedplumProvider", "props", "medplum", "navigate", "defaultNavigate", "state", "setState", "eventListener", "medplumContext", "useMedplumContext", "useMedplum", "useMedplumNavigate", "useMedplumProfile", "path", "AnnotationInput", "props", "author", "useMedplumProfile", "value", "setValue", "useState", "valueRef", "useRef", "setText", "text", "newValue", "createReference", "React", "TextInput", "e", "MantineAppShell", "useMantineTheme", "React", "Suspense", "useState", "Alert", "normalizeErrorString", "defaultAttributes", "createReactComponent", "iconName", "iconNamePascal", "iconNode", "Component", "forwardRef", "_a", "ref", "_b", "color", "size", "stroke", "children", "rest", "__objRest", "createElement", "__spreadValues", "__spreadProps", "defaultAttributes", "tag", "attrs", "PropTypes", "IconAdjustmentsHorizontal", "createReactComponent", "IconAlertCircle", "createReactComponent", "IconBleachOff", "createReactComponent", "IconBleach", "createReactComponent", "IconBoxMultiple", "createReactComponent", "IconBracketsContain", "createReactComponent", "IconBucketOff", "createReactComponent", "IconBucket", "createReactComponent", "IconCalendar", "createReactComponent", "IconCheck", "createReactComponent", "IconCheckbox", "createReactComponent", "IconChevronDown", "createReactComponent", "IconCircleMinus", "createReactComponent", "IconCirclePlus", "createReactComponent", "IconCloudUpload", "createReactComponent", "IconColumns", "createReactComponent", "IconCopy", "createReactComponent", "IconCurrencyDollar", "createReactComponent", "IconDots", "createReactComponent", "IconEdit", "createReactComponent", "IconEqualNot", "createReactComponent", "IconEqual", "createReactComponent", "IconFileAlert", "createReactComponent", "IconFilePlus", "createReactComponent", "IconFilter", "createReactComponent", "IconListDetails", "createReactComponent", "IconLogout", "createReactComponent", "IconMathGreater", "createReactComponent", "IconMathLower", "createReactComponent", "IconMessage", "createReactComponent", "IconPin", "createReactComponent", "IconPinnedOff", "createReactComponent", "IconPlus", "createReactComponent", "IconRefresh", "createReactComponent", "IconSearch", "createReactComponent", "IconSettings", "createReactComponent", "IconSortAscending", "createReactComponent", "IconSortDescending", "createReactComponent", "IconSquare", "createReactComponent", "IconSwitchHorizontal", "createReactComponent", "IconTableExport", "createReactComponent", "IconTrash", "createReactComponent", "IconX", "createReactComponent", "React", "ErrorBoundary", "props", "error", "errorInfo", "Alert", "IconAlertCircle", "normalizeErrorString", "Center", "Loader", "React", "Loading", "Avatar", "createStyles", "Group", "MantineHeader", "Menu", "Stack", "Text", "UnstyledButton", "formatHumanName", "getReferenceString", "React", "useState", "formatHumanName", "React", "HumanNameDisplay", "props", "name", "Avatar", "getDisplayString", "getImageSrc", "React", "Anchor", "isReference", "isResource", "React", "killEvent", "isCheckboxCell", "el", "isCheckboxElement", "children", "MedplumLink", "props", "navigate", "useMedplumNavigate", "to", "suffix", "label", "onClick", "children", "rest", "href", "getHref", "React", "Anchor", "e", "killEvent", "getStringHref", "isResource", "getResourceHref", "isReference", "getReferenceHref", "deepEquals", "isReference", "isResource", "normalizeOperationOutcome", "useCallback", "useEffect", "useState", "useResource", "value", "setOutcome", "medplum", "useMedplum", "resource", "setResource", "useState", "getInitialResource", "setResourceIfChanged", "useCallback", "r", "deepEquals", "useEffect", "subscribed", "isReference", "err", "normalizeOperationOutcome", "isResource", "ResourceAvatar", "props", "resource", "useResource", "text", "getDisplayString", "imageUrl", "getImageSrc", "radius", "avatarProps", "React", "MedplumLink", "Avatar", "createStyles", "Group", "Text", "formatHumanName", "getDisplayString", "getReferenceString", "isUUID", "React", "forwardRef", "useCallback", "Loader", "MultiSelect", "React", "useCallback", "useEffect", "useRef", "useState", "showNotification", "normalizeErrorString", "AsyncAutocomplete", "props", "defaultValue", "toKey", "toOption", "loadOptions", "onChange", "onCreate", "creatable", "rest", "defaultItems", "toDefaultItems", "inputRef", "useRef", "lastValue", "setLastValue", "useState", "timer", "setTimer", "abortController", "setAbortController", "autoSubmit", "setAutoSubmit", "selected", "setSelected", "options", "setOptions", "lastValueRef", "timerRef", "abortControllerRef", "autoSubmitRef", "optionsRef", "handleTimer", "useCallback", "value", "newAbortController", "newValues", "err", "showNotification", "normalizeErrorString", "handleSearchChange", "newTimer", "handleChange", "values", "result", "newSelected", "option", "item", "handleKeyDown", "e", "killEvent", "handleCreate", "input", "handleFilter", "_value", "useEffect", "React", "MultiSelect", "Loader", "useStyles", "createStyles", "toKey", "resource", "toOption", "getDisplayString", "HeaderSearchInput", "props", "classes", "navigate", "useMedplumNavigate", "medplum", "useMedplum", "loadData", "useCallback", "input", "signal", "query", "buildGraphQLQuery", "options", "response", "getResourcesFromResponse", "handleSelect", "item", "getReferenceString", "React", "AsyncAutocomplete", "IconSearch", "ItemComponent", "forwardRef", "others", "ref", "helpText", "Group", "ResourceAvatar", "Text", "escaped", "isUUID", "resources", "sortByRelevance", "dedupeResources", "ids", "result", "a", "b", "getResourceScore", "bestScore", "identifier", "getStringScore", "name", "formatHumanName", "str", "index", "useStyles", "createStyles", "theme", "Header", "props", "context", "useMedplumContext", "medplum", "profile", "navigate", "logins", "classes", "cx", "userMenuOpened", "setUserMenuOpened", "useState", "React", "MantineHeader", "Group", "UnstyledButton", "HeaderSearchInput", "Menu", "o", "ResourceAvatar", "Text", "formatHumanName", "IconChevronDown", "Stack", "HumanNameDisplay", "login", "getReferenceString", "Avatar", "IconSwitchHorizontal", "IconSettings", "IconLogout", "Button", "createStyles", "MantineNavbar", "ScrollArea", "Space", "Text", "React", "useState", "Button", "Group", "Modal", "NativeSelect", "Stack", "TextInput", "showNotification", "deepClone", "normalizeErrorString", "React", "React", "parseForm", "form", "result", "element", "parseInputElement", "parseSelectElement", "el", "Form", "props", "React", "e", "formData", "parseForm", "BookmarkDialog", "props", "medplum", "useMedplum", "config", "submitHandler", "formData", "menuname", "name", "target", "newConfig", "deepClone", "title", "res", "showNotification", "err", "normalizeErrorString", "React", "Modal", "Form", "Stack", "SelectMenu", "TextInput", "Group", "Button", "userConfigToMenu", "menu", "menus", "NativeSelect", "React", "useState", "React", "useCallback", "toKey", "element", "getDisplay", "item", "toOption", "createValue", "input", "ValueSetAutocomplete", "props", "medplum", "useMedplum", "elementDefinition", "creatable", "clearable", "rest", "loadValues", "useCallback", "signal", "system", "valueSetElements", "newData", "valueSetElement", "React", "AsyncAutocomplete", "query", "CodeInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newCode", "valueSetElementToCode", "React", "ValueSetAutocomplete", "codeToValueSetElement", "code", "element", "useStyles", "createStyles", "theme", "Navbar", "props", "classes", "navigate", "useMedplumNavigate", "activeLink", "getActiveLink", "bookmarkDialogVisible", "setBookmarkDialogVisible", "useState", "onLinkClick", "e", "to", "navigateResourceType", "resourceType", "React", "MantineNavbar", "ScrollArea", "CodeInput", "newValue", "menu", "Text", "link", "NavbarLink", "NavLinkIcon", "Button", "IconPlus", "BookmarkDialog", "cx", "MedplumLink", "Space", "currentPathname", "currentSearchParams", "menus", "bestLink", "bestScore", "score", "getLinkScore", "linkHref", "linkUrl", "ignoredParams", "key", "value", "count", "AppShell", "props", "theme", "useMantineTheme", "navbarOpen", "setNavbarOpen", "useState", "medplum", "useMedplum", "profile", "useMedplumProfile", "setNavbarOpenWrapper", "open", "closeNavbar", "toggleNavbar", "React", "Loading", "MantineAppShell", "Header", "Navbar", "ErrorBoundary", "Suspense", "React", "Anchor", "React", "AttachmentDisplay", "props", "value", "contentType", "url", "title", "AttachmentArrayDisplay", "props", "React", "v", "index", "AttachmentDisplay", "ActionIcon", "React", "useRef", "useState", "React", "useRef", "AttachmentButton", "props", "medplum", "useMedplum", "fileInputRef", "useRef", "onClick", "e", "killEvent", "onFileChange", "files", "processFile", "file", "filename", "contentType", "binary", "outcome", "React", "AttachmentArrayInput", "props", "values", "setValues", "useState", "valuesRef", "useRef", "setValuesWrapper", "newValues", "React", "v", "index", "AttachmentDisplay", "ActionIcon", "e", "killEvent", "copy", "IconCircleMinus", "AttachmentButton", "attachment", "IconCloudUpload", "Button", "React", "useState", "AttachmentInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "AttachmentDisplay", "Button", "e", "killEvent", "AttachmentButton", "getPropertyDisplayName", "globalSchema", "React", "DEFAULT_IGNORED_PROPERTIES", "createStyles", "React", "useStyles", "theme", "DescriptionList", "props", "children", "compact", "classes", "cx", "DescriptionListEntry", "formatDateTime", "formatPeriod", "formatTiming", "getElementDefinitionTypeName", "getTypedPropertyValue", "PropertyType", "React", "formatCodeableConcept", "React", "CodeableConceptDisplay", "props", "formatCoding", "React", "CodingDisplay", "props", "React", "React", "ContactPointDisplay", "props", "contactPoint", "builder", "ContactDetailDisplay", "props", "contactDetail", "React", "telecom", "ContactPointDisplay", "React", "IdentifierDisplay", "props", "formatMoney", "React", "MoneyDisplay", "props", "formatQuantity", "React", "QuantityDisplay", "props", "formatRange", "React", "RangeDisplay", "props", "React", "RatioDisplay", "props", "value", "React", "QuantityDisplay", "stringify", "React", "ReferenceDisplay", "props", "displayString", "stringify", "React", "MedplumLink", "React", "ResourceArrayDisplay", "props", "property", "values", "propertyType", "React", "v", "index", "ResourcePropertyDisplay", "ActionIcon", "Box", "CopyButton", "Tooltip", "ResourcePropertyDisplay", "props", "property", "propertyType", "value", "React", "Box", "CopyButton", "copied", "copy", "Tooltip", "ActionIcon", "IconCheck", "IconCopy", "PropertyType", "AttachmentArrayDisplay", "ResourceArrayDisplay", "ReferenceDisplay", "formatDateTime", "AddressDisplay", "AttachmentDisplay", "CodeableConceptDisplay", "CodingDisplay", "ContactDetailDisplay", "ContactPointDisplay", "HumanNameDisplay", "IdentifierDisplay", "MoneyDisplay", "formatPeriod", "QuantityDisplay", "RangeDisplay", "RatioDisplay", "formatTiming", "BackboneElementDisplay", "getElementDefinitionTypeName", "getValueAndType", "context", "path", "typedResult", "getTypedPropertyValue", "e", "BackboneElementDisplay", "props", "typedValue", "value", "typeName", "typeSchema", "globalSchema", "React", "DescriptionList", "entry", "key", "DEFAULT_IGNORED_PROPERTIES", "property", "propertyValue", "propertyType", "getValueAndType", "DescriptionListEntry", "getPropertyDisplayName", "ResourcePropertyDisplay", "Stack", "getPropertyDisplayName", "globalSchema", "React", "useState", "Group", "Input", "React", "CheckboxFormSection", "props", "Input", "React", "getErrorsForInput", "outcome", "expression", "issue", "isExpressionMatch", "getIssuesForExpression", "expr1", "expr2", "dot1", "dot2", "FormSection", "props", "React", "Input", "getErrorsForInput", "Button", "Group", "Stack", "TextInput", "capitalize", "deepClone", "React", "useEffect", "useState", "ResourceForm", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "value", "setValue", "useEffect", "deepClone", "React", "e", "Stack", "FormSection", "TextInput", "BackboneElementInput", "Group", "Button", "setPropertyValue", "obj", "key", "propName", "elementDefinition", "types", "type", "compoundKey", "capitalize", "Checkbox", "Group", "NativeSelect", "Textarea", "TextInput", "capitalize", "getElementDefinitionTypeName", "PropertyType", "React", "useState", "React", "useState", "CodeableConceptInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newConcept", "valueSetElementToCodeableConcept", "React", "ValueSetAutocomplete", "codeableConceptToValueSetElement", "concept", "c", "elements", "e", "React", "useState", "CodingInput", "props", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newConcept", "valueSetElementToCoding", "React", "ValueSetAutocomplete", "codingToValueSetElement", "coding", "element", "Group", "TextInput", "React", "useRef", "useState", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "ContactPointInput", "props", "contactPoint", "setContactPoint", "ref", "setContactPointWrapper", "newValue", "setSystem", "system", "setUse", "use", "setValue", "value", "e", "ContactDetailInput", "props", "contactPoint", "setContactDetail", "useState", "ref", "useRef", "setContactDetailWrapper", "newValue", "setName", "name", "setTelecom", "telecom", "React", "Group", "TextInput", "e", "ContactPointInput", "TextInput", "isValidDate", "React", "DateTimeInput", "props", "React", "TextInput", "getInputType", "convertIsoToLocal", "getErrorsForInput", "e", "newValue", "convertLocalToIso", "isoString", "date", "isValidDate", "localString", "JsonInput", "stringify", "React", "ExtensionInput", "props", "newValue", "Group", "NativeSelect", "TextInput", "React", "useRef", "useState", "HumanNameInput", "props", "value", "setValue", "valueRef", "setValueWrapper", "newValue", "setUse", "use", "setPrefix", "prefix", "setGiven", "given", "setFamily", "family", "setSuffix", "suffix", "e", "Group", "TextInput", "React", "useState", "IdentifierInput", "props", "value", "setValue", "setValueWrapper", "newValue", "e", "NativeSelect", "TextInput", "React", "useCallback", "useState", "data", "MoneyInput", "props", "onChange", "value", "setValue", "setValueWrapper", "newValue", "handleCurrencyChange", "e", "handleValueChange", "select", "NativeSelect", "TextInput", "IconCurrencyDollar", "Group", "React", "useState", "PeriodInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "DateTimeInput", "Group", "NativeSelect", "TextInput", "React", "useState", "QuantityInput", "props", "value", "setValue", "setValueWrapper", "newValue", "e", "tryParseNumber", "str", "Group", "React", "useState", "RangeInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "QuantityInput", "v", "Group", "React", "useState", "RatioInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "React", "Group", "QuantityInput", "v", "Group", "NativeSelect", "TextInput", "createReference", "React", "useRef", "useState", "Group", "Text", "getDisplayString", "getReferenceString", "React", "forwardRef", "useCallback", "useState", "SEARCH_CODES", "NAME_RESOURCE_TYPES", "toOption", "resource", "getReferenceString", "getDisplayString", "ResourceInput", "props", "medplum", "useMedplum", "resourceType", "outcome", "setOutcome", "useState", "defaultValue", "useResource", "onChange", "loadValues", "useCallback", "input", "signal", "searchCode", "getSearchParamForResourceType", "searchParams", "handleChange", "newResources", "React", "AsyncAutocomplete", "ItemComponent", "forwardRef", "label", "others", "ref", "Group", "ResourceAvatar", "Text", "ReferenceInput", "props", "targetTypes", "getTargetTypes", "initialResourceType", "getInitialResourceType", "value", "setValue", "useState", "resourceType", "setResourceType", "valueRef", "useRef", "resourceTypeRef", "setValueHelper", "newValue", "React", "Group", "NativeSelect", "e", "TextInput", "ResourceInput", "item", "createReference", "defaultValue", "defaultValueResourceType", "ActionIcon", "React", "useRef", "useState", "ResourceArrayInput", "props", "values", "setValues", "useState", "valuesRef", "useRef", "setValuesWrapper", "newValues", "React", "v", "index", "ResourcePropertyInput", "newValue", "copy", "ActionIcon", "e", "killEvent", "IconCircleMinus", "IconCirclePlus", "Button", "Chip", "Group", "Modal", "NativeSelect", "Stack", "Switch", "TextInput", "formatTiming", "React", "useRef", "useState", "daysOfWeek", "TimingInput", "props", "value", "setValue", "useState", "open", "setOpen", "valueRef", "useRef", "React", "Group", "formatTiming", "Button", "TimingEditorDialog", "newValue", "defaultValue", "setStart", "newStart", "setRepeat", "repeat", "setPeriod", "newPeriod", "setPeriodUnit", "newPeriodUnit", "setDaysOfWeek", "newDaysOfWeek", "Modal", "Stack", "FormSection", "DateTimeInput", "Switch", "e", "TextInput", "NativeSelect", "Chip", "day", "ResourcePropertyInput", "props", "property", "propertyType", "name", "value", "PropertyType", "React", "AttachmentArrayInput", "ResourceArrayInput", "propertyTypes", "ElementDefinitionInputSelector", "ElementDefinitionTypeInput", "initialPropertyType", "t", "selectedType", "setSelectedType", "useState", "Group", "NativeSelect", "e", "type", "newValue", "capitalize", "required", "TextInput", "getErrorsForInput", "DateTimeInput", "CodeInput", "Checkbox", "Textarea", "AddressInput", "AnnotationInput", "AttachmentInput", "CodeableConceptInput", "CodingInput", "ContactDetailInput", "ContactPointInput", "ExtensionInput", "HumanNameInput", "IdentifierInput", "MoneyInput", "PeriodInput", "QuantityInput", "RangeInput", "RatioInput", "ReferenceInput", "getTargetTypes", "TimingInput", "BackboneElementInput", "getElementDefinitionTypeName", "p", "BackboneElementInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "typeName", "typeSchema", "globalSchema", "React", "typedValue", "Stack", "entry", "key", "DEFAULT_IGNORED_PROPERTIES", "property", "propertyValue", "propertyType", "getValueAndType", "required", "CheckboxFormSection", "getPropertyDisplayName", "ResourcePropertyInput", "propName", "setPropertyValue", "FormSection", "Button", "createStyles", "Group", "React", "useMemo", "useState", "useStyles", "theme", "getMonthString", "date", "CalendarInput", "props", "classes", "onChangeMonth", "onClick", "month", "setMonth", "getStartMonth", "moveMonth", "delta", "currMonth", "newMonth", "grid", "buildGrid", "week", "weekIndex", "day", "dayIndex", "result", "startDate", "slots", "d", "row", "i", "isDayAvailable", "slot", "slotStart", "MantineContainer", "createStyles", "React", "useStyles", "Container", "props", "children", "others", "classes", "React", "ActionIcon", "Center", "createStyles", "Group", "Loader", "Menu", "ScrollArea", "TextInput", "showNotification", "updateNotification", "getReferenceString", "normalizeErrorString", "React", "useCallback", "useEffect", "useRef", "useState", "createStyles", "Group", "List", "Stack", "Text", "Title", "capitalize", "formatCodeableConcept", "formatDateTime", "formatObservationValue", "isReference", "React", "useEffect", "useState", "Blockquote", "createStyles", "Stack", "React", "useStyles", "theme", "NoteDisplay", "value", "classes", "note", "Group", "React", "Text", "getDisplayString", "isOk", "normalizeErrorString", "React", "useState", "ResourceName", "props", "value", "link", "rest", "outcome", "setOutcome", "useState", "resource", "useResource", "text", "isOk", "normalizeErrorString", "getDisplayString", "React", "MedplumLink", "Text", "ResourceBadge", "props", "React", "Group", "ResourceAvatar", "ResourceName", "Badge", "React", "statusToColor", "StatusBadge", "props", "useStyles", "createStyles", "theme", "DiagnosticReportDisplay", "props", "medplum", "useMedplum", "diagnosticReport", "useResource", "specimens", "setSpecimens", "useState", "useEffect", "ref", "outcomes", "outcome", "specimenNotes", "spec", "pf", "React", "Stack", "Title", "DiagnosticReportHeader", "SpecimenInfo", "ObservationTable", "NoteDisplay", "value", "Group", "Text", "ResourceBadge", "interpreter", "performer", "formatDateTime", "capitalize", "List", "specimen", "classes", "ObservationRowGroup", "observation", "ObservationRow", "isReference", "cx", "displayNotes", "critical", "isCritical", "MedplumLink", "CodeableConceptDisplay", "ObservationValueDisplay", "ReferenceRangeDisplay", "concept", "formatCodeableConcept", "ReferenceDisplay", "StatusBadge", "obs", "formatObservationValue", "range", "RangeDisplay", "code", "createStyles", "Paper", "useComponentDefaultProps", "React", "useStyles", "theme", "width", "fill", "defaultProps", "Panel", "props", "className", "children", "unstyled", "others", "classes", "cx", "createStyles", "getPropertyDisplayName", "stringify", "toTypedValue", "React", "useEffect", "useState", "useStyles", "createStyles", "theme", "ResourceDiffTable", "props", "classes", "medplum", "useMedplum", "schema", "setSchema", "useState", "useEffect", "typeSchema", "React", "entry", "key", "property", "originalPropertyValue", "originalPropertyType", "getValueAndType", "toTypedValue", "revisedPropertyValue", "revisedPropertyType", "isEmpty", "stringify", "getPropertyDisplayName", "ResourcePropertyDisplay", "value", "React", "useEffect", "useState", "ResourceTable", "props", "medplum", "useMedplum", "value", "useResource", "schema", "setSchema", "useState", "useEffect", "React", "BackboneElementDisplay", "ActionIcon", "Group", "Menu", "Text", "formatDateTime", "getReferenceString", "React", "Timeline", "props", "React", "Container", "TimelineItem", "resource", "profile", "padding", "popupMenuItems", "others", "author", "dateTime", "Panel", "Group", "ResourceAvatar", "Text", "ResourceName", "MedplumLink", "formatDateTime", "Menu", "ActionIcon", "getReferenceString", "IconDots", "ErrorBoundary", "sortByDateAndPriority", "resources", "timelineResource", "a", "b", "priority1", "getPriorityScore", "priority2", "getTime", "resource", "isSameResourceType", "priority", "dateTime", "useStyles", "createStyles", "theme", "ResourceTimeline", "props", "medplum", "useMedplum", "navigate", "useMedplumNavigate", "sender", "inputRef", "useRef", "resource", "useResource", "history", "setHistory", "useState", "items", "setItems", "loadTimelineResources", "itemsRef", "sortAndSetItems", "useCallback", "newItmes", "sortByDateAndPriority", "handleBatchResponse", "batchResponse", "newItems", "settledResult", "bundle", "entry", "addResource", "loadTimeline", "resourceType", "id", "useEffect", "createComment", "contentString", "result", "createMedia", "attachment", "updateNotification", "React", "IconCheck", "reason", "normalizeErrorString", "IconFileAlert", "setPriority", "communication", "priority", "onPin", "onUnpin", "onDetails", "timelineItem", "onEdit", "onDelete", "onVersionDetails", "version", "onUploadStart", "showNotification", "onUploadProgress", "e", "getProgressMessage", "Timeline", "Panel", "Form", "formData", "input", "Group", "ResourceAvatar", "TextInput", "ActionIcon", "IconMessage", "AttachmentButton", "IconCloudUpload", "item", "key", "HistoryTimelineItem", "AuditEventTimelineItem", "CommunicationTimelineItem", "DiagnosticReportTimelineItem", "MediaTimelineItem", "TimelineItem", "ResourceTable", "Center", "Loader", "TimelineItemPopupMenu", "Menu", "IconPin", "getReferenceString", "IconPinnedOff", "IconListDetails", "IconEdit", "IconTrash", "previous", "getPrevious", "ResourceDiffTable", "entries", "index", "classes", "className", "contentType", "padding", "AttachmentDisplay", "ScrollArea", "DiagnosticReportDisplay", "percent", "formatFileSize", "bytes", "DefaultResourceTimeline", "props", "React", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "_count", "React", "Document", "props", "children", "others", "React", "Container", "Panel", "createReference", "React", "EncounterTimeline", "props", "React", "ResourceTimeline", "medplum", "_resourceType", "id", "resource", "sender", "text", "createReference", "operator", "content", "Button", "Loader", "Table", "normalizeOperationOutcome", "React", "useEffect", "useRef", "useState", "evalFhirPath", "React", "FhirPathDisplay", "props", "value", "evalFhirPath", "err", "React", "ResourcePropertyDisplay", "ActionIcon", "Button", "Center", "createStyles", "Group", "Loader", "Menu", "Pagination", "Table", "Text", "UnstyledButton", "DEFAULT_SEARCH_COUNT", "formatSearchQuery", "globalSchema", "React", "useCallback", "useEffect", "useRef", "useState", "Box", "Button", "Modal", "Text", "React", "SearchExportDialog", "props", "ExportButton", "Button", "Modal", "globalSchema", "stringify", "React", "useEffect", "useRef", "useState", "capitalize", "DEFAULT_SEARCH_COUNT", "evalFhirPathTyped", "formatDateTime", "Operator", "React", "searchParamToOperators", "Operator", "operatorNames", "setFilters", "definition", "filters", "clearFilters", "clearFiltersOnField", "code", "f", "addFilter", "field", "op", "value", "opt_clear", "nextFilters", "addField", "newFields", "deleteFilter", "index", "newFilters", "addYesterdayFilter", "addDayFilter", "addTodayFilter", "addTomorrowFilter", "delta", "startTime", "endTime", "addDateFilterBetween", "addLastMonthFilter", "addMonthFilter", "addThisMonthFilter", "addNextMonthFilter", "addYearToDateFilter", "d1", "d2", "addDateFilterImpl", "addMissingFilter", "setOffset", "offset", "setPage", "page", "count", "DEFAULT_SEARCH_COUNT", "newOffset", "setSort", "sort", "desc", "getSortField", "isSortDescending", "toggleSort", "key", "sortRules", "getSearchOperators", "searchParam", "getOpString", "buildFieldNameString", "tmp", "capitalize", "renderValue", "resource", "formatDateTime", "renderPropertyValue", "renderSearchParameterValue", "elementDefinition", "path", "propertyType", "getValueAndType", "React", "ResourcePropertyDisplay", "evalFhirPathTyped", "v", "SearchFieldEditor", "props", "state", "setState", "useState", "stringify", "availableRef", "useRef", "selectedRef", "useEffect", "handleAvailableKeyDown", "e", "onAddField", "handleAvailableDoubleClick", "handleSelectedKeyDown", "onRemoveField", "handleSelectedDoubleClick", "currentField", "key", "newFields", "onMoveUp", "currentFields", "field", "index", "swapFields", "onMoveDown", "fields", "i", "j", "temp", "resourceType", "typeDef", "globalSchema", "selected", "available", "getFieldsList", "a", "b", "React", "Modal", "buildFieldNameString", "Button", "typeSchema", "result", "keys", "names", "code", "name", "Button", "Group", "Modal", "NativeSelect", "globalSchema", "stringify", "React", "useEffect", "useRef", "useState", "formatDateTime", "getSearchParameterDetails", "globalSchema", "Operator", "SearchParameterType", "React", "SearchFilterValueDisplay", "props", "resourceType", "filter", "searchParam", "globalSchema", "Operator", "React", "ResourceName", "searchParamDetails", "getSearchParameterDetails", "SearchParameterType", "formatDateTime", "Checkbox", "TextInput", "getSearchParameterDetails", "SearchParameterType", "React", "SearchFilterValueInput", "props", "details", "getSearchParameterDetails", "name", "SearchParameterType", "React", "ReferenceInput", "newReference", "Checkbox", "e", "TextInput", "DateTimeInput", "QuantityInput", "tryParseQuantity", "newQuantity", "value", "valueString", "systemString", "unitString", "SearchFilterEditor", "props", "search", "setSearch", "useState", "stringify", "editingIndex", "setEditingIndex", "searchRef", "useRef", "useEffect", "onAddFilter", "filter", "addFilter", "resourceType", "searchParams", "globalSchema", "filters", "React", "Modal", "index", "FilterRowInput", "newFilter", "newFilters", "setFilters", "FilterRowDisplay", "deleteFilter", "Group", "Button", "buildFieldNameString", "getOpString", "SearchFilterValueDisplay", "value", "setValue", "valueRef", "setFilterCode", "newCode", "setFilterOperator", "newOperator", "setFilterValue", "newFilterValue", "searchParam", "operators", "getSearchOperators", "NativeSelect", "e", "param", "op", "SearchFilterValueInput", "Button", "Grid", "Modal", "React", "useState", "SearchFilterValueDialog", "props", "value", "setValue", "useState", "onOk", "React", "Modal", "Form", "Grid", "SearchFilterValueInput", "Button", "Menu", "Operator", "React", "SearchPopupMenu", "props", "onSort", "searchParam", "desc", "onChange", "setSort", "onClear", "clearFiltersOnField", "onPrompt", "operator", "definition", "React", "SearchParameterSubMenu", "Menu", "buildFieldNameString", "DateFilterSubMenu", "NumericFilterSubMenu", "ReferenceFilterSubMenu", "TextFilterSubMenu", "code", "IconSortAscending", "IconSortDescending", "IconEqual", "Operator", "IconEqualNot", "IconMathLower", "IconMathGreater", "IconBracketsContain", "IconCalendar", "addTomorrowFilter", "addTodayFilter", "addYesterdayFilter", "addNextMonthFilter", "addThisMonthFilter", "addLastMonthFilter", "addYearToDateFilter", "CommonMenuItems", "IconSettings", "IconBucket", "IconBucketOff", "IconBleach", "addMissingFilter", "IconBleachOff", "IconX", "getSearchParameterDetails", "globalSchema", "getFieldDefinitions", "search", "resourceType", "fields", "name", "getFieldDefinition", "typeSchema", "exactElementDefinition", "exactSearchParam", "searchParams", "path", "p", "details", "SearchChangeEvent", "definition", "SearchLoadEvent", "response", "SearchClickEvent", "resource", "browserEvent", "useStyles", "createStyles", "theme", "SearchControl", "props", "classes", "medplum", "useMedplum", "schemaLoaded", "setSchemaLoaded", "useState", "outcome", "setOutcome", "search", "onLoad", "state", "setState", "stateRef", "useRef", "totalType", "loadResults", "useCallback", "options", "formatSearchQuery", "reason", "refreshResults", "useEffect", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "searchResponse", "entry", "isAllSelected", "emitSearchChange", "newSearch", "handleRowClick", "isCheckboxCell", "killEvent", "isAux", "isExportPassed", "globalSchema", "React", "Center", "Loader", "checkboxColumn", "fields", "getFieldDefinitions", "resourceType", "lastResult", "resources", "buttonVariant", "buttonColor", "iconSize", "isMobile", "Group", "Button", "IconColumns", "IconFilter", "IconFilePlus", "IconTableExport", "IconTrash", "IconBoxMultiple", "Text", "getStart", "getEnd", "ActionIcon", "IconRefresh", "Table", "field", "Menu", "UnstyledButton", "buildFieldNameString", "IconAdjustmentsHorizontal", "SearchPopupMenu", "searchParam", "filter", "result", "FilterDescription", "renderValue", "Container", "Pagination", "getPage", "getTotalPages", "newPage", "setPage", "control", "SearchFieldEditor", "SearchFilterEditor", "SearchExportDialog", "SearchFilterValueDialog", "addFilter", "MemoizedSearchControl", "filters", "f", "p", "getOpString", "SearchFilterValueDisplay", "DEFAULT_SEARCH_COUNT", "total", "pageSize", "FhirPathTable", "props", "medplum", "useMedplum", "schema", "setSchema", "useState", "outcome", "setOutcome", "query", "fields", "response", "setResponse", "selected", "setSelected", "responseRef", "useRef", "selectedRef", "useEffect", "err", "normalizeOperationOutcome", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "resources", "resource", "isAllSelected", "handleRowClick", "isCheckboxCell", "killEvent", "SearchClickEvent", "newSchema", "React", "Loader", "checkboxColumn", "Table", "field", "FhirPathDisplay", "Button", "MemoizedFhirPathTable", "React", "Logo", "props", "Alert", "React", "OperationOutcomeAlert", "props", "issues", "Alert", "IconAlertCircle", "issue", "createReference", "React", "useCallback", "PatientTimeline", "props", "loadTimelineResources", "useCallback", "medplum", "resourceType", "id", "ref", "_count", "React", "ResourceTimeline", "resource", "sender", "text", "createReference", "operator", "content", "Anchor", "Button", "createStyles", "NativeSelect", "Stack", "TextInput", "getReferenceString", "React", "useEffect", "useRef", "useState", "useStyles", "createStyles", "theme", "PlanDefinitionBuilder", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "value", "setValue", "handleDocumentMouseOver", "handleDocumentClick", "valueRef", "useRef", "useEffect", "ensurePlanDefinitionKeys", "changeProperty", "property", "newValue", "React", "Form", "TextInput", "e", "ActionArrayBuilder", "x", "Button", "classes", "actionsRef", "changeAction", "changedAction", "i", "addAction", "addedAction", "removeAction", "removedAction", "action", "ActionBuilder", "Anchor", "killEvent", "generateId", "cx", "actionType", "getInitialActionType", "editing", "hovering", "onClick", "onHover", "className", "ActionEditor", "ActionDisplay", "timingProperty", "propertyValue", "propertyType", "getActionTiming", "ReferenceDisplay", "ResourcePropertyDisplay", "setActionType", "Stack", "NativeSelect", "ActionResourceTypeBuilder", "FormSection", "ActionTimingInput", "id", "definitionCanonical", "reference", "ResourceInput", "getReferenceString", "key", "ResourcePropertyInput", "propName", "setPropertyValue", "getValueAndType", "nextId", "existing", "existingNum", "planDefinition", "ensurePlanDefinitionActionKeys", "actions", "Anchor", "Button", "createStyles", "NativeSelect", "Textarea", "TextInput", "Title", "globalSchema", "isResourceType", "React", "useEffect", "useRef", "useState", "evalFhirPathTyped", "getTypedPropertyValue", "QuestionnaireItemType", "isChoiceQuestion", "item", "isQuestionEnabled", "answers", "enableBehavior", "enableWhen", "anyMatch", "allMatch", "checkAnswers", "evaluateMatch", "actualAnswer", "expectedAnswer", "operator", "fhirPathOperator", "value", "actualAnswers", "actualAnswerValue", "Checkbox", "MultiSelect", "NativeSelect", "Radio", "TextInput", "Textarea", "capitalize", "getTypedPropertyValue", "globalSchema", "stringify", "React", "QuestionnaireFormItem", "props", "item", "index", "onChangeAnswer", "newResponseAnswer", "repeatedIndex", "number", "responses", "r", "updatedAnswers", "updateAnswerArray", "type", "name", "initial", "React", "CheckboxFormSection", "Checkbox", "e", "TextInput", "DateTimeInput", "newValue", "Textarea", "AttachmentInput", "ReferenceInput", "addTargetTypes", "QuantityInput", "isDropDownChoice", "QuestionnaireChoiceDropDownInput", "QuestionnaireChoiceRadioInput", "initialValue", "getTypedPropertyValue", "data", "option", "optionValue", "typedValueToString", "propertyName", "formatSelectData", "MultiSelect", "selected", "values", "o", "NativeSelect", "capitalize", "valueElementDefinition", "globalSchema", "options", "defaultValue", "optionName", "stringify", "Radio", "ResourcePropertyDisplay", "answers", "i", "extensions", "a", "typedValue", "useStyles", "createStyles", "theme", "QuestionnaireBuilder", "props", "medplum", "useMedplum", "defaultValue", "useResource", "schema", "setSchema", "useState", "value", "setValue", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "handleDocumentMouseOver", "handleDocumentClick", "useEffect", "ensureQuestionnaireKeys", "React", "Form", "ItemBuilder", "Button", "classes", "cx", "resource", "item", "isResource", "isResourceType", "isContainer", "linkId", "editing", "hovering", "itemRef", "useRef", "onClick", "e", "killEvent", "onHover", "changeItem", "changedItem", "curr", "i", "addItem", "addedItem", "removeItem", "removedItem", "changeProperty", "property", "toggleRepeatable", "className", "TextInput", "Textarea", "ReferenceProfiles", "newOptions", "isChoiceQuestion", "AnswerBuilder", "Title", "QuestionnaireFormItem", "NativeSelect", "Anchor", "generateId", "generateLinkId", "createPage", "globalSchema", "options", "option", "propertyValue", "propertyType", "getValueAndType", "ResourcePropertyInput", "newValue", "propName", "index", "o", "references", "referenceProfiles", "reference", "newReferences", "coding", "r", "nextLinkId", "nextId", "prefix", "questionnaire", "ensureQuestionnaireItemKeys", "items", "ensureQuestionnaireOptionKeys", "Anchor", "Button", "Group", "Stack", "Stepper", "Title", "createReference", "getAllQuestionnaireAnswers", "getExtension", "getReferenceString", "React", "useEffect", "useState", "QuestionnaireForm", "props", "medplum", "useMedplum", "source", "schema", "setSchema", "useState", "questionnaire", "useResource", "response", "setResponse", "answers", "setAnswers", "activePage", "setActivePage", "numberOfPages", "getNumberOfPages", "nextStep", "current", "prevStep", "useEffect", "buildInitialResponse", "setItems", "newResponseItems", "newResponse", "getAllQuestionnaireAnswers", "React", "Form", "getReferenceString", "createReference", "Title", "QuestionnaireFormItemArray", "Group", "ButtonGroup", "responseItems", "setResponseItems", "buildInitialResponseItems", "setResponseItem", "responseId", "newResponseItem", "itemExists", "r", "questionForm", "item", "index", "Stepper", "QuestionnaireFormArrayContent", "Stack", "isQuestionEnabled", "QuestionnaireRepeatWrapper", "FormSection", "onChangeItem", "number", "responses", "getResponseId", "RepeatableGroup", "RepeatableItem", "QuestionnaireFormItem", "Button", "items", "buildInitialResponseItem", "generateId", "buildInitialResponseAnswer", "nextId", "answer", "getExtension", "setNumber", "_", "i", "Anchor", "n", "showAddButton", "ActionIcon", "Button", "createStyles", "Divider", "Group", "NativeSelect", "Stack", "Text", "TextInput", "formatRange", "getCodeBySystem", "React", "useEffect", "useState", "useStyles", "createStyles", "theme", "intervalFilters", "defaultProps", "ReferenceRangeEditor", "props", "defaultDefinition", "intervalGroups", "setIntervalGroups", "useState", "groupId", "setGroupId", "intervalId", "setIntervalId", "useEffect", "definition", "ensureQualifiedIntervalKeys", "groupQualifiedIntervals", "React", "Form", "submitDefinition", "Stack", "intervalGroup", "ReferenceRangeGroupEditor", "getUnitString", "changeInterval", "addInterval", "removeInterval", "removeGroup", "ActionIcon", "e", "killEvent", "addGroup", "id", "IconCirclePlus", "Group", "Button", "qualifiedInterval", "group", "interval", "isEmptyInterval", "addedGroup", "currentGroups", "removedGroup", "changedInterval", "groups", "currentGroup", "g", "index", "addedInterval", "currentGroupIndex", "removedInterval", "unit", "classes", "Container", "IconCircleMinus", "ReferenceRangeGroupFilters", "Divider", "TextInput", "RangeInput", "range", "onChange", "key", "NativeSelect", "newGender", "Text", "ageRange", "newEndocrine", "newCategory", "intervals", "nextId", "existingNum", "groupKey", "generateGroupKey", "formatRange", "c", "getCodeBySystem", "Button", "Grid", "Text", "formatDateTime", "getReferenceString", "React", "useEffect", "useState", "RequestGroupDisplay", "props", "medplum", "useMedplum", "requestGroup", "useResource", "startedLoading", "setStartedLoading", "useState", "responseBundle", "setResponseBundle", "useEffect", "buildBatchRequest", "React", "Grid", "action", "index", "task", "findBundleEntry", "taskInput", "taskOutput", "IconCheckbox", "IconSquare", "Text", "ResourceName", "formatDateTime", "StatusBadge", "Button", "request", "batchEntries", "reference", "entry", "getReferenceString", "createStyles", "React", "useEffect", "useState", "stringify", "diff", "original", "revised", "path", "buildPath", "buildRevisions", "orig", "rev", "N", "M", "MAX", "size", "middle", "diagonal", "d", "k", "kmiddle", "kplus", "kminus", "kplusNode", "kminusNode", "prev", "i", "j", "node", "previousSnake", "startNode", "deltas", "ianchor", "janchor", "type", "blame", "history", "versions", "entry", "stringify", "a", "b", "table", "line", "compareVersions", "combineSpans", "i", "revisions", "diff", "revision", "position", "oldLines", "newLines", "k", "start", "curr", "useStyles", "createStyles", "theme", "ResourceBlame", "props", "classes", "medplum", "useMedplum", "value", "setValue", "useState", "useEffect", "React", "resource", "table", "blame", "row", "index", "ResourceBadge", "MedplumLink", "getVersionUrl", "getTimeString", "versionId", "lastUpdated", "seconds", "years", "pluralizeTime", "months", "days", "hours", "minutes", "count", "noun", "createStyles", "stringify", "React", "useStyles", "createStyles", "theme", "ResourceDiff", "props", "originalResource", "revisedResource", "original", "stringify", "revised", "deltas", "diff", "React", "delta", "index", "ChangeDiff", "classes", "Table", "formatDateTime", "normalizeErrorString", "React", "useEffect", "useState", "ResourceHistoryTable", "props", "medplum", "useMedplum", "value", "setValue", "useState", "useEffect", "React", "Table", "entry", "index", "HistoryRow", "response", "resource", "ResourceBadge", "formatDateTime", "MedplumLink", "getVersionUrl", "normalizeErrorString", "Button", "createStyles", "Stack", "Text", "getReferenceString", "React", "useEffect", "useRef", "useState", "useStyles", "createStyles", "theme", "Scheduler", "props", "classes", "medplum", "useMedplum", "schedule", "useResource", "questionnaire", "slots", "setSlots", "useState", "slotsRef", "useRef", "month", "setMonth", "getStartMonth", "date", "setDate", "slot", "setSlot", "response", "setResponse", "useEffect", "getReferenceString", "getStart", "getEnd", "actor", "React", "ResourceAvatar", "Text", "ResourceName", "formatTime", "CalendarInput", "Stack", "s", "slotStart", "Button", "QuestionnaireForm", "formatSlotInstant", "time", "createReference", "React", "ServiceRequestTimeline", "props", "React", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "_count", "resource", "sender", "text", "createReference", "operator", "content", "normalizeOperationOutcome", "React", "useEffect", "useState", "Anchor", "Button", "Center", "Group", "Stack", "Text", "TextInput", "Title", "normalizeOperationOutcome", "React", "useState", "NewProjectForm", "props", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "React", "Form", "formData", "err", "normalizeOperationOutcome", "Center", "Logo", "Title", "Stack", "TextInput", "getErrorsForInput", "Text", "Anchor", "Group", "Button", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "Text", "TextInput", "normalizeOperationOutcome", "React", "useEffect", "useState", "React", "useEffect", "useRef", "useState", "createScriptTag", "src", "onload", "head", "script", "GoogleButton", "props", "medplum", "useMedplum", "googleClientId", "handleGoogleCredential", "parentRef", "useRef", "scriptLoaded", "setScriptLoaded", "useState", "initialized", "setInitialized", "buttonRendered", "setButtonRendered", "useEffect", "createScriptTag", "React", "getGoogleClientId", "clientId", "origin", "initRecaptcha", "siteKey", "createScriptTag", "getRecaptcha", "resolve", "reject", "err", "NewUserForm", "props", "googleClientId", "getGoogleClientId", "recaptchaSiteKey", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "issues", "getIssuesForExpression", "useEffect", "initRecaptcha", "React", "Form", "formData", "recaptchaToken", "getRecaptcha", "err", "normalizeOperationOutcome", "Center", "OperationOutcomeAlert", "Group", "GoogleButton", "response", "Divider", "Stack", "TextInput", "getErrorsForInput", "PasswordInput", "Text", "Anchor", "Checkbox", "Button", "RegisterForm", "props", "type", "projectId", "clientId", "googleClientId", "recaptchaSiteKey", "onSuccess", "medplum", "useMedplum", "login", "setLogin", "useState", "outcome", "setOutcome", "useEffect", "response", "err", "normalizeOperationOutcome", "handleAuthResponse", "React", "Document", "NewUserForm", "NewProjectForm", "showNotification", "normalizeErrorString", "React", "useCallback", "useEffect", "useState", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "TextInput", "normalizeOperationOutcome", "React", "useCallback", "useState", "AuthenticationForm", "props", "email", "setEmail", "useState", "React", "PasswordForm", "EmailForm", "onRegister", "handleAuthResponse", "children", "disableEmailAuth", "baseLoginRequest", "medplum", "useMedplum", "googleClientId", "getGoogleClientId", "isExternalAuth", "useCallback", "authMethod", "state", "url", "handleSubmit", "formData", "handleGoogleCredential", "response", "authResponse", "Form", "Center", "Group", "GoogleButton", "Divider", "TextInput", "Anchor", "Button", "onForgotPassword", "outcome", "setOutcome", "issues", "getIssuesForExpression", "err", "normalizeOperationOutcome", "OperationOutcomeAlert", "Stack", "PasswordInput", "getErrorsForInput", "Checkbox", "Avatar", "Center", "Group", "Stack", "Text", "Title", "UnstyledButton", "normalizeOperationOutcome", "React", "useState", "ChooseProfileForm", "props", "medplum", "useMedplum", "outcome", "setOutcome", "useState", "React", "Stack", "Center", "Logo", "Title", "OperationOutcomeAlert", "membership", "UnstyledButton", "err", "normalizeOperationOutcome", "Group", "Avatar", "Text", "Button", "Center", "Checkbox", "Group", "Stack", "Title", "React", "ChooseScopeForm", "props", "medplum", "useMedplum", "React", "Form", "formData", "Stack", "Center", "Logo", "Title", "scopeName", "Checkbox", "Group", "Button", "Alert", "Button", "Center", "Group", "Stack", "TextInput", "Title", "normalizeErrorString", "React", "useState", "MfaForm", "props", "medplum", "useMedplum", "errorMessage", "setErrorMessage", "useState", "React", "Form", "formData", "err", "normalizeErrorString", "Stack", "Center", "Logo", "Title", "Alert", "IconAlertCircle", "TextInput", "Group", "Button", "SignInForm", "props", "loginCode", "chooseScopes", "onSuccess", "onForgotPassword", "onRegister", "onCode", "baseLoginRequest", "medplum", "useMedplum", "login", "setLogin", "useState", "mfaRequired", "setAuthenticatorRequired", "memberships", "setMemberships", "handleCode", "useCallback", "code", "err", "showNotification", "normalizeErrorString", "handleAuthResponse", "response", "handleScopeResponse", "useEffect", "React", "Document", "MfaForm", "ChooseProfileForm", "NewProjectForm", "ChooseScopeForm", "AuthenticationForm"]
|
|
7
7
|
}
|