{"version":3,"file":"login.DMRXNmpc.js","sources":["../Client/legacy/Components/Login.ts","../Client/legacy/Login/InvalidNpn/hook.ts","../Client/legacy/Login/InvalidNpn/index.tsx","../Client/legacy/Login/InvalidPhone/index.tsx","../Client/legacy/Login/index.tsx"],"sourcesContent":["import * as Api from '@api/MembershipApi';\r\nimport * as Common from '@shared/Common';\r\nimport * as Constants from '@shared/Constants';\r\nimport * as Storage from '@shared/Storage';\r\n\r\nexport class LoginResult {\r\n error: string | undefined;\r\n errorCode: number;\r\n phoneNumberInvalid: boolean;\r\n npnInvalid: boolean;\r\n agentId: number | undefined;\r\n agentPhoneNumber: string | undefined;\r\n contactNpn: string;\r\n locationNpn: string;\r\n}\r\n\r\nexport async function login(\r\n userId: string,\r\n password: string,\r\n rememberMe: boolean,\r\n isLoggedInFromQueryString: boolean = false,\r\n validateContactInfo: boolean = true\r\n): Promise<LoginResult> {\r\n const result = new LoginResult();\r\n\r\n try {\r\n const data = await Api.login({\r\n UserName: userId,\r\n Password: password,\r\n RememberMe: rememberMe,\r\n IsLoggedInFromQueryString: isLoggedInFromQueryString,\r\n });\r\n\r\n if (validateContactInfo) {\r\n const contactInfo = await Api.validateContactInfo(userId, password);\r\n result.phoneNumberInvalid = false;\r\n result.npnInvalid = false;\r\n result.agentId = contactInfo.agentId;\r\n result.agentPhoneNumber = contactInfo.agentPhoneNumber;\r\n result.contactNpn = contactInfo.contactNpn;\r\n result.locationNpn = contactInfo.locationNpn;\r\n if (!contactInfo.agentPhoneNumber || !Common.validatePhoneNumber(contactInfo.agentPhoneNumber)) {\r\n result.phoneNumberInvalid = true;\r\n return result;\r\n }\r\n if (contactInfo.npnRequired) {\r\n result.npnInvalid = true;\r\n return result;\r\n }\r\n }\r\n\r\n Storage.setRememberMe(rememberMe);\r\n\r\n if (data.token) {\r\n const rememberMe = Storage.getRememberMe();\r\n Storage.setAuth(data.token, rememberMe, data.hasJwt);\r\n const roles = data.roles as Constants.AccessRole[];\r\n Storage.setRoles(roles);\r\n Storage.setLoginDetails(data.details);\r\n\r\n const root = Common.getRootPageForLoggedInAgent(data.details);\r\n\r\n let returnUrl = decodeURIComponent(Common.getQueryVariable('returnUrl') || root);\r\n if (!Common.isSameDomain(returnUrl)) {\r\n returnUrl = root;\r\n }\r\n\r\n // If the returnUrl is for an ISO form request, we need to simulate a click on the link to download the form, then redirect to the home page.\r\n // This is because the request returns a file, not a page, so we can't redirect to it, but we want to redirect the user to login so they can conveniently\r\n // download the form if they aren't already logged in. See Swyfft.Web/App/Controllers/Api/ISOFormsController.cs for more info. SW-25234.\r\n if (returnUrl.includes('api/iso-forms')) {\r\n const link = document.createElement('a');\r\n Common.setMultipleAttributes(link, {\r\n href: returnUrl,\r\n download: true,\r\n });\r\n link.click();\r\n Common.navigate(root);\r\n } else {\r\n Common.navigate(returnUrl);\r\n }\r\n } else {\r\n await Common.handleError(\r\n 'Login',\r\n 'The login returned an unexpected result. Contact customersupport@swyfft.com for assistance.',\r\n `User Roles: ${Storage.getRoles().toString()}`\r\n );\r\n }\r\n } catch (reason) {\r\n const error = Common.normalizeError(reason);\r\n const errorCode = error.code ? parseInt(error.code) : 0;\r\n\r\n // For back end exceptions we don't want to display the returned message since it will likely confuse users and could potentially contain sensitive\r\n // info, so we specify a generic error instead.\r\n if (errorCode >= 500) {\r\n result.error = 'A server error occurred, please retry.';\r\n } else {\r\n result.error = error.message;\r\n }\r\n\r\n result.errorCode = error.subCode ? parseInt(error.subCode) : errorCode;\r\n }\r\n\r\n return result;\r\n}\r\n","import { importProducerContactNpnLicenses, importProducerLocationNpnLicenses } from '@api/AgenciesApi';\r\nimport { logout } from '@shared/Common';\r\nimport { useFormReducer } from '@shared/Hooks';\r\nimport { Rules, Value } from '@webkit/index';\r\nimport { useState } from 'react';\r\nimport { InvalidNpnAlertProps } from './models';\r\n\r\nconst npnRules = [Rules.required(), Rules.integer(), Rules.minLength(4), Rules.maxLength(9)];\r\n\r\nexport function useInvalidNpnAlert(props: InvalidNpnAlertProps) {\r\n const [loading, setLoading] = useState(false),\r\n [error, setError] = useState<string | null>(null),\r\n { form, set, submit, valid } = useFormReducer({\r\n contactNpn: new Value<string>('agent NPN', props.contactNpn ?? '', npnRules),\r\n locationNpn: new Value<string>('location NPN', props.locationNpn ?? '', npnRules),\r\n });\r\n\r\n return {\r\n loading,\r\n form,\r\n set,\r\n closeAndLogout,\r\n submitNpnChanges,\r\n error,\r\n };\r\n\r\n async function closeAndLogout() {\r\n props.onClose();\r\n await logout();\r\n }\r\n\r\n async function submitNpnChanges() {\r\n submit();\r\n if (!valid()) return;\r\n\r\n try {\r\n setLoading(true);\r\n // Validates NPN (throws UI errors for invalid NPN) then updates NPN and imports licenses from NIPR.\r\n await importProducerContactNpnLicenses(form.contactNpn.content);\r\n await importProducerLocationNpnLicenses(form.locationNpn.content);\r\n await props.onLogin();\r\n } catch (e) {\r\n let error = 'There was an unexpected error updating your NPN. Please try again or contact support.';\r\n\r\n if (e instanceof Response) {\r\n try {\r\n const json = await e.json();\r\n error = json.ErrorMessage || error;\r\n } catch (e) {}\r\n }\r\n\r\n setError(error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n}\r\n","import { Button, ErrorIcon, Link, Modal, Paragraph, Text } from '@webkit/index';\r\nimport { useInvalidNpnAlert } from './hook';\r\nimport { InvalidNpnAlertProps } from './models';\r\n\r\nexport function InvalidNpnAlert(props: InvalidNpnAlertProps) {\r\n const { loading, form, set, closeAndLogout, submitNpnChanges, error } = useInvalidNpnAlert(props);\r\n\r\n return (\r\n <Modal\r\n id='invalid-npn-modal'\r\n title='Update NPN'\r\n isOpen={props.visible}\r\n onOpenChange={async isOpen => isOpen || (await closeAndLogout())}\r\n isDismissable={false}\r\n >\r\n <div className='grid grid-cols-1 gap-4 mt-4'>\r\n <div className='grid grid-cols-1 gap-2'>\r\n <Paragraph>It looks like we don't have a valid NPN for your account.</Paragraph>\r\n\r\n <Paragraph>\r\n Please update it to continue signing in. If you need help, reach out to us at{' '}\r\n <Link href='mailto:marketingteam@swyfft.com'>marketingteam@swyfft.com</Link>.\r\n </Paragraph>\r\n\r\n <Paragraph>\r\n Need to look up your NPN?{' '}\r\n <Link href='https://nipr.com/help/look-up-your-npn' newTab>\r\n Click Here\r\n </Link>\r\n .\r\n </Paragraph>\r\n </div>\r\n\r\n <hr className='w-full m-0' />\r\n\r\n <div className='grid grid-cols-1 sm:grid-cols-2 gap-3'>\r\n <Text\r\n id='contactNpn'\r\n label='Agent NPN'\r\n value={form.contactNpn}\r\n onChange={value => set('contactNpn', value)}\r\n autoFocus\r\n />\r\n <Text\r\n id='locationNpn'\r\n label='Agency Location NPN'\r\n value={form.locationNpn}\r\n onChange={value => set('locationNpn', value)}\r\n />\r\n </div>\r\n\r\n {error && (\r\n <div className='inline-flex items-start gap-3'>\r\n <ErrorIcon fontSize='small' className='text-brand-red-250' />\r\n <Paragraph>\r\n <span className='text-brand-red-250 mt-3'>{error}</span>\r\n </Paragraph>\r\n </div>\r\n )}\r\n\r\n <div className='grid grid-cols-1 sm:grid-cols-2 gap-3 mt-2'>\r\n <Button id='cancel' key='cancel' onClick={closeAndLogout} isSecondary>\r\n Cancel\r\n </Button>\r\n\r\n <Button id='update-npn-button' key='submit' onClick={submitNpnChanges} isLoading={loading}>\r\n Submit\r\n </Button>\r\n </div>\r\n </div>\r\n </Modal>\r\n );\r\n}\r\n","import { setProducerContactPhone } from '@api/AgenciesApi';\r\nimport { PrimaryBlackButton, PrimaryGreenButton } from '@legacy/Components/FormGroups/Buttons';\r\nimport { TextFormGroup } from '@legacy/Components/FormGroups/Text';\r\nimport Modal, { ModalButtons, ModalText, ModalTitle } from '@legacy/Components/Modals/StandardModal';\r\nimport * as Common from '@shared/Common';\r\nimport { Rules, Value } from '@webkit/index';\r\nimport { useEffect, useRef, useState } from 'react';\r\n\r\nexport const InvalidPhoneNumberModal = (props: {\r\n visible: boolean;\r\n onClose: () => void;\r\n onLogin: () => Promise<void>;\r\n onError: (message: string) => void;\r\n agentPhoneNumber?: string;\r\n}) => {\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [form, setForm] = useState({\r\n phone: new Value<string>('phone number', '', [\r\n Rules.required(),\r\n Rules.phone('Please enter a valid value for the phone number.'),\r\n ]),\r\n extension: new Value<string>('extension', ''),\r\n });\r\n\r\n const phoneRef = useRef<TextFormGroup | null>();\r\n\r\n useEffect(() => {\r\n if (phoneRef.current && props.visible) {\r\n phoneRef.current.focus();\r\n }\r\n }, [props.visible]);\r\n\r\n return (\r\n <Modal\r\n id='invalid-phone-number-modal'\r\n show={props.visible}\r\n hideFn={() => onClose()}\r\n className='invalid-phone-number-modal-bs std-confirm-modal-cp'\r\n disableClickOutside={true}\r\n >\r\n <ModalTitle>Update Phone Number</ModalTitle>\r\n <ModalText>\r\n It looks like we don’t have a valid phone number for your account. Please update it to continue signing\r\n in. If you need help, reach out to us at{' '}\r\n <a href='mailto:marketingteam@swyfft.com'>marketingteam@swyfft.com</a>\r\n </ModalText>\r\n\r\n <div className='row-spacing-cp flex-row-cp'>\r\n <TextFormGroup\r\n id='phone-number'\r\n ref={c => {\r\n phoneRef.current = c;\r\n }}\r\n label='Phone Number'\r\n className='flex-col-3-cp spacing-right-cp'\r\n inputClassName='small-border-radius-cp'\r\n value={form.phone}\r\n placeholder='(987) 654-3210'\r\n onTextChange={(value: string) => {\r\n setForm({ ...form, phone: form.phone.set(value) });\r\n }}\r\n />\r\n\r\n <TextFormGroup\r\n id='extension'\r\n label='Extension'\r\n inputClassName='small-border-radius-cp'\r\n value={form.extension}\r\n onTextChange={(value: string) => setForm({ ...form, extension: form.extension.set(value) })}\r\n />\r\n </div>\r\n\r\n <ModalButtons\r\n buttons={[\r\n <PrimaryBlackButton\r\n key='cancel'\r\n id='cancel'\r\n label='Log Out'\r\n onClick={() => onClose()}\r\n className='mini-button-cp'\r\n />,\r\n\r\n <PrimaryGreenButton\r\n id='update-phone-number-button'\r\n key='submit'\r\n label='Submit'\r\n onClick={() => onSubmit()}\r\n loading={loading}\r\n className='mini-button-cp'\r\n />,\r\n ]}\r\n />\r\n </Modal>\r\n );\r\n\r\n function onClose() {\r\n props.onClose();\r\n Common.logout();\r\n }\r\n\r\n async function onSubmit() {\r\n try {\r\n form.phone.validate();\r\n form.extension.validate();\r\n setForm({ ...form });\r\n\r\n if (!form.phone.valid || !form.extension.valid) {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n await setProducerContactPhone(form.phone.content, form.extension.content);\r\n props.onLogin();\r\n } catch (e) {\r\n console.error(e);\r\n props.onError(\r\n `We were unable to update your phone number due to an error. Please contact customer support with help signing in.`\r\n );\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n};\r\n","import LoginHeader from '@legacy/Components/Headers/Login';\r\nimport * as Login from '@legacy/Components/Login';\r\nimport Toast from '@legacy/Components/Toast';\r\nimport { FieldWrapper } from '@legacy/FormFields';\r\nimport { InvalidNpnAlert } from '@legacy/Login/InvalidNpn';\r\nimport { InvalidPhoneNumberModal } from '@legacy/Login/InvalidPhone';\r\nimport * as Main from '@legacy/Main';\r\nimport * as Common from '@shared/Common';\r\nimport * as Constants from '@shared/Constants';\r\nimport Portal from '@webkit/components/portal';\r\nimport { Rules, Value } from '@webkit/index';\r\nimport * as React from 'react';\r\nimport './style.scss';\r\n\r\nconst loginErrors = {\r\n 110: (_: string) => (\r\n <>\r\n The provided user ID or password is incorrect. If you've forgotten your password, click{' '}\r\n <a href='/login/forgottenpassword'>here</a>.\r\n </>\r\n ),\r\n 111: (userId: string) => <>{`Agent \"${userId}\" is in an inactive status.`}</>,\r\n 112: (userId: string) => <>{`More than one active agent was found with user ID \"${userId}\".`}</>,\r\n};\r\n\r\ntype Props = {\r\n customerSupportPhoneNumber: string;\r\n customerSupportPhoneExtension: string;\r\n};\r\n\r\ntype State = {\r\n errorCode: number | null;\r\n errorMessage?: string;\r\n errors: any[];\r\n userId: Value<string>;\r\n password: Value<string>;\r\n rememberMe: boolean;\r\n initialized: boolean;\r\n showPhoneModal: boolean;\r\n showNpnModal: boolean;\r\n agentId?: number;\r\n agentPhoneNumber?: string;\r\n contactNpn: string;\r\n locationNpn: string;\r\n loggedInFromQueryString?: boolean;\r\n};\r\n\r\nexport class LoginPage extends React.Component<Props, State> {\r\n private toast: Toast | null;\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n\r\n let query = Common.getQueryObject();\r\n this.state = {\r\n errorCode: null,\r\n errorMessage: '',\r\n errors: [],\r\n userId: new Value<string>('email address', query.get('userid') || '', [Rules.required(), Rules.email()]),\r\n password: new Value<string>('password', query.get('password') || '', [Rules.required()]),\r\n rememberMe: false,\r\n initialized: false,\r\n showPhoneModal: false,\r\n showNpnModal: false,\r\n loginDetails: null,\r\n agentPhoneNumber: '',\r\n contactNpn: '',\r\n locationNpn: '',\r\n loggedInFromQueryString: false,\r\n } as State;\r\n\r\n if (query.get('userid') && query.get('password')) {\r\n this.setState({ loggedInFromQueryString: true });\r\n Common.logout().then(() => this.login(null));\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <div id='wrapper'>\r\n <LoginHeader />\r\n <div>\r\n <section className='login-area'>\r\n <div className='container'>\r\n <div className='row'>\r\n <div className='col-xs-12'>\r\n <form className='form-login' autoComplete='off' onSubmit={e => this.login(e)}>\r\n <div className='login-holder' onChange={this.onChange.bind(this)}>\r\n <div className='form-group'>\r\n <div className='input-holder'>\r\n <FieldWrapper\r\n id='login-AgentID'\r\n name='agentID'\r\n className='agent-id-bs'\r\n inputClassName='custom-form-control login-input-bs'\r\n labelClassName='input-label-bs'\r\n type='text'\r\n value={this.state.userId.content}\r\n invalidate={!this.state.userId.valid}\r\n placeholder='Agent ID'\r\n active={true}\r\n onChange={() => {}}\r\n label='Your Email'\r\n autoFocus={true}\r\n />\r\n <span className='error-label-bs'>\r\n {this.state.userId.error}\r\n </span>\r\n </div>\r\n </div>\r\n <div className='form-group'>\r\n <div className='input-holder'>\r\n <FieldWrapper\r\n id='login-Password'\r\n name='agentPassword'\r\n className='agent-password-bs'\r\n inputClassName='custom-form-control login-input-bs'\r\n labelClassName='input-label-bs'\r\n type='password'\r\n value={this.state.password.content}\r\n invalidate={!this.state.password.valid}\r\n placeholder='Password'\r\n active={true}\r\n onChange={() => {}}\r\n label='Password'\r\n />\r\n <span className='error-label-bs'>\r\n {this.state.password.error}\r\n </span>\r\n </div>\r\n </div>\r\n <div className='form-group'>\r\n <label\r\n onClick={this.onCheck.bind(this)}\r\n className='remember-me-container'\r\n >\r\n <span\r\n className={`jcf-checkbox checkbox-field-md remember-me ${\r\n this.state.rememberMe ? 'jcf-checked' : ''\r\n }`}\r\n >\r\n <input\r\n id='remember_me'\r\n type='checkbox'\r\n value='remember-me'\r\n checked={this.state.rememberMe}\r\n style={{\r\n position: 'absolute',\r\n height: '100%',\r\n width: '100%',\r\n opacity: 0,\r\n margin: 0,\r\n }}\r\n onChange={e => this.onCheck(e)}\r\n />\r\n </span>\r\n <span className='input-label-bs'>Remember me</span>\r\n </label>\r\n </div>\r\n <div>\r\n {this.state.errorCode && (\r\n <label id='unauthorizedErrorLabel' className='errorLabel'>\r\n {!!this.state.errorMessage\r\n ? this.state.errorMessage\r\n : loginErrors[this.state.errorCode](\r\n this.state.userId.content\r\n )}\r\n </label>\r\n )}\r\n </div>\r\n <div className='row'>\r\n <div className='col-xs-12 col-sm-12 col-lg-3 col-md-3'>\r\n <input\r\n type='submit'\r\n value='Submit'\r\n className='btn btn-default login-btn-bs'\r\n id='login-button'\r\n />\r\n </div>\r\n </div>\r\n <div className='row'>\r\n <div className='col-xs-12'>\r\n <a\r\n href='/Login/ForgottenPassword'\r\n className='forgotten-password-bs'\r\n >\r\n Forgot your password?\r\n </a>\r\n </div>\r\n </div>\r\n <div className='row'>\r\n <div className='col-xs-12'>\r\n <a\r\n href={`${Constants.pages.NewAgent}`}\r\n className='forgotten-password-bs'\r\n >\r\n Not a Swyfft Agent or Need a login?\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Toast\r\n ref={c => {\r\n this.toast = c;\r\n }}\r\n />\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <Portal>\r\n <InvalidPhoneNumberModal\r\n // The key in this case is used to force a re-render of the component when the phone number changes.\r\n key={this.state.agentPhoneNumber}\r\n visible={this.state.showPhoneModal}\r\n onClose={() => this.setState({ showPhoneModal: false })}\r\n onLogin={async () => await this.submitLogin()}\r\n onError={(message: string) => this.onError(message)}\r\n agentPhoneNumber={this.state.agentPhoneNumber}\r\n />\r\n </Portal>\r\n\r\n <Portal>\r\n <InvalidNpnAlert\r\n // The key in this case is used to force a re-render of the component when the npn changes.\r\n key={this.state.locationNpn}\r\n visible={this.state.showNpnModal}\r\n onClose={() => this.setState({ showNpnModal: false })}\r\n onLogin={async () => await this.submitLogin()}\r\n contactNpn={this.state.contactNpn}\r\n locationNpn={this.state.locationNpn}\r\n />\r\n </Portal>\r\n </>\r\n );\r\n }\r\n\r\n onChange(e) {\r\n let target = e.target,\r\n key;\r\n if (target.name === 'agentID') key = 'userId';\r\n else if (target.name === 'agentPassword') key = 'password';\r\n\r\n if (key) {\r\n let state = this.state;\r\n let value = state[key];\r\n value.set(e.target.value);\r\n this.setState(state);\r\n }\r\n }\r\n\r\n onCheck(e) {\r\n this.setState({\r\n rememberMe: !this.state.rememberMe,\r\n });\r\n\r\n e.preventDefault();\r\n }\r\n\r\n onError(message: string) {\r\n if (this.toast) this.toast.error(message);\r\n }\r\n\r\n async login(e) {\r\n if (e) e.preventDefault();\r\n\r\n this.setState({\r\n errorCode: null,\r\n errorMessage: '',\r\n });\r\n\r\n this.state.userId.validate();\r\n this.state.password.validate();\r\n\r\n if (this.state.userId.error || this.state.password.error) {\r\n return;\r\n }\r\n\r\n await this.submitLogin();\r\n }\r\n\r\n private async submitLogin() {\r\n this.setState({ showPhoneModal: false, showNpnModal: false });\r\n\r\n const result = await Login.login(\r\n this.state.userId.content,\r\n this.state.password.content,\r\n this.state.rememberMe,\r\n this.state.loggedInFromQueryString\r\n );\r\n\r\n this.setState({\r\n initialized: true,\r\n errorCode: result.errorCode,\r\n errorMessage: result.error,\r\n showPhoneModal: result.phoneNumberInvalid,\r\n showNpnModal: result.npnInvalid,\r\n agentId: result.agentId,\r\n agentPhoneNumber: result.agentPhoneNumber,\r\n contactNpn: result.contactNpn,\r\n locationNpn: result.locationNpn,\r\n });\r\n }\r\n}\r\n\r\nexport function init() {\r\n Main.init();\r\n Common.renderComponent(\r\n <LoginPage\r\n customerSupportPhoneNumber={(window as any).Phone}\r\n customerSupportPhoneExtension={(window as any).PhoneMarketingExtension}\r\n />\r\n );\r\n}\r\n\r\ninit();\r\n"],"names":["LoginResult","__publicField","login","userId","password","rememberMe","isLoggedInFromQueryString","validateContactInfo","result","data","Api.login","contactInfo","Api.validateContactInfo","Common.validatePhoneNumber","Storage.setRememberMe","Storage.getRememberMe","Storage.setAuth","roles","Storage.setRoles","Storage.setLoginDetails","root","Common.getRootPageForLoggedInAgent","returnUrl","Common.getQueryVariable","Common.isSameDomain","link","Common.setMultipleAttributes","Common.navigate","Common.handleError","Storage.getRoles","reason","error","Common.normalizeError","errorCode","npnRules","Rules.required","Rules.integer","Rules.minLength","Rules.maxLength","useInvalidNpnAlert","props","loading","setLoading","useState","setError","form","set","submit","valid","useFormReducer","Value","closeAndLogout","submitNpnChanges","logout","importProducerContactNpnLicenses","importProducerLocationNpnLicenses","e","InvalidNpnAlert","jsx","Modal","isOpen","jsxs","Paragraph","Link","Text","value","ErrorIcon","Button","InvalidPhoneNumberModal","setForm","Rules.phone","phoneRef","useRef","useEffect","onClose","ModalTitle","ModalText","TextFormGroup","ModalButtons","PrimaryBlackButton","PrimaryGreenButton","onSubmit","Common.logout","setProducerContactPhone","loginErrors","_","Fragment","LoginPage","React.Component","query","Common.getQueryObject","Rules.email","LoginHeader","FieldWrapper","Constants.pages","Toast","c","Portal","message","target","key","state","Login.login","init","Main.init","Common.renderComponent"],"mappings":"kxFAKO,MAAMA,EAAY,CAAlB,cACHC,EAAA,cACAA,EAAA,kBACAA,EAAA,2BACAA,EAAA,mBACAA,EAAA,gBACAA,EAAA,yBACAA,EAAA,mBACAA,EAAA,oBACJ,CAEA,eAAsBC,GAClBC,EACAC,EACAC,EACAC,EAAqC,GACrCC,EAA+B,GACX,CACd,MAAAC,EAAS,IAAIR,GAEf,GAAA,CACM,MAAAS,EAAO,MAAMC,EAAU,CACzB,SAAUP,EACV,SAAUC,EACV,WAAYC,EACZ,0BAA2BC,CAAA,CAC9B,EAED,GAAIC,EAAqB,CACrB,MAAMI,EAAc,MAAMC,EAAwBT,EAAQC,CAAQ,EAO9D,GANJI,EAAO,mBAAqB,GAC5BA,EAAO,WAAa,GACpBA,EAAO,QAAUG,EAAY,QAC7BH,EAAO,iBAAmBG,EAAY,iBACtCH,EAAO,WAAaG,EAAY,WAChCH,EAAO,YAAcG,EAAY,YAC7B,CAACA,EAAY,kBAAoB,CAACE,EAA2BF,EAAY,gBAAgB,EACzF,OAAAH,EAAO,mBAAqB,GACrBA,EAEX,GAAIG,EAAY,YACZ,OAAAH,EAAO,WAAa,GACbA,CACX,CAKJ,GAFAM,EAAsBT,CAAU,EAE5BI,EAAK,MAAO,CACNJ,MAAAA,EAAaU,EAAsB,EACzCC,EAAgBP,EAAK,MAAOJ,EAAYI,EAAK,MAAM,EACnD,MAAMQ,EAAQR,EAAK,MACnBS,EAAiBD,CAAK,EACdE,EAAgBV,EAAK,OAAO,EAEpC,MAAMW,EAAOC,EAAmCZ,EAAK,OAAO,EAE5D,IAAIa,EAAY,mBAAmBC,EAAwB,WAAW,GAAKH,CAAI,EAQ3E,GAPCI,EAAoBF,CAAS,IAClBA,EAAAF,GAMZE,EAAU,SAAS,eAAe,EAAG,CAC/B,MAAAG,EAAO,SAAS,cAAc,GAAG,EACvCC,EAA6BD,EAAM,CAC/B,KAAMH,EACN,SAAU,EAAA,CACb,EACDG,EAAK,MAAM,EACXE,EAAgBP,CAAI,CAAA,MAEpBO,EAAgBL,CAAS,CAC7B,MAEA,MAAMM,EACF,QACA,8FACA,eAAeC,IAAmB,UAAU,EAChD,QAECC,EAAQ,CACP,MAAAC,EAAQC,EAAsBF,CAAM,EACpCG,EAAYF,EAAM,KAAO,SAASA,EAAM,IAAI,EAAI,EAIlDE,GAAa,IACbzB,EAAO,MAAQ,yCAEfA,EAAO,MAAQuB,EAAM,QAGzBvB,EAAO,UAAYuB,EAAM,QAAU,SAASA,EAAM,OAAO,EAAIE,CAAA,CAG1D,OAAAzB,CACX,CCjGA,MAAM0B,EAAW,CAACC,IAAkBC,GAAiB,EAAAC,GAAgB,CAAC,EAAGC,GAAgB,CAAC,CAAC,EAEpF,SAASC,GAAmBC,EAA6B,CACtD,KAAA,CAACC,EAASC,CAAU,EAAIC,WAAS,EAAK,EACxC,CAACZ,EAAOa,CAAQ,EAAID,EAAAA,SAAwB,IAAI,EAChD,CAAE,KAAAE,EAAM,IAAAC,EAAK,OAAAC,EAAQ,MAAAC,GAAUC,EAAe,CAC1C,WAAY,IAAIC,EAAc,YAAaV,EAAM,YAAc,GAAIN,CAAQ,EAC3E,YAAa,IAAIgB,EAAc,eAAgBV,EAAM,aAAe,GAAIN,CAAQ,CAAA,CACnF,EAEE,MAAA,CACH,QAAAO,EACA,KAAAI,EACA,IAAAC,EACA,eAAAK,EACA,iBAAAC,EACA,MAAArB,CACJ,EAEA,eAAeoB,GAAiB,CAC5BX,EAAM,QAAQ,EACd,MAAMa,EAAO,CAAA,CAGjB,eAAeD,GAAmB,CAE1B,GADGL,EAAA,EACH,EAACC,IAED,GAAA,CACAN,EAAW,EAAI,EAET,MAAAY,EAAiCT,EAAK,WAAW,OAAO,EACxD,MAAAU,EAAkCV,EAAK,YAAY,OAAO,EAChE,MAAML,EAAM,QAAQ,QACfgB,EAAG,CACR,IAAIzB,EAAQ,wFAEZ,GAAIyB,aAAa,SACT,GAAA,CAEAzB,GADa,MAAMyB,EAAE,KAAK,GACb,cAAgBzB,OACrB,CAAA,CAGhBa,EAASb,CAAK,CAAA,QAChB,CACEW,EAAW,EAAK,CAAA,CACpB,CAER,CCpDO,SAASe,GAAgBjB,EAA6B,CACnD,KAAA,CAAE,QAAAC,EAAS,KAAAI,EAAM,IAAAC,EAAK,eAAAK,EAAgB,iBAAAC,EAAkB,MAAArB,CAAA,EAAUQ,GAAmBC,CAAK,EAG5F,OAAAkB,EAAA,IAACC,GAAA,CACG,GAAG,oBACH,MAAM,aACN,OAAQnB,EAAM,QACd,aAAc,MAAMoB,GAAUA,GAAW,MAAMT,EAAe,EAC9D,cAAe,GAEf,SAAAU,EAAA,KAAC,MAAI,CAAA,UAAU,8BACX,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,yBACX,SAAA,CAAAH,EAAAA,IAACI,GAAU,SAAyD,2DAAA,CAAA,SAEnEA,EAAU,CAAA,SAAA,CAAA,gFACuE,IAC7EJ,EAAA,IAAAK,EAAA,CAAK,KAAK,kCAAkC,SAAwB,2BAAA,EAAO,GAAA,EAChF,SAECD,EAAU,CAAA,SAAA,CAAA,4BACmB,UACzBC,EAAK,CAAA,KAAK,yCAAyC,OAAM,GAAC,SAE3D,aAAA,EAAO,GAAA,CAEX,CAAA,CAAA,EACJ,EAEAL,EAAAA,IAAC,KAAG,CAAA,UAAU,YAAa,CAAA,EAE3BG,EAAAA,KAAC,MAAI,CAAA,UAAU,wCACX,SAAA,CAAAH,EAAA,IAACM,EAAA,CACG,GAAG,aACH,MAAM,YACN,MAAOnB,EAAK,WACZ,SAAUoB,GAASnB,EAAI,aAAcmB,CAAK,EAC1C,UAAS,EAAA,CACb,EACAP,EAAA,IAACM,EAAA,CACG,GAAG,cACH,MAAM,sBACN,MAAOnB,EAAK,YACZ,SAAUoB,GAASnB,EAAI,cAAemB,CAAK,CAAA,CAAA,CAC/C,EACJ,EAEClC,GACG8B,EAAA,KAAC,MAAI,CAAA,UAAU,gCACX,SAAA,CAAAH,EAAA,IAACQ,GAAU,CAAA,SAAS,QAAQ,UAAU,qBAAqB,QAC1DJ,EACG,CAAA,SAAAJ,MAAC,QAAK,UAAU,0BAA2B,UAAM,CAAA,CACrD,CAAA,CAAA,EACJ,EAGJG,EAAAA,KAAC,MAAI,CAAA,UAAU,6CACX,SAAA,CAACH,EAAAA,IAAAS,EAAA,CAAO,GAAG,SAAsB,QAAShB,EAAgB,YAAW,GAAC,mBAA9C,QAExB,EAEAO,EAAAA,IAACS,GAAO,GAAG,oBAAiC,QAASf,EAAkB,UAAWX,EAAS,SAAA,QAAA,EAAxD,QAEnC,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,CAAA,CACJ,CAER,CChEa,MAAA2B,GAA2B5B,GAMlC,CACF,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAkB,EAAK,EAC/C,CAACE,EAAMwB,CAAO,EAAI1B,WAAS,CAC7B,MAAO,IAAIO,EAAc,eAAgB,GAAI,CACzCf,EAAe,EACfmC,GAAY,kDAAkD,CAAA,CACjE,EACD,UAAW,IAAIpB,EAAc,YAAa,EAAE,CAAA,CAC/C,EAEKqB,EAAWC,EAAAA,OAA6B,EAE9CC,OAAAA,EAAAA,UAAU,IAAM,CACRF,EAAS,SAAW/B,EAAM,SAC1B+B,EAAS,QAAQ,MAAM,CAC3B,EACD,CAAC/B,EAAM,OAAO,CAAC,EAGdqB,EAAA,KAACF,GAAA,CACG,GAAG,6BACH,KAAMnB,EAAM,QACZ,OAAQ,IAAMkC,EAAQ,EACtB,UAAU,qDACV,oBAAqB,GAErB,SAAA,CAAAhB,EAAAA,IAACiB,IAAW,SAAmB,qBAAA,CAAA,SAC9BC,GAAU,CAAA,SAAA,CAAA,mJAEkC,IACxClB,EAAA,IAAA,IAAA,CAAE,KAAK,kCAAkC,SAAwB,0BAAA,CAAA,CAAA,EACtE,EAEAG,EAAAA,KAAC,MAAI,CAAA,UAAU,6BACX,SAAA,CAAAH,EAAA,IAACmB,EAAA,CACG,GAAG,eACH,IAAU,GAAA,CACNN,EAAS,QAAU,CACvB,EACA,MAAM,eACN,UAAU,iCACV,eAAe,yBACf,MAAO1B,EAAK,MACZ,YAAY,iBACZ,aAAeoB,GAAkB,CACrBI,EAAA,CAAE,GAAGxB,EAAM,MAAOA,EAAK,MAAM,IAAIoB,CAAK,EAAG,CAAA,CACrD,CACJ,EAEAP,EAAA,IAACmB,EAAA,CACG,GAAG,YACH,MAAM,YACN,eAAe,yBACf,MAAOhC,EAAK,UACZ,aAAeoB,GAAkBI,EAAQ,CAAE,GAAGxB,EAAM,UAAWA,EAAK,UAAU,IAAIoB,CAAK,CAAG,CAAA,CAAA,CAAA,CAC9F,EACJ,EAEAP,EAAA,IAACoB,GAAA,CACG,QAAS,CACLpB,EAAA,IAACqB,GAAA,CAEG,GAAG,SACH,MAAM,UACN,QAAS,IAAML,EAAQ,EACvB,UAAU,gBAAA,EAJN,QAKR,EAEAhB,EAAA,IAACsB,GAAA,CACG,GAAG,6BAEH,MAAM,SACN,QAAS,IAAMC,EAAS,EACxB,QAAAxC,EACA,UAAU,gBAAA,EAJN,QAAA,CAKR,CACJ,CAAA,CACJ,CAAA,CACJ,EAGJ,SAASiC,GAAU,CACflC,EAAM,QAAQ,EACd0C,EAAc,CAAA,CAGlB,eAAeD,GAAW,CAClB,GAAA,CAKA,GAJApC,EAAK,MAAM,SAAS,EACpBA,EAAK,UAAU,SAAS,EAChBwB,EAAA,CAAE,GAAGxB,EAAM,EAEf,CAACA,EAAK,MAAM,OAAS,CAACA,EAAK,UAAU,MACrC,OAGJH,EAAW,EAAI,EACf,MAAMyC,EAAwBtC,EAAK,MAAM,QAASA,EAAK,UAAU,OAAO,EACxEL,EAAM,QAAQ,QACTgB,EAAG,CACR,QAAQ,MAAMA,CAAC,EACThB,EAAA,QACF,mHACJ,CAAA,QACF,CACEE,EAAW,EAAK,CAAA,CACpB,CAER,EC5GM0C,GAAc,CAChB,IAAMC,GACAxB,EAAA,KAAAyB,EAAA,SAAA,CAAA,SAAA,CAAA,0FAC0F,IACvF5B,EAAA,IAAA,IAAA,CAAE,KAAK,2BAA2B,SAAI,OAAA,EAAI,GAAA,EAC/C,EAEJ,IAAMvD,GAAsBuD,EAAA,IAAA4B,WAAA,CAAA,SAAA,UAAUnF,CAAM,8BAA8B,EAC1E,IAAMA,GAAsBuD,EAAAA,IAAA4B,EAAA,SAAA,CAAA,SAAA,sDAAsDnF,CAAM,IAAK,CAAA,CACjG,EAwBa,MAAAoF,WAAkBC,EAAAA,SAA8B,CAGzD,YAAYhD,EAAc,CACtB,MAAMA,CAAK,EAHPvC,EAAA,cAKA,IAAAwF,EAAQC,EAAsB,EAClC,KAAK,MAAQ,CACT,UAAW,KACX,aAAc,GACd,OAAQ,CAAC,EACT,OAAQ,IAAIxC,EAAc,gBAAiBuC,EAAM,IAAI,QAAQ,GAAK,GAAI,CAACtD,IAAkBwD,GAAa,CAAA,CAAC,EACvG,SAAU,IAAIzC,EAAc,WAAYuC,EAAM,IAAI,UAAU,GAAK,GAAI,CAACtD,EAAM,CAAU,CAAC,EACvF,WAAY,GACZ,YAAa,GACb,eAAgB,GAChB,aAAc,GACd,aAAc,KACd,iBAAkB,GAClB,WAAY,GACZ,YAAa,GACb,wBAAyB,EAC7B,EAEIsD,EAAM,IAAI,QAAQ,GAAKA,EAAM,IAAI,UAAU,IAC3C,KAAK,SAAS,CAAE,wBAAyB,EAAA,CAAM,EAC/CP,IAAgB,KAAK,IAAM,KAAK,MAAM,IAAI,CAAC,EAC/C,CAGJ,QAAS,CACL,OAEQrB,EAAA,KAAAyB,WAAA,CAAA,SAAA,CAACzB,EAAAA,KAAA,MAAA,CAAI,GAAG,UACJ,SAAA,CAAAH,EAAA,IAACkC,EAAY,EAAA,EACZlC,MAAA,MAAA,CACG,SAACG,EAAAA,KAAA,UAAA,CAAQ,UAAU,aACf,SAAA,CAAAH,MAAC,MAAI,CAAA,UAAU,YACX,SAAAA,EAAA,IAAC,OAAI,UAAU,MACX,SAACA,EAAA,IAAA,MAAA,CAAI,UAAU,YACX,SAACA,EAAAA,IAAA,OAAA,CAAK,UAAU,aAAa,aAAa,MAAM,SAAeF,GAAA,KAAK,MAAMA,CAAC,EACvE,SAACK,EAAAA,KAAA,MAAA,CAAI,UAAU,eAAe,SAAU,KAAK,SAAS,KAAK,IAAI,EAC3D,SAAA,CAAAH,EAAAA,IAAC,OAAI,UAAU,aACX,SAACG,EAAA,KAAA,MAAA,CAAI,UAAU,eACX,SAAA,CAAAH,EAAA,IAACmC,EAAA,CACG,GAAG,gBACH,KAAK,UACL,UAAU,cACV,eAAe,qCACf,eAAe,iBACf,KAAK,OACL,MAAO,KAAK,MAAM,OAAO,QACzB,WAAY,CAAC,KAAK,MAAM,OAAO,MAC/B,YAAY,WACZ,OAAQ,GACR,SAAU,IAAM,CAAC,EACjB,MAAM,aACN,UAAW,EAAA,CACf,QACC,OAAK,CAAA,UAAU,iBACX,SAAK,KAAA,MAAM,OAAO,KACvB,CAAA,CAAA,CAAA,CACJ,CACJ,CAAA,QACC,MAAI,CAAA,UAAU,aACX,SAAChC,EAAA,KAAA,MAAA,CAAI,UAAU,eACX,SAAA,CAAAH,EAAA,IAACmC,EAAA,CACG,GAAG,iBACH,KAAK,gBACL,UAAU,oBACV,eAAe,qCACf,eAAe,iBACf,KAAK,WACL,MAAO,KAAK,MAAM,SAAS,QAC3B,WAAY,CAAC,KAAK,MAAM,SAAS,MACjC,YAAY,WACZ,OAAQ,GACR,SAAU,IAAM,CAAC,EACjB,MAAM,UAAA,CACV,QACC,OAAK,CAAA,UAAU,iBACX,SAAK,KAAA,MAAM,SAAS,KACzB,CAAA,CAAA,CAAA,CACJ,CACJ,CAAA,EACAnC,EAAAA,IAAC,MAAI,CAAA,UAAU,aACX,SAAAG,EAAA,KAAC,QAAA,CACG,QAAS,KAAK,QAAQ,KAAK,IAAI,EAC/B,UAAU,wBAEV,SAAA,CAAAH,EAAA,IAAC,OAAA,CACG,UAAW,8CACP,KAAK,MAAM,WAAa,cAAgB,EAC5C,GAEA,SAAAA,EAAA,IAAC,QAAA,CACG,GAAG,cACH,KAAK,WACL,MAAM,cACN,QAAS,KAAK,MAAM,WACpB,MAAO,CACH,SAAU,WACV,OAAQ,OACR,MAAO,OACP,QAAS,EACT,OAAQ,CACZ,EACA,SAAUF,GAAK,KAAK,QAAQA,CAAC,CAAA,CAAA,CACjC,CACJ,EACCE,EAAA,IAAA,OAAA,CAAK,UAAU,iBAAiB,SAAW,aAAA,CAAA,CAAA,CAAA,CAAA,EAEpD,EACAA,EAAAA,IAAC,OACI,SAAK,KAAA,MAAM,WACPA,EAAAA,IAAA,QAAA,CAAM,GAAG,yBAAyB,UAAU,aACxC,SAAE,KAAK,MAAM,aACR,KAAK,MAAM,aACX0B,GAAY,KAAK,MAAM,SAAS,EAC5B,KAAK,MAAM,OAAO,SAEhC,CAER,CAAA,QACC,MAAI,CAAA,UAAU,MACX,SAAC1B,MAAA,MAAA,CAAI,UAAU,wCACX,SAAAA,EAAA,IAAC,QAAA,CACG,KAAK,SACL,MAAM,SACN,UAAU,+BACV,GAAG,cAAA,GAEX,CACJ,CAAA,QACC,MAAI,CAAA,UAAU,MACX,SAACA,MAAA,MAAA,CAAI,UAAU,YACX,SAAAA,EAAA,IAAC,IAAA,CACG,KAAK,2BACL,UAAU,wBACb,SAAA,uBAAA,GAGL,CACJ,CAAA,QACC,MAAI,CAAA,UAAU,MACX,SAACA,MAAA,MAAA,CAAI,UAAU,YACX,SAAAA,EAAA,IAAC,IAAA,CACG,KAAM,GAAGoC,GAAgB,QAAQ,GACjC,UAAU,wBACb,SAAA,qCAAA,GAGL,CACJ,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,EACJ,CAAA,CACJ,CACJ,CAAA,EAEApC,EAAA,IAACqC,EAAA,CACG,IAAUC,GAAA,CACN,KAAK,MAAQA,CAAA,CACjB,CAAA,CACJ,CAAA,CACJ,CACJ,CAAA,CAAA,EACJ,QAECC,EACG,CAAA,SAAAvC,EAAA,IAACU,GAAA,CAGG,QAAS,KAAK,MAAM,eACpB,QAAS,IAAM,KAAK,SAAS,CAAE,eAAgB,GAAO,EACtD,QAAS,SAAY,MAAM,KAAK,YAAY,EAC5C,QAAU8B,GAAoB,KAAK,QAAQA,CAAO,EAClD,iBAAkB,KAAK,MAAM,gBAAA,EALxB,KAAK,MAAM,gBAAA,EAOxB,QAECD,EACG,CAAA,SAAAvC,EAAA,IAACD,GAAA,CAGG,QAAS,KAAK,MAAM,aACpB,QAAS,IAAM,KAAK,SAAS,CAAE,aAAc,GAAO,EACpD,QAAS,SAAY,MAAM,KAAK,YAAY,EAC5C,WAAY,KAAK,MAAM,WACvB,YAAa,KAAK,MAAM,WAAA,EALnB,KAAK,MAAM,WAAA,CAOxB,CAAA,CAAA,EACJ,CAAA,CAIR,SAASD,EAAG,CACJ,IAAA2C,EAAS3C,EAAE,OACX4C,EAIJ,GAHID,EAAO,OAAS,UAAiBC,EAAA,SAC5BD,EAAO,OAAS,kBAAuBC,EAAA,YAE5CA,EAAK,CACL,IAAIC,EAAQ,KAAK,MACLA,EAAMD,CAAG,EACf,IAAI5C,EAAE,OAAO,KAAK,EACxB,KAAK,SAAS6C,CAAK,CAAA,CACvB,CAGJ,QAAQ7C,EAAG,CACP,KAAK,SAAS,CACV,WAAY,CAAC,KAAK,MAAM,UAAA,CAC3B,EAEDA,EAAE,eAAe,CAAA,CAGrB,QAAQ0C,EAAiB,CACjB,KAAK,OAAY,KAAA,MAAM,MAAMA,CAAO,CAAA,CAG5C,MAAM,MAAM1C,EAAG,CACPA,KAAK,eAAe,EAExB,KAAK,SAAS,CACV,UAAW,KACX,aAAc,EAAA,CACjB,EAEI,KAAA,MAAM,OAAO,SAAS,EACtB,KAAA,MAAM,SAAS,SAAS,EAEzB,OAAK,MAAM,OAAO,OAAS,KAAK,MAAM,SAAS,QAInD,MAAM,KAAK,YAAY,CAAA,CAG3B,MAAc,aAAc,CACxB,KAAK,SAAS,CAAE,eAAgB,GAAO,aAAc,GAAO,EAEtD,MAAAhD,EAAS,MAAM8F,GACjB,KAAK,MAAM,OAAO,QAClB,KAAK,MAAM,SAAS,QACpB,KAAK,MAAM,WACX,KAAK,MAAM,uBACf,EAEA,KAAK,SAAS,CACV,YAAa,GACb,UAAW9F,EAAO,UAClB,aAAcA,EAAO,MACrB,eAAgBA,EAAO,mBACvB,aAAcA,EAAO,WACrB,QAASA,EAAO,QAChB,iBAAkBA,EAAO,iBACzB,WAAYA,EAAO,WACnB,YAAaA,EAAO,WAAA,CACvB,CAAA,CAET,CAEO,SAAS+F,IAAO,CACnBC,GAAU,EACHC,EACH/C,EAAA,IAAC6B,GAAA,CACG,2BAA6B,OAAe,MAC5C,8BAAgC,OAAe,uBAAA,CAAA,CAEvD,CACJ,CAEAgB,GAAK"}