{"version":3,"file":"survey_page--VM1n3v6.js","sources":["../../app/javascript/components/surveys/shared/use_survey_question.ts","../../app/javascript/components/surveys/shared/validation/question_error_item.tsx","../../app/javascript/components/surveys/shared/validation/notification_for_question_errors.tsx","../../app/javascript/components/surveys/shared/validation/use_survey_validation.tsx","../../app/javascript/components/surveys/survey_page.tsx"],"sourcesContent":["import { useQuery } from \"urql\";\nimport {\n  PostSessionSurveyCareerQuestionDocument,\n  Survey,\n  SurveyQuestionTemplateId,\n} from \"../../generated/graphql\";\nimport useRotatingQuestionIndex from \"../questions/hooks/useRotatingQuestion\";\nimport { SurveyAudienceContext } from \"../survey_page\";\nimport { getRotatingCareerOpenResponseQuestions } from \"../questions/rotating_career_open_response\";\n\nexport function useSurveyQuestion(\n  question: Survey[\"questions\"][0],\n  surveyAudienceContext?: SurveyAudienceContext\n) {\n  const rotatingTemplatesIds = [\n    SurveyQuestionTemplateId.RotatingOpenResponse,\n    SurveyQuestionTemplateId.RotatingLikert,\n    SurveyQuestionTemplateId.RotatingCareerOpenResponse,\n  ];\n\n  // Rotating career open response nonsense starts here //\n  // This is necessary because unlike all other question types in the DB, the rotating career open response\n  // question has hard-coded options in the FE.\n  const questionIsCareerOpenResponse =\n    question.template.templateId === SurveyQuestionTemplateId.RotatingCareerOpenResponse;\n\n  const [{ fetching: fetchingSurveyAudienceEntities, data: surveyAudienceEntities }] = useQuery({\n    query: PostSessionSurveyCareerQuestionDocument,\n    variables: {\n      participantId: surveyAudienceContext?.participantId ?? \"\",\n      mentorshipId: surveyAudienceContext?.mentorshipId ?? \"\",\n    },\n    pause: !questionIsCareerOpenResponse || !surveyAudienceContext,\n  });\n  const careerRotatingQuestions =\n    questionIsCareerOpenResponse && surveyAudienceEntities\n      ? getRotatingCareerOpenResponseQuestions(\n          surveyAudienceEntities?.participant,\n          surveyAudienceEntities?.mentorship\n        )\n      : [];\n  // Rotating career open response nonsense ends here /\n\n  const numberOfRotatingQuestions =\n    questionIsCareerOpenResponse && surveyAudienceEntities\n      ? careerRotatingQuestions.length\n      : question.customizations?.rotatingQuestions?.length;\n\n  const { fetching: fetchingRotatingIndex, questionIndex } = useRotatingQuestionIndex({\n    numberOfQuestions: numberOfRotatingQuestions,\n    pause: !rotatingTemplatesIds.includes(question.template.templateId),\n    surveyAudienceContext,\n  });\n\n  const getQuestionLabel = () => {\n    switch (question.template.templateId) {\n      case SurveyQuestionTemplateId.CounterpartsInfo:\n      case SurveyQuestionTemplateId.DatePicker:\n      case SurveyQuestionTemplateId.Flags:\n      case SurveyQuestionTemplateId.Likert:\n      case SurveyQuestionTemplateId.MentorshipChatGroupStudentSelect:\n      case SurveyQuestionTemplateId.MultiSelect:\n      case SurveyQuestionTemplateId.MultiSelectDropdown:\n      case SurveyQuestionTemplateId.Nps:\n      case SurveyQuestionTemplateId.NumberInput:\n      case SurveyQuestionTemplateId.OpenResponse:\n      case SurveyQuestionTemplateId.Select:\n      case SurveyQuestionTemplateId.SelectWithSelectFollowUp: {\n        return question.customizations.prompt;\n      }\n      case SurveyQuestionTemplateId.Generic: {\n        return question.customizations.text;\n      }\n      case SurveyQuestionTemplateId.RotatingCareerOpenResponse: {\n        return questionIndex !== undefined &&\n          careerRotatingQuestions[questionIndex] !== undefined &&\n          !fetchingRotatingIndex &&\n          !fetchingSurveyAudienceEntities\n          ? careerRotatingQuestions[questionIndex].prompt\n          : \"Question\";\n      }\n      case SurveyQuestionTemplateId.RotatingLikert:\n      case SurveyQuestionTemplateId.RotatingOpenResponse: {\n        return fetchingRotatingIndex || questionIndex === undefined\n          ? \"Question\"\n          : question.customizations.rotatingQuestions[questionIndex].prompt;\n      }\n      case SurveyQuestionTemplateId.Conversation: {\n        return (\n          question.customizations.modeOfCommunicationPrompt ?? question.customizations.topicsPrompt\n        );\n      }\n      case SurveyQuestionTemplateId.MentorshipChatGroupOptionalStudentInfo: {\n        return question.customizations.yesNoPrompt;\n      }\n      default: {\n        return question.customizations.prompt;\n      }\n    }\n  };\n\n  return {\n    getQuestionLabel,\n  };\n}\n","import React from \"react\";\nimport { useSurveyQuestion } from \"../use_survey_question\";\nimport { Survey } from \"../../../generated/graphql\";\nimport { SurveyAudienceContext } from \"../../survey_page\";\n\nconst TRUNCATE_LIMIT = 150;\n\nconst trailingEllipsis = (str: string) => {\n  return str.length > TRUNCATE_LIMIT ? \"...\" : \"\";\n};\n\nexport default function QuestionErrorItem({\n  question,\n  surveyAudienceContext,\n}: {\n  question: Survey[\"questions\"][\"0\"];\n  // This is only needed because of the rotatingCareerOpenResponse question, which\n  // hard codes the list of question in the FE and uses this object to determine which questions are\n  // available to the user. All other questions have this information stored in the metadata of the\n  // customizations column. A plague on the house of rotatingCareerOpenResponse.\n  surveyAudienceContext?: SurveyAudienceContext;\n}) {\n  const { getQuestionLabel } = useSurveyQuestion(question, surveyAudienceContext);\n\n  // TODO: enable click to scroll\n  //   const handleScrollToQuestion = () => {\n  //     const element = document.getElementById(question.id);\n  //     element?.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"nearest\" });\n  //   };\n\n  return (\n    <li\n      // onClick functionality to scroll to the question with an error will be worked on in TA-923\n      // onClick={handleScrollToQuestion}\n      data-test={`question-error-message`}\n    >\n      {getQuestionLabel().substring(0, TRUNCATE_LIMIT)}\n      {trailingEllipsis(getQuestionLabel())}\n    </li>\n  );\n}\n","import React from \"react\";\nimport {\n  Notification,\n  NotificationColorSchemeEnum,\n  NotificationKindEnum,\n} from \"../../../components/base_ui/progress_and_validation/notification/index\";\nimport { Survey } from \"../../../generated/graphql\";\nimport QuestionErrorItem from \"./question_error_item\";\nimport styled from \"styled-components\";\nimport { SurveyAudienceContext } from \"../../survey_page\";\nimport { Cell } from \"baseui/layout-grid\";\n\nconst notificationOverrides = {\n  Body: {\n    style: () => ({\n      // This lets the grid control the margins of its content\n      marginLeft: 0,\n      marginRight: 0,\n      marginBottom: 0,\n      marginTop: 0,\n    }),\n  },\n};\n\nconst StyledBoldText = styled.span`\n  font-weight: 700;\n  text-align: left;\n`;\n\nconst StyledList = styled.ul`\n  list-style-position: outside;\n  margin-top: 0;\n  margin-left: ${({ theme }) => `-${theme.sizing.scale600}`};\n  margin-bottom: 0;\n  padding-inline-start: 40px;\n`;\n\nexport default function NotificationForQuestionErrors({\n  questionsWithErrors,\n  onClose,\n  surveyAudienceContext,\n}: {\n  questionsWithErrors: Survey[\"questions\"];\n  onClose: () => void;\n  surveyAudienceContext?: SurveyAudienceContext;\n}) {\n  const isPlural = questionsWithErrors.length > 1;\n  // It's necessary to separate this out explicitly so screen readers can determine what to read out.\n  const boldErrorText = isPlural\n    ? \"Errors found in the following questions.\"\n    : \"Error found in the following question.\";\n\n  return (\n    <Cell span={12}>\n      <div id={\"survey-validation-message\"}>\n        <Notification\n          kind={NotificationKindEnum.NEGATIVE}\n          colorScheme={NotificationColorSchemeEnum.LIGHT}\n          showIcon={true}\n          closeable={true}\n          isFullWidth={true}\n          onClose={onClose}\n          dataTest={\"survey-error-validation-message\"}\n          styletronOverrides={notificationOverrides}\n        >\n          <div>\n            <StyledBoldText>{boldErrorText}</StyledBoldText> Please review them before resubmitting:\n            <StyledList>\n              {questionsWithErrors\n                .sort((q1, q2) => q1.index - q2.index)\n                .map((question) => {\n                  return (\n                    <QuestionErrorItem\n                      key={question.id}\n                      question={question}\n                      surveyAudienceContext={surveyAudienceContext}\n                    />\n                  );\n                })}\n            </StyledList>\n          </div>\n        </Notification>\n      </div>\n    </Cell>\n  );\n}\n","import React, { useContext, useEffect } from \"react\";\nimport usePendoTrackEvent from \"../../../shared/use_pendo_track_event\";\nimport styled from \"styled-components\";\nimport { SurveyType } from \"../../../generated/graphql\";\nimport NotificationForQuestionErrors from \"./notification_for_question_errors\";\nimport { SurveyState } from \"../../survey\";\nimport { AppContext, Environment } from \"../../../../components/app\";\nimport { SurveyAudienceContext } from \"../../survey_page\";\n\nconst StyledNotificationWrapper = styled.div`\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n`;\n\nconst StyledNotificationContainer = styled.div`\n  width: 100%;\n`;\n\nexport default function useSurveyValidation(surveyState: SurveyState) {\n  const { environment } = useContext(AppContext);\n\n  const { survey, ableToSubmit, questionsWithErrors, showValidation, setShowValidation } =\n    surveyState;\n\n  const surveyType = survey.surveyType ? `-${survey.surveyType}` : \"\";\n\n  const QUICK_CONVERSATION_LOGGING_SURVEY_ID = \"28\";\n\n  // TA-879: due to time and resource constraints, these surveys will not have a refreshed UI\n  const showRefreshedComponents =\n    survey.surveyType !== SurveyType.PostSession &&\n    survey.id !== QUICK_CONVERSATION_LOGGING_SURVEY_ID;\n\n  const pendoTrackEvent = usePendoTrackEvent();\n\n  useEffect(() => {\n    if (showValidation) {\n      const element = document.getElementById(\"survey-validation-message\");\n      element?.scrollIntoView({\n        // smooth behavior causes flake in e2e tests because they're so fast, so we show the error notification \"instantly\" there\n        behavior: environment === Environment.Test ? \"auto\" : \"smooth\",\n        block: \"end\",\n        inline: \"nearest\",\n      });\n    }\n  }, [showValidation, environment]);\n\n  const renderErrorNotification = (context?: SurveyAudienceContext) => {\n    return (\n      showValidation &&\n      questionsWithErrors.length > 0 && (\n        <StyledNotificationContainer>\n          <StyledNotificationWrapper>\n            <NotificationForQuestionErrors\n              questionsWithErrors={questionsWithErrors}\n              onClose={() => setShowValidation(false)}\n              surveyAudienceContext={context}\n            />\n          </StyledNotificationWrapper>\n        </StyledNotificationContainer>\n      )\n    );\n  };\n\n  const validateSurvey = async () => {\n    // clear out any previous errors\n    await setShowValidation(false);\n    if (!ableToSubmit) {\n      pendoTrackEvent(`user-attempted-to-submit-survey-with-errors${surveyType}`);\n      setShowValidation(true);\n      throw new Error(\"Survey has errors that must be addressed before submitting.\");\n    } else {\n      pendoTrackEvent(`user-submitted-survey${surveyType}`);\n    }\n  };\n\n  return showRefreshedComponents\n    ? {\n        renderErrorNotification,\n        validateSurvey,\n        showValidation,\n      }\n    : {\n        renderErrorNotification: () => null,\n        validateSurvey: async () => true,\n        showValidation: false,\n      };\n}\n","import React, { Fragment, ReactNode } from \"react\";\nimport Survey, { useSurveyState } from \"./survey\";\nimport DeprecatedButton, { ButtonType } from \"../components/data_entry/button\";\nimport { SurveyType } from \"../generated/graphql\";\nimport { KIND } from \"baseui/button\";\nimport styled from \"styled-components\";\nimport { Button } from \"../components/base_ui/inputs/button\";\nimport useSurveyValidation from \"./shared/validation/use_survey_validation\";\nimport {\n  SectionBlock,\n  ButtonsContainer as RegistrationButtonsContainer,\n} from \"../components/base_ui/surfaces/section_block\";\nimport useDeviceType from \"../shared/use_device_type\";\n\nconst SectionBlockOverrides = {\n  Root: {\n    style: {\n      maxWidth: \"900px\",\n    },\n  },\n  Contents: {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n    },\n  },\n};\n\nconst RegistrationFlowSectionBlockOverrides = {\n  Root: {\n    style: () => ({\n      maxWidth: \"900px\",\n      marginLeft: \"auto\",\n      marginRight: \"auto\",\n    }),\n  },\n  Contents: {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n    },\n  },\n};\n\n// The purpose of this container is to keep old question components\n// at a max width of 700px for ease of reading line lengths,\n// and to match the new survey component widths while accounting\n// for the old components not being surrounded by a SectionBlock or Card.\nconst DeprecatedStyledSurveyContainer = styled.div`\n  max-width: 700px;\n`;\n\nconst DeprecatedSubmitButtonContainer = styled.div`\n  padding-bottom: 0;\n  margin: ${({ theme }) => theme.sizing.scale1000} 0px ${({ theme }) => theme.sizing.scale1000}\n    ${({ theme }) => theme.sizing.scale300};\n  justify-content: start;\n  display: flex;\n`;\n\nconst SubmitButtonContainer = styled.div`\n  padding-bottom: 0;\n  justify-content: start;\n  display: flex;\n`;\n\nexport interface SurveyAudienceContext {\n  mentorshipChatGroupId?: string;\n  mentorshipId?: string;\n  participantId?: string;\n  programId?: string;\n}\n\nexport default function SurveyPage({\n  id,\n  userId,\n  context,\n  introText,\n  inRegistrationFlow = false,\n  className,\n  onSubmit = () => undefined,\n}: {\n  id: string;\n  userId: string;\n  context?: SurveyAudienceContext;\n  introText?: ReactNode;\n  inRegistrationFlow?: boolean;\n  className?: string;\n  onSubmit?: () => void;\n}) {\n  const { isMobile } = useDeviceType();\n  const surveyState = useSurveyState({\n    id,\n    onSubmit,\n    userId,\n    participantId: context?.participantId,\n  });\n\n  const {\n    fetching,\n    survey,\n    answers,\n    setAnswers,\n    savingResponse,\n    setIdsOfQuestionsAbleToSubmit,\n    setSavingResponse,\n    saveSurveyResponse,\n    ableToSubmit,\n    showValidation,\n  } = surveyState;\n\n  const { renderErrorNotification, validateSurvey } = useSurveyValidation(surveyState);\n\n  const QUICK_CONVERSATION_LOGGING_SURVEY_ID = \"28\";\n\n  // TA-879: due to time and resource constraints, these surveys will not have a refreshed UI\n  const showRefreshedComponents =\n    survey.surveyType !== SurveyType.PostSession &&\n    survey.id !== QUICK_CONVERSATION_LOGGING_SURVEY_ID;\n\n  if (fetching) {\n    return <div>...Loading</div>;\n  }\n\n  // Buttons are constructed based on whether we're in the registration flow or not\n  const Buttons = () => {\n    const SubmitButton = ({\n      dataAnalyticsId,\n      children,\n    }: {\n      dataAnalyticsId: string;\n      children: string;\n    }) => (\n      <Button\n        onClick={async () => {\n          try {\n            await validateSurvey();\n          } catch {\n            return;\n          }\n\n          setSavingResponse(true);\n          await saveSurveyResponse({\n            inputResponse: {\n              surveyId: id,\n              userId,\n              contextInput: {\n                mentorshipChatGroupId: context?.mentorshipChatGroupId,\n                mentorshipId: context?.mentorshipId,\n                participantId: context?.participantId,\n              },\n              answers: Object.keys(answers).map((questionId) => ({\n                questionId,\n                answerJson: answers[questionId],\n              })),\n            },\n          });\n          setSavingResponse(false);\n        }}\n        disabled={savingResponse}\n        data-test=\"survey-submit\"\n        data-analytics-id={dataAnalyticsId}\n        isStretched={isMobile}\n      >\n        {children}\n      </Button>\n    );\n\n    return inRegistrationFlow ? (\n      // Buttons for the matching survey in the registration flow\n      <RegistrationButtonsContainer>\n        <SubmitButton dataAnalyticsId=\"sign-up-flow-matching-survey-submit-button\">\n          Submit and Continue\n        </SubmitButton>\n        <Button\n          onClick={onSubmit}\n          dataTest=\"complete-survey-later-button\"\n          dataAnalyticsId=\"sign-up-flow-on-matching-survey-later-button\"\n          kind={KIND.tertiary}\n          isStretched={isMobile}\n        >\n          Complete Survey Later\n        </Button>\n      </RegistrationButtonsContainer>\n    ) : (\n      // Buttons for all other surveys\n      <SubmitButtonContainer>\n        <SubmitButton\n          dataAnalyticsId={\n            // Not all surveys have types (like the \"I can't get in touch\" survey, which we track in other ways)\n            survey.surveyType ? `survey-page-submit-button-${survey.surveyType}` : \"\"\n          }\n        >\n          Submit Responses\n        </SubmitButton>\n      </SubmitButtonContainer>\n    );\n  };\n\n  const renderSurvey = () => {\n    return (\n      <>\n        {introText}\n        <Survey\n          answers={answers}\n          survey={survey}\n          context={context}\n          className={className}\n          savingResponse={savingResponse}\n          setAnswers={setAnswers}\n          setIdsOfQuestionsAbleToSubmit={setIdsOfQuestionsAbleToSubmit}\n          showValidation={showValidation}\n        />\n      </>\n    );\n  };\n\n  return (\n    <Fragment>\n      {renderErrorNotification(context)}\n      {showRefreshedComponents || inRegistrationFlow ? (\n        <SectionBlock\n          title={inRegistrationFlow ? \"Complete Matching Survey\" : \"\"}\n          styletronOverrides={\n            inRegistrationFlow ? RegistrationFlowSectionBlockOverrides : SectionBlockOverrides\n          }\n          footer={<Buttons />}\n          showFooterHorizontalRule\n        >\n          {renderSurvey()}\n        </SectionBlock>\n      ) : (\n        <DeprecatedStyledSurveyContainer>\n          {renderSurvey()}\n          <DeprecatedSubmitButtonContainer>\n            <DeprecatedButton\n              buttonType={ButtonType.primary}\n              onClick={async () => {\n                setSavingResponse(true);\n                await saveSurveyResponse({\n                  inputResponse: {\n                    surveyId: id,\n                    userId,\n                    contextInput: {\n                      mentorshipChatGroupId: context?.mentorshipChatGroupId,\n                      mentorshipId: context?.mentorshipId,\n                      participantId: context?.participantId,\n                    },\n                    answers: Object.keys(answers).map((questionId) => ({\n                      questionId,\n                      answerJson: answers[questionId],\n                    })),\n                  },\n                });\n                setSavingResponse(false);\n              }}\n              disabled={!ableToSubmit || savingResponse}\n              data-test=\"survey-submit\"\n              dataAnalyticsId={\n                // Not all surveys have types (like the \"I can't get in touch\" survey, which we track in other ways)\n                survey.surveyType ? `survey-page-submit-button-${survey.surveyType}` : undefined\n              }\n              style={isMobile ? { width: \"100%\" } : {}}\n            >\n              Submit\n            </DeprecatedButton>\n          </DeprecatedSubmitButtonContainer>\n        </DeprecatedStyledSurveyContainer>\n      )}\n    </Fragment>\n  );\n}\n"],"names":["useSurveyQuestion","question","surveyAudienceContext","rotatingTemplatesIds","SurveyQuestionTemplateId","questionIsCareerOpenResponse","fetchingSurveyAudienceEntities","surveyAudienceEntities","useQuery","PostSessionSurveyCareerQuestionDocument","careerRotatingQuestions","getRotatingCareerOpenResponseQuestions","numberOfRotatingQuestions","_b","_a","fetchingRotatingIndex","questionIndex","useRotatingQuestionIndex","TRUNCATE_LIMIT","trailingEllipsis","str","QuestionErrorItem","getQuestionLabel","jsxs","notificationOverrides","StyledBoldText","styled","StyledList","theme","NotificationForQuestionErrors","questionsWithErrors","onClose","boldErrorText","Cell","jsx","Notification","NotificationKindEnum","NotificationColorSchemeEnum","q1","q2","StyledNotificationWrapper","StyledNotificationContainer","useSurveyValidation","surveyState","environment","useContext","AppContext","survey","ableToSubmit","showValidation","setShowValidation","surveyType","showRefreshedComponents","SurveyType","pendoTrackEvent","usePendoTrackEvent","useEffect","element","Environment","context","SectionBlockOverrides","RegistrationFlowSectionBlockOverrides","DeprecatedStyledSurveyContainer","DeprecatedSubmitButtonContainer","SubmitButtonContainer","SurveyPage","id","userId","introText","inRegistrationFlow","className","onSubmit","isMobile","useDeviceType","useSurveyState","fetching","answers","setAnswers","savingResponse","setIdsOfQuestionsAbleToSubmit","setSavingResponse","saveSurveyResponse","renderErrorNotification","validateSurvey","Buttons","SubmitButton","dataAnalyticsId","children","Button","questionId","RegistrationButtonsContainer","KIND","renderSurvey","Fragment","Survey","SectionBlock","DeprecatedButton","ButtonType"],"mappings":"u3BAUgB,SAAAA,GACdC,EACAC,EACA,SACA,MAAMC,EAAuB,CAC3BC,EAAyB,qBACzBA,EAAyB,eACzBA,EAAyB,0BAC3B,EAKMC,EACJJ,EAAS,SAAS,aAAeG,EAAyB,2BAEtD,CAAC,CAAE,SAAUE,EAAgC,KAAMC,CAAuB,CAAC,EAAIC,EAAS,CAC5F,MAAOC,EACP,UAAW,CACT,eAAeP,GAAA,YAAAA,EAAuB,gBAAiB,GACvD,cAAcA,GAAA,YAAAA,EAAuB,eAAgB,EACvD,EACA,MAAO,CAACG,GAAgC,CAACH,CAAA,CAC1C,EACKQ,EACJL,GAAgCE,EAC5BI,EACEJ,GAAA,YAAAA,EAAwB,YACxBA,GAAA,YAAAA,EAAwB,UAAA,EAE1B,CAAC,EAGDK,EACJP,GAAgCE,EAC5BG,EAAwB,QACxBG,GAAAC,EAAAb,EAAS,iBAAT,YAAAa,EAAyB,oBAAzB,YAAAD,EAA4C,OAE5C,CAAE,SAAUE,EAAuB,cAAAC,CAAA,EAAkBC,EAAyB,CAClF,kBAAmBL,EACnB,MAAO,CAACT,EAAqB,SAASF,EAAS,SAAS,UAAU,EAClE,sBAAAC,CAAA,CACD,EAiDM,MAAA,CACL,iBAhDuB,IAAM,CACrB,OAAAD,EAAS,SAAS,WAAY,CACpC,KAAKG,EAAyB,iBAC9B,KAAKA,EAAyB,WAC9B,KAAKA,EAAyB,MAC9B,KAAKA,EAAyB,OAC9B,KAAKA,EAAyB,iCAC9B,KAAKA,EAAyB,YAC9B,KAAKA,EAAyB,oBAC9B,KAAKA,EAAyB,IAC9B,KAAKA,EAAyB,YAC9B,KAAKA,EAAyB,aAC9B,KAAKA,EAAyB,OAC9B,KAAKA,EAAyB,yBAC5B,OAAOH,EAAS,eAAe,OAEjC,KAAKG,EAAyB,QAC5B,OAAOH,EAAS,eAAe,KAEjC,KAAKG,EAAyB,2BAC5B,OAAOY,IAAkB,QACvBN,EAAwBM,CAAa,IAAM,QAC3C,CAACD,GACD,CAACT,EACCI,EAAwBM,CAAa,EAAE,OACvC,WAEN,KAAKZ,EAAyB,eAC9B,KAAKA,EAAyB,qBACrB,OAAAW,GAAyBC,IAAkB,OAC9C,WACAf,EAAS,eAAe,kBAAkBe,CAAa,EAAE,OAE/D,KAAKZ,EAAyB,aAC5B,OACEH,EAAS,eAAe,2BAA6BA,EAAS,eAAe,aAGjF,KAAKG,EAAyB,uCAC5B,OAAOH,EAAS,eAAe,YAEjC,QACE,OAAOA,EAAS,eAAe,MACjC,CAEJ,CAIA,CACF,CCnGA,MAAMiB,EAAiB,IAEjBC,GAAoBC,GACjBA,EAAI,OAASF,EAAiB,MAAQ,GAG/C,SAAwBG,GAAkB,CACxC,SAAApB,EACA,sBAAAC,CACF,EAOG,CACD,KAAM,CAAE,iBAAAoB,CAAqB,EAAAtB,GAAkBC,EAAUC,CAAqB,EAS5E,OAAAqB,EAAA,KAAC,KAAA,CAGC,YAAW,yBAEV,SAAA,CAAiBD,IAAE,UAAU,EAAGJ,CAAc,EAC9CC,GAAiBG,EAAkB,CAAA,CAAA,CAAA,CACtC,CAEJ,CC5BA,MAAME,GAAwB,CAC5B,KAAM,CACJ,MAAO,KAAO,CAEZ,WAAY,EACZ,YAAa,EACb,aAAc,EACd,UAAW,CACb,EAAA,CAEJ,EAEMC,GAAiBC,EAAO;AAAA;AAAA;AAAA,EAKxBC,GAAaD,EAAO;AAAA;AAAA;AAAA,iBAGT,CAAC,CAAE,MAAAE,CAAM,IAAM,IAAIA,EAAM,OAAO,QAAQ,EAAE;AAAA;AAAA;AAAA,EAK3D,SAAwBC,GAA8B,CACpD,oBAAAC,EACA,QAAAC,EACA,sBAAA7B,CACF,EAIG,CAGK,MAAA8B,EAFWF,EAAoB,OAAS,EAG1C,2CACA,yCAEJ,aACGG,EAAK,CAAA,KAAM,GACV,SAACC,EAAA,IAAA,MAAA,CAAI,GAAI,4BACP,SAAAA,EAAA,IAACC,EAAA,CACC,KAAMC,EAAqB,SAC3B,YAAaC,EAA4B,MACzC,SAAU,GACV,UAAW,GACX,YAAa,GACb,QAAAN,EACA,SAAU,kCACV,mBAAoBP,GAEpB,gBAAC,MACC,CAAA,SAAA,CAAAU,EAAAA,IAACT,IAAgB,SAAcO,CAAA,CAAA,EAAiB,2CAC/CE,EAAA,IAAAP,GAAA,CACE,SACEG,EAAA,KAAK,CAACQ,EAAIC,IAAOD,EAAG,MAAQC,EAAG,KAAK,EACpC,IAAKtC,GAEFiC,EAAA,IAACb,GAAA,CAEC,SAAApB,EACA,sBAAAC,CAAA,EAFKD,EAAS,EAGhB,CAEH,CACL,CAAA,CAAA,CACF,CAAA,CAAA,GAEJ,CACF,CAAA,CAEJ,CC5EA,MAAMuC,GAA4Bd,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnCe,GAA8Bf,EAAO;AAAA;AAAA,EAI3C,SAAwBgB,GAAoBC,EAA0B,CACpE,KAAM,CAAE,YAAAC,CAAA,EAAgBC,EAAA,WAAWC,CAAU,EAEvC,CAAE,OAAAC,EAAQ,aAAAC,EAAc,oBAAAlB,EAAqB,eAAAmB,EAAgB,kBAAAC,GACjEP,EAEIQ,EAAaJ,EAAO,WAAa,IAAIA,EAAO,UAAU,GAAK,GAK3DK,EACJL,EAAO,aAAeM,EAAW,aACjCN,EAAO,KALoC,KAOvCO,EAAkBC,EAAmB,EAE3CC,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIP,EAAgB,CACZ,MAAAQ,EAAU,SAAS,eAAe,2BAA2B,EACnEA,GAAA,MAAAA,EAAS,eAAe,CAEtB,SAAUb,IAAgBc,EAAY,KAAO,OAAS,SACtD,MAAO,MACP,OAAQ,SAAA,EACT,CACH,EACC,CAACT,EAAgBL,CAAW,CAAC,EA+BzBQ,EACH,CACE,wBA/B2BO,GAE7BV,GACAnB,EAAoB,OAAS,GAC1BI,EAAA,IAAAO,GAAA,CACC,eAACD,GACC,CAAA,SAAAN,EAAA,IAACL,GAAA,CACC,oBAAAC,EACA,QAAS,IAAMoB,EAAkB,EAAK,EACtC,sBAAuBS,CAAA,GAE3B,CACF,CAAA,EAoBA,eAfiB,SAAY,CAGjC,GADA,MAAMT,EAAkB,EAAK,EACxBF,EAKaM,EAAA,wBAAwBH,CAAU,EAAE,MAJpC,OAAAG,EAAA,8CAA8CH,CAAU,EAAE,EAC1ED,EAAkB,EAAI,EAChB,IAAI,MAAM,6DAA6D,CAIjF,EAMM,eAAAD,CAAA,EAEF,CACE,wBAAyB,IAAM,KAC/B,eAAgB,SAAY,GAC5B,eAAgB,EAClB,CACN,CC3EA,MAAMW,GAAwB,CAC5B,KAAM,CACJ,MAAO,CACL,SAAU,OAAA,CAEd,EACA,SAAU,CACR,MAAO,CACL,QAAS,OACT,cAAe,QAAA,CACjB,CAEJ,EAEMC,GAAwC,CAC5C,KAAM,CACJ,MAAO,KAAO,CACZ,SAAU,QACV,WAAY,OACZ,YAAa,MACf,EACF,EACA,SAAU,CACR,MAAO,CACL,QAAS,OACT,cAAe,QAAA,CACjB,CAEJ,EAMMC,GAAkCpC,EAAO;AAAA;AAAA,EAIzCqC,GAAkCrC,EAAO;AAAA;AAAA,YAEnC,CAAC,CAAE,MAAAE,KAAYA,EAAM,OAAO,SAAS,QAAQ,CAAC,CAAE,MAAAA,CAAA,IAAYA,EAAM,OAAO,SAAS;AAAA,MACxF,CAAC,CAAE,MAAAA,CAAA,IAAYA,EAAM,OAAO,QAAQ;AAAA;AAAA;AAAA,EAKpCoC,GAAwBtC,EAAO;AAAA;AAAA;AAAA;AAAA,EAarC,SAAwBuC,GAAW,CACjC,GAAAC,EACA,OAAAC,EACA,QAAAR,EACA,UAAAS,EACA,mBAAAC,EAAqB,GACrB,UAAAC,EACA,SAAAC,EAAW,IAAM,EACnB,EAQG,CACK,KAAA,CAAE,SAAAC,CAAS,EAAIC,EAAc,EAC7B9B,EAAc+B,EAAe,CACjC,GAAAR,EACA,SAAAK,EACA,OAAAJ,EACA,cAAeR,GAAA,YAAAA,EAAS,aAAA,CACzB,EAEK,CACJ,SAAAgB,EACA,OAAA5B,EACA,QAAA6B,EACA,WAAAC,EACA,eAAAC,EACA,8BAAAC,EACA,kBAAAC,EACA,mBAAAC,EACA,aAAAjC,EACA,eAAAC,CAAA,EACEN,EAEE,CAAE,wBAAAuC,EAAyB,eAAAC,GAAmBzC,GAAoBC,CAAW,EAK7ES,EACJL,EAAO,aAAeM,EAAW,aACjCN,EAAO,KALoC,KAO7C,GAAI4B,EACK,OAAAzC,EAAA,IAAC,OAAI,SAAU,YAAA,CAAA,EAIxB,MAAMkD,EAAU,IAAM,CACpB,MAAMC,EAAe,CAAC,CACpB,gBAAAC,EACA,SAAAC,CAAA,IAKArD,EAAA,IAACsD,EAAA,CACC,QAAS,SAAY,CACf,GAAA,CACF,MAAML,EAAe,CAAA,MACf,CACN,MAAA,CAGFH,EAAkB,EAAI,EACtB,MAAMC,EAAmB,CACvB,cAAe,CACb,SAAUf,EACV,OAAAC,EACA,aAAc,CACZ,sBAAuBR,GAAA,YAAAA,EAAS,sBAChC,aAAcA,GAAA,YAAAA,EAAS,aACvB,cAAeA,GAAA,YAAAA,EAAS,aAC1B,EACA,QAAS,OAAO,KAAKiB,CAAO,EAAE,IAAKa,IAAgB,CACjD,WAAAA,EACA,WAAYb,EAAQa,CAAU,CAAA,EAC9B,CAAA,CACJ,CACD,EACDT,EAAkB,EAAK,CACzB,EACA,SAAUF,EACV,YAAU,gBACV,oBAAmBQ,EACnB,YAAad,EAEZ,SAAAe,CAAA,CACH,EAGK,OAAAlB,SAEJqB,EACC,CAAA,SAAA,CAACxD,EAAA,IAAAmD,EAAA,CAAa,gBAAgB,6CAA6C,SAE3E,sBAAA,EACAnD,EAAA,IAACsD,EAAA,CACC,QAASjB,EACT,SAAS,+BACT,gBAAgB,+CAChB,KAAMoB,EAAK,SACX,YAAanB,EACd,SAAA,uBAAA,CAAA,CAED,CACF,CAAA,QAGCR,GACC,CAAA,SAAA9B,EAAA,IAACmD,EAAA,CACC,gBAEEtC,EAAO,WAAa,6BAA6BA,EAAO,UAAU,GAAK,GAE1E,SAAA,kBAAA,CAAA,CAGH,CAAA,CAEJ,EAEM6C,EAAe,IAGdrE,EAAA,KAAAsE,WAAA,CAAA,SAAA,CAAAzB,EACDlC,EAAA,IAAC4D,EAAA,CACC,QAAAlB,EACA,OAAA7B,EACA,QAAAY,EACA,UAAAW,EACA,eAAAQ,EACA,WAAAD,EACA,8BAAAE,EACA,eAAA9B,CAAA,CAAA,CACF,EACF,EAKF,OAAA1B,EAAA,KAACsE,WAAA,CACE,SAAA,CAAAX,EAAwBvB,CAAO,EAC/BP,GAA2BiB,EAC1BnC,EAAA,IAAC6D,EAAA,CACC,MAAO1B,EAAqB,2BAA6B,GACzD,mBACEA,EAAqBR,GAAwCD,GAE/D,aAASwB,EAAQ,EAAA,EACjB,yBAAwB,GAEvB,SAAaQ,EAAA,CAAA,CAAA,SAGf9B,GACE,CAAA,SAAA,CAAa8B,EAAA,QACb7B,GACC,CAAA,SAAA7B,EAAA,IAAC8D,EAAA,CACC,WAAYC,EAAW,QACvB,QAAS,SAAY,CACnBjB,EAAkB,EAAI,EACtB,MAAMC,EAAmB,CACvB,cAAe,CACb,SAAUf,EACV,OAAAC,EACA,aAAc,CACZ,sBAAuBR,GAAA,YAAAA,EAAS,sBAChC,aAAcA,GAAA,YAAAA,EAAS,aACvB,cAAeA,GAAA,YAAAA,EAAS,aAC1B,EACA,QAAS,OAAO,KAAKiB,CAAO,EAAE,IAAKa,IAAgB,CACjD,WAAAA,EACA,WAAYb,EAAQa,CAAU,CAAA,EAC9B,CAAA,CACJ,CACD,EACDT,EAAkB,EAAK,CACzB,EACA,SAAU,CAAChC,GAAgB8B,EAC3B,YAAU,gBACV,gBAEE/B,EAAO,WAAa,6BAA6BA,EAAO,UAAU,GAAK,OAEzE,MAAOyB,EAAW,CAAE,MAAO,QAAW,CAAC,EACxC,SAAA,QAAA,CAAA,CAGH,CAAA,CAAA,CACF,CAAA,CAAA,EAEJ,CAEJ"}