{"version":3,"sources":["../../../src/lib/add-mfa-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n  Box,\n  Code,\n  Flex,\n  Grid,\n  Link,\n  Separator,\n  Text,\n  VisuallyHidden,\n} from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport * as Otp from \"./otp-input.js\";\nimport { Dialog, Button } from \"./elements.js\";\nimport {\n  CreateTotpFactorResponse,\n  useCreateTotpFactor,\n  useVerifyTotpFactor,\n} from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { Form } from \"radix-ui\";\nimport { Marker } from \"./marker.js\";\nimport { CopyButton } from \"./copy-button.js\";\nimport { useSecuritySettings } from \"./use-security-settings.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { useDialogClose } from \"./use-dialog-close.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface AddMfaDialogProps extends Dialog.RootProps {\n  children?: ReactNode;\n  onSuccess?: () => void;\n}\n\nexport function AddMfaDialog({\n  children,\n  onSuccess,\n  ...props\n}: AddMfaDialogProps) {\n  const [open, setOpen] = React.useState(false);\n  const [manuallyTriggered, setManuallyTriggered] = React.useState(false);\n  const { elevatedAccess } = useElevatedAccessToken();\n  const createAuthFactor = useCreateTotpFactor();\n\n  const handleVerified = async () => {\n    await createAuthFactor.mutateAsync(undefined);\n  };\n\n  const onTriggerClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n    if (elevatedAccess && !createAuthFactor.data) {\n      event.preventDefault();\n      setManuallyTriggered(true);\n      createAuthFactor.mutate(undefined, {\n        onSuccess: () => {\n          setOpen(true);\n        },\n      });\n    } else {\n      setManuallyTriggered(false);\n    }\n  };\n\n  const handleClose = React.useCallback(() => {\n    setOpen(false);\n  }, []);\n\n  return (\n    <Dialog.Root\n      {...props}\n      open={props.open || open}\n      onOpenChange={props.onOpenChange || setOpen}\n    >\n      <Dialog.Trigger\n        onClick={onTriggerClick}\n        // @ts-ignore I've to find a way to pass the loading state to the trigger\n        loading={manuallyTriggered && createAuthFactor.isPending}\n      >\n        {children}\n      </Dialog.Trigger>\n\n      <Dialog.Content maxWidth=\"480px\">\n        <ElevatedAccess onVerified={handleVerified}>\n          <Content onClose={handleClose} totpFactor={createAuthFactor.data} />\n        </ElevatedAccess>\n      </Dialog.Content>\n    </Dialog.Root>\n  );\n}\n\ninterface ContentProps {\n  totpFactor?: CreateTotpFactorResponse;\n  onClose?: () => void;\n}\n\nfunction Content({ onClose, totpFactor }: ContentProps) {\n  const securitySettings = useSecuritySettings();\n  const translate = useTranslation();\n\n  const [customError, setCustomError] = React.useState<string | null>(null);\n  const totp =\n    totpFactor?.authenticationFactor.totp != null &&\n    \"qr_code\" in totpFactor.authenticationFactor.totp\n      ? totpFactor.authenticationFactor.totp\n      : undefined;\n\n  const verifyTotp = useVerifyTotpFactor({\n    mutation: {\n      onSuccess: ({ success }) => {\n        if (!success) {\n          setCustomError(\"Invalid passcode\");\n        }\n      },\n    },\n  });\n\n  const serverError = verifyTotp.error || customError;\n  const isSuccess = verifyTotp.isSuccess && !serverError;\n\n  const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n    setCustomError(null);\n\n    const formData = new FormData(event.currentTarget);\n    const otpCode = formData.get(\"otp-code\")?.toString();\n\n    verifyTotp.mutate({\n      data: {\n        authenticationChallengeId: totpFactor?.authenticationChallenge.id ?? \"\",\n        code: otpCode ?? \"\",\n      },\n    });\n  };\n\n  useDialogClose(isSuccess, () => {\n    securitySettings.update(\"Mfa\", true);\n  });\n\n  return (\n    <>\n      <Dialog.Title mb=\"5\">\n        <Translation\n          defaultMessage=\"Set up an authenticator app\"\n          id=\"Eu+kuO\"\n          description=\"Title for setting up two-factor authentication\"\n        />\n      </Dialog.Title>\n\n      <Form.Root onSubmit={handleSubmit}>\n        <Grid columns=\"auto 1fr\" rows=\"repeat(4, auto)\" gapX=\"3\" gapY=\"1\">\n          <Grid\n            rows=\"subgrid\"\n            gridRow=\"span 4\"\n            style={{ placeItems: \"center\" }}\n          >\n            {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n            <Marker>1</Marker>\n            <Separator\n              orientation=\"vertical\"\n              size=\"4\"\n              style={{ width: \"2px\" }}\n            />\n            {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n            <Marker>2</Marker>\n            <div />\n          </Grid>\n\n          <Grid rows=\"subgrid\" gridRow=\"span 4\">\n            <Text as=\"p\" size=\"3\" weight=\"bold\">\n              <Translation\n                defaultMessage=\"Scan the QR code\"\n                id=\"fTSp5u\"\n                description=\"Heading for the QR code scanning step in MFA setup\"\n              />\n            </Text>\n            <Flex direction=\"column\" gap=\"1\">\n              <Text as=\"p\" size=\"2\">\n                <Translation\n                  defaultMessage=\"Use an authenticator app like {onep}, {google}, {authy}, or {microsoft} to scan the QR code below.\"\n                  id=\"8xwdwI\"\n                  description=\"Instructions for scanning the QR code with authenticator apps\"\n                  values={{\n                    onep: (\n                      <Link\n                        href=\"https://1password.com/\"\n                        rel=\"noopener noreferrer\"\n                        target=\"_blank\"\n                        // eslint-disable-next-line formatjs/no-literal-string-in-jsx\n                      >\n                        1Password\n                      </Link>\n                    ),\n                    google: (\n                      <Link\n                        href=\"https://apps.apple.com/us/app/google-authenticator/id388497605\"\n                        rel=\"noopener noreferrer\"\n                        target=\"_blank\"\n                        // eslint-disable-next-line formatjs/no-literal-string-in-jsx\n                      >\n                        Google Authenticator\n                      </Link>\n                    ),\n                    authy: (\n                      <Link\n                        href=\"https://authy.com/\"\n                        rel=\"noopener noreferrer\"\n                        target=\"_blank\"\n                        // eslint-disable-next-line formatjs/no-literal-string-in-jsx\n                      >\n                        Authy\n                      </Link>\n                    ),\n                    microsoft: (\n                      <Link\n                        href=\"https://www.microsoft.com/en-gb/security/mobile-authenticator-app\"\n                        rel=\"noopener noreferrer\"\n                        target=\"_blank\"\n                        // eslint-disable-next-line formatjs/no-literal-string-in-jsx\n                      >\n                        Microsoft Authenticator\n                      </Link>\n                    ),\n                  }}\n                />\n              </Text>\n              <Flex align=\"center\" gap=\"5\" my=\"5\">\n                <Grid\n                  position=\"relative\"\n                  width=\"160px\"\n                  height=\"160px\"\n                  p=\"2\"\n                  style={{\n                    border: \"1px solid var(--gray-7)\",\n                    borderRadius: \"var(--radius-4)\",\n                    background: \"var(--gray-2)\",\n                    overflow: \"hidden\",\n                  }}\n                >\n                  {!!totp?.qr_code && (\n                    <Box asChild width=\"100%\" height=\"auto\">\n                      <img\n                        alt={translate({\n                          defaultMessage: \"Scan this QR code to enroll\",\n                          description: \"Alt text for QR code image\",\n                          id: \"wpbqFJ\",\n                        })}\n                        aria-describedby=\"secret-note\"\n                        height=\"160\"\n                        src={totp.qr_code}\n                        style={{ userSelect: \"none\", background: \"white\" }}\n                        width=\"160\"\n                      />\n                    </Box>\n                  )}\n                </Grid>\n\n                <Flex direction=\"column\" gap=\"1\" align=\"start\">\n                  <Text color=\"gray\" id=\"secret-note\" size=\"2\">\n                    <Translation\n                      defaultMessage=\"Can't scan the code?\"\n                      id=\"6/cdcS\"\n                      description=\"Question asking if user is unable to scan the QR code\"\n                    />\n                  </Text>\n\n                  <SecretDialog\n                    setupKey={totp && \"secret\" in totp ? totp.secret : \"\"}\n                  >\n                    <Button\n                      variant=\"secondary\"\n                      size=\"1\"\n                      disabled={verifyTotp.isPending || isSuccess}\n                    >\n                      <Translation\n                        defaultMessage=\"View setup key\"\n                        id=\"q3eZjH\"\n                        description=\"Button text to view the manual setup key\"\n                      />\n                    </Button>\n                  </SecretDialog>\n                </Flex>\n              </Flex>\n            </Flex>\n            <Text as=\"p\" size=\"3\" weight=\"bold\">\n              <Translation\n                defaultMessage=\"Get verification passcode\"\n                id=\"1kRd2b\"\n                description=\"Heading for entering the verification code step\"\n              />\n            </Text>\n            <Flex direction=\"column\" gap=\"4\">\n              <Text as=\"p\" size=\"2\">\n                <Translation\n                  defaultMessage=\"Enter the 6-digit passcode from your authenticator app.\"\n                  id=\"4/66bS\"\n                  description=\"Instructions for entering the verification passcode\"\n                />\n              </Text>\n\n              <Flex direction=\"column\" gap=\"2\">\n                <Otp.Root\n                  autoSubmit\n                  gap=\"3\"\n                  justify=\"start\"\n                  name=\"otp-code\"\n                  rows=\"48px\"\n                  columns=\"repeat(6, 48px)\"\n                  readOnly={verifyTotp.isPending || isSuccess}\n                >\n                  <Otp.Input required autoFocus autoComplete=\"off\" />\n                  <Otp.Input required />\n                  <Otp.Input required />\n                  <Otp.Input required />\n                  <Otp.Input required />\n                  <Otp.Input required />\n                </Otp.Root>\n\n                {serverError && (\n                  <Text size=\"2\" color=\"red\">\n                    {getMutationErrorMessage(serverError)}\n                  </Text>\n                )}\n              </Flex>\n            </Flex>\n          </Grid>\n        </Grid>\n\n        <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n          <Dialog.Close>\n            <Button\n              variant=\"secondary\"\n              disabled={verifyTotp.isPending || isSuccess}\n            >\n              <Translation\n                defaultMessage=\"Cancel\"\n                id=\"84pAvU\"\n                description=\"Button text to cancel MFA setup\"\n              />\n            </Button>\n          </Dialog.Close>\n\n          <SaveButton\n            type=\"submit\"\n            loading={verifyTotp.isPending}\n            done={isSuccess}\n            onDone={onClose}\n          >\n            <Translation\n              defaultMessage=\"Confirm\"\n              id=\"WHthZi\"\n              description=\"Button text to confirm MFA setup\"\n            />\n          </SaveButton>\n        </Flex>\n      </Form.Root>\n\n      {/* mirror errors in a live region */}\n      <VisuallyHidden asChild>\n        <section aria-live=\"polite\">\n          {getMutationErrorMessage(serverError)}\n        </section>\n      </VisuallyHidden>\n    </>\n  );\n}\n\ninterface SecretDialogProps extends React.PropsWithChildren {\n  setupKey: string;\n}\n\nfunction SecretDialog({ children, setupKey }: SecretDialogProps) {\n  return (\n    <Dialog.Root>\n      <Dialog.Trigger>{children}</Dialog.Trigger>\n      <Dialog.Content\n        maxWidth=\"90vw\"\n        size={{ initial: \"3\", sm: \"4\" }}\n        minWidth=\"300px\"\n        width=\"fit-content\"\n      >\n        <Dialog.Title size=\"2\" weight=\"regular\">\n          <Translation\n            defaultMessage=\"Your setup key\"\n            id=\"LleqNP\"\n            description=\"Title for dialog showing the manual setup key\"\n          />\n        </Dialog.Title>\n        <Dialog.Description>\n          <Text size=\"6\">\n            <Code variant=\"ghost\" style={{ letterSpacing: \"0.15rem\" }}>\n              {setupKey}\n            </Code>\n          </Text>\n        </Dialog.Description>\n\n        <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n          <Dialog.Close>\n            <CopyButton value={setupKey}>\n              <Translation\n                defaultMessage=\"Copy and close\"\n                id=\"EyjGir\"\n                description=\"Button text to copy setup key and close dialog\"\n              />\n            </CopyButton>\n          </Dialog.Close>\n        </Flex>\n      </Dialog.Content>\n    </Dialog.Root>\n  );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n  let message = \"Something went wrong, please try again\";\n\n  if (typeof error === \"string\") {\n    message = error;\n  }\n\n  if (error instanceof Error) {\n    message = error.message;\n  }\n\n  if (\n    typeof error === \"object\" &&\n    error !== null &&\n    \"message\" in error &&\n    typeof error.message === \"string\"\n  ) {\n    message = error.message;\n  }\n\n  if (message === \"Invalid passcode\") {\n    message = \"Invalid passcode, please try again\";\n  }\n\n  return message;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEI;AApEJ,oBASO;AACP,YAAuB;AAEvB,UAAqB;AACrB,sBAA+B;AAC/B,sBAIO;AACP,0BAAuC;AACvC,sBAAqB;AACrB,oBAAuB;AACvB,yBAA2B;AAC3B,mCAAoC;AACpC,6BAA+B;AAC/B,yBAA2B;AAC3B,8BAA+B;AAC/B,yBAA4B;AAC5B,6BAA+B;AAOxB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AACtE,QAAM,EAAE,eAAe,QAAI,4CAAuB;AAClD,QAAM,uBAAmB,qCAAoB;AAE7C,QAAM,iBAAiB,YAAY;AACjC,UAAM,iBAAiB,YAAY,MAAS;AAAA,EAC9C;AAEA,QAAM,iBAAiB,CAAC,UAA+C;AACrE,QAAI,kBAAkB,CAAC,iBAAiB,MAAM;AAC5C,YAAM,eAAe;AACrB,2BAAqB,IAAI;AACzB,uBAAiB,OAAO,QAAW;AAAA,QACjC,WAAW,MAAM;AACf,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC,uBAAO;AAAA,IAAP;AAAA,MACE,GAAG;AAAA,MACJ,MAAM,MAAM,QAAQ;AAAA,MACpB,cAAc,MAAM,gBAAgB;AAAA,MAEpC;AAAA;AAAA,UAAC,uBAAO;AAAA,UAAP;AAAA,YACC,SAAS;AAAA,YAET,SAAS,qBAAqB,iBAAiB;AAAA,YAE9C;AAAA;AAAA,QACH;AAAA,QAEA,4CAAC,uBAAO,SAAP,EAAe,UAAS,SACvB,sDAAC,yCAAe,YAAY,gBAC1B,sDAAC,WAAQ,SAAS,aAAa,YAAY,iBAAiB,MAAM,GACpE,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAOA,SAAS,QAAQ,EAAE,SAAS,WAAW,GAAiB;AACtD,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,gBAAY,uCAAe;AAEjC,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAwB,IAAI;AACxE,QAAM,OACJ,YAAY,qBAAqB,QAAQ,QACzC,aAAa,WAAW,qBAAqB,OACzC,WAAW,qBAAqB,OAChC;AAEN,QAAM,iBAAa,qCAAoB;AAAA,IACrC,UAAU;AAAA,MACR,WAAW,CAAC,EAAE,QAAQ,MAAM;AAC1B,YAAI,CAAC,SAAS;AACZ,yBAAe,kBAAkB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc,WAAW,SAAS;AACxC,QAAM,YAAY,WAAW,aAAa,CAAC;AAE3C,QAAM,eAAe,OAAO,UAA4C;AACtE,UAAM,eAAe;AACrB,mBAAe,IAAI;AAEnB,UAAM,WAAW,IAAI,SAAS,MAAM,aAAa;AACjD,UAAM,UAAU,SAAS,IAAI,UAAU,GAAG,SAAS;AAEnD,eAAW,OAAO;AAAA,MAChB,MAAM;AAAA,QACJ,2BAA2B,YAAY,wBAAwB,MAAM;AAAA,QACrE,MAAM,WAAW;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,8CAAe,WAAW,MAAM;AAC9B,qBAAiB,OAAO,OAAO,IAAI;AAAA,EACrC,CAAC;AAED,SACE,4EACE;AAAA,gDAAC,uBAAO,OAAP,EAAa,IAAG,KACf;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IAEA,6CAAC,qBAAK,MAAL,EAAU,UAAU,cACnB;AAAA,mDAAC,sBAAK,SAAQ,YAAW,MAAK,mBAAkB,MAAK,KAAI,MAAK,KAC5D;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,OAAO,EAAE,YAAY,SAAS;AAAA,YAG9B;AAAA,0DAAC,wBAAO,eAAC;AAAA,cACT;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAY;AAAA,kBACZ,MAAK;AAAA,kBACL,OAAO,EAAE,OAAO,MAAM;AAAA;AAAA,cACxB;AAAA,cAEA,4CAAC,wBAAO,eAAC;AAAA,cACT,4CAAC,SAAI;AAAA;AAAA;AAAA,QACP;AAAA,QAEA,6CAAC,sBAAK,MAAK,WAAU,SAAQ,UAC3B;AAAA,sDAAC,sBAAK,IAAG,KAAI,MAAK,KAAI,QAAO,QAC3B;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,wDAAC,sBAAK,IAAG,KAAI,MAAK,KAChB;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA,gBACZ,QAAQ;AAAA,kBACN,MACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,QAAO;AAAA,sBAER;AAAA;AAAA,kBAED;AAAA,kBAEF,QACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,QAAO;AAAA,sBAER;AAAA;AAAA,kBAED;AAAA,kBAEF,OACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,QAAO;AAAA,sBAER;AAAA;AAAA,kBAED;AAAA,kBAEF,WACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,QAAO;AAAA,sBAER;AAAA;AAAA,kBAED;AAAA,gBAEJ;AAAA;AAAA,YACF,GACF;AAAA,YACA,6CAAC,sBAAK,OAAM,UAAS,KAAI,KAAI,IAAG,KAC9B;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAS;AAAA,kBACT,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,GAAE;AAAA,kBACF,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,UAAU;AAAA,kBACZ;AAAA,kBAEC,WAAC,CAAC,MAAM,WACP,4CAAC,qBAAI,SAAO,MAAC,OAAM,QAAO,QAAO,QAC/B;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,UAAU;AAAA,wBACb,gBAAgB;AAAA,wBAChB,aAAa;AAAA,wBACb,IAAI;AAAA,sBACN,CAAC;AAAA,sBACD,oBAAiB;AAAA,sBACjB,QAAO;AAAA,sBACP,KAAK,KAAK;AAAA,sBACV,OAAO,EAAE,YAAY,QAAQ,YAAY,QAAQ;AAAA,sBACjD,OAAM;AAAA;AAAA,kBACR,GACF;AAAA;AAAA,cAEJ;AAAA,cAEA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAAI,OAAM,SACrC;AAAA,4DAAC,sBAAK,OAAM,QAAO,IAAG,eAAc,MAAK,KACvC;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAe;AAAA,oBACf,IAAG;AAAA,oBACH,aAAY;AAAA;AAAA,gBACd,GACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,QAAQ,YAAY,OAAO,KAAK,SAAS;AAAA,oBAEnD;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,UAAU,WAAW,aAAa;AAAA,wBAElC;AAAA,0BAAC;AAAA;AAAA,4BACC,gBAAe;AAAA,4BACf,IAAG;AAAA,4BACH,aAAY;AAAA;AAAA,wBACd;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,UACA,4CAAC,sBAAK,IAAG,KAAI,MAAK,KAAI,QAAO,QAC3B;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,wDAAC,sBAAK,IAAG,KAAI,MAAK,KAChB;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd,GACF;AAAA,YAEA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA;AAAA,gBAAC,IAAI;AAAA,gBAAJ;AAAA,kBACC,YAAU;AAAA,kBACV,KAAI;AAAA,kBACJ,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,UAAU,WAAW,aAAa;AAAA,kBAElC;AAAA,gEAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC,WAAS,MAAC,cAAa,OAAM;AAAA,oBACjD,4CAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC;AAAA,oBACpB,4CAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC;AAAA,oBACpB,4CAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC;AAAA,oBACpB,4CAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC;AAAA,oBACpB,4CAAC,IAAI,OAAJ,EAAU,UAAQ,MAAC;AAAA;AAAA;AAAA,cACtB;AAAA,cAEC,eACC,4CAAC,sBAAK,MAAK,KAAI,OAAM,OAClB,kCAAwB,WAAW,GACtC;AAAA,eAEJ;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,MAEA,6CAAC,sBAAK,IAAG,KAAI,KAAI,KAAI,SAAQ,OAC3B;AAAA,oDAAC,uBAAO,OAAP,EACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,UAAU,WAAW,aAAa;AAAA,YAElC;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF,GACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,WAAW;AAAA,YACpB,MAAM;AAAA,YACN,QAAQ;AAAA,YAER;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,IAGA,4CAAC,gCAAe,SAAO,MACrB,sDAAC,aAAQ,aAAU,UAChB,kCAAwB,WAAW,GACtC,GACF;AAAA,KACF;AAEJ;AAMA,SAAS,aAAa,EAAE,UAAU,SAAS,GAAsB;AAC/D,SACE,6CAAC,uBAAO,MAAP,EACC;AAAA,gDAAC,uBAAO,SAAP,EAAgB,UAAS;AAAA,IAC1B;AAAA,MAAC,uBAAO;AAAA,MAAP;AAAA,QACC,UAAS;AAAA,QACT,MAAM,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,QAC9B,UAAS;AAAA,QACT,OAAM;AAAA,QAEN;AAAA,sDAAC,uBAAO,OAAP,EAAa,MAAK,KAAI,QAAO,WAC5B;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,4CAAC,uBAAO,aAAP,EACC,sDAAC,sBAAK,MAAK,KACT,sDAAC,sBAAK,SAAQ,SAAQ,OAAO,EAAE,eAAe,UAAU,GACrD,oBACH,GACF,GACF;AAAA,UAEA,4CAAC,sBAAK,OAAM,UAAS,KAAI,KAAI,SAAQ,OAAM,IAAG,KAC5C,sDAAC,uBAAO,OAAP,EACC,sDAAC,iCAAW,OAAO,UACjB;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF,GACF,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,wBAAwB,OAAgB;AAC/C,MAAI,UAAU;AAEd,MAAI,OAAO,UAAU,UAAU;AAC7B,cAAU;AAAA,EACZ;AAEA,MAAI,iBAAiB,OAAO;AAC1B,cAAU,MAAM;AAAA,EAClB;AAEA,MACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,UACzB;AACA,cAAU,MAAM;AAAA,EAClB;AAEA,MAAI,YAAY,oBAAoB;AAClC,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;","names":[]}